{"_id":"@biggora/unit-converter","_rev":"2-66ee729cbf433ed2af3101e06a7629dd","name":"@biggora/unit-converter","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@biggora/unit-converter","version":"0.1.0","keywords":["unit","convert","conversion","measurement","si","metric","imperial","zero-dependency","typescript","cross-runtime"],"license":"MIT","_id":"@biggora/unit-converter@0.1.0","maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}],"homepage":"https://github.com/biggora/unit-converter#readme","bugs":{"url":"https://github.com/biggora/unit-converter/issues"},"dist":{"shasum":"a393d36d740a62d539f04d6e08a3c4fbb55d1723","tarball":"https://registry.npmjs.org/@biggora/unit-converter/-/unit-converter-0.1.0.tgz","fileCount":50,"integrity":"sha512-mCpvBLnvs95FwUy0YumdhQyJ/KXZk2BcencZH1ijS3gZ5fgxv2RL8JBjOIAJpQi7MqBckkF2KdFRVzcNEqfJhg==","signatures":[{"sig":"MEUCIQDBIrFAeZlsD8/N0xT8sS30faNfnUqOT0B7XKQ1qphGZQIgKPTKRJ7chGlY+CmPUplMqDvr3XQ0aLNonbYTjiP9RNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370094},"pnpm":{"overrides":{"vite":"^6.4.2","esbuild":">=0.25.0"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.cjs"},"./area":{"types":"./dist/area.d.ts","import":"./dist/area.mjs","default":"./dist/area.mjs","require":"./dist/area.cjs"},"./mass":{"types":"./dist/mass.d.ts","import":"./dist/mass.mjs","default":"./dist/mass.mjs","require":"./dist/mass.cjs"},"./time":{"types":"./dist/time.d.ts","import":"./dist/time.mjs","default":"./dist/time.mjs","require":"./dist/time.cjs"},"./angle":{"types":"./dist/angle.d.ts","import":"./dist/angle.mjs","default":"./dist/angle.mjs","require":"./dist/angle.cjs"},"./speed":{"types":"./dist/speed.d.ts","import":"./dist/speed.mjs","default":"./dist/speed.mjs","require":"./dist/speed.cjs"},"./length":{"types":"./dist/length.d.ts","import":"./dist/length.mjs","default":"./dist/length.mjs","require":"./dist/length.cjs"},"./volume":{"types":"./dist/volume.d.ts","import":"./dist/volume.mjs","default":"./dist/volume.mjs","require":"./dist/volume.cjs"},"./pressure":{"types":"./dist/pressure.d.ts","import":"./dist/pressure.mjs","default":"./dist/pressure.mjs","require":"./dist/pressure.cjs"},"./temperature":{"types":"./dist/temperature.d.ts","import":"./dist/temperature.mjs","default":"./dist/temperature.mjs","require":"./dist/temperature.cjs"},"./data-storage":{"types":"./dist/data-storage.d.ts","import":"./dist/data-storage.mjs","default":"./dist/data-storage.mjs","require":"./dist/data-storage.cjs"},"./package.json":"./package.json"},"gitHead":"37321fd25e52b5f815486aa6f2b9581214d9362e","scripts":{"lint":"biome check .","size":"tsx scripts/check-size.ts","test":"vitest run","build":"tsup","format":"biome format --write .","release":"changeset publish","test:bun":"bun test test/cross-runtime/node.test.mjs","test:deno":"deno test --allow-read test/cross-runtime/deno.test.ts","test:node":"node --test test/cross-runtime/node.test.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","check:exports":"publint"},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"repository":{"url":"git+https://github.com/biggora/unit-converter.git","type":"git"},"_npmVersion":"11.12.1","description":"Zero-dependency, cross-runtime TypeScript micro-library for unit conversion.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^3.2.4","publint":"^0.3.0","typescript":"^5.7.2","@types/node":"^22.10.2","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10"},"_npmOperationalInternal":{"tmp":"tmp/unit-converter_0.1.0_1779511074328_0.32591813632845423","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@biggora/unit-converter","version":"1.0.0","description":"Zero-dependency, cross-runtime TypeScript micro-library for unit conversion.","type":"module","sideEffects":false,"engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs","default":"./dist/index.mjs"},"./length":{"types":"./dist/length.d.ts","import":"./dist/length.mjs","require":"./dist/length.cjs","default":"./dist/length.mjs"},"./mass":{"types":"./dist/mass.d.ts","import":"./dist/mass.mjs","require":"./dist/mass.cjs","default":"./dist/mass.mjs"},"./time":{"types":"./dist/time.d.ts","import":"./dist/time.mjs","require":"./dist/time.cjs","default":"./dist/time.mjs"},"./temperature":{"types":"./dist/temperature.d.ts","import":"./dist/temperature.mjs","require":"./dist/temperature.cjs","default":"./dist/temperature.mjs"},"./volume":{"types":"./dist/volume.d.ts","import":"./dist/volume.mjs","require":"./dist/volume.cjs","default":"./dist/volume.mjs"},"./area":{"types":"./dist/area.d.ts","import":"./dist/area.mjs","require":"./dist/area.cjs","default":"./dist/area.mjs"},"./speed":{"types":"./dist/speed.d.ts","import":"./dist/speed.mjs","require":"./dist/speed.cjs","default":"./dist/speed.mjs"},"./data-storage":{"types":"./dist/data-storage.d.ts","import":"./dist/data-storage.mjs","require":"./dist/data-storage.cjs","default":"./dist/data-storage.mjs"},"./angle":{"types":"./dist/angle.d.ts","import":"./dist/angle.mjs","require":"./dist/angle.cjs","default":"./dist/angle.mjs"},"./pressure":{"types":"./dist/pressure.d.ts","import":"./dist/pressure.mjs","require":"./dist/pressure.cjs","default":"./dist/pressure.mjs"},"./registry":{"types":"./dist/registry.d.ts","import":"./dist/registry.mjs","require":"./dist/registry.cjs","default":"./dist/registry.mjs"},"./constants":{"types":"./dist/constants.d.ts","import":"./dist/constants.mjs","require":"./dist/constants.cjs","default":"./dist/constants.mjs"},"./package.json":"./package.json"},"scripts":{"build":"tsup","test":"vitest run","test:watch":"vitest","test:node":"node --test test/cross-runtime/node.test.mjs","test:bun":"bun test test/cross-runtime/node.test.mjs","test:deno":"deno test --allow-read test/cross-runtime/deno.test.ts","lint":"biome check .","format":"biome format --write .","typecheck":"tsc --noEmit","check:exports":"publint","size":"tsx scripts/check-size.ts","export:registry":"tsx scripts/export-registry.ts","release":"changeset publish"},"devDependencies":{"@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10","@types/node":"^22.10.2","publint":"^0.3.0","tsup":"^8.3.5","tsx":"^4.19.2","typescript":"^5.7.2","vitest":"^3.2.4"},"keywords":["unit","convert","conversion","measurement","si","metric","imperial","zero-dependency","typescript","cross-runtime"],"license":"MIT","publishConfig":{"access":"public"},"pnpm":{"overrides":{"esbuild":">=0.25.0","vite":"^6.4.2"}},"repository":{"type":"git","url":"git+https://github.com/biggora/unit-converter.git"},"bugs":{"url":"https://github.com/biggora/unit-converter/issues"},"homepage":"https://github.com/biggora/unit-converter#readme","gitHead":"57b87d2ef9abc4c6e06ecfded82eb5e4f766ee60","_id":"@biggora/unit-converter@1.0.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-q+ko30C0V1xowUCW81LhvX6w7HDWBm5wB3qyW0HKDhDw41lkWZOU9UEAtnkxj5e/qt++VvWTqOuuycp3IIhUZQ==","shasum":"addc2691606a5777de2ba01811d1de245314ae8d","tarball":"https://registry.npmjs.org/@biggora/unit-converter/-/unit-converter-1.0.0.tgz","fileCount":82,"unpackedSize":657377,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@biggora%2funit-converter@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCEQv/4VdQF+DT5VKYpm3JoCiXfO2CasV08jZU4l5LdhQIgOcl8EnMZIE6U30FLPQX88Stjww8EmKZc0h00ifpWp60="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c7b67667-2e01-456d-8ca2-b791a5ab67cc"}},"directories":{},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/unit-converter_1.0.0_1779519159739_0.44582843003923234"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-23T04:37:54.227Z","modified":"2026-05-23T06:52:40.185Z","0.1.0":"2026-05-23T04:37:54.494Z","1.0.0":"2026-05-23T06:52:39.925Z"},"bugs":{"url":"https://github.com/biggora/unit-converter/issues"},"license":"MIT","homepage":"https://github.com/biggora/unit-converter#readme","keywords":["unit","convert","conversion","measurement","si","metric","imperial","zero-dependency","typescript","cross-runtime"],"repository":{"type":"git","url":"git+https://github.com/biggora/unit-converter.git"},"description":"Zero-dependency, cross-runtime TypeScript micro-library for unit conversion.","maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}],"readme":"[![npm version](https://img.shields.io/npm/v/@biggora/unit-converter.svg)](https://www.npmjs.com/package/@biggora/unit-converter)\n[![Unit Tests](https://github.com/biggora/unit-converter/actions/workflows/ci.yml/badge.svg)](https://github.com/biggora/unit-converter/actions/workflows/unit-tests.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# unit-converter\n\n> Zero-dependency, cross-runtime TypeScript micro-library for unit conversion.\n> Type-safe chained API, exact BigInt arithmetic where it matters, NIST-pinned\n> coefficients.\n\n**[Live demo →](https://biggora.github.io/unit-converter/)**\n\n```ts\nimport { convert } from '@biggora/unit-converter';\n\nconvert(5, 'm').to('ft');              // 16.404199475065617\nconvert(0, 'C', { category: 'temperature' }).to('F'); // 32\nconvert(5500, 'm').to('best');         // { value: 5.5, unit: 'km', ... }\nconvert(20n, 'h').to('ms');            // 72000000n  (exact)\n```\n\n## Why\n\n* **Zero runtime dependencies.** Nothing to audit, nothing to vendor.\n* **Cross-runtime.** Same artifact runs on Node ≥ 18, Bun, Deno, and modern browsers.\n* **Tree-shakeable.** Per-category subpath exports — pull in only the categories you need.\n* **Type-safe.** Unit literals are checked at compile time; `to()` only autocompletes siblings.\n* **NIST-pinned.** Every imperial coefficient cites NIST SP 811 §B.8 / §B.9.\n* **Exact BigInt.** Integer-aligned categories (`time`, `dataStorage`) refuse to silently truncate.\n\n## Install\n\n```bash\nnpm i @biggora/unit-converter\npnpm add @biggora/unit-converter\nbun add @biggora/unit-converter\n```\n\nDeno can consume the npm package via [`jsr` interop](https://docs.deno.com/runtime/manual/node/npm_specifiers/) or `npm:@biggora/unit-converter`.\n\n## API at a glance\n\n```ts\n// 1. Root convert — auto-routes by unit name.\nimport { convert } from '@biggora/unit-converter';\nconvert(5, 'm').to('ft');\n\n// 2. Per-category subpath — smallest bundle (~3-4 KB gzipped each).\nimport { length } from '@biggora/unit-converter/length';\nlength(5, 'm').to('ft');\n\n// 3. Named per-category exports from the root.\nimport { mass, time } from '@biggora/unit-converter';\n```\n\nEvery chain returns a frozen `Converter`:\n\n```ts\nconst c = convert(5, 'm');\nc.category;         // 'length'\nc.possibilities();  // ['m','km','cm','mm','μm', …]\nc.to('ft');         // 16.4042\nc.to('best');       // { value: 5, unit: 'm', category: 'length', toString() }\n```\n\n## Categories (v0.1)\n\n| Category      | Anchor | Units                                                                          |\n| ------------- | ------ | ------------------------------------------------------------------------------ |\n| `length`      | m      | m, km, cm, mm, μm, nm, Å, in, ft, yd, mi, nmi, ly, au, pc                      |\n| `mass`        | kg     | kg, g, mg, μg, t, lb, oz, st, ton, long-ton, gr, ct                            |\n| `time`        | s      | ns, μs, ms, s, min, h, d, week, month, year                                    |\n| `temperature` | K      | K, C, F, R                                                                     |\n| `volume`      | m³     | m3, L, mL, cm3, mm3, km3, us-gal, us-qt, us-pt, us-cup, us-floz, us-tbsp, us-tsp, imp-gal, imp-pt, imp-floz, in3, ft3, yd3 |\n| `area`        | m²     | m2, cm2, mm2, km2, ha, a, in2, ft2, yd2, mi2, acre                             |\n| `speed`       | m/s    | m/s, km/h, mph, kn, ft/s, in/s, mach, c                                        |\n| `dataStorage` | byte   | B, KB, MB, GB, TB, PB, KiB, MiB, GiB, TiB, PiB, bit                            |\n| `angle`       | rad    | rad, deg, gon, turn, arcmin, arcsec, mrad                                      |\n| `pressure`    | Pa     | Pa, hPa, kPa, MPa, GPa, bar, mbar, atm, torr, mmHg, inHg, psi                  |\n\nAliases are case-insensitive — `Meter`, `metres`, `°C`, `degF`, `kilogram`, `pound` all work.\n\n## Best mode\n\n```ts\nconvert(5500, 'm').to('best');           // { value: 5.5, unit: 'km' }\nconvert(0.005, 'm').to('best');          // { value: 5, unit: 'mm' }\nlength(2.5, 'mi').to('best');            // { value: 2.5, unit: 'mi' }\nlength(1, 'm').to('best', { system: 'imperial' }); // imperial-only candidates\n```\n\nHeuristic: pick the candidate whose magnitude is closest to √10 on the log\nscale (i.e. in the [1, 10) decade with a small-integer bias). Defaults to the\ninput unit's measurement system, so metric inputs stay metric unless you opt out.\n\n## BigInt mode\n\n```ts\nimport { time, dataStorage } from '@biggora/unit-converter';\n\ntime.bigint(20n, 'h').to('ms');          // 72_000_000n\ndataStorage.bigint(1n, 'TiB').to('B');   // 1_099_511_627_776n\ntime.bigint(1n, 'ms').to('s');           // throws BigIntPrecisionError\ntime.bigint(1n, 'month').to('s');        // throws UnitNotBigIntSafeError\n```\n\nSupported categories (v0.1): `time` (ns…week), `dataStorage` (byte-aligned).\nImperial and offset categories never participate — their ratios aren't integers.\n\n## Errors\n\n| Class                     | `.code`                | Cause                                          |\n| ------------------------- | ---------------------- | ---------------------------------------------- |\n| `UnknownUnitError`        | `E_UNKNOWN_UNIT`       | Unit name not registered (with `.suggestions`) |\n| `IncompatibleUnitsError`  | `E_INCOMPATIBLE_UNITS` | Cross-category `to()`                          |\n| `InvalidValueError`       | `E_INVALID_VALUE`      | NaN, ±Infinity, wrong type, overflow           |\n| `BigIntPrecisionError`    | `E_BIGINT_PRECISION`   | BigInt conversion would lose precision         |\n| `UnitNotBigIntSafeError`  | `E_BIGINT_UNSAFE`      | Unit has no `bigintRatio`                      |\n| `AmbiguousUnitError`      | `E_AMBIGUOUS_UNIT`     | Name resolves to ≥2 categories                 |\n\nAll extend `UnitConverterError extends Error`. Catch the base for a single check.\n\n## Precision\n\n* Linear conversions: relative error `< 1e-12` for inputs up to `1e15`.\n* Temperature: absolute error `< 1e-9 K` (offset arithmetic with FP).\n* Extreme ratios (e.g. `ly → in ≈ 3.7e17`) drop 1–2 least significant digits — use\n  BigInt for integer-aligned domains or accept the IEEE-754 limit.\n\n## Cross-runtime\n\nCI runs the published tarball against Node ≥ 18, Bun, and Deno. The same `dist/`\nartifact serves all three — no conditional code paths.\n\n## Tree-shaking\n\n```ts\nimport { length } from '@biggora/unit-converter/length';\nlength(5, 'm').to('ft');\n// → bundle contains only length, not mass/time/etc.\n```\n\nEach subpath entry is a self-contained ESM/CJS pair (~3–4 KB gzipped).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}