@itwin/core-quantity 5.10.0-dev.9 → 5.11.0-dev.2

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 (143) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/README.md +17 -0
  3. package/lib/cjs/BasicUnitsProvider.d.ts +8 -5
  4. package/lib/cjs/BasicUnitsProvider.d.ts.map +1 -1
  5. package/lib/cjs/BasicUnitsProvider.js +16 -139
  6. package/lib/cjs/BasicUnitsProvider.js.map +1 -1
  7. package/lib/cjs/CompositeUnitsProvider.js.map +1 -1
  8. package/lib/cjs/Constants.js.map +1 -1
  9. package/lib/cjs/Exception.d.ts +2 -1
  10. package/lib/cjs/Exception.d.ts.map +1 -1
  11. package/lib/cjs/Exception.js +1 -0
  12. package/lib/cjs/Exception.js.map +1 -1
  13. package/lib/cjs/FormatSpecHandle.d.ts +1 -2
  14. package/lib/cjs/FormatSpecHandle.d.ts.map +1 -1
  15. package/lib/cjs/FormatSpecHandle.js +0 -1
  16. package/lib/cjs/FormatSpecHandle.js.map +1 -1
  17. package/lib/cjs/Formatter/Format.js.map +1 -1
  18. package/lib/cjs/Formatter/FormatEnums.js.map +1 -1
  19. package/lib/cjs/Formatter/Formatter.js.map +1 -1
  20. package/lib/cjs/Formatter/FormatterSpec.js.map +1 -1
  21. package/lib/cjs/Formatter/FormattingReadyCollector.js.map +1 -1
  22. package/lib/cjs/Formatter/Interfaces.js.map +1 -1
  23. package/lib/cjs/Interfaces.js.map +1 -1
  24. package/lib/cjs/Parser.js.map +1 -1
  25. package/lib/cjs/ParserSpec.js.map +1 -1
  26. package/lib/cjs/Quantity.d.ts +4 -0
  27. package/lib/cjs/Quantity.d.ts.map +1 -1
  28. package/lib/cjs/Quantity.js +12 -23
  29. package/lib/cjs/Quantity.js.map +1 -1
  30. package/lib/cjs/QuantityLoggerCategory.js.map +1 -1
  31. package/lib/cjs/SerializedUnitSchema.js.map +1 -1
  32. package/lib/cjs/Unit.js.map +1 -1
  33. package/lib/cjs/UnitConversion/Graph.js.map +1 -1
  34. package/lib/cjs/UnitConversion/Parser.js.map +1 -1
  35. package/lib/cjs/UnitConversion/UnitConversion.js +6 -6
  36. package/lib/cjs/UnitConversion/UnitConversion.js.map +1 -1
  37. package/lib/cjs/UnitConversion/UnitDefinitionResolver.js.map +1 -1
  38. package/lib/cjs/UnitConversion/nameUtils.js.map +1 -1
  39. package/lib/cjs/UnitConversions.d.ts +40 -0
  40. package/lib/cjs/UnitConversions.d.ts.map +1 -0
  41. package/lib/cjs/UnitConversions.js +121 -0
  42. package/lib/cjs/UnitConversions.js.map +1 -0
  43. package/lib/cjs/assets/Units.json +72 -1
  44. package/lib/cjs/core-quantity.d.ts +6 -0
  45. package/lib/cjs/core-quantity.d.ts.map +1 -1
  46. package/lib/cjs/core-quantity.js +6 -0
  47. package/lib/cjs/core-quantity.js.map +1 -1
  48. package/lib/cjs/generated/Units.generated.d.ts +785 -0
  49. package/lib/cjs/generated/Units.generated.d.ts.map +1 -0
  50. package/lib/cjs/generated/Units.generated.js +775 -0
  51. package/lib/cjs/generated/Units.generated.js.map +1 -0
  52. package/lib/cjs/internal/BasicUnitConversionData.d.ts +33 -0
  53. package/lib/cjs/internal/BasicUnitConversionData.d.ts.map +1 -0
  54. package/lib/cjs/internal/BasicUnitConversionData.js +126 -0
  55. package/lib/cjs/internal/BasicUnitConversionData.js.map +1 -0
  56. package/lib/cjs/internal/BasicUnitConversions.generated.d.ts +507 -0
  57. package/lib/cjs/internal/BasicUnitConversions.generated.d.ts.map +1 -0
  58. package/lib/cjs/internal/BasicUnitConversions.generated.js +515 -0
  59. package/lib/cjs/internal/BasicUnitConversions.generated.js.map +1 -0
  60. package/lib/cjs/internal/BasicUnitsResolvedStateCache.d.ts +12 -0
  61. package/lib/cjs/internal/BasicUnitsResolvedStateCache.d.ts.map +1 -0
  62. package/lib/cjs/internal/BasicUnitsResolvedStateCache.js +37 -0
  63. package/lib/cjs/internal/BasicUnitsResolvedStateCache.js.map +1 -0
  64. package/lib/cjs/internal/DefaultPersistenceUnits.generated.d.ts +84 -0
  65. package/lib/cjs/internal/DefaultPersistenceUnits.generated.d.ts.map +1 -0
  66. package/lib/cjs/internal/DefaultPersistenceUnits.generated.js +94 -0
  67. package/lib/cjs/internal/DefaultPersistenceUnits.generated.js.map +1 -0
  68. package/lib/cjs/internal/UnitConversionMath.d.ts +21 -0
  69. package/lib/cjs/internal/UnitConversionMath.d.ts.map +1 -0
  70. package/lib/cjs/internal/UnitConversionMath.js +55 -0
  71. package/lib/cjs/internal/UnitConversionMath.js.map +1 -0
  72. package/lib/cjs/internal/cross-package.js.map +1 -1
  73. package/lib/esm/BasicUnitsProvider.d.ts +8 -5
  74. package/lib/esm/BasicUnitsProvider.d.ts.map +1 -1
  75. package/lib/esm/BasicUnitsProvider.js +16 -139
  76. package/lib/esm/BasicUnitsProvider.js.map +1 -1
  77. package/lib/esm/CompositeUnitsProvider.js.map +1 -1
  78. package/lib/esm/Constants.js.map +1 -1
  79. package/lib/esm/Exception.d.ts +2 -1
  80. package/lib/esm/Exception.d.ts.map +1 -1
  81. package/lib/esm/Exception.js +1 -0
  82. package/lib/esm/Exception.js.map +1 -1
  83. package/lib/esm/FormatSpecHandle.d.ts +1 -2
  84. package/lib/esm/FormatSpecHandle.d.ts.map +1 -1
  85. package/lib/esm/FormatSpecHandle.js +0 -1
  86. package/lib/esm/FormatSpecHandle.js.map +1 -1
  87. package/lib/esm/Formatter/Format.js.map +1 -1
  88. package/lib/esm/Formatter/FormatEnums.js.map +1 -1
  89. package/lib/esm/Formatter/Formatter.js.map +1 -1
  90. package/lib/esm/Formatter/FormatterSpec.js.map +1 -1
  91. package/lib/esm/Formatter/FormattingReadyCollector.js.map +1 -1
  92. package/lib/esm/Formatter/Interfaces.js.map +1 -1
  93. package/lib/esm/Interfaces.js.map +1 -1
  94. package/lib/esm/Parser.js.map +1 -1
  95. package/lib/esm/ParserSpec.js.map +1 -1
  96. package/lib/esm/Quantity.d.ts +4 -0
  97. package/lib/esm/Quantity.d.ts.map +1 -1
  98. package/lib/esm/Quantity.js +12 -23
  99. package/lib/esm/Quantity.js.map +1 -1
  100. package/lib/esm/QuantityLoggerCategory.js.map +1 -1
  101. package/lib/esm/SerializedUnitSchema.js.map +1 -1
  102. package/lib/esm/Unit.js.map +1 -1
  103. package/lib/esm/UnitConversion/Graph.js.map +1 -1
  104. package/lib/esm/UnitConversion/Parser.js.map +1 -1
  105. package/lib/esm/UnitConversion/UnitConversion.js +1 -1
  106. package/lib/esm/UnitConversion/UnitConversion.js.map +1 -1
  107. package/lib/esm/UnitConversion/UnitDefinitionResolver.js.map +1 -1
  108. package/lib/esm/UnitConversion/nameUtils.js.map +1 -1
  109. package/lib/esm/UnitConversions.d.ts +40 -0
  110. package/lib/esm/UnitConversions.d.ts.map +1 -0
  111. package/lib/esm/UnitConversions.js +116 -0
  112. package/lib/esm/UnitConversions.js.map +1 -0
  113. package/lib/esm/assets/Units.json +72 -1
  114. package/lib/esm/core-quantity.d.ts +6 -0
  115. package/lib/esm/core-quantity.d.ts.map +1 -1
  116. package/lib/esm/core-quantity.js +6 -0
  117. package/lib/esm/core-quantity.js.map +1 -1
  118. package/lib/esm/generated/Units.generated.d.ts +785 -0
  119. package/lib/esm/generated/Units.generated.d.ts.map +1 -0
  120. package/lib/esm/generated/Units.generated.js +772 -0
  121. package/lib/esm/generated/Units.generated.js.map +1 -0
  122. package/lib/esm/internal/BasicUnitConversionData.d.ts +33 -0
  123. package/lib/esm/internal/BasicUnitConversionData.d.ts.map +1 -0
  124. package/lib/esm/internal/BasicUnitConversionData.js +122 -0
  125. package/lib/esm/internal/BasicUnitConversionData.js.map +1 -0
  126. package/lib/esm/internal/BasicUnitConversions.generated.d.ts +507 -0
  127. package/lib/esm/internal/BasicUnitConversions.generated.d.ts.map +1 -0
  128. package/lib/esm/internal/BasicUnitConversions.generated.js +512 -0
  129. package/lib/esm/internal/BasicUnitConversions.generated.js.map +1 -0
  130. package/lib/esm/internal/BasicUnitsResolvedStateCache.d.ts +12 -0
  131. package/lib/esm/internal/BasicUnitsResolvedStateCache.d.ts.map +1 -0
  132. package/lib/esm/internal/BasicUnitsResolvedStateCache.js +33 -0
  133. package/lib/esm/internal/BasicUnitsResolvedStateCache.js.map +1 -0
  134. package/lib/esm/internal/DefaultPersistenceUnits.generated.d.ts +84 -0
  135. package/lib/esm/internal/DefaultPersistenceUnits.generated.d.ts.map +1 -0
  136. package/lib/esm/internal/DefaultPersistenceUnits.generated.js +91 -0
  137. package/lib/esm/internal/DefaultPersistenceUnits.generated.js.map +1 -0
  138. package/lib/esm/internal/UnitConversionMath.d.ts +21 -0
  139. package/lib/esm/internal/UnitConversionMath.d.ts.map +1 -0
  140. package/lib/esm/internal/UnitConversionMath.js +49 -0
  141. package/lib/esm/internal/UnitConversionMath.js.map +1 -0
  142. package/lib/esm/internal/cross-package.js.map +1 -1
  143. package/package.json +10 -8
