@itwin/ecschema-metadata 4.1.0-dev.7 → 4.1.0-dev.71

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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,80 @@
1
1
  # Change Log - @itwin/ecschema-metadata
2
2
 
3
- This log was last generated on Tue, 25 Apr 2023 17:50:35 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 24 Jul 2023 12:35:20 GMT and should not be manually modified.
4
+
5
+ ## 4.0.6
6
+ Mon, 24 Jul 2023 05:07:33 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 4.0.5
11
+ Tue, 18 Jul 2023 12:21:56 GMT
12
+
13
+ _Version update only_
14
+
15
+ ## 4.0.4
16
+ Wed, 12 Jul 2023 15:50:01 GMT
17
+
18
+ _Version update only_
19
+
20
+ ## 4.0.3
21
+ Mon, 03 Jul 2023 15:28:41 GMT
22
+
23
+ _Version update only_
24
+
25
+ ## 4.0.2
26
+ Wed, 21 Jun 2023 22:04:43 GMT
27
+
28
+ _Version update only_
29
+
30
+ ## 4.0.1
31
+ Wed, 21 Jun 2023 20:29:13 GMT
32
+
33
+ _Version update only_
34
+
35
+ ## 4.0.0
36
+ Mon, 22 May 2023 15:34:14 GMT
37
+
38
+ ### Updates
39
+
40
+ - Added support for async schema location
41
+ - Update to eslint@8
42
+ - Replaced UnitProps interface with SchemaItemUnitProps type.
43
+
44
+ ## 3.7.11
45
+ Tue, 11 Jul 2023 17:17:22 GMT
46
+
47
+ _Version update only_
48
+
49
+ ## 3.7.10
50
+ Wed, 05 Jul 2023 13:41:21 GMT
51
+
52
+ _Version update only_
53
+
54
+ ## 3.7.9
55
+ Tue, 20 Jun 2023 12:51:02 GMT
56
+
57
+ _Version update only_
58
+
59
+ ## 3.7.8
60
+ Thu, 01 Jun 2023 17:00:39 GMT
61
+
62
+ _Version update only_
63
+
64
+ ## 3.7.7
65
+ Wed, 24 May 2023 17:27:09 GMT
66
+
67
+ _Version update only_
68
+
69
+ ## 3.7.6
70
+ Mon, 15 May 2023 18:23:41 GMT
71
+
72
+ _Version update only_
73
+
74
+ ## 3.7.5
75
+ Thu, 04 May 2023 19:43:18 GMT
76
+
77
+ _Version update only_
4
78
 
5
79
  ## 3.7.4
6
80
  Tue, 25 Apr 2023 17:50:35 GMT
@@ -150,21 +150,24 @@ export declare class SchemaContext implements ISchemaItemLocater {
150
150
  * @param schemaPromise The schema promise to add to the cache.
151
151
  */
152
152
  addSchemaPromise(schemaInfo: SchemaInfo, schema: Schema, schemaPromise: Promise<Schema>): Promise<void>;
153
- /**
154
- *
155
- * @param schemaKey
153
+ /** Attempts to obtain a schema from this context that matches the specified criteria.
154
+ * @param schemaKey Identifies the schema to obtain.
155
+ * @param matchType Criteria by which to identify potentially matching schemas.
156
+ * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.
156
157
  */
157
158
  getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType?: SchemaMatchType): Promise<T | undefined>;
158
159
  /**
159
160
  * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.
160
- * The fully loaded schema can be gotten later from the context using the getCachedSchema method.
161
+ * The fully loaded schema can be gotten later from the context using [[getSchema]].
161
162
  * @param schemaKey The SchemaKey describing the schema to get from the cache.
162
163
  * @param matchType The match type to use when locating the schema
163
164
  */
164
165
  getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType): Promise<SchemaInfo | undefined>;
165
- /**
166
- *
167
- * @param schemaKey
166
+ /** Attempts to obtain a schema from this context that matches the specified criteria.
167
+ * Will return undefined if the schema is partially loaded. Use [[getSchema]] to await until the schema is completely loaded.
168
+ * @param schemaKey Identifies the schema to obtain.
169
+ * @param matchType Criteria by which to identify potentially matching schemas.
170
+ * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.
168
171
  */
169
172
  getSchemaSync<T extends Schema>(schemaKey: SchemaKey, matchType?: SchemaMatchType): T | undefined;
170
173
  /**
@@ -177,7 +180,7 @@ export declare class SchemaContext implements ISchemaItemLocater {
177
180
  getCachedSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType?: SchemaMatchType): Promise<T | undefined>;
178
181
  /**
179
182
  * Attempts to get a Schema from the context's cache.
180
- * Will return undefined if the cached schema is partially loaded. Use the async method to await partially loaded schemas.
183
+ * Will return undefined if the cached schema is partially loaded. Use [[getCachedSchema]] to await until the schema is completely loaded.
181
184
  * @param schemaKey The SchemaKey to identify the Schema.
182
185
  * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.
183
186
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../src/Context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../src/Context.ts"],"names":[],"mappings":"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"}
@@ -215,9 +215,10 @@ class SchemaContext {
215
215
  async addSchemaPromise(schemaInfo, schema, schemaPromise) {
216
216
  return this._knownSchemas.addSchemaPromise(schemaInfo, schema, schemaPromise);
217
217
  }
218
- /**
219
- *
220
- * @param schemaKey
218
+ /** Attempts to obtain a schema from this context that matches the specified criteria.
219
+ * @param schemaKey Identifies the schema to obtain.
220
+ * @param matchType Criteria by which to identify potentially matching schemas.
221
+ * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.
221
222
  */
222
223
  async getSchema(schemaKey, matchType = ECObjects_1.SchemaMatchType.Latest) {
223
224
  // the first locater is _knownSchemas, so we don't have to check the cache explicitly here
@@ -230,7 +231,7 @@ class SchemaContext {
230
231
  }
231
232
  /**
232
233
  * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.
233
- * The fully loaded schema can be gotten later from the context using the getCachedSchema method.
234
+ * The fully loaded schema can be gotten later from the context using [[getSchema]].
234
235
  * @param schemaKey The SchemaKey describing the schema to get from the cache.
235
236
  * @param matchType The match type to use when locating the schema
236
237
  */
@@ -242,9 +243,11 @@ class SchemaContext {
242
243
  }
243
244
  return undefined;
244
245
  }
245
- /**
246
- *
247
- * @param schemaKey
246
+ /** Attempts to obtain a schema from this context that matches the specified criteria.
247
+ * Will return undefined if the schema is partially loaded. Use [[getSchema]] to await until the schema is completely loaded.
248
+ * @param schemaKey Identifies the schema to obtain.
249
+ * @param matchType Criteria by which to identify potentially matching schemas.
250
+ * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.
248
251
  */
