@itwin/core-backend 5.12.0-dev.1 → 5.12.0-dev.11

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 (566) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +1 -1
  3. package/lib/cjs/BackendHubAccess.js +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  6. package/lib/cjs/BisCoreSchema.js.map +1 -1
  7. package/lib/cjs/BlobContainerService.js.map +1 -1
  8. package/lib/cjs/BriefcaseManager.js.map +1 -1
  9. package/lib/cjs/CatalogDb.js.map +1 -1
  10. package/lib/cjs/Category.js.map +1 -1
  11. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  12. package/lib/cjs/ChangeSummaryManager.js +34 -38
  13. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  14. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  15. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  16. package/lib/cjs/ChangesetECAdaptor.js +252 -255
  17. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  18. package/lib/cjs/ChangesetReader.d.ts +65 -23
  19. package/lib/cjs/ChangesetReader.d.ts.map +1 -1
  20. package/lib/cjs/ChangesetReader.js +165 -105
  21. package/lib/cjs/ChangesetReader.js.map +1 -1
  22. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  23. package/lib/cjs/ChannelControl.js.map +1 -1
  24. package/lib/cjs/CheckpointManager.js.map +1 -1
  25. package/lib/cjs/ClassRegistry.d.ts +1 -1
  26. package/lib/cjs/ClassRegistry.js +6 -6
  27. package/lib/cjs/ClassRegistry.js.map +1 -1
  28. package/lib/cjs/CloudSqlite.js.map +1 -1
  29. package/lib/cjs/CodeService.js.map +1 -1
  30. package/lib/cjs/CodeSpecs.js.map +1 -1
  31. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  32. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  33. package/lib/cjs/DevTools.js.map +1 -1
  34. package/lib/cjs/DisplayStyle.js.map +1 -1
  35. package/lib/cjs/ECDb.d.ts +4 -4
  36. package/lib/cjs/ECDb.d.ts.map +1 -1
  37. package/lib/cjs/ECDb.js +6 -6
  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.d.ts +6 -6
  42. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  43. package/lib/cjs/ECSqlStatement.js +4 -4
  44. package/lib/cjs/ECSqlStatement.js.map +1 -1
  45. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  46. package/lib/cjs/EditTxn.js.map +1 -1
  47. package/lib/cjs/Element.d.ts +1 -1
  48. package/lib/cjs/Element.js +1 -1
  49. package/lib/cjs/Element.js.map +1 -1
  50. package/lib/cjs/ElementAspect.d.ts +1 -1
  51. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  52. package/lib/cjs/ElementAspect.js +7 -11
  53. package/lib/cjs/ElementAspect.js.map +1 -1
  54. package/lib/cjs/ElementGraphics.js.map +1 -1
  55. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  56. package/lib/cjs/ElementTreeWalker.js +16 -24
  57. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  58. package/lib/cjs/Entity.d.ts +1 -1
  59. package/lib/cjs/Entity.js +1 -1
  60. package/lib/cjs/Entity.js.map +1 -1
  61. package/lib/cjs/EntityReferences.js.map +1 -1
  62. package/lib/cjs/ExportGraphics.js.map +1 -1
  63. package/lib/cjs/ExternalSource.js.map +1 -1
  64. package/lib/cjs/FontFile.js.map +1 -1
  65. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  66. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  67. package/lib/cjs/GeometrySummary.js +47 -47
  68. package/lib/cjs/GeometrySummary.js.map +1 -1
  69. package/lib/cjs/IModelDb.d.ts +14 -14
  70. package/lib/cjs/IModelDb.d.ts.map +1 -1
  71. package/lib/cjs/IModelDb.js +89 -103
  72. package/lib/cjs/IModelDb.js.map +1 -1
  73. package/lib/cjs/IModelDbFonts.js.map +1 -1
  74. package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
  75. package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
  76. package/lib/cjs/IModelElementCloneContext.js +1 -1
  77. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  78. package/lib/cjs/IModelHost.d.ts +2 -2
  79. package/lib/cjs/IModelHost.js +2 -2
  80. package/lib/cjs/IModelHost.js.map +1 -1
  81. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  82. package/lib/cjs/IModelJsFs.js.map +1 -1
  83. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  84. package/lib/cjs/IpcHost.js.map +1 -1
  85. package/lib/cjs/LineStyle.js.map +1 -1
  86. package/lib/cjs/LocalHub.js +1 -1
  87. package/lib/cjs/LocalHub.js.map +1 -1
  88. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  89. package/lib/cjs/LockControl.js.map +1 -1
  90. package/lib/cjs/Material.js.map +1 -1
  91. package/lib/cjs/Model.js.map +1 -1
  92. package/lib/cjs/NativeAppStorage.js.map +1 -1
  93. package/lib/cjs/NativeHost.js.map +1 -1
  94. package/lib/cjs/NavigationRelationship.js.map +1 -1
  95. package/lib/cjs/PartialChangeUnifier.js +7 -7
  96. package/lib/cjs/PartialChangeUnifier.js.map +1 -1
  97. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  98. package/lib/cjs/PropertyStore.js.map +1 -1
  99. package/lib/cjs/Relationship.d.ts.map +1 -1
  100. package/lib/cjs/Relationship.js +15 -12
  101. package/lib/cjs/Relationship.js.map +1 -1
  102. package/lib/cjs/RpcBackend.js.map +1 -1
  103. package/lib/cjs/SQLiteDb.d.ts +1 -1
  104. package/lib/cjs/SQLiteDb.js +1 -1
  105. package/lib/cjs/SQLiteDb.js.map +1 -1
  106. package/lib/cjs/Schema.js.map +1 -1
  107. package/lib/cjs/SchemaSync.js.map +1 -1
  108. package/lib/cjs/SchemaUtils.js.map +1 -1
  109. package/lib/cjs/SheetIndex.js.map +1 -1
  110. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  111. package/lib/cjs/SqliteStatement.d.ts +1 -1
  112. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  113. package/lib/cjs/SqliteStatement.js +1 -1
  114. package/lib/cjs/SqliteStatement.js.map +1 -1
  115. package/lib/cjs/StashManager.js.map +1 -1
  116. package/lib/cjs/Texture.js.map +1 -1
  117. package/lib/cjs/TileStorage.js.map +1 -1
  118. package/lib/cjs/TxnManager.js.map +1 -1
  119. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  120. package/lib/cjs/ViewDefinition.js +8 -12
  121. package/lib/cjs/ViewDefinition.js.map +1 -1
  122. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  123. package/lib/cjs/ViewStore.d.ts.map +1 -1
  124. package/lib/cjs/ViewStore.js +6 -8
  125. package/lib/cjs/ViewStore.js.map +1 -1
  126. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  127. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +8 -11
  128. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  129. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  130. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  131. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  132. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  133. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  134. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  135. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  136. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +36 -36
  137. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +28 -28
  138. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  139. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  140. package/lib/cjs/core-backend.js.map +1 -1
  141. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  142. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  143. package/lib/cjs/domains/GenericElements.js.map +1 -1
  144. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  145. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  146. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  147. package/lib/cjs/internal/ChannelAdmin.js +6 -10
  148. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  149. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts +23 -0
  150. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  151. package/lib/cjs/internal/ECSqlInstanceReshaper.js +125 -0
  152. package/lib/cjs/internal/ECSqlInstanceReshaper.js.map +1 -0
  153. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  154. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  155. package/lib/cjs/internal/HubMock.js.map +1 -1
  156. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  157. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  158. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  159. package/lib/cjs/internal/NoLocks.js.map +1 -1
  160. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  161. package/lib/cjs/internal/ServerBasedLocks.js +33 -33
  162. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  163. package/lib/cjs/internal/Symbols.js.map +1 -1
  164. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  165. package/lib/cjs/internal/annotations/fields.js +24 -43
  166. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  167. package/lib/cjs/internal/cross-package.js.map +1 -1
  168. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  169. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  170. package/lib/cjs/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
  171. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +8 -7
  172. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  173. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  174. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  175. package/lib/cjs/rpc/multipart.js.map +1 -1
  176. package/lib/cjs/rpc/tracing.js.map +1 -1
  177. package/lib/cjs/rpc/web/logging.js.map +1 -1
  178. package/lib/cjs/rpc/web/request.js.map +1 -1
  179. package/lib/cjs/rpc/web/response.js.map +1 -1
  180. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  181. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  182. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +2 -3
  183. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  184. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  185. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  186. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  187. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  188. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  189. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  190. package/lib/cjs/workspace/Settings.js.map +1 -1
  191. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  192. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  193. package/lib/cjs/workspace/SettingsSchemas.d.ts +28 -2
  194. package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
  195. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  196. package/lib/cjs/workspace/Workspace.js.map +1 -1
  197. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  198. package/lib/esm/BackendHubAccess.d.ts +1 -1
  199. package/lib/esm/BackendHubAccess.js +1 -1
  200. package/lib/esm/BackendHubAccess.js.map +1 -1
  201. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  202. package/lib/esm/BisCoreSchema.js.map +1 -1
  203. package/lib/esm/BlobContainerService.js.map +1 -1
  204. package/lib/esm/BriefcaseManager.js.map +1 -1
  205. package/lib/esm/CatalogDb.js.map +1 -1
  206. package/lib/esm/Category.js.map +1 -1
  207. package/lib/esm/ChangeSummaryManager.d.ts.map +1 -1
  208. package/lib/esm/ChangeSummaryManager.js +35 -39
  209. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  210. package/lib/esm/ChangedElementsDb.js.map +1 -1
  211. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  212. package/lib/esm/ChangesetECAdaptor.js +253 -256
  213. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  214. package/lib/esm/ChangesetReader.d.ts +65 -23
  215. package/lib/esm/ChangesetReader.d.ts.map +1 -1
  216. package/lib/esm/ChangesetReader.js +166 -106
  217. package/lib/esm/ChangesetReader.js.map +1 -1
  218. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  219. package/lib/esm/ChannelControl.js.map +1 -1
  220. package/lib/esm/CheckpointManager.js.map +1 -1
  221. package/lib/esm/ClassRegistry.d.ts +1 -1
  222. package/lib/esm/ClassRegistry.js +6 -6
  223. package/lib/esm/ClassRegistry.js.map +1 -1
  224. package/lib/esm/CloudSqlite.js.map +1 -1
  225. package/lib/esm/CodeService.js.map +1 -1
  226. package/lib/esm/CodeSpecs.js.map +1 -1
  227. package/lib/esm/ConcurrentQuery.js.map +1 -1
  228. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  229. package/lib/esm/DevTools.js.map +1 -1
  230. package/lib/esm/DisplayStyle.js.map +1 -1
  231. package/lib/esm/ECDb.d.ts +4 -4
  232. package/lib/esm/ECDb.d.ts.map +1 -1
  233. package/lib/esm/ECDb.js +6 -6
  234. package/lib/esm/ECDb.js.map +1 -1
  235. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  236. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  237. package/lib/esm/ECSqlStatement.d.ts +6 -6
  238. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  239. package/lib/esm/ECSqlStatement.js +4 -4
  240. package/lib/esm/ECSqlStatement.js.map +1 -1
  241. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  242. package/lib/esm/EditTxn.js.map +1 -1
  243. package/lib/esm/Element.d.ts +1 -1
  244. package/lib/esm/Element.js +1 -1
  245. package/lib/esm/Element.js.map +1 -1
  246. package/lib/esm/ElementAspect.d.ts +1 -1
  247. package/lib/esm/ElementAspect.d.ts.map +1 -1
  248. package/lib/esm/ElementAspect.js +9 -13
  249. package/lib/esm/ElementAspect.js.map +1 -1
  250. package/lib/esm/ElementGraphics.js.map +1 -1
  251. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  252. package/lib/esm/ElementTreeWalker.js +18 -26
  253. package/lib/esm/ElementTreeWalker.js.map +1 -1
  254. package/lib/esm/Entity.d.ts +1 -1
  255. package/lib/esm/Entity.js +1 -1
  256. package/lib/esm/Entity.js.map +1 -1
  257. package/lib/esm/EntityReferences.js.map +1 -1
  258. package/lib/esm/ExportGraphics.js.map +1 -1
  259. package/lib/esm/ExternalSource.js.map +1 -1
  260. package/lib/esm/FontFile.js.map +1 -1
  261. package/lib/esm/GeoCoordConfig.js.map +1 -1
  262. package/lib/esm/GeographicCRSServices.js.map +1 -1
  263. package/lib/esm/GeometrySummary.js +47 -47
  264. package/lib/esm/GeometrySummary.js.map +1 -1
  265. package/lib/esm/IModelDb.d.ts +14 -14
  266. package/lib/esm/IModelDb.d.ts.map +1 -1
  267. package/lib/esm/IModelDb.js +90 -104
  268. package/lib/esm/IModelDb.js.map +1 -1
  269. package/lib/esm/IModelDbFonts.js.map +1 -1
  270. package/lib/esm/IModelElementCloneContext.d.ts +1 -1
  271. package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
  272. package/lib/esm/IModelElementCloneContext.js +1 -1
  273. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  274. package/lib/esm/IModelHost.d.ts +2 -2
  275. package/lib/esm/IModelHost.js +2 -2
  276. package/lib/esm/IModelHost.js.map +1 -1
  277. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  278. package/lib/esm/IModelJsFs.js.map +1 -1
  279. package/lib/esm/ImageSourceConversion.js.map +1 -1
  280. package/lib/esm/IpcHost.js.map +1 -1
  281. package/lib/esm/LineStyle.js.map +1 -1
  282. package/lib/esm/LocalHub.js +1 -1
  283. package/lib/esm/LocalHub.js.map +1 -1
  284. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  285. package/lib/esm/LockControl.js.map +1 -1
  286. package/lib/esm/Material.js.map +1 -1
  287. package/lib/esm/Model.js.map +1 -1
  288. package/lib/esm/NativeAppStorage.js.map +1 -1
  289. package/lib/esm/NativeHost.js.map +1 -1
  290. package/lib/esm/NavigationRelationship.js.map +1 -1
  291. package/lib/esm/PartialChangeUnifier.js +7 -7
  292. package/lib/esm/PartialChangeUnifier.js.map +1 -1
  293. package/lib/esm/PromiseMemoizer.js.map +1 -1
  294. package/lib/esm/PropertyStore.js.map +1 -1
  295. package/lib/esm/Relationship.d.ts.map +1 -1
  296. package/lib/esm/Relationship.js +16 -13
  297. package/lib/esm/Relationship.js.map +1 -1
  298. package/lib/esm/RpcBackend.js.map +1 -1
  299. package/lib/esm/SQLiteDb.d.ts +1 -1
  300. package/lib/esm/SQLiteDb.js +1 -1
  301. package/lib/esm/SQLiteDb.js.map +1 -1
  302. package/lib/esm/Schema.js.map +1 -1
  303. package/lib/esm/SchemaSync.js.map +1 -1
  304. package/lib/esm/SchemaUtils.js.map +1 -1
  305. package/lib/esm/SheetIndex.js.map +1 -1
  306. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  307. package/lib/esm/SqliteStatement.d.ts +1 -1
  308. package/lib/esm/SqliteStatement.d.ts.map +1 -1
  309. package/lib/esm/SqliteStatement.js +1 -1
  310. package/lib/esm/SqliteStatement.js.map +1 -1
  311. package/lib/esm/StashManager.js.map +1 -1
  312. package/lib/esm/Texture.js.map +1 -1
  313. package/lib/esm/TileStorage.js.map +1 -1
  314. package/lib/esm/TxnManager.js.map +1 -1
  315. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  316. package/lib/esm/ViewDefinition.js +10 -14
  317. package/lib/esm/ViewDefinition.js.map +1 -1
  318. package/lib/esm/ViewStateHydrator.js.map +1 -1
  319. package/lib/esm/ViewStore.d.ts.map +1 -1
  320. package/lib/esm/ViewStore.js +7 -9
  321. package/lib/esm/ViewStore.js.map +1 -1
  322. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  323. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +10 -13
  324. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  325. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  326. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  327. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  328. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  329. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  330. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  331. package/lib/esm/core-backend.js.map +1 -1
  332. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  333. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  334. package/lib/esm/domains/GenericElements.js.map +1 -1
  335. package/lib/esm/domains/GenericSchema.js.map +1 -1
  336. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  337. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  338. package/lib/esm/internal/ChannelAdmin.js +7 -11
  339. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  340. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts +23 -0
  341. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  342. package/lib/esm/internal/ECSqlInstanceReshaper.js +120 -0
  343. package/lib/esm/internal/ECSqlInstanceReshaper.js.map +1 -0
  344. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  345. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  346. package/lib/esm/internal/HubMock.js.map +1 -1
  347. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  348. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  349. package/lib/esm/internal/NativePlatform.js.map +1 -1
  350. package/lib/esm/internal/NoLocks.js.map +1 -1
  351. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  352. package/lib/esm/internal/ServerBasedLocks.js +33 -33
  353. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  354. package/lib/esm/internal/Symbols.js.map +1 -1
  355. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  356. package/lib/esm/internal/annotations/fields.js +26 -45
  357. package/lib/esm/internal/annotations/fields.js.map +1 -1
  358. package/lib/esm/internal/cross-package.js.map +1 -1
  359. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  360. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  361. package/lib/esm/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
  362. package/lib/esm/internal/workspace/SettingsSchemasImpl.js +8 -7
  363. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  364. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  365. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  366. package/lib/esm/rpc/multipart.js.map +1 -1
  367. package/lib/esm/rpc/tracing.js.map +1 -1
  368. package/lib/esm/rpc/web/logging.js.map +1 -1
  369. package/lib/esm/rpc/web/request.js.map +1 -1
  370. package/lib/esm/rpc/web/response.js.map +1 -1
  371. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  372. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  373. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +2 -3
  374. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  375. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  376. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  377. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  378. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  379. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  380. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  381. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  382. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  383. package/lib/esm/test/AttachDb.test.js +11 -11
  384. package/lib/esm/test/AttachDb.test.js.map +1 -1
  385. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  386. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  387. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  388. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  389. package/lib/esm/test/IModelHost.test.js.map +1 -1
  390. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  391. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  392. package/lib/esm/test/IpcHost.test.js.map +1 -1
  393. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  394. package/lib/esm/test/PrintElementTree.js.map +1 -1
  395. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  396. package/lib/esm/test/RevisionUtility.js.map +1 -1
  397. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js +51 -51
  398. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js.map +1 -1
  399. package/lib/esm/test/SchemaUtils.test.js +25 -25
  400. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  401. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  402. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  403. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  404. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  405. package/lib/esm/test/TestEditTxn.js.map +1 -1
  406. package/lib/esm/test/TestUtils.d.ts +1 -1
  407. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  408. package/lib/esm/test/TestUtils.js +1 -1
  409. package/lib/esm/test/TestUtils.js.map +1 -1
  410. package/lib/esm/test/annotations/Fields.test.js +53 -53
  411. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  412. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  413. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  414. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  415. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  416. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  417. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  418. package/lib/esm/test/categories/Category.test.js.map +1 -1
  419. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  420. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  421. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  422. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  423. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  424. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  425. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  426. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  427. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  428. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  429. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  430. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  431. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  432. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  433. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  434. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  435. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  436. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  437. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  438. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  439. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  440. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  441. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  442. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  443. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  444. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  445. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  446. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  447. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  448. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  449. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  450. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  451. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  452. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  453. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  454. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  455. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  456. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  457. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  458. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  459. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  460. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  461. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  462. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +1 -1
  463. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  464. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  465. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  466. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  467. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  468. package/lib/esm/test/hubaccess/SemanticRebase.test.js +345 -345
  469. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  470. package/lib/esm/test/imageData.js.map +1 -1
  471. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  472. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  473. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  474. package/lib/esm/test/imodel/IModel.test.js +53 -47
  475. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  476. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  477. package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
  478. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  479. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  480. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  481. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  482. package/lib/esm/test/index.js.map +1 -1
  483. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts +2 -0
  484. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts.map +1 -0
  485. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js +289 -0
  486. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js.map +1 -0
  487. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  488. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  489. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  490. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  491. package/lib/esm/test/rpc/response.test.js.map +1 -1
  492. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  493. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  494. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  495. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  496. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  497. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  498. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  499. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  500. package/lib/esm/test/schema/SchemaViewHidden.test.js +109 -109
  501. package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -1
  502. package/lib/esm/test/schema/SchemaViewKoQ.test.js +13 -13
  503. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
  504. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +15 -15
  505. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -1
  506. package/lib/esm/test/schema/SchemaViewValidation.test.js +8 -8
  507. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
  508. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  509. package/lib/esm/test/standalone/ChangeElementParentModel.test.js.map +1 -1
  510. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  511. package/lib/esm/test/standalone/ChangesetReader.test.js +1021 -406
  512. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  513. package/lib/esm/test/standalone/CloudSqlite.test.js.map +1 -1
  514. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  515. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  516. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  517. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  518. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  519. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  520. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  521. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  522. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  523. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  524. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  525. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  526. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  527. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  528. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  529. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
  530. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  531. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  532. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  533. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  534. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  535. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  536. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  537. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
  538. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  539. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  540. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  541. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  542. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  543. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  544. package/lib/esm/test/standalone/SettingsSchemas.test.js +6 -0
  545. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  546. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  547. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  548. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  549. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  550. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  551. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  552. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  553. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  554. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  555. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  556. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  557. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  558. package/lib/esm/workspace/Settings.js.map +1 -1
  559. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  560. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  561. package/lib/esm/workspace/SettingsSchemas.d.ts +28 -2
  562. package/lib/esm/workspace/SettingsSchemas.d.ts.map +1 -1
  563. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  564. package/lib/esm/workspace/Workspace.js.map +1 -1
  565. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  566. package/package.json +13 -13
