@smartput/kind
v0.3.0
Published
The layer a kind and a language are written in, with no engine in it.
Maintainers
Readme
@smartput/kind
The layer a kind and a language are written in, with no engine in it.
defineKind, defineVocabulary, decimalRatios,
aliasesFor, deriveValue, the Decimal every ratio is carried in, the
SmartputError hierarchy, and the types all of it is spelled with.
It was @smartput/core's until the edge was found running the wrong way:
seventeen leaf packages named the engine in order to say what a kilometre is,
which is a fact about metres and has nothing to do with parsing a sentence —
and core named four of them back as devDependencies, closing the loop. The
split is by layer: core is the pipeline (normalize, tokenize, parse, solve,
eval, print), and this is what the pipeline agrees with a kind about before it
runs.
Core re-exports every name here unchanged, so nothing that imported them from
@smartput/core had to stop. Writing a new kind, though, should name this
package and not the engine — that is the whole point of it existing.
It did not make anything smaller. A kind package's bundle barely moved,
because what it was carrying was decimal.js and never the pipeline; the
change bought layering, and scripts/check-size.ts records the 240 B per
core-consuming bundle that it cost.
Setup
npm add @smartput/kindExample
import { decimalRatios, defineKind, defineVocabulary } from "@smartput/kind";
import { LENGTH_UNITS } from "@smartput/length/units";
Object.keys(decimalRatios(LENGTH_UNITS)).join(", ") // "mm, cm, m, km, in, ft, yd, mi"
defineKind({ id: "length", value: { mode: "ratio", canonical: "m", ratios: decimalRatios(LENGTH_UNITS) } }).id // "length"
defineVocabulary({ kind: "length", units: { m: { one: "metre", other: "metres" } } }).kind // "length"
Object.isFrozen(defineVocabulary({ kind: "length", units: {} })) // trueNo engine anywhere in this block, which is the point: a kind and its
words are data, and defining them should not link a parser. defineKind and
defineVocabulary both deep-freeze what they return, so a descriptor cannot
be edited after an engine has read it.
Entry points
| Import | Contents |
| --- | --- |
| @smartput/kind | The package root. |
| @smartput/kind/types | Type declarations only — erased at runtime. |
| @smartput/kind/decimal | See the source for what this subpath carries. |
| @smartput/kind/freeze | See the source for what this subpath carries. |
| @smartput/kind/errors | See the source for what this subpath carries. |
| @smartput/kind/contracts | See the source for what this subpath carries. |
| @smartput/kind/define | See the source for what this subpath carries. |
| @smartput/kind/aliases | See the source for what this subpath carries. |
| @smartput/kind/from-table | See the source for what this subpath carries. |
| @smartput/kind/ratio-ops | See the source for what this subpath carries. |
| @smartput/kind/vocabulary | See the source for what this subpath carries. |
Runtime exports
Type-only exports are erased and do not appear here.
AmbiguityError · BOOLEAN_KIND · BOOLEAN_UNIT · COMPARE_PRECISION · COMPARISON_OPS · CountQueryError · Decimal · DimensionMismatchError · DivideByZeroError · KeywordConflictError · KindConflictError · LocaleMismatchError · MissingRateError · NUMBER_KIND · NoCandidateError · PERCENT_KIND · RateProviderError · RatesNotReadyError · SmartputError · TooAmbiguousError · UnitParseError · UnknownKindError · VocabularyConflictError · aliasesFor · decimalRatios · deepFreeze · defineKind · defineVocabulary · deriveValue · generateComparisonOps · generateRatioOps · normalizeKind
Dependencies
decimal.js
What it costs
Ceilings, not measurements. bun run check-size bundles each entry with
bun build --minify and fails if a row crosses its ceiling or drops more
than 30 % below it — a budget that is only an upper bound reports a vanished
graph as a triumph.
| Import | Minified | Gzipped | | --- | --- | --- | | kind root (defineKind, with Decimal behind it) | ≤ 33.5 kB | ≤ 13.3 kB | | kind/contracts (types only — the proof of ruling R-F1) | ≤ 0 B | ≤ 0 B | | kind/vocabulary defineVocabulary only | ≤ 300 B | ≤ 250 B |
Generated by scripts/gen-readmes.ts — run bun run docs:readmes. Every
output above was produced by running the line beside it. The full page, with
live demos, is docs/packages/kind.md.
