@itwin/ecschema-editing 4.6.0-dev.6 → 4.6.0-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/lib/cjs/Differencing/SchemaConflicts.d.ts +2 -2
  2. package/lib/cjs/Differencing/SchemaConflicts.js +1 -1
  3. package/lib/cjs/Differencing/SchemaConflicts.js.map +1 -1
  4. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.d.ts +9 -6
  5. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.d.ts.map +1 -1
  6. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.js +213 -161
  7. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.js.map +1 -1
  8. package/lib/cjs/Differencing/SchemaDifference.d.ts +354 -78
  9. package/lib/cjs/Differencing/SchemaDifference.d.ts.map +1 -1
  10. package/lib/cjs/Differencing/SchemaDifference.js +184 -11
  11. package/lib/cjs/Differencing/SchemaDifference.js.map +1 -1
  12. package/lib/cjs/Editing/Constants.js.map +1 -1
  13. package/lib/cjs/Editing/CustomAttributes.js.map +1 -1
  14. package/lib/cjs/Editing/ECClasses.js.map +1 -1
  15. package/lib/cjs/Editing/Editor.js.map +1 -1
  16. package/lib/cjs/Editing/Entities.js.map +1 -1
  17. package/lib/cjs/Editing/Enumerations.js.map +1 -1
  18. package/lib/cjs/Editing/Formats.js.map +1 -1
  19. package/lib/cjs/Editing/InvertedUnits.js.map +1 -1
  20. package/lib/cjs/Editing/KindOfQuantities.js.map +1 -1
  21. package/lib/cjs/Editing/Mixins.js.map +1 -1
  22. package/lib/cjs/Editing/Mutable/MutableArrayProperty.js.map +1 -1
  23. package/lib/cjs/Editing/Mutable/MutableCAClass.js.map +1 -1
  24. package/lib/cjs/Editing/Mutable/MutableClass.js.map +1 -1
  25. package/lib/cjs/Editing/Mutable/MutableConstant.d.ts +1 -0
  26. package/lib/cjs/Editing/Mutable/MutableConstant.d.ts.map +1 -1
  27. package/lib/cjs/Editing/Mutable/MutableConstant.js.map +1 -1
  28. package/lib/cjs/Editing/Mutable/MutableEntityClass.js.map +1 -1
  29. package/lib/cjs/Editing/Mutable/MutableEnumeration.d.ts +1 -0
  30. package/lib/cjs/Editing/Mutable/MutableEnumeration.d.ts.map +1 -1
  31. package/lib/cjs/Editing/Mutable/MutableEnumeration.js.map +1 -1
  32. package/lib/cjs/Editing/Mutable/MutableFormat.js.map +1 -1
  33. package/lib/cjs/Editing/Mutable/MutableInvertedUnit.js.map +1 -1
  34. package/lib/cjs/Editing/Mutable/MutableKindOfQuantity.d.ts +2 -0
  35. package/lib/cjs/Editing/Mutable/MutableKindOfQuantity.d.ts.map +1 -1
  36. package/lib/cjs/Editing/Mutable/MutableKindOfQuantity.js.map +1 -1
  37. package/lib/cjs/Editing/Mutable/MutableMixin.js.map +1 -1
  38. package/lib/cjs/Editing/Mutable/MutablePhenomenon.d.ts +1 -0
  39. package/lib/cjs/Editing/Mutable/MutablePhenomenon.d.ts.map +1 -1
  40. package/lib/cjs/Editing/Mutable/MutablePhenomenon.js.map +1 -1
  41. package/lib/cjs/Editing/Mutable/MutablePrimitiveOrEnumProperty.js.map +1 -1
  42. package/lib/cjs/Editing/Mutable/MutableProperty.js.map +1 -1
  43. package/lib/cjs/Editing/Mutable/MutablePropertyCategory.d.ts +1 -0
  44. package/lib/cjs/Editing/Mutable/MutablePropertyCategory.d.ts.map +1 -1
  45. package/lib/cjs/Editing/Mutable/MutablePropertyCategory.js.map +1 -1
  46. package/lib/cjs/Editing/Mutable/MutableRelationshipClass.js.map +1 -1
  47. package/lib/cjs/Editing/Mutable/MutableSchema.d.ts +2 -0
  48. package/lib/cjs/Editing/Mutable/MutableSchema.d.ts.map +1 -1
  49. package/lib/cjs/Editing/Mutable/MutableSchema.js.map +1 -1
  50. package/lib/cjs/Editing/Mutable/MutableUnit.js.map +1 -1
  51. package/lib/cjs/Editing/Mutable/MutableUnitSystem.d.ts +1 -0
  52. package/lib/cjs/Editing/Mutable/MutableUnitSystem.d.ts.map +1 -1
  53. package/lib/cjs/Editing/Mutable/MutableUnitSystem.js.map +1 -1
  54. package/lib/cjs/Editing/Phenomena.js.map +1 -1
  55. package/lib/cjs/Editing/PropertyCategories.js.map +1 -1
  56. package/lib/cjs/Editing/RelationshipClasses.js.map +1 -1
  57. package/lib/cjs/Editing/SchemaItems.js.map +1 -1
  58. package/lib/cjs/Editing/Structs.js.map +1 -1
  59. package/lib/cjs/Editing/UnitSystems.js.map +1 -1
  60. package/lib/cjs/Editing/Units.js.map +1 -1
  61. package/lib/cjs/Merging/CAClassMerger.d.ts +4 -7
  62. package/lib/cjs/Merging/CAClassMerger.d.ts.map +1 -1
  63. package/lib/cjs/Merging/CAClassMerger.js +26 -23
  64. package/lib/cjs/Merging/CAClassMerger.js.map +1 -1
  65. package/lib/cjs/Merging/ClassMerger.d.ts +10 -18
  66. package/lib/cjs/Merging/ClassMerger.d.ts.map +1 -1
  67. package/lib/cjs/Merging/ClassMerger.js +148 -155
  68. package/lib/cjs/Merging/ClassMerger.js.map +1 -1
  69. package/lib/cjs/Merging/ConstantMerger.d.ts +4 -8
  70. package/lib/cjs/Merging/ConstantMerger.d.ts.map +1 -1
  71. package/lib/cjs/Merging/ConstantMerger.js +59 -40
  72. package/lib/cjs/Merging/ConstantMerger.js.map +1 -1
  73. package/lib/cjs/Merging/CustomAttributeMerger.d.ts +16 -13
  74. package/lib/cjs/Merging/CustomAttributeMerger.d.ts.map +1 -1
  75. package/lib/cjs/Merging/CustomAttributeMerger.js +66 -34
  76. package/lib/cjs/Merging/CustomAttributeMerger.js.map +1 -1
  77. package/lib/cjs/Merging/EntityClassMerger.d.ts +10 -7
  78. package/lib/cjs/Merging/EntityClassMerger.d.ts.map +1 -1
  79. package/lib/cjs/Merging/EntityClassMerger.js +41 -29
  80. package/lib/cjs/Merging/EntityClassMerger.js.map +1 -1
  81. package/lib/cjs/Merging/EnumerationMerger.d.ts +9 -9
  82. package/lib/cjs/Merging/EnumerationMerger.d.ts.map +1 -1
  83. package/lib/cjs/Merging/EnumerationMerger.js +77 -48
  84. package/lib/cjs/Merging/EnumerationMerger.js.map +1 -1
  85. package/lib/cjs/Merging/KindOfQuantityMerger.d.ts +4 -11
  86. package/lib/cjs/Merging/KindOfQuantityMerger.d.ts.map +1 -1
  87. package/lib/cjs/Merging/KindOfQuantityMerger.js +57 -53
  88. package/lib/cjs/Merging/KindOfQuantityMerger.js.map +1 -1
  89. package/lib/cjs/Merging/MixinMerger.d.ts +4 -7
  90. package/lib/cjs/Merging/MixinMerger.d.ts.map +1 -1
  91. package/lib/cjs/Merging/MixinMerger.js +24 -25
  92. package/lib/cjs/Merging/MixinMerger.js.map +1 -1
  93. package/lib/cjs/Merging/PhenomenonMerger.d.ts +8 -0
  94. package/lib/cjs/Merging/PhenomenonMerger.d.ts.map +1 -0
  95. package/lib/cjs/Merging/PhenomenonMerger.js +37 -0
  96. package/lib/cjs/Merging/PhenomenonMerger.js.map +1 -0
  97. package/lib/cjs/Merging/PropertyCategoryMerger.d.ts +8 -0
  98. package/lib/cjs/Merging/PropertyCategoryMerger.d.ts.map +1 -0
  99. package/lib/cjs/Merging/PropertyCategoryMerger.js +34 -0
  100. package/lib/cjs/Merging/PropertyCategoryMerger.js.map +1 -0
  101. package/lib/cjs/Merging/PropertyMerger.d.ts +6 -14
  102. package/lib/cjs/Merging/PropertyMerger.d.ts.map +1 -1
  103. package/lib/cjs/Merging/PropertyMerger.js +212 -287
  104. package/lib/cjs/Merging/PropertyMerger.js.map +1 -1
  105. package/lib/cjs/Merging/RelationshipClassMerger.d.ts +16 -10
  106. package/lib/cjs/Merging/RelationshipClassMerger.d.ts.map +1 -1
  107. package/lib/cjs/Merging/RelationshipClassMerger.js +121 -112
  108. package/lib/cjs/Merging/RelationshipClassMerger.js.map +1 -1
  109. package/lib/cjs/Merging/SchemaItemMerger.d.ts +26 -51
  110. package/lib/cjs/Merging/SchemaItemMerger.d.ts.map +1 -1
  111. package/lib/cjs/Merging/SchemaItemMerger.js +106 -88
  112. package/lib/cjs/Merging/SchemaItemMerger.js.map +1 -1
  113. package/lib/cjs/Merging/SchemaMerger.d.ts +21 -9
  114. package/lib/cjs/Merging/SchemaMerger.d.ts.map +1 -1
  115. package/lib/cjs/Merging/SchemaMerger.js +74 -88
  116. package/lib/cjs/Merging/SchemaMerger.js.map +1 -1
  117. package/lib/cjs/Merging/SchemaReferenceMerger.d.ts +5 -5
  118. package/lib/cjs/Merging/SchemaReferenceMerger.d.ts.map +1 -1
  119. package/lib/cjs/Merging/SchemaReferenceMerger.js +33 -15
  120. package/lib/cjs/Merging/SchemaReferenceMerger.js.map +1 -1
  121. package/lib/cjs/Merging/UnitSystemMerger.d.ts +8 -0
  122. package/lib/cjs/Merging/UnitSystemMerger.d.ts.map +1 -0
  123. package/lib/cjs/Merging/UnitSystemMerger.js +26 -0
  124. package/lib/cjs/Merging/UnitSystemMerger.js.map +1 -0
  125. package/lib/cjs/Validation/Diagnostic.js.map +1 -1
  126. package/lib/cjs/Validation/DiagnosticReporter.js.map +1 -1
  127. package/lib/cjs/Validation/ECRules.d.ts +23 -23
  128. package/lib/cjs/Validation/ECRules.d.ts.map +1 -1
  129. package/lib/cjs/Validation/ECRules.js +1 -1
  130. package/lib/cjs/Validation/ECRules.js.map +1 -1
  131. package/lib/cjs/Validation/LoggingDiagnosticReporter.js.map +1 -1
  132. package/lib/cjs/Validation/RuleSuppressionSet.js.map +1 -1
  133. package/lib/cjs/Validation/Rules.js.map +1 -1
  134. package/lib/cjs/Validation/SchemaChanges.js +1 -1
  135. package/lib/cjs/Validation/SchemaChanges.js.map +1 -1
  136. package/lib/cjs/Validation/SchemaCompareDiagnostics.js.map +1 -1
  137. package/lib/cjs/Validation/SchemaCompareReporter.js.map +1 -1
  138. package/lib/cjs/Validation/SchemaCompareResultDelegate.js.map +1 -1
  139. package/lib/cjs/Validation/SchemaCompareVisitor.js.map +1 -1
  140. package/lib/cjs/Validation/SchemaComparer.d.ts.map +1 -1
  141. package/lib/cjs/Validation/SchemaComparer.js +3 -3
  142. package/lib/cjs/Validation/SchemaComparer.js.map +1 -1
  143. package/lib/cjs/Validation/SchemaValidater.js.map +1 -1
  144. package/lib/cjs/Validation/SchemaValidationVisitor.js.map +1 -1
  145. package/lib/cjs/Validation/SchemaWalker.js.map +1 -1
  146. package/lib/cjs/ecschema-editing.js.map +1 -1
  147. package/package.json +9 -9
  148. package/public/locales/en/ECSchemaEditing.json +26 -26
  149. package/lib/cjs/Merging/SchemaItemFactory.d.ts +0 -15
  150. package/lib/cjs/Merging/SchemaItemFactory.d.ts.map +0 -1
  151. package/lib/cjs/Merging/SchemaItemFactory.js +0 -82
  152. package/lib/cjs/Merging/SchemaItemFactory.js.map +0 -1
  153. package/lib/cjs/Merging/StructClassMerger.d.ts +0 -10
  154. package/lib/cjs/Merging/StructClassMerger.d.ts.map +0 -1
  155. package/lib/cjs/Merging/StructClassMerger.js +0 -13
  156. package/lib/cjs/Merging/StructClassMerger.js.map +0 -1
