@itwin/core-backend 5.11.0-dev.9 → 5.12.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 (507) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.d.ts +14 -1
  6. package/lib/cjs/BlobContainerService.d.ts.map +1 -1
  7. package/lib/cjs/BlobContainerService.js.map +1 -1
  8. package/lib/cjs/BriefcaseManager.d.ts +3 -1
  9. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  10. package/lib/cjs/BriefcaseManager.js +3 -3
  11. package/lib/cjs/BriefcaseManager.js.map +1 -1
  12. package/lib/cjs/CatalogDb.js.map +1 -1
  13. package/lib/cjs/Category.js.map +1 -1
  14. package/lib/cjs/ChangeSummaryManager.js +2 -2
  15. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  16. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  17. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  18. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  19. package/lib/cjs/ChangesetReader.js +3 -3
  20. package/lib/cjs/ChangesetReader.js.map +1 -1
  21. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  22. package/lib/cjs/ChannelControl.js.map +1 -1
  23. package/lib/cjs/CheckpointManager.js.map +1 -1
  24. package/lib/cjs/ClassRegistry.js +5 -5
  25. package/lib/cjs/ClassRegistry.js.map +1 -1
  26. package/lib/cjs/CloudSqlite.d.ts +1 -1
  27. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  28. package/lib/cjs/CloudSqlite.js +4 -1
  29. package/lib/cjs/CloudSqlite.js.map +1 -1
  30. package/lib/cjs/CodeService.js.map +1 -1
  31. package/lib/cjs/CodeSpecs.js.map +1 -1
  32. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  33. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  34. package/lib/cjs/DevTools.js.map +1 -1
  35. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  36. package/lib/cjs/DisplayStyle.js +4 -8
  37. package/lib/cjs/DisplayStyle.js.map +1 -1
  38. package/lib/cjs/ECDb.js.map +1 -1
  39. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  40. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  41. package/lib/cjs/ECSqlStatement.js.map +1 -1
  42. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  43. package/lib/cjs/EditTxn.d.ts +56 -1
  44. package/lib/cjs/EditTxn.d.ts.map +1 -1
  45. package/lib/cjs/EditTxn.js +138 -0
  46. package/lib/cjs/EditTxn.js.map +1 -1
  47. package/lib/cjs/Element.js.map +1 -1
  48. package/lib/cjs/ElementAspect.js.map +1 -1
  49. package/lib/cjs/ElementGraphics.js.map +1 -1
  50. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  51. package/lib/cjs/Entity.js.map +1 -1
  52. package/lib/cjs/EntityReferences.js.map +1 -1
  53. package/lib/cjs/ExportGraphics.js.map +1 -1
  54. package/lib/cjs/ExternalSource.js.map +1 -1
  55. package/lib/cjs/FontFile.js.map +1 -1
  56. package/lib/cjs/GeoCoordConfig.d.ts +6 -0
  57. package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
  58. package/lib/cjs/GeoCoordConfig.js +6 -0
  59. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  60. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  61. package/lib/cjs/GeometrySummary.js +47 -47
  62. package/lib/cjs/GeometrySummary.js.map +1 -1
  63. package/lib/cjs/IModelDb.d.ts +40 -0
  64. package/lib/cjs/IModelDb.d.ts.map +1 -1
  65. package/lib/cjs/IModelDb.js +26 -8
  66. package/lib/cjs/IModelDb.js.map +1 -1
  67. package/lib/cjs/IModelDbFonts.js.map +1 -1
  68. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  69. package/lib/cjs/IModelHost.d.ts +5 -3
  70. package/lib/cjs/IModelHost.d.ts.map +1 -1
  71. package/lib/cjs/IModelHost.js.map +1 -1
  72. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  73. package/lib/cjs/IModelJsFs.js.map +1 -1
  74. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  75. package/lib/cjs/IpcHost.js.map +1 -1
  76. package/lib/cjs/LineStyle.js.map +1 -1
  77. package/lib/cjs/LocalHub.js +1 -1
  78. package/lib/cjs/LocalHub.js.map +1 -1
  79. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  80. package/lib/cjs/LockControl.js.map +1 -1
  81. package/lib/cjs/Material.js.map +1 -1
  82. package/lib/cjs/Model.js.map +1 -1
  83. package/lib/cjs/NativeAppStorage.js.map +1 -1
  84. package/lib/cjs/NativeHost.js +1 -1
  85. package/lib/cjs/NativeHost.js.map +1 -1
  86. package/lib/cjs/NavigationRelationship.js.map +1 -1
  87. package/lib/cjs/PartialChangeUnifier.js +7 -7
  88. package/lib/cjs/PartialChangeUnifier.js.map +1 -1
  89. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  90. package/lib/cjs/PropertyStore.js.map +1 -1
  91. package/lib/cjs/Relationship.js.map +1 -1
  92. package/lib/cjs/RpcBackend.js.map +1 -1
  93. package/lib/cjs/SQLiteDb.js.map +1 -1
  94. package/lib/cjs/Schema.js.map +1 -1
  95. package/lib/cjs/SchemaSync.js.map +1 -1
  96. package/lib/cjs/SchemaUtils.js.map +1 -1
  97. package/lib/cjs/SheetIndex.js.map +1 -1
  98. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  99. package/lib/cjs/SqliteStatement.js.map +1 -1
  100. package/lib/cjs/StashManager.js.map +1 -1
  101. package/lib/cjs/Texture.js.map +1 -1
  102. package/lib/cjs/TileStorage.js.map +1 -1
  103. package/lib/cjs/TxnManager.js.map +1 -1
  104. package/lib/cjs/ViewDefinition.js.map +1 -1
  105. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  106. package/lib/cjs/ViewStore.js.map +1 -1
  107. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  108. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  109. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  110. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  111. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  112. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  113. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  114. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  115. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +36 -36
  116. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +28 -28
  117. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  118. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  119. package/lib/cjs/core-backend.js.map +1 -1
  120. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  121. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  122. package/lib/cjs/domains/GenericElements.js.map +1 -1
  123. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  124. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  125. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  126. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  127. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  128. package/lib/cjs/internal/HubMock.js.map +1 -1
  129. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  130. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  131. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  132. package/lib/cjs/internal/NoLocks.js.map +1 -1
  133. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  134. package/lib/cjs/internal/ServerBasedLocks.js +33 -33
  135. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  136. package/lib/cjs/internal/Symbols.js.map +1 -1
  137. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  138. package/lib/cjs/internal/cross-package.js.map +1 -1
  139. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  140. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  141. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  142. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  143. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  144. package/lib/cjs/rpc/multipart.js.map +1 -1
  145. package/lib/cjs/rpc/tracing.js.map +1 -1
  146. package/lib/cjs/rpc/web/logging.js.map +1 -1
  147. package/lib/cjs/rpc/web/request.js.map +1 -1
  148. package/lib/cjs/rpc/web/response.js.map +1 -1
  149. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  150. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  151. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  152. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  153. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  154. package/lib/cjs/workspace/Settings.js.map +1 -1
  155. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  156. package/lib/cjs/workspace/SettingsEditor.d.ts +4 -9
  157. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  158. package/lib/cjs/workspace/SettingsEditor.js +31 -15
  159. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  160. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  161. package/lib/cjs/workspace/Workspace.js.map +1 -1
  162. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  163. package/lib/esm/BackendHubAccess.js.map +1 -1
  164. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  165. package/lib/esm/BisCoreSchema.js.map +1 -1
  166. package/lib/esm/BlobContainerService.d.ts +14 -1
  167. package/lib/esm/BlobContainerService.d.ts.map +1 -1
  168. package/lib/esm/BlobContainerService.js.map +1 -1
  169. package/lib/esm/BriefcaseManager.d.ts +3 -1
  170. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  171. package/lib/esm/BriefcaseManager.js +3 -3
  172. package/lib/esm/BriefcaseManager.js.map +1 -1
  173. package/lib/esm/CatalogDb.js.map +1 -1
  174. package/lib/esm/Category.js.map +1 -1
  175. package/lib/esm/ChangeSummaryManager.js +2 -2
  176. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  177. package/lib/esm/ChangedElementsDb.js.map +1 -1
  178. package/lib/esm/ChangesetECAdaptor.js +248 -248
  179. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  180. package/lib/esm/ChangesetReader.js +3 -3
  181. package/lib/esm/ChangesetReader.js.map +1 -1
  182. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  183. package/lib/esm/ChannelControl.js.map +1 -1
  184. package/lib/esm/CheckpointManager.js.map +1 -1
  185. package/lib/esm/ClassRegistry.js +5 -5
  186. package/lib/esm/ClassRegistry.js.map +1 -1
  187. package/lib/esm/CloudSqlite.d.ts +1 -1
  188. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  189. package/lib/esm/CloudSqlite.js +4 -1
  190. package/lib/esm/CloudSqlite.js.map +1 -1
  191. package/lib/esm/CodeService.js.map +1 -1
  192. package/lib/esm/CodeSpecs.js.map +1 -1
  193. package/lib/esm/ConcurrentQuery.js.map +1 -1
  194. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  195. package/lib/esm/DevTools.js.map +1 -1
  196. package/lib/esm/DisplayStyle.d.ts.map +1 -1
  197. package/lib/esm/DisplayStyle.js +4 -8
  198. package/lib/esm/DisplayStyle.js.map +1 -1
  199. package/lib/esm/ECDb.js.map +1 -1
  200. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  201. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  202. package/lib/esm/ECSqlStatement.js.map +1 -1
  203. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  204. package/lib/esm/EditTxn.d.ts +56 -1
  205. package/lib/esm/EditTxn.d.ts.map +1 -1
  206. package/lib/esm/EditTxn.js +140 -2
  207. package/lib/esm/EditTxn.js.map +1 -1
  208. package/lib/esm/Element.js.map +1 -1
  209. package/lib/esm/ElementAspect.js.map +1 -1
  210. package/lib/esm/ElementGraphics.js.map +1 -1
  211. package/lib/esm/ElementTreeWalker.js.map +1 -1
  212. package/lib/esm/Entity.js.map +1 -1
  213. package/lib/esm/EntityReferences.js.map +1 -1
  214. package/lib/esm/ExportGraphics.js.map +1 -1
  215. package/lib/esm/ExternalSource.js.map +1 -1
  216. package/lib/esm/FontFile.js.map +1 -1
  217. package/lib/esm/GeoCoordConfig.d.ts +6 -0
  218. package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
  219. package/lib/esm/GeoCoordConfig.js +6 -0
  220. package/lib/esm/GeoCoordConfig.js.map +1 -1
  221. package/lib/esm/GeographicCRSServices.js.map +1 -1
  222. package/lib/esm/GeometrySummary.js +47 -47
  223. package/lib/esm/GeometrySummary.js.map +1 -1
  224. package/lib/esm/IModelDb.d.ts +40 -0
  225. package/lib/esm/IModelDb.d.ts.map +1 -1
  226. package/lib/esm/IModelDb.js +26 -8
  227. package/lib/esm/IModelDb.js.map +1 -1
  228. package/lib/esm/IModelDbFonts.js.map +1 -1
  229. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  230. package/lib/esm/IModelHost.d.ts +5 -3
  231. package/lib/esm/IModelHost.d.ts.map +1 -1
  232. package/lib/esm/IModelHost.js.map +1 -1
  233. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  234. package/lib/esm/IModelJsFs.js.map +1 -1
  235. package/lib/esm/ImageSourceConversion.js.map +1 -1
  236. package/lib/esm/IpcHost.js.map +1 -1
  237. package/lib/esm/LineStyle.js.map +1 -1
  238. package/lib/esm/LocalHub.js +1 -1
  239. package/lib/esm/LocalHub.js.map +1 -1
  240. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  241. package/lib/esm/LockControl.js.map +1 -1
  242. package/lib/esm/Material.js.map +1 -1
  243. package/lib/esm/Model.js.map +1 -1
  244. package/lib/esm/NativeAppStorage.js.map +1 -1
  245. package/lib/esm/NativeHost.js +1 -1
  246. package/lib/esm/NativeHost.js.map +1 -1
  247. package/lib/esm/NavigationRelationship.js.map +1 -1
  248. package/lib/esm/PartialChangeUnifier.js +7 -7
  249. package/lib/esm/PartialChangeUnifier.js.map +1 -1
  250. package/lib/esm/PromiseMemoizer.js.map +1 -1
  251. package/lib/esm/PropertyStore.js.map +1 -1
  252. package/lib/esm/Relationship.js.map +1 -1
  253. package/lib/esm/RpcBackend.js.map +1 -1
  254. package/lib/esm/SQLiteDb.js.map +1 -1
  255. package/lib/esm/Schema.js.map +1 -1
  256. package/lib/esm/SchemaSync.js.map +1 -1
  257. package/lib/esm/SchemaUtils.js.map +1 -1
  258. package/lib/esm/SheetIndex.js.map +1 -1
  259. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  260. package/lib/esm/SqliteStatement.js.map +1 -1
  261. package/lib/esm/StashManager.js.map +1 -1
  262. package/lib/esm/Texture.js.map +1 -1
  263. package/lib/esm/TileStorage.js.map +1 -1
  264. package/lib/esm/TxnManager.js.map +1 -1
  265. package/lib/esm/ViewDefinition.js.map +1 -1
  266. package/lib/esm/ViewStateHydrator.js.map +1 -1
  267. package/lib/esm/ViewStore.js.map +1 -1
  268. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  269. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  270. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  271. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  272. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  273. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  274. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  275. package/lib/esm/core-backend.js.map +1 -1
  276. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  277. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  278. package/lib/esm/domains/GenericElements.js.map +1 -1
  279. package/lib/esm/domains/GenericSchema.js.map +1 -1
  280. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  281. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  282. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  283. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  284. package/lib/esm/internal/HubMock.js.map +1 -1
  285. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  286. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  287. package/lib/esm/internal/NativePlatform.js.map +1 -1
  288. package/lib/esm/internal/NoLocks.js.map +1 -1
  289. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  290. package/lib/esm/internal/ServerBasedLocks.js +33 -33
  291. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  292. package/lib/esm/internal/Symbols.js.map +1 -1
  293. package/lib/esm/internal/annotations/fields.js.map +1 -1
  294. package/lib/esm/internal/cross-package.js.map +1 -1
  295. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  296. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  297. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  298. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  299. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  300. package/lib/esm/rpc/multipart.js.map +1 -1
  301. package/lib/esm/rpc/tracing.js.map +1 -1
  302. package/lib/esm/rpc/web/logging.js.map +1 -1
  303. package/lib/esm/rpc/web/request.js.map +1 -1
  304. package/lib/esm/rpc/web/response.js.map +1 -1
  305. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  306. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  307. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  308. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  309. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  310. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  311. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  312. package/lib/esm/test/AttachDb.test.js +11 -11
  313. package/lib/esm/test/AttachDb.test.js.map +1 -1
  314. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  315. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  316. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  317. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  318. package/lib/esm/test/IModelHost.test.js.map +1 -1
  319. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  320. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  321. package/lib/esm/test/IpcHost.test.js.map +1 -1
  322. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  323. package/lib/esm/test/PrintElementTree.js.map +1 -1
  324. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  325. package/lib/esm/test/RevisionUtility.js.map +1 -1
  326. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js +51 -51
  327. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js.map +1 -1
  328. package/lib/esm/test/SchemaUtils.test.js +25 -25
  329. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  330. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  331. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  332. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  333. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  334. package/lib/esm/test/TestEditTxn.js.map +1 -1
  335. package/lib/esm/test/TestUtils.d.ts +17 -2
  336. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  337. package/lib/esm/test/TestUtils.js +21 -2
  338. package/lib/esm/test/TestUtils.js.map +1 -1
  339. package/lib/esm/test/annotations/Fields.test.js +53 -53
  340. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  341. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  342. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  343. package/lib/esm/test/annotations/TextAnnotation.test.js +81 -16
  344. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  345. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  346. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  347. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  348. package/lib/esm/test/categories/Category.test.js.map +1 -1
  349. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  350. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  351. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  352. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +23 -21
  353. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  354. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  355. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  356. package/lib/esm/test/ecdb/ECDb.test.js +73 -73
  357. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  358. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  359. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  360. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  361. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  362. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  363. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  364. package/lib/esm/test/ecdb/ECSqlStatement.test.js +340 -334
  365. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  366. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  367. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  368. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  369. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  370. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  371. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  372. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  373. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  374. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  375. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  376. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  377. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  378. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  379. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  380. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  381. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  382. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  383. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  384. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  385. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  386. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  387. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  388. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  389. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  390. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  391. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  392. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  393. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  394. package/lib/esm/test/hubaccess/CodeSwap.test.d.ts +2 -0
  395. package/lib/esm/test/hubaccess/CodeSwap.test.d.ts.map +1 -0
  396. package/lib/esm/test/hubaccess/CodeSwap.test.js +431 -0
  397. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -0
  398. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  399. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  400. package/lib/esm/test/hubaccess/SemanticRebase.test.js +345 -345
  401. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  402. package/lib/esm/test/imageData.js.map +1 -1
  403. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  404. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  405. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  406. package/lib/esm/test/imodel/IModel.test.js +54 -46
  407. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  408. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  409. package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
  410. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  411. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  412. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  413. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  414. package/lib/esm/test/index.js.map +1 -1
  415. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  416. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  417. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  418. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  419. package/lib/esm/test/rpc/response.test.js.map +1 -1
  420. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  421. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  422. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  423. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  424. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  425. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  426. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  427. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  428. package/lib/esm/test/schema/SchemaViewHidden.test.js +109 -109
  429. package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -1
  430. package/lib/esm/test/schema/SchemaViewKoQ.test.js +13 -13
  431. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
  432. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +15 -15
  433. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -1
  434. package/lib/esm/test/schema/SchemaViewValidation.test.js +8 -8
  435. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
  436. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  437. package/lib/esm/test/standalone/ChangeElementParentModel.test.d.ts +2 -0
  438. package/lib/esm/test/standalone/ChangeElementParentModel.test.d.ts.map +1 -0
  439. package/lib/esm/test/standalone/ChangeElementParentModel.test.js +460 -0
  440. package/lib/esm/test/standalone/ChangeElementParentModel.test.js.map +1 -0
  441. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  442. package/lib/esm/test/standalone/ChangesetReader.test.js +299 -296
  443. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  444. package/lib/esm/test/standalone/CloudSqlite.test.d.ts +2 -0
  445. package/lib/esm/test/standalone/CloudSqlite.test.d.ts.map +1 -0
  446. package/lib/esm/test/standalone/CloudSqlite.test.js +43 -0
  447. package/lib/esm/test/standalone/CloudSqlite.test.js.map +1 -0
  448. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  449. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  450. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  451. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  452. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  453. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  454. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  455. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  456. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  457. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  458. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  459. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  460. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  461. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  462. package/lib/esm/test/standalone/IModelWrite.test.js +29 -60
  463. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  464. package/lib/esm/test/standalone/ITwinWorkspace.test.js +118 -1
  465. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
  466. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  467. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  468. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  469. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  470. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  471. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  472. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  473. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
  474. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  475. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  476. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  477. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  478. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  479. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  480. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  481. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  482. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  483. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  484. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  485. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  486. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  487. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  488. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  489. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  490. package/lib/esm/test/standalone/Workspace.test.js +2 -2
  491. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  492. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  493. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  494. package/lib/esm/workspace/Settings.js.map +1 -1
  495. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  496. package/lib/esm/workspace/SettingsEditor.d.ts +4 -9
  497. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  498. package/lib/esm/workspace/SettingsEditor.js +31 -15
  499. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  500. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  501. package/lib/esm/workspace/Workspace.js.map +1 -1
  502. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  503. package/package.json +15 -15
  504. package/lib/esm/test/misc/GeoServices.test.d.ts +0 -2
  505. package/lib/esm/test/misc/GeoServices.test.d.ts.map +0 -1
  506. package/lib/esm/test/misc/GeoServices.test.js +0 -918
  507. package/lib/esm/test/misc/GeoServices.test.js.map +0 -1
