@itwin/ecschema-editing 4.5.0-dev.3 → 4.5.0-dev.32

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 (80) hide show
  1. package/CHANGELOG.md +47 -1
  2. package/LICENSE.md +1 -1
  3. package/lib/cjs/Differencing/SchemaConflicts.d.ts +76 -0
  4. package/lib/cjs/Differencing/SchemaConflicts.d.ts.map +1 -0
  5. package/lib/cjs/Differencing/SchemaConflicts.js +56 -0
  6. package/lib/cjs/Differencing/SchemaConflicts.js.map +1 -0
  7. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.d.ts +43 -0
  8. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.d.ts.map +1 -0
  9. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.js +501 -0
  10. package/lib/cjs/Differencing/SchemaDiagnosticVisitor.js.map +1 -0
  11. package/lib/cjs/Differencing/SchemaDifference.d.ts +150 -0
  12. package/lib/cjs/Differencing/SchemaDifference.d.ts.map +1 -0
  13. package/lib/cjs/Differencing/SchemaDifference.js +54 -0
  14. package/lib/cjs/Differencing/SchemaDifference.js.map +1 -0
  15. package/lib/cjs/Editing/ECClasses.d.ts +9 -2
  16. package/lib/cjs/Editing/ECClasses.d.ts.map +1 -1
  17. package/lib/cjs/Editing/ECClasses.js +25 -0
  18. package/lib/cjs/Editing/ECClasses.js.map +1 -1
  19. package/lib/cjs/Editing/Entities.d.ts +8 -2
  20. package/lib/cjs/Editing/Entities.d.ts.map +1 -1
  21. package/lib/cjs/Editing/Entities.js +29 -6
  22. package/lib/cjs/Editing/Entities.js.map +1 -1
  23. package/lib/cjs/Editing/Mixins.d.ts +8 -1
  24. package/lib/cjs/Editing/Mixins.d.ts.map +1 -1
  25. package/lib/cjs/Editing/Mixins.js +35 -0
  26. package/lib/cjs/Editing/Mixins.js.map +1 -1
  27. package/lib/cjs/Editing/RelationshipClasses.d.ts +7 -1
  28. package/lib/cjs/Editing/RelationshipClasses.d.ts.map +1 -1
  29. package/lib/cjs/Editing/RelationshipClasses.js +20 -1
  30. package/lib/cjs/Editing/RelationshipClasses.js.map +1 -1
  31. package/lib/cjs/Merging/CAClassMerger.d.ts.map +1 -1
  32. package/lib/cjs/Merging/CAClassMerger.js +1 -5
  33. package/lib/cjs/Merging/CAClassMerger.js.map +1 -1
  34. package/lib/cjs/Merging/ClassMerger.d.ts +6 -4
  35. package/lib/cjs/Merging/ClassMerger.d.ts.map +1 -1
  36. package/lib/cjs/Merging/ClassMerger.js +80 -53
  37. package/lib/cjs/Merging/ClassMerger.js.map +1 -1
  38. package/lib/cjs/Merging/EntityClassMerger.d.ts +3 -2
  39. package/lib/cjs/Merging/EntityClassMerger.d.ts.map +1 -1
  40. package/lib/cjs/Merging/EntityClassMerger.js +22 -7
  41. package/lib/cjs/Merging/EntityClassMerger.js.map +1 -1
  42. package/lib/cjs/Merging/MixinMerger.d.ts.map +1 -1
  43. package/lib/cjs/Merging/MixinMerger.js +1 -5
  44. package/lib/cjs/Merging/MixinMerger.js.map +1 -1
  45. package/lib/cjs/Merging/PropertyMerger.d.ts +21 -0
  46. package/lib/cjs/Merging/PropertyMerger.d.ts.map +1 -0
  47. package/lib/cjs/Merging/PropertyMerger.js +315 -0
  48. package/lib/cjs/Merging/PropertyMerger.js.map +1 -0
  49. package/lib/cjs/Merging/RelationshipClassMerger.d.ts +15 -0
  50. package/lib/cjs/Merging/RelationshipClassMerger.d.ts.map +1 -0
  51. package/lib/cjs/Merging/RelationshipClassMerger.js +132 -0
  52. package/lib/cjs/Merging/RelationshipClassMerger.js.map +1 -0
  53. package/lib/cjs/Merging/SchemaMerger.d.ts.map +1 -1
  54. package/lib/cjs/Merging/SchemaMerger.js +16 -7
  55. package/lib/cjs/Merging/SchemaMerger.js.map +1 -1
  56. package/lib/cjs/ecschema-editing.d.ts +4 -0
  57. package/lib/cjs/ecschema-editing.d.ts.map +1 -1
  58. package/lib/cjs/ecschema-editing.js +4 -0
  59. package/lib/cjs/ecschema-editing.js.map +1 -1
  60. package/package.json +10 -10
  61. package/lib/cjs/Merging/AnyPropertyMerger.d.ts +0 -15
  62. package/lib/cjs/Merging/AnyPropertyMerger.d.ts.map +0 -1
  63. package/lib/cjs/Merging/AnyPropertyMerger.js +0 -71
  64. package/lib/cjs/Merging/AnyPropertyMerger.js.map +0 -1
  65. package/lib/cjs/Merging/ArrayPropertyMerger.d.ts +0 -32
  66. package/lib/cjs/Merging/ArrayPropertyMerger.d.ts.map +0 -1
  67. package/lib/cjs/Merging/ArrayPropertyMerger.js +0 -143
  68. package/lib/cjs/Merging/ArrayPropertyMerger.js.map +0 -1
  69. package/lib/cjs/Merging/ClassPropertyMerger.d.ts +0 -16
  70. package/lib/cjs/Merging/ClassPropertyMerger.d.ts.map +0 -1
  71. package/lib/cjs/Merging/ClassPropertyMerger.js +0 -90
  72. package/lib/cjs/Merging/ClassPropertyMerger.js.map +0 -1
  73. package/lib/cjs/Merging/PrimitiveOrEnumPropertyMerger.d.ts +0 -24
  74. package/lib/cjs/Merging/PrimitiveOrEnumPropertyMerger.d.ts.map +0 -1
  75. package/lib/cjs/Merging/PrimitiveOrEnumPropertyMerger.js +0 -106
  76. package/lib/cjs/Merging/PrimitiveOrEnumPropertyMerger.js.map +0 -1
  77. package/lib/cjs/Merging/StructPropertyMerger.d.ts +0 -11
  78. package/lib/cjs/Merging/StructPropertyMerger.d.ts.map +0 -1
  79. package/lib/cjs/Merging/StructPropertyMerger.js +0 -47
  80. package/lib/cjs/Merging/StructPropertyMerger.js.map +0 -1