249
252
  getSchemaSync(schemaKey, matchType = ECObjects_1.SchemaMatchType.Latest) {
250
253
  // the first locater is _knownSchemas, so we don't have to check the cache explicitly here
@@ -267,7 +270,7 @@ class SchemaContext {
267
270
  }
268
271
  /**
269
272
  * Attempts to get a Schema from the context's cache.
270
- * Will return undefined if the cached schema is partially loaded. Use the async method to await partially loaded schemas.
273
+ * Will return undefined if the cached schema is partially loaded. Use [[getCachedSchema]] to await until the schema is completely loaded.
271
274
  * @param schemaKey The SchemaKey to identify the Schema.
272
275
  * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.
273
276
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/Context.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\r\nimport { SchemaMatchType } from \"./ECObjects\";\r\nimport { ECObjectsError, ECObjectsStatus } from \"./Exception\";\r\nimport { SchemaInfo } from \"./Interfaces\";\r\nimport { MutableSchema, Schema } from \"./Metadata/Schema\";\r\nimport { SchemaItem } from \"./Metadata/SchemaItem\";\r\nimport { SchemaItemKey, SchemaKey } from \"./SchemaKey\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass SchemaMap extends Array<SchemaEntry> { }\r\n\r\n/**\r\n * @internal\r\n */\r\ninterface SchemaEntry {\r\n schemaInfo: SchemaInfo;\r\n schema: Schema;\r\n schemaPromise?: Promise<Schema>;\r\n}\r\n\r\n/**\r\n * The interface defines what is needed to be an `ISchemaLocater`.\r\n * A Schema Locater loads the requested schema if it can or returns undefined.\r\n * Schema Locaters should always load the schema on each request and should not hold a cache of schemas.\r\n * Schema locaters should never be used directly to load a schema, they should be added to a `SchemaContext`\r\n * and the context should be used to load schemas. The `SchemaContext` caches schemas and manages schema life time.\r\n * @beta\r\n */\r\nexport interface ISchemaLocater {\r\n\r\n /**\r\n * Attempts to get a schema from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * @param schemaKey key to look up\r\n * @param matchType how to match key against candidate schemas\r\n * @param context context for loading schema references\r\n */\r\n getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): Promise<T | undefined>;\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * May return the entire Schema so long as it is completely loaded as it satisfies the SchemaInfo interface.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): Promise<SchemaInfo | undefined>;\r\n\r\n /**\r\n * Attempts to get a schema from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * @param schemaKey key to look up\r\n * @param matchType how to match key against candidate schemas\r\n * @param context context for loading schema references\r\n */\r\n getSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): T | undefined;\r\n}\r\n\r\n/**\r\n * @beta\r\n */\r\nexport interface ISchemaItemLocater {\r\n getSchemaItem<T extends SchemaItem>(schemaItemKey: SchemaItemKey): Promise<T | undefined>;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class SchemaCache implements ISchemaLocater {\r\n private _schema: SchemaMap;\r\n\r\n constructor() {\r\n this._schema = new SchemaMap();\r\n }\r\n\r\n public get count() { return this._schema.length; }\r\n\r\n private loadedSchemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return undefined !== this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, SchemaMatchType.Latest) && !entry.schemaPromise);\r\n }\r\n\r\n private schemaPromiseExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return undefined !== this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, SchemaMatchType.Latest) && undefined !== entry.schemaPromise);\r\n }\r\n\r\n private findEntry(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType): SchemaEntry | undefined {\r\n return this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, matchType));\r\n }\r\n\r\n private removeSchemaPromise(schemaKey: Readonly<SchemaKey>) {\r\n const entry = this.findEntry(schemaKey, SchemaMatchType.Latest);\r\n if (entry)\r\n entry.schemaPromise = undefined;\r\n }\r\n\r\n private removeEntry(schemaKey: Readonly<SchemaKey>) {\r\n this._schema = this._schema.filter((entry: SchemaEntry) => !entry.schemaInfo.schemaKey.matches(schemaKey));\r\n }\r\n\r\n /**\r\n * Returns true if the schema exists in either the schema cache or the promise cache. SchemaMatchType.Latest used.\r\n * @param schemaKey The key to search for.\r\n */\r\n public schemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return this.loadedSchemaExists(schemaKey) || this.schemaPromiseExists(schemaKey);\r\n }\r\n\r\n /**\r\n * Adds a promise to load the schema to the cache. Does not allow for duplicate schemas in the cache of schemas or cache of promises, checks using SchemaMatchType.Latest.\r\n * When the promise completes the schema will be added to the schema cache and the promise will be removed from the promise cache\r\n * @param schemaInfo An object with the schema key for the schema being loaded and it's references\r\n * @param schema The partially loaded schema that the promise will fulfill\r\n * @param schemaPromise The schema promise to add to the cache.\r\n */\r\n public async addSchemaPromise(schemaInfo: SchemaInfo, schema: Schema, schemaPromise: Promise<Schema>) {\r\n if (this.schemaExists(schemaInfo.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schemaPromise.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo, schema, schemaPromise });\r\n\r\n // This promise is cached and will be awaited when the user requests the full schema.\r\n // If the promise competes successfully before the user requests the schema it will be removed from the cache\r\n // If it fails it will remain in the cache until the user awaits it and handles the error\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n schemaPromise.then(() => {\r\n this.removeSchemaPromise(schemaInfo.schemaKey);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a schema to the cache. Does not allow for duplicate schemas, checks using SchemaMatchType.Latest.\r\n * @param schema The schema to add to the cache.\r\n */\r\n public async addSchema<T extends Schema>(schema: T) {\r\n if (this.schemaExists(schema.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schema.schemaKey.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo: schema, schema });\r\n }\r\n\r\n /**\r\n * Adds a schema to the cache. Does not allow for duplicate schemas, checks using SchemaMatchType.Latest.\r\n * @param schema The schema to add to the cache.\r\n */\r\n public addSchemaSync<T extends Schema>(schema: T) {\r\n if (this.schemaExists(schema.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schema.schemaKey.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo: schema, schema });\r\n }\r\n\r\n /**\r\n * Gets the schema which matches the provided SchemaKey.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (!entry)\r\n return undefined;\r\n\r\n if (entry.schemaPromise) {\r\n try {\r\n const schema = await entry.schemaPromise as T;\r\n return schema;\r\n } catch (e) {\r\n this.removeEntry(schemaKey);\r\n throw e;\r\n }\r\n }\r\n\r\n return entry.schema as T;\r\n }\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<SchemaInfo | undefined> {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (entry)\r\n return entry.schemaInfo;\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets the schema which matches the provided SchemaKey. If the schema is partially loaded an exception will be thrown.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public getSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (entry) {\r\n if (entry.schemaPromise) {\r\n throw new ECObjectsError(ECObjectsStatus.UnableToLoadSchema, `The Schema ${schemaKey.toString()} is partially loaded so cannot be loaded synchronously.`);\r\n }\r\n return entry.schema as T;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Generator function that can iterate through each schema in _schema SchemaMap and items for each Schema.\r\n * Does not include schema items from schemas that are not completely loaded yet.\r\n */\r\n public * getSchemaItems(): IterableIterator<SchemaItem> {\r\n for (const entry of this._schema) {\r\n for (const schemaItem of entry.schema.getItems()) {\r\n yield schemaItem;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets all the schemas from the schema cache.\r\n * Does not include schemas from schemas that are not completely loaded yet.\r\n * @returns An array of Schema objects.\r\n */\r\n public getAllSchemas(): Schema[] {\r\n return this._schema.map((entry: SchemaEntry) => entry.schema);\r\n }\r\n}\r\n\r\n/**\r\n * The SchemaContext, context object is used to facilitate schema and schema item location.\r\n *\r\n * The context controls the lifetime of each schema that it knows about. It has to be explicitly removed from the context to delete a schema object.\r\n *\r\n * The context is made up of a group of Schema Locators.\r\n * @beta\r\n */\r\nexport class SchemaContext implements ISchemaItemLocater {\r\n private _locaters: ISchemaLocater[];\r\n\r\n private _knownSchemas: SchemaCache;\r\n\r\n constructor() {\r\n this._locaters = [];\r\n\r\n this._knownSchemas = new SchemaCache();\r\n this._locaters.push(this._knownSchemas);\r\n }\r\n\r\n public addLocater(locater: ISchemaLocater) {\r\n this._locaters.push(locater);\r\n }\r\n\r\n /**\r\n * Adds the schema to this context. Use addSchemaPromise instead when asynchronously loading schemas.\r\n * @param schema The schema to add to this context\r\n */\r\n public async addSchema(schema: Schema) {\r\n this.addSchemaSync(schema);\r\n }\r\n\r\n /**\r\n * Adds the schema to this context\r\n * @param schema The schema to add to this context\r\n */\r\n public addSchemaSync(schema: Schema) {\r\n this._knownSchemas.addSchemaSync(schema);\r\n }\r\n\r\n /**\r\n * Adds the given SchemaItem to the the SchemaContext by locating the schema, with the best match of SchemaMatchType.Exact, and\r\n * @param schemaItem The SchemaItem to add\r\n * @deprecated in 4.0 use ecschema-editing package\r\n */\r\n public async addSchemaItem(schemaItem: SchemaItem) {\r\n const schema = await this.getSchema(schemaItem.key.schemaKey, SchemaMatchType.Exact);\r\n if (!schema)\r\n throw new ECObjectsError(ECObjectsStatus.UnableToLocateSchema, `Unable to add the schema item ${schemaItem.name} to the schema ${schemaItem.key.schemaKey.toString()} because the schema could not be located.`);\r\n\r\n (schema as MutableSchema).addItem(schemaItem);\r\n }\r\n\r\n /**\r\n * Returns true if the schema is already in the context. SchemaMatchType.Latest is used to find a match.\r\n * @param schemaKey\r\n */\r\n public schemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return this._knownSchemas.schemaExists(schemaKey);\r\n }\r\n\r\n /**\r\n * Adds a promise to load the schema to the cache. Does not allow for duplicate schemas in the cache of schemas or cache of promises, checks using SchemaMatchType.Latest.\r\n * When the promise completes the schema will be added to the schema cache and the promise will be removed from the promise cache.\r\n * Use this method over addSchema when asynchronously loading schemas\r\n * @param schemaInfo An object with the schema key for the schema being loaded and it's references\r\n * @param schema The partially loaded schema that the promise will fulfill\r\n * @param schemaPromise The schema promise to add to the cache.\r\n */\r\n public async addSchemaPromise(schemaInfo: SchemaInfo, schema: Schema, schemaPromise: Promise<Schema>) {\r\n return this._knownSchemas.addSchemaPromise(schemaInfo, schema, schemaPromise);\r\n }\r\n\r\n /**\r\n *\r\n * @param schemaKey\r\n */\r\n public async getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n // the first locater is _knownSchemas, so we don't have to check the cache explicitly here\r\n for (const locater of this._locaters) {\r\n const schema = await locater.getSchema<T>(schemaKey, matchType, this);\r\n if (undefined !== schema)\r\n return schema;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * The fully loaded schema can be gotten later from the context using the getCachedSchema method.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType): Promise<SchemaInfo | undefined> {\r\n for (const locater of this._locaters) {\r\n const schemaInfo = await locater.getSchemaInfo(schemaKey, matchType, this);\r\n if (undefined !== schemaInfo)\r\n return schemaInfo;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n *\r\n * @param schemaKey\r\n */\r\n public getSchemaSync<T extends Schema>(schemaKey: SchemaKey, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n // the first locater is _knownSchemas, so we don't have to check the cache explicitly here\r\n for (const locater of this._locaters) {\r\n const schema = locater.getSchemaSync<T>(schemaKey, matchType, this);\r\n if (undefined !== schema)\r\n return schema;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Attempts to get a Schema from the context's cache.\r\n * Will await a partially loaded schema then return when it is completely loaded.\r\n * @param schemaKey The SchemaKey to identify the Schema.\r\n * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.\r\n * @internal\r\n */\r\n public async getCachedSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n return this._knownSchemas.getSchema<T>(schemaKey, matchType);\r\n }\r\n\r\n /**\r\n * Attempts to get a Schema from the context's cache.\r\n * Will return undefined if the cached schema is partially loaded. Use the async method to await partially loaded schemas.\r\n * @param schemaKey The SchemaKey to identify the Schema.\r\n * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.\r\n * @internal\r\n */\r\n public getCachedSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n return this._knownSchemas.getSchemaSync<T>(schemaKey, matchType);\r\n }\r\n\r\n /**\r\n * Gets the schema item from the specified schema if it exists in this [[SchemaContext]].\r\n * Will await a partially loaded schema then look in it for the requested item\r\n * @param schemaItemKey The SchemaItemKey identifying the item to return. SchemaMatchType.Latest is used to match the schema.\r\n * @returns The requested schema item\r\n */\r\n public async getSchemaItem<T extends SchemaItem>(schemaItemKey: SchemaItemKey): Promise<T | undefined> {\r\n const schema = await this.getSchema(schemaItemKey.schemaKey, SchemaMatchType.Latest);\r\n if (undefined === schema)\r\n return undefined;\r\n return schema.getItem<T>(schemaItemKey.name);\r\n }\r\n\r\n /**\r\n * Gets the schema item from the specified schema if it exists in this [[SchemaContext]].\r\n * Will skip a partially loaded schema and return undefined if the item belongs to that schema. Use the async method to await partially loaded schemas.\r\n * @param schemaItemKey The SchemaItemKey identifying the item to return. SchemaMatchType.Latest is used to match the schema.\r\n * @returns The requested schema item\r\n */\r\n public getSchemaItemSync<T extends SchemaItem>(schemaItemKey: SchemaItemKey): T | undefined {\r\n const schema = this.getSchemaSync(schemaItemKey.schemaKey, SchemaMatchType.Latest);\r\n if (undefined === schema)\r\n return undefined;\r\n return schema.getItemSync<T>(schemaItemKey.name);\r\n }\r\n\r\n /**\r\n * Iterates through the items of each schema known to the context. This includes schemas added to the\r\n * context using [[SchemaContext.addSchema]]. This does not include schemas that\r\n * can be located by an ISchemaLocater instance added to the context.\r\n * Does not include schema items from schemas that are not completely loaded yet.\r\n */\r\n public getSchemaItems(): IterableIterator<SchemaItem> {\r\n return this._knownSchemas.getSchemaItems();\r\n }\r\n\r\n /**\r\n * Gets all the Schemas known by the context. This includes schemas added to the\r\n * context using [[SchemaContext.addSchema]]. This does not include schemas that\r\n * can be located by an ISchemaLocater instance added to the context. Does not\r\n * include schemas that are partially loaded.\r\n * @returns An array of Schema objects.\r\n */\r\n public getKnownSchemas(): Schema[] {\r\n return this._knownSchemas.getAllSchemas();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/Context.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\r\nimport { SchemaMatchType } from \"./ECObjects\";\r\nimport { ECObjectsError, ECObjectsStatus } from \"./Exception\";\r\nimport { SchemaInfo } from \"./Interfaces\";\r\nimport { MutableSchema, Schema } from \"./Metadata/Schema\";\r\nimport { SchemaItem } from \"./Metadata/SchemaItem\";\r\nimport { SchemaItemKey, SchemaKey } from \"./SchemaKey\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass SchemaMap extends Array<SchemaEntry> { }\r\n\r\n/**\r\n * @internal\r\n */\r\ninterface SchemaEntry {\r\n schemaInfo: SchemaInfo;\r\n schema: Schema;\r\n schemaPromise?: Promise<Schema>;\r\n}\r\n\r\n/**\r\n * The interface defines what is needed to be an `ISchemaLocater`.\r\n * A Schema Locater loads the requested schema if it can or returns undefined.\r\n * Schema Locaters should always load the schema on each request and should not hold a cache of schemas.\r\n * Schema locaters should never be used directly to load a schema, they should be added to a `SchemaContext`\r\n * and the context should be used to load schemas. The `SchemaContext` caches schemas and manages schema life time.\r\n * @beta\r\n */\r\nexport interface ISchemaLocater {\r\n\r\n /**\r\n * Attempts to get a schema from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * @param schemaKey key to look up\r\n * @param matchType how to match key against candidate schemas\r\n * @param context context for loading schema references\r\n */\r\n getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): Promise<T | undefined>;\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * May return the entire Schema so long as it is completely loaded as it satisfies the SchemaInfo interface.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): Promise<SchemaInfo | undefined>;\r\n\r\n /**\r\n * Attempts to get a schema from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * @param schemaKey key to look up\r\n * @param matchType how to match key against candidate schemas\r\n * @param context context for loading schema references\r\n */\r\n getSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType, context: SchemaContext): T | undefined;\r\n}\r\n\r\n/**\r\n * @beta\r\n */\r\nexport interface ISchemaItemLocater {\r\n getSchemaItem<T extends SchemaItem>(schemaItemKey: SchemaItemKey): Promise<T | undefined>;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class SchemaCache implements ISchemaLocater {\r\n private _schema: SchemaMap;\r\n\r\n constructor() {\r\n this._schema = new SchemaMap();\r\n }\r\n\r\n public get count() { return this._schema.length; }\r\n\r\n private loadedSchemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return undefined !== this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, SchemaMatchType.Latest) && !entry.schemaPromise);\r\n }\r\n\r\n private schemaPromiseExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return undefined !== this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, SchemaMatchType.Latest) && undefined !== entry.schemaPromise);\r\n }\r\n\r\n private findEntry(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType): SchemaEntry | undefined {\r\n return this._schema.find((entry: SchemaEntry) => entry.schemaInfo.schemaKey.matches(schemaKey, matchType));\r\n }\r\n\r\n private removeSchemaPromise(schemaKey: Readonly<SchemaKey>) {\r\n const entry = this.findEntry(schemaKey, SchemaMatchType.Latest);\r\n if (entry)\r\n entry.schemaPromise = undefined;\r\n }\r\n\r\n private removeEntry(schemaKey: Readonly<SchemaKey>) {\r\n this._schema = this._schema.filter((entry: SchemaEntry) => !entry.schemaInfo.schemaKey.matches(schemaKey));\r\n }\r\n\r\n /**\r\n * Returns true if the schema exists in either the schema cache or the promise cache. SchemaMatchType.Latest used.\r\n * @param schemaKey The key to search for.\r\n */\r\n public schemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return this.loadedSchemaExists(schemaKey) || this.schemaPromiseExists(schemaKey);\r\n }\r\n\r\n /**\r\n * Adds a promise to load the schema to the cache. Does not allow for duplicate schemas in the cache of schemas or cache of promises, checks using SchemaMatchType.Latest.\r\n * When the promise completes the schema will be added to the schema cache and the promise will be removed from the promise cache\r\n * @param schemaInfo An object with the schema key for the schema being loaded and it's references\r\n * @param schema The partially loaded schema that the promise will fulfill\r\n * @param schemaPromise The schema promise to add to the cache.\r\n */\r\n public async addSchemaPromise(schemaInfo: SchemaInfo, schema: Schema, schemaPromise: Promise<Schema>) {\r\n if (this.schemaExists(schemaInfo.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schemaPromise.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo, schema, schemaPromise });\r\n\r\n // This promise is cached and will be awaited when the user requests the full schema.\r\n // If the promise competes successfully before the user requests the schema it will be removed from the cache\r\n // If it fails it will remain in the cache until the user awaits it and handles the error\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n schemaPromise.then(() => {\r\n this.removeSchemaPromise(schemaInfo.schemaKey);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a schema to the cache. Does not allow for duplicate schemas, checks using SchemaMatchType.Latest.\r\n * @param schema The schema to add to the cache.\r\n */\r\n public async addSchema<T extends Schema>(schema: T) {\r\n if (this.schemaExists(schema.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schema.schemaKey.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo: schema, schema });\r\n }\r\n\r\n /**\r\n * Adds a schema to the cache. Does not allow for duplicate schemas, checks using SchemaMatchType.Latest.\r\n * @param schema The schema to add to the cache.\r\n */\r\n public addSchemaSync<T extends Schema>(schema: T) {\r\n if (this.schemaExists(schema.schemaKey))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateSchema, `The schema, ${schema.schemaKey.toString()}, already exists within this cache.`);\r\n\r\n this._schema.push({ schemaInfo: schema, schema });\r\n }\r\n\r\n /**\r\n * Gets the schema which matches the provided SchemaKey.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (!entry)\r\n return undefined;\r\n\r\n if (entry.schemaPromise) {\r\n try {\r\n const schema = await entry.schemaPromise as T;\r\n return schema;\r\n } catch (e) {\r\n this.removeEntry(schemaKey);\r\n throw e;\r\n }\r\n }\r\n\r\n return entry.schema as T;\r\n }\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<SchemaInfo | undefined> {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (entry)\r\n return entry.schemaInfo;\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets the schema which matches the provided SchemaKey. If the schema is partially loaded an exception will be thrown.\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public getSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n if (this.count === 0)\r\n return undefined;\r\n\r\n const entry = this.findEntry(schemaKey, matchType);\r\n if (entry) {\r\n if (entry.schemaPromise) {\r\n throw new ECObjectsError(ECObjectsStatus.UnableToLoadSchema, `The Schema ${schemaKey.toString()} is partially loaded so cannot be loaded synchronously.`);\r\n }\r\n return entry.schema as T;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Generator function that can iterate through each schema in _schema SchemaMap and items for each Schema.\r\n * Does not include schema items from schemas that are not completely loaded yet.\r\n */\r\n public * getSchemaItems(): IterableIterator<SchemaItem> {\r\n for (const entry of this._schema) {\r\n for (const schemaItem of entry.schema.getItems()) {\r\n yield schemaItem;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets all the schemas from the schema cache.\r\n * Does not include schemas from schemas that are not completely loaded yet.\r\n * @returns An array of Schema objects.\r\n */\r\n public getAllSchemas(): Schema[] {\r\n return this._schema.map((entry: SchemaEntry) => entry.schema);\r\n }\r\n}\r\n\r\n/**\r\n * The SchemaContext, context object is used to facilitate schema and schema item location.\r\n *\r\n * The context controls the lifetime of each schema that it knows about. It has to be explicitly removed from the context to delete a schema object.\r\n *\r\n * The context is made up of a group of Schema Locators.\r\n * @beta\r\n */\r\nexport class SchemaContext implements ISchemaItemLocater {\r\n private _locaters: ISchemaLocater[];\r\n\r\n private _knownSchemas: SchemaCache;\r\n\r\n constructor() {\r\n this._locaters = [];\r\n\r\n this._knownSchemas = new SchemaCache();\r\n this._locaters.push(this._knownSchemas);\r\n }\r\n\r\n public addLocater(locater: ISchemaLocater) {\r\n this._locaters.push(locater);\r\n }\r\n\r\n /**\r\n * Adds the schema to this context. Use addSchemaPromise instead when asynchronously loading schemas.\r\n * @param schema The schema to add to this context\r\n */\r\n public async addSchema(schema: Schema) {\r\n this.addSchemaSync(schema);\r\n }\r\n\r\n /**\r\n * Adds the schema to this context\r\n * @param schema The schema to add to this context\r\n */\r\n public addSchemaSync(schema: Schema) {\r\n this._knownSchemas.addSchemaSync(schema);\r\n }\r\n\r\n /**\r\n * Adds the given SchemaItem to the the SchemaContext by locating the schema, with the best match of SchemaMatchType.Exact, and\r\n * @param schemaItem The SchemaItem to add\r\n * @deprecated in 4.0 use ecschema-editing package\r\n */\r\n public async addSchemaItem(schemaItem: SchemaItem) {\r\n const schema = await this.getSchema(schemaItem.key.schemaKey, SchemaMatchType.Exact);\r\n if (!schema)\r\n throw new ECObjectsError(ECObjectsStatus.UnableToLocateSchema, `Unable to add the schema item ${schemaItem.name} to the schema ${schemaItem.key.schemaKey.toString()} because the schema could not be located.`);\r\n\r\n (schema as MutableSchema).addItem(schemaItem);\r\n }\r\n\r\n /**\r\n * Returns true if the schema is already in the context. SchemaMatchType.Latest is used to find a match.\r\n * @param schemaKey\r\n */\r\n public schemaExists(schemaKey: Readonly<SchemaKey>): boolean {\r\n return this._knownSchemas.schemaExists(schemaKey);\r\n }\r\n\r\n /**\r\n * Adds a promise to load the schema to the cache. Does not allow for duplicate schemas in the cache of schemas or cache of promises, checks using SchemaMatchType.Latest.\r\n * When the promise completes the schema will be added to the schema cache and the promise will be removed from the promise cache.\r\n * Use this method over addSchema when asynchronously loading schemas\r\n * @param schemaInfo An object with the schema key for the schema being loaded and it's references\r\n * @param schema The partially loaded schema that the promise will fulfill\r\n * @param schemaPromise The schema promise to add to the cache.\r\n */\r\n public async addSchemaPromise(schemaInfo: SchemaInfo, schema: Schema, schemaPromise: Promise<Schema>) {\r\n return this._knownSchemas.addSchemaPromise(schemaInfo, schema, schemaPromise);\r\n }\r\n\r\n /** Attempts to obtain a schema from this context that matches the specified criteria.\r\n * @param schemaKey Identifies the schema to obtain.\r\n * @param matchType Criteria by which to identify potentially matching schemas.\r\n * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.\r\n */\r\n public async getSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n // the first locater is _knownSchemas, so we don't have to check the cache explicitly here\r\n for (const locater of this._locaters) {\r\n const schema = await locater.getSchema<T>(schemaKey, matchType, this);\r\n if (undefined !== schema)\r\n return schema;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets the schema info which matches the provided SchemaKey. The schema info may be returned before the schema is fully loaded.\r\n * The fully loaded schema can be gotten later from the context using [[getSchema]].\r\n * @param schemaKey The SchemaKey describing the schema to get from the cache.\r\n * @param matchType The match type to use when locating the schema\r\n */\r\n public async getSchemaInfo(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType): Promise<SchemaInfo | undefined> {\r\n for (const locater of this._locaters) {\r\n const schemaInfo = await locater.getSchemaInfo(schemaKey, matchType, this);\r\n if (undefined !== schemaInfo)\r\n return schemaInfo;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /** Attempts to obtain a schema from this context that matches the specified criteria.\r\n * Will return undefined if the schema is partially loaded. Use [[getSchema]] to await until the schema is completely loaded.\r\n * @param schemaKey Identifies the schema to obtain.\r\n * @param matchType Criteria by which to identify potentially matching schemas.\r\n * @returns the schema matching the input criteria, or `undefined` if no such schema could be located.\r\n */\r\n public getSchemaSync<T extends Schema>(schemaKey: SchemaKey, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n // the first locater is _knownSchemas, so we don't have to check the cache explicitly here\r\n for (const locater of this._locaters) {\r\n const schema = locater.getSchemaSync<T>(schemaKey, matchType, this);\r\n if (undefined !== schema)\r\n return schema;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Attempts to get a Schema from the context's cache.\r\n * Will await a partially loaded schema then return when it is completely loaded.\r\n * @param schemaKey The SchemaKey to identify the Schema.\r\n * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.\r\n * @internal\r\n */\r\n public async getCachedSchema<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): Promise<T | undefined> {\r\n return this._knownSchemas.getSchema<T>(schemaKey, matchType);\r\n }\r\n\r\n /**\r\n * Attempts to get a Schema from the context's cache.\r\n * Will return undefined if the cached schema is partially loaded. Use [[getCachedSchema]] to await until the schema is completely loaded.\r\n * @param schemaKey The SchemaKey to identify the Schema.\r\n * @param matchType The SchemaMatch type to use. Default is SchemaMatchType.Latest.\r\n * @internal\r\n */\r\n public getCachedSchemaSync<T extends Schema>(schemaKey: Readonly<SchemaKey>, matchType: SchemaMatchType = SchemaMatchType.Latest): T | undefined {\r\n return this._knownSchemas.getSchemaSync<T>(schemaKey, matchType);\r\n }\r\n\r\n /**\r\n * Gets the schema item from the specified schema if it exists in this [[SchemaContext]].\r\n * Will await a partially loaded schema then look in it for the requested item\r\n * @param schemaItemKey The SchemaItemKey identifying the item to return. SchemaMatchType.Latest is used to match the schema.\r\n * @returns The requested schema item\r\n */\r\n public async getSchemaItem<T extends SchemaItem>(schemaItemKey: SchemaItemKey): Promise<T | undefined> {\r\n const schema = await this.getSchema(schemaItemKey.schemaKey, SchemaMatchType.Latest);\r\n if (undefined === schema)\r\n return undefined;\r\n return schema.getItem<T>(schemaItemKey.name);\r\n }\r\n\r\n /**\r\n * Gets the schema item from the specified schema if it exists in this [[SchemaContext]].\r\n * Will skip a partially loaded schema and return undefined if the item belongs to that schema. Use the async method to await partially loaded schemas.\r\n * @param schemaItemKey The SchemaItemKey identifying the item to return. SchemaMatchType.Latest is used to match the schema.\r\n * @returns The requested schema item\r\n */\r\n public getSchemaItemSync<T extends SchemaItem>(schemaItemKey: SchemaItemKey): T | undefined {\r\n const schema = this.getSchemaSync(schemaItemKey.schemaKey, SchemaMatchType.Latest);\r\n if (undefined === schema)\r\n return undefined;\r\n return schema.getItemSync<T>(schemaItemKey.name);\r\n }\r\n\r\n /**\r\n * Iterates through the items of each schema known to the context. This includes schemas added to the\r\n * context using [[SchemaContext.addSchema]]. This does not include schemas that\r\n * can be located by an ISchemaLocater instance added to the context.\r\n * Does not include schema items from schemas that are not completely loaded yet.\r\n */\r\n public getSchemaItems(): IterableIterator<SchemaItem> {\r\n return this._knownSchemas.getSchemaItems();\r\n }\r\n\r\n /**\r\n * Gets all the Schemas known by the context. This includes schemas added to the\r\n * context using [[SchemaContext.addSchema]]. This does not include schemas that\r\n * can be located by an ISchemaLocater instance added to the context. Does not\r\n * include schemas that are partially loaded.\r\n * @returns An array of Schema objects.\r\n */\r\n public getKnownSchemas(): Schema[] {\r\n return this._knownSchemas.getAllSchemas();\r\n }\r\n}\r\n"]}
@@ -494,13 +494,13 @@ class ECClass extends SchemaItem_1.SchemaItem {
494
494
  const key = new SchemaKey_1.SchemaItemKey(targetClass, new SchemaKey_1.SchemaKey(schemaName));
495
495
  if (SchemaItem_1.SchemaItem.equalByKey(this, key))
496
496
  return true;
497
- return this.traverseBaseClasses(SchemaItem_1.SchemaItem.equalByKey, key);
497
+ return this.traverseBaseClasses((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem_1.SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), key);
498
498
  }
499
499
  else {
500
500
  (0, core_bentley_1.assert)(ECClass.isECClass(targetClass), "Expected targetClass to be of type ECClass");
501
501
  if (SchemaItem_1.SchemaItem.equalByKey(this, targetClass))
502
502
  return true;
503
- return this.traverseBaseClasses(SchemaItem_1.SchemaItem.equalByKey, targetClass);
503
+ return this.traverseBaseClasses((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem_1.SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), targetClass);
504
504
  }
505
505
  }