@@ -6,7 +6,7 @@
6
6
  * @module Quantity
7
7
  */
8
8
  import { QuantityError, QuantityStatus } from "./Exception";
9
- import { UnitConversionInvert } from "./Interfaces";
9
+ import { applyConversionInternal, convertValueOrThrow, almostEqual as internalAlmostEqual, almostZero as internalAlmostZero } from "./internal/UnitConversionMath";
10
10
  /**
11
11
  * Checks if two numbers are approximately equal within given relative tolerance.
12
12
  * @param a - The first number to compare.
@@ -16,9 +16,7 @@ import { UnitConversionInvert } from "./Interfaces";
16
16
  * @internal
17
17
  */
18
18
  export function almostEqual(a, b, tolerance = 2.2204460492503131e-16) {
19
- const absDiff = Math.abs(a - b);
20
- const scaledTolerance = Math.max(1, Math.abs(a), Math.abs(b)) * tolerance;
21
- return absDiff <= scaledTolerance;
19
+ return internalAlmostEqual(a, b, tolerance);
22
20
  }
23
21
  /** The Quantity class is convenient container to specify both the magnitude and unit of a quantity. This class is commonly
24
22
  * returned as the result of parsing a string that represents a quantity.
@@ -50,44 +48,35 @@ export class Quantity {
50
48
  * @param toUnit The new unit for the quantity.
51
49
  * @param conversion Defines the information needed to convert the Quantity's magnitude from the current unit to another unit. This conversion info is usually
52
50
  * returned from the UnitsProvider.
51
+ * @throws [[QuantityError]] with [[QuantityStatus.InvalidUnitConversion]] when `conversion.error === true`.
52
+ * @throws [[QuantityError]] with [[QuantityStatus.InvertingZero]] when inversion would require dividing by zero or almost-zero.
53
53
  */
54
54
  convertTo(toUnit, conversion) {
55
- const newMagnitude = applyConversion(this.magnitude, conversion);
55
+ if (conversion.error) {
56
+ throw new QuantityError(QuantityStatus.InvalidUnitConversion, `Cannot convert quantity from "${this.unit.name}" to "${toUnit.name}" using invalid conversion metadata.`);
57
+ }
58
+ const newMagnitude = convertValueOrThrow(this.magnitude, conversion);
56
59
  return new Quantity(toUnit, newMagnitude);
57
60
  }
58
61
  }
59
- function invert(input) {
60
- if (almostZero(input)) // mimic the behavior of native here. We don't want to invert those very small values
61
- throw new QuantityError(QuantityStatus.InvertingZero, "Cannot invert zero value");
62
- return 1 / input;
63
- }
64
62
  /** Determines if a value is almost zero. (less than 1e-16)
65
63
  * @param value - The value to be checked.
66
64
  * @returns `true` if the value is almost zero, `false` otherwise.
67
65
  * @internal
68
66
  */
69
67
  export function almostZero(value) {
70
- return almostEqual(value, 0.0);
68
+ return internalAlmostZero(value);
71
69
  }
72
70
  /**
73
71
  * Applies a unit conversion to a given value.
72
+ * Does not throw when `props.error === true`; callers are expected to have already handled that contract.
73
+ * For the throwing apply helper, use `UnitConversions.convertValue(...)`.
74
74
  * @param value - The value to be converted.
75
75
  * @param props - The unit conversion properties.
76
76
  * @returns The converted value.
77
77
  * @internal
78
78
  */
79
79
  export function applyConversion(value, props) {
80
- let convertedValue = value;
81
- // Apply pre-conversion inversion if specified
82
- if (props.inversion === UnitConversionInvert.InvertPreConversion) {
83
- convertedValue = invert(convertedValue);
84
- }
85
- // Apply the conversion factor and offset
86
- convertedValue = (convertedValue * props.factor) + props.offset;
87
- // Apply post-conversion inversion if specified
88
- if (props.inversion === UnitConversionInvert.InvertPostConversion) {
89
- convertedValue = invert(convertedValue);
90
- }
91
- return convertedValue;
80
+ return applyConversionInternal(value, props, false);
92
81
  }
93
82
  //# sourceMappingURL=Quantity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Quantity.js","sourceRoot":"","sources":["../../src/Quantity.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAiB,oBAAoB,EAAkC,MAAM,cAAc,CAAC;AAEnG;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,YAAoB,sBAAsB;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1E,OAAO,OAAO,IAAI,eAAe,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACT,UAAU,GAAW,GAAG,CAAC;IACzB,KAAK,CAAY;IACjB,QAAQ,GAAY,KAAK,CAAC;IAEpC,IAAW,IAAI,KAAgB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,IAAW,OAAO,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD;;;OAGG;IACH,YAAmB,IAAgB,EAAE,SAAkB;QACrD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/G,CAAC;QAED,IAAI,SAAS,KAAK,SAAS;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,MAAiB,EAAE,UAA+B;QACjE,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,qFAAqF;QAC1G,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAA0B;IACvE,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,8CAA8C;IAC9C,IAAI,KAAK,CAAC,SAAS,KAAK,oBAAoB,CAAC,mBAAmB,EAAE,CAAC;QACjE,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,yCAAyC;IACzC,cAAc,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAEhE,+CAA+C;IAC/C,IAAI,KAAK,CAAC,SAAS,KAAK,oBAAoB,CAAC,oBAAoB,EAAE,CAAC;QAClE,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityError, QuantityStatus } from \"./Exception\";\nimport { QuantityProps, UnitConversionInvert, UnitConversionProps, UnitProps } from \"./Interfaces\";\n\n/**\n * Checks if two numbers are approximately equal within given relative tolerance.\n * @param a - The first number to compare.\n * @param b - The second number to compare.\n * @param tolerance - Tolerance, scales based on the input number values (multiplied by 1, abs(a) or abs(b), whichever is biggest).\n * @returns True if the numbers are approximately equal, false otherwise.\n * @internal\n */\nexport function almostEqual(a: number, b: number, tolerance: number = 2.2204460492503131e-16): boolean {\n const absDiff = Math.abs(a - b);\n const scaledTolerance = Math.max(1, Math.abs(a), Math.abs(b)) * tolerance;\n return absDiff <= scaledTolerance;\n}\n\n/** The Quantity class is convenient container to specify both the magnitude and unit of a quantity. This class is commonly\n * returned as the result of parsing a string that represents a quantity.\n * @beta\n */\nexport class Quantity implements QuantityProps {\n protected _magnitude: number = 0.0;\n protected _unit: UnitProps;\n protected _isValid: boolean = false;\n\n public get unit(): UnitProps { return this._unit; }\n public get magnitude(): number { return this._magnitude; }\n public get isValid(): boolean { return this._isValid; }\n\n /** Constructor. The Quantity will only be set as valid if a unit is specified.\n * @param unit Defines the quantity's unit.\n * @param magnitude Defines the magnitude of the quantity.\n */\n public constructor(unit?: UnitProps, magnitude?: number) {\n if (undefined !== unit) {\n this._unit = unit;\n this._isValid = true;\n } else {\n this._unit = { name: \"unknown\", label: \"unknown\", phenomenon: \"unknown\", isValid: false, system: \"unknown\" };\n }\n\n if (undefined !== magnitude)\n this._magnitude = magnitude;\n }\n\n /** Convert a Quantity to the specified unit given the UnitConversion.\n * @param toUnit The new unit for the quantity.\n * @param conversion Defines the information needed to convert the Quantity's magnitude from the current unit to another unit. This conversion info is usually\n * returned from the UnitsProvider.\n */\n public convertTo(toUnit: UnitProps, conversion: UnitConversionProps): Quantity {\n const newMagnitude = applyConversion(this.magnitude, conversion);\n return new Quantity(toUnit, newMagnitude);\n }\n}\n\nfunction invert(input: number): number {\n if (almostZero(input)) // mimic the behavior of native here. We don't want to invert those very small values\n throw new QuantityError(QuantityStatus.InvertingZero, \"Cannot invert zero value\");\n return 1 / input;\n}\n\n/** Determines if a value is almost zero. (less than 1e-16)\n * @param value - The value to be checked.\n * @returns `true` if the value is almost zero, `false` otherwise.\n * @internal\n */\nexport function almostZero(value: number): boolean {\n return almostEqual(value, 0.0);\n}\n\n/**\n * Applies a unit conversion to a given value.\n * @param value - The value to be converted.\n * @param props - The unit conversion properties.\n * @returns The converted value.\n * @internal\n */\nexport function applyConversion(value: number, props: UnitConversionProps): number {\n let convertedValue = value;\n\n // Apply pre-conversion inversion if specified\n if (props.inversion === UnitConversionInvert.InvertPreConversion) {\n convertedValue = invert(convertedValue);\n }\n\n // Apply the conversion factor and offset\n convertedValue = (convertedValue * props.factor) + props.offset;\n\n // Apply post-conversion inversion if specified\n if (props.inversion === UnitConversionInvert.InvertPostConversion) {\n convertedValue = invert(convertedValue);\n }\n\n return convertedValue;\n}\n"]}