@@ -7,8 +7,8 @@ exports.ClassMerger = void 0;
7
7
  *--------------------------------------------------------------------------------------------*/
8
8
  const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
9
9
  const SchemaChanges_1 = require("../Validation/SchemaChanges");
10
- const ClassPropertyMerger_1 = require("./ClassPropertyMerger");
11
10
  const CustomAttributeMerger_1 = require("./CustomAttributeMerger");
11
+ const PropertyMerger_1 = require("./PropertyMerger");
12
12
  /**
13
13
  * @internal
14
14
  */
@@ -19,8 +19,8 @@ class ClassMerger {
19
19
  async create(_schemaKey, ecClass) {
20
20
  return { errorMessage: `${(0, ecschema_metadata_1.schemaItemTypeToString)(ecClass.schemaItemType)} class type is not implemented.` };
21
21
  }
22
- async addMixin(itemKey, mixin) {
23
- return { errorMessage: `Adding mixin '${mixin.name}' to '${itemKey.name}' class is not implemented.` };
22
+ async merge(itemKey, _change) {
23
+ return { itemKey };
24
24
  }
25
25
  async mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue) {
26
26
  const mutableClass = ecClass;
@@ -59,7 +59,12 @@ class ClassMerger {
59
59
  ? this.context.targetSchema.schemaKey
60
60
  : sourceBaseClass.schema.schemaKey);
61
61
  if (changeType === SchemaChanges_1.ChangeType.Missing && targetBaseClass === undefined) {
62
- return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);
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
+ }
63
68
  }
64
69
  if (targetBaseClass !== undefined) {
65
70
  const baseClass = await this.context.targetSchema.lookupItem(baseClassKey);
@@ -67,85 +72,107 @@ class ClassMerger {
67
72
  return { errorMessage: `'${baseClassKey.name}' class could not be located in the merged schema.` };
68
73
  }
69
74
  if (await baseClass.is(targetBaseClass)) {
70
- return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);
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
+ }
71
81
  }