@@ -1,180 +1,173 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClassMerger = void 0;
4
- /*---------------------------------------------------------------------------------------------
5
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
- * See LICENSE.md in the project root for license terms and full copyright notice.
7
- *--------------------------------------------------------------------------------------------*/
3
+ exports.modifyClass = exports.mergeClassItems = void 0;
4
+ const SchemaDifference_1 = require("../Differencing/SchemaDifference");
5
+ const SchemaItemMerger_1 = require("./SchemaItemMerger");
8
6
  const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
9
- const SchemaChanges_1 = require("../Validation/SchemaChanges");
10
- const CustomAttributeMerger_1 = require("./CustomAttributeMerger");
7
+ const EntityClassMerger_1 = require("./EntityClassMerger");
8
+ const CAClassMerger_1 = require("./CAClassMerger");
9
+ const MixinMerger_1 = require("./MixinMerger");
10
+ const RelationshipClassMerger_1 = require("./RelationshipClassMerger");
11
11
  const PropertyMerger_1 = require("./PropertyMerger");
12
+ const CustomAttributeMerger_1 = require("./CustomAttributeMerger");
12
13
  /**
13
14
  * @internal
14
15
  */
15
- class ClassMerger {
16
- constructor(context) {
17
- this.context = context;
18
- }
19
- async create(_schemaKey, ecClass) {
20
- return { errorMessage: `${(0, ecschema_metadata_1.schemaItemTypeToString)(ecClass.schemaItemType)} class type is not implemented.` };
21
- }
22
- async merge(itemKey, _change) {
23
- return { itemKey };
24
- }
25
- async mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue) {
26
- const mutableClass = ecClass;
27
- switch (attributeName) {
28
- case "schemaItemType":
29
- if (attributeOldValue !== undefined && attributeOldValue !== attributeNewValue) {
30
- return { errorMessage: `Changing the class '${ecClass.name}' type is not supported.` };
31
- }
32
- return true;
33
- case "label":
34
- mutableClass.setDisplayLabel(attributeNewValue);
35
- return true;
36
- case "description":
37
- mutableClass.setDescription(attributeNewValue);
38
- return true;
39
- case "modifier":
40
- const modifier = (0, ecschema_metadata_1.parseClassModifier)(attributeNewValue);
41
- if (modifier === undefined) {
42
- return { errorMessage: "An invalid class modifier has been provided." };
43
- }
44
- if (attributeOldValue === undefined || modifier === ecschema_metadata_1.ECClassModifier.None) {
45
- mutableClass.setModifier(modifier);
46
- return true;
47
- }
48
- return { errorMessage: `Changing the class '${ecClass.name}' modifier is not supported.` };
16
+ async function* mergeClassItems(context, classChanges) {
17
+ // In the first pass all class items will be created as stubs. That only applies to added entities.
18
+ await iterateClassChanges(classChanges, async (change, merger) => {
19
+ if (change.changeType === "add" && merger.add) {
20
+ // Make a copy of the change instance, we don't want to alter the actual instance.
21
+ const changeCopy = {
22
+ ...change,
23
+ difference: {
24
+ ...change.difference,
25
+ // Remove everything we want to validate before setting
26
+ baseClass: undefined,
27
+ mixins: undefined,
28
+ properties: undefined,
29
+ customAttributes: undefined,
30
+ },
31
+ };
32
+ await merger.add(context, changeCopy);
49
33
  }
50
- return false;
51
- }
52
- isSchemaItemEditResults(obj) {
53
- return typeof obj === "object" && "errorMessage" in obj;
54
- }
55
- async setBaseClass(itemKey, baseClassDelta, changeType) {
56
- const [sourceBaseClass, targetBaseClass] = baseClassDelta.diagnostic.messageArgs;
57
- if (sourceBaseClass !== undefined) {
58
- const baseClassKey = new ecschema_metadata_1.SchemaItemKey(sourceBaseClass.name, sourceBaseClass.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)
59
- ? this.context.targetSchema.schemaKey
60
- : sourceBaseClass.schema.schemaKey);
61
- if (changeType === SchemaChanges_1.ChangeType.Missing && targetBaseClass === undefined) {
62
- if (sourceBaseClass.schemaItemType === ecschema_metadata_1.SchemaItemType.EntityClass) {
63
- return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);
64
- }
65
- else if (sourceBaseClass.schemaItemType === ecschema_metadata_1.SchemaItemType.Mixin) {
66
- return this.context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);
67
- }
68
- }
69
- if (targetBaseClass !== undefined) {
70
- const baseClass = await this.context.targetSchema.lookupItem(baseClassKey);
71
- if (baseClass === undefined) {
72
- return { errorMessage: `'${baseClassKey.name}' class could not be located in the merged schema.` };
73
- }
74
- if (await baseClass.is(targetBaseClass)) {
75
- if (baseClass.schemaItemType === ecschema_metadata_1.SchemaItemType.EntityClass) {
76
- return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);
77
- }
78
- else if (baseClass.schemaItemType === ecschema_metadata_1.SchemaItemType.Mixin) {
79
- return this.context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);
80
- }
81
- }
34
+ });
35
+ // In the second pass the base classes and mixins get merged. At that add-changes are
36
+ // effectively modify changes now, as the items has been created in the first pass.
37
+ await iterateClassChanges(classChanges, async (change, merger) => {
38
+ if (merger.modify) {
39
+ const schemaItem = await (0, SchemaItemMerger_1.locateSchemaItem)(context, change.itemName, change.schemaType);
40
+ const result = await merger.modify(context, change, schemaItem.key, schemaItem);
41
+ if (result.errorMessage) {
42
+ throw new Error(result.errorMessage);
82
43
  }
83
44
  }
84
- return { errorMessage: `Changing the class '${itemKey.name}' baseClass is not supported.` };
45
+ });
46
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isEntityClassMixinDifference)) {
47
+ const result = await (0, EntityClassMerger_1.mergeClassMixins)(context, difference);
48
+ if (result.errorMessage) {
49
+ throw new Error(result.errorMessage);
50
+ }
85
51
  }