1
+ {"version":3,"file":"Quantity.js","sourceRoot":"","sources":["../../src/Quantity.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,WAAW,IAAI,mBAAmB,EAAE,UAAU,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnK;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,YAAoB,sBAAsB;IAC1F,OAAO,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACT,UAAU,GAAW,GAAG,CAAC;IACzB,KAAK,CAAY;IACjB,QAAQ,GAAY,KAAK,CAAC;IAEpC,IAAW,IAAI,KAAgB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,IAAW,OAAO,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD;;;OAGG;IACH,YAAmB,IAAgB,EAAE,SAAkB;QACrD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/G,CAAC;QAED,IAAI,SAAS,KAAK,SAAS;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACI,SAAS,CAAC,MAAiB,EAAE,UAA+B;QACjE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,aAAa,CACrB,cAAc,CAAC,qBAAqB,EACpC,iCAAiC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,sCAAsC,CAC1G,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrE,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAA0B;IACvE,OAAO,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityError, QuantityStatus } from \"./Exception\";\r\nimport { QuantityProps, UnitConversionProps, UnitProps } from \"./Interfaces\";\r\nimport { applyConversionInternal, convertValueOrThrow, almostEqual as internalAlmostEqual, almostZero as internalAlmostZero } from \"./internal/UnitConversionMath\";\r\n\r\n/**\r\n * Checks if two numbers are approximately equal within given relative tolerance.\r\n * @param a - The first number to compare.\r\n * @param b - The second number to compare.\r\n * @param tolerance - Tolerance, scales based on the input number values (multiplied by 1, abs(a) or abs(b), whichever is biggest).\r\n * @returns True if the numbers are approximately equal, false otherwise.\r\n * @internal\r\n */\r\nexport function almostEqual(a: number, b: number, tolerance: number = 2.2204460492503131e-16): boolean {\r\n return internalAlmostEqual(a, b, tolerance);\r\n}\r\n\r\n/** The Quantity class is convenient container to specify both the magnitude and unit of a quantity. This class is commonly\r\n * returned as the result of parsing a string that represents a quantity.\r\n * @beta\r\n */\r\nexport class Quantity implements QuantityProps {\r\n protected _magnitude: number = 0.0;\r\n protected _unit: UnitProps;\r\n protected _isValid: boolean = false;\r\n\r\n public get unit(): UnitProps { return this._unit; }\r\n public get magnitude(): number { return this._magnitude; }\r\n public get isValid(): boolean { return this._isValid; }\r\n\r\n /** Constructor. The Quantity will only be set as valid if a unit is specified.\r\n * @param unit Defines the quantity's unit.\r\n * @param magnitude Defines the magnitude of the quantity.\r\n */\r\n public constructor(unit?: UnitProps, magnitude?: number) {\r\n if (undefined !== unit) {\r\n this._unit = unit;\r\n this._isValid = true;\r\n } else {\r\n this._unit = { name: \"unknown\", label: \"unknown\", phenomenon: \"unknown\", isValid: false, system: \"unknown\" };\r\n }\r\n\r\n if (undefined !== magnitude)\r\n this._magnitude = magnitude;\r\n }\r\n\r\n /** Convert a Quantity to the specified unit given the UnitConversion.\r\n * @param toUnit The new unit for the quantity.\r\n * @param conversion Defines the information needed to convert the Quantity's magnitude from the current unit to another unit. This conversion info is usually\r\n * returned from the UnitsProvider.\r\n * @throws [[QuantityError]] with [[QuantityStatus.InvalidUnitConversion]] when `conversion.error === true`.\r\n * @throws [[QuantityError]] with [[QuantityStatus.InvertingZero]] when inversion would require dividing by zero or almost-zero.\r\n */\r\n public convertTo(toUnit: UnitProps, conversion: UnitConversionProps): Quantity {\r\n if (conversion.error) {\r\n throw new QuantityError(\r\n QuantityStatus.InvalidUnitConversion,\r\n `Cannot convert quantity from \"${this.unit.name}\" to \"${toUnit.name}\" using invalid conversion metadata.`,\r\n );\r\n }\r\n\r\n const newMagnitude = convertValueOrThrow(this.magnitude, conversion);\r\n return new Quantity(toUnit, newMagnitude);\r\n }\r\n}\r\n\r\n/** Determines if a value is almost zero. (less than 1e-16)\r\n * @param value - The value to be checked.\r\n * @returns `true` if the value is almost zero, `false` otherwise.\r\n * @internal\r\n */\r\nexport function almostZero(value: number): boolean {\r\n return internalAlmostZero(value);\r\n}\r\n\r\n/**\r\n * Applies a unit conversion to a given value.\r\n * Does not throw when `props.error === true`; callers are expected to have already handled that contract.\r\n * For the throwing apply helper, use `UnitConversions.convertValue(...)`.\r\n * @param value - The value to be converted.\r\n * @param props - The unit conversion properties.\r\n * @returns The converted value.\r\n * @internal\r\n */\r\nexport function applyConversion(value: number, props: UnitConversionProps): number {\r\n return applyConversionInternal(value, props, false);\r\n}\r\n\r\n\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"QuantityLoggerCategory.js","sourceRoot":"","sources":["../../src/QuantityLoggerCategory.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAN,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,uDAAuD;IACvD,mDAAyB,CAAA;IACzB,0DAA0D;IAC1D,iEAAuC,CAAA;IACvC,uDAAuD;IACvD,2DAAiC,CAAA;AACnC,CAAC,EAPW,sBAAsB,KAAtB,sBAAsB,QAOjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Logging\n */\n\n/** Logger categories used by the `@itwin/core-quantity` package.\n * @see [Logger]($bentley)\n * @beta\n */\nexport enum QuantityLoggerCategory {\n /** The root category for the core-quantity package. */\n Package = \"core-quantity\",\n /** Logger category for quantity formatting operations. */\n Formatting = \"core-quantity.Formatting\",\n /** Logger category for quantity parsing operations. */\n Parsing = \"core-quantity.Parsing\",\n}\n"]}
1
+ {"version":3,"file":"QuantityLoggerCategory.js","sourceRoot":"","sources":["../../src/QuantityLoggerCategory.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAN,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,uDAAuD;IACvD,mDAAyB,CAAA;IACzB,0DAA0D;IAC1D,iEAAuC,CAAA;IACvC,uDAAuD;IACvD,2DAAiC,CAAA;AACnC,CAAC,EAPW,sBAAsB,KAAtB,sBAAsB,QAOjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Logging\r\n */\r\n\r\n/** Logger categories used by the `@itwin/core-quantity` package.\r\n * @see [Logger]($bentley)\r\n * @beta\r\n */\r\nexport enum QuantityLoggerCategory {\r\n /** The root category for the core-quantity package. */\r\n Package = \"core-quantity\",\r\n /** Logger category for quantity formatting operations. */\r\n Formatting = \"core-quantity.Formatting\",\r\n /** Logger category for quantity parsing operations. */\r\n Parsing = \"core-quantity.Parsing\",\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SerializedUnitSchema.js","sourceRoot":"","sources":["../../src/SerializedUnitSchema.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,UAAU,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** Current version of the serialization format for `SerializedUnitSchema`.\n *\n * This value is written into `Units.json` as the `version` field and checked at\n * parse time. Two version axes exist:\n *\n * - **Format version** (`SERIALIZED_UNIT_SCHEMA_VERSION` / `Units.json.version`): bump\n * the major version when the shape of the `SerializedUnitSchema` interfaces changes\n * incompatibly (e.g. renaming fields, removing required properties). Minor bumps for\n * backward-compatible additions.\n *\n * - **Source provenance** (`sourceEcSchemaVersion` inside `Units.json`): records which\n * version of the BIS Units EC schema the data was derived from (e.g. `\"01.00.09\"`).\n * This is a traceability marker, not a runtime contract.\n *\n * @internal\n */\nexport const SERIALIZED_UNIT_SCHEMA_VERSION = \"01.00.00\";\n\n/** A serialized constant definition (e.g. `PI`, `MILLI`).\n * @internal\n */\nexport interface SerializedConstant {\n readonly schemaItemType: \"Constant\";\n readonly label?: string;\n readonly description?: string;\n /** The phenomenon this constant belongs to. */\n readonly phenomenon: string;\n /** The unit definition expression (e.g. `\"M*M\"`). */\n readonly definition: string;\n /** Numerator of the conversion factor to the SI base. */\n readonly numerator?: number;\n /** Denominator of the conversion factor to the SI base. */\n readonly denominator?: number;\n}\n\n/** A serialized unit definition (e.g. `M`, `FT`, `CELSIUS`).\n * @internal\n */\nexport interface SerializedUnit {\n readonly schemaItemType: \"Unit\";\n readonly label?: string;\n readonly description?: string;\n readonly phenomenon: string;\n readonly unitSystem: string;\n /** The unit definition expression (e.g. `\"M*M\"`). */\n readonly definition: string;\n /** Numerator of the conversion factor to the SI base. */\n readonly numerator?: number;\n /** Denominator of the conversion factor to the SI base. */\n readonly denominator?: number;\n /** Additive offset for the conversion (e.g. temperature scales). */\n readonly offset?: number;\n}\n\n/** A serialized inverted unit definition (e.g. `HORIZONTAL_PER_VERTICAL`).\n * @internal\n */\nexport interface SerializedInvertedUnit {\n readonly schemaItemType: \"InvertedUnit\";\n readonly label?: string;\n readonly description?: string;\n readonly invertsUnit: string;\n readonly unitSystem: string;\n}\n\n/** A serialized unit system definition (e.g. `SI`, `METRIC`).\n * @internal\n */\nexport interface SerializedUnitSystem {\n readonly schemaItemType: \"UnitSystem\";\n readonly label?: string;\n readonly description?: string;\n}\n\n/** A serialized phenomenon definition (e.g. `LENGTH`, `TEMPERATURE`).\n * @internal\n */\nexport interface SerializedPhenomenon {\n readonly schemaItemType: \"Phenomenon\";\n readonly label?: string;\n readonly description?: string;\n /** The phenomenon definition expression. */\n readonly definition: string;\n}\n\n/** Discriminated union of all serialized schema item types.\n * @internal\n */\nexport type SerializedUnitItem = SerializedConstant | SerializedUnit | SerializedInvertedUnit | SerializedUnitSystem | SerializedPhenomenon;\n\n/** Versioned container for a serialized BIS unit schema. The `items` map is keyed by schema-item name (unqualified).\n * @internal\n */\nexport interface SerializedUnitSchema {\n /** Serialization format version, matching `SERIALIZED_UNIT_SCHEMA_VERSION` (e.g. `\"01.00.00\"`). */\n readonly version: string;\n readonly name: string;\n readonly alias: string;\n /** EC schema version of the source BIS Units schema this data was derived from (e.g. `\"01.00.09\"`). */\n readonly sourceEcSchemaVersion: string;\n readonly items: { readonly [name: string]: SerializedUnitItem };\n}\n"]}
1
+ {"version":3,"file":"SerializedUnitSchema.js","sourceRoot":"","sources":["../../src/SerializedUnitSchema.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,UAAU,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** Current version of the serialization format for `SerializedUnitSchema`.\r\n *\r\n * This value is written into `Units.json` as the `version` field and checked at\r\n * parse time. Two version axes exist:\r\n *\r\n * - **Format version** (`SERIALIZED_UNIT_SCHEMA_VERSION` / `Units.json.version`): bump\r\n * the major version when the shape of the `SerializedUnitSchema` interfaces changes\r\n * incompatibly (e.g. renaming fields, removing required properties). Minor bumps for\r\n * backward-compatible additions.\r\n *\r\n * - **Source provenance** (`sourceEcSchemaVersion` inside `Units.json`): records which\r\n * version of the BIS Units EC schema the data was derived from (e.g. `\"01.00.09\"`).\r\n * This is a traceability marker, not a runtime contract.\r\n *\r\n * @internal\r\n */\r\nexport const SERIALIZED_UNIT_SCHEMA_VERSION = \"01.00.00\";\r\n\r\n/** A serialized constant definition (e.g. `PI`, `MILLI`).\r\n * @internal\r\n */\r\nexport interface SerializedConstant {\r\n readonly schemaItemType: \"Constant\";\r\n readonly label?: string;\r\n readonly description?: string;\r\n /** The phenomenon this constant belongs to. */\r\n readonly phenomenon: string;\r\n /** The unit definition expression (e.g. `\"M*M\"`). */\r\n readonly definition: string;\r\n /** Numerator of the conversion factor to the SI base. */\r\n readonly numerator?: number;\r\n /** Denominator of the conversion factor to the SI base. */\r\n readonly denominator?: number;\r\n}\r\n\r\n/** A serialized unit definition (e.g. `M`, `FT`, `CELSIUS`).\r\n * @internal\r\n */\r\nexport interface SerializedUnit {\r\n readonly schemaItemType: \"Unit\";\r\n readonly label?: string;\r\n readonly description?: string;\r\n readonly phenomenon: string;\r\n readonly unitSystem: string;\r\n /** The unit definition expression (e.g. `\"M*M\"`). */\r\n readonly definition: string;\r\n /** Numerator of the conversion factor to the SI base. */\r\n readonly numerator?: number;\r\n /** Denominator of the conversion factor to the SI base. */\r\n readonly denominator?: number;\r\n /** Additive offset for the conversion (e.g. temperature scales). */\r\n readonly offset?: number;\r\n}\r\n\r\n/** A serialized inverted unit definition (e.g. `HORIZONTAL_PER_VERTICAL`).\r\n * @internal\r\n */\r\nexport interface SerializedInvertedUnit {\r\n readonly schemaItemType: \"InvertedUnit\";\r\n readonly label?: string;\r\n readonly description?: string;\r\n readonly invertsUnit: string;\r\n readonly unitSystem: string;\r\n}\r\n\r\n/** A serialized unit system definition (e.g. `SI`, `METRIC`).\r\n * @internal\r\n */\r\nexport interface SerializedUnitSystem {\r\n readonly schemaItemType: \"UnitSystem\";\r\n readonly label?: string;\r\n readonly description?: string;\r\n}\r\n\r\n/** A serialized phenomenon definition (e.g. `LENGTH`, `TEMPERATURE`).\r\n * @internal\r\n */\r\nexport interface SerializedPhenomenon {\r\n readonly schemaItemType: \"Phenomenon\";\r\n readonly label?: string;\r\n readonly description?: string;\r\n /** The phenomenon definition expression. */\r\n readonly definition: string;\r\n}\r\n\r\n/** Discriminated union of all serialized schema item types.\r\n * @internal\r\n */\r\nexport type SerializedUnitItem = SerializedConstant | SerializedUnit | SerializedInvertedUnit | SerializedUnitSystem | SerializedPhenomenon;\r\n\r\n/** Versioned container for a serialized BIS unit schema. The `items` map is keyed by schema-item name (unqualified).\r\n * @internal\r\n */\r\nexport interface SerializedUnitSchema {\r\n /** Serialization format version, matching `SERIALIZED_UNIT_SCHEMA_VERSION` (e.g. `\"01.00.00\"`). */\r\n readonly version: string;\r\n readonly name: string;\r\n readonly alias: string;\r\n /** EC schema version of the source BIS Units schema this data was derived from (e.g. `\"01.00.09\"`). */\r\n readonly sourceEcSchemaVersion: string;\r\n readonly items: { readonly [name: string]: SerializedUnitItem };\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAIH;;GAEG;AACH,MAAM,OAAO,SAAS;IACb,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,GAAG,EAAE,CAAC;IACX,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAW,SAAS,CAAC;IAElC,YAAY,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,MAAe;QAC1E,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM;gBACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,OAAO;IACX,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,GAAG,EAAE,CAAC;IACX,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,SAAS,CAAC;CAC3B","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { UnitProps } from \"./Interfaces\";\n\n/** This class provides basic implementation of UnitProps interface.\n * @beta\n */\nexport class BasicUnit implements UnitProps {\n public name = \"\";\n public label = \"\";\n public phenomenon = \"\";\n public isValid = false;\n public system: string = \"unknown\";\n\n constructor(name: string, label: string, phenomenon: string, system?: string) {\n if (name && name.length > 0 && label && label.length > 0 && phenomenon && phenomenon.length > 0) {\n this.name = name;\n this.label = label;\n this.phenomenon = phenomenon;\n this.isValid = true;\n if (system)\n this.system = system;\n }\n }\n}\n\n/** This class is a convenience class that can be returned when a valid Unit cannot be determined.\n * @beta\n */\nexport class BadUnit implements UnitProps {\n public name = \"\";\n public label = \"\";\n public phenomenon = \"\";\n public isValid = false;\n public system = \"unknown\";\n}\n"]}
1
+ {"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAIH;;GAEG;AACH,MAAM,OAAO,SAAS;IACb,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,GAAG,EAAE,CAAC;IACX,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAW,SAAS,CAAC;IAElC,YAAY,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,MAAe;QAC1E,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM;gBACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,OAAO;IACX,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,GAAG,EAAE,CAAC;IACX,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,SAAS,CAAC;CAC3B","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { UnitProps } from \"./Interfaces\";\r\n\r\n/** This class provides basic implementation of UnitProps interface.\r\n * @beta\r\n */\r\nexport class BasicUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system: string = \"unknown\";\r\n\r\n constructor(name: string, label: string, phenomenon: string, system?: string) {\r\n if (name && name.length > 0 && label && label.length > 0 && phenomenon && phenomenon.length > 0) {\r\n this.name = name;\r\n this.label = label;\r\n this.phenomenon = phenomenon;\r\n this.isValid = true;\r\n if (system)\r\n this.system = system;\r\n }\r\n }\r\n}\r\n\r\n/** This class is a convenience class that can be returned when a valid Unit cannot be determined.\r\n * @beta\r\n */\r\nexport class BadUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system = \"unknown\";\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../../src/UnitConversion/Graph.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// Following https://github.com/dagrejs/graphlib/blob/master/lib/graph.js\n\n/**\n * Using generics for nodes - T represents Unit | Constant in our use case\n * @internal\n */\ninterface NodesMap<T> {\n [node: string]: T;\n}\n\n/**\n * Describe edges based on its node endpoints (v, w)\n * @internal\n */\ninterface EdgeObjsMap {\n [edge: string]: {\n v: string;\n w: string;\n };\n}\n\n/**\n * Describe edges based on the exponent they carry\n * @internal\n */\ninterface EdgeLabelsMap {\n [edge: string]: { exponent: number };\n}\n\n/**\n * List each node with outgoing edges in outer map; describe each node's outgoing edges in inner map\n * @internal\n */\ninterface OutEdgesMap {\n [node: string]: {\n [edges: string]: {\n v: string;\n w: string;\n };\n };\n}\n\n/** @internal */\nexport class UnitConversionGraph<T> {\n private _edgeKeyDelim = \"\\x01\";\n private _label = \"\";\n private _nodeCount = 0;\n private _edgeCount = 0;\n private _nodes: NodesMap<T>;\n private _edgeObjs: EdgeObjsMap;\n private _edgeLabels: EdgeLabelsMap;\n private _outEdges: OutEdgesMap;\n\n constructor() {\n this._nodes = {};\n this._edgeObjs = {};\n this._edgeLabels = {};\n this._outEdges = {};\n }\n\n public setGraph = (label: string): UnitConversionGraph<T> => {\n this._label = label;\n return this;\n };\n\n public graph = () => {\n return this._label;\n };\n\n public nodeCount = () => {\n return this._nodeCount;\n };\n\n public nodes = () => {\n return Object.keys(this._nodes);\n };\n\n public setNode = (nodeKey: string, nodeValue: T) => {\n if (nodeKey in this._nodes) {\n this._nodes[nodeKey] = nodeValue;\n return;\n }\n this._nodes[nodeKey] = nodeValue;\n this._outEdges[nodeKey] = {};\n ++this._nodeCount;\n };\n\n public node = (nodeKey: string) => {\n return this._nodes[nodeKey];\n };\n\n public hasNode = (nodeKey: string) => {\n return nodeKey in this._nodes;\n };\n\n public edgeCount = () => {\n return this._edgeCount;\n };\n\n public edges = () => {\n return Object.values(this._edgeObjs);\n };\n\n public setEdge = (v: string, w: string, value: { exponent: number }) => {\n const edgeId = v + this._edgeKeyDelim + w + this._edgeKeyDelim;\n if (edgeId in this._edgeLabels) {\n // Update exponent, specific to this graph's use case\n this._edgeLabels[edgeId].exponent += value.exponent;\n return;\n }\n\n this._edgeLabels[edgeId] = value;\n const edgeObj = {\n v,\n w,\n };\n this._edgeObjs[edgeId] = edgeObj;\n // setNode should have ran first, so this.outEdges[v] shouldn't be undefined\n this._outEdges[v][edgeId] = edgeObj;\n this._edgeCount++;\n };\n\n public edge = (v: string, w: string) => {\n const edgeId = v + this._edgeKeyDelim + w + this._edgeKeyDelim;\n return this._edgeLabels[edgeId];\n };\n\n public outEdges = (v: string) => {\n const outV = this._outEdges[v];\n const edges = Object.values(outV);\n return edges;\n };\n}\n"]}
1
+ {"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../../src/UnitConversion/Graph.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// Following https://github.com/dagrejs/graphlib/blob/master/lib/graph.js\r\n\r\n/**\r\n * Using generics for nodes - T represents Unit | Constant in our use case\r\n * @internal\r\n */\r\ninterface NodesMap<T> {\r\n [node: string]: T;\r\n}\r\n\r\n/**\r\n * Describe edges based on its node endpoints (v, w)\r\n * @internal\r\n */\r\ninterface EdgeObjsMap {\r\n [edge: string]: {\r\n v: string;\r\n w: string;\r\n };\r\n}\r\n\r\n/**\r\n * Describe edges based on the exponent they carry\r\n * @internal\r\n */\r\ninterface EdgeLabelsMap {\r\n [edge: string]: { exponent: number };\r\n}\r\n\r\n/**\r\n * List each node with outgoing edges in outer map; describe each node's outgoing edges in inner map\r\n * @internal\r\n */\r\ninterface OutEdgesMap {\r\n [node: string]: {\r\n [edges: string]: {\r\n v: string;\r\n w: string;\r\n };\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport class UnitConversionGraph<T> {\r\n private _edgeKeyDelim = \"\\x01\";\r\n private _label = \"\";\r\n private _nodeCount = 0;\r\n private _edgeCount = 0;\r\n private _nodes: NodesMap<T>;\r\n private _edgeObjs: EdgeObjsMap;\r\n private _edgeLabels: EdgeLabelsMap;\r\n private _outEdges: OutEdgesMap;\r\n\r\n constructor() {\r\n this._nodes = {};\r\n this._edgeObjs = {};\r\n this._edgeLabels = {};\r\n this._outEdges = {};\r\n }\r\n\r\n public setGraph = (label: string): UnitConversionGraph<T> => {\r\n this._label = label;\r\n return this;\r\n };\r\n\r\n public graph = () => {\r\n return this._label;\r\n };\r\n\r\n public nodeCount = () => {\r\n return this._nodeCount;\r\n };\r\n\r\n public nodes = () => {\r\n return Object.keys(this._nodes);\r\n };\r\n\r\n public setNode = (nodeKey: string, nodeValue: T) => {\r\n if (nodeKey in this._nodes) {\r\n this._nodes[nodeKey] = nodeValue;\r\n return;\r\n }\r\n this._nodes[nodeKey] = nodeValue;\r\n this._outEdges[nodeKey] = {};\r\n ++this._nodeCount;\r\n };\r\n\r\n public node = (nodeKey: string) => {\r\n return this._nodes[nodeKey];\r\n };\r\n\r\n public hasNode = (nodeKey: string) => {\r\n return nodeKey in this._nodes;\r\n };\r\n\r\n public edgeCount = () => {\r\n return this._edgeCount;\r\n };\r\n\r\n public edges = () => {\r\n return Object.values(this._edgeObjs);\r\n };\r\n\r\n public setEdge = (v: string, w: string, value: { exponent: number }) => {\r\n const edgeId = v + this._edgeKeyDelim + w + this._edgeKeyDelim;\r\n if (edgeId in this._edgeLabels) {\r\n // Update exponent, specific to this graph's use case\r\n this._edgeLabels[edgeId].exponent += value.exponent;\r\n return;\r\n }\r\n\r\n this._edgeLabels[edgeId] = value;\r\n const edgeObj = {\r\n v,\r\n w,\r\n };\r\n this._edgeObjs[edgeId] = edgeObj;\r\n // setNode should have ran first, so this.outEdges[v] shouldn't be undefined\r\n this._outEdges[v][edgeId] = edgeObj;\r\n this._edgeCount++;\r\n };\r\n\r\n public edge = (v: string, w: string) => {\r\n const edgeId = v + this._edgeKeyDelim + w + this._edgeKeyDelim;\r\n return this._edgeLabels[edgeId];\r\n };\r\n\r\n public outEdges = (v: string) => {\r\n const outV = this._outEdges[v];\r\n const edges = Object.values(outV);\r\n return edges;\r\n };\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../../src/UnitConversion/Parser.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,MAAM,aAAa,GAAG,8EAA8E,CAAC;AACrG,MAAM,QAAQ,GAAG,uDAAuD,CAAC;AACzE,MAAM,EAAE,GAAG,GAAG,CAAC;AAEf,gBAAgB;AAChB,IAAK,MAIJ;AAJD,WAAK,MAAM;IACT,yCAAW,CAAA;IACX,mCAAQ,CAAA;IACR,2CAAY,CAAA;AACd,CAAC,EAJI,MAAM,KAAN,MAAM,QAIV;AASD,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,OAAO,GAAoC,IAAI,GAAG,EAAE,CAAC;IAE3D,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;YACtD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,iBAAiB;oBACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nconst expressionRgx = /^(([A-Z]\\w*:)?([A-Z]\\w*|\\[([A-Z]\\w*:)?[A-Z]\\w*\\])(\\(-?\\d+\\))?(\\*(?!$)|$))+$/i;\nconst tokenRgx = /(?:(\\[)?((?:[A-Z]\\w*:)?[A-Z]\\w*)\\]?)(?:\\((-?\\d+)\\))?/i;\nconst sp = \"*\";\n\n/** @internal */\nenum Tokens {\n Bracket = 1,\n Word = 2,\n Exponent = 3,\n}\n\n/** @internal */\nexport interface DefinitionFragment {\n name: string;\n exponent: number;\n constant: boolean;\n}\n\n/** @internal */\nexport function parseDefinition(definition: string): Map<string, DefinitionFragment> {\n const unitMap: Map<string, DefinitionFragment> = new Map();\n\n if (expressionRgx.test(definition)) {\n for (const unit of definition.split(sp)) {\n const tokens = unit.split(tokenRgx);\n const name = tokens[Tokens.Word];\n const exponent = tokens[Tokens.Exponent] ? Number(tokens[Tokens.Exponent]) : 1;\n const constant = tokens[Tokens.Bracket] !== undefined;\n if (unitMap.has(name)) {\n const currentDefinition = unitMap.get(name);\n if (currentDefinition)\n unitMap.set(name, { ...currentDefinition, exponent: currentDefinition.exponent + exponent });\n } else {\n unitMap.set(name, { name, exponent, constant });\n }\n }\n\n return unitMap;\n } else {\n throw new Error(\"Invalid definition expression.\");\n }\n}\n"]}
1
+ {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../../src/UnitConversion/Parser.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,MAAM,aAAa,GAAG,8EAA8E,CAAC;AACrG,MAAM,QAAQ,GAAG,uDAAuD,CAAC;AACzE,MAAM,EAAE,GAAG,GAAG,CAAC;AAEf,gBAAgB;AAChB,IAAK,MAIJ;AAJD,WAAK,MAAM;IACT,yCAAW,CAAA;IACX,mCAAQ,CAAA;IACR,2CAAY,CAAA;AACd,CAAC,EAJI,MAAM,KAAN,MAAM,QAIV;AASD,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,OAAO,GAAoC,IAAI,GAAG,EAAE,CAAC;IAE3D,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;YACtD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,iBAAiB;oBACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nconst expressionRgx = /^(([A-Z]\\w*:)?([A-Z]\\w*|\\[([A-Z]\\w*:)?[A-Z]\\w*\\])(\\(-?\\d+\\))?(\\*(?!$)|$))+$/i;\r\nconst tokenRgx = /(?:(\\[)?((?:[A-Z]\\w*:)?[A-Z]\\w*)\\]?)(?:\\((-?\\d+)\\))?/i;\r\nconst sp = \"*\";\r\n\r\n/** @internal */\r\nenum Tokens {\r\n Bracket = 1,\r\n Word = 2,\r\n Exponent = 3,\r\n}\r\n\r\n/** @internal */\r\nexport interface DefinitionFragment {\r\n name: string;\r\n exponent: number;\r\n constant: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport function parseDefinition(definition: string): Map<string, DefinitionFragment> {\r\n const unitMap: Map<string, DefinitionFragment> = new Map();\r\n\r\n if (expressionRgx.test(definition)) {\r\n for (const unit of definition.split(sp)) {\r\n const tokens = unit.split(tokenRgx);\r\n const name = tokens[Tokens.Word];\r\n const exponent = tokens[Tokens.Exponent] ? Number(tokens[Tokens.Exponent]) : 1;\r\n const constant = tokens[Tokens.Bracket] !== undefined;\r\n if (unitMap.has(name)) {\r\n const currentDefinition = unitMap.get(name);\r\n if (currentDefinition)\r\n unitMap.set(name, { ...currentDefinition, exponent: currentDefinition.exponent + exponent });\r\n } else {\r\n unitMap.set(name, { name, exponent, constant });\r\n }\r\n }\r\n\r\n return unitMap;\r\n } else {\r\n throw new Error(\"Invalid definition expression.\");\r\n }\r\n}\r\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { almostEqual } from "../Quantity";
5
+ import { almostEqual } from "../internal/UnitConversionMath";
6
6
  /**
7
7
  * Class used for storing calculated conversion between two Units and converting values from one Unit to another.
8
8
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"UnitConversion.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConversion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C;;;GAGG;AACH,MAAM,OAAO,cAAc;IACG;IAAsC;IAAlE,YAA4B,SAAiB,GAAG,EAAkB,SAAiB,GAAG;QAA1D,WAAM,GAAN,MAAM,CAAc;QAAkB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE1F;;;;OAIG;IACI,QAAQ,CAAC,CAAS;QACvB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,OAAO,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,UAA0B;QACvC,OAAO,IAAI,cAAc,CACvB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAC/B,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CACpD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,UAA0B;QACxC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;YACtE,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,KAAa;QACxB,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;YACzB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACjD,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;YAC9B,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/B,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAE9C;;;;OAIG;IACI,MAAM,CAAC,IAAI,CAAC,MAA4B;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { almostEqual } from \"../Quantity\";\n\n/**\n * Structural interface satisfied by any object that carries a numerator/denominator\n * factor and an optional offset — for example, the EC `Unit` and `Constant` classes in\n * `@itwin/ecschema-metadata`.\n * @internal\n */\nexport interface UnitConversionSource {\n readonly numerator: number;\n readonly denominator: number;\n readonly offset?: number;\n}\n\n/**\n * Class used for storing calculated conversion between two Units and converting values from one Unit to another.\n * @internal\n */\nexport class UnitConversion {\n constructor(public readonly factor: number = 1.0, public readonly offset: number = 0.0) {}\n\n /**\n * Converts x using UnitConversion\n * @param x Input magnitude to be converted\n * @returns Output magnitude after conversion\n */\n public evaluate(x: number): number {\n return this.factor * x + this.offset;\n }\n\n /**\n * Used to invert source's UnitConversion so that it can be composed with target's UnitConversion cleanly\n * @internal\n */\n public inverse(): UnitConversion {\n const inverseFactor = 1.0 / this.factor;\n return new UnitConversion(inverseFactor, -this.offset * inverseFactor);\n }\n\n /**\n * Combines two UnitConversions\n * Used to combine source's UnitConversion and target's UnitConversion for a final UnitConversion that can be evaluated\n * @internal\n */\n public compose(conversion: UnitConversion): UnitConversion {\n return new UnitConversion(\n this.factor * conversion.factor,\n conversion.factor * this.offset + conversion.offset,\n );\n }\n\n /**\n * Multiples two UnitConversions together to calculate factor during reducing\n * @internal\n */\n public multiply(conversion: UnitConversion): UnitConversion {\n if (almostEqual(conversion.offset, 0.0) && almostEqual(this.offset, 0.0))\n return new UnitConversion(this.factor * conversion.factor, 0.0);\n\n throw new Error(\"Cannot multiply two maps with non-zero offsets\");\n }\n\n /**\n * Raise UnitConversion's factor with power exponent to calculate factor during reducing\n * @internal\n */\n public raise(power: number): UnitConversion {\n if (almostEqual(power, 1.0))\n return new UnitConversion(this.factor, this.offset);\n else if (almostEqual(power, 0.0))\n return new UnitConversion(1.0, 0.0);\n\n if (almostEqual(this.offset, 0.0))\n return new UnitConversion(this.factor ** power, 0.0);\n\n throw new Error(\"Cannot raise map with non-zero offset\");\n }\n\n /** @internal */\n public static identity = new UnitConversion();\n\n /**\n * Returns UnitConversion with source's numerator and denominator in factor and source's offset in offset for reducing.\n * Accepts any object that structurally satisfies `UnitConversionSource` (e.g. EC `Unit` or `Constant`).\n * @internal\n */\n public static from(source: UnitConversionSource): UnitConversion {\n const offset = source.offset ?? 0;\n const hasOffset = !almostEqual(offset, 0.0);\n return new UnitConversion(source.denominator / source.numerator, hasOffset ? -offset : 0.0);\n }\n}\n"]}
1
+ {"version":3,"file":"UnitConversion.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConversion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAc7D;;;GAGG;AACH,MAAM,OAAO,cAAc;IACG;IAAsC;IAAlE,YAA4B,SAAiB,GAAG,EAAkB,SAAiB,GAAG;QAA1D,WAAM,GAAN,MAAM,CAAc;QAAkB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE1F;;;;OAIG;IACI,QAAQ,CAAC,CAAS;QACvB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,OAAO,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,UAA0B;QACvC,OAAO,IAAI,cAAc,CACvB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAC/B,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CACpD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,UAA0B;QACxC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;YACtE,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,KAAa;QACxB,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;YACzB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACjD,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;YAC9B,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/B,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAE9C;;;;OAIG;IACI,MAAM,CAAC,IAAI,CAAC,MAA4B;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { almostEqual } from \"../internal/UnitConversionMath\";\r\n\r\n/**\r\n * Structural interface satisfied by any object that carries a numerator/denominator\r\n * factor and an optional offset — for example, the EC `Unit` and `Constant` classes in\r\n * `@itwin/ecschema-metadata`.\r\n * @internal\r\n */\r\nexport interface UnitConversionSource {\r\n readonly numerator: number;\r\n readonly denominator: number;\r\n readonly offset?: number;\r\n}\r\n\r\n/**\r\n * Class used for storing calculated conversion between two Units and converting values from one Unit to another.\r\n * @internal\r\n */\r\nexport class UnitConversion {\r\n constructor(public readonly factor: number = 1.0, public readonly offset: number = 0.0) {}\r\n\r\n /**\r\n * Converts x using UnitConversion\r\n * @param x Input magnitude to be converted\r\n * @returns Output magnitude after conversion\r\n */\r\n public evaluate(x: number): number {\r\n return this.factor * x + this.offset;\r\n }\r\n\r\n /**\r\n * Used to invert source's UnitConversion so that it can be composed with target's UnitConversion cleanly\r\n * @internal\r\n */\r\n public inverse(): UnitConversion {\r\n const inverseFactor = 1.0 / this.factor;\r\n return new UnitConversion(inverseFactor, -this.offset * inverseFactor);\r\n }\r\n\r\n /**\r\n * Combines two UnitConversions\r\n * Used to combine source's UnitConversion and target's UnitConversion for a final UnitConversion that can be evaluated\r\n * @internal\r\n */\r\n public compose(conversion: UnitConversion): UnitConversion {\r\n return new UnitConversion(\r\n this.factor * conversion.factor,\r\n conversion.factor * this.offset + conversion.offset,\r\n );\r\n }\r\n\r\n /**\r\n * Multiples two UnitConversions together to calculate factor during reducing\r\n * @internal\r\n */\r\n public multiply(conversion: UnitConversion): UnitConversion {\r\n if (almostEqual(conversion.offset, 0.0) && almostEqual(this.offset, 0.0))\r\n return new UnitConversion(this.factor * conversion.factor, 0.0);\r\n\r\n throw new Error(\"Cannot multiply two maps with non-zero offsets\");\r\n }\r\n\r\n /**\r\n * Raise UnitConversion's factor with power exponent to calculate factor during reducing\r\n * @internal\r\n */\r\n public raise(power: number): UnitConversion {\r\n if (almostEqual(power, 1.0))\r\n return new UnitConversion(this.factor, this.offset);\r\n else if (almostEqual(power, 0.0))\r\n return new UnitConversion(1.0, 0.0);\r\n\r\n if (almostEqual(this.offset, 0.0))\r\n return new UnitConversion(this.factor ** power, 0.0);\r\n\r\n throw new Error(\"Cannot raise map with non-zero offset\");\r\n }\r\n\r\n /** @internal */\r\n public static identity = new UnitConversion();\r\n\r\n /**\r\n * Returns UnitConversion with source's numerator and denominator in factor and source's offset in offset for reducing.\r\n * Accepts any object that structurally satisfies `UnitConversionSource` (e.g. EC `Unit` or `Constant`).\r\n * @internal\r\n */\r\n public static from(source: UnitConversionSource): UnitConversion {\r\n const offset = source.offset ?? 0;\r\n const hasOffset = !almostEqual(offset, 0.0);\r\n return new UnitConversion(source.denominator / source.numerator, hasOffset ? -offset : 0.0);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"UnitDefinitionResolver.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitDefinitionResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { SERIALIZED_UNIT_SCHEMA_VERSION, type SerializedConstant, type SerializedUnit, type SerializedUnitSchema } from \"../SerializedUnitSchema\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { parseDefinition } from \"./Parser\";\nimport { stripAliasPrefix } from \"./nameUtils\";\n\nconst MAX_RESOLUTION_DEPTH = 30;\n\n/** Resolved unit entry containing the unit's name and its conversion to the base of its phenomenon.\n * @internal\n */\nexport interface ResolvedUnit {\n readonly name: string;\n readonly label: string;\n readonly phenomenon: string;\n readonly unitSystem: string;\n readonly conversion: UnitConversion;\n}\n\n/** Resolves every unit in a `SerializedUnitSchema` to a `UnitConversion` relative to its phenomenon's base unit.\n * @internal\n */\nexport class UnitDefinitionResolver {\n private readonly _schema: SerializedUnitSchema;\n private readonly _cache = new Map<string, UnitConversion>();\n\n constructor(schema: SerializedUnitSchema) {\n if (schema.version !== SERIALIZED_UNIT_SCHEMA_VERSION)\n throw new Error(`Unsupported Units.json version \"${schema.version}\". Expected \"${SERIALIZED_UNIT_SCHEMA_VERSION}\".`);\n this._schema = schema;\n }\n\n /** Resolve all Unit items in the schema and return a map from item name to `ResolvedUnit`. */\n public resolveAll(): Map<string, ResolvedUnit> {\n const result = new Map<string, ResolvedUnit>();\n\n for (const [name, item] of Object.entries(this._schema.items)) {\n if (item.schemaItemType === \"Unit\") {\n const conversion = this._resolveUnit(name, 0);\n result.set(name, {\n name,\n label: item.label ?? name,\n phenomenon: item.phenomenon,\n unitSystem: item.unitSystem,\n conversion,\n });\n }\n }\n\n return result;\n }\n\n /** Resolve a single unit by unqualified name, returning its conversion to base. */\n private _resolveUnit(name: string, depth: number): UnitConversion {\n if (depth > MAX_RESOLUTION_DEPTH)\n throw new Error(`Unit resolution depth exceeded ${MAX_RESOLUTION_DEPTH} for \"${name}\"`);\n\n const cached = this._cache.get(name);\n if (cached)\n return cached;\n\n const item = this._schema.items[name];\n if (!item)\n throw new Error(`Unknown schema item: \"${name}\"`);\n\n let conversion: UnitConversion;\n\n if (item.schemaItemType === \"Constant\") {\n conversion = this._resolveConstant(name, item, depth);\n } else if (item.schemaItemType === \"Unit\") {\n conversion = this._resolveUnitItem(name, item, depth);\n } else {\n throw new Error(`Cannot resolve item of type \"${item.schemaItemType}\": \"${name}\"`);\n }\n\n this._cache.set(name, conversion);\n return conversion;\n }\n\n private _resolveConstant(name: string, item: SerializedConstant, depth: number): UnitConversion {\n // A constant is identity if its definition is its own name\n if (item.definition === name)\n return UnitConversion.identity;\n\n const selfConv = UnitConversion.from({\n numerator: item.numerator ?? 1,\n denominator: item.denominator ?? 1,\n });\n\n const defConv = this._resolveDefinition(item.definition, depth + 1);\n return defConv.compose(selfConv);\n }\n\n private _resolveUnitItem(name: string, item: SerializedUnit, depth: number): UnitConversion {\n // A unit is a base unit if its definition is its own name\n if (item.definition === name)\n return UnitConversion.identity;\n\n const selfConv = UnitConversion.from({\n numerator: item.numerator ?? 1,\n denominator: item.denominator ?? 1,\n offset: item.offset,\n });\n\n const defConv = this._resolveDefinition(item.definition, depth + 1);\n return defConv.compose(selfConv);\n }\n\n /** Parse and resolve a compound definition string like `[MILLI]*M` or `IN`. */\n private _resolveDefinition(definition: string, depth: number): UnitConversion {\n const fragments = parseDefinition(definition);\n let result: UnitConversion | undefined;\n\n for (const [, fragment] of fragments) {\n // Strip alias prefix if present (definitions in the schema use unqualified names)\n const fragName = stripAliasPrefix(fragment.name);\n const fragConv = this._resolveUnit(fragName, depth + 1);\n const raised = fragConv.raise(fragment.exponent);\n result = result ? result.multiply(raised) : raised;\n }\n\n return result ?? UnitConversion.identity;\n }\n}\n"]}
1
+ {"version":3,"file":"UnitDefinitionResolver.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitDefinitionResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { SERIALIZED_UNIT_SCHEMA_VERSION, type SerializedConstant, type SerializedUnit, type SerializedUnitSchema } from \"../SerializedUnitSchema\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { parseDefinition } from \"./Parser\";\r\nimport { stripAliasPrefix } from \"./nameUtils\";\r\n\r\nconst MAX_RESOLUTION_DEPTH = 30;\r\n\r\n/** Resolved unit entry containing the unit's name and its conversion to the base of its phenomenon.\r\n * @internal\r\n */\r\nexport interface ResolvedUnit {\r\n readonly name: string;\r\n readonly label: string;\r\n readonly phenomenon: string;\r\n readonly unitSystem: string;\r\n readonly conversion: UnitConversion;\r\n}\r\n\r\n/** Resolves every unit in a `SerializedUnitSchema` to a `UnitConversion` relative to its phenomenon's base unit.\r\n * @internal\r\n */\r\nexport class UnitDefinitionResolver {\r\n private readonly _schema: SerializedUnitSchema;\r\n private readonly _cache = new Map<string, UnitConversion>();\r\n\r\n constructor(schema: SerializedUnitSchema) {\r\n if (schema.version !== SERIALIZED_UNIT_SCHEMA_VERSION)\r\n throw new Error(`Unsupported Units.json version \"${schema.version}\". Expected \"${SERIALIZED_UNIT_SCHEMA_VERSION}\".`);\r\n this._schema = schema;\r\n }\r\n\r\n /** Resolve all Unit items in the schema and return a map from item name to `ResolvedUnit`. */\r\n public resolveAll(): Map<string, ResolvedUnit> {\r\n const result = new Map<string, ResolvedUnit>();\r\n\r\n for (const [name, item] of Object.entries(this._schema.items)) {\r\n if (item.schemaItemType === \"Unit\") {\r\n const conversion = this._resolveUnit(name, 0);\r\n result.set(name, {\r\n name,\r\n label: item.label ?? name,\r\n phenomenon: item.phenomenon,\r\n unitSystem: item.unitSystem,\r\n conversion,\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** Resolve a single unit by unqualified name, returning its conversion to base. */\r\n private _resolveUnit(name: string, depth: number): UnitConversion {\r\n if (depth > MAX_RESOLUTION_DEPTH)\r\n throw new Error(`Unit resolution depth exceeded ${MAX_RESOLUTION_DEPTH} for \"${name}\"`);\r\n\r\n const cached = this._cache.get(name);\r\n if (cached)\r\n return cached;\r\n\r\n const item = this._schema.items[name];\r\n if (!item)\r\n throw new Error(`Unknown schema item: \"${name}\"`);\r\n\r\n let conversion: UnitConversion;\r\n\r\n if (item.schemaItemType === \"Constant\") {\r\n conversion = this._resolveConstant(name, item, depth);\r\n } else if (item.schemaItemType === \"Unit\") {\r\n conversion = this._resolveUnitItem(name, item, depth);\r\n } else {\r\n throw new Error(`Cannot resolve item of type \"${item.schemaItemType}\": \"${name}\"`);\r\n }\r\n\r\n this._cache.set(name, conversion);\r\n return conversion;\r\n }\r\n\r\n private _resolveConstant(name: string, item: SerializedConstant, depth: number): UnitConversion {\r\n // A constant is identity if its definition is its own name\r\n if (item.definition === name)\r\n return UnitConversion.identity;\r\n\r\n const selfConv = UnitConversion.from({\r\n numerator: item.numerator ?? 1,\r\n denominator: item.denominator ?? 1,\r\n });\r\n\r\n const defConv = this._resolveDefinition(item.definition, depth + 1);\r\n return defConv.compose(selfConv);\r\n }\r\n\r\n private _resolveUnitItem(name: string, item: SerializedUnit, depth: number): UnitConversion {\r\n // A unit is a base unit if its definition is its own name\r\n if (item.definition === name)\r\n return UnitConversion.identity;\r\n\r\n const selfConv = UnitConversion.from({\r\n numerator: item.numerator ?? 1,\r\n denominator: item.denominator ?? 1,\r\n offset: item.offset,\r\n });\r\n\r\n const defConv = this._resolveDefinition(item.definition, depth + 1);\r\n return defConv.compose(selfConv);\r\n }\r\n\r\n /** Parse and resolve a compound definition string like `[MILLI]*M` or `IN`. */\r\n private _resolveDefinition(definition: string, depth: number): UnitConversion {\r\n const fragments = parseDefinition(definition);\r\n let result: UnitConversion | undefined;\r\n\r\n for (const [, fragment] of fragments) {\r\n // Strip alias prefix if present (definitions in the schema use unqualified names)\r\n const fragName = stripAliasPrefix(fragment.name);\r\n const fragConv = this._resolveUnit(fragName, depth + 1);\r\n const raised = fragConv.raise(fragment.exponent);\r\n result = result ? result.multiply(raised) : raised;\r\n }\r\n\r\n return result ?? UnitConversion.identity;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nameUtils.js","sourceRoot":"","sources":["../../../src/UnitConversion/nameUtils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,UAAkB;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,OAAO,GAAG,UAAU,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAClD,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** Strips alias prefix from a schema item reference.\n * `\"u:FT\"` → `\"FT\"`, `\"FT\"` → `\"FT\"`.\n * @internal\n */\nexport function stripAliasPrefix(raw: string): string {\n return raw.includes(\":\") ? raw.split(\":\")[1] : raw;\n}\n\n/** Normalizes a schema item reference to fully-qualified `SchemaName.ItemName` format.\n * Handles: already qualified (`\"Units.FT\"`), alias-qualified (`\"u:FT\"`), unqualified (`\"FT\"`).\n * @internal\n */\nexport function qualifyItemName(raw: string, schemaName: string): string {\n if (raw.includes(\".\"))\n return raw;\n return `${schemaName}.${stripAliasPrefix(raw)}`;\n}\n"]}
1
+ {"version":3,"file":"nameUtils.js","sourceRoot":"","sources":["../../../src/UnitConversion/nameUtils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,UAAkB;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,OAAO,GAAG,UAAU,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAClD,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** Strips alias prefix from a schema item reference.\r\n * `\"u:FT\"` → `\"FT\"`, `\"FT\"` → `\"FT\"`.\r\n * @internal\r\n */\r\nexport function stripAliasPrefix(raw: string): string {\r\n return raw.includes(\":\") ? raw.split(\":\")[1] : raw;\r\n}\r\n\r\n/** Normalizes a schema item reference to fully-qualified `SchemaName.ItemName` format.\r\n * Handles: already qualified (`\"Units.FT\"`), alias-qualified (`\"u:FT\"`), unqualified (`\"FT\"`).\r\n * @internal\r\n */\r\nexport function qualifyItemName(raw: string, schemaName: string): string {\r\n if (raw.includes(\".\"))\r\n return raw;\r\n return `${schemaName}.${stripAliasPrefix(raw)}`;\r\n}\r\n"]}
@@ -0,0 +1,40 @@
1
+ /** @packageDocumentation
2
+ * @module Quantity
3
+ */
4
+ import { type UnitConversionProps } from "./Interfaces";
5
+ import { Phenomena, type PhenomenonName, type UnitName } from "./generated/Units.generated";
6
+ /** Type guard verifying a string is a known canonical built-in unit name.
7
+ *
8
+ * Returns true only for unit names shipped in the bundled built-in canonical unit set.
9
+ * Use this at system boundaries (e.g. when ingesting unit names from JSON config,
10
+ * iModel metadata, user input, or other dynamic sources) before calling
11
+ * `UnitConversions.getConversion`, `convert`, or `isCompatible`. Narrows the input
12
+ * type to `UnitName` so subsequent calls type-check without casts.
13
+ *
14
+ * @beta
15
+ */
16
+ export declare function isUnitName(value: string): value is UnitName;
17
+ /** Returns the package's default built-in persistence unit for a supported bundled built-in phenomenon.
18
+ *
19
+ * This helper is intentionally limited to the built-in canonical unit set shipped with `@itwin/core-quantity`.
20
+ * `Phenomena.LENGTH_RATIO` is intentionally excluded because the bundled built-in unit set does not yet provide an agreed default for that phenomenon.
21
+ * For schema-defined, custom, or iModel-specific persistence units, use a `UnitsProvider`-based workflow instead.
22
+ *
23
+ * @beta
24
+ */
25
+ export declare function getDefaultPersistenceUnit(phenomenon: Exclude<PhenomenonName, typeof Phenomena.LENGTH_RATIO>): UnitName;
26
+ /** One-stop unit conversion helpers for the built-in canonical unit set generated from `@bentley/units-schema`.
27
+ * This surface is synchronous and only supports built-in canonical unit names shipped with `core-quantity`.
28
+ * `getConversion(...)` returns `UnitConversionProps` and uses `error: true` as the compatibility sentinel for known-but-incompatible built-in units.
29
+ * `convert(...)` and `convertValue(...)` are the throwing application helpers to use when invalid conversion metadata should fail fast.
30
+ * `isCompatible(...)` is the explicit built-in compatibility check to use before applying a conversion when a non-throwing branch is preferred.
31
+ * For schema-defined, custom, or provider-resolved units outside that built-in set, use a `UnitsProvider`-based workflow instead.
32
+ * @beta
33
+ */
34
+ export declare const UnitConversions: {
35
+ readonly getConversion: (fromUnit: UnitName, toUnit: UnitName) => UnitConversionProps;
36
+ readonly convert: (fromUnit: UnitName, toUnit: UnitName, value: number) => number;
37
+ readonly convertValue: (value: number, conversion: UnitConversionProps) => number;
38
+ readonly isCompatible: (fromUnit: UnitName, toUnit: UnitName) => boolean;
39
+ };
40
+ //# sourceMappingURL=UnitConversions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnitConversions.d.ts","sourceRoot":"","sources":["../../src/UnitConversions.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAqC5F;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAkED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,SAAS,CAAC,YAAY,CAAC,GACjE,QAAQ,CAEV;AAED;;;;;;;GAOG;AAEH,eAAO,MAAM,eAAe,EAAE;IAC5B,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,KAAK,mBAAmB,CAAC;IACtF,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClF,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,KAAK,MAAM,CAAC;IAClF,QAAQ,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC;CAM1E,CAAC"}
@@ -0,0 +1,116 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Quantity
7
+ */
8
+ import { QuantityError, QuantityStatus } from "./Exception";
9
+ import { UnitConversionInvert } from "./Interfaces";
10
+ import { basicUnitConversionData } from "./internal/BasicUnitConversions.generated";
11
+ import { defaultPersistenceUnits } from "./internal/DefaultPersistenceUnits.generated";
12
+ import { convertValueOrThrow } from "./internal/UnitConversionMath";
13
+ const basicUnitConversionLookup = basicUnitConversionData;
14
+ function getUnitEntryFields([phenomenon, factor, offset, invertsUnitName]) {
15
+ return { phenomenon, factor, offset, invertsUnitName };
16
+ }
17
+ function throwUnknownUnit(unitName) {
18
+ throw new QuantityError(QuantityStatus.UnknownUnit, `Unknown unit "${unitName}".`);
19
+ }
20
+ function getUnitEntry(unitName) {
21
+ if (!Object.prototype.hasOwnProperty.call(basicUnitConversionLookup, unitName))
22
+ return throwUnknownUnit(unitName);
23
+ return basicUnitConversionLookup[unitName];
24
+ }
25
+ /** Type guard verifying a string is a known canonical built-in unit name.
26
+ *
27
+ * Returns true only for unit names shipped in the bundled built-in canonical unit set.
28
+ * Use this at system boundaries (e.g. when ingesting unit names from JSON config,
29
+ * iModel metadata, user input, or other dynamic sources) before calling
30
+ * `UnitConversions.getConversion`, `convert`, or `isCompatible`. Narrows the input
31
+ * type to `UnitName` so subsequent calls type-check without casts.
32
+ *
33
+ * @beta
34
+ */
35
+ export function isUnitName(value) {
36
+ return Object.prototype.hasOwnProperty.call(basicUnitConversionLookup, value);
37
+ }
38
+ function getComparableEntry(unit) {
39
+ const { invertsUnitName } = getUnitEntryFields(unit);
40
+ return invertsUnitName ? getUnitEntry(invertsUnitName) : unit;
41
+ }
42
+ function composeConversion(fromUnit, toUnit) {
43
+ const { factor: fromFactor, offset: fromOffset } = getUnitEntryFields(fromUnit);
44
+ const { factor: toFactor, offset: toOffset } = getUnitEntryFields(toUnit);
45
+ return {
46
+ factor: toFactor / fromFactor,
47
+ offset: toOffset - ((toFactor * fromOffset) / fromFactor),
48
+ };
49
+ }
50
+ function getConversion(fromUnit, toUnit) {
51
+ const from = getUnitEntry(fromUnit);
52
+ const to = getUnitEntry(toUnit);
53
+ const comparableFrom = getComparableEntry(from);
54
+ const comparableTo = getComparableEntry(to);
55
+ const fromFields = getUnitEntryFields(from);
56
+ const toFields = getUnitEntryFields(to);
57
+ const comparableFromFields = getUnitEntryFields(comparableFrom);
58
+ const comparableToFields = getUnitEntryFields(comparableTo);
59
+ if (comparableFromFields.phenomenon !== comparableToFields.phenomenon)
60
+ return { factor: 1.0, offset: 0.0, error: true };
61
+ if (fromFields.invertsUnitName && toFields.invertsUnitName)
62
+ return composeConversion(comparableFrom, comparableTo);
63
+ if (fromFields.invertsUnitName) {
64
+ return {
65
+ ...composeConversion(comparableFrom, to),
66
+ inversion: UnitConversionInvert.InvertPreConversion,
67
+ };
68
+ }
69
+ if (toFields.invertsUnitName) {
70
+ return {
71
+ ...composeConversion(from, comparableTo),
72
+ inversion: UnitConversionInvert.InvertPostConversion,
73
+ };
74
+ }
75
+ return composeConversion(from, to);
76
+ }
77
+ function convert(fromUnit, toUnit, value) {
78
+ const conversion = getConversion(fromUnit, toUnit);
79
+ if (conversion.error)
80
+ throw new QuantityError(QuantityStatus.InvalidUnitConversion, `Cannot convert value from "${fromUnit}" to "${toUnit}" using invalid conversion metadata.`);
81
+ return convertValueOrThrow(value, conversion);
82
+ }
83
+ function isCompatible(fromUnit, toUnit) {
84
+ const from = getComparableEntry(getUnitEntry(fromUnit));
85
+ const to = getComparableEntry(getUnitEntry(toUnit));
86
+ const { phenomenon: fromPhenomenon } = getUnitEntryFields(from);
87
+ const { phenomenon: toPhenomenon } = getUnitEntryFields(to);
88
+ return fromPhenomenon === toPhenomenon;
89
+ }
90
+ /** Returns the package's default built-in persistence unit for a supported bundled built-in phenomenon.
91
+ *
92
+ * This helper is intentionally limited to the built-in canonical unit set shipped with `@itwin/core-quantity`.
93
+ * `Phenomena.LENGTH_RATIO` is intentionally excluded because the bundled built-in unit set does not yet provide an agreed default for that phenomenon.
94
+ * For schema-defined, custom, or iModel-specific persistence units, use a `UnitsProvider`-based workflow instead.
95
+ *
96
+ * @beta
97
+ */
98
+ export function getDefaultPersistenceUnit(phenomenon) {
99
+ return defaultPersistenceUnits[phenomenon];
100
+ }
101
+ /** One-stop unit conversion helpers for the built-in canonical unit set generated from `@bentley/units-schema`.
102
+ * This surface is synchronous and only supports built-in canonical unit names shipped with `core-quantity`.
103
+ * `getConversion(...)` returns `UnitConversionProps` and uses `error: true` as the compatibility sentinel for known-but-incompatible built-in units.
104
+ * `convert(...)` and `convertValue(...)` are the throwing application helpers to use when invalid conversion metadata should fail fast.
105
+ * `isCompatible(...)` is the explicit built-in compatibility check to use before applying a conversion when a non-throwing branch is preferred.
106
+ * For schema-defined, custom, or provider-resolved units outside that built-in set, use a `UnitsProvider`-based workflow instead.
107
+ * @beta
108
+ */
109
+ // eslint-disable-next-line @typescript-eslint/naming-convention
110
+ export const UnitConversions = {
111
+ getConversion,
112
+ convert,
113
+ convertValue: convertValueOrThrow,
114
+ isCompatible,
115
+ };
116
+ //# sourceMappingURL=UnitConversions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnitConversions.js","sourceRoot":"","sources":["../../src/UnitConversions.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityError, QuantityStatus } from \"./Exception\";\r\nimport { UnitConversionInvert, type UnitConversionProps } from \"./Interfaces\";\r\nimport { Phenomena, type PhenomenonName, type UnitName } from \"./generated/Units.generated\";\r\nimport { basicUnitConversionData } from \"./internal/BasicUnitConversions.generated\";\r\nimport { defaultPersistenceUnits } from \"./internal/DefaultPersistenceUnits.generated\";\r\nimport { convertValueOrThrow } from \"./internal/UnitConversionMath\";\r\n\r\ntype BasicUnitConversionEntry = readonly [\r\n phenomenon: string,\r\n factor: number,\r\n offset: number,\r\n invertsUnitName?: string,\r\n];\r\n\r\ninterface BasicUnitConversionFields {\r\n readonly phenomenon: string;\r\n readonly factor: number;\r\n readonly offset: number;\r\n readonly invertsUnitName?: string;\r\n}\r\n\r\nconst basicUnitConversionLookup: Record<string, BasicUnitConversionEntry> =\r\n basicUnitConversionData satisfies Record<string, BasicUnitConversionEntry>;\r\n\r\nfunction getUnitEntryFields([phenomenon, factor, offset, invertsUnitName]: BasicUnitConversionEntry): BasicUnitConversionFields {\r\n return { phenomenon, factor, offset, invertsUnitName };\r\n}\r\n\r\nfunction throwUnknownUnit(unitName: string): never {\r\n throw new QuantityError(QuantityStatus.UnknownUnit, `Unknown unit \"${unitName}\".`);\r\n}\r\n\r\nfunction getUnitEntry(unitName: string): BasicUnitConversionEntry {\r\n if (!Object.prototype.hasOwnProperty.call(basicUnitConversionLookup, unitName))\r\n return throwUnknownUnit(unitName);\r\n\r\n return basicUnitConversionLookup[unitName];\r\n}\r\n\r\n/** Type guard verifying a string is a known canonical built-in unit name.\r\n *\r\n * Returns true only for unit names shipped in the bundled built-in canonical unit set.\r\n * Use this at system boundaries (e.g. when ingesting unit names from JSON config,\r\n * iModel metadata, user input, or other dynamic sources) before calling\r\n * `UnitConversions.getConversion`, `convert`, or `isCompatible`. Narrows the input\r\n * type to `UnitName` so subsequent calls type-check without casts.\r\n *\r\n * @beta\r\n */\r\nexport function isUnitName(value: string): value is UnitName {\r\n return Object.prototype.hasOwnProperty.call(basicUnitConversionLookup, value);\r\n}\r\n\r\nfunction getComparableEntry(unit: BasicUnitConversionEntry): BasicUnitConversionEntry {\r\n const { invertsUnitName } = getUnitEntryFields(unit);\r\n return invertsUnitName ? getUnitEntry(invertsUnitName) : unit;\r\n}\r\n\r\nfunction composeConversion(fromUnit: BasicUnitConversionEntry, toUnit: BasicUnitConversionEntry): UnitConversionProps {\r\n const { factor: fromFactor, offset: fromOffset } = getUnitEntryFields(fromUnit);\r\n const { factor: toFactor, offset: toOffset } = getUnitEntryFields(toUnit);\r\n\r\n return {\r\n factor: toFactor / fromFactor,\r\n offset: toOffset - ((toFactor * fromOffset) / fromFactor),\r\n };\r\n}\r\n\r\nfunction getConversion(fromUnit: UnitName, toUnit: UnitName): UnitConversionProps {\r\n const from = getUnitEntry(fromUnit);\r\n const to = getUnitEntry(toUnit);\r\n const comparableFrom = getComparableEntry(from);\r\n const comparableTo = getComparableEntry(to);\r\n const fromFields = getUnitEntryFields(from);\r\n const toFields = getUnitEntryFields(to);\r\n const comparableFromFields = getUnitEntryFields(comparableFrom);\r\n const comparableToFields = getUnitEntryFields(comparableTo);\r\n\r\n if (comparableFromFields.phenomenon !== comparableToFields.phenomenon)\r\n return { factor: 1.0, offset: 0.0, error: true };\r\n\r\n if (fromFields.invertsUnitName && toFields.invertsUnitName)\r\n return composeConversion(comparableFrom, comparableTo);\r\n\r\n if (fromFields.invertsUnitName) {\r\n return {\r\n ...composeConversion(comparableFrom, to),\r\n inversion: UnitConversionInvert.InvertPreConversion,\r\n };\r\n }\r\n\r\n if (toFields.invertsUnitName) {\r\n return {\r\n ...composeConversion(from, comparableTo),\r\n inversion: UnitConversionInvert.InvertPostConversion,\r\n };\r\n }\r\n\r\n return composeConversion(from, to);\r\n}\r\n\r\nfunction convert(fromUnit: UnitName, toUnit: UnitName, value: number): number {\r\n const conversion = getConversion(fromUnit, toUnit);\r\n if (conversion.error)\r\n throw new QuantityError(QuantityStatus.InvalidUnitConversion, `Cannot convert value from \"${fromUnit}\" to \"${toUnit}\" using invalid conversion metadata.`);\r\n\r\n return convertValueOrThrow(value, conversion);\r\n}\r\n\r\nfunction isCompatible(fromUnit: UnitName, toUnit: UnitName): boolean {\r\n const from = getComparableEntry(getUnitEntry(fromUnit));\r\n const to = getComparableEntry(getUnitEntry(toUnit));\r\n const { phenomenon: fromPhenomenon } = getUnitEntryFields(from);\r\n const { phenomenon: toPhenomenon } = getUnitEntryFields(to);\r\n return fromPhenomenon === toPhenomenon;\r\n}\r\n\r\n/** Returns the package's default built-in persistence unit for a supported bundled built-in phenomenon.\r\n *\r\n * This helper is intentionally limited to the built-in canonical unit set shipped with `@itwin/core-quantity`.\r\n * `Phenomena.LENGTH_RATIO` is intentionally excluded because the bundled built-in unit set does not yet provide an agreed default for that phenomenon.\r\n * For schema-defined, custom, or iModel-specific persistence units, use a `UnitsProvider`-based workflow instead.\r\n *\r\n * @beta\r\n */\r\nexport function getDefaultPersistenceUnit(\r\n phenomenon: Exclude<PhenomenonName, typeof Phenomena.LENGTH_RATIO>,\r\n): UnitName {\r\n return defaultPersistenceUnits[phenomenon];\r\n}\r\n\r\n/** One-stop unit conversion helpers for the built-in canonical unit set generated from `@bentley/units-schema`.\r\n * This surface is synchronous and only supports built-in canonical unit names shipped with `core-quantity`.\r\n * `getConversion(...)` returns `UnitConversionProps` and uses `error: true` as the compatibility sentinel for known-but-incompatible built-in units.\r\n * `convert(...)` and `convertValue(...)` are the throwing application helpers to use when invalid conversion metadata should fail fast.\r\n * `isCompatible(...)` is the explicit built-in compatibility check to use before applying a conversion when a non-throwing branch is preferred.\r\n * For schema-defined, custom, or provider-resolved units outside that built-in set, use a `UnitsProvider`-based workflow instead.\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const UnitConversions: {\r\n readonly getConversion: (fromUnit: UnitName, toUnit: UnitName) => UnitConversionProps;\r\n readonly convert: (fromUnit: UnitName, toUnit: UnitName, value: number) => number;\r\n readonly convertValue: (value: number, conversion: UnitConversionProps) => number;\r\n readonly isCompatible: (fromUnit: UnitName, toUnit: UnitName) => boolean;\r\n} = {\r\n getConversion,\r\n convert,\r\n convertValue: convertValueOrThrow,\r\n isCompatible,\r\n};\r\n"]}