@itwin/ecschema-metadata 3.6.0-dev.36 → 3.6.0-dev.40

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 (140) hide show
  1. package/lib/cjs/Constants.d.ts +23 -23
  2. package/lib/cjs/Constants.js +33 -33
  3. package/lib/cjs/Constants.js.map +1 -1
  4. package/lib/cjs/Context.d.ts +139 -139
  5. package/lib/cjs/Context.js +204 -204
  6. package/lib/cjs/DelayedPromise.d.ts +88 -88
  7. package/lib/cjs/DelayedPromise.js +91 -91
  8. package/lib/cjs/DelayedPromise.js.map +1 -1
  9. package/lib/cjs/Deserialization/AbstractParser.d.ts +45 -45
  10. package/lib/cjs/Deserialization/AbstractParser.js +11 -11
  11. package/lib/cjs/Deserialization/AbstractParser.js.map +1 -1
  12. package/lib/cjs/Deserialization/Helper.d.ts +251 -251
  13. package/lib/cjs/Deserialization/Helper.js +843 -843
  14. package/lib/cjs/Deserialization/Helper.js.map +1 -1
  15. package/lib/cjs/Deserialization/JsonParser.d.ts +165 -165
  16. package/lib/cjs/Deserialization/JsonParser.js +680 -680
  17. package/lib/cjs/Deserialization/JsonParser.js.map +1 -1
  18. package/lib/cjs/Deserialization/JsonProps.d.ts +282 -282
  19. package/lib/cjs/Deserialization/JsonProps.js +9 -9
  20. package/lib/cjs/Deserialization/JsonProps.js.map +1 -1
  21. package/lib/cjs/Deserialization/SchemaGraphUtil.d.ts +34 -34
  22. package/lib/cjs/Deserialization/SchemaGraphUtil.js +77 -77
  23. package/lib/cjs/Deserialization/SchemaGraphUtil.js.map +1 -1
  24. package/lib/cjs/Deserialization/XmlParser.d.ts +85 -85
  25. package/lib/cjs/Deserialization/XmlParser.js +973 -973
  26. package/lib/cjs/Deserialization/XmlParser.js.map +1 -1
  27. package/lib/cjs/Deserialization/XmlSerializationUtils.d.ts +54 -54
  28. package/lib/cjs/Deserialization/XmlSerializationUtils.js +174 -174
  29. package/lib/cjs/Deserialization/XmlSerializationUtils.js.map +1 -1
  30. package/lib/cjs/ECName.d.ts +30 -30
  31. package/lib/cjs/ECName.js +85 -85
  32. package/lib/cjs/ECName.js.map +1 -1
  33. package/lib/cjs/ECObjects.d.ts +162 -162
  34. package/lib/cjs/ECObjects.js +453 -453
  35. package/lib/cjs/ECObjects.js.map +1 -1
  36. package/lib/cjs/Exception.d.ts +43 -43
  37. package/lib/cjs/Exception.js +86 -86
  38. package/lib/cjs/Exception.js.map +1 -1
  39. package/lib/cjs/Interfaces.d.ts +66 -66
  40. package/lib/cjs/Interfaces.js +9 -9
  41. package/lib/cjs/Interfaces.js.map +1 -1
  42. package/lib/cjs/Metadata/Class.d.ts +243 -243
  43. package/lib/cjs/Metadata/Class.js +558 -558
  44. package/lib/cjs/Metadata/Class.js.map +1 -1
  45. package/lib/cjs/Metadata/Constant.d.ts +64 -64
  46. package/lib/cjs/Metadata/Constant.js +123 -123
  47. package/lib/cjs/Metadata/Constant.js.map +1 -1
  48. package/lib/cjs/Metadata/CustomAttribute.d.ts +23 -23
  49. package/lib/cjs/Metadata/CustomAttribute.js +27 -27
  50. package/lib/cjs/Metadata/CustomAttribute.js.map +1 -1
  51. package/lib/cjs/Metadata/CustomAttributeClass.d.ts +39 -39
  52. package/lib/cjs/Metadata/CustomAttributeClass.js +68 -68
  53. package/lib/cjs/Metadata/CustomAttributeClass.js.map +1 -1
  54. package/lib/cjs/Metadata/EntityClass.d.ts +77 -77
  55. package/lib/cjs/Metadata/EntityClass.js +230 -230
  56. package/lib/cjs/Metadata/EntityClass.js.map +1 -1
  57. package/lib/cjs/Metadata/Enumeration.d.ts +86 -86
  58. package/lib/cjs/Metadata/Enumeration.js +159 -159
  59. package/lib/cjs/Metadata/Enumeration.js.map +1 -1
  60. package/lib/cjs/Metadata/Format.d.ts +98 -98
  61. package/lib/cjs/Metadata/Format.js +242 -242
  62. package/lib/cjs/Metadata/Format.js.map +1 -1
  63. package/lib/cjs/Metadata/InvertedUnit.d.ts +49 -49
  64. package/lib/cjs/Metadata/InvertedUnit.js +97 -97
  65. package/lib/cjs/Metadata/InvertedUnit.js.map +1 -1
  66. package/lib/cjs/Metadata/KindOfQuantity.d.ts +65 -65
  67. package/lib/cjs/Metadata/KindOfQuantity.js +225 -225
  68. package/lib/cjs/Metadata/KindOfQuantity.js.map +1 -1
  69. package/lib/cjs/Metadata/Mixin.d.ts +54 -54
  70. package/lib/cjs/Metadata/Mixin.js +113 -113
  71. package/lib/cjs/Metadata/Mixin.js.map +1 -1
  72. package/lib/cjs/Metadata/OverrideFormat.d.ts +55 -55
  73. package/lib/cjs/Metadata/OverrideFormat.js +88 -88
  74. package/lib/cjs/Metadata/OverrideFormat.js.map +1 -1
  75. package/lib/cjs/Metadata/Phenomenon.d.ts +33 -33
  76. package/lib/cjs/Metadata/Phenomenon.js +59 -59
  77. package/lib/cjs/Metadata/Phenomenon.js.map +1 -1
  78. package/lib/cjs/Metadata/Property.d.ts +197 -197
  79. package/lib/cjs/Metadata/Property.js +491 -491
  80. package/lib/cjs/Metadata/Property.js.map +1 -1
  81. package/lib/cjs/Metadata/PropertyCategory.d.ts +39 -39
  82. package/lib/cjs/Metadata/PropertyCategory.js +61 -61
  83. package/lib/cjs/Metadata/PropertyCategory.js.map +1 -1
  84. package/lib/cjs/Metadata/RelationshipClass.d.ts +152 -152
  85. package/lib/cjs/Metadata/RelationshipClass.js +349 -349
  86. package/lib/cjs/Metadata/RelationshipClass.js.map +1 -1
  87. package/lib/cjs/Metadata/Schema.d.ts +291 -291
  88. package/lib/cjs/Metadata/Schema.js +520 -520
  89. package/lib/cjs/Metadata/Schema.js.map +1 -1
  90. package/lib/cjs/Metadata/SchemaItem.d.ts +61 -61
  91. package/lib/cjs/Metadata/SchemaItem.js +136 -136
  92. package/lib/cjs/Metadata/SchemaItem.js.map +1 -1
  93. package/lib/cjs/Metadata/Unit.d.ts +76 -76
  94. package/lib/cjs/Metadata/Unit.js +162 -162
  95. package/lib/cjs/Metadata/UnitSystem.d.ts +20 -20
  96. package/lib/cjs/Metadata/UnitSystem.js +29 -29
  97. package/lib/cjs/Metadata/UnitSystem.js.map +1 -1
  98. package/lib/cjs/PropertyTypes.d.ts +49 -49
  99. package/lib/cjs/PropertyTypes.js +91 -91
  100. package/lib/cjs/PropertyTypes.js.map +1 -1
  101. package/lib/cjs/SchemaJsonLocater.d.ts +34 -34
  102. package/lib/cjs/SchemaJsonLocater.js +42 -42
  103. package/lib/cjs/SchemaJsonLocater.js.map +1 -1
  104. package/lib/cjs/SchemaKey.d.ts +110 -110
  105. package/lib/cjs/SchemaKey.js +219 -219
  106. package/lib/cjs/SchemaKey.js.map +1 -1
  107. package/lib/cjs/SchemaLoader.d.ts +23 -23
  108. package/lib/cjs/SchemaLoader.js +47 -47
  109. package/lib/cjs/SchemaLoader.js.map +1 -1
  110. package/lib/cjs/SchemaPartVisitorDelegate.d.ts +274 -274
  111. package/lib/cjs/SchemaPartVisitorDelegate.js +212 -212
  112. package/lib/cjs/SchemaPartVisitorDelegate.js.map +1 -1
  113. package/lib/cjs/UnitConversion/Graph.d.ts +34 -34
  114. package/lib/cjs/UnitConversion/Graph.js +83 -83
  115. package/lib/cjs/UnitConversion/Graph.js.map +1 -1
  116. package/lib/cjs/UnitConversion/Parser.d.ts +8 -8
  117. package/lib/cjs/UnitConversion/Parser.js +42 -42
  118. package/lib/cjs/UnitConversion/Parser.js.map +1 -1
  119. package/lib/cjs/UnitConversion/UnitConversion.d.ts +45 -45
  120. package/lib/cjs/UnitConversion/UnitConversion.js +77 -77
  121. package/lib/cjs/UnitConversion/UnitConversion.js.map +1 -1
  122. package/lib/cjs/UnitConversion/UnitConverter.d.ts +39 -39
  123. package/lib/cjs/UnitConversion/UnitConverter.js +116 -116
  124. package/lib/cjs/UnitConversion/UnitConverter.js.map +1 -1
  125. package/lib/cjs/UnitConversion/UnitTree.d.ts +43 -43
  126. package/lib/cjs/UnitConversion/UnitTree.js +169 -169
  127. package/lib/cjs/UnitConversion/UnitTree.js.map +1 -1
  128. package/lib/cjs/UnitProvider/SchemaUnitProvider.d.ts +77 -77
  129. package/lib/cjs/UnitProvider/SchemaUnitProvider.js +236 -236
  130. package/lib/cjs/UnitProvider/SchemaUnitProvider.js.map +1 -1
  131. package/lib/cjs/Validation/SchemaWalker.d.ts +23 -23
  132. package/lib/cjs/Validation/SchemaWalker.js +53 -53
  133. package/lib/cjs/Validation/SchemaWalker.js.map +1 -1
  134. package/lib/cjs/ecschema-metadata.d.ts +51 -51
  135. package/lib/cjs/ecschema-metadata.js +96 -96
  136. package/lib/cjs/ecschema-metadata.js.map +1 -1
  137. package/lib/cjs/utils/SchemaGraph.d.ts +25 -25
  138. package/lib/cjs/utils/SchemaGraph.js +65 -65
  139. package/lib/cjs/utils/SchemaGraph.js.map +1 -1
  140. package/package.json +7 -7