@@ -116,44 +116,44 @@ describe("ChangesetReader insert-full", () => {
116
116
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
117
117
  txn = startTestTxn(rwIModel, "ChangesetReader insert-full setup");
118
118
  // Txn 1: import schema + drawing model setup, then push
119
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
120
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
121
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
122
- <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
123
- <ECStructClass typeName="RichPoint" modifier="Sealed">
124
- <ECProperty propertyName="X" typeName="double"/>
125
- <ECProperty propertyName="Y" typeName="double"/>
126
- <ECProperty propertyName="Z" typeName="double"/>
127
- <ECProperty propertyName="Label" typeName="string"/>
128
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
129
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
130
- </ECStructClass>
131
- <!-- Relationship used by the RelatedElem navigation property -->
132
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
133
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
134
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
135
- </ECRelationshipClass>
136
- <ECEntityClass typeName="Test2dElement">
137
- <BaseClass>bis:GraphicalElement2d</BaseClass>
138
- <!-- Primitives -->
139
- <ECProperty propertyName="StrProp" typeName="string"/>
140
- <ECProperty propertyName="IntProp" typeName="int"/>
141
- <ECProperty propertyName="LongProp" typeName="long"/>
142
- <ECProperty propertyName="DblProp" typeName="double"/>
143
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
144
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
145
- <ECProperty propertyName="BinProp" typeName="binary"/>
146
- <!-- Geometric primitives -->
147
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
148
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
149
- <!-- Struct, arrays -->
150
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
151
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
152
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
153
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
154
- <!-- Navigation property -->
155
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
156
- </ECEntityClass>
119
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
120
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
121
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
122
+ <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
123
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
124
+ <ECProperty propertyName="X" typeName="double"/>
125
+ <ECProperty propertyName="Y" typeName="double"/>
126
+ <ECProperty propertyName="Z" typeName="double"/>
127
+ <ECProperty propertyName="Label" typeName="string"/>
128
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
129
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
130
+ </ECStructClass>
131
+ <!-- Relationship used by the RelatedElem navigation property -->
132
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
133
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
134
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
135
+ </ECRelationshipClass>
136
+ <ECEntityClass typeName="Test2dElement">
137
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
138
+ <!-- Primitives -->
139
+ <ECProperty propertyName="StrProp" typeName="string"/>
140
+ <ECProperty propertyName="IntProp" typeName="int"/>
141
+ <ECProperty propertyName="LongProp" typeName="long"/>
142
+ <ECProperty propertyName="DblProp" typeName="double"/>
143
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
144
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
145
+ <ECProperty propertyName="BinProp" typeName="binary"/>
146
+ <!-- Geometric primitives -->
147
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
148
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
149
+ <!-- Struct, arrays -->
150
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
151
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
152
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
153
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
154
+ <!-- Navigation property -->
155
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
156
+ </ECEntityClass>
157
157
  </ECSchema>`;
158
158
  await importSchemaStrings(txn, [schema]);
159
159
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -1172,44 +1172,44 @@ describe("ChangesetReader insert-partial", () => {
1172
1172
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
1173
1173
  txn = startTestTxn(rwIModel, "ChangesetReader insert-partial");
1174
1174
  // Txn 1: import schema + drawing model setup, then push
1175
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
1176
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
1177
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
1178
- <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
1179
- <ECStructClass typeName="RichPoint" modifier="Sealed">
1180
- <ECProperty propertyName="X" typeName="double"/>
1181
- <ECProperty propertyName="Y" typeName="double"/>
1182
- <ECProperty propertyName="Z" typeName="double"/>
1183
- <ECProperty propertyName="Label" typeName="string"/>
1184
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
1185
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
1186
- </ECStructClass>
1187
- <!-- Relationship used by the RelatedElem navigation property -->
1188
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
1189
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
1190
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
1191
- </ECRelationshipClass>
1192
- <ECEntityClass typeName="Test2dElement">
1193
- <BaseClass>bis:GraphicalElement2d</BaseClass>
1194
- <!-- Primitives -->
1195
- <ECProperty propertyName="StrProp" typeName="string"/>
1196
- <ECProperty propertyName="IntProp" typeName="int"/>
1197
- <ECProperty propertyName="LongProp" typeName="long"/>
1198
- <ECProperty propertyName="DblProp" typeName="double"/>
1199
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
1200
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
1201
- <ECProperty propertyName="BinProp" typeName="binary"/>
1202
- <!-- Geometric primitives -->
1203
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
1204
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
1205
- <!-- Struct, arrays -->
1206
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
1207
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
1208
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
1209
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
1210
- <!-- Navigation property -->
1211
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
1212
- </ECEntityClass>
1175
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
1176
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
1177
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
1178
+ <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
1179
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
1180
+ <ECProperty propertyName="X" typeName="double"/>
1181
+ <ECProperty propertyName="Y" typeName="double"/>
1182
+ <ECProperty propertyName="Z" typeName="double"/>
1183
+ <ECProperty propertyName="Label" typeName="string"/>
1184
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
1185
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
1186
+ </ECStructClass>
1187
+ <!-- Relationship used by the RelatedElem navigation property -->
1188
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
1189
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
1190
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
1191
+ </ECRelationshipClass>
1192
+ <ECEntityClass typeName="Test2dElement">
1193
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
1194
+ <!-- Primitives -->
1195
+ <ECProperty propertyName="StrProp" typeName="string"/>
1196
+ <ECProperty propertyName="IntProp" typeName="int"/>
1197
+ <ECProperty propertyName="LongProp" typeName="long"/>
1198
+ <ECProperty propertyName="DblProp" typeName="double"/>
1199
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
1200
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
1201
+ <ECProperty propertyName="BinProp" typeName="binary"/>
1202
+ <!-- Geometric primitives -->
1203
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
1204
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
1205
+ <!-- Struct, arrays -->
1206
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
1207
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
1208
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
1209
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
1210
+ <!-- Navigation property -->
1211
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
1212
+ </ECEntityClass>
1213
1213
  </ECSchema>`;
1214
1214
  await importSchemaStrings(txn, [schema]);
1215
1215
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -1685,44 +1685,44 @@ describe("ChangesetReader update-full", () => {
1685
1685
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
1686
1686
  txn = startTestTxn(rwIModel, "ChangesetReader update-full setup");
1687
1687
  // Txn 1: import schema + drawing model setup, then push
1688
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
1689
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
1690
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
1691
- <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
1692
- <ECStructClass typeName="RichPoint" modifier="Sealed">
1693
- <ECProperty propertyName="X" typeName="double"/>
1694
- <ECProperty propertyName="Y" typeName="double"/>
1695
- <ECProperty propertyName="Z" typeName="double"/>
1696
- <ECProperty propertyName="Label" typeName="string"/>
1697
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
1698
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
1699
- </ECStructClass>
1700
- <!-- Relationship used by the RelatedElem navigation property -->
1701
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
1702
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
1703
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
1704
- </ECRelationshipClass>
1705
- <ECEntityClass typeName="Test2dElement">
1706
- <BaseClass>bis:GraphicalElement2d</BaseClass>
1707
- <!-- Primitives -->
1708
- <ECProperty propertyName="StrProp" typeName="string"/>
1709
- <ECProperty propertyName="IntProp" typeName="int"/>
1710
- <ECProperty propertyName="LongProp" typeName="long"/>
1711
- <ECProperty propertyName="DblProp" typeName="double"/>
1712
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
1713
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
1714
- <ECProperty propertyName="BinProp" typeName="binary"/>
1715
- <!-- Geometric primitives -->
1716
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
1717
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
1718
- <!-- Struct, arrays -->
1719
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
1720
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
1721
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
1722
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
1723
- <!-- Navigation property -->
1724
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
1725
- </ECEntityClass>
1688
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
1689
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
1690
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
1691
+ <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
1692
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
1693
+ <ECProperty propertyName="X" typeName="double"/>
1694
+ <ECProperty propertyName="Y" typeName="double"/>
1695
+ <ECProperty propertyName="Z" typeName="double"/>
1696
+ <ECProperty propertyName="Label" typeName="string"/>
1697
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
1698
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
1699
+ </ECStructClass>
1700
+ <!-- Relationship used by the RelatedElem navigation property -->
1701
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
1702
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
1703
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
1704
+ </ECRelationshipClass>
1705
+ <ECEntityClass typeName="Test2dElement">
1706
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
1707
+ <!-- Primitives -->
1708
+ <ECProperty propertyName="StrProp" typeName="string"/>
1709
+ <ECProperty propertyName="IntProp" typeName="int"/>
1710
+ <ECProperty propertyName="LongProp" typeName="long"/>
1711
+ <ECProperty propertyName="DblProp" typeName="double"/>
1712
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
1713
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
1714
+ <ECProperty propertyName="BinProp" typeName="binary"/>
1715
+ <!-- Geometric primitives -->
1716
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
1717
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
1718
+ <!-- Struct, arrays -->
1719
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
1720
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
1721
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
1722
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
1723
+ <!-- Navigation property -->
1724
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
1725
+ </ECEntityClass>
1726
1726
  </ECSchema>`;
1727
1727
  await importSchemaStrings(txn, [schema]);
1728
1728
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -2320,44 +2320,44 @@ describe("ChangesetReader delete-partial", () => {
2320
2320
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
2321
2321
  txn = startTestTxn(rwIModel, "ChangesetReader delete-partial");
2322
2322
  // Txn 1: import schema + drawing model setup, then push
2323
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
2324
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
2325
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
2326
- <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
2327
- <ECStructClass typeName="RichPoint" modifier="Sealed">
2328
- <ECProperty propertyName="X" typeName="double"/>
2329
- <ECProperty propertyName="Y" typeName="double"/>
2330
- <ECProperty propertyName="Z" typeName="double"/>
2331
- <ECProperty propertyName="Label" typeName="string"/>
2332
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
2333
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
2334
- </ECStructClass>
2335
- <!-- Relationship used by the RelatedElem navigation property -->
2336
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
2337
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
2338
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
2339
- </ECRelationshipClass>
2340
- <ECEntityClass typeName="Test2dElement">
2341
- <BaseClass>bis:GraphicalElement2d</BaseClass>
2342
- <!-- Primitives -->
2343
- <ECProperty propertyName="StrProp" typeName="string"/>
2344
- <ECProperty propertyName="IntProp" typeName="int"/>
2345
- <ECProperty propertyName="LongProp" typeName="long"/>
2346
- <ECProperty propertyName="DblProp" typeName="double"/>
2347
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
2348
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
2349
- <ECProperty propertyName="BinProp" typeName="binary"/>
2350
- <!-- Geometric primitives -->
2351
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
2352
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
2353
- <!-- Struct, arrays -->
2354
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
2355
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
2356
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
2357
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
2358
- <!-- Navigation property -->
2359
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
2360
- </ECEntityClass>
2323
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
2324
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
2325
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
2326
+ <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
2327
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
2328
+ <ECProperty propertyName="X" typeName="double"/>
2329
+ <ECProperty propertyName="Y" typeName="double"/>
2330
+ <ECProperty propertyName="Z" typeName="double"/>
2331
+ <ECProperty propertyName="Label" typeName="string"/>
2332
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
2333
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
2334
+ </ECStructClass>
2335
+ <!-- Relationship used by the RelatedElem navigation property -->
2336
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
2337
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
2338
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
2339
+ </ECRelationshipClass>
2340
+ <ECEntityClass typeName="Test2dElement">
2341
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
2342
+ <!-- Primitives -->
2343
+ <ECProperty propertyName="StrProp" typeName="string"/>
2344
+ <ECProperty propertyName="IntProp" typeName="int"/>
2345
+ <ECProperty propertyName="LongProp" typeName="long"/>
2346
+ <ECProperty propertyName="DblProp" typeName="double"/>
2347
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
2348
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
2349
+ <ECProperty propertyName="BinProp" typeName="binary"/>
2350
+ <!-- Geometric primitives -->
2351
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
2352
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
2353
+ <!-- Struct, arrays -->
2354
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
2355
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
2356
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
2357
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
2358
+ <!-- Navigation property -->
2359
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
2360
+ </ECEntityClass>
2361
2361
  </ECSchema>`;
2362
2362
  await importSchemaStrings(txn, [schema]);
2363
2363
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -2741,44 +2741,44 @@ describe("ChangesetReader filters", () => {
2741
2741
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
2742
2742
  txn = startTestTxn(rwIModel, "ChangesetReader filters");
2743
2743
  // Txn 1: import schema + drawing model setup, then push
2744
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
2745
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
2746
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
2747
- <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
2748
- <ECStructClass typeName="RichPoint" modifier="Sealed">
2749
- <ECProperty propertyName="X" typeName="double"/>
2750
- <ECProperty propertyName="Y" typeName="double"/>
2751
- <ECProperty propertyName="Z" typeName="double"/>
2752
- <ECProperty propertyName="Label" typeName="string"/>
2753
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
2754
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
2755
- </ECStructClass>
2756
- <!-- Relationship used by the RelatedElem navigation property -->
2757
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
2758
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
2759
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
2760
- </ECRelationshipClass>
2761
- <ECEntityClass typeName="Test2dElement">
2762
- <BaseClass>bis:GraphicalElement2d</BaseClass>
2763
- <!-- Primitives -->
2764
- <ECProperty propertyName="StrProp" typeName="string"/>
2765
- <ECProperty propertyName="IntProp" typeName="int"/>
2766
- <ECProperty propertyName="LongProp" typeName="long"/>
2767
- <ECProperty propertyName="DblProp" typeName="double"/>
2768
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
2769
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
2770
- <ECProperty propertyName="BinProp" typeName="binary"/>
2771
- <!-- Geometric primitives -->
2772
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
2773
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
2774
- <!-- Struct, arrays -->
2775
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
2776
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
2777
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
2778
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
2779
- <!-- Navigation property -->
2780
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
2781
- </ECEntityClass>
2744
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
2745
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
2746
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
2747
+ <!-- Rich struct: scalar fields + nested point2d/3d sub-properties -->
2748
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
2749
+ <ECProperty propertyName="X" typeName="double"/>
2750
+ <ECProperty propertyName="Y" typeName="double"/>
2751
+ <ECProperty propertyName="Z" typeName="double"/>
2752
+ <ECProperty propertyName="Label" typeName="string"/>
2753
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
2754
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
2755
+ </ECStructClass>
2756
+ <!-- Relationship used by the RelatedElem navigation property -->
2757
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
2758
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
2759
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
2760
+ </ECRelationshipClass>
2761
+ <ECEntityClass typeName="Test2dElement">
2762
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
2763
+ <!-- Primitives -->
2764
+ <ECProperty propertyName="StrProp" typeName="string"/>
2765
+ <ECProperty propertyName="IntProp" typeName="int"/>
2766
+ <ECProperty propertyName="LongProp" typeName="long"/>
2767
+ <ECProperty propertyName="DblProp" typeName="double"/>
2768
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
2769
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
2770
+ <ECProperty propertyName="BinProp" typeName="binary"/>
2771
+ <!-- Geometric primitives -->
2772
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
2773
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
2774
+ <!-- Struct, arrays -->
2775
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
2776
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
2777
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
2778
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
2779
+ <!-- Navigation property -->
2780
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
2781
+ </ECEntityClass>
2782
2782
  </ECSchema>`;
2783
2783
  await importSchemaStrings(txn, [schema]);
2784
2784
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3054,18 +3054,18 @@ describe("ChangesetReader — openFile + openGroup", () => {
3054
3054
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
3055
3055
  txn = startTestTxn(rwIModel, "ChangesetReader setup");
3056
3056
  // Push 1: import schema + drawing model setup
3057
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3058
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3059
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3060
- <ECEntityClass typeName="SimpleElement">
3061
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3062
- <!-- Simple binary -->
3063
- <ECProperty propertyName="BinProp" typeName="binary"/>
3064
- <!-- Point3d -->
3065
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
3066
- <!-- Array of GUIDs stored as strings -->
3067
- <ECArrayProperty propertyName="GuidArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
3068
- </ECEntityClass>
3057
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
3058
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3059
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3060
+ <ECEntityClass typeName="SimpleElement">
3061
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3062
+ <!-- Simple binary -->
3063
+ <ECProperty propertyName="BinProp" typeName="binary"/>
3064
+ <!-- Point3d -->
3065
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
3066
+ <!-- Array of GUIDs stored as strings -->
3067
+ <ECArrayProperty propertyName="GuidArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
3068
+ </ECEntityClass>
3069
3069
  </ECSchema>`;
3070
3070
  await importSchemaStrings(txn, [schema]);
3071
3071
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3279,6 +3279,61 @@ describe("ChangesetReader — openFile + openGroup", () => {
3279
3279
  }
3280
3280
  }
3281
3281
  });
3282
+ it("openGroup: insert in one changeset then delete in another yields no instances for the element (net no-op)", async () => {
3283
+ const adminToken = "super manager token";
3284
+ const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, "changesets");
3285
+ // Record how many changesets already exist so we can identify the new ones by index
3286
+ let changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });
3287
+ const baseCount = changesets.length;
3288
+ // Wait so that LastMod on bis_Model gets a distinct timestamp before the insert txn
3289
+ await new Promise((resolve) => setTimeout(resolve, 300));
3290
+ // --- Push baseCount+1: insert a brand-new element ---
3291
+ await rwIModel.locks.acquireLocks({ shared: drawingModelId });
3292
+ const noOpElementId = txn.insertElement({
3293
+ classFullName: "TestDomain:SimpleElement",
3294
+ model: drawingModelId,
3295
+ category: drawingCategoryId,
3296
+ code: Code.createEmpty(),
3297
+ BinProp: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),
3298
+ });
3299
+ txn.saveChanges("insert no-op element");
3300
+ await rwIModel.pushChanges({ description: "insert no-op element", accessToken: adminToken });
3301
+ changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });
3302
+ expect(changesets.length).to.equal(baseCount + 1);
3303
+ const insertCs = changesets[baseCount];
3304
+ // Wait so that LastMod on bis_Model gets a distinct timestamp before the delete txn
3305
+ await new Promise((resolve) => setTimeout(resolve, 300));
3306
+ // --- Push baseCount+2: delete the same element ---
3307
+ await rwIModel.locks.acquireLocks({ exclusive: noOpElementId });
3308
+ txn.deleteElement(noOpElementId);
3309
+ txn.saveChanges("delete no-op element");
3310
+ await rwIModel.pushChanges({ description: "delete no-op element", accessToken: adminToken });
3311
+ changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });
3312
+ expect(changesets.length).to.equal(baseCount + 2);
3313
+ const deleteCs = changesets[baseCount + 1];
3314
+ // === openGroup: insert + delete streamed together — element never existed net, so no instances ===
3315
+ {
3316
+ const env_18 = { stack: [], error: void 0, hasError: false };
3317
+ try {
3318
+ const reader = __addDisposableResource(env_18, ChangesetReader.openGroup({ db: rwIModel, changesetFiles: [insertCs.pathname, deleteCs.pathname] }), false);
3319
+ const pcu = __addDisposableResource(env_18, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
3320
+ while (reader.step())
3321
+ pcu.appendFrom(reader);
3322
+ const instances = Array.from(pcu.instances);
3323
+ // Insert followed immediately by delete cancels out: the unifier must produce zero instances
3324
+ // for this element because the net effect on the database is nothing changed.
3325
+ const elemInstances = instances.filter((i) => i.ECInstanceId === noOpElementId);
3326
+ expect(elemInstances).to.have.length(0, `expected no-op for element ${noOpElementId} but got ${elemInstances.length} instance(s)`);
3327
+ }
3328
+ catch (e_18) {
3329
+ env_18.error = e_18;
3330
+ env_18.hasError = true;
3331
+ }
3332
+ finally {
3333
+ __disposeResources(env_18);
3334
+ }
3335
+ }
3336
+ });
3282
3337
  });
