@itwin/core-backend 5.7.0-dev.9 → 5.8.0-dev.1

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 (102) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/lib/cjs/BriefcaseManager.d.ts +138 -1
  3. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  4. package/lib/cjs/BriefcaseManager.js +336 -1
  5. package/lib/cjs/BriefcaseManager.js.map +1 -1
  6. package/lib/cjs/CloudSqlite.js +1 -1
  7. package/lib/cjs/CloudSqlite.js.map +1 -1
  8. package/lib/cjs/IModelDb.d.ts +71 -0
  9. package/lib/cjs/IModelDb.d.ts.map +1 -1
  10. package/lib/cjs/IModelDb.js +122 -6
  11. package/lib/cjs/IModelDb.js.map +1 -1
  12. package/lib/cjs/IModelHost.d.ts +15 -0
  13. package/lib/cjs/IModelHost.d.ts.map +1 -1
  14. package/lib/cjs/IModelHost.js +12 -0
  15. package/lib/cjs/IModelHost.js.map +1 -1
  16. package/lib/cjs/IModelJsFs.d.ts +2 -0
  17. package/lib/cjs/IModelJsFs.d.ts.map +1 -1
  18. package/lib/cjs/IModelJsFs.js +2 -0
  19. package/lib/cjs/IModelJsFs.js.map +1 -1
  20. package/lib/cjs/TileStorage.js +1 -1
  21. package/lib/cjs/TileStorage.js.map +1 -1
  22. package/lib/cjs/TxnManager.d.ts +39 -0
  23. package/lib/cjs/TxnManager.d.ts.map +1 -1
  24. package/lib/cjs/TxnManager.js +149 -0
  25. package/lib/cjs/TxnManager.js.map +1 -1
  26. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  27. package/lib/cjs/ViewDefinition.js +2 -0
  28. package/lib/cjs/ViewDefinition.js.map +1 -1
  29. package/lib/cjs/internal/IModelDbFontsImpl.js +1 -1
  30. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  31. package/lib/cjs/internal/IntegrityCheck.d.ts +240 -0
  32. package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -0
  33. package/lib/cjs/internal/IntegrityCheck.js +193 -0
  34. package/lib/cjs/internal/IntegrityCheck.js.map +1 -0
  35. package/lib/cjs/internal/annotations/fields.js +2 -2
  36. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  37. package/lib/cjs/rpc/tracing.js +2 -2
  38. package/lib/cjs/rpc/tracing.js.map +1 -1
  39. package/lib/cjs/workspace/Workspace.js +1 -1
  40. package/lib/cjs/workspace/Workspace.js.map +1 -1
  41. package/lib/esm/BriefcaseManager.d.ts +138 -1
  42. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  43. package/lib/esm/BriefcaseManager.js +336 -1
  44. package/lib/esm/BriefcaseManager.js.map +1 -1
  45. package/lib/esm/CloudSqlite.js +1 -1
  46. package/lib/esm/CloudSqlite.js.map +1 -1
  47. package/lib/esm/IModelDb.d.ts +71 -0
  48. package/lib/esm/IModelDb.d.ts.map +1 -1
  49. package/lib/esm/IModelDb.js +122 -6
  50. package/lib/esm/IModelDb.js.map +1 -1
  51. package/lib/esm/IModelHost.d.ts +15 -0
  52. package/lib/esm/IModelHost.d.ts.map +1 -1
  53. package/lib/esm/IModelHost.js +12 -0
  54. package/lib/esm/IModelHost.js.map +1 -1
  55. package/lib/esm/IModelJsFs.d.ts +2 -0
  56. package/lib/esm/IModelJsFs.d.ts.map +1 -1
  57. package/lib/esm/IModelJsFs.js +2 -0
  58. package/lib/esm/IModelJsFs.js.map +1 -1
  59. package/lib/esm/TileStorage.js +1 -1
  60. package/lib/esm/TileStorage.js.map +1 -1
  61. package/lib/esm/TxnManager.d.ts +39 -0
  62. package/lib/esm/TxnManager.d.ts.map +1 -1
  63. package/lib/esm/TxnManager.js +150 -1
  64. package/lib/esm/TxnManager.js.map +1 -1
  65. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  66. package/lib/esm/ViewDefinition.js +2 -0
  67. package/lib/esm/ViewDefinition.js.map +1 -1
  68. package/lib/esm/internal/IModelDbFontsImpl.js +1 -1
  69. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  70. package/lib/esm/internal/IntegrityCheck.d.ts +240 -0
  71. package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -0
  72. package/lib/esm/internal/IntegrityCheck.js +187 -0
  73. package/lib/esm/internal/IntegrityCheck.js.map +1 -0
  74. package/lib/esm/internal/annotations/fields.js +2 -2
  75. package/lib/esm/internal/annotations/fields.js.map +1 -1
  76. package/lib/esm/rpc/tracing.js +2 -2
  77. package/lib/esm/rpc/tracing.js.map +1 -1
  78. package/lib/esm/test/SquashSchemaAndDataChanges.test.d.ts +2 -0
  79. package/lib/esm/test/SquashSchemaAndDataChanges.test.d.ts.map +1 -0
  80. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +241 -0
  81. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -0
  82. package/lib/esm/test/hubaccess/Rebase.test.js +1575 -1568
  83. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  84. package/lib/esm/test/hubaccess/SemanticRebase.test.d.ts +2 -0
  85. package/lib/esm/test/hubaccess/SemanticRebase.test.d.ts.map +1 -0
  86. package/lib/esm/test/hubaccess/SemanticRebase.test.js +1206 -0
  87. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -0
  88. package/lib/esm/test/imodel/IModel.test.js +1 -1
  89. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  90. package/lib/esm/test/standalone/ChangesetReader.test.js +173 -2
  91. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  92. package/lib/esm/test/standalone/IntegrityCheck.test.d.ts +2 -0
  93. package/lib/esm/test/standalone/IntegrityCheck.test.d.ts.map +1 -0
  94. package/lib/esm/test/standalone/IntegrityCheck.test.js +385 -0
  95. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -0
  96. package/lib/esm/test/standalone/ViewDefinition.test.js +14 -2
  97. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  98. package/lib/esm/test/standalone/Workspace.test.js +5 -0
  99. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  100. package/lib/esm/workspace/Workspace.js +1 -1
  101. package/lib/esm/workspace/Workspace.js.map +1 -1
  102. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/rpc/tracing.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,0BAA0B;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAe,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qDAAqD;AAErD;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IACX,MAAM,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAElD;;SAEK;IACE,MAAM,KAAK,eAAe;QAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAA6B,CAAC;IACjE,CAAC;IAED;;SAEK;IACE,MAAM,KAAK,qBAAqB;QACrC,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,8CAA8C;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,QAAqB,EAAE,EAAoB;QACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAI,QAAqB,EAAE,EAAoB;QAC5E,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YAC1G,UAAU,EAAE;gBACV,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,uBAAuB;gBAChD,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,wCAAwC;aACpF;YACD,IAAI,EAAE,QAAQ,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;;AAGH,gBAAgB;AAChB,MAAM,UAAU,iBAAiB,CAAC,sBAA+B,KAAK;IACpE,aAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mDAAmD;IAEnI,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YACrF,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzC,aAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mEAAmE;QAC7J,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;YACxF,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,0GAA0G;IAC1G,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AACjG,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n// cspell:ignore calltrace\r\n\r\nimport { assert, Logger, SpanKind, Tracing } from \"@itwin/core-bentley\";\r\nimport { RpcActivity, RpcInvocation } from \"@itwin/core-common\";\r\nimport { AsyncLocalStorage } from \"async_hooks\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/* eslint-disable @typescript-eslint/no-deprecated */\r\n\r\n/**\r\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\r\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\r\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\r\n * from the RpcActivity.\r\n * @public\r\n */\r\nexport class RpcTrace {\r\n private static _storage = new AsyncLocalStorage();\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\r\n * RpcActivity in the current call stack.\r\n * */\r\n public static get currentActivity(): RpcActivity | undefined {\r\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\r\n }\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity\r\n * exists in the current call stack.\r\n * */\r\n public static get expectCurrentActivity(): RpcActivity {\r\n assert(undefined !== RpcTrace.currentActivity);\r\n return RpcTrace.currentActivity;\r\n }\r\n\r\n /** Start the processing of an RpcActivity. */\r\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return RpcTrace._storage.run(activity, fn);\r\n }\r\n\r\n /** Start the processing of an RpcActivity inside an OpenTelemetry span */\r\n public static async runWithSpan<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return Tracing.withSpan(activity.rpcMethod ?? \"unknown RPC method\", async () => RpcTrace.run(activity, fn), {\r\n attributes: {\r\n ...Logger.getMetaData(), // add default metadata\r\n ...RpcInvocation.sanitizeForLog(activity), // override with the correct RpcActivity\r\n },\r\n kind: SpanKind.INTERNAL,\r\n });\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function initializeTracing(enableOpenTelemetry: boolean = false) {\r\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.run(activity, fn); // redirect the invocation processing to the tracer\r\n\r\n if (enableOpenTelemetry) {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const api = require(\"@opentelemetry/api\");\r\n const tracer = api.trace.getTracer(\"@itwin/core-backend\", IModelHost.backendVersion);\r\n Tracing.enableOpenTelemetry(tracer, api);\r\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.runWithSpan(activity, fn); // wrap invocation in an OpenTelemetry span in addition to RpcTrace\r\n } catch (e) {\r\n Logger.logError(BackendLoggerCategory.IModelHost, \"Failed to initialize OpenTelemetry\");\r\n Logger.logException(BackendLoggerCategory.IModelHost, e);\r\n }\r\n }\r\n\r\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\r\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\r\n}\r\n"]}
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/rpc/tracing.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,0BAA0B;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAe,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qDAAqD;AAErD;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IACX,MAAM,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAElD;;SAEK;IACE,MAAM,KAAK,eAAe;QAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAA6B,CAAC;IACjE,CAAC;IAED;;SAEK;IACE,MAAM,KAAK,qBAAqB;QACrC,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,8CAA8C;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,QAAqB,EAAE,EAAoB;QACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAI,QAAqB,EAAE,EAAoB;QAC5E,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YAC1G,UAAU,EAAE;gBACV,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,uBAAuB;gBAChD,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,wCAAwC;aACpF;YACD,IAAI,EAAE,QAAQ,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;;AAGH,gBAAgB;AAChB,MAAM,UAAU,iBAAiB,CAAC,sBAA+B,KAAK;IACpE,aAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mDAAmD;IAEnI,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YACrF,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzC,aAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mEAAmE;QAC7J,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;YAC1F,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,0GAA0G;IAC1G,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AACjG,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n// cspell:ignore calltrace\r\n\r\nimport { assert, Logger, SpanKind, Tracing } from \"@itwin/core-bentley\";\r\nimport { RpcActivity, RpcInvocation } from \"@itwin/core-common\";\r\nimport { AsyncLocalStorage } from \"async_hooks\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/* eslint-disable @typescript-eslint/no-deprecated */\r\n\r\n/**\r\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\r\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\r\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\r\n * from the RpcActivity.\r\n * @public\r\n */\r\nexport class RpcTrace {\r\n private static _storage = new AsyncLocalStorage();\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\r\n * RpcActivity in the current call stack.\r\n * */\r\n public static get currentActivity(): RpcActivity | undefined {\r\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\r\n }\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity\r\n * exists in the current call stack.\r\n * */\r\n public static get expectCurrentActivity(): RpcActivity {\r\n assert(undefined !== RpcTrace.currentActivity);\r\n return RpcTrace.currentActivity;\r\n }\r\n\r\n /** Start the processing of an RpcActivity. */\r\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return RpcTrace._storage.run(activity, fn);\r\n }\r\n\r\n /** Start the processing of an RpcActivity inside an OpenTelemetry span */\r\n public static async runWithSpan<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return Tracing.withSpan(activity.rpcMethod ?? \"unknown RPC method\", async () => RpcTrace.run(activity, fn), {\r\n attributes: {\r\n ...Logger.getMetaData(), // add default metadata\r\n ...RpcInvocation.sanitizeForLog(activity), // override with the correct RpcActivity\r\n },\r\n kind: SpanKind.INTERNAL,\r\n });\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function initializeTracing(enableOpenTelemetry: boolean = false) {\r\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.run(activity, fn); // redirect the invocation processing to the tracer\r\n\r\n if (enableOpenTelemetry) {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const api = require(\"@opentelemetry/api\");\r\n const tracer = api.trace.getTracer(\"@itwin/core-backend\", IModelHost.backendVersion);\r\n Tracing.enableOpenTelemetry(tracer, api);\r\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.runWithSpan(activity, fn); // wrap invocation in an OpenTelemetry span in addition to RpcTrace\r\n } catch (e) {\r\n Logger.logWarning(BackendLoggerCategory.IModelHost, \"Failed to initialize OpenTelemetry\");\r\n Logger.logError(BackendLoggerCategory.IModelHost, e);\r\n }\r\n }\r\n\r\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\r\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SquashSchemaAndDataChanges.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquashSchemaAndDataChanges.test.d.ts","sourceRoot":"","sources":["../../../src/test/SquashSchemaAndDataChanges.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,241 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { Guid } from "@itwin/core-bentley";
6
+ import { HubWrappers, IModelTestUtils } from "./IModelTestUtils";
7
+ import { ChannelControl } from "../ChannelControl";
8
+ import { Code, IModel, SubCategoryAppearance } from "@itwin/core-common";
9
+ import { DrawingCategory } from "../Category";
10
+ import { HubMock } from "../internal/HubMock";
11
+ import { KnownTestLocations } from "./KnownTestLocations";
12
+ import * as chai from "chai";
13
+ import { TestUtils } from "./TestUtils";
14
+ const schemas = {
15
+ /** Base schema v01.00.00 with classes A, C, D */
16
+ v01x00x00: `<?xml version="1.0" encoding="UTF-8"?>
17
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
18
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
19
+ <ECEntityClass typeName="A">
20
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
21
+ <ECProperty propertyName="PropA" typeName="string"/>
22
+ </ECEntityClass>
23
+ <ECEntityClass typeName="C">
24
+ <BaseClass>A</BaseClass>
25
+ <ECProperty propertyName="PropC" typeName="string"/>
26
+ </ECEntityClass>
27
+ <ECEntityClass typeName="D">
28
+ <BaseClass>A</BaseClass>
29
+ <ECProperty propertyName="PropD" typeName="string"/>
30
+ </ECEntityClass>
31
+ </ECSchema>`,
32
+ /** v01.00.01 - Adds PropC2 to class C (trivial additive change) */
33
+ v01x00x01AddPropC2: `<?xml version="1.0" encoding="UTF-8"?>
34
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.01" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
35
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
36
+ <ECEntityClass typeName="A">
37
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
38
+ <ECProperty propertyName="PropA" typeName="string"/>
39
+ </ECEntityClass>
40
+ <ECEntityClass typeName="C">
41
+ <BaseClass>A</BaseClass>
42
+ <ECProperty propertyName="PropC" typeName="string"/>
43
+ <ECProperty propertyName="PropC2" typeName="string"/>
44
+ </ECEntityClass>
45
+ <ECEntityClass typeName="D">
46
+ <BaseClass>A</BaseClass>
47
+ <ECProperty propertyName="PropD" typeName="string"/>
48
+ </ECEntityClass>
49
+ </ECSchema>`,
50
+ /** v01.00.02 - Adds PropD2 to class D (trivial additive change) */
51
+ v01x00x02AddPropD2: `<?xml version="1.0" encoding="UTF-8"?>
52
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.02" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
53
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
54
+ <ECEntityClass typeName="A">
55
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
56
+ <ECProperty propertyName="PropA" typeName="string"/>
57
+ </ECEntityClass>
58
+ <ECEntityClass typeName="C">
59
+ <BaseClass>A</BaseClass>
60
+ <ECProperty propertyName="PropC" typeName="string"/>
61
+ <ECProperty propertyName="PropC2" typeName="string"/>
62
+ </ECEntityClass>
63
+ <ECEntityClass typeName="D">
64
+ <BaseClass>A</BaseClass>
65
+ <ECProperty propertyName="PropD" typeName="string"/>
66
+ <ECProperty propertyName="PropD2" typeName="string"/>
67
+ </ECEntityClass>
68
+ </ECSchema>`,
69
+ /** v01.00.02 - Moves PropC from C to A (requires data transformation) on top of v01.00.01 */
70
+ v01x00x02MovePropCToA: `<?xml version="1.0" encoding="UTF-8"?>
71
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.02" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
72
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
73
+ <ECEntityClass typeName="A">
74
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
75
+ <ECProperty propertyName="PropA" typeName="string"/>
76
+ <ECProperty propertyName="PropC" typeName="string"/>
77
+ </ECEntityClass>
78
+ <ECEntityClass typeName="C">
79
+ <BaseClass>A</BaseClass>
80
+ <ECProperty propertyName="PropC2" typeName="string"/>
81
+ </ECEntityClass>
82
+ <ECEntityClass typeName="D">
83
+ <BaseClass>A</BaseClass>
84
+ <ECProperty propertyName="PropD" typeName="string"/>
85
+ </ECEntityClass>
86
+ </ECSchema>`,
87
+ /** v01.00.03 - Builds on top of v01.00.02 and in addition moves PropD to base, so we can have incoming and local transforming changes */
88
+ v01x00x03MovePropCAndD: `<?xml version="1.0" encoding="UTF-8"?>
89
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.03" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
90
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
91
+ <ECEntityClass typeName="A">
92
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
93
+ <ECProperty propertyName="PropA" typeName="string"/>
94
+ <ECProperty propertyName="PropC" typeName="string"/>
95
+ <ECProperty propertyName="PropD" typeName="string"/>
96
+ </ECEntityClass>
97
+ <ECEntityClass typeName="C">
98
+ <BaseClass>A</BaseClass>
99
+ <ECProperty propertyName="PropC2" typeName="string"/>
100
+ </ECEntityClass>
101
+ <ECEntityClass typeName="D">
102
+ <BaseClass>A</BaseClass>
103
+ <ECProperty propertyName="PropD2" typeName="string"/>
104
+ </ECEntityClass>
105
+ </ECSchema>`,
106
+ /** v01.00.01 (incompatible variant) - Adds PropC3 instead of PropC2 to class C (same version) */
107
+ v01x00x01AddPropC3Incompatible: `<?xml version="1.0" encoding="UTF-8"?>
108
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.01" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
109
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
110
+ <ECEntityClass typeName="A">
111
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
112
+ <ECProperty propertyName="PropA" typeName="string"/>
113
+ </ECEntityClass>
114
+ <ECEntityClass typeName="C">
115
+ <BaseClass>A</BaseClass>
116
+ <ECProperty propertyName="PropC" typeName="string"/>
117
+ <ECProperty propertyName="PropC3" typeName="string"/>
118
+ </ECEntityClass>
119
+ <ECEntityClass typeName="D">
120
+ <BaseClass>A</BaseClass>
121
+ <ECProperty propertyName="PropD" typeName="string"/>
122
+ </ECEntityClass>
123
+ </ECSchema>`,
124
+ /** v01.00.02 (incompatible variant) - Adds PropC3 instead of PropC2 to class C (higher version) */
125
+ v01x00x02AddPropC3Incompatible: `<?xml version="1.0" encoding="UTF-8"?>
126
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.02" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
127
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
128
+ <ECEntityClass typeName="A">
129
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
130
+ <ECProperty propertyName="PropA" typeName="string"/>
131
+ </ECEntityClass>
132
+ <ECEntityClass typeName="C">
133
+ <BaseClass>A</BaseClass>
134
+ <ECProperty propertyName="PropC" typeName="string"/>
135
+ <ECProperty propertyName="PropC3" typeName="string"/>
136
+ </ECEntityClass>
137
+ <ECEntityClass typeName="D">
138
+ <BaseClass>A</BaseClass>
139
+ <ECProperty propertyName="PropD" typeName="string"/>
140
+ </ECEntityClass>
141
+ </ECSchema>`,
142
+ /** v01.00.02 (incompatible variant) - Adds PropC2 (higher version, different type) */
143
+ v01x00x02AddPropC2Incompatible: `<?xml version="1.0" encoding="UTF-8"?>
144
+ <ECSchema schemaName="TestDomain" alias="td" version="01.00.02" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
145
+ <ECSchemaReference name="BisCore" version="01.00.23" alias="bis"/>
146
+ <ECEntityClass typeName="A">
147
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
148
+ <ECProperty propertyName="PropA" typeName="string"/>
149
+ </ECEntityClass>
150
+ <ECEntityClass typeName="C">
151
+ <BaseClass>A</BaseClass>
152
+ <ECProperty propertyName="PropC" typeName="string"/>
153
+ <ECProperty propertyName="PropC2" typeName="int"/>
154
+ </ECEntityClass>
155
+ <ECEntityClass typeName="D">
156
+ <BaseClass>A</BaseClass>
157
+ <ECProperty propertyName="PropD" typeName="string"/>
158
+ </ECEntityClass>
159
+ </ECSchema>`,
160
+ };
161
+ describe("SquashSchemaAndDataChanges", () => {
162
+ let imodel;
163
+ let iModelId;
164
+ let drawingModelId;
165
+ let drawingCategoryId;
166
+ const createModelAndCategory = async (db) => {
167
+ const modelCode = IModelTestUtils.getUniqueModelCode(db, "DrawingModel");
168
+ await db.locks.acquireLocks({ shared: IModel.dictionaryId });
169
+ const [, newDrawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(db, modelCode);
170
+ const newDrawingCategoryId = DrawingCategory.insert(db, IModel.dictionaryId, "DrawingCategory", new SubCategoryAppearance());
171
+ db.saveChanges();
172
+ return [newDrawingModelId, newDrawingCategoryId];
173
+ };
174
+ const insertElement = (briefcase, className, properties) => {
175
+ const elementProps = {
176
+ classFullName: className,
177
+ model: drawingModelId,
178
+ category: drawingCategoryId,
179
+ code: Code.createEmpty(),
180
+ ...properties,
181
+ };
182
+ const element = briefcase.elements.createElement(elementProps);
183
+ return briefcase.elements.insertElement(element.toJSON());
184
+ };
185
+ before(async () => {
186
+ HubMock.startup("MergeSchemaAndDataChanges", KnownTestLocations.outputDir);
187
+ await TestUtils.shutdownBackend();
188
+ await TestUtils.startBackend({ useSemanticRebase: true });
189
+ });
190
+ beforeEach(async () => {
191
+ iModelId = await HubWrappers.createIModel("user1", HubMock.iTwinId, `Test-${Guid.createValue()}`);
192
+ imodel = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
193
+ imodel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
194
+ imodel.saveChanges();
195
+ [drawingModelId, drawingCategoryId] = await createModelAndCategory(imodel);
196
+ await imodel.importSchemaStrings([schemas.v01x00x00, schemas.v01x00x01AddPropC2]);
197
+ await imodel.pushChanges({ description: "create model and category and imported schemas" });
198
+ });
199
+ afterEach(async () => {
200
+ imodel.close();
201
+ await HubMock.deleteIModel({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
202
+ });
203
+ after(async () => {
204
+ HubMock.shutdown();
205
+ await TestUtils.shutdownBackend();
206
+ await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost
207
+ });
208
+ it("should throw error if tried to import schema while unsaved changes are present", async () => {
209
+ await imodel.locks.acquireLocks({ shared: drawingModelId });
210
+ insertElement(imodel, "TestDomain:C", {
211
+ propA: "local_value_a",
212
+ propC: "local_value_c",
213
+ });
214
+ await chai.expect(imodel.importSchemaStrings([schemas.v01x00x02MovePropCToA])).to.be.rejectedWith("Cannot import schemas with unsaved changes when useSemanticRebase flag is on");
215
+ await imodel.discardChanges();
216
+ });
217
+ it("should squash schema and data changes if useSemanticRebase flag is on", async () => {
218
+ await imodel.locks.acquireLocks({ shared: drawingModelId });
219
+ insertElement(imodel, "TestDomain:C", {
220
+ propA: "local_value_a",
221
+ propC: "local_value_c",
222
+ });
223
+ imodel.saveChanges("local data change");
224
+ await imodel.importSchemaStrings([schemas.v01x00x02MovePropCToA]); // transforming data change
225
+ const lastTxnProps = imodel.txns.getLastSavedTxnProps();
226
+ chai.assert(lastTxnProps !== undefined);
227
+ chai.assert(lastTxnProps?.type === "Schema");
228
+ chai.assert(lastTxnProps?.prevId !== undefined);
229
+ // both schema and data(migration) changes are merged into single txn
230
+ const secondLastTxnProps = imodel.txns.getTxnProps(lastTxnProps.prevId);
231
+ chai.assert(secondLastTxnProps !== undefined);
232
+ chai.assert(secondLastTxnProps?.type === "Ddl");
233
+ chai.assert(secondLastTxnProps?.prevId !== undefined);
234
+ const thirdLastTxnProps = imodel.txns.getTxnProps(secondLastTxnProps.prevId);
235
+ chai.assert(thirdLastTxnProps !== undefined);
236
+ chai.assert(thirdLastTxnProps?.type === "Data");
237
+ chai.assert(thirdLastTxnProps?.prevId === undefined);
238
+ await imodel.discardChanges();
239
+ });
240
+ });
241
+ //# sourceMappingURL=SquashSchemaAndDataChanges.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquashSchemaAndDataChanges.test.js","sourceRoot":"","sources":["../../../src/test/SquashSchemaAndDataChanges.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Guid, Id64String } from \"@itwin/core-bentley\";\r\nimport { BriefcaseDb } from \"../IModelDb\";\r\nimport { HubWrappers, IModelTestUtils } from \"./IModelTestUtils\";\r\nimport { ChannelControl } from \"../ChannelControl\";\r\nimport { Code, GeometricElementProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { DrawingCategory } from \"../Category\";\r\nimport { HubMock } from \"../internal/HubMock\";\r\nimport { KnownTestLocations } from \"./KnownTestLocations\";\r\nimport * as chai from \"chai\";\r\nimport { TestUtils } from \"./TestUtils\";\r\n\r\nconst schemas = {\r\n /** Base schema v01.00.00 with classes A, C, D */\r\n v01x00x00: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.01 - Adds PropC2 to class C (trivial additive change) */\r\n v01x00x01AddPropC2: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.02 - Adds PropD2 to class D (trivial additive change) */\r\n v01x00x02AddPropD2: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.02\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropD2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.02 - Moves PropC from C to A (requires data transformation) on top of v01.00.01 */\r\n v01x00x02MovePropCToA: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.02\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.03 - Builds on top of v01.00.02 and in addition moves PropD to base, so we can have incoming and local transforming changes */\r\n v01x00x03MovePropCAndD: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.03\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD2\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.01 (incompatible variant) - Adds PropC3 instead of PropC2 to class C (same version) */\r\n v01x00x01AddPropC3Incompatible: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC3\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.02 (incompatible variant) - Adds PropC3 instead of PropC2 to class C (higher version) */\r\n v01x00x02AddPropC3Incompatible: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.02\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC3\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n\r\n /** v01.00.02 (incompatible variant) - Adds PropC2 (higher version, different type) */\r\n v01x00x02AddPropC2Incompatible: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"td\" version=\"01.00.02\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.23\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"A\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"PropA\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"C\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropC\" typeName=\"string\"/>\r\n <ECProperty propertyName=\"PropC2\" typeName=\"int\"/>\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"D\">\r\n <BaseClass>A</BaseClass>\r\n <ECProperty propertyName=\"PropD\" typeName=\"string\"/>\r\n </ECEntityClass>\r\n </ECSchema>`,\r\n};\r\n\r\ndescribe(\"SquashSchemaAndDataChanges\", () => {\r\n let imodel: BriefcaseDb;\r\n let iModelId: string;\r\n let drawingModelId: string;\r\n let drawingCategoryId: string;\r\n\r\n const createModelAndCategory = async (db: BriefcaseDb) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(db, \"DrawingModel\");\r\n await db.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n const [, newDrawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(db, modelCode);\r\n const newDrawingCategoryId = DrawingCategory.insert(\r\n db,\r\n IModel.dictionaryId,\r\n \"DrawingCategory\",\r\n new SubCategoryAppearance()\r\n );\r\n db.saveChanges();\r\n return [newDrawingModelId, newDrawingCategoryId];\r\n };\r\n\r\n const insertElement = (\r\n briefcase: BriefcaseDb,\r\n className: string,\r\n properties: Record<string, any>\r\n ): Id64String => {\r\n const elementProps: GeometricElementProps = {\r\n classFullName: className,\r\n model: drawingModelId,\r\n category: drawingCategoryId,\r\n code: Code.createEmpty(),\r\n ...properties,\r\n };\r\n const element = briefcase.elements.createElement(elementProps);\r\n return briefcase.elements.insertElement(element.toJSON());\r\n }\r\n\r\n before(async () => {\r\n HubMock.startup(\"MergeSchemaAndDataChanges\", KnownTestLocations.outputDir);\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend({ useSemanticRebase: true });\r\n });\r\n\r\n beforeEach(async () => {\r\n iModelId = await HubWrappers.createIModel(\"user1\", HubMock.iTwinId, `Test-${Guid.createValue()}`);\r\n\r\n imodel = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n\r\n imodel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n imodel.saveChanges();\r\n [drawingModelId, drawingCategoryId] = await createModelAndCategory(imodel);\r\n await imodel.importSchemaStrings([schemas.v01x00x00, schemas.v01x00x01AddPropC2]);\r\n await imodel.pushChanges({ description: \"create model and category and imported schemas\" });\r\n });\r\n\r\n afterEach(async () => {\r\n imodel.close();\r\n await HubMock.deleteIModel({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown();\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost\r\n });\r\n\r\n it(\"should throw error if tried to import schema while unsaved changes are present\", async () => {\r\n await imodel.locks.acquireLocks({ shared: drawingModelId });\r\n insertElement(imodel, \"TestDomain:C\", {\r\n propA: \"local_value_a\",\r\n propC: \"local_value_c\",\r\n });\r\n\r\n await chai.expect(imodel.importSchemaStrings([schemas.v01x00x02MovePropCToA])).to.be.rejectedWith(\"Cannot import schemas with unsaved changes when useSemanticRebase flag is on\");\r\n await imodel.discardChanges();\r\n });\r\n\r\n it(\"should squash schema and data changes if useSemanticRebase flag is on\", async () => {\r\n await imodel.locks.acquireLocks({ shared: drawingModelId });\r\n insertElement(imodel, \"TestDomain:C\", {\r\n propA: \"local_value_a\",\r\n propC: \"local_value_c\",\r\n });\r\n imodel.saveChanges(\"local data change\");\r\n await imodel.importSchemaStrings([schemas.v01x00x02MovePropCToA]); // transforming data change\r\n\r\n const lastTxnProps = imodel.txns.getLastSavedTxnProps();\r\n chai.assert(lastTxnProps !== undefined);\r\n chai.assert(lastTxnProps?.type === \"Schema\");\r\n chai.assert(lastTxnProps?.prevId !== undefined);\r\n // both schema and data(migration) changes are merged into single txn\r\n\r\n const secondLastTxnProps = imodel.txns.getTxnProps(lastTxnProps.prevId);\r\n chai.assert(secondLastTxnProps !== undefined);\r\n chai.assert(secondLastTxnProps?.type === \"Ddl\");\r\n chai.assert(secondLastTxnProps?.prevId !== undefined);\r\n\r\n const thirdLastTxnProps = imodel.txns.getTxnProps(secondLastTxnProps.prevId);\r\n chai.assert(thirdLastTxnProps !== undefined);\r\n chai.assert(thirdLastTxnProps?.type === \"Data\");\r\n chai.assert(thirdLastTxnProps?.prevId === undefined);\r\n\r\n await imodel.discardChanges();\r\n });\r\n});"]}