@@ -1,40 +1,40 @@
1
- import { SchemaContext } from "../Context";
2
- import { UnitConversion } from "./UnitConversion";
3
- /**
4
- * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
5
- * @internal
6
- */
7
- export declare class UnitConverter {
8
- private readonly _context;
9
- private _uGraph;
10
- /**
11
- * Create Converter context
12
- * @param _context SchemaContext with contexts added to it.
13
- */
14
- constructor(_context: SchemaContext);
15
- /**
16
- * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
17
- * @param fromUnit SchemaItem full name of source unit
18
- * @param toUnit SchemaItem full name of target unit
19
- * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
20
- * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
21
- * @throws Error if from and to Units do not belong to the same phenomenon
22
- * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
23
- * @throws Error if base units of source and target unit do not match
24
- */
25
- calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion>;
26
- /**
27
- * @param from Source unit converted from
28
- * @param to Target unit converted to
29
- * @internal
30
- */
31
- private processUnits;
32
- /**
33
- * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
34
- * @param fromBaseUnits Map of base units for source unit
35
- * @param toBaseUnits Map of base units for target unit
36
- * @internal
37
- */
38
- private checkBaseUnitsMatch;
39
- }
1
+ import { SchemaContext } from "../Context";
2
+ import { UnitConversion } from "./UnitConversion";
3
+ /**
4
+ * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
5
+ * @internal
6
+ */
7
+ export declare class UnitConverter {
8
+ private readonly _context;
9
+ private _uGraph;
10
+ /**
11
+ * Create Converter context
12
+ * @param _context SchemaContext with contexts added to it.
13
+ */
14
+ constructor(_context: SchemaContext);
15
+ /**
16
+ * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
17
+ * @param fromUnit SchemaItem full name of source unit
18
+ * @param toUnit SchemaItem full name of target unit
19
+ * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
20
+ * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
21
+ * @throws Error if from and to Units do not belong to the same phenomenon
22
+ * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
23
+ * @throws Error if base units of source and target unit do not match
24
+ */
25
+ calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion>;
26
+ /**
27
+ * @param from Source unit converted from
28
+ * @param to Target unit converted to
29
+ * @internal
30
+ */
31
+ private processUnits;
32
+ /**
33
+ * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
34
+ * @param fromBaseUnits Map of base units for source unit
35
+ * @param toBaseUnits Map of base units for target unit
36
+ * @internal
37
+ */
38
+ private checkBaseUnitsMatch;
39
+ }
40
40
  //# sourceMappingURL=UnitConverter.d.ts.map
