@eristack/dimension
Version:
L×W×H dimension triple as decimal strings — cubic volume, optional unit label
1 lines • 3.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/core/errors.ts","../src/core/dimension.ts"],"sourcesContent":["export {\n DimensionParseError,\n dimensionVolume,\n formatDimension,\n normalizeDimension,\n} from \"./core/index.js\";\nexport type { Dimension, DimensionVolumeOptions } from \"./core/types.js\";\n","export class DimensionParseError extends Error {\n readonly code = \"DIMENSION_PARSE_ERROR\" as const;\n\n constructor(message: string) {\n super(message);\n this.name = \"DimensionParseError\";\n }\n}\n","import Decimal from \"decimal.js\";\n\nimport { DimensionParseError } from \"./errors.js\";\nimport type { Dimension, DimensionVolumeOptions } from \"./types.js\";\n\nfunction trimOptional(value: string | undefined): string | undefined {\n const t = value?.trim();\n return t ? t : undefined;\n}\n\nfunction parsePositiveDecimal(value: string, field: string): Decimal {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new DimensionParseError(`${field} is required`);\n }\n let dec: Decimal;\n try {\n dec = new Decimal(trimmed);\n } catch {\n throw new DimensionParseError(`${field} must be a decimal string`);\n }\n if (!dec.isFinite() || dec.lte(0)) {\n throw new DimensionParseError(`${field} must be a positive finite number`);\n }\n return dec;\n}\n\nexport function normalizeDimension(input: Dimension): Dimension {\n const length = parsePositiveDecimal(input.length, \"length\").toFixed();\n const width = parsePositiveDecimal(input.width, \"width\").toFixed();\n const height = parsePositiveDecimal(input.height, \"height\").toFixed();\n const unit = trimOptional(input.unit);\n return { length, width, height, unit };\n}\n\nexport function dimensionVolume(\n dimension: Dimension,\n options: DimensionVolumeOptions = {},\n): string {\n const d = normalizeDimension(dimension);\n const scale = options.scale ?? 6;\n const volume = new Decimal(d.length)\n .mul(d.width)\n .mul(d.height)\n .toDecimalPlaces(scale, Decimal.ROUND_HALF_UP);\n return volume.toFixed(scale);\n}\n\nexport function formatDimension(dimension: Dimension): string {\n const d = normalizeDimension(dimension);\n const base = `${d.length} × ${d.width} × ${d.height}`;\n return d.unit ? `${base} ${d.unit}` : base;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC,OAAO;AAAA,EAEhB,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACPA,qBAAoB;AAKpB,SAAS,aAAa,OAA+C;AACnE,QAAM,IAAI,OAAO,KAAK;AACtB,SAAO,IAAI,IAAI;AACjB;AAEA,SAAS,qBAAqB,OAAe,OAAwB;AACnE,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,oBAAoB,GAAG,KAAK,cAAc;AAAA,EACtD;AACA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,eAAAA,QAAQ,OAAO;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,oBAAoB,GAAG,KAAK,2BAA2B;AAAA,EACnE;AACA,MAAI,CAAC,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,GAAG;AACjC,UAAM,IAAI,oBAAoB,GAAG,KAAK,mCAAmC;AAAA,EAC3E;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAA6B;AAC9D,QAAM,SAAS,qBAAqB,MAAM,QAAQ,QAAQ,EAAE,QAAQ;AACpE,QAAM,QAAQ,qBAAqB,MAAM,OAAO,OAAO,EAAE,QAAQ;AACjE,QAAM,SAAS,qBAAqB,MAAM,QAAQ,QAAQ,EAAE,QAAQ;AACpE,QAAM,OAAO,aAAa,MAAM,IAAI;AACpC,SAAO,EAAE,QAAQ,OAAO,QAAQ,KAAK;AACvC;AAEO,SAAS,gBACd,WACA,UAAkC,CAAC,GAC3B;AACR,QAAM,IAAI,mBAAmB,SAAS;AACtC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,IAAI,eAAAA,QAAQ,EAAE,MAAM,EAChC,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,MAAM,EACZ,gBAAgB,OAAO,eAAAA,QAAQ,aAAa;AAC/C,SAAO,OAAO,QAAQ,KAAK;AAC7B;AAEO,SAAS,gBAAgB,WAA8B;AAC5D,QAAM,IAAI,mBAAmB,SAAS;AACtC,QAAM,OAAO,GAAG,EAAE,MAAM,SAAM,EAAE,KAAK,SAAM,EAAE,MAAM;AACnD,SAAO,EAAE,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK;AACxC;","names":["Decimal"]}