72
82
  }
73
83
  }
74
84
  return { errorMessage: `Changing the class '${itemKey.name}' baseClass is not supported.` };
75
85
  }
76
- async addMixins(itemKey, entityMixinChanges, changeType) {
77
- if (changeType === SchemaChanges_1.ChangeType.Missing) {
78
- for (const entityMixinChange of entityMixinChanges) {
79
- for (const change of entityMixinChange.entityMixinChange) {
80
- const mixins = change.diagnostic.messageArgs;
81
- for (const mixin of mixins) {
82
- const result = await this.addMixin(itemKey, mixin);
83
- if (result.errorMessage !== undefined) {
84
- return result;
85
- }
86
- }
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;
87
97
  }
88
98
  }
89
- return {};
90
99
  }
91
- return { errorMessage: `Changing the class '${itemKey.name}' mixins is not supported.` };
100
+ return { itemKey };
92
101
  }
93
- async mergeAttributeValueChanges(itemKey, propertyValueChanges) {
94
- if (propertyValueChanges.length === 0) {
95
- return;
102
+ async handleError(callback) {
103
+ const result = await callback;
104
+ if (result.errorMessage) {
105
+ throw new Error(result.errorMessage);
96
106
  }
107
+ }
108
+ async mergePropertyChanges(itemKey, propertyChanges) {
97
109
  const targetItem = await this.context.targetSchema.lookupItem(itemKey);
98
110
  if (targetItem === undefined) {
99
- throw new Error(`'${itemKey.name}' class could not be located in the merged schema.`);
111
+ return { itemKey, errorMessage: `'${itemKey.name}' class could not be located in the merged schema.` };
100
112
  }
101
- for (const change of propertyValueChanges) {
102
- const [attributeName, attributeNewValue, attributeOldValue] = change.diagnostic.messageArgs;
103
- const results = await this.mergeAttributes(targetItem, attributeName, attributeNewValue, attributeOldValue);
104
- if (this.isSchemaItemEditResults(results) && results.errorMessage !== undefined) {
105
- throw new Error(results.errorMessage);
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 };
106
136
  }
107
137
  }
138
+ return { itemKey };
108
139
  }
109
- static async mergeChanges(context, classChanges) {
140
+ // First pass to create missing changes
141
+ static async mergeItemStubChanges(context, classChanges) {
110
142
  const merger = new this(context);
111
143
  for (const change of classChanges) {
112
144
  const sourceItem = (await change.schema.getItem(change.ecTypeName));
113
- let targetItemKey = new ecschema_metadata_1.SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);
145
+ const targetItemKey = new ecschema_metadata_1.SchemaItemKey(change.ecTypeName, context.targetSchema.schemaKey);
114
146
  const changeType = change.schemaItemMissing?.changeType;
115
147
  if (changeType === SchemaChanges_1.ChangeType.Missing) {
116
148
  if (await context.targetSchema.lookupItem(targetItemKey) !== undefined) {
117
149
  throw new Error(`Merged schema already contains a class '${change.ecTypeName}'.`);
118
150
  }
119
- const results = await merger.create(context.targetSchema.schemaKey, sourceItem);
120
- if (results.errorMessage !== undefined) {
121
- throw new Error(results.errorMessage);
122
- }
123
- targetItemKey = results.itemKey;
151
+ await merger.handleError(merger.create(context.targetSchema.schemaKey, sourceItem));
124
152
  }
153
+ }
154
+ }
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;
125
161
  if (change.baseClassDelta !== undefined) {
126
- const results = await merger.setBaseClass(targetItemKey, change.baseClassDelta, changeType);
127
- if (results.errorMessage !== undefined) {
128
- throw new Error(results.errorMessage);
129
- }
162
+ await merger.handleError(merger.setBaseClass(targetItemKey, change.baseClassDelta, changeType));
130
163
  }
131
- if (change.entityMixinChanges.size > 0) {
132
- const results = await merger.addMixins(targetItemKey, change.entityMixinChanges.values(), changeType);
133
- if (results.errorMessage !== undefined) {
134
- throw new Error(results.errorMessage);
135
- }
136
- }
137
- await merger.mergeAttributeValueChanges(targetItemKey, change.propertyValueChanges);
138
- let mergeResults = await ClassPropertyMerger_1.ClassPropertyMerger.mergeChanges(context, targetItemKey, change.propertyChanges.values());
139
- if (mergeResults.errorMessage !== undefined) {
140
- throw new Error(mergeResults.errorMessage);
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()));
141
171
  }