86
- async mergeAttributeValueChanges(itemKey, propertyValueChanges) {
87
- if (propertyValueChanges.length > 0) {
88
- const targetItem = await this.context.targetSchema.lookupItem(itemKey);
89
- if (targetItem === undefined) {
90
- return { errorMessage: `'${itemKey.name}' class could not be located in the merged schema.` };
91
- }
92
- for (const change of propertyValueChanges) {
93
- const [attributeName, attributeNewValue, attributeOldValue] = change.diagnostic.messageArgs;
94
- const results = await this.mergeAttributes(targetItem, attributeName, attributeNewValue, attributeOldValue);
95
- if (this.isSchemaItemEditResults(results) && results.errorMessage !== undefined) {
96
- return results;
97
- }
98
- }
52
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isRelationshipConstraintDifference)) {
53
+ const result = await (0, RelationshipClassMerger_1.mergeRelationshipConstraint)(context, difference);
54
+ if (result.errorMessage) {
55
+ throw new Error(result.errorMessage);
99
56
  }
100
- return { itemKey };
101
57
  }
102
- async handleError(callback) {
103
- const result = await callback;
58
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isRelationshipConstraintClassDifference)) {
59
+ const result = await (0, RelationshipClassMerger_1.mergeRelationshipClassConstraint)(context, difference);
104
60
  if (result.errorMessage) {
105
61
  throw new Error(result.errorMessage);
106
62
  }
107
63
  }
108
- async mergePropertyChanges(itemKey, propertyChanges) {
109
- const targetItem = await this.context.targetSchema.lookupItem(itemKey);
110
- if (targetItem === undefined) {
111
- return { itemKey, errorMessage: `'${itemKey.name}' class could not be located in the merged schema.` };
64
+ // At last step the properties that are added to existing classes or modified.
65
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isClassPropertyDifference)) {
66
+ const result = await (0, PropertyMerger_1.mergePropertyDifference)(context, difference);
67
+ if (result.errorMessage) {
68
+ throw new Error(result.errorMessage);
112
69
  }
113
- for (const change of propertyChanges) {
114
- if (change.propertyMissing?.changeType === SchemaChanges_1.ChangeType.Missing) {
115
- if (await targetItem.getProperty(change.ecTypeName) !== undefined) {
116
- return { itemKey, errorMessage: `Merged schema already contains a class '${itemKey.name}' property '${change.ecTypeName}'.` };
117
- }
118
- const sourceProperty = change.propertyMissing.diagnostic.ecDefinition;
119
- const results = await (0, PropertyMerger_1.createPropertyFromProps)(this.context, itemKey, sourceProperty);
120
- if (results.errorMessage !== undefined) {
121
- return { itemKey, errorMessage: results.errorMessage };
122
- }
123
- }
124
- else {
125
- const targetProperty = (await targetItem.getProperty(change.ecTypeName));
126
- const results = await (0, PropertyMerger_1.mergePropertyAttributeValueChanges)(this.context, targetProperty, change.propertyValueChanges);
127
- if (results.errorMessage !== undefined) {
128
- return { itemKey, errorMessage: results.errorMessage };
129
- }
130
- }
131
- const mergeResults = await (0, CustomAttributeMerger_1.mergeCustomAttributes)(this.context, change.customAttributeChanges.values(), async (ca) => {
132
- return this.context.editor.entities.addCustomAttributeToProperty(itemKey, change.ecTypeName, ca);
133
- });
134
- if (mergeResults.errorMessage !== undefined) {
135
- return { itemKey, errorMessage: mergeResults.errorMessage };
136
- }
70
+ }
71
+ }
72
+ exports.mergeClassItems = mergeClassItems;
73
+ async function iterateClassChanges(classChanges, handler) {
74
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isCustomAttributeClassDifference)) {
75
+ await handler(difference, CAClassMerger_1.customAttributeClassMerger);
76
+ }
77
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isMixinClassDifference)) {
78
+ await handler(difference, MixinMerger_1.mixinClassMerger);
79
+ }
80
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isStructClassDifference)) {
81
+ await handler(difference, structClassMerger);
82
+ }
83
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isEntityClassDifference)) {
84
+ await handler(difference, EntityClassMerger_1.entityClassMerger);
85
+ }
86
+ for (const difference of classChanges.filter(SchemaDifference_1.SchemaDifference.isRelationshipClassDifference)) {
87
+ await handler(difference, RelationshipClassMerger_1.relationshipClassMerger);
88
+ }
89
+ }
90
+ /**
91
+ * Shared modify merger of all ECClass based items.
92
+ * @internal
93
+ */
94
+ async function modifyClass(context, change, itemKey, item) {
95
+ const mutableClass = item;
96
+ if (change.difference.label !== undefined) {
97
+ mutableClass.setDisplayLabel(change.difference.label);
98
+ }
99
+ if (change.difference.description !== undefined) {
100
+ mutableClass.setDescription(change.difference.description);
101
+ }
102
+ if (change.difference.baseClass !== undefined) {
103
+ const result = await setBaseClass(context, item, change.difference.baseClass, change.changeType === "add");
104
+ if (result.errorMessage) {
105
+ return result;
137
106
  }
138
- return { itemKey };
139
- }
140
- // First pass to create missing changes
141
- static async mergeItemStubChanges(context, classChanges) {
142
- const merger = new this(context);
143
- for (const change of classChanges) {
144
- const sourceItem = (await change.schema.getItem(change.ecTypeName));
145
- const targetItemKey = new ecschema_metadata_1.SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);
146
- const changeType = change.schemaItemMissing?.changeType;
147
- if (changeType === SchemaChanges_1.ChangeType.Missing) {
148
- if (await context.targetSchema.lookupItem(targetItemKey) !== undefined) {
149
- throw new Error(`Merged schema already contains a class '${change.ecTypeName}'.`);
150
- }
151
- await merger.handleError(merger.create(context.targetSchema.schemaKey, sourceItem));
152
- }
107
+ }
108
+ if (change.difference.modifier !== undefined) {
109
+ const result = await setClassModifier(mutableClass, change.difference.modifier);
110
+ if (result.errorMessage) {
111
+ return result;
153
112
  }
154
113
  }
155
- // 2nd pass to merge baseClass, properties, mixins and CA.
156
- static async mergeItemContentChanges(context, classChanges) {
157
- const merger = new this(context);
158
- for (const change of classChanges) {
159
- const targetItemKey = new ecschema_metadata_1.SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);
160
- const changeType = change.schemaItemMissing?.changeType;
161
- if (change.baseClassDelta !== undefined) {
162
- await merger.handleError(merger.setBaseClass(targetItemKey, change.baseClassDelta, changeType));
163
- }
164
- // merge class attributes
165
- await merger.handleError(merger.mergeAttributeValueChanges(targetItemKey, change.propertyValueChanges));
166
- // merge class mixins/constraints/etc
167
- await merger.handleError(merger.merge(targetItemKey, change));
168
- // merge class property attribute values
169
- if (change.propertyChanges.size > 0) {
170
- await merger.handleError(merger.mergePropertyChanges(targetItemKey, change.propertyChanges.values()));
171
- }
172
- // merge custom attributes
173
- await merger.handleError((0, CustomAttributeMerger_1.mergeCustomAttributes)(merger.context, change.customAttributeChanges.values(), async (ca) => {
174
- return merger.context.editor.entities.addCustomAttribute(targetItemKey, ca);
175
- }));
114
+ if (change.difference.customAttributes !== undefined) {
115
+ const result = await (0, CustomAttributeMerger_1.applyCustomAttributes)(context, change.difference.customAttributes, async (ca) => {
116
+ return context.editor.entities.addCustomAttribute(itemKey, ca);
117
+ });
118
+ if (result.errorMessage) {
119
+ return result;
120
+ }
121
+ }
122
+ return (0, PropertyMerger_1.mergeClassProperties)(context, change, itemKey);
123
+ }
124
+ exports.modifyClass = modifyClass;
125
+ async function setBaseClass(context, item, baseClass, isInitial) {
126
+ const baseClassKey = await (0, SchemaItemMerger_1.updateSchemaItemKey)(context, baseClass);
127
+ const baseClassSetter = getBaseClassSetter(context, item);
128
+ if (isInitial && item.baseClass === undefined) {
129
+ return baseClassSetter(item.key, baseClassKey);
130
+ }
131
+ if (item.baseClass !== undefined) {
132
+ const currentBaseClass = await item.baseClass;
133
+ const newBaseClass = await context.editor.schemaContext.getSchemaItem(baseClassKey);
134
+ if (newBaseClass === undefined) {
135
+ return { errorMessage: `'${baseClassKey.name}' class could not be located in the merged schema.` };
136
+ }
137
+ if (await newBaseClass.is(currentBaseClass)) {
138
+ return baseClassSetter(item.key, baseClassKey);
176
139
  }
177
140
  }
141
+ return { errorMessage: `Changing the class '${item.key.name}' baseClass is not supported.` };
142
+ }
143
+ async function setClassModifier(item, modifierValue) {
144
+ const modifier = (0, ecschema_metadata_1.parseClassModifier)(modifierValue);
145
+ if (modifier === undefined) {
146
+ return { errorMessage: "An invalid class modifier has been provided." };
147
+ }
148
+ if (item.modifier === undefined || item.modifier === modifier || modifier === ecschema_metadata_1.ECClassModifier.None) {
149
+ item.setModifier(modifier);
150
+ return {};
151
+ }
152
+ return { errorMessage: `Changing the class '${item.name}' modifier is not supported.` };
153
+ }
154
+ function getBaseClassSetter(context, item) {
155
+ return async (itemKey, baseClassKey) => {
156
+ switch (item.schemaItemType) {
157
+ case ecschema_metadata_1.SchemaItemType.EntityClass: return context.editor.entities.setBaseClass(itemKey, baseClassKey);
158
+ case ecschema_metadata_1.SchemaItemType.Mixin: return context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);
159
+ // TODO: verify; structs and relationship classes can't have base classes?
160
+ }
161
+ return { itemKey, errorMessage: `Changing the base class '${item.name}' is not supported.` };
162
+ };
178
163
  }
