@itwin/presentation-backend 5.1.0-dev.56 → 5.1.0-dev.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/presentation-backend/RulesetEmbedder.d.ts.map +1 -1
- package/lib/cjs/presentation-backend/RulesetEmbedder.js +13 -7
- package/lib/cjs/presentation-backend/RulesetEmbedder.js.map +1 -1
- package/lib/esm/presentation-backend/RulesetEmbedder.d.ts.map +1 -1
- package/lib/esm/presentation-backend/RulesetEmbedder.js +13 -7
- package/lib/esm/presentation-backend/RulesetEmbedder.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RulesetEmbedder.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAoE,MAAM,EAAE,QAAQ,EAAkC,MAAM,qBAAqB,CAAC;AACzJ,OAAO,EAAU,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAezD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAKrD;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;IAElF;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgG;IAC5H,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuB;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAE3D;;OAEG;gBACgB,KAAK,EAAE,oBAAoB;IAM9C;;;;;OAKG;IACU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;YA2EnF,aAAa;YAWb,gBAAgB;IAa9B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAchC,uBAAuB;IAWrC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,YAAY;YAYN,qBAAqB;YAWrB,yBAAyB;YAezB,aAAa;YAqBb,mCAAmC;
|
|
1
|
+
{"version":3,"file":"RulesetEmbedder.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAoE,MAAM,EAAE,QAAQ,EAAkC,MAAM,qBAAqB,CAAC;AACzJ,OAAO,EAAU,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAezD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAKrD;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;IAElF;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgG;IAC5H,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuB;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAE3D;;OAEG;gBACgB,KAAK,EAAE,oBAAoB;IAM9C;;;;;OAKG;IACU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;YA2EnF,aAAa;YAWb,gBAAgB;IAa9B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAchC,uBAAuB;IAWrC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,YAAY;YAYN,qBAAqB;YAWrB,yBAAyB;YAezB,aAAa;YAqBb,mCAAmC;YAmBnC,aAAa;YAYb,WAAW;YAaX,aAAa;CAU5B"}
|
|
@@ -235,14 +235,20 @@ class RulesetEmbedder {
|
|
|
235
235
|
return this.insertElement(subjectProps, callbacks);
|
|
236
236
|
}
|
|
237
237
|
async handleElementOperationPrerequisites() {
|
|
238
|
-
|
|
239
|
-
|
|
238
|
+
let hasChanges = false;
|
|
239
|
+
if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {
|
|
240
|
+
// import PresentationRules ECSchema
|
|
241
|
+
await this._imodel.importSchemas([this._schemaPath]);
|
|
242
|
+
hasChanges = true;
|
|
243
|
+
}
|
|
244
|
+
if (!this._imodel.codeSpecs.hasName(PresentationRulesDomain_js_1.PresentationRules.CodeSpec.Ruleset)) {
|
|
245
|
+
// insert CodeSpec for ruleset elements
|
|
246
|
+
this._imodel.codeSpecs.insert(core_common_1.CodeSpec.create(this._imodel, PresentationRulesDomain_js_1.PresentationRules.CodeSpec.Ruleset, core_common_1.CodeScopeSpec.Type.Model));
|
|
247
|
+
hasChanges = true;
|
|
248
|
+
}
|
|
249
|
+
if (hasChanges) {
|
|
250
|
+
this._imodel.saveChanges();
|
|
240
251
|
}
|
|
241
|
-
// import PresentationRules ECSchema
|
|
242
|
-
await this._imodel.importSchemas([this._schemaPath]);
|
|
243
|
-
// insert CodeSpec for ruleset elements
|
|
244
|
-
this._imodel.codeSpecs.insert(core_common_1.CodeSpec.create(this._imodel, PresentationRulesDomain_js_1.PresentationRules.CodeSpec.Ruleset, core_common_1.CodeScopeSpec.Type.Model));
|
|
245
|
-
this._imodel.saveChanges();
|
|
246
252
|
}
|
|
247
253
|
async insertElement(props, callbacks) {
|
|
248
254
|
const element = this._imodel.elements.createElement(props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,mCAA6E;AAC7E,sDAAyJ;AACzJ,sDAAyD;AACzD,oDAa4B;AAE5B,oFAAwE;AACxE,6EAA+D;AAC/D,yCAA8C;AAuE9C;;;GAGG;AACH,MAAa,eAAe;IAClB,OAAO,CAAW;IAClB,gBAAgB,CAAa;IACpB,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,6BAAc,CAAC,eAAe,EAAE,iDAAiD,CAAC,CAAC;IAC3G,iBAAiB,GAAG,mBAAmB,CAAC;IACxC,mBAAmB,GAAG,mBAAmB,CAAC;IAE3D;;OAEG;IACH,YAAmB,KAA2B;QAC5C,8CAAiB,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,eAAe,IAAI,oBAAM,CAAC,aAAa,CAAC;IACxE,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,aAAa,CAAC,OAAgB,EAAE,OAA8B;QACzE,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEzD,oEAAoE;QACpE,MAAM,IAAI,CAAC,mCAAmC,EAAE,CAAC;QAEjD,qCAAqC;QACrC,MAAM,kBAAkB,GAInB,EAAE,CAAC;QACR,MAAM,KAAK,GAAG;;aAEL,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,eAAe,CAAC,OAAO,CAAC,SAAS;6EACR,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,yBAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,4BAAc,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACpJ,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,wBAAwB,GAAe,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,eAAe,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC;YAC/E,kBAAkB,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,wBAAwB;gBAC5B,OAAO,EAAE,eAAe;gBACxB,iBAAiB,EAAE,IAAA,2BAAgB,EAAC,eAAe,CAAC,OAAO,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,MAAM,UAAU,GACd,CAAC,iBAAiB,CAAC,IAAI,KAAK,SAAS,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;YACvE,CAAC,iBAAiB,CAAC,IAAI,KAAK,wBAAwB,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,KAAK,cAAc,CAAC,CAAC;YACvI,CAAC,iBAAiB,CAAC,IAAI,KAAK,yBAAyB,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,YAAU,EAAC,KAAK,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QACpJ,IAAI,UAAU,EAAE,CAAC;YACf,2FAA2F;YAC3F,MAAM,8BAA8B,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;gBACjF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAA,WAAS,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACnH,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,8BAA8B,CAAC,EAAE,CAAC;QAC3C,CAAC;QAED,yCAAyC;QACzC,MAAM,gBAAgB,GAAiB,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,CAAC,CAAU,EAAE,iBAAyB,EAAW,EAAE;YACtE,QAAQ,iBAAiB,CAAC,eAAe,EAAE,CAAC;gBAC1C,KAAK,KAAK;oBACR,OAAO,iBAAiB,KAAK,cAAc,CAAC;gBAC9C,KAAK,WAAW;oBACd,OAAO,iBAAiB,KAAK,cAAc,IAAI,IAAA,WAAS,EAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAChG,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACF,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACzD,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAEtD,qDAAqD;QACrD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,KAAK,cAAc,CAAC,CAAC;QAChG,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACtF,CAAC;QAED,sDAAsD;QACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACnF,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAC9F,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAqB,EAAE,OAAgB,EAAE,SAA2B;QAC9F,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB,SAAS,CAAC,CAAC;QACjG,IAAA,qBAAM,EAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC;QAC7C,sBAAsB,CAAC,cAAc,CAAC,cAAc,GAAG,OAAO,CAAC;QAE/D,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;QAE5D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,sBAAsB,CAAC,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAgB,EAAE,KAAY,EAAE,WAAiB,EAAE,SAA2B;QAC3G,MAAM,KAAK,GAA2B;YACpC,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,IAAI,EAAE,WAAW;YACjB,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa;YACpD,cAAc,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;SAC5C,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACvE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAc,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,kCAAkC,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;YAClI,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC;YAC7D,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,SAA2B;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAEO,iBAAiB;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC5D,IAAI,SAAS,KAAK,mBAAmB,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAEO,wBAAwB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB,kCAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACpJ,CAAC;IAEO,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAa,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,OAAO,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,kBAAI,CAAC;YACpB,IAAI,EAAE,QAAQ,CAAC,EAAE;YACjB,KAAK,EAAE,MAAM,CAAC,EAAE;YAChB,KAAK,EAAE,IAAI,CAAC,mBAAmB;SAChC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,mBAAwC,EAAE,SAA2B;QACvG,MAAM,UAAU,GAAe;YAC7B,cAAc,EAAE,mBAAmB;YACnC,IAAI,EAAE,IAAI,CAAC,iBAAiB;YAC5B,aAAa,EAAE,8BAAe,CAAC,aAAa;YAC5C,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,cAAuB,EAAE,SAA2B;QAC1F,MAAM,aAAa,GAAG,kCAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9G,MAAM,wBAAwB,GAAqC;YACjE,MAAM,EAAE;gBACN,EAAE,EAAE,cAAc,CAAC,EAAE;gBACrB,YAAY,EAAE,sCAAsC;aACrD;YACD,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,kCAAmB,CAAC,aAAa;SACjD,CAAC;QAEF,OAAO,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAA2B;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAa,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,OAAO,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,IAAI,kBAAI,CAAC;YAC3B,IAAI,EAAE,QAAQ,CAAC,EAAE;YACjB,KAAK,EAAE,MAAM,CAAC,EAAE;YAChB,KAAK,EAAE,IAAI,CAAC,mBAAmB;SAChC,CAAC,CAAC;QACH,MAAM,YAAY,GAAiB;YACjC,aAAa,EAAE,sBAAO,CAAC,aAAa;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE;gBACN,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,YAAY,EAAE,6BAA6B;aAC5C;YACD,IAAI,EAAE,WAAW;SAClB,CAAC;QAEF,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,mCAAmC;QAC/C,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACtE,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAErD,uCAAuC;QACvC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,sBAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,8CAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,2BAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAE3H,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,aAAa,CAA8B,KAAa,EAAE,SAA2B;QACjG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3D,oBAAoB;QACpB,MAAM,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,oBAAoB;YACpB,MAAM,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAiB,EAAE,SAA2B;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrD,oBAAoB;QACpB,MAAM,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,oBAAoB;YACpB,MAAM,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAgB,EAAE,SAA2B;QACvE,oBAAoB;QACpB,MAAM,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,oBAAoB;YACpB,MAAM,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF;AAnRD,0CAmRC;AAED,SAAS,6BAA6B,CAAC,OAA8B;IACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;IACtE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,wBAAwB;QAC9C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO;QACnD,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;AACJ,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 *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Core\n */\n\nimport * as path from \"path\";\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\nimport { DefinitionElement, DefinitionModel, DefinitionPartition, Element, Entity, IModelDb, KnownLocations, Model, Subject } from \"@itwin/core-backend\";\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec,\n Code,\n CodeScopeSpec,\n CodeSpec,\n DefinitionElementProps,\n ElementProps,\n IModel,\n InformationPartitionElementProps,\n ModelProps,\n QueryBinder,\n QueryRowFormat,\n SubjectProps,\n} from \"@itwin/core-common\";\nimport { Ruleset } from \"@itwin/presentation-common\";\nimport { PresentationRules } from \"./domain/PresentationRulesDomain.js\";\nimport * as RulesetElements from \"./domain/RulesetElements.js\";\nimport { normalizeVersion } from \"./Utils.js\";\n\n/**\n * Interface for callbacks which will be called before and after Element/Model updates\n * @public\n */\ninterface UpdateCallbacks {\n onBeforeUpdate: (props: Entity) => Promise<void>;\n onAfterUpdate: (props: Entity) => Promise<void>;\n}\n\n/**\n * Interface for callbacks which will be called before and after Element/Model is inserted\n * @public\n */\ninterface InsertCallbacks {\n onBeforeInsert: (props: Entity) => Promise<void>;\n onAfterInsert: (props: Entity) => Promise<void>;\n}\n\n/**\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\n * @public\n */\nexport interface RulesetInsertOptions {\n /**\n * When should insertion be skipped:\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\n * version greater or equal to version of the inserted ruleset.\n *\n * Defaults to `same-id-and-version-eq`.\n */\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\n\n /**\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\n * - `all` - replace all rulesets with same id.\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\n *\n * Defaults to `exact`.\n */\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\n\n /**\n * Callbacks that will be called before and after `Entity` updates\n */\n onEntityUpdate?: UpdateCallbacks;\n\n /**\n * Callbacks that will be called before and after `Entity` is inserted\n */\n onEntityInsert?: InsertCallbacks;\n}\n\n/**\n * Properties for creating a `RulesetEmbedder` instance.\n * @public\n */\nexport interface RulesetEmbedderProps {\n /** iModel to embed rulesets to */\n imodel: IModelDb;\n /**\n * An ID of existing subject under which presentation ruleset will be located or created.\n * Defaults to 'IModel.rootSubjectId'.\n */\n parentSubjectId?: Id64String;\n}\n\n/**\n * An API for embedding presentation rulesets into iModels.\n * @public\n */\nexport class RulesetEmbedder {\n private _imodel: IModelDb;\n private _parentSubjectId: Id64String;\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\n private readonly _rulesetModelName = \"PresentationRules\";\n private readonly _rulesetSubjectName = \"PresentationRules\";\n\n /**\n * Constructs RulesetEmbedder\n */\n public constructor(props: RulesetEmbedderProps) {\n PresentationRules.registerSchema();\n this._imodel = props.imodel;\n this._parentSubjectId = props.parentSubjectId ?? IModel.rootSubjectId;\n }\n\n /**\n * Inserts a ruleset into iModel.\n * @param ruleset Ruleset to insert.\n * @param options Options for inserting a ruleset.\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\n */\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\n const normalizedOptions = normalizeRulesetInsertOptions(options);\n const rulesetVersion = normalizeVersion(ruleset.version);\n\n // ensure imodel has PresentationRules schema and required CodeSpecs\n await this.handleElementOperationPrerequisites();\n\n // find all rulesets with the same ID\n const rulesetsWithSameId: Array<{\n ruleset: Ruleset;\n id: Id64String;\n normalizedVersion: string;\n }> = [];\n const query = `\n SELECT ECInstanceId, JsonProperties\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\n const reader = this._imodel.createQueryReader(query, QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n while (await reader.step()) {\n const row = reader.current.toRow();\n const existingRulesetElementId: Id64String = row.id;\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\n rulesetsWithSameId.push({\n id: existingRulesetElementId,\n ruleset: existingRuleset,\n normalizedVersion: normalizeVersion(existingRuleset.version),\n });\n }\n\n // check if we need to do anything at all\n const shouldSkip =\n (normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0) ||\n (normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)) ||\n (normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion)));\n if (shouldSkip) {\n // we're not inserting anything - return ID of the ruleset element with the highest version\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\n if (!highest.ruleset.version || (curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))) {\n return curr;\n }\n return highest;\n }, rulesetsWithSameId[0]);\n return rulesetEntryWithHighestVersion.id;\n }\n\n // if requested, delete existing rulesets\n const rulesetsToRemove: Id64String[] = [];\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\n switch (normalizedOptions.replaceVersions) {\n case \"all\":\n return normalizedVersion !== rulesetVersion;\n case \"all-lower\":\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\n }\n return false;\n };\n rulesetsWithSameId.forEach((entry) => {\n if (shouldRemove(entry.ruleset, entry.normalizedVersion)) {\n rulesetsToRemove.push(entry.id);\n }\n });\n this._imodel.elements.deleteElement(rulesetsToRemove);\n\n // attempt to update ruleset with same ID and version\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\n if (exactMatch !== undefined) {\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\n }\n\n // no exact match found - insert a new ruleset element\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\n }\n\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\n assert(existingRulesetElement !== undefined);\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\n\n await this.updateElement(existingRulesetElement, callbacks);\n\n this._imodel.saveChanges();\n return existingRulesetElement.id;\n }\n\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\n const props: DefinitionElementProps = {\n model: model.id,\n code: rulesetCode,\n classFullName: RulesetElements.Ruleset.classFullName,\n jsonProperties: { jsonProperties: ruleset },\n };\n\n const element = await this.insertElement(props, callbacks);\n this._imodel.saveChanges();\n return element.id;\n }\n\n /**\n * Get all rulesets embedded in the iModel.\n */\n public async getRulesets(): Promise<Ruleset[]> {\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return [];\n }\n\n const rulesetList: Ruleset[] = [];\n for await (const row of this._imodel.createQueryReader(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`)) {\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\n rulesetList.push(ruleset);\n }\n return rulesetList;\n }\n\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const rulesetModel = this.queryRulesetModel();\n if (undefined !== rulesetModel) {\n return rulesetModel;\n }\n\n const rulesetSubject = await this.insertSubject(callbacks);\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\n return this.insertDefinitionModel(definitionPartition, callbacks);\n }\n\n private queryRulesetModel(): DefinitionModel | undefined {\n const definitionPartition = this.queryDefinitionPartition();\n if (undefined === definitionPartition) {\n return undefined;\n }\n\n return this._imodel.models.getSubModel(definitionPartition.id);\n }\n\n private queryDefinitionPartition(): DefinitionPartition | undefined {\n const subject = this.querySubject();\n if (undefined === subject) {\n return undefined;\n }\n\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\n }\n\n private querySubject(): Subject | undefined {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const code = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n\n return this._imodel.elements.tryGetElement<Subject>(code);\n }\n\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const modelProps: ModelProps = {\n modeledElement: definitionPartition,\n name: this._rulesetModelName,\n classFullName: DefinitionModel.classFullName,\n isPrivate: true,\n };\n\n return this.insertModel(modelProps, callbacks);\n }\n\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\n const definitionPartitionProps: InformationPartitionElementProps = {\n parent: {\n id: rulesetSubject.id,\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\n },\n model: rulesetSubject.model,\n code: partitionCode,\n classFullName: DefinitionPartition.classFullName,\n };\n\n return this.insertElement(definitionPartitionProps, callbacks);\n }\n\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const subjectCode = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n const subjectProps: SubjectProps = {\n classFullName: Subject.classFullName,\n model: parent.model,\n parent: {\n id: parent.id,\n relClassName: \"BisCore:SubjectOwnsSubjects\",\n },\n code: subjectCode,\n };\n\n return this.insertElement(subjectProps, callbacks);\n }\n\n private async handleElementOperationPrerequisites(): Promise<void> {\n if (this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return;\n }\n\n // import PresentationRules ECSchema\n await this._imodel.importSchemas([this._schemaPath]);\n\n // insert CodeSpec for ruleset elements\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\n\n this._imodel.saveChanges();\n }\n\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\n const element = this._imodel.elements.createElement(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(element);\n try {\n return this._imodel.elements.getElement(element.insert());\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(element);\n }\n }\n\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\n const model = this._imodel.models.createModel(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(model);\n try {\n model.id = model.insert();\n return model;\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(model);\n }\n }\n\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\n /* c8 ignore next */\n await callbacks?.onBeforeUpdate(element);\n try {\n element.update();\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterUpdate(element);\n }\n }\n}\n\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\n if (options === undefined) {\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\n }\n\n return {\n skip: options.skip ?? \"same-id-and-version-eq\",\n replaceVersions: options.replaceVersions ?? \"exact\",\n onEntityUpdate: options.onEntityUpdate,\n onEntityInsert: options.onEntityInsert,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.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 *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Core\n */\n\nimport * as path from \"path\";\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\nimport { DefinitionElement, DefinitionModel, DefinitionPartition, Element, Entity, IModelDb, KnownLocations, Model, Subject } from \"@itwin/core-backend\";\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec,\n Code,\n CodeScopeSpec,\n CodeSpec,\n DefinitionElementProps,\n ElementProps,\n IModel,\n InformationPartitionElementProps,\n ModelProps,\n QueryBinder,\n QueryRowFormat,\n SubjectProps,\n} from \"@itwin/core-common\";\nimport { Ruleset } from \"@itwin/presentation-common\";\nimport { PresentationRules } from \"./domain/PresentationRulesDomain.js\";\nimport * as RulesetElements from \"./domain/RulesetElements.js\";\nimport { normalizeVersion } from \"./Utils.js\";\n\n/**\n * Interface for callbacks which will be called before and after Element/Model updates\n * @public\n */\ninterface UpdateCallbacks {\n onBeforeUpdate: (props: Entity) => Promise<void>;\n onAfterUpdate: (props: Entity) => Promise<void>;\n}\n\n/**\n * Interface for callbacks which will be called before and after Element/Model is inserted\n * @public\n */\ninterface InsertCallbacks {\n onBeforeInsert: (props: Entity) => Promise<void>;\n onAfterInsert: (props: Entity) => Promise<void>;\n}\n\n/**\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\n * @public\n */\nexport interface RulesetInsertOptions {\n /**\n * When should insertion be skipped:\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\n * version greater or equal to version of the inserted ruleset.\n *\n * Defaults to `same-id-and-version-eq`.\n */\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\n\n /**\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\n * - `all` - replace all rulesets with same id.\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\n *\n * Defaults to `exact`.\n */\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\n\n /**\n * Callbacks that will be called before and after `Entity` updates\n */\n onEntityUpdate?: UpdateCallbacks;\n\n /**\n * Callbacks that will be called before and after `Entity` is inserted\n */\n onEntityInsert?: InsertCallbacks;\n}\n\n/**\n * Properties for creating a `RulesetEmbedder` instance.\n * @public\n */\nexport interface RulesetEmbedderProps {\n /** iModel to embed rulesets to */\n imodel: IModelDb;\n /**\n * An ID of existing subject under which presentation ruleset will be located or created.\n * Defaults to 'IModel.rootSubjectId'.\n */\n parentSubjectId?: Id64String;\n}\n\n/**\n * An API for embedding presentation rulesets into iModels.\n * @public\n */\nexport class RulesetEmbedder {\n private _imodel: IModelDb;\n private _parentSubjectId: Id64String;\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\n private readonly _rulesetModelName = \"PresentationRules\";\n private readonly _rulesetSubjectName = \"PresentationRules\";\n\n /**\n * Constructs RulesetEmbedder\n */\n public constructor(props: RulesetEmbedderProps) {\n PresentationRules.registerSchema();\n this._imodel = props.imodel;\n this._parentSubjectId = props.parentSubjectId ?? IModel.rootSubjectId;\n }\n\n /**\n * Inserts a ruleset into iModel.\n * @param ruleset Ruleset to insert.\n * @param options Options for inserting a ruleset.\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\n */\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\n const normalizedOptions = normalizeRulesetInsertOptions(options);\n const rulesetVersion = normalizeVersion(ruleset.version);\n\n // ensure imodel has PresentationRules schema and required CodeSpecs\n await this.handleElementOperationPrerequisites();\n\n // find all rulesets with the same ID\n const rulesetsWithSameId: Array<{\n ruleset: Ruleset;\n id: Id64String;\n normalizedVersion: string;\n }> = [];\n const query = `\n SELECT ECInstanceId, JsonProperties\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\n const reader = this._imodel.createQueryReader(query, QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n while (await reader.step()) {\n const row = reader.current.toRow();\n const existingRulesetElementId: Id64String = row.id;\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\n rulesetsWithSameId.push({\n id: existingRulesetElementId,\n ruleset: existingRuleset,\n normalizedVersion: normalizeVersion(existingRuleset.version),\n });\n }\n\n // check if we need to do anything at all\n const shouldSkip =\n (normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0) ||\n (normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)) ||\n (normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion)));\n if (shouldSkip) {\n // we're not inserting anything - return ID of the ruleset element with the highest version\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\n if (!highest.ruleset.version || (curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))) {\n return curr;\n }\n return highest;\n }, rulesetsWithSameId[0]);\n return rulesetEntryWithHighestVersion.id;\n }\n\n // if requested, delete existing rulesets\n const rulesetsToRemove: Id64String[] = [];\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\n switch (normalizedOptions.replaceVersions) {\n case \"all\":\n return normalizedVersion !== rulesetVersion;\n case \"all-lower\":\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\n }\n return false;\n };\n rulesetsWithSameId.forEach((entry) => {\n if (shouldRemove(entry.ruleset, entry.normalizedVersion)) {\n rulesetsToRemove.push(entry.id);\n }\n });\n this._imodel.elements.deleteElement(rulesetsToRemove);\n\n // attempt to update ruleset with same ID and version\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\n if (exactMatch !== undefined) {\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\n }\n\n // no exact match found - insert a new ruleset element\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\n }\n\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\n assert(existingRulesetElement !== undefined);\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\n\n await this.updateElement(existingRulesetElement, callbacks);\n\n this._imodel.saveChanges();\n return existingRulesetElement.id;\n }\n\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\n const props: DefinitionElementProps = {\n model: model.id,\n code: rulesetCode,\n classFullName: RulesetElements.Ruleset.classFullName,\n jsonProperties: { jsonProperties: ruleset },\n };\n\n const element = await this.insertElement(props, callbacks);\n this._imodel.saveChanges();\n return element.id;\n }\n\n /**\n * Get all rulesets embedded in the iModel.\n */\n public async getRulesets(): Promise<Ruleset[]> {\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return [];\n }\n\n const rulesetList: Ruleset[] = [];\n for await (const row of this._imodel.createQueryReader(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`)) {\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\n rulesetList.push(ruleset);\n }\n return rulesetList;\n }\n\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const rulesetModel = this.queryRulesetModel();\n if (undefined !== rulesetModel) {\n return rulesetModel;\n }\n\n const rulesetSubject = await this.insertSubject(callbacks);\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\n return this.insertDefinitionModel(definitionPartition, callbacks);\n }\n\n private queryRulesetModel(): DefinitionModel | undefined {\n const definitionPartition = this.queryDefinitionPartition();\n if (undefined === definitionPartition) {\n return undefined;\n }\n\n return this._imodel.models.getSubModel(definitionPartition.id);\n }\n\n private queryDefinitionPartition(): DefinitionPartition | undefined {\n const subject = this.querySubject();\n if (undefined === subject) {\n return undefined;\n }\n\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\n }\n\n private querySubject(): Subject | undefined {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const code = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n\n return this._imodel.elements.tryGetElement<Subject>(code);\n }\n\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const modelProps: ModelProps = {\n modeledElement: definitionPartition,\n name: this._rulesetModelName,\n classFullName: DefinitionModel.classFullName,\n isPrivate: true,\n };\n\n return this.insertModel(modelProps, callbacks);\n }\n\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\n const definitionPartitionProps: InformationPartitionElementProps = {\n parent: {\n id: rulesetSubject.id,\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\n },\n model: rulesetSubject.model,\n code: partitionCode,\n classFullName: DefinitionPartition.classFullName,\n };\n\n return this.insertElement(definitionPartitionProps, callbacks);\n }\n\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const subjectCode = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n const subjectProps: SubjectProps = {\n classFullName: Subject.classFullName,\n model: parent.model,\n parent: {\n id: parent.id,\n relClassName: \"BisCore:SubjectOwnsSubjects\",\n },\n code: subjectCode,\n };\n\n return this.insertElement(subjectProps, callbacks);\n }\n\n private async handleElementOperationPrerequisites(): Promise<void> {\n let hasChanges = false;\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n // import PresentationRules ECSchema\n await this._imodel.importSchemas([this._schemaPath]);\n hasChanges = true;\n }\n\n if (!this._imodel.codeSpecs.hasName(PresentationRules.CodeSpec.Ruleset)) {\n // insert CodeSpec for ruleset elements\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\n hasChanges = true;\n }\n\n if (hasChanges) {\n this._imodel.saveChanges();\n }\n }\n\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\n const element = this._imodel.elements.createElement(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(element);\n try {\n return this._imodel.elements.getElement(element.insert());\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(element);\n }\n }\n\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\n const model = this._imodel.models.createModel(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(model);\n try {\n model.id = model.insert();\n return model;\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(model);\n }\n }\n\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\n /* c8 ignore next */\n await callbacks?.onBeforeUpdate(element);\n try {\n element.update();\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterUpdate(element);\n }\n }\n}\n\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\n if (options === undefined) {\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\n }\n\n return {\n skip: options.skip ?? \"same-id-and-version-eq\",\n replaceVersions: options.replaceVersions ?? \"exact\",\n onEntityUpdate: options.onEntityUpdate,\n onEntityInsert: options.onEntityInsert,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RulesetEmbedder.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAoE,MAAM,EAAE,QAAQ,EAAkC,MAAM,qBAAqB,CAAC;AACzJ,OAAO,EAAU,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAezD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAKrD;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;IAElF;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgG;IAC5H,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuB;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAE3D;;OAEG;gBACgB,KAAK,EAAE,oBAAoB;IAM9C;;;;;OAKG;IACU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;YA2EnF,aAAa;YAWb,gBAAgB;IAa9B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAchC,uBAAuB;IAWrC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,YAAY;YAYN,qBAAqB;YAWrB,yBAAyB;YAezB,aAAa;YAqBb,mCAAmC;
|
|
1
|
+
{"version":3,"file":"RulesetEmbedder.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAoE,MAAM,EAAE,QAAQ,EAAkC,MAAM,qBAAqB,CAAC;AACzJ,OAAO,EAAU,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAezD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAKrD;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,UAAU,eAAe;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;IAElF;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgG;IAC5H,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuB;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAE3D;;OAEG;gBACgB,KAAK,EAAE,oBAAoB;IAM9C;;;;;OAKG;IACU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;YA2EnF,aAAa;YAWb,gBAAgB;IAa9B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAchC,uBAAuB;IAWrC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,YAAY;YAYN,qBAAqB;YAWrB,yBAAyB;YAezB,aAAa;YAqBb,mCAAmC;YAmBnC,aAAa;YAYb,WAAW;YAaX,aAAa;CAU5B"}
|
|
@@ -209,14 +209,20 @@ export class RulesetEmbedder {
|
|
|
209
209
|
return this.insertElement(subjectProps, callbacks);
|
|
210
210
|
}
|
|
211
211
|
async handleElementOperationPrerequisites() {
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
let hasChanges = false;
|
|
213
|
+
if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {
|
|
214
|
+
// import PresentationRules ECSchema
|
|
215
|
+
await this._imodel.importSchemas([this._schemaPath]);
|
|
216
|
+
hasChanges = true;
|
|
217
|
+
}
|
|
218
|
+
if (!this._imodel.codeSpecs.hasName(PresentationRules.CodeSpec.Ruleset)) {
|
|
219
|
+
// insert CodeSpec for ruleset elements
|
|
220
|
+
this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));
|
|
221
|
+
hasChanges = true;
|
|
222
|
+
}
|
|
223
|
+
if (hasChanges) {
|
|
224
|
+
this._imodel.saveChanges();
|
|
214
225
|
}
|
|
215
|
-
// import PresentationRules ECSchema
|
|
216
|
-
await this._imodel.importSchemas([this._schemaPath]);
|
|
217
|
-
// insert CodeSpec for ruleset elements
|
|
218
|
-
this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));
|
|
219
|
-
this._imodel.saveChanges();
|
|
220
226
|
}
|
|
221
227
|
async insertElement(props, callbacks) {
|
|
222
228
|
const element = this._imodel.elements.createElement(props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.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 *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Core\n */\n\nimport * as path from \"path\";\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\nimport { DefinitionElement, DefinitionModel, DefinitionPartition, Element, Entity, IModelDb, KnownLocations, Model, Subject } from \"@itwin/core-backend\";\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec,\n Code,\n CodeScopeSpec,\n CodeSpec,\n DefinitionElementProps,\n ElementProps,\n IModel,\n InformationPartitionElementProps,\n ModelProps,\n QueryBinder,\n QueryRowFormat,\n SubjectProps,\n} from \"@itwin/core-common\";\nimport { Ruleset } from \"@itwin/presentation-common\";\nimport { PresentationRules } from \"./domain/PresentationRulesDomain.js\";\nimport * as RulesetElements from \"./domain/RulesetElements.js\";\nimport { normalizeVersion } from \"./Utils.js\";\n\n/**\n * Interface for callbacks which will be called before and after Element/Model updates\n * @public\n */\ninterface UpdateCallbacks {\n onBeforeUpdate: (props: Entity) => Promise<void>;\n onAfterUpdate: (props: Entity) => Promise<void>;\n}\n\n/**\n * Interface for callbacks which will be called before and after Element/Model is inserted\n * @public\n */\ninterface InsertCallbacks {\n onBeforeInsert: (props: Entity) => Promise<void>;\n onAfterInsert: (props: Entity) => Promise<void>;\n}\n\n/**\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\n * @public\n */\nexport interface RulesetInsertOptions {\n /**\n * When should insertion be skipped:\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\n * version greater or equal to version of the inserted ruleset.\n *\n * Defaults to `same-id-and-version-eq`.\n */\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\n\n /**\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\n * - `all` - replace all rulesets with same id.\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\n *\n * Defaults to `exact`.\n */\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\n\n /**\n * Callbacks that will be called before and after `Entity` updates\n */\n onEntityUpdate?: UpdateCallbacks;\n\n /**\n * Callbacks that will be called before and after `Entity` is inserted\n */\n onEntityInsert?: InsertCallbacks;\n}\n\n/**\n * Properties for creating a `RulesetEmbedder` instance.\n * @public\n */\nexport interface RulesetEmbedderProps {\n /** iModel to embed rulesets to */\n imodel: IModelDb;\n /**\n * An ID of existing subject under which presentation ruleset will be located or created.\n * Defaults to 'IModel.rootSubjectId'.\n */\n parentSubjectId?: Id64String;\n}\n\n/**\n * An API for embedding presentation rulesets into iModels.\n * @public\n */\nexport class RulesetEmbedder {\n private _imodel: IModelDb;\n private _parentSubjectId: Id64String;\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\n private readonly _rulesetModelName = \"PresentationRules\";\n private readonly _rulesetSubjectName = \"PresentationRules\";\n\n /**\n * Constructs RulesetEmbedder\n */\n public constructor(props: RulesetEmbedderProps) {\n PresentationRules.registerSchema();\n this._imodel = props.imodel;\n this._parentSubjectId = props.parentSubjectId ?? IModel.rootSubjectId;\n }\n\n /**\n * Inserts a ruleset into iModel.\n * @param ruleset Ruleset to insert.\n * @param options Options for inserting a ruleset.\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\n */\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\n const normalizedOptions = normalizeRulesetInsertOptions(options);\n const rulesetVersion = normalizeVersion(ruleset.version);\n\n // ensure imodel has PresentationRules schema and required CodeSpecs\n await this.handleElementOperationPrerequisites();\n\n // find all rulesets with the same ID\n const rulesetsWithSameId: Array<{\n ruleset: Ruleset;\n id: Id64String;\n normalizedVersion: string;\n }> = [];\n const query = `\n SELECT ECInstanceId, JsonProperties\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\n const reader = this._imodel.createQueryReader(query, QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n while (await reader.step()) {\n const row = reader.current.toRow();\n const existingRulesetElementId: Id64String = row.id;\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\n rulesetsWithSameId.push({\n id: existingRulesetElementId,\n ruleset: existingRuleset,\n normalizedVersion: normalizeVersion(existingRuleset.version),\n });\n }\n\n // check if we need to do anything at all\n const shouldSkip =\n (normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0) ||\n (normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)) ||\n (normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion)));\n if (shouldSkip) {\n // we're not inserting anything - return ID of the ruleset element with the highest version\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\n if (!highest.ruleset.version || (curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))) {\n return curr;\n }\n return highest;\n }, rulesetsWithSameId[0]);\n return rulesetEntryWithHighestVersion.id;\n }\n\n // if requested, delete existing rulesets\n const rulesetsToRemove: Id64String[] = [];\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\n switch (normalizedOptions.replaceVersions) {\n case \"all\":\n return normalizedVersion !== rulesetVersion;\n case \"all-lower\":\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\n }\n return false;\n };\n rulesetsWithSameId.forEach((entry) => {\n if (shouldRemove(entry.ruleset, entry.normalizedVersion)) {\n rulesetsToRemove.push(entry.id);\n }\n });\n this._imodel.elements.deleteElement(rulesetsToRemove);\n\n // attempt to update ruleset with same ID and version\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\n if (exactMatch !== undefined) {\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\n }\n\n // no exact match found - insert a new ruleset element\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\n }\n\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\n assert(existingRulesetElement !== undefined);\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\n\n await this.updateElement(existingRulesetElement, callbacks);\n\n this._imodel.saveChanges();\n return existingRulesetElement.id;\n }\n\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\n const props: DefinitionElementProps = {\n model: model.id,\n code: rulesetCode,\n classFullName: RulesetElements.Ruleset.classFullName,\n jsonProperties: { jsonProperties: ruleset },\n };\n\n const element = await this.insertElement(props, callbacks);\n this._imodel.saveChanges();\n return element.id;\n }\n\n /**\n * Get all rulesets embedded in the iModel.\n */\n public async getRulesets(): Promise<Ruleset[]> {\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return [];\n }\n\n const rulesetList: Ruleset[] = [];\n for await (const row of this._imodel.createQueryReader(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`)) {\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\n rulesetList.push(ruleset);\n }\n return rulesetList;\n }\n\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const rulesetModel = this.queryRulesetModel();\n if (undefined !== rulesetModel) {\n return rulesetModel;\n }\n\n const rulesetSubject = await this.insertSubject(callbacks);\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\n return this.insertDefinitionModel(definitionPartition, callbacks);\n }\n\n private queryRulesetModel(): DefinitionModel | undefined {\n const definitionPartition = this.queryDefinitionPartition();\n if (undefined === definitionPartition) {\n return undefined;\n }\n\n return this._imodel.models.getSubModel(definitionPartition.id);\n }\n\n private queryDefinitionPartition(): DefinitionPartition | undefined {\n const subject = this.querySubject();\n if (undefined === subject) {\n return undefined;\n }\n\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\n }\n\n private querySubject(): Subject | undefined {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const code = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n\n return this._imodel.elements.tryGetElement<Subject>(code);\n }\n\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const modelProps: ModelProps = {\n modeledElement: definitionPartition,\n name: this._rulesetModelName,\n classFullName: DefinitionModel.classFullName,\n isPrivate: true,\n };\n\n return this.insertModel(modelProps, callbacks);\n }\n\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\n const definitionPartitionProps: InformationPartitionElementProps = {\n parent: {\n id: rulesetSubject.id,\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\n },\n model: rulesetSubject.model,\n code: partitionCode,\n classFullName: DefinitionPartition.classFullName,\n };\n\n return this.insertElement(definitionPartitionProps, callbacks);\n }\n\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const subjectCode = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n const subjectProps: SubjectProps = {\n classFullName: Subject.classFullName,\n model: parent.model,\n parent: {\n id: parent.id,\n relClassName: \"BisCore:SubjectOwnsSubjects\",\n },\n code: subjectCode,\n };\n\n return this.insertElement(subjectProps, callbacks);\n }\n\n private async handleElementOperationPrerequisites(): Promise<void> {\n if (this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return;\n }\n\n // import PresentationRules ECSchema\n await this._imodel.importSchemas([this._schemaPath]);\n\n // insert CodeSpec for ruleset elements\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\n\n this._imodel.saveChanges();\n }\n\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\n const element = this._imodel.elements.createElement(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(element);\n try {\n return this._imodel.elements.getElement(element.insert());\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(element);\n }\n }\n\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\n const model = this._imodel.models.createModel(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(model);\n try {\n model.id = model.insert();\n return model;\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(model);\n }\n }\n\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\n /* c8 ignore next */\n await callbacks?.onBeforeUpdate(element);\n try {\n element.update();\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterUpdate(element);\n }\n }\n}\n\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\n if (options === undefined) {\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\n }\n\n return {\n skip: options.skip ?? \"same-id-and-version-eq\",\n replaceVersions: options.replaceVersions ?? \"exact\",\n onEntityUpdate: options.onEntityUpdate,\n onEntityInsert: options.onEntityInsert,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.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 *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Core\n */\n\nimport * as path from \"path\";\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\nimport { DefinitionElement, DefinitionModel, DefinitionPartition, Element, Entity, IModelDb, KnownLocations, Model, Subject } from \"@itwin/core-backend\";\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec,\n Code,\n CodeScopeSpec,\n CodeSpec,\n DefinitionElementProps,\n ElementProps,\n IModel,\n InformationPartitionElementProps,\n ModelProps,\n QueryBinder,\n QueryRowFormat,\n SubjectProps,\n} from \"@itwin/core-common\";\nimport { Ruleset } from \"@itwin/presentation-common\";\nimport { PresentationRules } from \"./domain/PresentationRulesDomain.js\";\nimport * as RulesetElements from \"./domain/RulesetElements.js\";\nimport { normalizeVersion } from \"./Utils.js\";\n\n/**\n * Interface for callbacks which will be called before and after Element/Model updates\n * @public\n */\ninterface UpdateCallbacks {\n onBeforeUpdate: (props: Entity) => Promise<void>;\n onAfterUpdate: (props: Entity) => Promise<void>;\n}\n\n/**\n * Interface for callbacks which will be called before and after Element/Model is inserted\n * @public\n */\ninterface InsertCallbacks {\n onBeforeInsert: (props: Entity) => Promise<void>;\n onAfterInsert: (props: Entity) => Promise<void>;\n}\n\n/**\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\n * @public\n */\nexport interface RulesetInsertOptions {\n /**\n * When should insertion be skipped:\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\n * version greater or equal to version of the inserted ruleset.\n *\n * Defaults to `same-id-and-version-eq`.\n */\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\n\n /**\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\n * - `all` - replace all rulesets with same id.\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\n *\n * Defaults to `exact`.\n */\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\n\n /**\n * Callbacks that will be called before and after `Entity` updates\n */\n onEntityUpdate?: UpdateCallbacks;\n\n /**\n * Callbacks that will be called before and after `Entity` is inserted\n */\n onEntityInsert?: InsertCallbacks;\n}\n\n/**\n * Properties for creating a `RulesetEmbedder` instance.\n * @public\n */\nexport interface RulesetEmbedderProps {\n /** iModel to embed rulesets to */\n imodel: IModelDb;\n /**\n * An ID of existing subject under which presentation ruleset will be located or created.\n * Defaults to 'IModel.rootSubjectId'.\n */\n parentSubjectId?: Id64String;\n}\n\n/**\n * An API for embedding presentation rulesets into iModels.\n * @public\n */\nexport class RulesetEmbedder {\n private _imodel: IModelDb;\n private _parentSubjectId: Id64String;\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\n private readonly _rulesetModelName = \"PresentationRules\";\n private readonly _rulesetSubjectName = \"PresentationRules\";\n\n /**\n * Constructs RulesetEmbedder\n */\n public constructor(props: RulesetEmbedderProps) {\n PresentationRules.registerSchema();\n this._imodel = props.imodel;\n this._parentSubjectId = props.parentSubjectId ?? IModel.rootSubjectId;\n }\n\n /**\n * Inserts a ruleset into iModel.\n * @param ruleset Ruleset to insert.\n * @param options Options for inserting a ruleset.\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\n */\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\n const normalizedOptions = normalizeRulesetInsertOptions(options);\n const rulesetVersion = normalizeVersion(ruleset.version);\n\n // ensure imodel has PresentationRules schema and required CodeSpecs\n await this.handleElementOperationPrerequisites();\n\n // find all rulesets with the same ID\n const rulesetsWithSameId: Array<{\n ruleset: Ruleset;\n id: Id64String;\n normalizedVersion: string;\n }> = [];\n const query = `\n SELECT ECInstanceId, JsonProperties\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\n const reader = this._imodel.createQueryReader(query, QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n while (await reader.step()) {\n const row = reader.current.toRow();\n const existingRulesetElementId: Id64String = row.id;\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\n rulesetsWithSameId.push({\n id: existingRulesetElementId,\n ruleset: existingRuleset,\n normalizedVersion: normalizeVersion(existingRuleset.version),\n });\n }\n\n // check if we need to do anything at all\n const shouldSkip =\n (normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0) ||\n (normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)) ||\n (normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion)));\n if (shouldSkip) {\n // we're not inserting anything - return ID of the ruleset element with the highest version\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\n if (!highest.ruleset.version || (curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))) {\n return curr;\n }\n return highest;\n }, rulesetsWithSameId[0]);\n return rulesetEntryWithHighestVersion.id;\n }\n\n // if requested, delete existing rulesets\n const rulesetsToRemove: Id64String[] = [];\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\n switch (normalizedOptions.replaceVersions) {\n case \"all\":\n return normalizedVersion !== rulesetVersion;\n case \"all-lower\":\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\n }\n return false;\n };\n rulesetsWithSameId.forEach((entry) => {\n if (shouldRemove(entry.ruleset, entry.normalizedVersion)) {\n rulesetsToRemove.push(entry.id);\n }\n });\n this._imodel.elements.deleteElement(rulesetsToRemove);\n\n // attempt to update ruleset with same ID and version\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\n if (exactMatch !== undefined) {\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\n }\n\n // no exact match found - insert a new ruleset element\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\n }\n\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\n assert(existingRulesetElement !== undefined);\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\n\n await this.updateElement(existingRulesetElement, callbacks);\n\n this._imodel.saveChanges();\n return existingRulesetElement.id;\n }\n\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\n const props: DefinitionElementProps = {\n model: model.id,\n code: rulesetCode,\n classFullName: RulesetElements.Ruleset.classFullName,\n jsonProperties: { jsonProperties: ruleset },\n };\n\n const element = await this.insertElement(props, callbacks);\n this._imodel.saveChanges();\n return element.id;\n }\n\n /**\n * Get all rulesets embedded in the iModel.\n */\n public async getRulesets(): Promise<Ruleset[]> {\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n return [];\n }\n\n const rulesetList: Ruleset[] = [];\n for await (const row of this._imodel.createQueryReader(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`)) {\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\n rulesetList.push(ruleset);\n }\n return rulesetList;\n }\n\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const rulesetModel = this.queryRulesetModel();\n if (undefined !== rulesetModel) {\n return rulesetModel;\n }\n\n const rulesetSubject = await this.insertSubject(callbacks);\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\n return this.insertDefinitionModel(definitionPartition, callbacks);\n }\n\n private queryRulesetModel(): DefinitionModel | undefined {\n const definitionPartition = this.queryDefinitionPartition();\n if (undefined === definitionPartition) {\n return undefined;\n }\n\n return this._imodel.models.getSubModel(definitionPartition.id);\n }\n\n private queryDefinitionPartition(): DefinitionPartition | undefined {\n const subject = this.querySubject();\n if (undefined === subject) {\n return undefined;\n }\n\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\n }\n\n private querySubject(): Subject | undefined {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const code = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n\n return this._imodel.elements.tryGetElement<Subject>(code);\n }\n\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\n const modelProps: ModelProps = {\n modeledElement: definitionPartition,\n name: this._rulesetModelName,\n classFullName: DefinitionModel.classFullName,\n isPrivate: true,\n };\n\n return this.insertModel(modelProps, callbacks);\n }\n\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\n const definitionPartitionProps: InformationPartitionElementProps = {\n parent: {\n id: rulesetSubject.id,\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\n },\n model: rulesetSubject.model,\n code: partitionCode,\n classFullName: DefinitionPartition.classFullName,\n };\n\n return this.insertElement(definitionPartitionProps, callbacks);\n }\n\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\n const parent = this._imodel.elements.getElement<Subject>(this._parentSubjectId);\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\n const subjectCode = new Code({\n spec: codeSpec.id,\n scope: parent.id,\n value: this._rulesetSubjectName,\n });\n const subjectProps: SubjectProps = {\n classFullName: Subject.classFullName,\n model: parent.model,\n parent: {\n id: parent.id,\n relClassName: \"BisCore:SubjectOwnsSubjects\",\n },\n code: subjectCode,\n };\n\n return this.insertElement(subjectProps, callbacks);\n }\n\n private async handleElementOperationPrerequisites(): Promise<void> {\n let hasChanges = false;\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName)) {\n // import PresentationRules ECSchema\n await this._imodel.importSchemas([this._schemaPath]);\n hasChanges = true;\n }\n\n if (!this._imodel.codeSpecs.hasName(PresentationRules.CodeSpec.Ruleset)) {\n // insert CodeSpec for ruleset elements\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\n hasChanges = true;\n }\n\n if (hasChanges) {\n this._imodel.saveChanges();\n }\n }\n\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\n const element = this._imodel.elements.createElement(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(element);\n try {\n return this._imodel.elements.getElement(element.insert());\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(element);\n }\n }\n\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\n const model = this._imodel.models.createModel(props);\n /* c8 ignore next */\n await callbacks?.onBeforeInsert(model);\n try {\n model.id = model.insert();\n return model;\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterInsert(model);\n }\n }\n\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\n /* c8 ignore next */\n await callbacks?.onBeforeUpdate(element);\n try {\n element.update();\n } finally {\n /* c8 ignore next */\n await callbacks?.onAfterUpdate(element);\n }\n }\n}\n\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\n if (options === undefined) {\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\n }\n\n return {\n skip: options.skip ?? \"same-id-and-version-eq\",\n replaceVersions: options.replaceVersions ?? \"exact\",\n onEntityUpdate: options.onEntityUpdate,\n onEntityInsert: options.onEntityInsert,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/presentation-backend",
|
|
3
|
-
"version": "5.1.0-dev.
|
|
3
|
+
"version": "5.1.0-dev.58",
|
|
4
4
|
"description": "Backend of iTwin.js Presentation library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
"./package.json": "./package.json"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@itwin/core-backend": "5.1.0-dev.
|
|
40
|
-
"@itwin/core-common": "5.1.0-dev.
|
|
41
|
-
"@itwin/core-bentley": "5.1.0-dev.
|
|
42
|
-
"@itwin/ecschema-metadata": "5.1.0-dev.
|
|
43
|
-
"@itwin/core-quantity": "5.1.0-dev.
|
|
44
|
-
"@itwin/presentation-common": "5.1.0-dev.
|
|
39
|
+
"@itwin/core-backend": "5.1.0-dev.58",
|
|
40
|
+
"@itwin/core-common": "5.1.0-dev.58",
|
|
41
|
+
"@itwin/core-bentley": "5.1.0-dev.58",
|
|
42
|
+
"@itwin/ecschema-metadata": "5.1.0-dev.58",
|
|
43
|
+
"@itwin/core-quantity": "5.1.0-dev.58",
|
|
44
|
+
"@itwin/presentation-common": "5.1.0-dev.58"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@itwin/eslint-plugin": "5.0.0-dev.1",
|
|
@@ -76,14 +76,14 @@
|
|
|
76
76
|
"sinon-chai": "^3.7.0",
|
|
77
77
|
"typemoq": "^2.1.0",
|
|
78
78
|
"typescript": "~5.6.2",
|
|
79
|
-
"@itwin/build-tools": "5.1.0-dev.
|
|
80
|
-
"@itwin/core-
|
|
81
|
-
"@itwin/core-
|
|
82
|
-
"@itwin/core-
|
|
83
|
-
"@itwin/
|
|
84
|
-
"@itwin/ecschema-metadata": "5.1.0-dev.
|
|
85
|
-
"
|
|
86
|
-
"
|
|
79
|
+
"@itwin/build-tools": "5.1.0-dev.58",
|
|
80
|
+
"@itwin/core-bentley": "5.1.0-dev.58",
|
|
81
|
+
"@itwin/core-backend": "5.1.0-dev.58",
|
|
82
|
+
"@itwin/core-quantity": "5.1.0-dev.58",
|
|
83
|
+
"@itwin/presentation-common": "5.1.0-dev.58",
|
|
84
|
+
"@itwin/ecschema-metadata": "5.1.0-dev.58",
|
|
85
|
+
"internal-tools": "3.0.0-dev.69",
|
|
86
|
+
"@itwin/core-common": "5.1.0-dev.58"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
89
|
"@itwin/presentation-shared": "^1.2.1",
|