@itwin/core-quantity 5.15.0-dev.2 → 5.15.0-dev.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/README.md +0 -1
  3. package/lib/cjs/Parser.d.ts +4 -0
  4. package/lib/cjs/Parser.d.ts.map +1 -1
  5. package/lib/cjs/Parser.js +20 -4
  6. package/lib/cjs/Parser.js.map +1 -1
  7. package/lib/cjs/UnitConversions.d.ts +2 -3
  8. package/lib/cjs/UnitConversions.d.ts.map +1 -1
  9. package/lib/cjs/UnitConversions.js +0 -1
  10. package/lib/cjs/UnitConversions.js.map +1 -1
  11. package/lib/cjs/assets/Units.json +25 -1
  12. package/lib/cjs/generated/Units.generated.d.ts +5 -0
  13. package/lib/cjs/generated/Units.generated.d.ts.map +1 -1
  14. package/lib/cjs/generated/Units.generated.js +5 -0
  15. package/lib/cjs/generated/Units.generated.js.map +1 -1
  16. package/lib/cjs/internal/BasicUnitConversions.generated.d.ts +3 -0
  17. package/lib/cjs/internal/BasicUnitConversions.generated.d.ts.map +1 -1
  18. package/lib/cjs/internal/BasicUnitConversions.generated.js +3 -0
  19. package/lib/cjs/internal/BasicUnitConversions.generated.js.map +1 -1
  20. package/lib/cjs/internal/DefaultPersistenceUnits.generated.d.ts +1 -0
  21. package/lib/cjs/internal/DefaultPersistenceUnits.generated.d.ts.map +1 -1
  22. package/lib/cjs/internal/DefaultPersistenceUnits.generated.js +1 -1
  23. package/lib/cjs/internal/DefaultPersistenceUnits.generated.js.map +1 -1
  24. package/lib/esm/Parser.d.ts +4 -0
  25. package/lib/esm/Parser.d.ts.map +1 -1
  26. package/lib/esm/Parser.js +20 -4
  27. package/lib/esm/Parser.js.map +1 -1
  28. package/lib/esm/UnitConversions.d.ts +2 -3
  29. package/lib/esm/UnitConversions.d.ts.map +1 -1
  30. package/lib/esm/UnitConversions.js +0 -1
  31. package/lib/esm/UnitConversions.js.map +1 -1
  32. package/lib/esm/assets/Units.json +25 -1
  33. package/lib/esm/generated/Units.generated.d.ts +5 -0
  34. package/lib/esm/generated/Units.generated.d.ts.map +1 -1
  35. package/lib/esm/generated/Units.generated.js +5 -0
  36. package/lib/esm/generated/Units.generated.js.map +1 -1
  37. package/lib/esm/internal/BasicUnitConversions.generated.d.ts +3 -0
  38. package/lib/esm/internal/BasicUnitConversions.generated.d.ts.map +1 -1
  39. package/lib/esm/internal/BasicUnitConversions.generated.js +3 -0
  40. package/lib/esm/internal/BasicUnitConversions.generated.js.map +1 -1
  41. package/lib/esm/internal/DefaultPersistenceUnits.generated.d.ts +1 -0
  42. package/lib/esm/internal/DefaultPersistenceUnits.generated.d.ts.map +1 -1
  43. package/lib/esm/internal/DefaultPersistenceUnits.generated.js +1 -1
  44. package/lib/esm/internal/DefaultPersistenceUnits.generated.js.map +1 -1
  45. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,6 +1,46 @@
1
1
  # Change Log - @itwin/core-quantity
2
2
 