3283
3338
  describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3284
3339
  let rwIModel;
@@ -3294,18 +3349,18 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3294
3349
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
3295
3350
  txn = startTestTxn(rwIModel, "ChangesetReader setup");
3296
3351
  // Push 1: import schema + drawing model setup
3297
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3298
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3299
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3300
- <ECEntityClass typeName="SimpleElement">
3301
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3302
- <!-- Simple binary -->
3303
- <ECProperty propertyName="BinProp" typeName="binary"/>
3304
- <!-- Point3d -->
3305
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
3306
- <!-- Array of GUIDs stored as strings -->
3307
- <ECArrayProperty propertyName="GuidArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
3308
- </ECEntityClass>
3352
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
3353
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3354
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3355
+ <ECEntityClass typeName="SimpleElement">
3356
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3357
+ <!-- Simple binary -->
3358
+ <ECProperty propertyName="BinProp" typeName="binary"/>
3359
+ <!-- Point3d -->
3360
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
3361
+ <!-- Array of GUIDs stored as strings -->
3362
+ <ECArrayProperty propertyName="GuidArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
3363
+ </ECEntityClass>
3309
3364
  </ECSchema>`;
3310
3365
  await importSchemaStrings(txn, [schema]);
3311
3366
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3341,10 +3396,10 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3341
3396
  });
3342
3397
  txn.saveChanges("insert element");
3343
3398
  {
3344
- const env_18 = { stack: [], error: void 0, hasError: false };
3399
+ const env_19 = { stack: [], error: void 0, hasError: false };
3345
3400
  try {
3346
- const reader = __addDisposableResource(env_18, ChangesetReader.openLocalChanges({ db: rwIModel, rowOptions: { abbreviateBlobs: false } }), false);
3347
- const pcu = __addDisposableResource(env_18, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3401
+ const reader = __addDisposableResource(env_19, ChangesetReader.openLocalChanges({ db: rwIModel, rowOptions: { abbreviateBlobs: false } }), false);
3402
+ const pcu = __addDisposableResource(env_19, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3348
3403
  while (reader.step())
3349
3404
  pcu.appendFrom(reader);
3350
3405
  const instances = Array.from(pcu.instances);
@@ -3380,12 +3435,12 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3380
3435
  'JsonProperties', 'LastMod', 'Model.Id', 'Origin', 'Parent', 'Pt3dProp', 'Rotation',
3381
3436
  'TypeDefinition', 'UserLabel'].sort());
3382
3437
  }
3383
- catch (e_18) {
3384
- env_18.error = e_18;
3385
- env_18.hasError = true;
3438
+ catch (e_19) {
3439
+ env_19.error = e_19;
3440
+ env_19.hasError = true;
3386
3441
  }
3387
3442
  finally {
3388
- __disposeResources(env_18);
3443
+ __disposeResources(env_19);
3389
3444
  }
3390
3445
  }
3391
3446
  // Wait so that LastMod on bis_Model gets a distinct timestamp before the update txn
@@ -3400,10 +3455,10 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3400
3455
  ],
3401
3456
  });
3402
3457
  {
3403
- const env_19 = { stack: [], error: void 0, hasError: false };
3458
+ const env_20 = { stack: [], error: void 0, hasError: false };
3404
3459
  try {
3405
- const reader = __addDisposableResource(env_19, ChangesetReader.openInMemoryChanges({ db: rwIModel, rowOptions: { abbreviateBlobs: false } }), false);
3406
- const pcu = __addDisposableResource(env_19, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3460
+ const reader = __addDisposableResource(env_20, ChangesetReader.openInMemoryChanges({ db: rwIModel, rowOptions: { abbreviateBlobs: false } }), false);
3461
+ const pcu = __addDisposableResource(env_20, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3407
3462
  while (reader.step())
3408
3463
  pcu.appendFrom(reader);
3409
3464
  const instances = Array.from(pcu.instances);
@@ -3441,20 +3496,20 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3441
3496
  assert.equal(elemOld.$meta.isIndirectChange, false);
3442
3497
  assert.deepEqual(elemOld.$meta.changeFetchedPropNames.sort(), ['BBoxHigh', 'BBoxLow', 'BinProp', 'ECInstanceId', 'GuidArrProp', 'LastMod', 'Origin', 'Pt3dProp', 'Rotation'].sort());
3443
3498
  }
3444
- catch (e_19) {
3445
- env_19.error = e_19;
3446
- env_19.hasError = true;
3499
+ catch (e_20) {
3500
+ env_20.error = e_20;
3501
+ env_20.hasError = true;
3447
3502
  }
3448
3503
  finally {
3449
- __disposeResources(env_19);
3504
+ __disposeResources(env_20);
3450
3505
  }
3451
3506
  }
3452
3507
  // === openLocalChanges: insert + update as a single stream so becomes insert ===
3453
3508
  {
3454
- const env_20 = { stack: [], error: void 0, hasError: false };
3509
+ const env_21 = { stack: [], error: void 0, hasError: false };
3455
3510
  try {
3456
- const reader = __addDisposableResource(env_20, ChangesetReader.openLocalChanges({ db: rwIModel, includeInMemoryChanges: true, rowOptions: { abbreviateBlobs: false } }), false);
3457
- const pcu = __addDisposableResource(env_20, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3511
+ const reader = __addDisposableResource(env_21, ChangesetReader.openLocalChanges({ db: rwIModel, includeInMemoryChanges: true, rowOptions: { abbreviateBlobs: false } }), false);
3512
+ const pcu = __addDisposableResource(env_21, new PartialChangeUnifier(ChangeUnifierCache.createSqliteBackedCache()), false);
3458
3513
  while (reader.step())
3459
3514
  pcu.appendFrom(reader);
3460
3515
  const instances = Array.from(pcu.instances);
@@ -3494,12 +3549,12 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
3494
3549
  'Rotation', 'TypeDefinition', 'UserLabel'].sort());
3495
3550
  assert.equal(elemNew.$meta.isIndirectChange, false);
3496
3551
  }
3497
- catch (e_20) {
3498
- env_20.error = e_20;
3499
- env_20.hasError = true;
3552
+ catch (e_21) {
3553
+ env_21.error = e_21;
3554
+ env_21.hasError = true;
3500
3555
  }
3501
3556
  finally {
3502
- __disposeResources(env_20);
3557
+ __disposeResources(env_21);
3503
3558
  }
3504
3559
  }
3505
3560
  });
@@ -3521,13 +3576,13 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3521
3576
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
3522
3577
  txn = startTestTxn(rwIModel, "ChangesetReaderBugsTest setup");
3523
3578
  // Push 1: import schema + set up drawing model and two categories
3524
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3525
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3526
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3527
- <ECEntityClass typeName="Test2dElement">
3528
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3529
- <ECProperty propertyName="s" typeName="point2d"/>
3530
- </ECEntityClass>
3579
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
3580
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3581
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3582
+ <ECEntityClass typeName="Test2dElement">
3583
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3584
+ <ECProperty propertyName="s" typeName="point2d"/>
3585
+ </ECEntityClass>
3531
3586
  </ECSchema>`;