@@ -1,117 +1,117 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UnitConverter = void 0;
4
- /*---------------------------------------------------------------------------------------------
5
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
- * See LICENSE.md in the project root for license terms and full copyright notice.
7
- *--------------------------------------------------------------------------------------------*/
8
- const core_bentley_1 = require("@itwin/core-bentley");
9
- const SchemaItem_1 = require("../Metadata/SchemaItem");
10
- const Unit_1 = require("../Metadata/Unit");
11
- const SchemaKey_1 = require("../SchemaKey");
12
- const UnitConversion_1 = require("./UnitConversion");
13
- const UnitTree_1 = require("./UnitTree");
14
- /**
15
- * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
16
- * @internal
17
- */
18
- class UnitConverter {
19
- /**
20
- * Create Converter context
21
- * @param _context SchemaContext with contexts added to it.
22
- */
23
- constructor(_context) {
24
- this._context = _context;
25
- this._uGraph = new UnitTree_1.UnitGraph(this._context);
26
- }
27
- /**
28
- * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
29
- * @param fromUnit SchemaItem full name of source unit
30
- * @param toUnit SchemaItem full name of target unit
31
- * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
32
- * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
33
- * @throws Error if from and to Units do not belong to the same phenomenon
34
- * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
35
- * @throws Error if base units of source and target unit do not match
36
- */
37
- async calculateConversion(fromUnit, toUnit) {
38
- const [fromSchemaName, fromSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(fromUnit);
39
- const [toSchemaName, toSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(toUnit);
40
- const fromSchemaKey = new SchemaKey_1.SchemaKey(fromSchemaName);
41
- const toSchemaKey = new SchemaKey_1.SchemaKey(toSchemaName);
42
- const fromSchema = await this._context.getSchema(fromSchemaKey);
43
- const toSchema = await this._context.getSchema(toSchemaKey);
44
- if (!fromSchema || !toSchema) {
45
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, "Cannot find from's and/or to's schema", () => {
46
- return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };
47
- });
48
- }
49
- const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);
50
- const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);
51
- return this.processUnits(from, to);
52
- }
53
- /**
54
- * @param from Source unit converted from
55
- * @param to Target unit converted to
56
- * @internal
57
- */
58
- async processUnits(from, to) {
59
- if (from.key.matches(to.key))
60
- return UnitConversion_1.UnitConversion.identity;
61
- const areCompatible = await Unit_1.Unit.areCompatible(from, to);
62
- if (!areCompatible)
63
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {
64
- return { from, to };
65
- });
66
- // Add nodes and subsequent children to graph
67
- await this._uGraph.addUnit(from);
68
- await this._uGraph.addUnit(to);
69
- const fromBaseUnits = new Map();
70
- const toBaseUnits = new Map();
71
- // Calculate map of UnitConversions to get between from -> base
72
- const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);
73
- // Calculate map of UnitConversions to get between base -> to
74
- const toMapStore = this._uGraph.reduce(to, toBaseUnits);
75
- if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))
76
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {
77
- return { from, to };
78
- });
79
- // Final calculations to get singular UnitConversion between from -> to
80
- const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion_1.UnitConversion.identity;
81
- const toMap = toMapStore.get(to.key.fullName) || UnitConversion_1.UnitConversion.identity;
82
- const fromInverse = fromMap.inverse();
83
- return fromInverse.compose(toMap);
84
- }
85
- /**
86
- * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
87
- * @param fromBaseUnits Map of base units for source unit
88
- * @param toBaseUnits Map of base units for target unit
89
- * @internal
90
- */
91
- checkBaseUnitsMatch(fromBaseUnits, toBaseUnits) {
92
- // Trim maps of "One" and value that equal zero as they do not affect the base units and calculations
93
- for (const [key, value] of fromBaseUnits.entries()) {
94
- const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
95
- if (schemaItemName === "ONE" || value === 0) {
96
- fromBaseUnits.delete(key);
97
- }
98
- }
99
- for (const [key, value] of toBaseUnits.entries()) {
100
- const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
101
- if (schemaItemName === "ONE" || value === 0) {
102
- toBaseUnits.delete(key);
103
- }
104
- }
105
- if (fromBaseUnits.size !== toBaseUnits.size)
106
- return false;
107
- for (const key of fromBaseUnits.keys()) {
108
- if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {
109
- // Mismatching key or value
110
- return false;
111
- }
112
- }
113
- return true;
114
- }
115
- }
116
- exports.UnitConverter = UnitConverter;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnitConverter = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const SchemaItem_1 = require("../Metadata/SchemaItem");
10
+ const Unit_1 = require("../Metadata/Unit");
11
+ const SchemaKey_1 = require("../SchemaKey");
12
+ const UnitConversion_1 = require("./UnitConversion");
13
+ const UnitTree_1 = require("./UnitTree");
14
+ /**
15
+ * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
16
+ * @internal
17
+ */
18
+ class UnitConverter {
19
+ /**
20
+ * Create Converter context
21
+ * @param _context SchemaContext with contexts added to it.
22
+ */
23
+ constructor(_context) {
24
+ this._context = _context;
25
+ this._uGraph = new UnitTree_1.UnitGraph(this._context);
26
+ }
27
+ /**
28
+ * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
29
+ * @param fromUnit SchemaItem full name of source unit
30
+ * @param toUnit SchemaItem full name of target unit
31
+ * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
32
+ * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
33
+ * @throws Error if from and to Units do not belong to the same phenomenon
34
+ * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
35
+ * @throws Error if base units of source and target unit do not match
36
+ */
37
+ async calculateConversion(fromUnit, toUnit) {
38
+ const [fromSchemaName, fromSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(fromUnit);
39
+ const [toSchemaName, toSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(toUnit);
40
+ const fromSchemaKey = new SchemaKey_1.SchemaKey(fromSchemaName);
41
+ const toSchemaKey = new SchemaKey_1.SchemaKey(toSchemaName);
42
+ const fromSchema = await this._context.getSchema(fromSchemaKey);
43
+ const toSchema = await this._context.getSchema(toSchemaKey);
44
+ if (!fromSchema || !toSchema) {
45
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, "Cannot find from's and/or to's schema", () => {
46
+ return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };
47
+ });
48
+ }
49
+ const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);
50
+ const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);
51
+ return this.processUnits(from, to);
52
+ }
53
+ /**
54
+ * @param from Source unit converted from
55
+ * @param to Target unit converted to
56
+ * @internal
57
+ */
58
+ async processUnits(from, to) {
59
+ if (from.key.matches(to.key))
60
+ return UnitConversion_1.UnitConversion.identity;
61
+ const areCompatible = await Unit_1.Unit.areCompatible(from, to);
62
+ if (!areCompatible)
63
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {
64
+ return { from, to };
65
+ });
66
+ // Add nodes and subsequent children to graph
67
+ await this._uGraph.addUnit(from);
68
+ await this._uGraph.addUnit(to);
69
+ const fromBaseUnits = new Map();
70
+ const toBaseUnits = new Map();
71
+ // Calculate map of UnitConversions to get between from -> base
72
+ const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);
73
+ // Calculate map of UnitConversions to get between base -> to
74
+ const toMapStore = this._uGraph.reduce(to, toBaseUnits);
75
+ if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))
76
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {
77
+ return { from, to };
78
+ });
79
+ // Final calculations to get singular UnitConversion between from -> to
80
+ const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion_1.UnitConversion.identity;
81
+ const toMap = toMapStore.get(to.key.fullName) || UnitConversion_1.UnitConversion.identity;
82
+ const fromInverse = fromMap.inverse();
83
+ return fromInverse.compose(toMap);
84
+ }
85
+ /**
86
+ * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
87
+ * @param fromBaseUnits Map of base units for source unit
88
+ * @param toBaseUnits Map of base units for target unit
89
+ * @internal
90
+ */
91
+ checkBaseUnitsMatch(fromBaseUnits, toBaseUnits) {
92
+ // Trim maps of "One" and value that equal zero as they do not affect the base units and calculations
93
+ for (const [key, value] of fromBaseUnits.entries()) {
94
+ const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
95
+ if (schemaItemName === "ONE" || value === 0) {
96
+ fromBaseUnits.delete(key);
97
+ }
98
+ }
99
+ for (const [key, value] of toBaseUnits.entries()) {
100
+ const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
101
+ if (schemaItemName === "ONE" || value === 0) {
102
+ toBaseUnits.delete(key);
103
+ }
104
+ }
105
+ if (fromBaseUnits.size !== toBaseUnits.size)
106
+ return false;
107
+ for (const key of fromBaseUnits.keys()) {
108
+ if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {
109
+ // Mismatching key or value
110
+ return false;
111
+ }
112
+ }
113
+ return true;
114
+ }
115
+ }
116
+ exports.UnitConverter = UnitConverter;
117
117
  //# sourceMappingURL=UnitConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnitConverter.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConverter.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 { BentleyError, BentleyStatus } from \"@itwin/core-bentley\";\nimport { SchemaContext } from \"../Context\";\nimport { Constant } from \"../Metadata/Constant\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaKey } from \"../SchemaKey\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { UnitGraph } from \"./UnitTree\";\n\n/**\n * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units\n * @internal\n */\nexport class UnitConverter {\n private _uGraph: UnitGraph;\n\n /**\n * Create Converter context\n * @param _context SchemaContext with contexts added to it.\n */\n constructor(private readonly _context: SchemaContext) {\n this._uGraph = new UnitGraph(this._context);\n }\n\n /**\n * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}\n * @param fromUnit SchemaItem full name of source unit\n * @param toUnit SchemaItem full name of target unit\n * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset\n * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext\n * @throws Error if from and to Units do not belong to the same phenomenon\n * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas\n * @throws Error if base units of source and target unit do not match\n */\n public async calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion> {\n const [fromSchemaName, fromSchemaItemName] = SchemaItem.parseFullName(fromUnit);\n const [toSchemaName, toSchemaItemName] = SchemaItem.parseFullName(toUnit);\n const fromSchemaKey = new SchemaKey(fromSchemaName);\n const toSchemaKey = new SchemaKey(toSchemaName);\n\n const fromSchema = await this._context.getSchema(fromSchemaKey);\n const toSchema = await this._context.getSchema(toSchemaKey);\n\n if (!fromSchema || !toSchema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find from's and/or to's schema\", () => {\n return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };\n });\n }\n\n const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);\n const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);\n\n return this.processUnits(from, to);\n }\n\n /**\n * @param from Source unit converted from\n * @param to Target unit converted to\n * @internal\n */\n private async processUnits(from: Unit | Constant, to: Unit | Constant): Promise<UnitConversion> {\n if (from.key.matches(to.key))\n return UnitConversion.identity;\n\n const areCompatible = await Unit.areCompatible(from as Unit, to as Unit);\n if (!areCompatible)\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {\n return { from, to };\n });\n\n // Add nodes and subsequent children to graph\n await this._uGraph.addUnit(from);\n await this._uGraph.addUnit(to);\n\n const fromBaseUnits = new Map<string, number>();\n const toBaseUnits = new Map<string, number>();\n // Calculate map of UnitConversions to get between from -> base\n const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);\n // Calculate map of UnitConversions to get between base -> to\n const toMapStore = this._uGraph.reduce(to, toBaseUnits);\n\n if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {\n return { from, to };\n });\n\n // Final calculations to get singular UnitConversion between from -> to\n const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion.identity;\n const toMap = toMapStore.get(to.key.fullName) || UnitConversion.identity;\n const fromInverse = fromMap.inverse();\n return fromInverse.compose(toMap);\n }\n\n /**\n * Check if fromBaseUnits's base units and exponents matches toBaseUnits's\n * @param fromBaseUnits Map of base units for source unit\n * @param toBaseUnits Map of base units for target unit\n * @internal\n */\n private checkBaseUnitsMatch(fromBaseUnits: Map<string, number>, toBaseUnits: Map<string, number>): boolean {\n // Trim maps of \"One\" and value that equal zero as they do not affect the base units and calculations\n for (const [key, value] of fromBaseUnits.entries()) {\n const [, schemaItemName] = SchemaItem.parseFullName(key);\n if (schemaItemName === \"ONE\" || value === 0) {\n fromBaseUnits.delete(key);\n }\n }\n\n for (const [key, value] of toBaseUnits.entries()) {\n const [, schemaItemName] = SchemaItem.parseFullName(key);\n if (schemaItemName === \"ONE\" || value === 0) {\n toBaseUnits.delete(key);\n }\n }\n\n if (fromBaseUnits.size !== toBaseUnits.size)\n return false;\n\n for (const key of fromBaseUnits.keys()) {\n if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {\n // Mismatching key or value\n return false;\n }\n }\n\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"UnitConverter.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConverter.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 { BentleyError, BentleyStatus } from \"@itwin/core-bentley\";\r\nimport { SchemaContext } from \"../Context\";\r\nimport { Constant } from \"../Metadata/Constant\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaKey } from \"../SchemaKey\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { UnitGraph } from \"./UnitTree\";\r\n\r\n/**\r\n * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units\r\n * @internal\r\n */\r\nexport class UnitConverter {\r\n private _uGraph: UnitGraph;\r\n\r\n /**\r\n * Create Converter context\r\n * @param _context SchemaContext with contexts added to it.\r\n */\r\n constructor(private readonly _context: SchemaContext) {\r\n this._uGraph = new UnitGraph(this._context);\r\n }\r\n\r\n /**\r\n * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}\r\n * @param fromUnit SchemaItem full name of source unit\r\n * @param toUnit SchemaItem full name of target unit\r\n * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset\r\n * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext\r\n * @throws Error if from and to Units do not belong to the same phenomenon\r\n * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas\r\n * @throws Error if base units of source and target unit do not match\r\n */\r\n public async calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion> {\r\n const [fromSchemaName, fromSchemaItemName] = SchemaItem.parseFullName(fromUnit);\r\n const [toSchemaName, toSchemaItemName] = SchemaItem.parseFullName(toUnit);\r\n const fromSchemaKey = new SchemaKey(fromSchemaName);\r\n const toSchemaKey = new SchemaKey(toSchemaName);\r\n\r\n const fromSchema = await this._context.getSchema(fromSchemaKey);\r\n const toSchema = await this._context.getSchema(toSchemaKey);\r\n\r\n if (!fromSchema || !toSchema) {\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find from's and/or to's schema\", () => {\r\n return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };\r\n });\r\n }\r\n\r\n const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);\r\n const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);\r\n\r\n return this.processUnits(from, to);\r\n }\r\n\r\n /**\r\n * @param from Source unit converted from\r\n * @param to Target unit converted to\r\n * @internal\r\n */\r\n private async processUnits(from: Unit | Constant, to: Unit | Constant): Promise<UnitConversion> {\r\n if (from.key.matches(to.key))\r\n return UnitConversion.identity;\r\n\r\n const areCompatible = await Unit.areCompatible(from as Unit, to as Unit);\r\n if (!areCompatible)\r\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {\r\n return { from, to };\r\n });\r\n\r\n // Add nodes and subsequent children to graph\r\n await this._uGraph.addUnit(from);\r\n await this._uGraph.addUnit(to);\r\n\r\n const fromBaseUnits = new Map<string, number>();\r\n const toBaseUnits = new Map<string, number>();\r\n // Calculate map of UnitConversions to get between from -> base\r\n const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);\r\n // Calculate map of UnitConversions to get between base -> to\r\n const toMapStore = this._uGraph.reduce(to, toBaseUnits);\r\n\r\n if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))\r\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {\r\n return { from, to };\r\n });\r\n\r\n // Final calculations to get singular UnitConversion between from -> to\r\n const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion.identity;\r\n const toMap = toMapStore.get(to.key.fullName) || UnitConversion.identity;\r\n const fromInverse = fromMap.inverse();\r\n return fromInverse.compose(toMap);\r\n }\r\n\r\n /**\r\n * Check if fromBaseUnits's base units and exponents matches toBaseUnits's\r\n * @param fromBaseUnits Map of base units for source unit\r\n * @param toBaseUnits Map of base units for target unit\r\n * @internal\r\n */\r\n private checkBaseUnitsMatch(fromBaseUnits: Map<string, number>, toBaseUnits: Map<string, number>): boolean {\r\n // Trim maps of \"One\" and value that equal zero as they do not affect the base units and calculations\r\n for (const [key, value] of fromBaseUnits.entries()) {\r\n const [, schemaItemName] = SchemaItem.parseFullName(key);\r\n if (schemaItemName === \"ONE\" || value === 0) {\r\n fromBaseUnits.delete(key);\r\n }\r\n }\r\n\r\n for (const [key, value] of toBaseUnits.entries()) {\r\n const [, schemaItemName] = SchemaItem.parseFullName(key);\r\n if (schemaItemName === \"ONE\" || value === 0) {\r\n toBaseUnits.delete(key);\r\n }\r\n }\r\n\r\n if (fromBaseUnits.size !== toBaseUnits.size)\r\n return false;\r\n\r\n for (const key of fromBaseUnits.keys()) {\r\n if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {\r\n // Mismatching key or value\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n"]}