3
- This log was last generated on Thu, 01 Oct 2026 15:17:55 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 04 Nov 2026 17:35:57 GMT and should not be manually modified.
4
+
5
+ ## 5.14.6
6
+ Wed, 04 Nov 2026 17:35:14 GMT
7
+
8
+ ### Updates
9
+
10
+ - Fix parsing of compound unit labels containing a slash, such as "km/h", which were previously split into separate tokens.
11
+
12
+ ## 5.14.5
13
+ Tue, 27 Oct 2026 12:19:48 GMT
14
+
15
+ _Version update only_
16
+
17
+ ## 5.14.4
18
+ Fri, 23 Oct 2026 19:58:24 GMT
19
+
20
+ _Version update only_
21
+
22
+ ## 5.14.3
23
+ Mon, 12 Oct 2026 17:37:54 GMT
24
+
25
+ _Version update only_
26
+
27
+ ## 5.14.2
28
+ Tue, 06 Oct 2026 19:48:29 GMT
29
+
30
+ _Version update only_
31
+
32
+ ## 5.14.1
33
+ Tue, 06 Oct 2026 14:00:55 GMT
34
+
35
+ _Version update only_
36
+
37
+ ## 5.14.0
38
+ Fri, 02 Oct 2026 14:55:04 GMT
39
+
40
+ ### Updates
41
+
42
+ - Allow ratio separators to be a string with one non-whitespace character
43
+ - Add synchronous unit and format APIs to @itwin/core-quantity.
4
44
 
5
45
  ## 5.13.7
6
46
  Thu, 01 Oct 2026 15:15:30 GMT
package/README.md CHANGED
@@ -19,7 +19,6 @@ const feet = UnitConversions.convert(
19
19
 
20
20
  UnitConversions provides synchronous conversion helpers for the canonical unit set generated from `@bentley/units-schema`.
21
21
  `getDefaultPersistenceUnit(...)` returns the package default persistence unit for a supported phenomenon.
22
- `Phenomena.LENGTH_RATIO` is intentionally not supported by that helper yet because the bundled built-in unit set does not currently provide an agreed default for that phenomenon.
23
22
 
24
23
  ## Contributing
25
24
 
@@ -92,6 +92,10 @@ export declare class Parser {
92
92
  static parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps>;
93
93
  /** method to get the Unit Conversion given a unit label */
94
94
  private static tryFindUnitConversion;
95
+ /** Get the Unit Conversion for a known unit. Matches by unit name first because labels can differ between units providers
96
+ * (e.g. an unlabeled schema unit may have an empty label in one provider and a name-derived label in another). Falls back to label lookup.
97
+ */
98
+ private static tryFindUnitConversionForUnit;
95
99
  /**
96
100
  * Get what the unit conversion is for a unitless value.
97
101
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,aAAa,EAAuB,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEjK,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C;;GAEG;AACH,oBAAY,UAAU;IACpB,2BAA2B,IAAI;IAC/B,0BAA0B,IAAA;IAC1B,8BAA8B,IAAA;IAC9B,WAAW,IAAA;IACX,oCAAoC,IAAA;IACpC,iBAAiB,IAAA;IACjB,4BAA4B,IAAA;IAC5B,uCAAuC,IAAA;IACvC,sBAAsB,IAAA;IACtB,iBAAiB,KAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,KAAK,CAAC;IACV,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,EAAE,EAAE,IAAI,CAAC;IACT,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,aAAK,QAAQ;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,cAAc,MAAM,CAAE,iDAAiD;IACvE,QAAQ,MAAM;CACf;AAUD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEtE;;GAEG;AACH,cAAM,UAAU;IACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,UAAU,EAAE,OAAO,CAAS;gBAEvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ;IAS7C,IAAW,QAAQ,IAAI,OAAO,CAA+D;IAC7F,IAAW,QAAQ,IAAI,OAAO,CAA2C;IACzE,IAAW,kBAAkB,IAAI,OAAO,CAGvC;CACF;AA+BD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAS;WAEd,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,cAAc;WAInE,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,kBAAkB;IAIjF,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAoBzC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAyChC,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC;;OAEG;WACW,0BAA0B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAyLrG,OAAO,CAAC,MAAM,CAAC,qBAAqB;mBAYf,iBAAiB;IA6BtC;;OAEG;mBACkB,wCAAwC;IAwC7D;;OAEG;mBACkB,6BAA6B;IAgBlD;;;;OAIG;WACiB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlL,2DAA2D;IAC3D,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAyCpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAiBvC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAkC/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,+BAA+B;IAwG9C;;;OAGG;WACW,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,mBAAmB;IA4BhG;;;;;OAKG;WACW,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,mBAAmB;IAyBjI;qGACiG;IACjG,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAY7C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAmFjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA0CjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAoC7B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsF/B,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B,OAAO,CAAC,MAAM,CAAC,aAAa;IAc5B;;kEAE8D;IAC9D,OAAO,CAAC,MAAM,CAAC,qCAAqC;IAQpD,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAepC,+HAA+H;WAC3G,gCAAgC,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA+B1L,+HAA+H;WAC3G,yBAAyB,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAmDhO"}
1
+ {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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"}
package/lib/cjs/Parser.js CHANGED
@@ -306,7 +306,16 @@ class Parser {
306
306
  // Don't add space when the wip token is empty.
307
307
  continue;
308
308
  }
309
- if (isCharOperator) {
309
+ // A slash directly between two label characters (e.g. "km/h") is part of the label, not a division.
310
+ const nextCharCode = str.charCodeAt(i + 1);
311
+ const isUnitLabelSlash = charCode === Constants_1.QuantityConstants.CHAR_SLASH &&
312
+ wipToken.length > 0 &&
313
+ i + 1 < str.length &&
314
+ !/\s/.test(str[i - 1]) &&
315
+ !/\s/.test(str[i + 1]) &&
316
+ !Parser.isDigitOrDecimalSeparator(nextCharCode, format) &&
317
+ !isOperator(nextCharCode);
318
+ if (isCharOperator && !isUnitLabelSlash) {
310
319
  if (wipToken.length > 0) {
311
320
  // There is a token is progress, process it now, before adding the new operator token.
312
321
  tokens.push(new ParseToken(wipToken));
@@ -476,11 +485,18 @@ class Parser {
476
485
  }
477
486
  return undefined;
478
487
  }
488
+ /** Get the Unit Conversion for a known unit. Matches by unit name first because labels can differ between units providers
489
+ * (e.g. an unlabeled schema unit may have an empty label in one provider and a name-derived label in another). Falls back to label lookup.
490
+ */
491
+ static tryFindUnitConversionForUnit(unit, unitsConversions) {
492
+ const byName = unitsConversions.find((conversion) => conversion.name === unit.name);
493
+ return byName ? byName.conversion : Parser.tryFindUnitConversion(unit.label, unitsConversions, unit);
494
+ }
479
495
  /**
480
496
  * Get what the unit conversion is for a unitless value.
481
497
  */
482
498
  static getDefaultUnitConversion(tokens, unitsConversions, defaultUnit) {
483
- let unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit) : undefined;
499
+ let unitConversion = defaultUnit ? Parser.tryFindUnitConversionForUnit(defaultUnit, unitsConversions) : undefined;
484
500
  if (!unitConversion) {
485
501
  // No default unit conversion, take the first valid unit.
486
502
  const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value))];