179
- exports.ClassMerger = ClassMerger;
164
+ const structClassMerger = {
165
+ async add(context, change) {
166
+ return context.editor.structs.createFromProps(context.targetSchemaKey, {
167
+ name: change.itemName,
168
+ ...change.difference,
169
+ });
170
+ },
171
+ modify: modifyClass,
172
+ };
180
173
  //# sourceMappingURL=ClassMerger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/ClassMerger.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,gEAAoK;AAIpK,+DAA6H;AAC7H,mEAAgE;AAChE,qDAA+F;AAE/F;;GAEG;AACH,MAAa,WAAW;IAGtB,YAAY,OAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAES,KAAK,CAAC,MAAM,CAAC,UAAqB,EAAE,OAAe;QAC3D,OAAO,EAAE,YAAY,EAAE,GAAG,IAAA,0CAAsB,EAAC,OAAO,CAAC,cAAc,CAAC,iCAAiC,EAAC,CAAC;IAC7G,CAAC;IAES,KAAK,CAAC,KAAK,CAAC,OAAsB,EAAE,OAAqB;QACjE,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,aAAqB,EAAE,iBAAsB,EAAE,iBAAsB;QACpH,MAAM,YAAY,GAAG,OAAkC,CAAC;QACxD,QAAO,aAAa,EAAE;YACpB,KAAK,gBAAgB;gBACnB,IAAI,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,KAAK,iBAAiB,EAAE;oBAC9E,OAAO,EAAE,YAAY,EAAE,uBAAuB,OAAO,CAAC,IAAI,0BAA0B,EAAE,CAAC;iBACxF;gBACD,OAAO,IAAI,CAAC;YAEd,KAAK,OAAO;gBACV,YAAY,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC;YAEd,KAAK,aAAa;gBAChB,YAAY,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,OAAO,IAAI,CAAC;YAEd,KAAK,UAAU;gBACb,MAAM,QAAQ,GAAG,IAAA,sCAAkB,EAAC,iBAAiB,CAAC,CAAC;gBACvD,IAAI,QAAQ,KAAK,SAAS,EAAE;oBAC1B,OAAO,EAAE,YAAY,EAAE,8CAA8C,EAAE,CAAC;iBACzE;gBAED,IAAI,iBAAiB,KAAK,SAAS,IAAI,QAAQ,KAAK,mCAAe,CAAC,IAAI,EAAE;oBACxE,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACnC,OAAO,IAAI,CAAC;iBACb;gBACD,OAAO,EAAE,YAAY,EAAE,uBAAuB,OAAO,CAAC,IAAI,8BAA8B,EAAE,CAAC;SAC9F;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAES,uBAAuB,CAAC,GAAQ;QACxC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,cAAc,IAAI,GAAG,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAsB,EAAE,cAA8B,EAAE,UAAuB;QACxG,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,WAAkC,CAAC;QACxG,IAAI,eAAe,KAAK,SAAS,EAAE;YACjC,MAAM,YAAY,GAAG,IAAI,iCAAa,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;gBACxI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;gBACrC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEtC,IAAI,UAAU,KAAK,0BAAU,CAAC,OAAO,IAAI,eAAe,KAAK,SAAS,EAAE;gBACtE,IAAI,eAAe,CAAC,cAAc,KAAK,kCAAc,CAAC,WAAW,EAAE;oBACjE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;iBACzE;qBAAM,IAAI,eAAe,CAAC,cAAc,KAAK,kCAAc,CAAC,KAAK,EAAE;oBAClE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;iBAC5E;aACF;YAED,IAAI,eAAe,KAAK,SAAS,EAAE;gBACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAU,YAAY,CAAC,CAAC;gBACpF,IAAI,SAAS,KAAK,SAAS,EAAE;oBAC3B,OAAO,EAAE,YAAY,EAAE,IAAI,YAAY,CAAC,IAAI,oDAAoD,EAAC,CAAC;iBACnG;gBACD,IAAI,MAAM,SAAS,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE;oBACvC,IAAI,SAAS,CAAC,cAAc,KAAK,kCAAc,CAAC,WAAW,EAAE;wBAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;qBACzE;yBAAM,IAAI,SAAS,CAAC,cAAc,KAAK,kCAAc,CAAC,KAAK,EAAE;wBAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;qBAC5E;iBACF;aACF;SACF;QACD,OAAO,EAAE,YAAY,EAAE,uBAAuB,OAAO,CAAC,IAAI,+BAA+B,EAAC,CAAC;IAC7F,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,OAAsB,EAAE,oBAA2C;QAC1G,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YAEnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAS,OAAO,CAAC,CAAC;YAC/E,IAAI,UAAU,KAAK,SAAS,EAAE;gBAC5B,OAAO,EAAE,YAAY,EAAE,IAAI,OAAO,CAAC,IAAI,oDAAoD,EAAE,CAAC;aAC/F;YAED,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE;gBACzC,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,WAAY,CAAC;gBAC7F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;gBAC5G,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;oBAC/E,OAAO,OAAO,CAAC;iBAChB;aACF;SACF;QAED,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAwC;QAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC9B,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACtC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,OAAsB,EAAE,eAA0C;QACnG,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAS,OAAO,CAAC,CAAC;QAC/E,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,OAAO,CAAC,IAAI,oDAAoD,EAAC,CAAC;SACvG;QAED,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE;YACpC,IAAI,MAAM,CAAC,eAAe,EAAE,UAAU,KAAK,0BAAU,CAAC,OAAO,EAAE;gBAC7D,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;oBACjE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,2CAA2C,OAAO,CAAC,IAAI,eAAe,MAAM,CAAC,UAAU,IAAI,EAAC,CAAC;iBAC9H;gBAED,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,YAAmC,CAAC;gBAC7F,MAAM,OAAO,GAAI,MAAM,IAAA,wCAAuB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;gBACtF,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;oBACtC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAG,OAAO,CAAC,YAAY,EAAE,CAAC;iBACzD;aACF;iBAAM;gBACL,MAAM,cAAc,GAAG,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAE,CAAC;gBAC1E,MAAM,OAAO,GAAG,MAAM,IAAA,mDAAkC,EAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACpH,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;oBACtC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAG,CAAC;iBACzD;aACF;YAED,MAAM,YAAY,GAAG,MAAM,IAAA,6CAAqB,EAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClH,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,YAAY,KAAK,SAAS,EAAE;gBAC3C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,YAAY,EAAC,CAAC;aAC5D;SACF;QACD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,OAA2B,EAAE,YAAoC;QACxG,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;YACjC,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAU,MAAM,CAAC,UAAU,CAAC,CAAE,CAAC;YAC9E,MAAM,aAAa,GAAG,IAAI,iCAAa,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;YAExD,IAAI,UAAU,KAAK,0BAAU,CAAC,OAAO,EAAE;gBAErC,IAAI,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAU,aAAa,CAAC,KAAK,SAAS,EAAE;oBAC/E,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;iBACnF;gBAED,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;aACrF;SACF;IACH,CAAC;IAED,0DAA0D;IACnD,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAA2B,EAAE,YAAoC;QAC3G,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;YACjC,MAAM,aAAa,GAAG,IAAI,iCAAa,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;YAExD,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE;gBACvC,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;aACjG;YAED,yBAAyB;YACzB,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,0BAA0B,CAAC,aAAa,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAExG,qCAAqC;YACrC,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YAE9D,wCAAwC;YACxC,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE;gBACnC,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aACvG;YAED,0BAA0B;YAC1B,MAAM,MAAM,CAAC,WAAW,CAAC,IAAA,6CAAqB,EAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClH,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC,CAAC;SACL;IACH,CAAC;CACF;AAlMD,kCAkMC","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 { ECClass, ECClassModifier, parseClassModifier, Property, SchemaItemKey, SchemaItemType, schemaItemTypeToString, SchemaKey } from \"@itwin/ecschema-metadata\";\r\nimport { SchemaItemEditResults } from \"../Editing/Editor\";\r\nimport { MutableClass } from \"../Editing/Mutable/MutableClass\";\r\nimport { SchemaMergeContext } from \"./SchemaMerger\";\r\nimport { BaseClassDelta, ChangeType, ClassChanges, PropertyChanges, PropertyValueChange } from \"../Validation/SchemaChanges\";\r\nimport { mergeCustomAttributes } from \"./CustomAttributeMerger\";\r\nimport { createPropertyFromProps, mergePropertyAttributeValueChanges } from \"./PropertyMerger\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ClassMerger<TClass extends ECClass> {\r\n protected readonly context: SchemaMergeContext;\r\n\r\n constructor(context: SchemaMergeContext) {\r\n this.context = context;\r\n }\r\n\r\n protected async create(_schemaKey: SchemaKey, ecClass: TClass): Promise<SchemaItemEditResults> {\r\n return { errorMessage: `${schemaItemTypeToString(ecClass.schemaItemType)} class type is not implemented.`};\r\n }\r\n\r\n protected async merge(itemKey: SchemaItemKey, _change: ClassChanges): Promise<SchemaItemEditResults> {\r\n return { itemKey };\r\n }\r\n\r\n protected async mergeAttributes(ecClass: TClass, attributeName: string, attributeNewValue: any, attributeOldValue: any): Promise<SchemaItemEditResults | boolean> {\r\n const mutableClass = ecClass as unknown as MutableClass;\r\n switch(attributeName) {\r\n case \"schemaItemType\":\r\n if (attributeOldValue !== undefined && attributeOldValue !== attributeNewValue) {\r\n return { errorMessage: `Changing the class '${ecClass.name}' type is not supported.` };\r\n }\r\n return true;\r\n\r\n case \"label\":\r\n mutableClass.setDisplayLabel(attributeNewValue);\r\n return true;\r\n\r\n case \"description\":\r\n mutableClass.setDescription(attributeNewValue);\r\n return true;\r\n\r\n case \"modifier\":\r\n const modifier = parseClassModifier(attributeNewValue);\r\n if (modifier === undefined) {\r\n return { errorMessage: \"An invalid class modifier has been provided.\" };\r\n }\r\n\r\n if (attributeOldValue === undefined || modifier === ECClassModifier.None) {\r\n mutableClass.setModifier(modifier);\r\n return true;\r\n }\r\n return { errorMessage: `Changing the class '${ecClass.name}' modifier is not supported.` };\r\n }\r\n return false;\r\n }\r\n\r\n protected isSchemaItemEditResults(obj: any): obj is SchemaItemEditResults {\r\n return typeof obj === \"object\" && \"errorMessage\" in obj;\r\n }\r\n\r\n private async setBaseClass(itemKey: SchemaItemKey, baseClassDelta: BaseClassDelta, changeType?: ChangeType): Promise<SchemaItemEditResults> {\r\n const [sourceBaseClass, targetBaseClass] = baseClassDelta.diagnostic.messageArgs! as [ECClass, ECClass];\r\n if (sourceBaseClass !== undefined) {\r\n const baseClassKey = new SchemaItemKey(sourceBaseClass.name, sourceBaseClass.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)\r\n ? this.context.targetSchema.schemaKey\r\n : sourceBaseClass.schema.schemaKey);\r\n\r\n if (changeType === ChangeType.Missing && targetBaseClass === undefined) {\r\n if (sourceBaseClass.schemaItemType === SchemaItemType.EntityClass) {\r\n return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);\r\n } else if (sourceBaseClass.schemaItemType === SchemaItemType.Mixin) {\r\n return this.context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);\r\n }\r\n }\r\n\r\n if (targetBaseClass !== undefined) {\r\n const baseClass = await this.context.targetSchema.lookupItem<ECClass>(baseClassKey);\r\n if (baseClass === undefined) {\r\n return { errorMessage: `'${baseClassKey.name}' class could not be located in the merged schema.`};\r\n }\r\n if (await baseClass.is(targetBaseClass)) {\r\n if (baseClass.schemaItemType === SchemaItemType.EntityClass) {\r\n return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);\r\n } else if (baseClass.schemaItemType === SchemaItemType.Mixin) {\r\n return this.context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);\r\n }\r\n }\r\n }\r\n }\r\n return { errorMessage: `Changing the class '${itemKey.name}' baseClass is not supported.`};\r\n }\r\n\r\n private async mergeAttributeValueChanges(itemKey: SchemaItemKey, propertyValueChanges: PropertyValueChange[]): Promise<SchemaItemEditResults> {\r\n if (propertyValueChanges.length > 0) {\r\n\r\n const targetItem = await this.context.targetSchema.lookupItem<TClass>(itemKey);\r\n if (targetItem === undefined) {\r\n return { errorMessage: `'${itemKey.name}' class could not be located in the merged schema.` };\r\n }\r\n\r\n for (const change of propertyValueChanges) {\r\n const [attributeName, attributeNewValue, attributeOldValue] = change.diagnostic.messageArgs!;\r\n const results = await this.mergeAttributes(targetItem, attributeName, attributeNewValue, attributeOldValue);\r\n if (this.isSchemaItemEditResults(results) && results.errorMessage !== undefined) {\r\n return results;\r\n }\r\n }\r\n }\r\n\r\n return { itemKey };\r\n }\r\n\r\n private async handleError(callback: Promise<SchemaItemEditResults>) {\r\n const result = await callback;\r\n if (result.errorMessage) {\r\n throw new Error(result.errorMessage);\r\n }\r\n }\r\n\r\n private async mergePropertyChanges(itemKey: SchemaItemKey, propertyChanges: Iterable<PropertyChanges>): Promise<SchemaItemEditResults> {\r\n const targetItem = await this.context.targetSchema.lookupItem<TClass>(itemKey);\r\n if (targetItem === undefined) {\r\n return { itemKey, errorMessage: `'${itemKey.name}' class could not be located in the merged schema.`};\r\n }\r\n\r\n for (const change of propertyChanges) {\r\n if (change.propertyMissing?.changeType === ChangeType.Missing) {\r\n if (await targetItem.getProperty(change.ecTypeName) !== undefined) {\r\n return { itemKey, errorMessage: `Merged schema already contains a class '${itemKey.name}' property '${change.ecTypeName}'.`};\r\n }\r\n\r\n const sourceProperty = change.propertyMissing.diagnostic.ecDefinition as unknown as Property;\r\n const results = await createPropertyFromProps(this.context, itemKey, sourceProperty);\r\n if (results.errorMessage !== undefined) {\r\n return { itemKey, errorMessage: results.errorMessage };\r\n }\r\n } else {\r\n const targetProperty = (await targetItem.getProperty(change.ecTypeName))!;\r\n const results = await mergePropertyAttributeValueChanges(this.context, targetProperty, change.propertyValueChanges);\r\n if (results.errorMessage !== undefined) {\r\n return { itemKey, errorMessage: results.errorMessage };\r\n }\r\n }\r\n\r\n const mergeResults = await mergeCustomAttributes(this.context, change.customAttributeChanges.values(), async (ca) => {\r\n return this.context.editor.entities.addCustomAttributeToProperty(itemKey, change.ecTypeName, ca);\r\n });\r\n\r\n if (mergeResults.errorMessage !== undefined) {\r\n return { itemKey, errorMessage: mergeResults.errorMessage};\r\n }\r\n }\r\n return { itemKey };\r\n }\r\n\r\n // First pass to create missing changes\r\n public static async mergeItemStubChanges(context: SchemaMergeContext, classChanges: Iterable<ClassChanges>) {\r\n const merger = new this(context);\r\n\r\n for (const change of classChanges) {\r\n const sourceItem = (await change.schema.getItem<ECClass>(change.ecTypeName))!;\r\n const targetItemKey = new SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);\r\n const changeType = change.schemaItemMissing?.changeType;\r\n\r\n if (changeType === ChangeType.Missing) {\r\n\r\n if (await context.targetSchema.lookupItem<ECClass>(targetItemKey) !== undefined) {\r\n throw new Error(`Merged schema already contains a class '${change.ecTypeName}'.`);\r\n }\r\n\r\n await merger.handleError(merger.create(context.targetSchema.schemaKey, sourceItem));\r\n }\r\n }\r\n }\r\n\r\n // 2nd pass to merge baseClass, properties, mixins and CA.\r\n public static async mergeItemContentChanges(context: SchemaMergeContext, classChanges: Iterable<ClassChanges>){\r\n const merger = new this(context);\r\n for (const change of classChanges) {\r\n const targetItemKey = new SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);\r\n const changeType = change.schemaItemMissing?.changeType;\r\n\r\n if (change.baseClassDelta !== undefined) {\r\n await merger.handleError(merger.setBaseClass(targetItemKey, change.baseClassDelta, changeType));\r\n }\r\n\r\n // merge class attributes\r\n await merger.handleError(merger.mergeAttributeValueChanges(targetItemKey, change.propertyValueChanges));\r\n\r\n // merge class mixins/constraints/etc\r\n await merger.handleError(merger.merge(targetItemKey, change));\r\n\r\n // merge class property attribute values\r\n if (change.propertyChanges.size > 0) {\r\n await merger.handleError(merger.mergePropertyChanges(targetItemKey, change.propertyChanges.values()));\r\n }\r\n\r\n // merge custom attributes\r\n await merger.handleError(mergeCustomAttributes(merger.context, change.customAttributeChanges.values(), async (ca) => {\r\n return merger.context.editor.entities.addCustomAttribute(targetItemKey, ca);\r\n }));\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/ClassMerger.ts"],"names":[],"mappings":";;;AAKA,uEAA2L;AAC3L,yDAAoG;AAEpG,gEAAwI;AAExI,2DAA0E;AAC1E,mDAA6D;AAC7D,+CAAiD;AACjD,uEAAmI;AACnI,qDAAiF;AACjF,mEAAgE;AAIhE;;GAEG;AACI,KAAK,SAAS,CAAC,CAAC,eAAe,CAAC,OAA2B,EAAE,YAAmC;IACrG,mGAAmG;IACnG,MAAM,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/D,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE;YAC7C,kFAAkF;YAClF,MAAM,UAAU,GAAG;gBACjB,GAAG,MAAM;gBACT,UAAU,EAAE;oBACV,GAAG,MAAM,CAAC,UAAU;oBACpB,uDAAuD;oBACvD,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,SAAS;iBAC5B;aACF,CAAC;YACF,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;SACvC;IACH,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,mFAAmF;IACnF,MAAM,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/D,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,MAAM,UAAU,GAAG,MAAM,IAAA,mCAAgB,EAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAChF,IAAI,MAAM,CAAC,YAAY,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;aACtC;SACF;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,4BAA4B,CAAC,EAAE;QAC3F,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAgB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAG,MAAM,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACtC;KACF;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,kCAAkC,CAAC,EAAE;QACjG,MAAM,MAAM,GAAG,MAAM,IAAA,qDAA2B,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACtE,IAAG,MAAM,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACtC;KACF;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,uCAAuC,CAAC,EAAE;QACtG,MAAM,MAAM,GAAG,MAAM,IAAA,0DAAgC,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3E,IAAG,MAAM,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACtC;KACF;IAED,8EAA8E;IAC9E,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,yBAAyB,CAAC,EAAE;QACxF,MAAM,MAAM,GAAG,MAAM,IAAA,wCAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SACtC;KACF;AACH,CAAC;AA5DD,0CA4DC;AAED,KAAK,UAAU,mBAAmB,CAAC,YAAmC,EAAE,OAAyB;IAC/F,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,gCAAgC,CAAC,EAAE;QAC/F,MAAM,OAAO,CAAC,UAAU,EAAE,0CAA0B,CAAC,CAAC;KACvD;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,sBAAsB,CAAC,EAAE;QACrF,MAAM,OAAO,CAAC,UAAU,EAAE,8BAAgB,CAAC,CAAC;KAC7C;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,uBAAuB,CAAC,EAAE;QACtF,MAAM,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;KAC9C;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,uBAAuB,CAAC,EAAE;QACtF,MAAM,OAAO,CAAC,UAAU,EAAE,qCAAiB,CAAC,CAAC;KAC9C;IAED,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,mCAAgB,CAAC,6BAA6B,CAAC,EAAE;QAC5F,MAAM,OAAO,CAAC,UAAU,EAAE,iDAAuB,CAAC,CAAC;KACpD;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,OAA2B,EAAE,MAA2B,EAAE,OAAsB,EAAE,IAAa;IAC/H,MAAM,YAAY,GAAG,IAAoB,CAAC;IAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE;QACzC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KACvD;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE;QAC/C,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;KAC5D;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC;QAC3G,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,OAAO,MAAM,CAAC;SACf;KACF;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,OAAO,MAAM,CAAC;SACf;KACF;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,KAAK,SAAS,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,IAAA,6CAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,gBAAqC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACxH,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,OAAO,MAAM,CAAC;SACf;KACF;IAED,OAAO,IAAA,qCAAoB,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAlCD,kCAkCC;AAED,KAAK,UAAU,YAAY,CAAC,OAA2B,EAAE,IAAa,EAAE,SAAiB,EAAE,SAAkB;IAC3G,MAAM,YAAY,GAAG,MAAM,IAAA,sCAAmB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAC7C,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;KAChD;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAChC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;QAC9C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAU,YAAY,CAAC,CAAC;QAC7F,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,OAAO,EAAE,YAAY,EAAE,IAAI,YAAY,CAAC,IAAI,oDAAoD,EAAE,CAAC;SACpG;QACD,IAAI,MAAM,YAAY,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE;YAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;SAChD;KACF;IACD,OAAO,EAAE,YAAY,EAAE,uBAAuB,IAAI,CAAC,GAAG,CAAC,IAAI,+BAA+B,EAAE,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAkB,EAAE,aAAqB;IACvE,MAAM,QAAQ,GAAG,IAAA,sCAAkB,EAAC,aAAa,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,OAAO,EAAE,YAAY,EAAE,8CAA8C,EAAE,CAAC;KACzE;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,mCAAe,CAAC,IAAI,EAAE;QAClG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC;KACX;IACD,OAAO,EAAE,YAAY,EAAE,uBAAuB,IAAI,CAAC,IAAI,8BAA8B,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA2B,EAAE,IAAa;IACpE,OAAO,KAAK,EAAE,OAAsB,EAAE,YAA2B,EAAE,EAAE;QACnE,QAAQ,IAAI,CAAC,cAAc,EAAE;YAC3B,KAAK,kCAAc,CAAC,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACpG,KAAK,kCAAc,CAAC,KAAK,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACjG,0EAA0E;SAC3E;QACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,4BAA4B,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC;IAC/F,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAmD;IACxE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE;YACrE,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,GAAG,MAAM,CAAC,UAAU;SACrB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,EAAE,WAAW;CACpB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { type SchemaMergeContext } from \"./SchemaMerger\";\nimport { AnySchemaDifference, AnySchemaItemDifference, AnySchemaItemPathDifference, ClassItemDifference, SchemaDifference, StructClassDifference } from \"../Differencing/SchemaDifference\";\nimport { locateSchemaItem, SchemaItemMergerHandler, updateSchemaItemKey } from \"./SchemaItemMerger\";\nimport { type MutableClass } from \"../Editing/Mutable/MutableClass\";\nimport { CustomAttribute, ECClass, ECClassModifier, parseClassModifier, SchemaItemKey, SchemaItemType } from \"@itwin/ecschema-metadata\";\nimport { SchemaEditResults } from \"../Editing/Editor\";\nimport { entityClassMerger, mergeClassMixins } from \"./EntityClassMerger\";\nimport { customAttributeClassMerger } from \"./CAClassMerger\";\nimport { mixinClassMerger } from \"./MixinMerger\";\nimport { mergeRelationshipClassConstraint, mergeRelationshipConstraint, relationshipClassMerger } from \"./RelationshipClassMerger\";\nimport { mergeClassProperties, mergePropertyDifference } from \"./PropertyMerger\";\nimport { applyCustomAttributes } from \"./CustomAttributeMerger\";\n\ntype ClassItemHandler = <T extends AnySchemaItemDifference | AnySchemaItemPathDifference>(change: T, merger: SchemaItemMergerHandler<T>) => Promise<void>;\n\n/**\n * @internal\n */\nexport async function* mergeClassItems(context: SchemaMergeContext, classChanges: AnySchemaDifference[]) {\n // In the first pass all class items will be created as stubs. That only applies to added entities.\n await iterateClassChanges(classChanges, async (change, merger) => {\n if (change.changeType === \"add\" && merger.add) {\n // Make a copy of the change instance, we don't want to alter the actual instance.\n const changeCopy = {\n ...change,\n difference: {\n ...change.difference,\n // Remove everything we want to validate before setting\n baseClass: undefined,\n mixins: undefined,\n properties: undefined,\n customAttributes: undefined,\n },\n };\n await merger.add(context, changeCopy);\n }\n });\n\n // In the second pass the base classes and mixins get merged. At that add-changes are\n // effectively modify changes now, as the items has been created in the first pass.\n await iterateClassChanges(classChanges, async (change, merger) => {\n if (merger.modify) {\n const schemaItem = await locateSchemaItem(context, change.itemName, change.schemaType);\n const result = await merger.modify(context, change, schemaItem.key, schemaItem);\n if (result.errorMessage) {\n throw new Error(result.errorMessage);\n }\n }\n });\n\n for (const difference of classChanges.filter(SchemaDifference.isEntityClassMixinDifference)) {\n const result = await mergeClassMixins(context, difference);\n if(result.errorMessage) {\n throw new Error(result.errorMessage);\n }\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isRelationshipConstraintDifference)) {\n const result = await mergeRelationshipConstraint(context, difference);\n if(result.errorMessage) {\n throw new Error(result.errorMessage);\n }\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isRelationshipConstraintClassDifference)) {\n const result = await mergeRelationshipClassConstraint(context, difference);\n if(result.errorMessage) {\n throw new Error(result.errorMessage);\n }\n }\n\n // At last step the properties that are added to existing classes or modified.\n for (const difference of classChanges.filter(SchemaDifference.isClassPropertyDifference)) {\n const result = await mergePropertyDifference(context, difference);\n if (result.errorMessage) {\n throw new Error(result.errorMessage);\n }\n }\n}\n\nasync function iterateClassChanges(classChanges: AnySchemaDifference[], handler: ClassItemHandler) {\n for (const difference of classChanges.filter(SchemaDifference.isCustomAttributeClassDifference)) {\n await handler(difference, customAttributeClassMerger);\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isMixinClassDifference)) {\n await handler(difference, mixinClassMerger);\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isStructClassDifference)) {\n await handler(difference, structClassMerger);\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isEntityClassDifference)) {\n await handler(difference, entityClassMerger);\n }\n\n for (const difference of classChanges.filter(SchemaDifference.isRelationshipClassDifference)) {\n await handler(difference, relationshipClassMerger);\n }\n}\n\n/**\n * Shared modify merger of all ECClass based items.\n * @internal\n */\nexport async function modifyClass(context: SchemaMergeContext, change: ClassItemDifference, itemKey: SchemaItemKey, item: ECClass): Promise<SchemaEditResults> {\n const mutableClass = item as MutableClass;\n if (change.difference.label !== undefined) {\n mutableClass.setDisplayLabel(change.difference.label);\n }\n\n if (change.difference.description !== undefined) {\n mutableClass.setDescription(change.difference.description);\n }\n\n if (change.difference.baseClass !== undefined) {\n const result = await setBaseClass(context, item, change.difference.baseClass, change.changeType === \"add\");\n if (result.errorMessage) {\n return result;\n }\n }\n\n if (change.difference.modifier !== undefined) {\n const result = await setClassModifier(mutableClass, change.difference.modifier);\n if (result.errorMessage) {\n return result;\n }\n }\n\n if (change.difference.customAttributes !== undefined) {\n const result = await applyCustomAttributes(context, change.difference.customAttributes as CustomAttribute[], async (ca) => {\n return context.editor.entities.addCustomAttribute(itemKey, ca);\n });\n if (result.errorMessage) {\n return result;\n }\n }\n\n return mergeClassProperties(context, change, itemKey);\n}\n\nasync function setBaseClass(context: SchemaMergeContext, item: ECClass, baseClass: string, isInitial: boolean): Promise<SchemaEditResults> {\n const baseClassKey = await updateSchemaItemKey(context, baseClass);\n const baseClassSetter = getBaseClassSetter(context, item);\n if (isInitial && item.baseClass === undefined) {\n return baseClassSetter(item.key, baseClassKey);\n }\n if (item.baseClass !== undefined) {\n const currentBaseClass = await item.baseClass;\n const newBaseClass = await context.editor.schemaContext.getSchemaItem<ECClass>(baseClassKey);\n if (newBaseClass === undefined) {\n return { errorMessage: `'${baseClassKey.name}' class could not be located in the merged schema.` };\n }\n if (await newBaseClass.is(currentBaseClass)) {\n return baseClassSetter(item.key, baseClassKey);\n }\n }\n return { errorMessage: `Changing the class '${item.key.name}' baseClass is not supported.` };\n}\n\nasync function setClassModifier(item: MutableClass, modifierValue: string): Promise<SchemaEditResults> {\n const modifier = parseClassModifier(modifierValue);\n if (modifier === undefined) {\n return { errorMessage: \"An invalid class modifier has been provided.\" };\n }\n if (item.modifier === undefined || item.modifier === modifier || modifier === ECClassModifier.None) {\n item.setModifier(modifier);\n return {};\n }\n return { errorMessage: `Changing the class '${item.name}' modifier is not supported.` };\n}\n\nfunction getBaseClassSetter(context: SchemaMergeContext, item: ECClass) {\n return async (itemKey: SchemaItemKey, baseClassKey: SchemaItemKey) => {\n switch (item.schemaItemType) {\n case SchemaItemType.EntityClass: return context.editor.entities.setBaseClass(itemKey, baseClassKey);\n case SchemaItemType.Mixin: return context.editor.mixins.setMixinBaseClass(itemKey, baseClassKey);\n // TODO: verify; structs and relationship classes can't have base classes?\n }\n return { itemKey, errorMessage: `Changing the base class '${item.name}' is not supported.` };\n };\n}\n\nconst structClassMerger: SchemaItemMergerHandler<StructClassDifference> = {\n async add(context, change) {\n return context.editor.structs.createFromProps(context.targetSchemaKey, {\n name: change.itemName,\n ...change.difference,\n });\n },\n modify: modifyClass,\n};\n"]}