142
172
  // merge custom attributes
143
- mergeResults = await (0, CustomAttributeMerger_1.mergeCustomAttributes)(merger.context, change.customAttributeChanges.values(), async (ca) => {
173
+ await merger.handleError((0, CustomAttributeMerger_1.mergeCustomAttributes)(merger.context, change.customAttributeChanges.values(), async (ca) => {
144
174
  return merger.context.editor.entities.addCustomAttribute(targetItemKey, ca);
145
- });
146
- if (mergeResults.errorMessage !== undefined) {
147
- throw new Error(mergeResults.errorMessage);
148
- }
175
+ }));
149
176
  }
150
177
  }
151
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/ClassMerger.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 { ECClass, ECClassModifier, Mixin, parseClassModifier, SchemaItemKey, 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, EntityMixinChanges, PropertyValueChange } from \"../Validation/SchemaChanges\";\r\nimport { ClassPropertyMerger } from \"./ClassPropertyMerger\";\r\nimport { mergeCustomAttributes } from \"./CustomAttributeMerger\";\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 addMixin(itemKey: SchemaItemKey, mixin: Mixin): Promise<SchemaItemEditResults> {\r\n return { errorMessage: `Adding mixin '${mixin.name}' to '${itemKey.name}' class is not implemented.` };\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 return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);\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 return this.context.editor.entities.setBaseClass(itemKey, baseClassKey);\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 addMixins(itemKey: SchemaItemKey, entityMixinChanges: Iterable<EntityMixinChanges>, changeType?: ChangeType): Promise<SchemaItemEditResults> {\r\n if (changeType === ChangeType.Missing) {\r\n for (const entityMixinChange of entityMixinChanges) {\r\n for (const change of entityMixinChange.entityMixinChange) {\r\n const mixins = change.diagnostic.messageArgs! as unknown as [Mixin];\r\n for (const mixin of mixins) {\r\n const result = await this.addMixin(itemKey, mixin);\r\n if (result.errorMessage !== undefined) {\r\n return result;\r\n }\r\n }\r\n }\r\n }\r\n return {};\r\n }\r\n return { errorMessage: `Changing the class '${itemKey.name}' mixins is not supported.`};\r\n }\r\n\r\n private async mergeAttributeValueChanges(itemKey: SchemaItemKey, propertyValueChanges: PropertyValueChange[]) {\r\n if (propertyValueChanges.length === 0) {\r\n return;\r\n }\r\n\r\n const targetItem = await this.context.targetSchema.lookupItem<TClass>(itemKey);\r\n if (targetItem === undefined) {\r\n throw new Error(`'${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 throw new Error(results.errorMessage);\r\n }\r\n }\r\n }\r\n\r\n public static async mergeChanges(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 let 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 const results = await merger.create(context.targetSchema.schemaKey, sourceItem);\r\n if (results.errorMessage !== undefined) {\r\n throw new Error(results.errorMessage);\r\n }\r\n targetItemKey = results.itemKey!;\r\n }\r\n\r\n if (change.baseClassDelta !== undefined) {\r\n const results = await merger.setBaseClass(targetItemKey, change.baseClassDelta, changeType);\r\n if (results.errorMessage !== undefined) {\r\n throw new Error(results.errorMessage);\r\n }\r\n }\r\n\r\n if (change.entityMixinChanges.size > 0) {\r\n const results = await merger.addMixins(targetItemKey, change.entityMixinChanges.values(), changeType);\r\n if (results.errorMessage !== undefined) {\r\n throw new Error(results.errorMessage);\r\n }\r\n }\r\n\r\n await merger.mergeAttributeValueChanges(targetItemKey, change.propertyValueChanges);\r\n let mergeResults = await ClassPropertyMerger.mergeChanges(context, targetItemKey, change.propertyChanges.values());\r\n if (mergeResults.errorMessage !== undefined) {\r\n throw new Error(mergeResults.errorMessage);\r\n }\r\n\r\n // merge custom attributes\r\n mergeResults = await mergeCustomAttributes(merger.context, change.customAttributeChanges.values(), async (ca) => {\r\n return merger.context.editor.entities.addCustomAttribute(targetItemKey, ca);\r\n });\r\n\r\n if (mergeResults.errorMessage !== undefined) {\r\n throw new Error(mergeResults.errorMessage);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/ClassMerger.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 { 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,11 +1,12 @@
1
- import { EntityClass, Mixin, SchemaItemKey, SchemaKey } from "@itwin/ecschema-metadata";
1
+ import { EntityClass, SchemaItemKey, SchemaKey } from "@itwin/ecschema-metadata";
2
2
  import { ClassMerger } from "./ClassMerger";