@@ -600,7 +616,7 @@ class Parser {
600
616
  if (compositeUnitIndex > 0 && format.units && format.units.length > compositeUnitIndex) {
601
617
  // if this is not the first token, and we have a composite spec, look up the unit from the current index
602
618
  const presUnitAtIndex = format.units[compositeUnitIndex][0];
603
- conversion = Parser.tryFindUnitConversion(presUnitAtIndex.label, unitsConversions, presUnitAtIndex);
619
+ conversion = Parser.tryFindUnitConversionForUnit(presUnitAtIndex, unitsConversions);
604
620
  }
605
621
  else if (defaultUnitConversion) {
606
622
  conversion = defaultUnitConversion;
@@ -893,7 +909,7 @@ class Parser {
893
909
  }
894
910
  // Original flow for 1-unit composite - use Quantity.convertTo for proper unit conversion
895
911
  const defaultUnit = spec.format.units && spec.format.units.length > 0 ? spec.format.units[0][0] : undefined;
896
- const unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, spec.unitConversions, defaultUnit) : undefined;
912
+ const unitConversion = defaultUnit ? Parser.tryFindUnitConversionForUnit(defaultUnit, spec.unitConversions) : undefined;
897
913
  if (!unitConversion) {
898
914
  throw new Exception_1.QuantityError(Exception_1.QuantityStatus.MissingRequiredProperty, `Missing input unit or unit conversion for interpreting ${spec.format.name}.`);
899
915
  }