@@ -1,12 +1,8 @@
1
- import { Constant } from "@itwin/ecschema-metadata";
2
- import { PropertyValueResolver, SchemaItemMerger } from "./SchemaItemMerger";
1
+ import { type ConstantDifference } from "../Differencing/SchemaDifference";
2
+ import { type SchemaItemMergerHandler } from "./SchemaItemMerger";
3
3
  /**
4
+ * Defines a merge handler to merge Constant schema items.
4
5
  * @internal
5
6
  */
6
- export default class ConstantsMerger extends SchemaItemMerger<Constant> {
7
- /**
8
- * Creates the property value resolver for [[Constant]] items.
9
- */
10
- protected createPropertyValueResolver(): Promise<PropertyValueResolver<Constant>>;
11
- }
7
+ export declare const constantMerger: SchemaItemMergerHandler<ConstantDifference>;
12
8
  //# sourceMappingURL=ConstantMerger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConstantMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/ConstantMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAc,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB,CAAC,QAAQ,CAAC;IACrE;;OAEG;cACsB,2BAA2B,IAAI,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CA6BjG"}
1
+ {"version":3,"file":"ConstantMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/ConstantMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,KAAK,uBAAuB,EAAuB,MAAM,oBAAoB,CAAC;AAIvF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,uBAAuB,CAAC,kBAAkB,CA2DtE,CAAC"}
@@ -1,47 +1,66 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // /*---------------------------------------------------------------------------------------------
4
- // * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
5
- // * See LICENSE.md in the project root for license terms and full copyright notice.
6
- // *--------------------------------------------------------------------------------------------*/
7
- const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
3
+ exports.constantMerger = void 0;
8
4
  const SchemaItemMerger_1 = require("./SchemaItemMerger");