3532
3587
  await importSchemaStrings(txn, [schema]);
3533
3588
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3548,7 +3603,7 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3548
3603
  HubMock.shutdown();
3549
3604
  });
3550
3605
  it("openFile() reads the middle changeset of an insert → update → delete lifecycle", async () => {
3551
- const env_21 = { stack: [], error: void 0, hasError: false };
3606
+ const env_22 = { stack: [], error: void 0, hasError: false };
3552
3607
  try {
3553
3608
  const adminToken = "super manager token";
3554
3609
  // Push 2 (insert): insert element with category1
@@ -3596,8 +3651,8 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3596
3651
  const changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });
3597
3652
  expect(changesets.length).to.equal(4);
3598
3653
  const middleChangeset = changesets[Math.floor(changesets.length / 2)]; // index 2 = update
3599
- const reader = __addDisposableResource(env_21, ChangesetReader.openFile({ db: rwIModel, fileName: middleChangeset.pathname, propFilter: PropertyFilter.InstanceKey, rowOptions: { classIdsToClassNames: true } }), false);
3600
- const pcu = __addDisposableResource(env_21, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
3654
+ const reader = __addDisposableResource(env_22, ChangesetReader.openFile({ db: rwIModel, fileName: middleChangeset.pathname, propFilter: PropertyFilter.InstanceKey, rowOptions: { classIdsToClassNames: true } }), false);
3655
+ const pcu = __addDisposableResource(env_22, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
3601
3656
  while (reader.step())
3602
3657
  pcu.appendFrom(reader);
3603
3658
  const instances = Array.from(pcu.instances);
@@ -3616,16 +3671,16 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3616
3671
  expect(bisElementNew.map((i => i.ECClassId)).sort()).to.deep.equal(["BisCore.GeometricElement2d", "BisCore.Element"].sort());
3617
3672
  expect(bisElementOld.map((i => i.ECClassId)).sort()).to.deep.equal(["BisCore.GeometricElement2d", "BisCore.Element"].sort());
3618
3673
  }
3619
- catch (e_21) {
3620
- env_21.error = e_21;
3621
- env_21.hasError = true;
3674
+ catch (e_22) {
3675
+ env_22.error = e_22;
3676
+ env_22.hasError = true;
3622
3677
  }
3623
3678
  finally {
3624
- __disposeResources(env_21);
3679
+ __disposeResources(env_22);
3625
3680
  }
3626
3681
  });
3627
3682
  it("openTxn() reads the middle txn of an insert → update → update lifecycle", async () => {
3628
- const env_22 = { stack: [], error: void 0, hasError: false };
3683
+ const env_23 = { stack: [], error: void 0, hasError: false };
3629
3684
  try {
3630
3685
  // Push 2 (insert): insert element with category1
3631
3686
  const geomArray = [
@@ -3667,8 +3722,8 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3667
3722
  s: { x: 100.0, y: 200.0 },
3668
3723
  });
3669
3724
  txn.saveChanges("update element");
3670
- const reader = __addDisposableResource(env_22, ChangesetReader.openTxn({ db: rwIModel, txnId }), false);
3671
- const pcu = __addDisposableResource(env_22, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
3725
+ const reader = __addDisposableResource(env_23, ChangesetReader.openTxn({ db: rwIModel, txnId }), false);
3726
+ const pcu = __addDisposableResource(env_23, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
3672
3727
  while (reader.step())
3673
3728
  pcu.appendFrom(reader);
3674
3729
  const instances = Array.from(pcu.instances);
@@ -3690,12 +3745,12 @@ describe("ChangesetReader: behaviour in case imodel is not in sync with changese
3690
3745
  expect(elementOld.$meta.changeFetchedPropNames).to.include("s.X");
3691
3746
  expect(elementOld.$meta.changeFetchedPropNames).to.not.include("s.Y");
3692
3747
  }
3693
- catch (e_22) {
3694
- env_22.error = e_22;
3695
- env_22.hasError = true;
3748
+ catch (e_23) {
3749
+ env_23.error = e_23;
3750
+ env_23.hasError = true;
3696
3751
  }
3697
3752
  finally {
3698
- __disposeResources(env_22);
3753
+ __disposeResources(env_23);
3699
3754
  }
3700
3755
  });
3701
3756
  });
@@ -3714,13 +3769,13 @@ describe("ChangesetReader: overflow table graceful recovery when ExclusiveRootCl
3714
3769
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
3715
3770
  txn = startTestTxn(rwIModel, "overflow null test");
3716
3771
  // Import schema with class that spans the overflow table (36 properties)
3717
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3718
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3719
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3720
- <ECEntityClass typeName="Test2dElement">
3721
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3722
- ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName="p${i}" typeName="string"/>`).join("\n")}
3723
- </ECEntityClass>
3772
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
3773
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3774
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3775
+ <ECEntityClass typeName="Test2dElement">
3776
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3777
+ ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName="p${i}" typeName="string"/>`).join("\n")}
3778
+ </ECEntityClass>
3724
3779
  </ECSchema>`;
3725
3780
  await importSchemaStrings(txn, [schema]);
3726
3781
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3778,7 +3833,7 @@ describe("ChangesetReader: overflow table graceful recovery when ExclusiveRootCl
3778
3833
  HubMock.shutdown();
3779
3834
  });
3780
3835
  it("openFile() recovers gracefully when ExclusiveRootClassId is NULL for overflow table", () => {
3781
- const env_23 = { stack: [], error: void 0, hasError: false };
3836
+ const env_24 = { stack: [], error: void 0, hasError: false };
3782
3837
  try {
3783
3838
  /**
3784
3839
  * Simulate the broken state: clear ExclusiveRootClassId so the reader cannot
@@ -3788,7 +3843,7 @@ describe("ChangesetReader: overflow table graceful recovery when ExclusiveRootCl
3788
3843
  */
3789
3844
  expect(rwIModel[_nativeDb].executeSql("UPDATE ec_Table SET ExclusiveRootClassId=NULL WHERE Name='bis_GeometricElement2d_Overflow'")).to.equal(DbResult.BE_SQLITE_OK);
3790
3845
  let assertedOnOverflowTable = false;
3791
- const reader = __addDisposableResource(env_23, ChangesetReader.openFile({ db: rwIModel, fileName: updateChangesetPathname }), false);
3846
+ const reader = __addDisposableResource(env_24, ChangesetReader.openFile({ db: rwIModel, fileName: updateChangesetPathname }), false);
3792
3847
  while (reader.step()) {
3793
3848
  if (reader.tableName !== "bis_GeometricElement2d_Overflow")
3794
3849
  continue;
@@ -3811,21 +3866,21 @@ describe("ChangesetReader: overflow table graceful recovery when ExclusiveRootCl
3811
3866
  }
3812
3867
  assert.isTrue(assertedOnOverflowTable, "Expected at least one row from the overflow table");
3813
3868
  }
3814
- catch (e_23) {
3815
- env_23.error = e_23;
3816
- env_23.hasError = true;
3869
+ catch (e_24) {
3870
+ env_24.error = e_24;
3871
+ env_24.hasError = true;
3817
3872
  }
3818
3873
  finally {
3819
- __disposeResources(env_23);
3874
+ __disposeResources(env_24);
3820
3875
  }
3821
3876
  });
3822
3877
  });
3823
3878
  describe("ChangesetReader: instance reused with a different class (class change in Updated row)", () => {
3824
3879
  it("openFile() correctly identifies ECClassId change from T1 to T2 in a buggy changeset", async () => {
3825
- const env_24 = { stack: [], error: void 0, hasError: false };
3880
+ const env_25 = { stack: [], error: void 0, hasError: false };
3826
3881
  try {
3827
3882
  /**
3828
- * Same scenario as ChangesetReader.test.ts: "Instance update to a different class (bug)".
3883
+ * Same scenario as SQliteChangesetReaderAndChangesetECAdaptor.test.ts: "Instance update to a different class (bug)".
3829
3884
  * Verifies ChangesetReader behaviour when an instance ID is reused with a different class.
3830
3885
  *
3831
3886
  * Steps:
@@ -3847,17 +3902,17 @@ describe("ChangesetReader: instance reused with a different class (class change
3847
3902
  assert.isNotEmpty(modelId);
3848
3903
  let b1 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: modelId, accessToken: adminToken });
3849
3904
  let txn = startTestTxn(b1, "class change test");
3850
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3851
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3852
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3853
- <ECEntityClass typeName="T1">
3854
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3855
- <ECProperty propertyName="p" typeName="string"/>
3856
- </ECEntityClass>
3857
- <ECEntityClass typeName="T2">
3858
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3859
- <ECProperty propertyName="p" typeName="long"/>
3860
- </ECEntityClass>
3905
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
3906
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3907
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3908
+ <ECEntityClass typeName="T1">
3909
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3910
+ <ECProperty propertyName="p" typeName="string"/>
3911
+ </ECEntityClass>
3912
+ <ECEntityClass typeName="T2">
3913
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
3914
+ <ECProperty propertyName="p" typeName="long"/>
3915
+ </ECEntityClass>
3861
3916
  </ECSchema>`;
3862
3917
  await importSchemaStrings(txn, [schema]);
3863
3918
  b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -3927,7 +3982,7 @@ describe("ChangesetReader: instance reused with a different class (class change
3927
3982
  // so it correctly sees T2 for the new (inserted) side and T1 for the old (deleted) side.
3928
3983
  let bisElementAsserted = false;
3929
3984
  let bisGeomElement2dAsserted = false;
3930
- const reader = __addDisposableResource(env_24, ChangesetReader.openFile({ db: b1, fileName: changesets[1].pathname }), false);
3985
+ const reader = __addDisposableResource(env_25, ChangesetReader.openFile({ db: b1, fileName: changesets[1].pathname }), false);
3931
3986
  while (reader.step()) {
3932
3987
  if (reader.tableName === "bis_Element" && reader.op === "Updated") {
3933
3988
  bisElementAsserted = true;
@@ -3957,12 +4012,12 @@ describe("ChangesetReader: instance reused with a different class (class change
3957
4012
  b1.close();
3958
4013
  HubMock.shutdown();
3959
4014
  }
3960
- catch (e_24) {
3961
- env_24.error = e_24;
3962
- env_24.hasError = true;
4015
+ catch (e_25) {
4016
+ env_25.error = e_25;
4017
+ env_25.hasError = true;
3963
4018
  }
3964
4019
  finally {
3965
- __disposeResources(env_24);
4020
+ __disposeResources(env_25);
3966
4021
  }
3967
4022
  });
3968
4023
  });
@@ -3986,13 +4041,13 @@ describe("ChangesetReader: overflow table insert and update and delete", () => {
3986
4041
  rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
3987
4042
  txn = startTestTxn(rwIModel, "ChangesetReader overflow insert/update");
3988
4043
  // 36 string properties — enough to spill columns into bis_GeometricElement2d_Overflow
3989
- const schema = `<?xml version="1.0" encoding="UTF-8"?>
3990
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
3991
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
3992
- <ECEntityClass typeName="OverflowElement">
3993
- <BaseClass>bis:GraphicalElement2d</BaseClass>
3994
- ${Array.from({ length: nProps }, (_, i) => `<ECProperty propertyName="${propName(i)}" typeName="string"/>`).join("\n ")}
3995
- </ECEntityClass>
4044
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
4045
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4046
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4047
+ <ECEntityClass typeName="OverflowElement">
4048
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
4049
+ ${Array.from({ length: nProps }, (_, i) => `<ECProperty propertyName="${propName(i)}" typeName="string"/>`).join("\n ")}
4050
+ </ECEntityClass>
3996
4051
  </ECSchema>`;
3997
4052
  await importSchemaStrings(txn, [schema]);
3998
4053
  rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
@@ -4256,7 +4311,7 @@ describe("ChangesetReader: invalid inputs", () => {
4256
4311
  expect(() => ChangesetReader.openFile({ db: iModel, fileName: KnownTestLocations.outputDir })).to.throw();
4257
4312
  });
4258
4313
  it("openFile: path points to a plain text file (not .changeset) throws", () => {
4259
- const env_25 = { stack: [], error: void 0, hasError: false };
4314
+ const env_26 = { stack: [], error: void 0, hasError: false };
4260
4315
  try {
4261
4316
  const txtFile = path.join(KnownTestLocations.outputDir, "not_a_changeset.txt");
4262
4317
  if (fs.existsSync(txtFile))
@@ -4264,19 +4319,19 @@ describe("ChangesetReader: invalid inputs", () => {
4264
4319
  // Write a small non-changeset file and expect the reader to reject it.
4265
4320
  fs.writeFileSync(txtFile, "this is not a changeset");
4266
4321
  // The native code asserts on an invalid changeset file. Suppress this.
4267
- const _disableAssertions = __addDisposableResource(env_25, new DisableNativeAssertions(), false);
4268
- const reader = __addDisposableResource(env_25, ChangesetReader.openFile({ db: iModel, fileName: txtFile }), false);
4322
+ const _disableAssertions = __addDisposableResource(env_26, new DisableNativeAssertions(), false);
4323
+ const reader = __addDisposableResource(env_26, ChangesetReader.openFile({ db: iModel, fileName: txtFile }), false);
4269
4324
  assert.equal(reader.step(), false, "Expected step() to return false for an invalid changeset file");
4270
4325
  assert.equal(reader.step(), false, "Expected step() to return false for an invalid changeset file");
4271
4326
  assert.equal(reader.step(), false, "Expected step() to return false for an invalid changeset file");
4272
4327
  assert.equal(reader.step(), false, "Expected step() to return false for an invalid changeset file");
4273
4328
  }
4274
- catch (e_25) {
4275
- env_25.error = e_25;
4276
- env_25.hasError = true;
4329
+ catch (e_26) {
4330
+ env_26.error = e_26;
4331
+ env_26.hasError = true;
4277
4332
  }
4278
4333
  finally {
4279
- __disposeResources(env_25);
4334
+ __disposeResources(env_26);
4280
4335
  }
4281
4336
  });
4282
4337
  // --- openGroup ---
@@ -4296,17 +4351,17 @@ describe("ChangesetReader: invalid inputs", () => {
4296
4351
  // Passing the same changeset file twice is unusual but not necessarily an error at open time.
4297
4352
  // The reader should open and step without throwing; the caller is responsible for any semantic issues.
4298
4353
  expect(() => {
4299
- const env_26 = { stack: [], error: void 0, hasError: false };
4354
+ const env_27 = { stack: [], error: void 0, hasError: false };
4300
4355
  try {
4301
- const reader = __addDisposableResource(env_26, ChangesetReader.openGroup({ db: iModel, changesetFiles: [validChangesetPath, validChangesetPath] }), false);
4356
+ const reader = __addDisposableResource(env_27, ChangesetReader.openGroup({ db: iModel, changesetFiles: [validChangesetPath, validChangesetPath] }), false);
4302
4357
  while (reader.step()) { /* drain */ }
4303
4358
  }
4304
- catch (e_26) {
4305
- env_26.error = e_26;
4306
- env_26.hasError = true;
4359
+ catch (e_27) {
4360
+ env_27.error = e_27;
4361
+ env_27.hasError = true;
4307
4362
  }
4308
4363
  finally {
4309
- __disposeResources(env_26);
4364
+ __disposeResources(env_27);
4310
4365
  }
4311
4366
  }).to.not.throw();
4312
4367
  });
@@ -4319,24 +4374,10 @@ describe("ChangesetReader: invalid inputs", () => {
4319
4374
  });
4320
4375
  // --- property accessors before step() ---
4321
4376
  it("accessing tableName before step() throws", () => {
4322
- const env_27 = { stack: [], error: void 0, hasError: false };
4323
- try {
4324
- const reader = __addDisposableResource(env_27, ChangesetReader.openFile({ db: iModel, fileName: validChangesetPath }), false);
4325
- expect(() => reader.tableName).to.throw();
4326
- }
4327
- catch (e_27) {
4328
- env_27.error = e_27;
4329
- env_27.hasError = true;
4330
- }
4331
- finally {
4332
- __disposeResources(env_27);
4333
- }
4334
- });
4335
- it("accessing isECTable before step() throws", () => {
4336
4377
  const env_28 = { stack: [], error: void 0, hasError: false };
4337
4378
  try {
4338
4379
  const reader = __addDisposableResource(env_28, ChangesetReader.openFile({ db: iModel, fileName: validChangesetPath }), false);
4339
- expect(() => reader.isECTable).to.throw();
4380
+ expect(() => reader.tableName).to.throw();
4340
4381
  }
4341
4382
  catch (e_28) {
4342
4383
  env_28.error = e_28;
@@ -4346,11 +4387,11 @@ describe("ChangesetReader: invalid inputs", () => {
4346
4387
  __disposeResources(env_28);
4347
4388
  }
4348
4389
  });
4349
- it("accessing isIndirectChange before step() throws", () => {
4390
+ it("accessing isECTable before step() throws", () => {
4350
4391
  const env_29 = { stack: [], error: void 0, hasError: false };
4351
4392
  try {
4352
4393
  const reader = __addDisposableResource(env_29, ChangesetReader.openFile({ db: iModel, fileName: validChangesetPath }), false);
4353
- expect(() => reader.isIndirectChange).to.throw();
4394
+ expect(() => reader.isECTable).to.throw();
4354
4395
  }
4355
4396
  catch (e_29) {
4356
4397
  env_29.error = e_29;
@@ -4360,6 +4401,20 @@ describe("ChangesetReader: invalid inputs", () => {
4360
4401
  __disposeResources(env_29);
4361
4402
  }
4362
4403
  });
4404
+ it("accessing isIndirectChange before step() throws", () => {
4405
+ const env_30 = { stack: [], error: void 0, hasError: false };
4406
+ try {
4407
+ const reader = __addDisposableResource(env_30, ChangesetReader.openFile({ db: iModel, fileName: validChangesetPath }), false);
4408
+ expect(() => reader.isIndirectChange).to.throw();
4409
+ }
4410
+ catch (e_30) {
4411
+ env_30.error = e_30;
4412
+ env_30.hasError = true;
4413
+ }
4414
+ finally {
4415
+ __disposeResources(env_30);
4416
+ }
4417
+ });
4363
4418
  it("openGroup: should throw if spillThresholdInBytes is negative", () => {
4364
4419
  expect(() => {
4365
4420
  ChangesetReader.openGroup({ db: iModel, changesetFiles: [validChangesetPath, validChangesetPath], spillThresholdInBytes: -1 });
@@ -4373,38 +4428,38 @@ describe("ChangesetReader: invalid inputs", () => {
4373
4428
  });
4374
4429
  });
4375
4430
  describe("ChangesetReader — spillThresholdInBytes (spill-to-disk)", () => {
4376
- const TEST_DOMAIN_SCHEMA = `<?xml version="1.0" encoding="UTF-8"?>
4377
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4378
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4379
- <ECStructClass typeName="RichPoint" modifier="Sealed">
4380
- <ECProperty propertyName="X" typeName="double"/>
4381
- <ECProperty propertyName="Y" typeName="double"/>
4382
- <ECProperty propertyName="Z" typeName="double"/>
4383
- <ECProperty propertyName="Label" typeName="string"/>
4384
- <ECProperty propertyName="Pt2d" typeName="point2d"/>
4385
- <ECProperty propertyName="Pt3d" typeName="point3d"/>
4386
- </ECStructClass>
4387
- <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
4388
- <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
4389
- <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
4390
- </ECRelationshipClass>
4391
- <ECEntityClass typeName="Test2dElement">
4392
- <BaseClass>bis:GraphicalElement2d</BaseClass>
4393
- <ECProperty propertyName="StrProp" typeName="string"/>
4394
- <ECProperty propertyName="IntProp" typeName="int"/>
4395
- <ECProperty propertyName="LongProp" typeName="long"/>
4396
- <ECProperty propertyName="DblProp" typeName="double"/>
4397
- <ECProperty propertyName="BoolProp" typeName="boolean"/>
4398
- <ECProperty propertyName="DtProp" typeName="dateTime"/>
4399
- <ECProperty propertyName="BinProp" typeName="binary"/>
4400
- <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
4401
- <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
4402
- <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
4403
- <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
4404
- <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
4405
- <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
4406
- <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
4407
- </ECEntityClass>
4431
+ const TEST_DOMAIN_SCHEMA = `<?xml version="1.0" encoding="UTF-8"?>
4432
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4433
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4434
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
4435
+ <ECProperty propertyName="X" typeName="double"/>
4436
+ <ECProperty propertyName="Y" typeName="double"/>
4437
+ <ECProperty propertyName="Z" typeName="double"/>
4438
+ <ECProperty propertyName="Label" typeName="string"/>
4439
+ <ECProperty propertyName="Pt2d" typeName="point2d"/>
4440
+ <ECProperty propertyName="Pt3d" typeName="point3d"/>
4441
+ </ECStructClass>
4442
+ <ECRelationshipClass typeName="Test2dUsesElement" strength="referencing" modifier="None">
4443
+ <Source multiplicity="(0..*)" roleLabel="uses" polymorphic="true"><Class class="Test2dElement"/></Source>
4444
+ <Target multiplicity="(0..1)" roleLabel="is used by" polymorphic="true"><Class class="bis:Element"/></Target>
4445
+ </ECRelationshipClass>
4446
+ <ECEntityClass typeName="Test2dElement">
4447
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
4448
+ <ECProperty propertyName="StrProp" typeName="string"/>
4449
+ <ECProperty propertyName="IntProp" typeName="int"/>
4450
+ <ECProperty propertyName="LongProp" typeName="long"/>
4451
+ <ECProperty propertyName="DblProp" typeName="double"/>
4452
+ <ECProperty propertyName="BoolProp" typeName="boolean"/>
4453
+ <ECProperty propertyName="DtProp" typeName="dateTime"/>
4454
+ <ECProperty propertyName="BinProp" typeName="binary"/>
4455
+ <ECProperty propertyName="Pt2dProp" typeName="point2d"/>
4456
+ <ECProperty propertyName="Pt3dProp" typeName="point3d"/>
4457
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
4458
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
4459
+ <ECArrayProperty propertyName="StrArrProp" typeName="string" minOccurs="0" maxOccurs="unbounded"/>
4460
+ <ECStructArrayProperty propertyName="StructArrProp" typeName="RichPoint" minOccurs="0" maxOccurs="unbounded"/>
4461
+ <ECNavigationProperty propertyName="RelatedElem" relationshipName="Test2dUsesElement" direction="forward"/>
4462
+ </ECEntityClass>
4408
4463
  </ECSchema>`;
4409
4464
  /** Boots HubMock, opens a briefcase, starts a txn, and tears everything down after `fn` resolves or throws. */
4410
4465
  async function withSpillTestIModel(hubName, iModelName, fn) {
@@ -4471,19 +4526,19 @@ describe("ChangesetReader — spillThresholdInBytes (spill-to-disk)", () => {
4471
4526
  }
4472
4527
  /** Reads all instances from a reader using an in-memory unifier cache. */
4473
4528
  function drainReader(reader) {
4474
- const env_30 = { stack: [], error: void 0, hasError: false };
4529
+ const env_31 = { stack: [], error: void 0, hasError: false };
4475
4530
  try {
4476
- const pcu = __addDisposableResource(env_30, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4531
+ const pcu = __addDisposableResource(env_31, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4477
4532
  while (reader.step())
4478
4533
  pcu.appendFrom(reader);
4479
4534
  return Array.from(pcu.instances);
4480
4535
  }
4481
- catch (e_30) {
4482
- env_30.error = e_30;
4483
- env_30.hasError = true;
4536
+ catch (e_31) {
4537
+ env_31.error = e_31;
4538
+ env_31.hasError = true;
4484
4539
  }
4485
4540
  finally {
4486
- __disposeResources(env_30);
4541
+ __disposeResources(env_31);
4487
4542
  }
4488
4543
  }
4489
4544
  /** Sorts instances by a stable key for deterministic deep-equality comparisons. */
@@ -4664,25 +4719,25 @@ describe("ChangesetReader — spillThresholdInBytes (spill-to-disk)", () => {
4664
4719
  });
4665
4720
  });
4666
4721
  describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4667
- const STRICT_MODE_SCHEMA_V1 = `<?xml version="1.0" encoding="UTF-8"?>
4668
- <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4669
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4670
- <ECEntityClass typeName="SimpleElement">
4671
- <BaseClass>bis:GraphicalElement2d</BaseClass>
4672
- <ECProperty propertyName="p1" typeName="string"/>
4673
- <ECProperty propertyName="p2" typeName="string"/>
4674
- </ECEntityClass>
4722
+ const STRICT_MODE_SCHEMA_V1 = `<?xml version="1.0" encoding="UTF-8"?>
4723
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4724
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4725
+ <ECEntityClass typeName="SimpleElement">
4726
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
4727
+ <ECProperty propertyName="p1" typeName="string"/>
4728
+ <ECProperty propertyName="p2" typeName="string"/>
4729
+ </ECEntityClass>
4675
4730
  </ECSchema>`;
4676
- const STRICT_MODE_SCHEMA_V2 = `<?xml version="1.0" encoding="UTF-8"?>
4677
- <ECSchema schemaName="TestDomain" alias="ts" version="01.01" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4678
- <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4679
- <ECEntityClass typeName="SimpleElement">
4680
- <BaseClass>bis:GraphicalElement2d</BaseClass>
4681
- <ECProperty propertyName="p1" typeName="string"/>
4682
- <ECProperty propertyName="p2" typeName="string"/>
4683
- <ECProperty propertyName="p3" typeName="string"/>
4684
- <ECProperty propertyName="p4" typeName="string"/>
4685
- </ECEntityClass>
4731
+ const STRICT_MODE_SCHEMA_V2 = `<?xml version="1.0" encoding="UTF-8"?>
4732
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.01" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
4733
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
4734
+ <ECEntityClass typeName="SimpleElement">
4735
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
4736
+ <ECProperty propertyName="p1" typeName="string"/>
4737
+ <ECProperty propertyName="p2" typeName="string"/>
4738
+ <ECProperty propertyName="p3" typeName="string"/>
4739
+ <ECProperty propertyName="p4" typeName="string"/>
4740
+ </ECEntityClass>
4686
4741
  </ECSchema>`;
4687
4742
  it("openTxn: strict mode ON throws when txn was captured with fewer columns than the current live table, strict mode OFF does not throw", async () => {
4688
4743
  HubMock.startup("StrictModeOldTxnStrict", KnownTestLocations.outputDir);
@@ -4711,26 +4766,26 @@ describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4711
4766
  await importSchemaStrings(txn, [STRICT_MODE_SCHEMA_V2]);
4712
4767
  // Strict mode ON: binary has one column less than the live table.
4713
4768
  {
4714
- const env_31 = { stack: [], error: void 0, hasError: false };
4769
+ const env_32 = { stack: [], error: void 0, hasError: false };
4715
4770
  try {
4716
- const reader = __addDisposableResource(env_31, ChangesetReader.openTxn({ db, txnId }), false);
4771
+ const reader = __addDisposableResource(env_32, ChangesetReader.openTxn({ db, txnId }), false);
4717
4772
  reader.enableStrictMode();
4718
4773
  expect(() => { while (reader.step()) { /* drain */ } }).to.throw();
4719
4774
  }
4720
- catch (e_31) {
4721
- env_31.error = e_31;
4722
- env_31.hasError = true;
4775
+ catch (e_32) {
4776
+ env_32.error = e_32;
4777
+ env_32.hasError = true;
4723
4778
  }
4724
4779
  finally {
4725
- __disposeResources(env_31);
4780
+ __disposeResources(env_32);
4726
4781
  }
4727
4782
  }
4728
4783
  {
4729
- const env_32 = { stack: [], error: void 0, hasError: false };
4784
+ const env_33 = { stack: [], error: void 0, hasError: false };
4730
4785
  try {
4731
- const reader = __addDisposableResource(env_32, ChangesetReader.openTxn({ db, txnId }), false);
4786
+ const reader = __addDisposableResource(env_33, ChangesetReader.openTxn({ db, txnId }), false);
4732
4787
  reader.disableStrictMode(); // no-op when already off — verifies the API does not throw
4733
- const pcu = __addDisposableResource(env_32, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4788
+ const pcu = __addDisposableResource(env_33, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4734
4789
  while (reader.step())
4735
4790
  pcu.appendFrom(reader);
4736
4791
  const instances = Array.from(pcu.instances);
@@ -4816,12 +4871,12 @@ describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4816
4871
  ].sort());
4817
4872
  assert.equal(elemNew.$meta.isIndirectChange, false);
4818
4873
  }
4819
- catch (e_32) {
4820
- env_32.error = e_32;
4821
- env_32.hasError = true;
4874
+ catch (e_33) {
4875
+ env_33.error = e_33;
4876
+ env_33.hasError = true;
4822
4877
  }
4823
4878
  finally {
4824
- __disposeResources(env_32);
4879
+ __disposeResources(env_33);
4825
4880
  }
4826
4881
  }
4827
4882
  }
@@ -4877,26 +4932,26 @@ describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4877
4932
  const newCs = changesets[changesets.length - 1];
4878
4933
  // Strict mode ON: binary has more cols, throws.
4879
4934
  {
4880
- const env_33 = { stack: [], error: void 0, hasError: false };
4935
+ const env_34 = { stack: [], error: void 0, hasError: false };
4881
4936
  try {
4882
- const reader = __addDisposableResource(env_33, ChangesetReader.openFile({ db: b1, fileName: newCs.pathname }), false);
4937
+ const reader = __addDisposableResource(env_34, ChangesetReader.openFile({ db: b1, fileName: newCs.pathname }), false);
4883
4938
  reader.enableStrictMode();
4884
4939
  expect(() => { while (reader.step()) { /* drain */ } }).to.throw();
4885
4940
  }
4886
- catch (e_33) {
4887
- env_33.error = e_33;
4888
- env_33.hasError = true;
4941
+ catch (e_34) {
4942
+ env_34.error = e_34;
4943
+ env_34.hasError = true;
4889
4944
  }
4890
4945
  finally {
4891
- __disposeResources(env_33);
4946
+ __disposeResources(env_34);
4892
4947
  }
4893
4948
  }
4894
4949
  // Strict mode OFF: binary has more cols, does not throw.
4895
4950
  {
4896
- const env_34 = { stack: [], error: void 0, hasError: false };
4951
+ const env_35 = { stack: [], error: void 0, hasError: false };
4897
4952
  try {
4898
- const reader = __addDisposableResource(env_34, ChangesetReader.openFile({ db: b1, fileName: newCs.pathname }), false);
4899
- const pcu = __addDisposableResource(env_34, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4953
+ const reader = __addDisposableResource(env_35, ChangesetReader.openFile({ db: b1, fileName: newCs.pathname }), false);
4954
+ const pcu = __addDisposableResource(env_35, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
4900
4955
  while (reader.step())
4901
4956
  pcu.appendFrom(reader);
4902
4957
  const instances = Array.from(pcu.instances);
@@ -4982,12 +5037,12 @@ describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4982
5037
  ].sort());
4983
5038
  assert.equal(elemNew.$meta.isIndirectChange, false);
4984
5039
  }
4985
- catch (e_34) {
4986
- env_34.error = e_34;
4987
- env_34.hasError = true;
5040
+ catch (e_35) {
5041
+ env_35.error = e_35;
5042
+ env_35.hasError = true;
4988
5043
  }
4989
5044
  finally {
4990
- __disposeResources(env_34);
5045
+ __disposeResources(env_35);
4991
5046
  }
4992
5047
  }
4993
5048
  }
@@ -4998,4 +5053,564 @@ describe("ChangesetReader: strict mode (column-count mismatch)", () => {
4998
5053
  }
4999
5054
  });
5000
5055
  });
5056
+ describe("ChangesetReader: throwIfAlreadyStepped guard", () => {
5057
+ let iModel;
5058
+ let txn;
5059
+ let txnId;
5060
+ before(async () => {
5061
+ HubMock.startup("ChangesetReaderThrowGuard", KnownTestLocations.outputDir);
5062
+ const adminToken = "super manager token";
5063
+ const iTwinId = HubMock.iTwinId;
5064
+ const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: "throwGuard", accessToken: adminToken });
5065
+ iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId, accessToken: adminToken });
5066
+ txn = startTestTxn(iModel, "throwGuard setup");
5067
+ iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
5068
+ await iModel.locks.acquireLocks({ shared: IModel.dictionaryId });
5069
+ IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, Code.createEmpty(), true);
5070
+ txn.saveChanges("setup");
5071
+ txnId = iModel.txns.getLastSavedTxnProps().id;
5072
+ });
5073
+ after(() => {
5074
+ txn.end();
5075
+ iModel?.close();
5076
+ HubMock.shutdown();
5077
+ });
5078
+ it("setTableNameFilters throws after step()", () => {
5079
+ const env_36 = { stack: [], error: void 0, hasError: false };
5080
+ try {
5081
+ const reader = __addDisposableResource(env_36, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5082
+ assert.isTrue(reader.step());
5083
+ expect(() => reader.setTableNameFilters(new Set(["bis_Element"]))).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5084
+ }
5085
+ catch (e_36) {
5086
+ env_36.error = e_36;
5087
+ env_36.hasError = true;
5088
+ }
5089
+ finally {
5090
+ __disposeResources(env_36);
5091
+ }
5092
+ });
5093
+ it("setOpCodeFilters throws after step()", () => {
5094
+ const env_37 = { stack: [], error: void 0, hasError: false };
5095
+ try {
5096
+ const reader = __addDisposableResource(env_37, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5097
+ assert.isTrue(reader.step());
5098
+ expect(() => reader.setOpCodeFilters(new Set(["Inserted"]))).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5099
+ }
5100
+ catch (e_37) {
5101
+ env_37.error = e_37;
5102
+ env_37.hasError = true;
5103
+ }
5104
+ finally {
5105
+ __disposeResources(env_37);
5106
+ }
5107
+ });
5108
+ it("setClassNameFilters throws after step()", () => {
5109
+ const env_38 = { stack: [], error: void 0, hasError: false };
5110
+ try {
5111
+ const reader = __addDisposableResource(env_38, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5112
+ assert.isTrue(reader.step());
5113
+ expect(() => reader.setClassNameFilters(new Set(["BisCore:Element"]))).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5114
+ }
5115
+ catch (e_38) {
5116
+ env_38.error = e_38;
5117
+ env_38.hasError = true;
5118
+ }
5119
+ finally {
5120
+ __disposeResources(env_38);
5121
+ }
5122
+ });
5123
+ it("clearTableNameFilters throws after step()", () => {
5124
+ const env_39 = { stack: [], error: void 0, hasError: false };
5125
+ try {
5126
+ const reader = __addDisposableResource(env_39, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5127
+ assert.isTrue(reader.step());
5128
+ expect(() => reader.clearTableNameFilters()).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5129
+ }
5130
+ catch (e_39) {
5131
+ env_39.error = e_39;
5132
+ env_39.hasError = true;
5133
+ }
5134
+ finally {
5135
+ __disposeResources(env_39);
5136
+ }
5137
+ });
5138
+ it("clearOpCodeFilters throws after step()", () => {
5139
+ const env_40 = { stack: [], error: void 0, hasError: false };
5140
+ try {
5141
+ const reader = __addDisposableResource(env_40, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5142
+ assert.isTrue(reader.step());
5143
+ expect(() => reader.clearOpCodeFilters()).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5144
+ }
5145
+ catch (e_40) {
5146
+ env_40.error = e_40;
5147
+ env_40.hasError = true;
5148
+ }
5149
+ finally {
5150
+ __disposeResources(env_40);
5151
+ }
5152
+ });
5153
+ it("clearClassNameFilters throws after step()", () => {
5154
+ const env_41 = { stack: [], error: void 0, hasError: false };
5155
+ try {
5156
+ const reader = __addDisposableResource(env_41, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5157
+ assert.isTrue(reader.step());
5158
+ expect(() => reader.clearClassNameFilters()).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5159
+ }
5160
+ catch (e_41) {
5161
+ env_41.error = e_41;
5162
+ env_41.hasError = true;
5163
+ }
5164
+ finally {
5165
+ __disposeResources(env_41);
5166
+ }
5167
+ });
5168
+ it("enableStrictMode throws after step()", () => {
5169
+ const env_42 = { stack: [], error: void 0, hasError: false };
5170
+ try {
5171
+ const reader = __addDisposableResource(env_42, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5172
+ assert.isTrue(reader.step());
5173
+ expect(() => reader.enableStrictMode()).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5174
+ }
5175
+ catch (e_42) {
5176
+ env_42.error = e_42;
5177
+ env_42.hasError = true;
5178
+ }
5179
+ finally {
5180
+ __disposeResources(env_42);
5181
+ }
5182
+ });
5183
+ it("disableStrictMode throws after step()", () => {
5184
+ const env_43 = { stack: [], error: void 0, hasError: false };
5185
+ try {
5186
+ const reader = __addDisposableResource(env_43, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5187
+ assert.isTrue(reader.step());
5188
+ expect(() => reader.disableStrictMode()).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5189
+ }
5190
+ catch (e_43) {
5191
+ env_43.error = e_43;
5192
+ env_43.hasError = true;
5193
+ }
5194
+ finally {
5195
+ __disposeResources(env_43);
5196
+ }
5197
+ });
5198
+ it("setBatchSize throws after step()", () => {
5199
+ const env_44 = { stack: [], error: void 0, hasError: false };
5200
+ try {
5201
+ const reader = __addDisposableResource(env_44, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5202
+ assert.isTrue(reader.step());
5203
+ expect(() => reader.setBatchSize(10)).to.throw("filters and strict mode and batch size must be configured before the first call to step()");
5204
+ }
5205
+ catch (e_44) {
5206
+ env_44.error = e_44;
5207
+ env_44.hasError = true;
5208
+ }
5209
+ finally {
5210
+ __disposeResources(env_44);
5211
+ }
5212
+ });
5213
+ it("setBatchSize throws with zero or negative value", () => {
5214
+ const env_45 = { stack: [], error: void 0, hasError: false };
5215
+ try {
5216
+ const reader = __addDisposableResource(env_45, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5217
+ expect(() => reader.setBatchSize(0)).to.throw("batchSize must be a positive integer");
5218
+ expect(() => reader.setBatchSize(-1)).to.throw("batchSize must be a positive integer");
5219
+ }
5220
+ catch (e_45) {
5221
+ env_45.error = e_45;
5222
+ env_45.hasError = true;
5223
+ }
5224
+ finally {
5225
+ __disposeResources(env_45);
5226
+ }
5227
+ });
5228
+ it("filters can be set before any step()", () => {
5229
+ const env_46 = { stack: [], error: void 0, hasError: false };
5230
+ try {
5231
+ const reader = __addDisposableResource(env_46, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5232
+ // None of these should throw before step() is called
5233
+ expect(() => reader.setTableNameFilters(new Set(["bis_Element"]))).to.not.throw();
5234
+ expect(() => reader.setOpCodeFilters(new Set(["Inserted"]))).to.not.throw();
5235
+ expect(() => reader.setClassNameFilters(new Set(["BisCore:Element"]))).to.not.throw();
5236
+ expect(() => reader.clearTableNameFilters()).to.not.throw();
5237
+ expect(() => reader.clearOpCodeFilters()).to.not.throw();
5238
+ expect(() => reader.clearClassNameFilters()).to.not.throw();
5239
+ expect(() => reader.enableStrictMode()).to.not.throw();
5240
+ expect(() => reader.disableStrictMode()).to.not.throw();
5241
+ expect(() => reader.setBatchSize(5)).to.not.throw();
5242
+ }
5243
+ catch (e_46) {
5244
+ env_46.error = e_46;
5245
+ env_46.hasError = true;
5246
+ }
5247
+ finally {
5248
+ __disposeResources(env_46);
5249
+ }
5250
+ });
5251
+ });
5252
+ describe("ChangesetReader: batched stepping behavior", () => {
5253
+ let iModel;
5254
+ let txn;
5255
+ let txnId;
5256
+ before(async () => {
5257
+ HubMock.startup("ChangesetReaderBatchStep", KnownTestLocations.outputDir);
5258
+ const adminToken = "super manager token";
5259
+ const iTwinId = HubMock.iTwinId;
5260
+ const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: "batchStep", accessToken: adminToken });
5261
+ iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId, accessToken: adminToken });
5262
+ txn = startTestTxn(iModel, "batchStep setup");
5263
+ iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
5264
+ await iModel.locks.acquireLocks({ shared: IModel.dictionaryId });
5265
+ IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, Code.createEmpty(), true);
5266
+ txn.saveChanges("setup");
5267
+ txnId = iModel.txns.getLastSavedTxnProps().id;
5268
+ });
5269
+ after(() => {
5270
+ txn.end();
5271
+ iModel?.close();
5272
+ HubMock.shutdown();
5273
+ });
5274
+ it("step() returns false when no rows remain", () => {
5275
+ const env_47 = { stack: [], error: void 0, hasError: false };
5276
+ try {
5277
+ const reader = __addDisposableResource(env_47, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5278
+ // Drain all rows
5279
+ while (reader.step()) { /* consume */ }
5280
+ // The next call must also return false
5281
+ assert.isFalse(reader.step());
5282
+ }
5283
+ catch (e_47) {
5284
+ env_47.error = e_47;
5285
+ env_47.hasError = true;
5286
+ }
5287
+ finally {
5288
+ __disposeResources(env_47);
5289
+ }
5290
+ });
5291
+ it("step() returns false repeatedly after exhaustion", () => {
5292
+ const env_48 = { stack: [], error: void 0, hasError: false };
5293
+ try {
5294
+ const reader = __addDisposableResource(env_48, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5295
+ while (reader.step()) { /* consume */ }
5296
+ assert.isFalse(reader.step());
5297
+ assert.isFalse(reader.step());
5298
+ assert.isFalse(reader.step());
5299
+ }
5300
+ catch (e_48) {
5301
+ env_48.error = e_48;
5302
+ env_48.hasError = true;
5303
+ }
5304
+ finally {
5305
+ __disposeResources(env_48);
5306
+ }
5307
+ });
5308
+ it("inserted/deleted are undefined after exhaustion", () => {
5309
+ const env_49 = { stack: [], error: void 0, hasError: false };
5310
+ try {
5311
+ const reader = __addDisposableResource(env_49, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5312
+ while (reader.step()) { /* consume */ }
5313
+ assert.isUndefined(reader.inserted);
5314
+ assert.isUndefined(reader.deleted);
5315
+ }
5316
+ catch (e_49) {
5317
+ env_49.error = e_49;
5318
+ env_49.hasError = true;
5319
+ }
5320
+ finally {
5321
+ __disposeResources(env_49);
5322
+ }
5323
+ });
5324
+ it("op throws after exhaustion", () => {
5325
+ const env_50 = { stack: [], error: void 0, hasError: false };
5326
+ try {
5327
+ const reader = __addDisposableResource(env_50, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5328
+ while (reader.step()) { /* consume */ }
5329
+ expect(() => reader.op).to.throw("no current row");
5330
+ }
5331
+ catch (e_50) {
5332
+ env_50.error = e_50;
5333
+ env_50.hasError = true;
5334
+ }
5335
+ finally {
5336
+ __disposeResources(env_50);
5337
+ }
5338
+ });
5339
+ it("setBatchSize(1) produces same instances as default batch size", () => {
5340
+ const defaultInstances = [];
5341
+ {
5342
+ const env_51 = { stack: [], error: void 0, hasError: false };
5343
+ try {
5344
+ const reader = __addDisposableResource(env_51, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5345
+ const pcu = __addDisposableResource(env_51, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
5346
+ while (reader.step())
5347
+ pcu.appendFrom(reader);
5348
+ for (const inst of pcu.instances)
5349
+ defaultInstances.push(inst.ECInstanceId);
5350
+ }
5351
+ catch (e_51) {
5352
+ env_51.error = e_51;
5353
+ env_51.hasError = true;
5354
+ }
5355
+ finally {
5356
+ __disposeResources(env_51);
5357
+ }
5358
+ }
5359
+ defaultInstances.sort();
5360
+ const batchOneInstances = [];
5361
+ {
5362
+ const env_52 = { stack: [], error: void 0, hasError: false };
5363
+ try {
5364
+ const reader = __addDisposableResource(env_52, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5365
+ reader.setBatchSize(1);
5366
+ const pcu = __addDisposableResource(env_52, new PartialChangeUnifier(ChangeUnifierCache.createInMemoryCache()), false);
5367
+ while (reader.step())
5368
+ pcu.appendFrom(reader);
5369
+ for (const inst of pcu.instances)
5370
+ batchOneInstances.push(inst.ECInstanceId);
5371
+ }
5372
+ catch (e_52) {
5373
+ env_52.error = e_52;
5374
+ env_52.hasError = true;
5375
+ }
5376
+ finally {
5377
+ __disposeResources(env_52);
5378
+ }
5379
+ }
5380
+ batchOneInstances.sort();
5381
+ assert.deepEqual(batchOneInstances, defaultInstances);
5382
+ });
5383
+ });
5384
+ describe("ChangesetReader: lazy inserted/deleted getters", () => {
5385
+ let iModel;
5386
+ let txn;
5387
+ let txnId;
5388
+ before(async () => {
5389
+ HubMock.startup("ChangesetReaderLazyGetters", KnownTestLocations.outputDir);
5390
+ const adminToken = "super manager token";
5391
+ const iTwinId = HubMock.iTwinId;
5392
+ const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: "lazyGetters", accessToken: adminToken });
5393
+ iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId, accessToken: adminToken });
5394
+ txn = startTestTxn(iModel, "lazyGetters setup");
5395
+ iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
5396
+ await iModel.locks.acquireLocks({ shared: IModel.dictionaryId });
5397
+ IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, Code.createEmpty(), true);
5398
+ txn.saveChanges("setup");
5399
+ txnId = iModel.txns.getLastSavedTxnProps().id;
5400
+ });
5401
+ after(() => {
5402
+ txn.end();
5403
+ iModel?.close();
5404
+ HubMock.shutdown();
5405
+ });
5406
+ it("inserted is undefined before step()", () => {
5407
+ const env_53 = { stack: [], error: void 0, hasError: false };
5408
+ try {
5409
+ const reader = __addDisposableResource(env_53, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5410
+ assert.isUndefined(reader.inserted);
5411
+ }
5412
+ catch (e_53) {
5413
+ env_53.error = e_53;
5414
+ env_53.hasError = true;
5415
+ }
5416
+ finally {
5417
+ __disposeResources(env_53);
5418
+ }
5419
+ });
5420
+ it("deleted is undefined before step()", () => {
5421
+ const env_54 = { stack: [], error: void 0, hasError: false };
5422
+ try {
5423
+ const reader = __addDisposableResource(env_54, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5424
+ assert.isUndefined(reader.deleted);
5425
+ }
5426
+ catch (e_54) {
5427
+ env_54.error = e_54;
5428
+ env_54.hasError = true;
5429
+ }
5430
+ finally {
5431
+ __disposeResources(env_54);
5432
+ }
5433
+ });
5434
+ it("inserted returns a fresh object on first access, cached object on subsequent access", () => {
5435
+ const env_55 = { stack: [], error: void 0, hasError: false };
5436
+ try {
5437
+ const reader = __addDisposableResource(env_55, ChangesetReader.openTxn({ db: iModel, txnId }), false);
5438
+ // Find an Inserted row
5439
+ let found = false;
5440
+ while (reader.step()) {
5441
+ if (reader.inserted) {
5442
+ const first = reader.inserted;
5443
+ const second = reader.inserted;
5444
+ assert.strictEqual(first, second);
5445
+ assert.deepEqual(first, second);
5446
+ found = true;
5447
+ break;
5448
+ }
5449
+ }
5450
+ assert.isTrue(found, "Expected at least one row with an inserted value");
5451
+ }
5452
+ catch (e_55) {
5453
+ env_55.error = e_55;
5454
+ env_55.hasError = true;
5455
+ }
5456
+ finally {
5457
+ __disposeResources(env_55);
5458
+ }
5459
+ });
5460
+ });
5461
+ describe("ChangesetReader insert-many (53 elements)", () => {
5462
+ let rwIModel;
5463
+ const elementIds = [];
5464
+ let drawingModelId;
5465
+ let drawingCategoryId;
5466
+ let txnId;
5467
+ let txn;
5468
+ const ELEMENT_COUNT = 53;
5469
+ before(async () => {
5470
+ HubMock.startup("ECChangesetInsertMany", KnownTestLocations.outputDir);
5471
+ const adminToken = "super manager token";
5472
+ const iTwinId = HubMock.iTwinId;
5473
+ const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName: "insertMany", description: "insertMany", accessToken: adminToken });
5474
+ rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
5475
+ txn = startTestTxn(rwIModel, "ChangesetReader insert-many setup");
5476
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
5477
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
5478
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
5479
+ <ECStructClass typeName="RichPoint" modifier="Sealed">
5480
+ <ECProperty propertyName="X" typeName="double"/>
5481
+ <ECProperty propertyName="Y" typeName="double"/>
5482
+ <ECProperty propertyName="Z" typeName="double"/>
5483
+ <ECProperty propertyName="Label" typeName="string"/>
5484
+ </ECStructClass>
5485
+ <ECEntityClass typeName="Test2dElement">
5486
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
5487
+ <ECProperty propertyName="StrProp" typeName="string"/>
5488
+ <ECProperty propertyName="IntProp" typeName="int"/>
5489
+ <ECProperty propertyName="DblProp" typeName="double"/>
5490
+ <ECStructProperty propertyName="StructProp" typeName="RichPoint"/>
5491
+ <ECArrayProperty propertyName="IntArrProp" typeName="int" minOccurs="0" maxOccurs="unbounded"/>
5492
+ </ECEntityClass>
5493
+ </ECSchema>`;
5494
+ await importSchemaStrings(txn, [schema]);
5495
+ rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
5496
+ await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });
5497
+ const codeProps = Code.createEmpty();
5498
+ codeProps.value = "DrillDownDrawing";
5499
+ [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, codeProps, true);
5500
+ const foundCat = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, "DrillDownCategory");
5501
+ drawingCategoryId = foundCat ?? DrawingCategory.insert(txn, IModel.dictionaryId, "DrillDownCategory", new SubCategoryAppearance({ color: ColorDef.fromString("rgb(255,0,0)").toJSON() }));
5502
+ txn.saveChanges("setup");
5503
+ // Wait so that LastMod on bis_Model gets a distinct timestamp before the insert txn
5504
+ await new Promise((resolve) => setTimeout(resolve, 300));
5505
+ // Txn 2: insert 53 elements
5506
+ await rwIModel.locks.acquireLocks({ shared: drawingModelId });
5507
+ for (let i = 0; i < ELEMENT_COUNT; i++) {
5508
+ const id = txn.insertElement({
5509
+ classFullName: "TestDomain:Test2dElement",
5510
+ model: drawingModelId,
5511
+ category: drawingCategoryId,
5512
+ code: Code.createEmpty(),
5513
+ StrProp: `element_${i}`,
5514
+ IntProp: i,
5515
+ DblProp: i * 1.5,
5516
+ StructProp: { X: i, Y: i + 1, Z: i + 2, Label: `pt_${i}` },
5517
+ IntArrProp: [i, i * 10, i * 100],
5518
+ });
5519
+ elementIds.push(id);
5520
+ }
5521
+ txn.saveChanges("insert 53 elements");
5522
+ txnId = rwIModel.txns.getLastSavedTxnProps().id;
5523
+ });
5524
+ after(() => {
5525
+ txn.end();
5526
+ rwIModel?.close();
5527
+ HubMock.shutdown();
5528
+ });
5529
+ it("All_Properties: returns all 53 inserted elements", () => {
5530
+ const instances = readTxn(rwIModel, txnId);
5531
+ // 53 inserted elements (New) + 1 model update (New + Old) = 55
5532
+ const elemInstances = instances.filter((i) => i.$meta.op === "Inserted" && i.$meta.stage === "New");
5533
+ assert.equal(elemInstances.length, ELEMENT_COUNT);
5534
+ // Verify the model indirect change is present
5535
+ const modelNew = instances.find((i) => i.ECInstanceId === drawingModelId && i.$meta.stage === "New");
5536
+ const modelOld = instances.find((i) => i.ECInstanceId === drawingModelId && i.$meta.stage === "Old");
5537
+ expect(modelNew).to.exist;
5538
+ expect(modelOld).to.exist;
5539
+ assert.equal(modelNew.$meta.op, "Updated");
5540
+ assert.equal(modelOld.$meta.op, "Updated");
5541
+ assert.equal(modelNew.$meta.isIndirectChange, true);
5542
+ assert.equal(modelOld.$meta.isIndirectChange, true);
5543
+ // Total: 53 elements + 2 model entries
5544
+ assert.equal(instances.length, ELEMENT_COUNT + 2);
5545
+ // Verify each element is present and has the correct props
5546
+ for (let i = 0; i < ELEMENT_COUNT; i++) {
5547
+ const elem = elemInstances.find((inst) => inst.ECInstanceId === elementIds[i]);
5548
+ expect(elem, `element ${i} not found`).to.exist;
5549
+ assert.equal(elem.$meta.op, "Inserted");
5550
+ assert.equal(elem.$meta.stage, "New");
5551
+ assert.equal(elem.$meta.propFilter, PropertyFilter.All);
5552
+ assert.equal(elem.$meta.isIndirectChange, false);
5553
+ assert.equal(elem.StrProp, `element_${i}`);
5554
+ assert.equal(elem.IntProp, i);
5555
+ assert.closeTo(elem.DblProp, i * 1.5, 1e-10);
5556
+ assert.deepEqual(elem.StructProp, { X: i, Y: i + 1, Z: i + 2, Label: `pt_${i}` });
5557
+ assert.deepEqual(elem.IntArrProp, [i, i * 10, i * 100]);
5558
+ assert.equal(elem.Model.Id, drawingModelId);
5559
+ assert.equal(elem.Category.Id, drawingCategoryId);
5560
+ }
5561
+ });
5562
+ it("BisCoreElement: returns all 53 elements without custom props", () => {
5563
+ const instances = readTxn(rwIModel, txnId, PropertyFilter.BisCoreElement, { classIdsToClassNames: true });
5564
+ const elemInstances = instances.filter((i) => i.$meta.op === "Inserted" && i.$meta.stage === "New");
5565
+ assert.equal(elemInstances.length, ELEMENT_COUNT);
5566
+ assert.equal(instances.length, ELEMENT_COUNT + 2);
5567
+ for (let i = 0; i < ELEMENT_COUNT; i++) {
5568
+ const elem = elemInstances.find((inst) => inst.ECInstanceId === elementIds[i]);
5569
+ expect(elem, `element ${i} not found`).to.exist;
5570
+ assert.equal(elem.$meta.op, "Inserted");
5571
+ assert.equal(elem.$meta.stage, "New");
5572
+ assert.equal(elem.$meta.propFilter, PropertyFilter.BisCoreElement);
5573
+ assert.equal(elem.$meta.isIndirectChange, false);
5574
+ assert.equal(elem.ECClassId, "TestDomain.Test2dElement");
5575
+ assert.equal(elem.Model.Id, drawingModelId);
5576
+ // BisCoreElement filter: no custom domain props
5577
+ assert.isUndefined(elem.StrProp);
5578
+ assert.isUndefined(elem.IntProp);
5579
+ assert.isUndefined(elem.DblProp);
5580
+ assert.isUndefined(elem.StructProp);
5581
+ assert.isUndefined(elem.IntArrProp);
5582
+ // BIS core element props are present
5583
+ expect(elem.Model).to.exist;
5584
+ expect(elem.LastMod).to.exist;
5585
+ expect(elem.CodeSpec).to.exist;
5586
+ expect(elem.CodeScope).to.exist;
5587
+ expect(elem.FederationGuid).to.exist;
5588
+ }
5589
+ });
5590
+ it("InstanceKey: returns all 53 elements with only ECInstanceId and ECClassId", () => {
5591
+ const instances = readTxn(rwIModel, txnId, PropertyFilter.InstanceKey);
5592
+ const elemInstances = instances.filter((i) => i.$meta.op === "Inserted" && i.$meta.stage === "New");
5593
+ assert.equal(elemInstances.length, ELEMENT_COUNT);
5594
+ assert.equal(instances.length, ELEMENT_COUNT + 2);
5595
+ for (let i = 0; i < ELEMENT_COUNT; i++) {
5596
+ const elem = elemInstances.find((inst) => inst.ECInstanceId === elementIds[i]);
5597
+ expect(elem, `element ${i} not found`).to.exist;
5598
+ assert.equal(elem.$meta.op, "Inserted");
5599
+ assert.equal(elem.$meta.stage, "New");
5600
+ assert.equal(elem.$meta.propFilter, PropertyFilter.InstanceKey);
5601
+ assert.equal(elem.$meta.isIndirectChange, false);
5602
+ assert.equal("TestDomain:Test2dElement", rwIModel.getClassNameFromId(elem.ECClassId));
5603
+ // InstanceKey: only ECInstanceId + ECClassId, no other props
5604
+ assert.isUndefined(elem.StrProp);
5605
+ assert.isUndefined(elem.IntProp);
5606
+ assert.isUndefined(elem.DblProp);
5607
+ assert.isUndefined(elem.StructProp);
5608
+ assert.isUndefined(elem.IntArrProp);
5609
+ assert.isUndefined(elem.Model);
5610
+ assert.isUndefined(elem.Category);
5611
+ assert.isUndefined(elem.LastMod);
5612
+ assert.deepEqual(Object.keys(elem).sort(), ["ECInstanceId", "ECClassId", "$meta"].sort());
5613
+ }
5614
+ });
5615
+ });
5001
5616
  //# sourceMappingURL=ChangesetReader.test.js.map