@@ -0,0 +1,431 @@
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 * as chai from "chai";
6
+ import * as chaiAsPromised from "chai-as-promised";
7
+ import { Code, CodeScopeSpec, IModel, SubCategoryAppearance } from "@itwin/core-common";
8
+ import { HubWrappers, IModelTestUtils, KnownTestLocations } from "..";
9
+ import { ChannelControl, DrawingCategory } from "../../core-backend";
10
+ import { HubMock } from "../../internal/HubMock";
11
+ import { withEditTxn } from "../../EditTxn";
12
+ chai.use(chaiAsPromised);
13
+ describe("Code value management: null, swap, undo/redo, and cross-briefcase pull", function () {
14
+ this.timeout(60000);
15
+ it("swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction", async () => {
16
+ HubMock.startup("CodeSwapTest", KnownTestLocations.outputDir);
17
+ let b1;
18
+ try {
19
+ // --- Setup iModel ---
20
+ const iModelId = await HubMock.createNewIModel({
21
+ accessToken: "user1",
22
+ iTwinId: HubMock.iTwinId,
23
+ iModelName: "CodeSwapTest",
24
+ description: "CodeSwapTest",
25
+ });
26
+ b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
27
+ b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
28
+ // --- Create a drawing model + category and a CodeSpec ---
29
+ let drawingModelId;
30
+ let drawingCategoryId;
31
+ let codeSpecId;
32
+ let codeScopeId; // will be the drawing model
33
+ await b1.locks.acquireLocks({ shared: IModel.dictionaryId });
34
+ withEditTxn(b1, "setup model, category, codeSpec", (txn) => {
35
+ const modelCode = IModelTestUtils.getUniqueModelCode(b1, "DrawingModel");
36
+ const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);
37
+ drawingModelId = modelId;
38
+ let catId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, "MyDrawingCategory");
39
+ if (undefined === catId)
40
+ catId = DrawingCategory.insert(txn, IModel.dictionaryId, "MyDrawingCategory", new SubCategoryAppearance());
41
+ drawingCategoryId = catId;
42
+ codeSpecId = b1.codeSpecs.insert(txn, "MyCodeSpec", CodeScopeSpec.Type.Model);
43
+ codeScopeId = drawingModelId;
44
+ });
45
+ await b1.pushChanges({ description: "setup" });
46
+ // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---
47
+ let elem1Id;
48
+ let elem2Id;
49
+ await b1.locks.acquireLocks({ shared: drawingModelId });
50
+ withEditTxn(b1, "insert two coded elements", (txn) => {
51
+ const elem1Props = {
52
+ classFullName: "BisCore:DrawingGraphic",
53
+ model: drawingModelId,
54
+ category: drawingCategoryId,
55
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" }),
56
+ };
57
+ const elem2Props = {
58
+ classFullName: "BisCore:DrawingGraphic",
59
+ model: drawingModelId,
60
+ category: drawingCategoryId,
61
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" }),
62
+ };
63
+ elem1Id = txn.insertElement(elem1Props);
64
+ elem2Id = txn.insertElement(elem2Props);
65
+ });
66
+ await b1.pushChanges({ description: "insert two elements with CODE_A and CODE_B" });
67
+ // Verify initial state
68
+ let e1 = b1.elements.getElementProps(elem1Id);
69
+ let e2 = b1.elements.getElementProps(elem2Id);
70
+ chai.expect(e1.code.spec).to.equal(codeSpecId);
71
+ chai.expect(e1.code.scope).to.equal(codeScopeId);
72
+ chai.expect(e1.code.value).to.equal("CODE_A");
73
+ chai.expect(e2.code.spec).to.equal(codeSpecId);
74
+ chai.expect(e2.code.scope).to.equal(codeScopeId);
75
+ chai.expect(e2.code.value).to.equal("CODE_B");
76
+ await b1.locks.acquireLocks({ exclusive: [elem2Id, elem1Id] });
77
+ withEditTxn(b1, "swap code values", (txn) => {
78
+ const props = b1.elements.getElementProps(elem1Id);
79
+ props.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "" });
80
+ txn.updateElement(props);
81
+ const props1 = b1.elements.getElementProps(elem1Id);
82
+ const props2 = b1.elements.getElementProps(elem2Id);
83
+ props2.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" });
84
+ props1.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" });
85
+ txn.updateElement(props2);
86
+ txn.updateElement(props1);
87
+ });
88
+ b1.clearCaches();
89
+ // Verify after swap2
90
+ e1 = b1.elements.getElementProps(elem1Id);
91
+ e2 = b1.elements.getElementProps(elem2Id);
92
+ chai.expect(e1.code.value).to.equal("CODE_B");
93
+ chai.expect(e2.code.value).to.equal("CODE_A");
94
+ // --- Undo (reverse txn2: the swap) ---
95
+ chai.expect(b1.txns.isUndoPossible).to.be.true;
96
+ b1.txns.reverseTxns(1);
97
+ e1 = b1.elements.getElementProps(elem1Id);
98
+ e2 = b1.elements.getElementProps(elem2Id);
99
+ chai.expect(e1.code.value).to.equal("CODE_A");
100
+ chai.expect(e2.code.value).to.equal("CODE_B");
101
+ // --- Redo (reinstate txn2: the swap) ---
102
+ chai.expect(b1.txns.isRedoPossible).to.be.true;
103
+ b1.txns.reinstateTxn();
104
+ e1 = b1.elements.getElementProps(elem1Id);
105
+ e2 = b1.elements.getElementProps(elem2Id);
106
+ chai.expect(e1.code.value).to.equal("CODE_B");
107
+ chai.expect(e2.code.value).to.equal("CODE_A");
108
+ }
109
+ finally {
110
+ b1?.close();
111
+ HubMock.shutdown();
112
+ }
113
+ });
114
+ it("insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push", async () => {
115
+ HubMock.startup("CodeSwapTest", KnownTestLocations.outputDir);
116
+ let b1;
117
+ let b2;
118
+ try {
119
+ // --- Setup iModel ---
120
+ const iModelId = await HubMock.createNewIModel({
121
+ accessToken: "user1",
122
+ iTwinId: HubMock.iTwinId,
123
+ iModelName: "CodeSwapTest",
124
+ description: "CodeSwapTest",
125
+ });
126
+ b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
127
+ b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
128
+ b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user2", iTwinId: HubMock.iTwinId, iModelId });
129
+ b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
130
+ // --- Create a drawing model + category and a CodeSpec ---
131
+ let drawingModelId;
132
+ let drawingCategoryId;
133
+ let codeSpecId;
134
+ let codeScopeId; // will be the drawing model
135
+ await b1.locks.acquireLocks({ shared: IModel.dictionaryId });
136
+ withEditTxn(b1, "setup model, category, codeSpec", (txn) => {
137
+ const modelCode = IModelTestUtils.getUniqueModelCode(b1, "DrawingModel");
138
+ const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);
139
+ drawingModelId = modelId;
140
+ let catId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, "MyDrawingCategory");
141
+ if (undefined === catId)
142
+ catId = DrawingCategory.insert(txn, IModel.dictionaryId, "MyDrawingCategory", new SubCategoryAppearance());
143
+ drawingCategoryId = catId;
144
+ codeSpecId = b1.codeSpecs.insert(txn, "MyCodeSpec", CodeScopeSpec.Type.Model);
145
+ codeScopeId = drawingModelId;
146
+ });
147
+ await b1.pushChanges({ description: "setup" });
148
+ await b2.pullChanges();
149
+ // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---
150
+ let elem1Id;
151
+ let elem2Id;
152
+ await b1.locks.acquireLocks({ shared: drawingModelId });
153
+ withEditTxn(b1, "insert two coded elements", (txn) => {
154
+ const elem1Props = {
155
+ classFullName: "BisCore:DrawingGraphic",
156
+ model: drawingModelId,
157
+ category: drawingCategoryId,
158
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" }),
159
+ };
160
+ const elem2Props = {
161
+ classFullName: "BisCore:DrawingGraphic",
162
+ model: drawingModelId,
163
+ category: drawingCategoryId,
164
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" }),
165
+ };
166
+ elem1Id = txn.insertElement(elem1Props);
167
+ elem2Id = txn.insertElement(elem2Props);
168
+ });
169
+ await b1.pushChanges({ description: "insert two elements with CODE_A and CODE_B" });
170
+ await b2.pullChanges();
171
+ // Verify initial state
172
+ let e1 = b1.elements.getElementProps(elem1Id);
173
+ let e2 = b1.elements.getElementProps(elem2Id);
174
+ chai.expect(e1.code.spec).to.equal(codeSpecId);
175
+ chai.expect(e1.code.scope).to.equal(codeScopeId);
176
+ chai.expect(e1.code.value).to.equal("CODE_A");
177
+ chai.expect(e2.code.spec).to.equal(codeSpecId);
178
+ chai.expect(e2.code.scope).to.equal(codeScopeId);
179
+ chai.expect(e2.code.value).to.equal("CODE_B");
180
+ // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---
181
+ await b1.locks.acquireLocks({ exclusive: [elem1Id] });
182
+ withEditTxn(b1, "set elem1 code to null", (txn) => {
183
+ const props = b1.elements.getElementProps(elem1Id);
184
+ props.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "" });
185
+ txn.updateElement(props);
186
+ });
187
+ e1 = b1.elements.getElementProps(elem1Id);
188
+ chai.expect(e1.code.value).to.satisfy((v) => v === undefined || v === "");
189
+ // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---
190
+ // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.
191
+ await b1.locks.acquireLocks({ exclusive: [elem2Id] });
192
+ withEditTxn(b1, "swap code values", (txn) => {
193
+ const props1 = b1.elements.getElementProps(elem1Id);
194
+ const props2 = b1.elements.getElementProps(elem2Id);
195
+ props2.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" });
196
+ props1.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" });
197
+ txn.updateElement(props2);
198
+ txn.updateElement(props1);
199
+ });
200
+ b1.clearCaches();
201
+ // Verify after swap
202
+ e1 = b1.elements.getElementProps(elem1Id);
203
+ e2 = b1.elements.getElementProps(elem2Id);
204
+ chai.expect(e1.code.value).to.equal("CODE_B");
205
+ chai.expect(e2.code.value).to.equal("CODE_A");
206
+ // --- Undo (reverse txn2: the swap) ---
207
+ chai.expect(b1.txns.isUndoPossible).to.be.true;
208
+ b1.txns.reverseTxns(1);
209
+ e1 = b1.elements.getElementProps(elem1Id);
210
+ e2 = b1.elements.getElementProps(elem2Id);
211
+ chai.expect(e1.code.value).to.satisfy((v) => v === undefined || v === "");
212
+ chai.expect(e2.code.value).to.equal("CODE_B");
213
+ // --- Redo (reinstate txn2: the swap) ---
214
+ chai.expect(b1.txns.isRedoPossible).to.be.true;
215
+ b1.txns.reinstateTxn();
216
+ e1 = b1.elements.getElementProps(elem1Id);
217
+ e2 = b1.elements.getElementProps(elem2Id);
218
+ chai.expect(e1.code.value).to.equal("CODE_B");
219
+ chai.expect(e2.code.value).to.equal("CODE_A");
220
+ // --- Push changes ---
221
+ await b1.pushChanges({ description: "null elem1 code and swap code values" });
222
+ await b2.pullChanges();
223
+ // No local txns remain after push
224
+ chai.expect(b1.txns.isUndoPossible).to.be.false;
225
+ chai.expect(b1.txns.isRedoPossible).to.be.false;
226
+ // Verify b2 sees the final swapped code values after pulling
227
+ const b2e1 = b2.elements.getElementProps(elem1Id);
228
+ const b2e2 = b2.elements.getElementProps(elem2Id);
229
+ chai.expect(b2e1.code.value).to.equal("CODE_B");
230
+ chai.expect(b2e2.code.value).to.equal("CODE_A");
231
+ }
232
+ finally {
233
+ b1?.close();
234
+ b2?.close();
235
+ HubMock.shutdown();
236
+ }
237
+ });
238
+ it("delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull", async () => {
239
+ HubMock.startup("CodeDeleteInsertTest", KnownTestLocations.outputDir);
240
+ let b1;
241
+ let b2;
242
+ try {
243
+ // --- Setup iModel ---
244
+ const iModelId = await HubMock.createNewIModel({
245
+ accessToken: "user1",
246
+ iTwinId: HubMock.iTwinId,
247
+ iModelName: "CodeDeleteInsertTest",
248
+ description: "CodeDeleteInsertTest",
249
+ });
250
+ b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
251
+ b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
252
+ b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user2", iTwinId: HubMock.iTwinId, iModelId });
253
+ b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
254
+ // --- Create a drawing model + category and a CodeSpec ---
255
+ let drawingModelId;
256
+ let drawingCategoryId;
257
+ let codeSpecId;
258
+ let codeScopeId;
259
+ await b1.locks.acquireLocks({ shared: IModel.dictionaryId });
260
+ withEditTxn(b1, "setup model, category, codeSpec", (txn) => {
261
+ const modelCode = IModelTestUtils.getUniqueModelCode(b1, "DrawingModel");
262
+ const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);
263
+ drawingModelId = modelId;
264
+ let catId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, "MyDrawingCategory");
265
+ if (undefined === catId)
266
+ catId = DrawingCategory.insert(txn, IModel.dictionaryId, "MyDrawingCategory", new SubCategoryAppearance());
267
+ drawingCategoryId = catId;
268
+ codeSpecId = b1.codeSpecs.insert(txn, "MyCodeSpec", CodeScopeSpec.Type.Model);
269
+ codeScopeId = drawingModelId;
270
+ });
271
+ await b1.pushChanges({ description: "setup" });
272
+ await b2.pullChanges();
273
+ // --- Insert an element with a code ---
274
+ let elem1Id;
275
+ await b1.locks.acquireLocks({ shared: drawingModelId });
276
+ withEditTxn(b1, "insert element with CODE_A", (txn) => {
277
+ const elem1Props = {
278
+ classFullName: "BisCore:DrawingGraphic",
279
+ model: drawingModelId,
280
+ category: drawingCategoryId,
281
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" }),
282
+ };
283
+ elem1Id = txn.insertElement(elem1Props);
284
+ });
285
+ await b1.pushChanges({ description: "insert element with CODE_A" });
286
+ await b2.pullChanges();
287
+ // Verify initial state
288
+ let e1 = b1.elements.getElementProps(elem1Id);
289
+ chai.expect(e1.code.spec).to.equal(codeSpecId);
290
+ chai.expect(e1.code.scope).to.equal(codeScopeId);
291
+ chai.expect(e1.code.value).to.equal("CODE_A");
292
+ // --- Delete elem1 and insert a new element with the same code ---
293
+ let newElemId;
294
+ await b1.locks.acquireLocks({ exclusive: [elem1Id] });
295
+ withEditTxn(b1, "delete elem1 and insert new element with same code", (txn) => {
296
+ txn.deleteElement(elem1Id);
297
+ const newElemProps = {
298
+ classFullName: "BisCore:DrawingGraphic",
299
+ model: drawingModelId,
300
+ category: drawingCategoryId,
301
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" }),
302
+ };
303
+ newElemId = txn.insertElement(newElemProps);
304
+ });
305
+ b1.clearCaches();
306
+ // Verify after delete + insert
307
+ chai.expect(() => b1.elements.getElementProps(elem1Id)).to.throw();
308
+ const newElem = b1.elements.getElementProps(newElemId);
309
+ chai.expect(newElem.code.value).to.equal("CODE_A");
310
+ // --- Undo (reverse the delete + insert) ---
311
+ chai.expect(b1.txns.isUndoPossible).to.be.true;
312
+ b1.txns.reverseTxns(1);
313
+ e1 = b1.elements.getElementProps(elem1Id);
314
+ chai.expect(e1.code.value).to.equal("CODE_A");
315
+ chai.expect(() => b1.elements.getElementProps(newElemId)).to.throw();
316
+ // --- Redo (reinstate the delete + insert) ---
317
+ chai.expect(b1.txns.isRedoPossible).to.be.true;
318
+ b1.txns.reinstateTxn();
319
+ chai.expect(() => b1.elements.getElementProps(elem1Id)).to.throw();
320
+ const redoneElem = b1.elements.getElementProps(newElemId);
321
+ chai.expect(redoneElem.code.value).to.equal("CODE_A");
322
+ // --- Push changes ---
323
+ await b1.pushChanges({ description: "delete elem1 and insert new element with same code" });
324
+ await b2.pullChanges();
325
+ // No local txns remain after push
326
+ chai.expect(b1.txns.isUndoPossible).to.be.false;
327
+ chai.expect(b1.txns.isRedoPossible).to.be.false;
328
+ // Verify b2 sees the final state after pulling
329
+ chai.expect(() => b2.elements.getElementProps(elem1Id)).to.throw();
330
+ const b2NewElem = b2.elements.getElementProps(newElemId);
331
+ chai.expect(b2NewElem.code.value).to.equal("CODE_A");
332
+ }
333
+ finally {
334
+ b1?.close();
335
+ b2?.close();
336
+ HubMock.shutdown();
337
+ }
338
+ });
339
+ it("single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true", async () => {
340
+ HubMock.startup("CodeSwapNoUpdateLoopTest", KnownTestLocations.outputDir);
341
+ let b1;
342
+ let b2;
343
+ try {
344
+ // --- Setup iModel ---
345
+ const iModelId = await HubMock.createNewIModel({
346
+ accessToken: "user1",
347
+ iTwinId: HubMock.iTwinId,
348
+ iModelName: "CodeSwapNoUpdateLoopTest",
349
+ description: "CodeSwapNoUpdateLoopTest",
350
+ });
351
+ b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user1", iTwinId: HubMock.iTwinId, iModelId });
352
+ b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
353
+ b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: "user2", iTwinId: HubMock.iTwinId, iModelId });
354
+ b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
355
+ let drawingModelId;
356
+ let drawingCategoryId;
357
+ let codeSpecId;
358
+ let codeScopeId;
359
+ await b1.locks.acquireLocks({ shared: IModel.dictionaryId });
360
+ withEditTxn(b1, "setup model, category, codeSpec", (txn) => {
361
+ const modelCode = IModelTestUtils.getUniqueModelCode(b1, "DrawingModel");
362
+ const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);
363
+ drawingModelId = modelId;
364
+ let catId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, "MyDrawingCategory");
365
+ if (undefined === catId)
366
+ catId = DrawingCategory.insert(txn, IModel.dictionaryId, "MyDrawingCategory", new SubCategoryAppearance());
367
+ drawingCategoryId = catId;
368
+ codeSpecId = b1.codeSpecs.insert(txn, "MyCodeSpec", CodeScopeSpec.Type.Model);
369
+ codeScopeId = drawingModelId;
370
+ });
371
+ await b1.pushChanges({ description: "setup" });
372
+ await b2.pullChanges();
373
+ let elem1Id;
374
+ let elem2Id;
375
+ await b1.locks.acquireLocks({ shared: drawingModelId });
376
+ withEditTxn(b1, "insert two coded elements", (txn) => {
377
+ const elem1Props = {
378
+ classFullName: "BisCore:DrawingGraphic",
379
+ model: drawingModelId,
380
+ category: drawingCategoryId,
381
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" }),
382
+ };
383
+ const elem2Props = {
384
+ classFullName: "BisCore:DrawingGraphic",
385
+ model: drawingModelId,
386
+ category: drawingCategoryId,
387
+ code: new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" }),
388
+ };
389
+ elem1Id = txn.insertElement(elem1Props);
390
+ elem2Id = txn.insertElement(elem2Props);
391
+ });
392
+ await b1.pushChanges({ description: "insert two elements with CODE_A and CODE_B" });
393
+ await b2.pullChanges();
394
+ // --- Single-transaction swap: null elem1, then swap codes ---
395
+ await b1.locks.acquireLocks({ exclusive: [elem2Id, elem1Id] });
396
+ withEditTxn(b1, "single-txn swap", (txn) => {
397
+ // Step 1: null out elem1's code to free the uniqueness slot
398
+ const props = b1.elements.getElementProps(elem1Id);
399
+ props.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "" });
400
+ txn.updateElement(props);
401
+ // Step 2: assign CODE_A to elem2, CODE_B to elem1
402
+ const props1 = b1.elements.getElementProps(elem1Id);
403
+ const props2 = b1.elements.getElementProps(elem2Id);
404
+ props2.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_A" });
405
+ props1.code = new Code({ spec: codeSpecId, scope: codeScopeId, value: "CODE_B" });
406
+ txn.updateElement(props2);
407
+ txn.updateElement(props1);
408
+ });
409
+ // Verify b1 has the swapped state
410
+ b1.clearCaches();
411
+ const b1e1 = b1.elements.getElementProps(elem1Id);
412
+ const b1e2 = b1.elements.getElementProps(elem2Id);
413
+ chai.expect(b1e1.code.value).to.equal("CODE_B");
414
+ chai.expect(b1e2.code.value).to.equal("CODE_A");
415
+ await b1.pushChanges({ description: "single-txn code swap" });
416
+ await b2.pullChanges({ noUpdateLoop: true });
417
+ b2.clearCaches();
418
+ const b2e1 = b2.elements.getElementProps(elem1Id);
419
+ const b2e2 = b2.elements.getElementProps(elem2Id);
420
+ // Old behaviour: swap did NOT land — b2 still sees the original codes
421
+ chai.expect(b2e1.code.value).to.equal("CODE_A");
422
+ chai.expect(b2e2.code.value).to.equal("CODE_B");
423
+ }
424
+ finally {
425
+ b1?.close();
426
+ b2?.close();
427
+ HubMock.shutdown();
428
+ }
429
+ });
430
+ });
431
+ //# sourceMappingURL=CodeSwap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeSwap.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/CodeSwap.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 * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { BriefcaseDb, ChannelControl, DrawingCategory } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Code value management: null, swap, undo/redo, and cross-briefcase pull\", function (this: Suite) {\r\n this.timeout(60000);\r\n\r\n it(\"swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap2\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"set elem1 code to null\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n });\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n\r\n // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---\r\n // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"null elem1 code and swap code values\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final swapped code values after pulling\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull\", async () => {\r\n HubMock.startup(\"CodeDeleteInsertTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeDeleteInsertTest\",\r\n description: \"CodeDeleteInsertTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert an element with a code ---\r\n let elem1Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert element with CODE_A\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert element with CODE_A\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Delete elem1 and insert a new element with the same code ---\r\n let newElemId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"delete elem1 and insert new element with same code\", (txn) => {\r\n txn.deleteElement(elem1Id!);\r\n\r\n const newElemProps: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n newElemId = txn.insertElement(newElemProps);\r\n });\r\n\r\n b1.clearCaches();\r\n\r\n // Verify after delete + insert\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const newElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(newElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse the delete + insert) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(() => b1!.elements.getElementProps(newElemId!)).to.throw();\r\n\r\n // --- Redo (reinstate the delete + insert) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const redoneElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(redoneElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"delete elem1 and insert new element with same code\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final state after pulling\r\n chai.expect(() => b2!.elements.getElementProps(elem1Id!)).to.throw();\r\n const b2NewElem = b2.elements.getElementProps(newElemId!);\r\n chai.expect(b2NewElem.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n it(\"single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true\", async () => {\r\n HubMock.startup(\"CodeSwapNoUpdateLoopTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapNoUpdateLoopTest\",\r\n description: \"CodeSwapNoUpdateLoopTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // --- Single-transaction swap: null elem1, then swap codes ---\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"single-txn swap\", (txn) => {\r\n // Step 1: null out elem1's code to free the uniqueness slot\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n // Step 2: assign CODE_A to elem2, CODE_B to elem1\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n\r\n // Verify b1 has the swapped state\r\n b1.clearCaches();\r\n const b1e1 = b1.elements.getElementProps(elem1Id!);\r\n const b1e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(b1e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b1e2.code.value).to.equal(\"CODE_A\");\r\n\r\n await b1.pushChanges({ description: \"single-txn code swap\" });\r\n\r\n // Pull with noUpdateLoop: true — this uses the old (pre-fix) apply path.\r\n // The unique-index conflict handler skips the intermediate null step,\r\n // so the swap is silently dropped and b2 retains the original codes.\r\n // noUpdateLoop is intentionally not in the public PullChangesArgs type.\r\n type InternalPullArgs = Parameters<BriefcaseDb[\"pullChanges\"]>[0] & { noUpdateLoop?: boolean };\r\n await b2.pullChanges({ noUpdateLoop: true } as InternalPullArgs);\r\n\r\n b2.clearCaches();\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n // Old behaviour: swap did NOT land — b2 still sees the original codes\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_B\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n});\r\n"]}