5
+ const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
9
6
  /**
7
+ * Defines a merge handler to merge Constant schema items.
10
8
  * @internal
11
9
  */
12
- class ConstantsMerger extends SchemaItemMerger_1.SchemaItemMerger {
13
- /**
14
- * Creates the property value resolver for [[Constant]] items.
15
- */
16
- async createPropertyValueResolver() {
17
- return {
18
- phenomenon: (phenomenonFullName, targetItemKey) => {
19
- // There are two options, either the phenomenon was referenced from another
20
- // schema or it is defined in the same schema as the constant to be merged.
21
- // In the latter case, the changes would report a different property value that
22
- // refers to the source schema. So that needs to be changed here.
23
- const [schemaName, phenomenonName] = ecschema_metadata_1.SchemaItem.parseFullName(phenomenonFullName);
24
- if (this.context.targetSchema.getReferenceSync(schemaName) === undefined) {
25
- return `${targetItemKey.schemaName}.${phenomenonName}`;
26
- }
27
- return phenomenonFullName;
28
- },
29
- numerator: (value, targetItemKey) => {
30
- const item = this.context.targetSchema.lookupItemSync(targetItemKey);
31
- if (item !== undefined && item.hasNumerator && item.numerator !== value) {
32
- throw new Error(`Failed to merged, constant numerator conflict: ${value} -> ${item.numerator}`);
33
- }
34
- return value;
35
- },
36
- denominator: (value, targetItemKey) => {
37
- const item = this.context.targetSchema.lookupItemSync(targetItemKey);
38
- if (item !== undefined && item.hasDenominator && item.denominator !== value) {
39
- throw new Error(`Failed to merged, constant denominator conflict: ${value} -> ${item.denominator}`);
40
- }
41
- return value;
42
- },
43
- };
44
- }
45
- }
46
- exports.default = ConstantsMerger;
10
+ exports.constantMerger = {
11
+ async add(context, change) {
12
+ if (change.difference.phenomenon === undefined) {
13
+ return { errorMessage: "Constant must define phenomenon" };
14
+ }
15
+ if (change.difference.definition === undefined) {
16
+ return { errorMessage: "Constant must define definition" };
17
+ }
18
+ // Needs to update the reference from source to target schema.
19
+ const phenomenonKey = await (0, SchemaItemMerger_1.updateSchemaItemKey)(context, change.difference.phenomenon);
20
+ change.difference.phenomenon = phenomenonKey.fullName;
21
+ return context.editor.constants.createFromProps(context.targetSchemaKey, {
22
+ ...change.difference,
23
+ name: change.itemName,
24
+ schemaItemType: change.schemaType,
25
+ phenomenon: change.difference.phenomenon,
26
+ definition: change.difference.definition,
27
+ });
28
+ },
29
+ async modify(context, change, itemKey, item) {
30
+ if (change.difference.label !== undefined) {
31
+ item.setDisplayLabel(change.difference.label);
32
+ }
33
+ if (change.difference.description !== undefined) {
34
+ item.setDescription(change.difference.description);
35
+ }
36
+ // Note: There are no editor methods to modify a constant.
37
+ if (change.difference.definition !== undefined) {
38
+ if (change.difference.definition !== "" && item.definition.toLowerCase() !== change.difference.definition.toLowerCase()) {
39
+ throw new ecschema_metadata_1.ECObjectsError(ecschema_metadata_1.ECObjectsStatus.InvalidECJson, `The Constant ${itemKey.name} has an invalid 'definition' attribute.`);
40
+ }
41
+ item.setDefinition(change.difference.definition);
42
+ }
43
+ if (change.difference.denominator !== undefined) {
44
+ if (item.hasDenominator && item.denominator !== change.difference.denominator) {
45
+ throw new Error(`Failed to merged, constant denominator conflict: ${change.difference.denominator} -> ${item.denominator}`);
46
+ }
47
+ item.setDenominator(change.difference.denominator);
48
+ }
49
+ if (change.difference.numerator !== undefined) {
50
+ if (item.hasNumerator && item.numerator !== change.difference.numerator) {
51
+ throw new Error(`Failed to merged, constant numerator conflict: ${change.difference.numerator} -> ${item.numerator}`);
52
+ }
53
+ item.setNumerator(change.difference.numerator);
54
+ }
55
+ if (change.difference.phenomenon !== undefined) {
56
+ const lookupKey = await (0, SchemaItemMerger_1.updateSchemaItemKey)(context, change.difference.phenomenon);
57
+ const phenomenon = await context.editor.schemaContext.getSchemaItem(lookupKey);
58
+ if (phenomenon === undefined) {
59
+ throw new Error(`Could not find phenomenon ${lookupKey.fullName} in the current context`);
60
+ }
61
+ item.setPhenomenon(new ecschema_metadata_1.DelayedPromiseWithProps(phenomenon.key, async () => phenomenon));
62
+ }
63
+ return { itemKey };
64
+ },
65
+ };
47
66
  //# sourceMappingURL=ConstantMerger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConstantMerger.js","sourceRoot":"","sources":["../../../src/Merging/ConstantMerger.ts"],"names":[],"mappings":";;AAAA,kGAAkG;AAClG,sEAAsE;AACtE,oFAAoF;AACpF,kGAAkG;AAClG,gEAAgE;AAChE,yDAA6E;AAE7E;;GAEG;AACH,MAAqB,eAAgB,SAAQ,mCAA0B;IACrE;;OAEG;IACgB,KAAK,CAAC,2BAA2B;QAClD,OAAO;YACL,UAAU,EAAE,CAAC,kBAAkB,EAAE,aAAa,EAAE,EAAE;gBAChD,2EAA2E;gBAC3E,2EAA2E;gBAC3E,+EAA+E;gBAC/E,iEAAiE;gBACjE,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,8BAAU,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBAClF,IAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;oBACvE,OAAO,GAAG,aAAa,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;iBACxD;gBACD,OAAO,kBAAkB,CAAC;YAC5B,CAAC;YACD,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAW,aAAa,CAAC,CAAC;gBAC/E,IAAG,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;oBACtE,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;iBACjG;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAW,aAAa,CAAC,CAAC;gBAC/E,IAAG,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;oBAC1E,MAAM,IAAI,KAAK,CAAC,oDAAoD,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;iBACrG;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAjCD,kCAiCC","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 { Constant, SchemaItem } from \"@itwin/ecschema-metadata\";\r\nimport { PropertyValueResolver, SchemaItemMerger } from \"./SchemaItemMerger\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport default class ConstantsMerger extends SchemaItemMerger<Constant> {\r\n /**\r\n * Creates the property value resolver for [[Constant]] items.\r\n */\r\n protected override async createPropertyValueResolver(): Promise<PropertyValueResolver<Constant>> {\r\n return {\r\n phenomenon: (phenomenonFullName, targetItemKey) => {\r\n // There are two options, either the phenomenon was referenced from another\r\n // schema or it is defined in the same schema as the constant to be merged.\r\n // In the latter case, the changes would report a different property value that\r\n // refers to the source schema. So that needs to be changed here.\r\n const [schemaName, phenomenonName] = SchemaItem.parseFullName(phenomenonFullName);\r\n if(this.context.targetSchema.getReferenceSync(schemaName) === undefined) {\r\n return `${targetItemKey.schemaName}.${phenomenonName}`;\r\n }\r\n return phenomenonFullName;\r\n },\r\n numerator: (value, targetItemKey) => {\r\n const item = this.context.targetSchema.lookupItemSync<Constant>(targetItemKey);\r\n if(item !== undefined && item.hasNumerator && item.numerator !== value) {\r\n throw new Error(`Failed to merged, constant numerator conflict: ${value} -> ${item.numerator}`);\r\n }\r\n return value;\r\n },\r\n denominator: (value, targetItemKey) => {\r\n const item = this.context.targetSchema.lookupItemSync<Constant>(targetItemKey);\r\n if(item !== undefined && item.hasDenominator && item.denominator !== value) {\r\n throw new Error(`Failed to merged, constant denominator conflict: ${value} -> ${item.denominator}`);\r\n }\r\n return value;\r\n },\r\n };\r\n }\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"ConstantMerger.js","sourceRoot":"","sources":["../../../src/Merging/ConstantMerger.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { type ConstantDifference } from \"../Differencing/SchemaDifference\";\nimport { type SchemaItemMergerHandler, updateSchemaItemKey } from \"./SchemaItemMerger\";\nimport { type MutableConstant } from \"../Editing/Mutable/MutableConstant\";\nimport { DelayedPromiseWithProps, ECObjectsError, ECObjectsStatus, Phenomenon } from \"@itwin/ecschema-metadata\";\n\n/**\n * Defines a merge handler to merge Constant schema items.\n * @internal\n */\nexport const constantMerger: SchemaItemMergerHandler<ConstantDifference> = {\n async add(context, change) {\n if (change.difference.phenomenon === undefined) {\n return { errorMessage: \"Constant must define phenomenon\" };\n }\n if (change.difference.definition === undefined) {\n return { errorMessage: \"Constant must define definition\" };\n }\n\n // Needs to update the reference from source to target schema.\n const phenomenonKey = await updateSchemaItemKey(context, change.difference.phenomenon);\n change.difference.phenomenon = phenomenonKey.fullName;\n\n return context.editor.constants.createFromProps(context.targetSchemaKey, {\n ...change.difference,\n name: change.itemName,\n schemaItemType: change.schemaType,\n phenomenon: change.difference.phenomenon,\n definition: change.difference.definition,\n });\n },\n async modify(context, change, itemKey, item: MutableConstant) {\n if (change.difference.label !== undefined) {\n item.setDisplayLabel(change.difference.label);\n }\n if (change.difference.description !== undefined) {\n item.setDescription(change.difference.description);\n }\n\n // Note: There are no editor methods to modify a constant.\n if (change.difference.definition !== undefined) {\n if (change.difference.definition !== \"\" && item.definition.toLowerCase() !== change.difference.definition.toLowerCase()) {\n throw new ECObjectsError(ECObjectsStatus.InvalidECJson, `The Constant ${itemKey.name} has an invalid 'definition' attribute.`);\n }\n item.setDefinition(change.difference.definition);\n }\n if (change.difference.denominator !== undefined) {\n if (item.hasDenominator && item.denominator !== change.difference.denominator) {\n throw new Error(`Failed to merged, constant denominator conflict: ${change.difference.denominator} -> ${item.denominator}`);\n }\n item.setDenominator(change.difference.denominator);\n }\n if (change.difference.numerator !== undefined) {\n if (item.hasNumerator && item.numerator !== change.difference.numerator) {\n throw new Error(`Failed to merged, constant numerator conflict: ${change.difference.numerator} -> ${item.numerator}`);\n }\n item.setNumerator(change.difference.numerator);\n }\n if (change.difference.phenomenon !== undefined) {\n const lookupKey = await updateSchemaItemKey(context, change.difference.phenomenon);\n const phenomenon = await context.editor.schemaContext.getSchemaItem<Phenomenon>(lookupKey);\n if (phenomenon === undefined) {\n throw new Error(`Could not find phenomenon ${lookupKey.fullName} in the current context`);\n }\n\n item.setPhenomenon(new DelayedPromiseWithProps(phenomenon.key, async () => phenomenon));\n }\n return { itemKey };\n },\n};\n"]}