@itwin/ecschema-editing 4.10.0-dev.0 → 4.10.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/Differencing/SchemaDiagnosticVisitor.d.ts.map +1 -1
- package/lib/cjs/Differencing/SchemaDiagnosticVisitor.js.map +1 -1
- package/lib/cjs/Differencing/SchemaDifference.d.ts +2 -2
- package/lib/cjs/Differencing/SchemaDifference.d.ts.map +1 -1
- package/lib/cjs/Differencing/SchemaDifference.js.map +1 -1
- package/lib/cjs/Differencing/SchemaDifferenceValidator.d.ts.map +1 -1
- package/lib/cjs/Differencing/SchemaDifferenceValidator.js.map +1 -1
- package/lib/cjs/Differencing/SchemaDifferenceVisitor.d.ts +7 -4
- package/lib/cjs/Differencing/SchemaDifferenceVisitor.d.ts.map +1 -1
- package/lib/cjs/Differencing/SchemaDifferenceVisitor.js +28 -25
- package/lib/cjs/Differencing/SchemaDifferenceVisitor.js.map +1 -1
- package/lib/cjs/Differencing/Utils.d.ts +2 -2
- package/lib/cjs/Differencing/Utils.d.ts.map +1 -1
- package/lib/cjs/Differencing/Utils.js.map +1 -1
- package/lib/cjs/Merging/ClassMerger.d.ts +2 -6
- package/lib/cjs/Merging/ClassMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/ClassMerger.js +12 -82
- package/lib/cjs/Merging/ClassMerger.js.map +1 -1
- package/lib/cjs/Merging/ConstantMerger.d.ts +10 -4
- package/lib/cjs/Merging/ConstantMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/ConstantMerger.js +58 -54
- package/lib/cjs/Merging/ConstantMerger.js.map +1 -1
- package/lib/cjs/Merging/CustomAttributeClassMerger.d.ts +14 -0
- package/lib/cjs/Merging/CustomAttributeClassMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/CustomAttributeClassMerger.js +41 -0
- package/lib/cjs/Merging/CustomAttributeClassMerger.js.map +1 -0
- package/lib/cjs/Merging/CustomAttributeMerger.d.ts +2 -6
- package/lib/cjs/Merging/CustomAttributeMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/CustomAttributeMerger.js +39 -48
- package/lib/cjs/Merging/CustomAttributeMerger.js.map +1 -1
- package/lib/cjs/Merging/Edits/RenameEditHandler.d.ts.map +1 -1
- package/lib/cjs/Merging/Edits/RenameEditHandler.js.map +1 -1
- package/lib/cjs/Merging/EntityClassMerger.d.ts +11 -6
- package/lib/cjs/Merging/EntityClassMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/EntityClassMerger.js +32 -32
- package/lib/cjs/Merging/EntityClassMerger.js.map +1 -1
- package/lib/cjs/Merging/EnumerationMerger.d.ts +7 -6
- package/lib/cjs/Merging/EnumerationMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/EnumerationMerger.js +39 -67
- package/lib/cjs/Merging/EnumerationMerger.js.map +1 -1
- package/lib/cjs/Merging/EnumeratorMerger.d.ts +14 -0
- package/lib/cjs/Merging/EnumeratorMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/EnumeratorMerger.js +41 -0
- package/lib/cjs/Merging/EnumeratorMerger.js.map +1 -0
- package/lib/cjs/Merging/KindOfQuantityMerger.d.ts +10 -4
- package/lib/cjs/Merging/KindOfQuantityMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/KindOfQuantityMerger.js +51 -46
- package/lib/cjs/Merging/KindOfQuantityMerger.js.map +1 -1
- package/lib/cjs/Merging/MixinMerger.d.ts +10 -4
- package/lib/cjs/Merging/MixinMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/MixinMerger.js +30 -25
- package/lib/cjs/Merging/MixinMerger.js.map +1 -1
- package/lib/cjs/Merging/PhenomenonMerger.d.ts +10 -4
- package/lib/cjs/Merging/PhenomenonMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/PhenomenonMerger.js +34 -29
- package/lib/cjs/Merging/PhenomenonMerger.js.map +1 -1
- package/lib/cjs/Merging/PropertyCategoryMerger.d.ts +10 -4
- package/lib/cjs/Merging/PropertyCategoryMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/PropertyCategoryMerger.js +30 -27
- package/lib/cjs/Merging/PropertyCategoryMerger.js.map +1 -1
- package/lib/cjs/Merging/PropertyMerger.d.ts +2 -2
- package/lib/cjs/Merging/PropertyMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/PropertyMerger.js +7 -7
- package/lib/cjs/Merging/PropertyMerger.js.map +1 -1
- package/lib/cjs/Merging/RelationshipClassMerger.d.ts +8 -4
- package/lib/cjs/Merging/RelationshipClassMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/RelationshipClassMerger.js +40 -40
- package/lib/cjs/Merging/RelationshipClassMerger.js.map +1 -1
- package/lib/cjs/Merging/SchemaMerger.d.ts +1 -1
- package/lib/cjs/Merging/SchemaMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/SchemaMerger.js +7 -42
- package/lib/cjs/Merging/SchemaMerger.js.map +1 -1
- package/lib/cjs/Merging/SchemaMergingVisitor.d.ts +138 -0
- package/lib/cjs/Merging/SchemaMergingVisitor.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaMergingVisitor.js +309 -0
- package/lib/cjs/Merging/SchemaMergingVisitor.js.map +1 -0
- package/lib/cjs/Merging/SchemaMergingWalker.d.ts +19 -0
- package/lib/cjs/Merging/SchemaMergingWalker.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaMergingWalker.js +62 -0
- package/lib/cjs/Merging/SchemaMergingWalker.js.map +1 -0
- package/lib/cjs/Merging/SchemaReferenceMerger.d.ts +9 -6
- package/lib/cjs/Merging/SchemaReferenceMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/SchemaReferenceMerger.js +28 -37
- package/lib/cjs/Merging/SchemaReferenceMerger.js.map +1 -1
- package/lib/cjs/Merging/StructClassMerger.d.ts +14 -0
- package/lib/cjs/Merging/StructClassMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/StructClassMerger.js +25 -0
- package/lib/cjs/Merging/StructClassMerger.js.map +1 -0
- package/lib/cjs/Merging/UnitSystemMerger.d.ts +10 -4
- package/lib/cjs/Merging/UnitSystemMerger.d.ts.map +1 -1
- package/lib/cjs/Merging/UnitSystemMerger.js +23 -19
- package/lib/cjs/Merging/UnitSystemMerger.js.map +1 -1
- package/lib/cjs/Merging/Utils.d.ts +18 -0
- package/lib/cjs/Merging/Utils.d.ts.map +1 -0
- package/lib/cjs/Merging/Utils.js +56 -0
- package/lib/cjs/Merging/Utils.js.map +1 -0
- package/package.json +9 -9
- package/lib/cjs/Merging/CAClassMerger.d.ts +0 -8
- package/lib/cjs/Merging/CAClassMerger.d.ts.map +0 -1
- package/lib/cjs/Merging/CAClassMerger.js +0 -36
- package/lib/cjs/Merging/CAClassMerger.js.map +0 -1
- package/lib/cjs/Merging/SchemaItemMerger.d.ts +0 -35
- package/lib/cjs/Merging/SchemaItemMerger.d.ts.map +0 -1
- package/lib/cjs/Merging/SchemaItemMerger.js +0 -121
- package/lib/cjs/Merging/SchemaItemMerger.js.map +0 -1
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updateSchemaItemKey = exports.updateSchemaItemFullName = exports.mergeSchemaItems = exports.locateSchemaItem = void 0;
|
|
4
|
-
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
5
|
-
const EnumerationMerger_1 = require("./EnumerationMerger");
|
|
6
|
-
const PhenomenonMerger_1 = require("./PhenomenonMerger");
|
|
7
|
-
const PropertyCategoryMerger_1 = require("./PropertyCategoryMerger");
|
|
8
|
-
const UnitSystemMerger_1 = require("./UnitSystemMerger");
|
|
9
|
-
const KindOfQuantityMerger_1 = require("./KindOfQuantityMerger");
|
|
10
|
-
const ConstantMerger_1 = require("./ConstantMerger");
|
|
11
|
-
const ClassMerger_1 = require("./ClassMerger");
|
|
12
|
-
const Utils = require("../Differencing/Utils");
|
|
13
|
-
/**
|
|
14
|
-
* Handles the merging logic for everything that is same for all schema items such as labels or descriptions
|
|
15
|
-
* @internal
|
|
16
|
-
*/
|
|
17
|
-
async function mergeSchemaItem(context, difference, merger) {
|
|
18
|
-
if (difference.changeType === "add") {
|
|
19
|
-
await merger.add(context, difference);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (difference.changeType === "modify") {
|
|
23
|
-
const schemaItem = await locateSchemaItem(context, difference.itemName, difference.schemaType);
|
|
24
|
-
return merger.modify(context, difference, schemaItem.key, schemaItem);
|
|
25
|
-
}
|
|
26
|
-
throw new Error(`The merger does not support ${difference.changeType} of ${difference.schemaType}.`);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
async function locateSchemaItem(context, itemName, schemaType) {
|
|
32
|
-
const schemaItemKey = new ecschema_metadata_1.SchemaItemKey(itemName, context.targetSchemaKey);
|
|
33
|
-
const schemaItem = await context.editor.schemaContext.getSchemaItem(schemaItemKey);
|
|
34
|
-
if (schemaItem === undefined) {
|
|
35
|
-
throw new ecschema_metadata_1.ECObjectsError(ecschema_metadata_1.ECObjectsStatus.ClassNotFound, `${schemaType} ${schemaItemKey.fullName} not found in schema context.`);
|
|
36
|
-
}
|
|
37
|
-
return schemaItem;
|
|
38
|
-
}
|
|
39
|
-
exports.locateSchemaItem = locateSchemaItem;
|
|
40
|
-
/**
|
|
41
|
-
* Merges the given set of schema items. As schema items may depend or relate with other
|
|
42
|
-
* schema items, the list gets filtered to ensure the items get merged in a certain order.
|
|
43
|
-
* @param context The current merging context.
|
|
44
|
-
* @param differences Set of schema item that differed.
|
|
45
|
-
* @returns An async iterable with the merge result for each schema item.
|
|
46
|
-
* @internal
|
|
47
|
-
*/
|
|
48
|
-
async function* mergeSchemaItems(context, differences) {
|
|
49
|
-
for (const difference of differences.filter(Utils.isUnitSystemDifference)) {
|
|
50
|
-
yield await mergeSchemaItem(context, difference, UnitSystemMerger_1.unitSystemMerger);
|
|
51
|
-
}
|
|
52
|
-
for (const difference of differences.filter(Utils.isPropertyCategoryDifference)) {
|
|
53
|
-
yield await mergeSchemaItem(context, difference, PropertyCategoryMerger_1.propertyCategoryMerger);
|
|
54
|
-
}
|
|
55
|
-
for (const difference of differences.filter(Utils.isEnumerationDifference)) {
|
|
56
|
-
yield await mergeSchemaItem(context, difference, EnumerationMerger_1.enumerationMerger);
|
|
57
|
-
}
|
|
58
|
-
for (const difference of differences.filter(Utils.isEnumeratorDifference)) {
|
|
59
|
-
yield await mergeSchemaItem(context, difference, EnumerationMerger_1.enumeratorMerger);
|
|
60
|
-
}
|
|
61
|
-
for (const difference of differences.filter(Utils.isPhenomenonDifference)) {
|
|
62
|
-
yield await mergeSchemaItem(context, difference, PhenomenonMerger_1.phenomenonMerger);
|
|
63
|
-
}
|
|
64
|
-
// TODO:
|
|
65
|
-
// The following schema items are not supported yet. Mentioned in the processing order:
|
|
66
|
-
// - Unit
|
|
67
|
-
// - Inverted Unit
|
|
68
|
-
// - Format
|
|
69
|
-
for (const difference of differences.filter(Utils.isKindOfQuantityDifference)) {
|
|
70
|
-
yield await mergeSchemaItem(context, difference, KindOfQuantityMerger_1.kindOfQuantityMerger);
|
|
71
|
-
}
|
|
72
|
-
for (const difference of differences.filter(Utils.isConstantDifference)) {
|
|
73
|
-
yield await mergeSchemaItem(context, difference, ConstantMerger_1.constantMerger);
|
|
74
|
-
}
|
|
75
|
-
// Classes are slightly differently merged, since they can refer each other the process
|
|
76
|
-
// uses several stages to merge.
|
|
77
|
-
for await (const classMergeResult of (0, ClassMerger_1.mergeClassItems)(context, differences)) {
|
|
78
|
-
yield classMergeResult;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
exports.mergeSchemaItems = mergeSchemaItems;
|
|
82
|
-
/**
|
|
83
|
-
* Convenience-method around updateSchemaItemKey that returns the full name instead of a SchemaItemKey.
|
|
84
|
-
* @internal
|
|
85
|
-
*/
|
|
86
|
-
async function updateSchemaItemFullName(context, reference) {
|
|
87
|
-
const schemaItemKey = await updateSchemaItemKey(context, reference);
|
|
88
|
-
return schemaItemKey.fullName;
|
|
89
|
-
}
|
|
90
|
-
exports.updateSchemaItemFullName = updateSchemaItemFullName;
|
|
91
|
-
/**
|
|
92
|
-
* Updates the given reference if it refers to a SchemaItem in the source Schema and
|
|
93
|
-
* returns a SchemaItemKey. If any other schema is referred the reference is not change.
|
|
94
|
-
* @internal
|
|
95
|
-
*/
|
|
96
|
-
async function updateSchemaItemKey(context, reference) {
|
|
97
|
-
const [schemaName, itemName] = ecschema_metadata_1.SchemaItem.parseFullName(reference);
|
|
98
|
-
if (context.sourceSchemaKey.compareByName(schemaName)) {
|
|
99
|
-
return resolveSchemaItemKey(context.editor.schemaContext, new ecschema_metadata_1.SchemaItemKey(itemName, context.targetSchemaKey));
|
|
100
|
-
}
|
|
101
|
-
const referencedSchema = await context.targetSchema.getReference(schemaName);
|
|
102
|
-
if (referencedSchema !== undefined) {
|
|
103
|
-
return resolveSchemaItemKey(context.editor.schemaContext, new ecschema_metadata_1.SchemaItemKey(itemName, referencedSchema.schemaKey));
|
|
104
|
-
}
|
|
105
|
-
throw new Error(`Cannot locate referenced schema item ${reference}`);
|
|
106
|
-
}
|
|
107
|
-
exports.updateSchemaItemKey = updateSchemaItemKey;
|
|
108
|
-
/**
|
|
109
|
-
* To support case insensitivity for schema items, the given key is checked if there
|
|
110
|
-
* exists an item for it.
|
|
111
|
-
* @internal
|
|
112
|
-
*/
|
|
113
|
-
async function resolveSchemaItemKey(schemaContext, itemKey) {
|
|
114
|
-
const item = await schemaContext.getSchemaItem(itemKey);
|
|
115
|
-
if (item === undefined) {
|
|
116
|
-
// If the schema item hasn't been created yet, we have to trust the given key is correctly spelled.
|
|
117
|
-
return itemKey;
|
|
118
|
-
}
|
|
119
|
-
return item.key;
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=SchemaItemMerger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaItemMerger.js","sourceRoot":"","sources":["../../../src/Merging/SchemaItemMerger.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 type { SchemaMergeContext } from \"./SchemaMerger\";\r\nimport { AnySchemaDifference, AnySchemaItemDifference, AnySchemaItemPathDifference } from \"../Differencing/SchemaDifference\";\r\nimport { ECObjectsError, ECObjectsStatus, SchemaContext, SchemaItem, SchemaItemKey } from \"@itwin/ecschema-metadata\";\r\nimport { enumerationMerger, enumeratorMerger } from \"./EnumerationMerger\";\r\nimport { phenomenonMerger } from \"./PhenomenonMerger\";\r\nimport { propertyCategoryMerger } from \"./PropertyCategoryMerger\";\r\nimport { unitSystemMerger } from \"./UnitSystemMerger\";\r\nimport { kindOfQuantityMerger } from \"./KindOfQuantityMerger\";\r\nimport { constantMerger } from \"./ConstantMerger\";\r\nimport { mergeClassItems } from \"./ClassMerger\";\r\nimport * as Utils from \"../Differencing/Utils\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface SchemaItemMergerHandler<T extends AnySchemaItemDifference | AnySchemaItemPathDifference> {\r\n add: (context: SchemaMergeContext, difference: T) => Promise<SchemaItemKey>;\r\n modify: (context: SchemaMergeContext, difference: T, itemKey: SchemaItemKey, item: any) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Handles the merging logic for everything that is same for all schema items such as labels or descriptions\r\n * @internal\r\n */\r\nasync function mergeSchemaItem<T extends AnySchemaItemDifference | AnySchemaItemPathDifference>(context: SchemaMergeContext, difference: T, merger: SchemaItemMergerHandler<T>): Promise<void> {\r\n if (difference.changeType === \"add\") {\r\n await merger.add(context, difference);\r\n return;\r\n }\r\n\r\n if (difference.changeType === \"modify\") {\r\n const schemaItem = await locateSchemaItem(context, difference.itemName, difference.schemaType);\r\n return merger.modify(context, difference, schemaItem.key, schemaItem);\r\n }\r\n\r\n throw new Error(`The merger does not support ${difference.changeType} of ${difference.schemaType}.`);\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport async function locateSchemaItem(context: SchemaMergeContext, itemName: string, schemaType: string) {\r\n const schemaItemKey = new SchemaItemKey(itemName, context.targetSchemaKey);\r\n const schemaItem = await context.editor.schemaContext.getSchemaItem(schemaItemKey);\r\n if (schemaItem === undefined) {\r\n throw new ECObjectsError(ECObjectsStatus.ClassNotFound, `${schemaType} ${schemaItemKey.fullName} not found in schema context.`);\r\n }\r\n\r\n return schemaItem;\r\n}\r\n\r\n/**\r\n * Merges the given set of schema items. As schema items may depend or relate with other\r\n * schema items, the list gets filtered to ensure the items get merged in a certain order.\r\n * @param context The current merging context.\r\n * @param differences Set of schema item that differed.\r\n * @returns An async iterable with the merge result for each schema item.\r\n * @internal\r\n */\r\nexport async function* mergeSchemaItems(context: SchemaMergeContext, differences: AnySchemaDifference[]) {\r\n for (const difference of differences.filter(Utils.isUnitSystemDifference)) {\r\n yield await mergeSchemaItem(context, difference, unitSystemMerger);\r\n }\r\n\r\n for (const difference of differences.filter(Utils.isPropertyCategoryDifference)) {\r\n yield await mergeSchemaItem(context, difference, propertyCategoryMerger);\r\n }\r\n\r\n for (const difference of differences.filter(Utils.isEnumerationDifference)) {\r\n yield await mergeSchemaItem(context, difference, enumerationMerger);\r\n }\r\n\r\n for (const difference of differences.filter(Utils.isEnumeratorDifference)) {\r\n yield await mergeSchemaItem(context, difference, enumeratorMerger);\r\n }\r\n\r\n for (const difference of differences.filter(Utils.isPhenomenonDifference)) {\r\n yield await mergeSchemaItem(context, difference, phenomenonMerger);\r\n }\r\n\r\n // TODO:\r\n // The following schema items are not supported yet. Mentioned in the processing order:\r\n // - Unit\r\n // - Inverted Unit\r\n // - Format\r\n\r\n for (const difference of differences.filter(Utils.isKindOfQuantityDifference)) {\r\n yield await mergeSchemaItem(context, difference, kindOfQuantityMerger);\r\n }\r\n\r\n for (const difference of differences.filter(Utils.isConstantDifference)) {\r\n yield await mergeSchemaItem(context, difference, constantMerger);\r\n }\r\n\r\n // Classes are slightly differently merged, since they can refer each other the process\r\n // uses several stages to merge.\r\n for await (const classMergeResult of mergeClassItems(context, differences)) {\r\n yield classMergeResult;\r\n }\r\n}\r\n\r\n/**\r\n * Convenience-method around updateSchemaItemKey that returns the full name instead of a SchemaItemKey.\r\n * @internal\r\n */\r\nexport async function updateSchemaItemFullName(context: SchemaMergeContext, reference: string) {\r\n const schemaItemKey = await updateSchemaItemKey(context, reference);\r\n return schemaItemKey.fullName;\r\n}\r\n\r\n/**\r\n * Updates the given reference if it refers to a SchemaItem in the source Schema and\r\n * returns a SchemaItemKey. If any other schema is referred the reference is not change.\r\n * @internal\r\n */\r\nexport async function updateSchemaItemKey(context: SchemaMergeContext, reference: string) {\r\n const [schemaName, itemName] = SchemaItem.parseFullName(reference);\r\n if (context.sourceSchemaKey.compareByName(schemaName)) {\r\n return resolveSchemaItemKey(context.editor.schemaContext, new SchemaItemKey(itemName, context.targetSchemaKey));\r\n }\r\n\r\n const referencedSchema = await context.targetSchema.getReference(schemaName);\r\n if (referencedSchema !== undefined) {\r\n return resolveSchemaItemKey(context.editor.schemaContext, new SchemaItemKey(itemName, referencedSchema.schemaKey));\r\n }\r\n\r\n throw new Error(`Cannot locate referenced schema item ${reference}`);\r\n}\r\n\r\n/**\r\n * To support case insensitivity for schema items, the given key is checked if there\r\n * exists an item for it.\r\n * @internal\r\n */\r\nasync function resolveSchemaItemKey(schemaContext: SchemaContext, itemKey: SchemaItemKey): Promise<SchemaItemKey> {\r\n const item = await schemaContext.getSchemaItem(itemKey);\r\n if (item === undefined) {\r\n // If the schema item hasn't been created yet, we have to trust the given key is correctly spelled.\r\n return itemKey;\r\n }\r\n return item.key;\r\n}\r\n"]}
|