@@ -1,44 +1,44 @@
1
- import { SchemaContext } from "../Context";
2
- import { Constant } from "../Metadata/Constant";
3
- import { Schema } from "../Metadata/Schema";
4
- import { Unit } from "../Metadata/Unit";
5
- import { UnitConversion } from "./UnitConversion";
6
- import { Graph } from "./Graph";
7
- /** @internal */
8
- export declare class GraphUtils {
9
- /**
10
- * DFS traversal - Post order
11
- * @param _graph Graph to traverse
12
- * @param start Starting node
13
- * @param keyFrom Get key from label
14
- * @param op Reducing function
15
- * @param initial Initial label
16
- */
17
- static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T;
18
- }
19
- /** @internal */
20
- export declare class UnitGraph {
21
- private _context;
22
- private _graph;
23
- constructor(_context: SchemaContext);
24
- /**
25
- * Tries to find the unit/constant given by name in currentSchema
26
- * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}
27
- * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema
28
- */
29
- resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant>;
30
- /**
31
- * Adds unit and corresponding children to graph as well as edges between units
32
- * @param unit Current unit to be added to graph
33
- */
34
- addUnit(unit: Unit | Constant): Promise<void>;
35
- private isIdentity;
36
- /**
37
- * Reduce the tree to produce a single map
38
- * @param unit Unit to be processed
39
- * @param stopNodes The tree exploration should stop here
40
- */
41
- reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion>;
42
- private reducingFunction;
43
- }
1
+ import { SchemaContext } from "../Context";
2
+ import { Constant } from "../Metadata/Constant";
3
+ import { Schema } from "../Metadata/Schema";
4
+ import { Unit } from "../Metadata/Unit";
5
+ import { UnitConversion } from "./UnitConversion";
6
+ import { Graph } from "./Graph";
7
+ /** @internal */
8
+ export declare class GraphUtils {
9
+ /**
10
+ * DFS traversal - Post order
11
+ * @param _graph Graph to traverse
12
+ * @param start Starting node
13
+ * @param keyFrom Get key from label
14
+ * @param op Reducing function
15
+ * @param initial Initial label
16
+ */
17
+ static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T;
18
+ }
19
+ /** @internal */
20
+ export declare class UnitGraph {
21
+ private _context;
22
+ private _graph;
23
+ constructor(_context: SchemaContext);
24
+ /**
25
+ * Tries to find the unit/constant given by name in currentSchema
26
+ * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}
27
+ * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema
28
+ */
29
+ resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant>;
30
+ /**
31
+ * Adds unit and corresponding children to graph as well as edges between units
32
+ * @param unit Current unit to be added to graph
33
+ */
34
+ addUnit(unit: Unit | Constant): Promise<void>;
35
+ private isIdentity;
36
+ /**
37
+ * Reduce the tree to produce a single map
38
+ * @param unit Unit to be processed
39
+ * @param stopNodes The tree exploration should stop here
40
+ */
41
+ reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion>;
42
+ private reducingFunction;
43
+ }
44
44
  //# sourceMappingURL=UnitTree.d.ts.map