3
3
  import { SchemaItemEditResults } from "../Editing/Editor";
4
+ import { ClassChanges } from "../Validation/SchemaChanges";
4
5
  /**
5
6
  * @internal
6
7
  */
7
8
  export default class EntityClassMerger extends ClassMerger<EntityClass> {
8
9
  protected create(schemaKey: SchemaKey, ecClass: EntityClass): Promise<SchemaItemEditResults>;
9
- protected addMixin(itemKey: SchemaItemKey, mixin: Mixin): Promise<SchemaItemEditResults>;
10
+ protected merge(itemKey: SchemaItemKey, changes: ClassChanges): Promise<SchemaItemEditResults>;
10
11
  }
11
12
  //# sourceMappingURL=EntityClassMerger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityClassMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/EntityClassMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW,CAAC,WAAW,CAAC;cAC5C,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC;cAIlF,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;CASxG"}
1
+ {"version":3,"file":"EntityClassMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/EntityClassMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAS,aAAa,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAc,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW,CAAC,WAAW,CAAC;cAC5C,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC;cAIlF,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAuB9G"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  *--------------------------------------------------------------------------------------------*/
7
7
  const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
8
8
  const ClassMerger_1 = require("./ClassMerger");
9
+ const SchemaChanges_1 = require("../Validation/SchemaChanges");
9
10
  /**
10
11
  * @internal
11
12
  */
@@ -13,13 +14,27 @@ class EntityClassMerger extends ClassMerger_1.ClassMerger {
13
14
  async create(schemaKey, ecClass) {
14
15
  return this.context.editor.entities.create(schemaKey, ecClass.name, ecClass.modifier);
15
16
  }
16
- async addMixin(itemKey, mixin) {
17
- const mixinKey = new ecschema_metadata_1.SchemaItemKey(mixin.name, mixin.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)
18
- ? this.context.targetSchema.schemaKey
19
- : mixin.schema.schemaKey);
20
- // addMixin should return results instead of throwing exception
21
- await this.context.editor.entities.addMixin(itemKey, mixinKey);
22
- return {};
17
+ async merge(itemKey, changes) {
18
+ if (changes.entityMixinChanges.size > 0) {
19
+ if (changes.schemaItemMissing?.changeType !== SchemaChanges_1.ChangeType.Missing) {
20
+ return { errorMessage: `Changing the entity class '${itemKey.name}' mixins is not supported.` };
21
+ }
22
+ for (const change of changes.entityMixinChanges.values()) {
23
+ for (const entityMixinChange of change.entityMixinChange) {
24
+ const mixins = entityMixinChange.diagnostic.messageArgs;
25
+ for (const mixin of mixins) {
26
+ const mixinKey = new ecschema_metadata_1.SchemaItemKey(mixin.name, mixin.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)
27
+ ? this.context.targetSchema.schemaKey
28
+ : mixin.schema.schemaKey);
29
+ const result = await this.context.editor.entities.addMixin(itemKey, mixinKey);
30
+ if (result.errorMessage !== undefined) {
31
+ return result;
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ return { itemKey };
23
38
  }
24
39
  }
25
40
  exports.default = EntityClassMerger;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/EntityClassMerger.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,gEAAwF;AACxF,+CAA4C;AAG5C;;GAEG;AACH,MAAqB,iBAAkB,SAAQ,yBAAwB;IAClD,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,OAAoB;QACxE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxF,CAAC;IAEkB,KAAK,CAAC,QAAQ,CAAC,OAAsB,EAAE,KAAY;QACpE,MAAM,QAAQ,GAAG,IAAI,iCAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;YAChH,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;YACrC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5B,+DAA+D;QAC/D,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAdD,oCAcC","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 { EntityClass, Mixin, SchemaItemKey, SchemaKey } from \"@itwin/ecschema-metadata\";\r\nimport { ClassMerger } from \"./ClassMerger\";\r\nimport { SchemaItemEditResults } from \"../Editing/Editor\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport default class EntityClassMerger extends ClassMerger<EntityClass> {\r\n protected override async create(schemaKey: SchemaKey, ecClass: EntityClass): Promise<SchemaItemEditResults> {\r\n return this.context.editor.entities.create(schemaKey, ecClass.name, ecClass.modifier);\r\n }\r\n\r\n protected override async addMixin(itemKey: SchemaItemKey, mixin: Mixin): Promise<SchemaItemEditResults> {\r\n const mixinKey = new SchemaItemKey(mixin.name, mixin.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)\r\n ? this.context.targetSchema.schemaKey\r\n : mixin.schema.schemaKey);\r\n\r\n // addMixin should return results instead of throwing exception\r\n await this.context.editor.entities.addMixin(itemKey, mixinKey);\r\n return {};\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"EntityClassMerger.js","sourceRoot":"","sources":["../../../src/Merging/EntityClassMerger.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,gEAAwF;AACxF,+CAA4C;AAE5C,+DAAuE;AAEvE;;GAEG;AACH,MAAqB,iBAAkB,SAAQ,yBAAwB;IAClD,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,OAAoB;QACxE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxF,CAAC;IAEkB,KAAK,CAAC,KAAK,CAAC,OAAsB,EAAE,OAAqB;QAC1E,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE;YACvC,IAAI,OAAO,CAAC,iBAAiB,EAAE,UAAU,KAAK,0BAAU,CAAC,OAAO,EAAE;gBAChE,OAAO,EAAE,YAAY,EAAE,8BAA8B,OAAO,CAAC,IAAI,4BAA4B,EAAC,CAAC;aAChG;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE;gBACxD,KAAK,MAAM,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,EAAE;oBACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,WAAkC,CAAC;oBAC/E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;wBAC1B,MAAM,QAAQ,GAAG,IAAI,iCAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;4BAChH,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;4BACrC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;wBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;wBAC9E,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE;4BACrC,OAAO,MAAM,CAAC;yBACf;qBACF;iBACF;aACF;SACF;QACD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;CACF;AA5BD,oCA4BC","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 { EntityClass, Mixin, SchemaItemKey, SchemaKey } from \"@itwin/ecschema-metadata\";\r\nimport { ClassMerger } from \"./ClassMerger\";\r\nimport { SchemaItemEditResults } from \"../Editing/Editor\";\r\nimport { ChangeType, ClassChanges } from \"../Validation/SchemaChanges\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport default class EntityClassMerger extends ClassMerger<EntityClass> {\r\n protected override async create(schemaKey: SchemaKey, ecClass: EntityClass): Promise<SchemaItemEditResults> {\r\n return this.context.editor.entities.create(schemaKey, ecClass.name, ecClass.modifier);\r\n }\r\n\r\n protected override async merge(itemKey: SchemaItemKey, changes: ClassChanges): Promise<SchemaItemEditResults> {\r\n if (changes.entityMixinChanges.size > 0) {\r\n if (changes.schemaItemMissing?.changeType !== ChangeType.Missing) {\r\n return { errorMessage: `Changing the entity class '${itemKey.name}' mixins is not supported.`};\r\n }\r\n\r\n for (const change of changes.entityMixinChanges.values()) {\r\n for (const entityMixinChange of change.entityMixinChange) {\r\n const mixins = entityMixinChange.diagnostic.messageArgs! as unknown as [Mixin];\r\n for (const mixin of mixins) {\r\n const mixinKey = new SchemaItemKey(mixin.name, mixin.schema.schemaKey.matches(this.context.sourceSchema.schemaKey)\r\n ? this.context.targetSchema.schemaKey\r\n : mixin.schema.schemaKey);\r\n const result = await this.context.editor.entities.addMixin(itemKey, mixinKey);\r\n if (result.errorMessage !== undefined) {\r\n return result;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return { itemKey };\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MixinMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/MixinMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW,CAAC,KAAK,CAAC;cAEhC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;cAW5E,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,GAAG,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC;CAe1K"}
1
+ {"version":3,"file":"MixinMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/MixinMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW,CAAC,KAAK,CAAC;cAEhC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;cAW5E,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,GAAG,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC;CAU1K"}
@@ -20,10 +20,6 @@ class MixinMerger extends ClassMerger_1.ClassMerger {
20
20
  return this.context.editor.mixins.create(schemaKey, ecClass.name, appliesTo);
21
21
  }
22
22
  async mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue) {
23
- const results = await super.mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue);
24
- if (results === true || this.isSchemaItemEditResults(results) && results.errorMessage !== undefined) {
25
- return results;
26
- }
27
23
  switch (attributeName) {
28
24
  case "appliesTo":
29
25
  if (attributeOldValue !== undefined) {
@@ -31,7 +27,7 @@ class MixinMerger extends ClassMerger_1.ClassMerger {
31
27
  }
32
28
  return true;
33
29
  }
34
- return false;
30
+ return super.mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue);
35
31
  }
36
32
  }
37
33
  exports.default = MixinMerger;
@@ -1 +1 @@
1
- {"version":3,"file":"MixinMerger.js","sourceRoot":"","sources":["../../../src/Merging/MixinMerger.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,gEAA2E;AAE3E,+CAA4C;AAE5C;;GAEG;AACH,MAAqB,WAAY,SAAQ,yBAAkB;IAEtC,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,OAAc;QAClE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE;YACnC,OAAO,EAAE,YAAY,EAAE,aAAa,OAAO,CAAC,QAAQ,iDAAiD,EAAE,CAAC;SACzG;QAED,MAAM,SAAS,GAAG,IAAI,iCAAa,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;YAClI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;YACrC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IAEkB,KAAK,CAAC,eAAe,CAAC,OAAc,EAAE,aAAqB,EAAE,iBAAsB,EAAE,iBAAsB;QAC5H,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QAC1G,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;YACnG,OAAO,OAAO,CAAC;SAChB;QAED,QAAO,aAAa,EAAE;YACpB,KAAK,WAAW;gBACd,IAAI,iBAAiB,KAAK,SAAS,EAAE;oBACnC,OAAO,EAAE,YAAY,EAAE,uBAAuB,OAAO,CAAC,IAAI,+BAA+B,EAAE,CAAC;iBAC7F;gBACD,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5BD,8BA4BC","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 { Mixin, SchemaItemKey, SchemaKey } from \"@itwin/ecschema-metadata\";\r\nimport { SchemaItemEditResults } from \"../Editing/Editor\";\r\nimport { ClassMerger } from \"./ClassMerger\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport default class MixinMerger extends ClassMerger<Mixin> {\r\n\r\n protected override async create(schemaKey: SchemaKey, ecClass: Mixin): Promise<SchemaItemEditResults> {\r\n if (ecClass.appliesTo === undefined) {\r\n return { errorMessage: `The Mixin ${ecClass.fullName} is missing the required 'appliesTo' attribute.` };\r\n }\r\n\r\n const appliesTo = new SchemaItemKey(ecClass.appliesTo.name, this.context.sourceSchema.schemaKey.matches(ecClass.appliesTo.schemaKey)\r\n ? this.context.targetSchema.schemaKey\r\n : ecClass.appliesTo.schemaKey);\r\n return this.context.editor.mixins.create(schemaKey, ecClass.name, appliesTo);\r\n }\r\n\r\n protected override async mergeAttributes(ecClass: Mixin, attributeName: string, attributeNewValue: any, attributeOldValue: any): Promise<SchemaItemEditResults | boolean> {\r\n const results = await super.mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue);\r\n if (results === true || this.isSchemaItemEditResults(results) && results.errorMessage !== undefined) {\r\n return results;\r\n }\r\n\r\n switch(attributeName) {\r\n case \"appliesTo\":\r\n if (attributeOldValue !== undefined) {\r\n return { errorMessage: `Changing the mixin '${ecClass.name}' appliesTo is not supported.` };\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MixinMerger.js","sourceRoot":"","sources":["../../../src/Merging/MixinMerger.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,gEAA2E;AAE3E,+CAA4C;AAE5C;;GAEG;AACH,MAAqB,WAAY,SAAQ,yBAAkB;IAEtC,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,OAAc;QAClE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE;YACnC,OAAO,EAAE,YAAY,EAAE,aAAa,OAAO,CAAC,QAAQ,iDAAiD,EAAE,CAAC;SACzG;QAED,MAAM,SAAS,GAAG,IAAI,iCAAa,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;YAClI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;YACrC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IAEkB,KAAK,CAAC,eAAe,CAAC,OAAc,EAAE,aAAqB,EAAE,iBAAsB,EAAE,iBAAsB;QAC5H,QAAO,aAAa,EAAE;YACpB,KAAK,WAAW;gBACd,IAAI,iBAAiB,KAAK,SAAS,EAAE;oBACnC,OAAO,EAAE,YAAY,EAAE,uBAAuB,OAAO,CAAC,IAAI,+BAA+B,EAAE,CAAC;iBAC7F;gBACD,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAC7F,CAAC;CACF;AAvBD,8BAuBC","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 { Mixin, SchemaItemKey, SchemaKey } from \"@itwin/ecschema-metadata\";\r\nimport { SchemaItemEditResults } from \"../Editing/Editor\";\r\nimport { ClassMerger } from \"./ClassMerger\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport default class MixinMerger extends ClassMerger<Mixin> {\r\n\r\n protected override async create(schemaKey: SchemaKey, ecClass: Mixin): Promise<SchemaItemEditResults> {\r\n if (ecClass.appliesTo === undefined) {\r\n return { errorMessage: `The Mixin ${ecClass.fullName} is missing the required 'appliesTo' attribute.` };\r\n }\r\n\r\n const appliesTo = new SchemaItemKey(ecClass.appliesTo.name, this.context.sourceSchema.schemaKey.matches(ecClass.appliesTo.schemaKey)\r\n ? this.context.targetSchema.schemaKey\r\n : ecClass.appliesTo.schemaKey);\r\n return this.context.editor.mixins.create(schemaKey, ecClass.name, appliesTo);\r\n }\r\n\r\n protected override async mergeAttributes(ecClass: Mixin, attributeName: string, attributeNewValue: any, attributeOldValue: any): Promise<SchemaItemEditResults | boolean> {\r\n switch(attributeName) {\r\n case \"appliesTo\":\r\n if (attributeOldValue !== undefined) {\r\n return { errorMessage: `Changing the mixin '${ecClass.name}' appliesTo is not supported.` };\r\n }\r\n return true;\r\n }\r\n return super.mergeAttributes(ecClass, attributeName, attributeNewValue, attributeOldValue);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,21 @@
1
+ import { Property, SchemaItemKey } from "@itwin/ecschema-metadata";
2
+ import { SchemaMergeContext } from "./SchemaMerger";
3
+ import { PropertyEditResults } from "../Editing/Editor";
4
+ import { PropertyValueChange } from "../Validation/SchemaChanges";
5
+ /**
6
+ * Updates property with attribute value changes.
7
+ * @param context The current merging context.
8
+ * @param property The Property object to be changed.
9
+ * @param propertyValueChanges The changes to be applied to the property.
10
+ * @internal
11
+ */
12
+ export declare function mergePropertyAttributeValueChanges(context: SchemaMergeContext, property: Property, propertyValueChanges: PropertyValueChange[]): Promise<PropertyEditResults>;
13
+ /**
14
+ * Creates a Property through a PropertyProps.
15
+ * @param context The current merging context.
16
+ * @param classKey The SchemaItemKey of the class.
17
+ * @param property The Property object to be cloned.
18
+ * @internal
19
+ */
20
+ export declare function createPropertyFromProps(context: SchemaMergeContext, classKey: SchemaItemKey, property: Property): Promise<PropertyEditResults>;
21
+ //# sourceMappingURL=PropertyMerger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropertyMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/PropertyMerger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuI,QAAQ,EAAwF,aAAa,EAAkE,MAAM,0BAA0B,CAAC;AAC9V,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAkBlE;;;;;;GAMG;AACH,wBAAsB,kCAAkC,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAYnL;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsCpJ"}