506
506
  /**
@@ -510,7 +510,7 @@ class ECClass extends SchemaItem_1.SchemaItem {
510
510
  isSync(targetClass) {
511
511
  if (SchemaItem_1.SchemaItem.equalByKey(this, targetClass))
512
512
  return true;
513
- return this.traverseBaseClassesSync(SchemaItem_1.SchemaItem.equalByKey, targetClass);
513
+ return this.traverseBaseClassesSync((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem_1.SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), targetClass);
514
514
  }
515
515
  /**
516
516
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"Class.js","sourceRoot":"","sources":["../../../src/Metadata/Class.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 Metadata\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { DelayedPromiseWithProps } from \"../DelayedPromise\";\r\nimport { ClassProps } from \"../Deserialization/JsonProps\";\r\nimport { XmlSerializationUtils } from \"../Deserialization/XmlSerializationUtils\";\r\nimport { classModifierToString, ECClassModifier, parseClassModifier, parsePrimitiveType, PrimitiveType, SchemaItemType } from \"../ECObjects\";\r\nimport { ECObjectsError, ECObjectsStatus } from \"../Exception\";\r\nimport { AnyClass, LazyLoadedECClass } from \"../Interfaces\";\r\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\r\nimport { CustomAttribute, CustomAttributeContainerProps, CustomAttributeSet, serializeCustomAttributes } from \"./CustomAttribute\";\r\nimport { Enumeration } from \"./Enumeration\";\r\nimport {\r\n EnumerationArrayProperty, EnumerationProperty, PrimitiveArrayProperty, PrimitiveProperty, Property, StructArrayProperty, StructProperty,\r\n} from \"./Property\";\r\nimport { Schema } from \"./Schema\";\r\nimport { SchemaItem } from \"./SchemaItem\";\r\n\r\n/**\r\n * A common abstract class for all of the ECClass types.\r\n * @beta\r\n */\r\nexport abstract class ECClass extends SchemaItem implements CustomAttributeContainerProps {\r\n protected _modifier: ECClassModifier;\r\n protected _baseClass?: LazyLoadedECClass;\r\n protected _properties?: Map<string, Property>;\r\n private _customAttributes?: Map<string, CustomAttribute>;\r\n private _mergedPropertyCache?: Property[];\r\n\r\n public get modifier() { return this._modifier; }\r\n public get baseClass(): LazyLoadedECClass | undefined { return this._baseClass; }\r\n public set baseClass(baseClass: LazyLoadedECClass | undefined) { this._baseClass = baseClass; }\r\n public get properties(): IterableIterator<Property> | undefined { return this._properties?.values(); }\r\n public get customAttributes(): CustomAttributeSet | undefined { return this._customAttributes; }\r\n\r\n constructor(schema: Schema, name: string, modifier?: ECClassModifier) {\r\n super(schema, name);\r\n\r\n if (modifier)\r\n this._modifier = modifier;\r\n else\r\n this._modifier = ECClassModifier.None;\r\n }\r\n\r\n /**\r\n * Convenience method for adding an already loaded ECProperty used by create*Property methods.\r\n * @param prop The property to add.\r\n * @return The property that was added.\r\n */\r\n protected addProperty<T extends Property>(prop: T): T {\r\n if (!this._properties)\r\n this._properties = new Map<string, Property>();\r\n\r\n this._properties.set(prop.name.toUpperCase(), prop);\r\n return prop;\r\n }\r\n\r\n /**\r\n * Deletes a property from within this class.\r\n * @param name The property name to delete, lookup is case-insensitive\r\n * @alpha\r\n */\r\n protected async deleteProperty(name: string): Promise<void> {\r\n if (this._properties) {\r\n const property = await this.getProperty(name);\r\n if (property)\r\n this._properties.delete(name.toUpperCase());\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a property from within this class.\r\n * @param name The property name to delete, lookup is case-insensitive\r\n * @alpha\r\n */\r\n protected deletePropertySync(name: string): void {\r\n if (this._properties) {\r\n const property = this.getPropertySync(name);\r\n if (property)\r\n this._properties.delete(name.toUpperCase());\r\n }\r\n }\r\n\r\n public getBaseClassSync(): ECClass | undefined {\r\n if (!this.baseClass) {\r\n return undefined;\r\n }\r\n\r\n return this.schema.lookupItemSync<ECClass>(this.baseClass);\r\n }\r\n\r\n /**\r\n * Searches, case-insensitive, for a local ECProperty with the name provided.\r\n * @param name\r\n */\r\n public async getProperty(name: string, includeInherited: boolean = false): Promise<Property | undefined> {\r\n if (this._properties) {\r\n const upperKey = name.toUpperCase();\r\n const property = this._properties.get(upperKey);\r\n if (property)\r\n return property;\r\n }\r\n\r\n if (!includeInherited) {\r\n return undefined;\r\n }\r\n\r\n return this.getInheritedProperty(name);\r\n }\r\n\r\n /**\r\n * Searches, case-insensitive, for a local ECProperty with the name provided.\r\n * @param name\r\n */\r\n public getPropertySync(name: string, includeInherited: boolean = false): Property | undefined {\r\n if (this._properties) {\r\n const upperKey = name.toUpperCase();\r\n const property = this._properties.get(upperKey);\r\n if (property)\r\n return property;\r\n }\r\n\r\n if (!includeInherited) {\r\n return undefined;\r\n }\r\n\r\n return this.getInheritedPropertySync(name);\r\n }\r\n\r\n /**\r\n * Searches the base class, if one exists, for the property with the name provided.\r\n * @param name The name of the inherited property to find.\r\n */\r\n public async getInheritedProperty(name: string): Promise<Property | undefined> {\r\n if (this.baseClass) {\r\n const baseClassObj = await this.baseClass;\r\n return baseClassObj.getProperty(name, true);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Searches the base class, if one exists, for the property with the name provided.\r\n * @param name The name of the inherited property to find.\r\n */\r\n public getInheritedPropertySync(name: string): Property | undefined {\r\n const baseClassObj = this.getBaseClassSync();\r\n if (baseClassObj)\r\n return baseClassObj.getPropertySync(name, true);\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n * @throws ECObjectsStatus DuplicateProperty: thrown if a property with the same name already exists in the class.\r\n */\r\n protected async createPrimitiveProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveProperty>;\r\n protected async createPrimitiveProperty(name: string, primitiveType: Enumeration): Promise<EnumerationProperty>;\r\n protected async createPrimitiveProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = await this.loadPrimitiveType(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n * @throws ECObjectsStatus DuplicateProperty: thrown if a property with the same name already exists in the class.\r\n */\r\n protected createPrimitivePropertySync(name: string, primitiveType: PrimitiveType): PrimitiveProperty;\r\n protected createPrimitivePropertySync(name: string, primitiveType: Enumeration): EnumerationProperty;\r\n protected createPrimitivePropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = this.loadPrimitiveTypeSync(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveArrayECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n */\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveArrayProperty>;\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType: Enumeration): Promise<EnumerationArrayProperty>;\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = await this.loadPrimitiveType(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveArrayProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationArrayProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveArrayECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n */\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType: PrimitiveType): PrimitiveArrayProperty;\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType: Enumeration): EnumerationArrayProperty;\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = this.loadPrimitiveTypeSync(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveArrayProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationArrayProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name The name of property to create.\r\n * @param structType The struct type of property to create.\r\n */\r\n protected async createStructProperty(name: string, structType: string | StructClass): Promise<StructProperty> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructProperty(this, name, await this.loadStructType(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name The name of property to create.\r\n * @param structType The struct type of property to create.\r\n */\r\n protected createStructPropertySync(name: string, structType: string | StructClass): StructProperty {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructProperty(this, name, this.loadStructTypeSync(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param type\r\n */\r\n protected async createStructArrayProperty(name: string, structType: string | StructClass): Promise<StructArrayProperty> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructArrayProperty(this, name, await this.loadStructType(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param type\r\n */\r\n protected createStructArrayPropertySync(name: string, structType: string | StructClass): StructArrayProperty {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructArrayProperty(this, name, this.loadStructTypeSync(structType, this.schema)));\r\n }\r\n\r\n protected async loadStructType(structType: string | StructClass | undefined, schema: Schema): Promise<StructClass> {\r\n let correctType: StructClass | undefined;\r\n if (typeof (structType) === \"string\") {\r\n correctType = await schema.lookupItem<StructClass>(structType);\r\n } else\r\n correctType = structType;\r\n\r\n if (!correctType)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided Struct type, ${structType}, is not a valid StructClass.`);\r\n\r\n return correctType;\r\n }\r\n\r\n protected loadStructTypeSync(structType: string | StructClass | undefined, schema: Schema): StructClass {\r\n let correctType: StructClass | undefined;\r\n if (typeof (structType) === \"string\") {\r\n correctType = schema.lookupItemSync<StructClass>(structType);\r\n } else\r\n correctType = structType;\r\n\r\n if (!correctType)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided Struct type, ${structType}, is not a valid StructClass.`);\r\n\r\n return correctType;\r\n }\r\n\r\n protected async loadPrimitiveType(primitiveType: string | PrimitiveType | Enumeration | undefined, schema: Schema): Promise<PrimitiveType | Enumeration> {\r\n if (primitiveType === undefined)\r\n return PrimitiveType.Integer;\r\n\r\n if (typeof (primitiveType) === \"string\") {\r\n let resolvedType: (PrimitiveType | Enumeration | undefined) = parsePrimitiveType(primitiveType);\r\n if (!resolvedType) {\r\n resolvedType = await schema.lookupItem<Enumeration>(primitiveType);\r\n }\r\n\r\n if (resolvedType === undefined)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n // If resolvedType is a SchemaItem, make sure it is an Enumeration- if not, throw an error\r\n if (typeof (resolvedType) !== \"number\" && resolvedType.schemaItemType !== SchemaItemType.Enumeration)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n return resolvedType;\r\n }\r\n\r\n return primitiveType;\r\n }\r\n\r\n protected loadPrimitiveTypeSync(primitiveType: string | PrimitiveType | Enumeration | undefined, schema: Schema): PrimitiveType | Enumeration {\r\n if (primitiveType === undefined)\r\n return PrimitiveType.Integer;\r\n\r\n if (typeof (primitiveType) === \"string\") {\r\n let resolvedType: (PrimitiveType | Enumeration | undefined) = parsePrimitiveType(primitiveType);\r\n if (!resolvedType) {\r\n resolvedType = schema.lookupItemSync<Enumeration>(primitiveType);\r\n }\r\n\r\n if (resolvedType === undefined)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n return resolvedType;\r\n }\r\n\r\n return primitiveType;\r\n }\r\n\r\n /**\r\n * Save this Classes properties to an object for serializing to JSON.\r\n * @param standalone Serialization includes only this object (as opposed to the full schema).\r\n * @param includeSchemaVersion Include the Schema's version information in the serialized object.\r\n */\r\n public override toJSON(standalone: boolean = false, includeSchemaVersion: boolean = false): ClassProps {\r\n const schemaJson = super.toJSON(standalone, includeSchemaVersion) as any;\r\n const isMixin = SchemaItemType.Mixin === this.schemaItemType;\r\n const isRelationship = SchemaItemType.RelationshipClass === this.schemaItemType;\r\n if (!isMixin && (ECClassModifier.None !== this.modifier || isRelationship))\r\n schemaJson.modifier = classModifierToString(this.modifier);\r\n if (this.baseClass !== undefined)\r\n schemaJson.baseClass = this.baseClass.fullName;\r\n if (this._properties !== undefined && this._properties.size > 0)\r\n schemaJson.properties = [...this.properties!].map((prop) => prop.toJSON());\r\n\r\n const customAttributes = serializeCustomAttributes(this.customAttributes);\r\n if (customAttributes !== undefined)\r\n schemaJson.customAttributes = customAttributes;\r\n return schemaJson as ClassProps;\r\n }\r\n\r\n /** @internal */\r\n public override async toXml(schemaXml: Document): Promise<Element> {\r\n const itemElement = await super.toXml(schemaXml);\r\n\r\n if (undefined !== this.modifier)\r\n itemElement.setAttribute(\"modifier\", classModifierToString(this.modifier));\r\n\r\n if (undefined !== this.baseClass) {\r\n const baseClass = await this.baseClass;\r\n const baseClassElement = schemaXml.createElement(\"BaseClass\");\r\n const baseClassName = XmlSerializationUtils.createXmlTypedName(this.schema, baseClass.schema, baseClass.name);\r\n baseClassElement.textContent = baseClassName;\r\n itemElement.appendChild(baseClassElement);\r\n }\r\n\r\n if (undefined !== this.properties) {\r\n for (const prop of this.properties) {\r\n const propXml = await prop.toXml(schemaXml);\r\n itemElement.appendChild(propXml);\r\n }\r\n }\r\n\r\n if (this._customAttributes) {\r\n const caContainerElement = schemaXml.createElement(\"ECCustomAttributes\");\r\n for (const [name, attribute] of this._customAttributes) {\r\n const caElement = await XmlSerializationUtils.writeCustomAttribute(name, attribute, schemaXml, this.schema);\r\n caContainerElement.appendChild(caElement);\r\n }\r\n itemElement.appendChild(caContainerElement);\r\n }\r\n\r\n return itemElement;\r\n }\r\n\r\n public override fromJSONSync(classProps: ClassProps) {\r\n super.fromJSONSync(classProps);\r\n\r\n if (undefined !== classProps.modifier) {\r\n const modifier = parseClassModifier(classProps.modifier);\r\n if (undefined === modifier)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidModifier, `The string '${classProps.modifier}' is not a valid ECClassModifier.`);\r\n this._modifier = modifier;\r\n }\r\n\r\n if (undefined !== classProps.baseClass) {\r\n const ecClassSchemaItemKey = this.schema.getSchemaItemKey(classProps.baseClass);\r\n if (!ecClassSchemaItemKey)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidECJson, `Unable to locate the baseClass ${classProps.baseClass}.`);\r\n this._baseClass = new DelayedPromiseWithProps<SchemaItemKey, ECClass>(ecClassSchemaItemKey,\r\n async () => {\r\n const baseClass = await this.schema.lookupItem<ECClass>(ecClassSchemaItemKey);\r\n if (undefined === baseClass)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidECJson, `Unable to locate the baseClass ${classProps.baseClass}.`);\r\n return baseClass;\r\n });\r\n }\r\n }\r\n\r\n public override async fromJSON(classProps: ClassProps): Promise<void> {\r\n this.fromJSONSync(classProps);\r\n }\r\n\r\n protected addCustomAttribute(customAttribute: CustomAttribute) {\r\n if (!this._customAttributes)\r\n this._customAttributes = new Map<string, CustomAttribute>();\r\n\r\n this._customAttributes.set(customAttribute.className, customAttribute);\r\n }\r\n\r\n /**\r\n * Iterates (recursively) over all base classes and mixins, in \"property override\" order.\r\n * This is essentially a depth-first traversal through the inheritance tree.\r\n */\r\n public async *getAllBaseClasses(): AsyncIterableIterator<ECClass> {\r\n const baseClasses: ECClass[] = [this];\r\n const addBaseClasses = async (ecClass: AnyClass) => {\r\n if (SchemaItemType.EntityClass === ecClass.schemaItemType) {\r\n for (let i = (ecClass).mixins.length - 1; i >= 0; i--) {\r\n baseClasses.push(await (ecClass).mixins[i]);\r\n }\r\n }\r\n\r\n if (ecClass.baseClass)\r\n baseClasses.push(await ecClass.baseClass);\r\n };\r\n\r\n while (baseClasses.length > 0) {\r\n const baseClass = baseClasses.pop() as AnyClass;\r\n await addBaseClasses(baseClass);\r\n if (baseClass !== this)\r\n yield baseClass as ECClass;\r\n }\r\n }\r\n\r\n public *getAllBaseClassesSync(): Iterable<AnyClass> {\r\n const baseClasses: ECClass[] = [this];\r\n const addBaseClasses = (ecClass: AnyClass) => {\r\n if (SchemaItemType.EntityClass === ecClass.schemaItemType) {\r\n for (const m of Array.from(ecClass.getMixinsSync()).reverse()) {\r\n baseClasses.push(m);\r\n }\r\n }\r\n\r\n const baseClass = ecClass.getBaseClassSync();\r\n if (baseClass)\r\n baseClasses.push(baseClass);\r\n };\r\n\r\n while (baseClasses.length > 0) {\r\n const baseClass = baseClasses.pop() as AnyClass;\r\n addBaseClasses(baseClass);\r\n if (baseClass !== this)\r\n yield baseClass;\r\n }\r\n }\r\n\r\n protected static mergeProperties(target: Property[], existingValues: Map<string, number>, propertiesToMerge: Property[], overwriteExisting: boolean) {\r\n for (const property of propertiesToMerge) {\r\n const upperCaseName = property.name.toUpperCase();\r\n const existing = existingValues.get(upperCaseName);\r\n if (existing !== undefined) {\r\n if (overwriteExisting) {\r\n target[existing] = property;\r\n }\r\n } else {\r\n existingValues.set(upperCaseName, target.length);\r\n target.push(property);\r\n }\r\n }\r\n }\r\n\r\n protected async buildPropertyCache(result: Property[], existingValues?: Map<string, number>, resetBaseCaches: boolean = false): Promise<void> {\r\n if (!existingValues) {\r\n existingValues = new Map<string, number>();\r\n }\r\n\r\n if (this.baseClass) {\r\n ECClass.mergeProperties(result, existingValues, await (await this.baseClass).getProperties(resetBaseCaches), false);\r\n }\r\n\r\n if (!this.properties)\r\n return;\r\n\r\n ECClass.mergeProperties(result, existingValues, [...this.properties], true);\r\n }\r\n\r\n protected buildPropertyCacheSync(result: Property[], existingValues?: Map<string, number>, resetBaseCaches: boolean = false): void {\r\n if (!existingValues) {\r\n existingValues = new Map<string, number>();\r\n }\r\n\r\n const baseClass = this.getBaseClassSync();\r\n if (baseClass) {\r\n ECClass.mergeProperties(result, existingValues, baseClass.getPropertiesSync(resetBaseCaches), false);\r\n }\r\n\r\n if (!this.properties)\r\n return;\r\n\r\n ECClass.mergeProperties(result, existingValues, [...this.properties], true);\r\n }\r\n\r\n /**\r\n * Iterates all properties, including the ones merged from base classes and mixins. To obtain only local properties, use the 'properties' field.\r\n * Since this is an expensive operation, results will be cached after first call.\r\n * @param resetCache if true, any previously cached results will be dropped and cache will be rebuilt\r\n */\r\n public getPropertiesSync(resetCache: boolean = false): Property[] {\r\n if (!this._mergedPropertyCache || resetCache) {\r\n this._mergedPropertyCache = [];\r\n this.buildPropertyCacheSync(this._mergedPropertyCache, undefined, resetCache);\r\n }\r\n\r\n return this._mergedPropertyCache;\r\n }\r\n\r\n /**\r\n * Iterates all properties, including the ones merged from base classes and mixins. To obtain only local properties, use the 'properties' field.\r\n * Since this is an expensive operation, results will be cached after first call.\r\n * @param resetCache if true, any previously cached results will be dropped and cache will be rebuilt\r\n */\r\n public async getProperties(resetCache: boolean = false): Promise<Property[]> {\r\n if (!this._mergedPropertyCache || resetCache) {\r\n this._mergedPropertyCache = [];\r\n await this.buildPropertyCache(this._mergedPropertyCache, undefined, resetCache);\r\n }\r\n\r\n return this._mergedPropertyCache;\r\n }\r\n\r\n /**\r\n * Retrieve all custom attributes in the current class and its bases\r\n * This is the async version of getCustomAttributesSync()\r\n */\r\n public async getCustomAttributes(): Promise<CustomAttributeSet> {\r\n return this.getCustomAttributesSync();\r\n }\r\n\r\n /**\r\n * Retrieve all custom attributes in the current class and its bases.\r\n */\r\n public getCustomAttributesSync(): CustomAttributeSet {\r\n let customAttributes: Map<string, CustomAttribute> | undefined = this._customAttributes;\r\n if (undefined === customAttributes) {\r\n customAttributes = new Map<string, CustomAttribute>();\r\n }\r\n\r\n this.traverseBaseClassesSync((ecClass: ECClass) => {\r\n if (undefined === ecClass.customAttributes)\r\n return false;\r\n\r\n for (const [className, customAttribute] of ecClass.customAttributes) {\r\n if (customAttributes!.has(className))\r\n continue;\r\n customAttributes!.set(className, customAttribute);\r\n }\r\n\r\n return false;\r\n });\r\n\r\n return customAttributes;\r\n }\r\n\r\n /**\r\n * Asynchronously traverses through the inheritance tree, using depth-first traversal, calling the given callback\r\n * function for each base class encountered.\r\n * @param callback The function to call for each base class in the hierarchy.\r\n * @param arg An argument that will be passed as the second parameter to the callback function.\r\n */\r\n public async traverseBaseClasses(callback: (ecClass: ECClass, arg?: any) => boolean, arg?: any): Promise<boolean> {\r\n for await (const baseClass of this.getAllBaseClasses()) {\r\n if (callback(baseClass, arg))\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Synchronously traverses through the inheritance tree, using depth-first traversal, calling the given callback\r\n * function for each base class encountered.\r\n * @param callback The function to call for each base class in the hierarchy.\r\n * @param arg An argument that will be passed as the second parameter to the callback function.\r\n */\r\n public traverseBaseClassesSync(callback: (ecClass: ECClass, arg?: any) => boolean, arg?: any): boolean {\r\n const baseClasses = this.getAllBaseClassesSync();\r\n if (!baseClasses)\r\n return false;\r\n\r\n for (const baseClass of baseClasses) {\r\n if (callback(baseClass, arg))\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Indicates if the targetClass is of this type.\r\n * @param targetClass The ECClass or ECClass name to check.\r\n * @param schemaName The schema name. Required if targetClass is the ECClass name.\r\n */\r\n public async is(targetClass: string, schemaName: string): Promise<boolean>;\r\n public async is(targetClass: ECClass): Promise<boolean>;\r\n public async is(targetClass: ECClass | string, schemaName?: string): Promise<boolean> {\r\n if (schemaName !== undefined) {\r\n assert(typeof (targetClass) === \"string\", \"Expected targetClass of type string because schemaName was specified\");\r\n\r\n const key = new SchemaItemKey(targetClass, new SchemaKey(schemaName));\r\n if (SchemaItem.equalByKey(this, key))\r\n return true;\r\n\r\n return this.traverseBaseClasses(SchemaItem.equalByKey, key);\r\n } else {\r\n assert(ECClass.isECClass(targetClass), \"Expected targetClass to be of type ECClass\");\r\n\r\n if (SchemaItem.equalByKey(this, targetClass))\r\n return true;\r\n\r\n return this.traverseBaseClasses(SchemaItem.equalByKey, targetClass);\r\n }\r\n }\r\n\r\n /**\r\n * A synchronous version of the [[ECClass.is]], indicating if the targetClass is of this type.\r\n * @param targetClass The class to check.\r\n */\r\n public isSync(targetClass: ECClass): boolean {\r\n if (SchemaItem.equalByKey(this, targetClass))\r\n return true;\r\n\r\n return this.traverseBaseClassesSync(SchemaItem.equalByKey, targetClass);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static isECClass(object: any): object is ECClass {\r\n if (!SchemaItem.isSchemaItem(object))\r\n return false;\r\n\r\n return object.schemaItemType === SchemaItemType.EntityClass || object.schemaItemType === SchemaItemType.Mixin || object.schemaItemType === SchemaItemType.RelationshipClass ||\r\n object.schemaItemType === SchemaItemType.StructClass || object.schemaItemType === SchemaItemType.CustomAttributeClass;\r\n }\r\n\r\n /**\r\n * @alpha\r\n * A setter method used specifically for schema editing.\r\n * @param modifier\r\n */\r\n protected setModifier(modifier: ECClassModifier) {\r\n this._modifier = modifier;\r\n }\r\n}\r\n\r\n/**\r\n * A Typescript class representation of an ECStructClass.\r\n * @beta\r\n */\r\nexport class StructClass extends ECClass {\r\n public override readonly schemaItemType!: SchemaItemType.StructClass; // eslint-disable-line\r\n\r\n constructor(schema: Schema, name: string, modifier?: ECClassModifier) {\r\n super(schema, name, modifier);\r\n this.schemaItemType = SchemaItemType.StructClass;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n * An abstract class used for schema editing.\r\n */\r\nexport abstract class MutableStructClass extends StructClass {\r\n public abstract override setDisplayLabel(displayLabel: string): void;\r\n}\r\n\r\n/**\r\n * Hackish approach that works like a \"friend class\" so we can access protected members without making them public.\r\n * @internal\r\n */\r\nexport abstract class MutableClass extends ECClass {\r\n public abstract override addCustomAttribute(customAttribute: CustomAttribute): void;\r\n public abstract override setModifier(modifier: ECClassModifier): void;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveProperty>;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType: Enumeration): Promise<EnumerationProperty>;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property>;\r\n\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType: PrimitiveType): PrimitiveProperty;\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType: Enumeration): EnumerationProperty;\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property;\r\n\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveArrayProperty>;\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType: Enumeration): Promise<EnumerationArrayProperty>;\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property>;\r\n\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType: PrimitiveType): PrimitiveArrayProperty;\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType: Enumeration): EnumerationArrayProperty;\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property;\r\n\r\n public abstract override createStructProperty(name: string, structType: string | StructClass): Promise<StructProperty>;\r\n public abstract override createStructPropertySync(name: string, structType: string | StructClass): StructProperty;\r\n\r\n public abstract override createStructArrayProperty(name: string, structType: string | StructClass): Promise<StructArrayProperty>;\r\n public abstract override createStructArrayPropertySync(name: string, structType: string | StructClass): StructArrayProperty;\r\n\r\n public abstract override deleteProperty(name: string): Promise<void>;\r\n public abstract override deletePropertySync(name: string): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"Class.js","sourceRoot":"","sources":["../../../src/Metadata/Class.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 Metadata\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { DelayedPromiseWithProps } from \"../DelayedPromise\";\r\nimport { ClassProps } from \"../Deserialization/JsonProps\";\r\nimport { XmlSerializationUtils } from \"../Deserialization/XmlSerializationUtils\";\r\nimport { classModifierToString, ECClassModifier, parseClassModifier, parsePrimitiveType, PrimitiveType, SchemaItemType } from \"../ECObjects\";\r\nimport { ECObjectsError, ECObjectsStatus } from \"../Exception\";\r\nimport { AnyClass, LazyLoadedECClass } from \"../Interfaces\";\r\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\r\nimport { CustomAttribute, CustomAttributeContainerProps, CustomAttributeSet, serializeCustomAttributes } from \"./CustomAttribute\";\r\nimport { Enumeration } from \"./Enumeration\";\r\nimport {\r\n EnumerationArrayProperty, EnumerationProperty, PrimitiveArrayProperty, PrimitiveProperty, Property, StructArrayProperty, StructProperty,\r\n} from \"./Property\";\r\nimport { Schema } from \"./Schema\";\r\nimport { SchemaItem } from \"./SchemaItem\";\r\n\r\n/**\r\n * A common abstract class for all of the ECClass types.\r\n * @beta\r\n */\r\nexport abstract class ECClass extends SchemaItem implements CustomAttributeContainerProps {\r\n protected _modifier: ECClassModifier;\r\n protected _baseClass?: LazyLoadedECClass;\r\n protected _properties?: Map<string, Property>;\r\n private _customAttributes?: Map<string, CustomAttribute>;\r\n private _mergedPropertyCache?: Property[];\r\n\r\n public get modifier() { return this._modifier; }\r\n public get baseClass(): LazyLoadedECClass | undefined { return this._baseClass; }\r\n public set baseClass(baseClass: LazyLoadedECClass | undefined) { this._baseClass = baseClass; }\r\n public get properties(): IterableIterator<Property> | undefined { return this._properties?.values(); }\r\n public get customAttributes(): CustomAttributeSet | undefined { return this._customAttributes; }\r\n\r\n constructor(schema: Schema, name: string, modifier?: ECClassModifier) {\r\n super(schema, name);\r\n\r\n if (modifier)\r\n this._modifier = modifier;\r\n else\r\n this._modifier = ECClassModifier.None;\r\n }\r\n\r\n /**\r\n * Convenience method for adding an already loaded ECProperty used by create*Property methods.\r\n * @param prop The property to add.\r\n * @return The property that was added.\r\n */\r\n protected addProperty<T extends Property>(prop: T): T {\r\n if (!this._properties)\r\n this._properties = new Map<string, Property>();\r\n\r\n this._properties.set(prop.name.toUpperCase(), prop);\r\n return prop;\r\n }\r\n\r\n /**\r\n * Deletes a property from within this class.\r\n * @param name The property name to delete, lookup is case-insensitive\r\n * @alpha\r\n */\r\n protected async deleteProperty(name: string): Promise<void> {\r\n if (this._properties) {\r\n const property = await this.getProperty(name);\r\n if (property)\r\n this._properties.delete(name.toUpperCase());\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a property from within this class.\r\n * @param name The property name to delete, lookup is case-insensitive\r\n * @alpha\r\n */\r\n protected deletePropertySync(name: string): void {\r\n if (this._properties) {\r\n const property = this.getPropertySync(name);\r\n if (property)\r\n this._properties.delete(name.toUpperCase());\r\n }\r\n }\r\n\r\n public getBaseClassSync(): ECClass | undefined {\r\n if (!this.baseClass) {\r\n return undefined;\r\n }\r\n\r\n return this.schema.lookupItemSync<ECClass>(this.baseClass);\r\n }\r\n\r\n /**\r\n * Searches, case-insensitive, for a local ECProperty with the name provided.\r\n * @param name\r\n */\r\n public async getProperty(name: string, includeInherited: boolean = false): Promise<Property | undefined> {\r\n if (this._properties) {\r\n const upperKey = name.toUpperCase();\r\n const property = this._properties.get(upperKey);\r\n if (property)\r\n return property;\r\n }\r\n\r\n if (!includeInherited) {\r\n return undefined;\r\n }\r\n\r\n return this.getInheritedProperty(name);\r\n }\r\n\r\n /**\r\n * Searches, case-insensitive, for a local ECProperty with the name provided.\r\n * @param name\r\n */\r\n public getPropertySync(name: string, includeInherited: boolean = false): Property | undefined {\r\n if (this._properties) {\r\n const upperKey = name.toUpperCase();\r\n const property = this._properties.get(upperKey);\r\n if (property)\r\n return property;\r\n }\r\n\r\n if (!includeInherited) {\r\n return undefined;\r\n }\r\n\r\n return this.getInheritedPropertySync(name);\r\n }\r\n\r\n /**\r\n * Searches the base class, if one exists, for the property with the name provided.\r\n * @param name The name of the inherited property to find.\r\n */\r\n public async getInheritedProperty(name: string): Promise<Property | undefined> {\r\n if (this.baseClass) {\r\n const baseClassObj = await this.baseClass;\r\n return baseClassObj.getProperty(name, true);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Searches the base class, if one exists, for the property with the name provided.\r\n * @param name The name of the inherited property to find.\r\n */\r\n public getInheritedPropertySync(name: string): Property | undefined {\r\n const baseClassObj = this.getBaseClassSync();\r\n if (baseClassObj)\r\n return baseClassObj.getPropertySync(name, true);\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n * @throws ECObjectsStatus DuplicateProperty: thrown if a property with the same name already exists in the class.\r\n */\r\n protected async createPrimitiveProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveProperty>;\r\n protected async createPrimitiveProperty(name: string, primitiveType: Enumeration): Promise<EnumerationProperty>;\r\n protected async createPrimitiveProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = await this.loadPrimitiveType(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n * @throws ECObjectsStatus DuplicateProperty: thrown if a property with the same name already exists in the class.\r\n */\r\n protected createPrimitivePropertySync(name: string, primitiveType: PrimitiveType): PrimitiveProperty;\r\n protected createPrimitivePropertySync(name: string, primitiveType: Enumeration): EnumerationProperty;\r\n protected createPrimitivePropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = this.loadPrimitiveTypeSync(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveArrayECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n */\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveArrayProperty>;\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType: Enumeration): Promise<EnumerationArrayProperty>;\r\n protected async createPrimitiveArrayProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = await this.loadPrimitiveType(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveArrayProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationArrayProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n * Creates a PrimitiveArrayECProperty.\r\n * @param name The name of property to create.\r\n * @param primitiveType The primitive type of property to create. If not provided the default is PrimitiveType.Integer\r\n */\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType: PrimitiveType): PrimitiveArrayProperty;\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType: Enumeration): EnumerationArrayProperty;\r\n protected createPrimitiveArrayPropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n const propType = this.loadPrimitiveTypeSync(primitiveType, this.schema);\r\n if (typeof (propType) === \"number\")\r\n return this.addProperty(new PrimitiveArrayProperty(this, name, propType));\r\n\r\n return this.addProperty(new EnumerationArrayProperty(this, name, new DelayedPromiseWithProps(propType.key, async () => propType)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name The name of property to create.\r\n * @param structType The struct type of property to create.\r\n */\r\n protected async createStructProperty(name: string, structType: string | StructClass): Promise<StructProperty> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructProperty(this, name, await this.loadStructType(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name The name of property to create.\r\n * @param structType The struct type of property to create.\r\n */\r\n protected createStructPropertySync(name: string, structType: string | StructClass): StructProperty {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructProperty(this, name, this.loadStructTypeSync(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param type\r\n */\r\n protected async createStructArrayProperty(name: string, structType: string | StructClass): Promise<StructArrayProperty> {\r\n if (await this.getProperty(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructArrayProperty(this, name, await this.loadStructType(structType, this.schema)));\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param type\r\n */\r\n protected createStructArrayPropertySync(name: string, structType: string | StructClass): StructArrayProperty {\r\n if (this.getPropertySync(name))\r\n throw new ECObjectsError(ECObjectsStatus.DuplicateProperty, `An ECProperty with the name ${name} already exists in the class ${this.name}.`);\r\n\r\n return this.addProperty(new StructArrayProperty(this, name, this.loadStructTypeSync(structType, this.schema)));\r\n }\r\n\r\n protected async loadStructType(structType: string | StructClass | undefined, schema: Schema): Promise<StructClass> {\r\n let correctType: StructClass | undefined;\r\n if (typeof (structType) === \"string\") {\r\n correctType = await schema.lookupItem<StructClass>(structType);\r\n } else\r\n correctType = structType;\r\n\r\n if (!correctType)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided Struct type, ${structType}, is not a valid StructClass.`);\r\n\r\n return correctType;\r\n }\r\n\r\n protected loadStructTypeSync(structType: string | StructClass | undefined, schema: Schema): StructClass {\r\n let correctType: StructClass | undefined;\r\n if (typeof (structType) === \"string\") {\r\n correctType = schema.lookupItemSync<StructClass>(structType);\r\n } else\r\n correctType = structType;\r\n\r\n if (!correctType)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided Struct type, ${structType}, is not a valid StructClass.`);\r\n\r\n return correctType;\r\n }\r\n\r\n protected async loadPrimitiveType(primitiveType: string | PrimitiveType | Enumeration | undefined, schema: Schema): Promise<PrimitiveType | Enumeration> {\r\n if (primitiveType === undefined)\r\n return PrimitiveType.Integer;\r\n\r\n if (typeof (primitiveType) === \"string\") {\r\n let resolvedType: (PrimitiveType | Enumeration | undefined) = parsePrimitiveType(primitiveType);\r\n if (!resolvedType) {\r\n resolvedType = await schema.lookupItem<Enumeration>(primitiveType);\r\n }\r\n\r\n if (resolvedType === undefined)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n // If resolvedType is a SchemaItem, make sure it is an Enumeration- if not, throw an error\r\n if (typeof (resolvedType) !== \"number\" && resolvedType.schemaItemType !== SchemaItemType.Enumeration)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n return resolvedType;\r\n }\r\n\r\n return primitiveType;\r\n }\r\n\r\n protected loadPrimitiveTypeSync(primitiveType: string | PrimitiveType | Enumeration | undefined, schema: Schema): PrimitiveType | Enumeration {\r\n if (primitiveType === undefined)\r\n return PrimitiveType.Integer;\r\n\r\n if (typeof (primitiveType) === \"string\") {\r\n let resolvedType: (PrimitiveType | Enumeration | undefined) = parsePrimitiveType(primitiveType);\r\n if (!resolvedType) {\r\n resolvedType = schema.lookupItemSync<Enumeration>(primitiveType);\r\n }\r\n\r\n if (resolvedType === undefined)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidType, `The provided primitive type, ${primitiveType}, is not a valid PrimitiveType or Enumeration.`);\r\n\r\n return resolvedType;\r\n }\r\n\r\n return primitiveType;\r\n }\r\n\r\n /**\r\n * Save this Classes properties to an object for serializing to JSON.\r\n * @param standalone Serialization includes only this object (as opposed to the full schema).\r\n * @param includeSchemaVersion Include the Schema's version information in the serialized object.\r\n */\r\n public override toJSON(standalone: boolean = false, includeSchemaVersion: boolean = false): ClassProps {\r\n const schemaJson = super.toJSON(standalone, includeSchemaVersion) as any;\r\n const isMixin = SchemaItemType.Mixin === this.schemaItemType;\r\n const isRelationship = SchemaItemType.RelationshipClass === this.schemaItemType;\r\n if (!isMixin && (ECClassModifier.None !== this.modifier || isRelationship))\r\n schemaJson.modifier = classModifierToString(this.modifier);\r\n if (this.baseClass !== undefined)\r\n schemaJson.baseClass = this.baseClass.fullName;\r\n if (this._properties !== undefined && this._properties.size > 0)\r\n schemaJson.properties = [...this.properties!].map((prop) => prop.toJSON());\r\n\r\n const customAttributes = serializeCustomAttributes(this.customAttributes);\r\n if (customAttributes !== undefined)\r\n schemaJson.customAttributes = customAttributes;\r\n return schemaJson as ClassProps;\r\n }\r\n\r\n /** @internal */\r\n public override async toXml(schemaXml: Document): Promise<Element> {\r\n const itemElement = await super.toXml(schemaXml);\r\n\r\n if (undefined !== this.modifier)\r\n itemElement.setAttribute(\"modifier\", classModifierToString(this.modifier));\r\n\r\n if (undefined !== this.baseClass) {\r\n const baseClass = await this.baseClass;\r\n const baseClassElement = schemaXml.createElement(\"BaseClass\");\r\n const baseClassName = XmlSerializationUtils.createXmlTypedName(this.schema, baseClass.schema, baseClass.name);\r\n baseClassElement.textContent = baseClassName;\r\n itemElement.appendChild(baseClassElement);\r\n }\r\n\r\n if (undefined !== this.properties) {\r\n for (const prop of this.properties) {\r\n const propXml = await prop.toXml(schemaXml);\r\n itemElement.appendChild(propXml);\r\n }\r\n }\r\n\r\n if (this._customAttributes) {\r\n const caContainerElement = schemaXml.createElement(\"ECCustomAttributes\");\r\n for (const [name, attribute] of this._customAttributes) {\r\n const caElement = await XmlSerializationUtils.writeCustomAttribute(name, attribute, schemaXml, this.schema);\r\n caContainerElement.appendChild(caElement);\r\n }\r\n itemElement.appendChild(caContainerElement);\r\n }\r\n\r\n return itemElement;\r\n }\r\n\r\n public override fromJSONSync(classProps: ClassProps) {\r\n super.fromJSONSync(classProps);\r\n\r\n if (undefined !== classProps.modifier) {\r\n const modifier = parseClassModifier(classProps.modifier);\r\n if (undefined === modifier)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidModifier, `The string '${classProps.modifier}' is not a valid ECClassModifier.`);\r\n this._modifier = modifier;\r\n }\r\n\r\n if (undefined !== classProps.baseClass) {\r\n const ecClassSchemaItemKey = this.schema.getSchemaItemKey(classProps.baseClass);\r\n if (!ecClassSchemaItemKey)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidECJson, `Unable to locate the baseClass ${classProps.baseClass}.`);\r\n this._baseClass = new DelayedPromiseWithProps<SchemaItemKey, ECClass>(ecClassSchemaItemKey,\r\n async () => {\r\n const baseClass = await this.schema.lookupItem<ECClass>(ecClassSchemaItemKey);\r\n if (undefined === baseClass)\r\n throw new ECObjectsError(ECObjectsStatus.InvalidECJson, `Unable to locate the baseClass ${classProps.baseClass}.`);\r\n return baseClass;\r\n });\r\n }\r\n }\r\n\r\n public override async fromJSON(classProps: ClassProps): Promise<void> {\r\n this.fromJSONSync(classProps);\r\n }\r\n\r\n protected addCustomAttribute(customAttribute: CustomAttribute) {\r\n if (!this._customAttributes)\r\n this._customAttributes = new Map<string, CustomAttribute>();\r\n\r\n this._customAttributes.set(customAttribute.className, customAttribute);\r\n }\r\n\r\n /**\r\n * Iterates (recursively) over all base classes and mixins, in \"property override\" order.\r\n * This is essentially a depth-first traversal through the inheritance tree.\r\n */\r\n public async *getAllBaseClasses(): AsyncIterableIterator<ECClass> {\r\n const baseClasses: ECClass[] = [this];\r\n const addBaseClasses = async (ecClass: AnyClass) => {\r\n if (SchemaItemType.EntityClass === ecClass.schemaItemType) {\r\n for (let i = (ecClass).mixins.length - 1; i >= 0; i--) {\r\n baseClasses.push(await (ecClass).mixins[i]);\r\n }\r\n }\r\n\r\n if (ecClass.baseClass)\r\n baseClasses.push(await ecClass.baseClass);\r\n };\r\n\r\n while (baseClasses.length > 0) {\r\n const baseClass = baseClasses.pop() as AnyClass;\r\n await addBaseClasses(baseClass);\r\n if (baseClass !== this)\r\n yield baseClass as ECClass;\r\n }\r\n }\r\n\r\n public *getAllBaseClassesSync(): Iterable<AnyClass> {\r\n const baseClasses: ECClass[] = [this];\r\n const addBaseClasses = (ecClass: AnyClass) => {\r\n if (SchemaItemType.EntityClass === ecClass.schemaItemType) {\r\n for (const m of Array.from(ecClass.getMixinsSync()).reverse()) {\r\n baseClasses.push(m);\r\n }\r\n }\r\n\r\n const baseClass = ecClass.getBaseClassSync();\r\n if (baseClass)\r\n baseClasses.push(baseClass);\r\n };\r\n\r\n while (baseClasses.length > 0) {\r\n const baseClass = baseClasses.pop() as AnyClass;\r\n addBaseClasses(baseClass);\r\n if (baseClass !== this)\r\n yield baseClass;\r\n }\r\n }\r\n\r\n protected static mergeProperties(target: Property[], existingValues: Map<string, number>, propertiesToMerge: Property[], overwriteExisting: boolean) {\r\n for (const property of propertiesToMerge) {\r\n const upperCaseName = property.name.toUpperCase();\r\n const existing = existingValues.get(upperCaseName);\r\n if (existing !== undefined) {\r\n if (overwriteExisting) {\r\n target[existing] = property;\r\n }\r\n } else {\r\n existingValues.set(upperCaseName, target.length);\r\n target.push(property);\r\n }\r\n }\r\n }\r\n\r\n protected async buildPropertyCache(result: Property[], existingValues?: Map<string, number>, resetBaseCaches: boolean = false): Promise<void> {\r\n if (!existingValues) {\r\n existingValues = new Map<string, number>();\r\n }\r\n\r\n if (this.baseClass) {\r\n ECClass.mergeProperties(result, existingValues, await (await this.baseClass).getProperties(resetBaseCaches), false);\r\n }\r\n\r\n if (!this.properties)\r\n return;\r\n\r\n ECClass.mergeProperties(result, existingValues, [...this.properties], true);\r\n }\r\n\r\n protected buildPropertyCacheSync(result: Property[], existingValues?: Map<string, number>, resetBaseCaches: boolean = false): void {\r\n if (!existingValues) {\r\n existingValues = new Map<string, number>();\r\n }\r\n\r\n const baseClass = this.getBaseClassSync();\r\n if (baseClass) {\r\n ECClass.mergeProperties(result, existingValues, baseClass.getPropertiesSync(resetBaseCaches), false);\r\n }\r\n\r\n if (!this.properties)\r\n return;\r\n\r\n ECClass.mergeProperties(result, existingValues, [...this.properties], true);\r\n }\r\n\r\n /**\r\n * Iterates all properties, including the ones merged from base classes and mixins. To obtain only local properties, use the 'properties' field.\r\n * Since this is an expensive operation, results will be cached after first call.\r\n * @param resetCache if true, any previously cached results will be dropped and cache will be rebuilt\r\n */\r\n public getPropertiesSync(resetCache: boolean = false): Property[] {\r\n if (!this._mergedPropertyCache || resetCache) {\r\n this._mergedPropertyCache = [];\r\n this.buildPropertyCacheSync(this._mergedPropertyCache, undefined, resetCache);\r\n }\r\n\r\n return this._mergedPropertyCache;\r\n }\r\n\r\n /**\r\n * Iterates all properties, including the ones merged from base classes and mixins. To obtain only local properties, use the 'properties' field.\r\n * Since this is an expensive operation, results will be cached after first call.\r\n * @param resetCache if true, any previously cached results will be dropped and cache will be rebuilt\r\n */\r\n public async getProperties(resetCache: boolean = false): Promise<Property[]> {\r\n if (!this._mergedPropertyCache || resetCache) {\r\n this._mergedPropertyCache = [];\r\n await this.buildPropertyCache(this._mergedPropertyCache, undefined, resetCache);\r\n }\r\n\r\n return this._mergedPropertyCache;\r\n }\r\n\r\n /**\r\n * Retrieve all custom attributes in the current class and its bases\r\n * This is the async version of getCustomAttributesSync()\r\n */\r\n public async getCustomAttributes(): Promise<CustomAttributeSet> {\r\n return this.getCustomAttributesSync();\r\n }\r\n\r\n /**\r\n * Retrieve all custom attributes in the current class and its bases.\r\n */\r\n public getCustomAttributesSync(): CustomAttributeSet {\r\n let customAttributes: Map<string, CustomAttribute> | undefined = this._customAttributes;\r\n if (undefined === customAttributes) {\r\n customAttributes = new Map<string, CustomAttribute>();\r\n }\r\n\r\n this.traverseBaseClassesSync((ecClass: ECClass) => {\r\n if (undefined === ecClass.customAttributes)\r\n return false;\r\n\r\n for (const [className, customAttribute] of ecClass.customAttributes) {\r\n if (customAttributes!.has(className))\r\n continue;\r\n customAttributes!.set(className, customAttribute);\r\n }\r\n\r\n return false;\r\n });\r\n\r\n return customAttributes;\r\n }\r\n\r\n /**\r\n * Asynchronously traverses through the inheritance tree, using depth-first traversal, calling the given callback\r\n * function for each base class encountered.\r\n * @param callback The function to call for each base class in the hierarchy.\r\n * @param arg An argument that will be passed as the second parameter to the callback function.\r\n */\r\n public async traverseBaseClasses(callback: (ecClass: ECClass, arg?: any) => boolean, arg?: any): Promise<boolean> {\r\n for await (const baseClass of this.getAllBaseClasses()) {\r\n if (callback(baseClass, arg))\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Synchronously traverses through the inheritance tree, using depth-first traversal, calling the given callback\r\n * function for each base class encountered.\r\n * @param callback The function to call for each base class in the hierarchy.\r\n * @param arg An argument that will be passed as the second parameter to the callback function.\r\n */\r\n public traverseBaseClassesSync(callback: (ecClass: ECClass, arg?: any) => boolean, arg?: any): boolean {\r\n const baseClasses = this.getAllBaseClassesSync();\r\n if (!baseClasses)\r\n return false;\r\n\r\n for (const baseClass of baseClasses) {\r\n if (callback(baseClass, arg))\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Indicates if the targetClass is of this type.\r\n * @param targetClass The ECClass or ECClass name to check.\r\n * @param schemaName The schema name. Required if targetClass is the ECClass name.\r\n */\r\n public async is(targetClass: string, schemaName: string): Promise<boolean>;\r\n public async is(targetClass: ECClass): Promise<boolean>;\r\n public async is(targetClass: ECClass | string, schemaName?: string): Promise<boolean> {\r\n if (schemaName !== undefined) {\r\n assert(typeof (targetClass) === \"string\", \"Expected targetClass of type string because schemaName was specified\");\r\n\r\n const key = new SchemaItemKey(targetClass, new SchemaKey(schemaName));\r\n if (SchemaItem.equalByKey(this, key))\r\n return true;\r\n\r\n return this.traverseBaseClasses((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), key);\r\n } else {\r\n assert(ECClass.isECClass(targetClass), \"Expected targetClass to be of type ECClass\");\r\n\r\n if (SchemaItem.equalByKey(this, targetClass))\r\n return true;\r\n\r\n return this.traverseBaseClasses((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), targetClass);\r\n }\r\n }\r\n\r\n /**\r\n * A synchronous version of the [[ECClass.is]], indicating if the targetClass is of this type.\r\n * @param targetClass The class to check.\r\n */\r\n public isSync(targetClass: ECClass): boolean {\r\n if (SchemaItem.equalByKey(this, targetClass))\r\n return true;\r\n\r\n return this.traverseBaseClassesSync((thisSchemaItem, thatSchemaItemOrKey) => SchemaItem.equalByKey(thisSchemaItem, thatSchemaItemOrKey), targetClass);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static isECClass(object: any): object is ECClass {\r\n if (!SchemaItem.isSchemaItem(object))\r\n return false;\r\n\r\n return object.schemaItemType === SchemaItemType.EntityClass || object.schemaItemType === SchemaItemType.Mixin || object.schemaItemType === SchemaItemType.RelationshipClass ||\r\n object.schemaItemType === SchemaItemType.StructClass || object.schemaItemType === SchemaItemType.CustomAttributeClass;\r\n }\r\n\r\n /**\r\n * @alpha\r\n * A setter method used specifically for schema editing.\r\n * @param modifier\r\n */\r\n protected setModifier(modifier: ECClassModifier) {\r\n this._modifier = modifier;\r\n }\r\n}\r\n\r\n/**\r\n * A Typescript class representation of an ECStructClass.\r\n * @beta\r\n */\r\nexport class StructClass extends ECClass {\r\n public override readonly schemaItemType!: SchemaItemType.StructClass; // eslint-disable-line\r\n\r\n constructor(schema: Schema, name: string, modifier?: ECClassModifier) {\r\n super(schema, name, modifier);\r\n this.schemaItemType = SchemaItemType.StructClass;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n * An abstract class used for schema editing.\r\n */\r\nexport abstract class MutableStructClass extends StructClass {\r\n public abstract override setDisplayLabel(displayLabel: string): void;\r\n}\r\n\r\n/**\r\n * Hackish approach that works like a \"friend class\" so we can access protected members without making them public.\r\n * @internal\r\n */\r\nexport abstract class MutableClass extends ECClass {\r\n public abstract override addCustomAttribute(customAttribute: CustomAttribute): void;\r\n public abstract override setModifier(modifier: ECClassModifier): void;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveProperty>;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType: Enumeration): Promise<EnumerationProperty>;\r\n public abstract override createPrimitiveProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property>;\r\n\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType: PrimitiveType): PrimitiveProperty;\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType: Enumeration): EnumerationProperty;\r\n public abstract override createPrimitivePropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property;\r\n\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType: PrimitiveType): Promise<PrimitiveArrayProperty>;\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType: Enumeration): Promise<EnumerationArrayProperty>;\r\n public abstract override createPrimitiveArrayProperty(name: string, primitiveType?: string | PrimitiveType | Enumeration): Promise<Property>;\r\n\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType: PrimitiveType): PrimitiveArrayProperty;\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType: Enumeration): EnumerationArrayProperty;\r\n public abstract override createPrimitiveArrayPropertySync(name: string, primitiveType?: string | PrimitiveType | Enumeration): Property;\r\n\r\n public abstract override createStructProperty(name: string, structType: string | StructClass): Promise<StructProperty>;\r\n public abstract override createStructPropertySync(name: string, structType: string | StructClass): StructProperty;\r\n\r\n public abstract override createStructArrayProperty(name: string, structType: string | StructClass): Promise<StructArrayProperty>;\r\n public abstract override createStructArrayPropertySync(name: string, structType: string | StructClass): StructArrayProperty;\r\n\r\n public abstract override deleteProperty(name: string): Promise<void>;\r\n public abstract override deletePropertySync(name: string): void;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"UnitConversion.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConversion.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,4CAA4C;AAG5C,4CAA8C;AAE9C;;;GAGG;AACH,MAAa,cAAc;IACzB,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;IAKD;;;OAGG;IACI,MAAM,CAAC,IAAI,CAAC,IAAqB;QACtC,IAAI,IAAI,CAAC,cAAc,KAAK,0BAAc,CAAC,IAAI;YAC7C,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7E,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;;AAZD,gBAAgB;AACF,uBAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;AA7DnC,wCAAc","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 * as almostEqual from \"almost-equal\";\r\nimport { Constant } from \"../Metadata/Constant\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\n\r\n/**\r\n * Class used for storing calculated conversion between two Units [[UnitConverter.calculateConversion]] and converting values from one Unit to another [[UnitConverter.evaluate]]\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 unit's numerator and denominator in factor and unit's offset in offset for reducing\r\n * @internal\r\n */\r\n public static from(unit: Unit | Constant): UnitConversion {\r\n if (unit.schemaItemType === SchemaItemType.Unit)\r\n return new UnitConversion(unit.denominator / unit.numerator, -unit.offset);\r\n\r\n return new UnitConversion(unit.denominator / unit.numerator, 0.0);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"UnitConversion.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConversion.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,4CAA4C;AAG5C,4CAA8C;AAE9C;;;GAGG;AACH,MAAa,cAAc;IACzB,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;IAKD;;;OAGG;IACI,MAAM,CAAC,IAAI,CAAC,IAAqB;QACtC,IAAI,IAAI,CAAC,cAAc,KAAK,0BAAc,CAAC,IAAI;YAC7C,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7E,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;;AAZD,gBAAgB;AACF,uBAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;AA7DnC,wCAAc","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 * as almostEqual from \"almost-equal\";\r\nimport { Constant } from \"../Metadata/Constant\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\n\r\n/**\r\n * Class used for storing calculated conversion between two Units [[UnitConverter.calculateConversion]] and converting values from one Unit to another [[UnitConverter.evaluate]]\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 unit's numerator and denominator in factor and unit's offset in offset for reducing\r\n * @internal\r\n */\r\n public static from(unit: Unit | Constant): UnitConversion {\r\n if (unit.schemaItemType === SchemaItemType.Unit)\r\n return new UnitConversion(unit.denominator / unit.numerator, -unit.offset);\r\n\r\n return new UnitConversion(unit.denominator / unit.numerator, 0.0);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\r\nimport { Graph } from \"./Graph\";\r\n\r\n/** @internal */\r\nexport class GraphUtils {\r\n /**\r\n * DFS traversal - Post order\r\n * @param _graph Graph to traverse\r\n * @param start Starting node\r\n * @param keyFrom Get key from label\r\n * @param op Reducing function\r\n * @param initial Initial label\r\n */\r\n public static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T {\r\n const outEdges = _graph.outEdges(key);\r\n let t = initial;\r\n if (outEdges.length > 0) {\r\n t = outEdges.reduce<T>(\r\n (p, edge) => {\r\n const { v, w } = edge;\r\n const edgeExponent = _graph.edge(v, w).exponent;\r\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\r\n },\r\n t\r\n );\r\n } else {\r\n if (baseUnitsMap.has(key)) {\r\n const oldExponent = baseUnitsMap.get(key)!;\r\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\r\n } else {\r\n baseUnitsMap.set(key, accumulatedExponent);\r\n }\r\n }\r\n\r\n return op(t, key);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class UnitGraph {\r\n private _graph = new Graph<Unit | Constant>();\r\n\r\n constructor(private _context: SchemaContext) {\r\n this._graph.setGraph(\"Unit tree processor\");\r\n }\r\n\r\n /**\r\n * Tries to find the unit/constant given by name in currentSchema\r\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\r\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\r\n */\r\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\r\n let [schemaName] = SchemaItem.parseFullName(name);\r\n const [, schemaItemName] = SchemaItem.parseFullName(name);\r\n\r\n if (schemaName !== \"\") {\r\n // Check if schemaName is schemaName or alias\r\n const ref = currentSchema.getReferenceSync(schemaName);\r\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\r\n if (ref) {\r\n // Got schema by schemaName\r\n schemaName = ref.name;\r\n } else if (refName) {\r\n // Got schema by alias\r\n schemaName = refName;\r\n } else {\r\n // Didn't match any referenced schema, check if it is current schemaName or alias\r\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\r\n schemaName = currentSchema.name;\r\n }\r\n\r\n // Create schema key with schema name\r\n const schemaKey = new SchemaKey(schemaName);\r\n // Get schema with schema key\r\n const schema = await this._context.getSchema(schemaKey);\r\n if (!schema) {\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\r\n return { schema: schemaName };\r\n });\r\n } else {\r\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\r\n currentSchema = schema;\r\n }\r\n // Update name to not have prefix\r\n name = schemaItemName;\r\n }\r\n\r\n // Create schema item key with name and schema\r\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\r\n // Get schema item with schema item key\r\n const item = await this._context.getSchemaItem(itemKey);\r\n if (!item)\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\r\n return { item: name };\r\n });\r\n\r\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\r\n return item as Unit | Constant;\r\n\r\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\r\n return { itemType: item.key.fullName };\r\n });\r\n }\r\n\r\n /**\r\n * Adds unit and corresponding children to graph as well as edges between units\r\n * @param unit Current unit to be added to graph\r\n */\r\n public async addUnit(unit: Unit | Constant): Promise<void> {\r\n if (this._graph.hasNode(unit.key.fullName))\r\n return;\r\n\r\n this._graph.setNode(unit.key.fullName, unit);\r\n if (this.isIdentity(unit))\r\n return;\r\n\r\n const umap = parseDefinition(unit.definition);\r\n\r\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\r\n for (const [key, value] of umap) {\r\n promiseArray.push(\r\n this.resolveUnit(key, unit.schema).then((u) => [u, value])\r\n );\r\n }\r\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\r\n promiseArray\r\n );\r\n\r\n const children = resolved.map(async ([u, def]) => {\r\n await this.addUnit(u);\r\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\r\n exponent: def.exponent,\r\n });\r\n });\r\n\r\n await Promise.all(children);\r\n }\r\n\r\n private isIdentity(unit: Unit | Constant) {\r\n return unit.definition === unit.name;\r\n }\r\n\r\n /**\r\n * Reduce the tree to produce a single map\r\n * @param unit Unit to be processed\r\n * @param stopNodes The tree exploration should stop here\r\n */\r\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\r\n const unitFullName = unit.key.fullName;\r\n const innerMapStore = new Map<string, UnitConversion>();\r\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\r\n return outerMapStore;\r\n }\r\n\r\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\r\n const outEdges = this._graph.outEdges(unitFullName);\r\n if (outEdges) {\r\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\r\n const { exponent } = this._graph.edge(e.v, e.w);\r\n const stored = innermapStore.get(e.w);\r\n const map = stored ? stored : UnitConversion.identity;\r\n const emap = map.raise(exponent);\r\n return pm ? pm.multiply(emap) : emap;\r\n }, undefined);\r\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\r\n const other = cmap || UnitConversion.identity;\r\n const result = other.compose(thisMap);\r\n innermapStore.set(unitFullName, result);\r\n } else {\r\n innermapStore.set(unitFullName, UnitConversion.identity);\r\n }\r\n return innermapStore;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\r\nimport { Graph } from \"./Graph\";\r\n\r\n/** @internal */\r\nexport class GraphUtils {\r\n /**\r\n * DFS traversal - Post order\r\n * @param _graph Graph to traverse\r\n * @param start Starting node\r\n * @param keyFrom Get key from label\r\n * @param op Reducing function\r\n * @param initial Initial label\r\n */\r\n public static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T {\r\n const outEdges = _graph.outEdges(key);\r\n let t = initial;\r\n if (outEdges.length > 0) {\r\n t = outEdges.reduce<T>(\r\n (p, edge) => {\r\n const { v, w } = edge;\r\n const edgeExponent = _graph.edge(v, w).exponent;\r\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\r\n },\r\n t,\r\n );\r\n } else {\r\n if (baseUnitsMap.has(key)) {\r\n const oldExponent = baseUnitsMap.get(key)!;\r\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\r\n } else {\r\n baseUnitsMap.set(key, accumulatedExponent);\r\n }\r\n }\r\n\r\n return op(t, key);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class UnitGraph {\r\n private _graph = new Graph<Unit | Constant>();\r\n\r\n constructor(private _context: SchemaContext) {\r\n this._graph.setGraph(\"Unit tree processor\");\r\n }\r\n\r\n /**\r\n * Tries to find the unit/constant given by name in currentSchema\r\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\r\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\r\n */\r\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\r\n let [schemaName] = SchemaItem.parseFullName(name);\r\n const [, schemaItemName] = SchemaItem.parseFullName(name);\r\n\r\n if (schemaName !== \"\") {\r\n // Check if schemaName is schemaName or alias\r\n const ref = currentSchema.getReferenceSync(schemaName);\r\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\r\n if (ref) {\r\n // Got schema by schemaName\r\n schemaName = ref.name;\r\n } else if (refName) {\r\n // Got schema by alias\r\n schemaName = refName;\r\n } else {\r\n // Didn't match any referenced schema, check if it is current schemaName or alias\r\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\r\n schemaName = currentSchema.name;\r\n }\r\n\r\n // Create schema key with schema name\r\n const schemaKey = new SchemaKey(schemaName);\r\n // Get schema with schema key\r\n const schema = await this._context.getSchema(schemaKey);\r\n if (!schema) {\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\r\n return { schema: schemaName };\r\n });\r\n } else {\r\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\r\n currentSchema = schema;\r\n }\r\n // Update name to not have prefix\r\n name = schemaItemName;\r\n }\r\n\r\n // Create schema item key with name and schema\r\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\r\n // Get schema item with schema item key\r\n const item = await this._context.getSchemaItem(itemKey);\r\n if (!item)\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\r\n return { item: name };\r\n });\r\n\r\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\r\n return item as Unit | Constant;\r\n\r\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\r\n return { itemType: item.key.fullName };\r\n });\r\n }\r\n\r\n /**\r\n * Adds unit and corresponding children to graph as well as edges between units\r\n * @param unit Current unit to be added to graph\r\n */\r\n public async addUnit(unit: Unit | Constant): Promise<void> {\r\n if (this._graph.hasNode(unit.key.fullName))\r\n return;\r\n\r\n this._graph.setNode(unit.key.fullName, unit);\r\n if (this.isIdentity(unit))\r\n return;\r\n\r\n const umap = parseDefinition(unit.definition);\r\n\r\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\r\n for (const [key, value] of umap) {\r\n promiseArray.push(\r\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\r\n );\r\n }\r\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\r\n promiseArray,\r\n );\r\n\r\n const children = resolved.map(async ([u, def]) => {\r\n await this.addUnit(u);\r\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\r\n exponent: def.exponent,\r\n });\r\n });\r\n\r\n await Promise.all(children);\r\n }\r\n\r\n private isIdentity(unit: Unit | Constant) {\r\n return unit.definition === unit.name;\r\n }\r\n\r\n /**\r\n * Reduce the tree to produce a single map\r\n * @param unit Unit to be processed\r\n * @param stopNodes The tree exploration should stop here\r\n */\r\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\r\n const unitFullName = unit.key.fullName;\r\n const innerMapStore = new Map<string, UnitConversion>();\r\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\r\n return outerMapStore;\r\n }\r\n\r\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\r\n const outEdges = this._graph.outEdges(unitFullName);\r\n if (outEdges) {\r\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\r\n const { exponent } = this._graph.edge(e.v, e.w);\r\n const stored = innermapStore.get(e.w);\r\n const map = stored ? stored : UnitConversion.identity;\r\n const emap = map.raise(exponent);\r\n return pm ? pm.multiply(emap) : emap;\r\n }, undefined);\r\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\r\n const other = cmap || UnitConversion.identity;\r\n const result = other.compose(thisMap);\r\n innermapStore.set(unitFullName, result);\r\n } else {\r\n innermapStore.set(unitFullName, UnitConversion.identity);\r\n }\r\n return innermapStore;\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/ecschema-metadata",
3
- "version": "4.1.0-dev.7",
3
+ "version": "4.1.0-dev.71",
4
4
  "description": "ECObjects core concepts in typescript",
5
5
  "license": "MIT",
6
6
  "main": "lib/cjs/ecschema-metadata.js",
@@ -23,32 +23,32 @@
23
23
  },
24
24
  "devDependencies": {
25
25
  "@bentley/units-schema": "^1.0.5",
26
- "@itwin/eslint-plugin": "^4.0.0-dev.33",
26
+ "@itwin/eslint-plugin": "4.0.0-dev.44",
27
27
  "@types/almost-equal": "1.1.0",
28
28
  "@types/benchmark": "^2.1.0",
29
29
  "@types/chai": "4.3.1",
30
30
  "@types/chai-as-promised": "^7",
31
31
  "@types/mocha": "^8.2.2",
32
- "@types/node": "^18.11.5",
33
- "@types/sinon": "^9.0.0",
32
+ "@types/node": "18.16.1",
33
+ "@types/sinon": "^10.0.15",
34
34
  "@xmldom/xmldom": "~0.8.5",
35
35
  "benchmark": "^2.1.4",
36
36
  "chai": "^4.1.2",
37
37
  "chai-as-promised": "^7",
38
38
  "cpx2": "^3.0.0",
39
- "eslint": "^8.36.0",
39
+ "eslint": "^8.44.0",
40
40
  "mocha": "^10.0.0",
41
41
  "nyc": "^15.1.0",
42
42
  "rimraf": "^3.0.2",
43
- "sinon": "^9.0.2",
43
+ "sinon": "^15.0.4",
44
44
  "typescript": "~5.0.2",
45
- "@itwin/build-tools": "4.1.0-dev.7",
46
- "@itwin/core-bentley": "4.1.0-dev.7",
47
- "@itwin/core-quantity": "4.1.0-dev.7"
45
+ "@itwin/build-tools": "4.1.0-dev.71",
46
+ "@itwin/core-bentley": "4.1.0-dev.71",
47
+ "@itwin/core-quantity": "4.1.0-dev.71"
48
48
  },
49
49
  "peerDependencies": {
50
- "@itwin/core-bentley": "^4.1.0-dev.7",
51
- "@itwin/core-quantity": "^4.1.0-dev.7"
50
+ "@itwin/core-bentley": "^4.1.0-dev.71",
51
+ "@itwin/core-quantity": "^4.1.0-dev.71"
52
52
  },
53
53
  "dependencies": {
54
54
  "almost-equal": "^1.1.0"
@@ -56,37 +56,6 @@
56
56
  "nyc": {
57
57
  "extends": "./node_modules/@itwin/build-tools/.nycrc"
58
58
  },
59
- "eslintConfig": {
60
- "plugins": [
61
- "@itwin"
62
- ],
63
- "extends": "plugin:@itwin/itwinjs-recommended",
64
- "rules": {
65
- "radix": "warn",
66
- "@typescript-eslint/explicit-member-accessibility": "warn",
67
- "@itwin/no-internal-barrel-imports": [
68
- "error",
69
- {
70
- "ignored-barrel-modules": [
71
- "./src/ECObjects.ts"
72
- ]
73
- }
74
- ]
75
- },
76
- "overrides": [
77
- {
78
- "files": [
79
- "*.test.ts",
80
- "*.test.tsx",
81
- "**/test/**/*.ts",
82
- "**/test/**/*.tsx"
83
- ],
84
- "rules": {
85
- "@itwin/no-internal-barrel-imports": "off"
86
- }
87
- }
88
- ]
89
- },
90
59
  "scripts": {
91
60
  "build": "npm run -s build:cjs",
92
61
  "build:cjs": "tsc 1>&2 --outDir lib/cjs && npm run -s copy:test-assets",