@itwin/core-backend 5.12.0-dev.9 → 5.13.0-dev.2

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 (513) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/CatalogDb.js.map +1 -1
  8. package/lib/cjs/Category.js.map +1 -1
  9. package/lib/cjs/ChangeSummaryManager.js +2 -2
  10. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  11. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  12. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  13. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  14. package/lib/cjs/ChangesetReader.js +3 -3
  15. package/lib/cjs/ChangesetReader.js.map +1 -1
  16. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  17. package/lib/cjs/ChannelControl.js.map +1 -1
  18. package/lib/cjs/CheckpointManager.js.map +1 -1
  19. package/lib/cjs/ClassRegistry.d.ts.map +1 -1
  20. package/lib/cjs/ClassRegistry.js +6 -7
  21. package/lib/cjs/ClassRegistry.js.map +1 -1
  22. package/lib/cjs/CloudSqlite.js.map +1 -1
  23. package/lib/cjs/CodeService.js.map +1 -1
  24. package/lib/cjs/CodeSpecs.js.map +1 -1
  25. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  26. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  27. package/lib/cjs/DevTools.js.map +1 -1
  28. package/lib/cjs/DisplayStyle.js.map +1 -1
  29. package/lib/cjs/ECDb.d.ts.map +1 -1
  30. package/lib/cjs/ECDb.js +8 -3
  31. package/lib/cjs/ECDb.js.map +1 -1
  32. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  33. package/lib/cjs/ECSqlRowExecutor.d.ts +23 -10
  34. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  35. package/lib/cjs/ECSqlRowExecutor.js +77 -15
  36. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  37. package/lib/cjs/ECSqlStatement.js.map +1 -1
  38. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  39. package/lib/cjs/EditTxn.js.map +1 -1
  40. package/lib/cjs/Element.js.map +1 -1
  41. package/lib/cjs/ElementAspect.js.map +1 -1
  42. package/lib/cjs/ElementGraphics.js.map +1 -1
  43. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  44. package/lib/cjs/Entity.js.map +1 -1
  45. package/lib/cjs/EntityReferences.js.map +1 -1
  46. package/lib/cjs/ExportGraphics.js.map +1 -1
  47. package/lib/cjs/ExternalSource.js.map +1 -1
  48. package/lib/cjs/FontFile.js.map +1 -1
  49. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  50. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  51. package/lib/cjs/GeometrySummary.js +47 -47
  52. package/lib/cjs/GeometrySummary.js.map +1 -1
  53. package/lib/cjs/IModelDb.d.ts +20 -8
  54. package/lib/cjs/IModelDb.d.ts.map +1 -1
  55. package/lib/cjs/IModelDb.js +91 -62
  56. package/lib/cjs/IModelDb.js.map +1 -1
  57. package/lib/cjs/IModelDbFonts.js.map +1 -1
  58. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  59. package/lib/cjs/IModelHost.js.map +1 -1
  60. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  61. package/lib/cjs/IModelJsFs.js.map +1 -1
  62. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  63. package/lib/cjs/IpcHost.d.ts +26 -0
  64. package/lib/cjs/IpcHost.d.ts.map +1 -1
  65. package/lib/cjs/IpcHost.js +68 -61
  66. package/lib/cjs/IpcHost.js.map +1 -1
  67. package/lib/cjs/LineStyle.js.map +1 -1
  68. package/lib/cjs/LocalHub.js +1 -1
  69. package/lib/cjs/LocalHub.js.map +1 -1
  70. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  71. package/lib/cjs/LockControl.js.map +1 -1
  72. package/lib/cjs/Material.js.map +1 -1
  73. package/lib/cjs/Model.js.map +1 -1
  74. package/lib/cjs/NativeAppStorage.js.map +1 -1
  75. package/lib/cjs/NativeHost.js.map +1 -1
  76. package/lib/cjs/NavigationRelationship.js.map +1 -1
  77. package/lib/cjs/PartialChangeUnifier.js +7 -7
  78. package/lib/cjs/PartialChangeUnifier.js.map +1 -1
  79. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  80. package/lib/cjs/PropertyStore.js.map +1 -1
  81. package/lib/cjs/Relationship.d.ts.map +1 -1
  82. package/lib/cjs/Relationship.js +13 -7
  83. package/lib/cjs/Relationship.js.map +1 -1
  84. package/lib/cjs/RpcBackend.js.map +1 -1
  85. package/lib/cjs/SQLiteDb.d.ts +43 -0
  86. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  87. package/lib/cjs/SQLiteDb.js +51 -0
  88. package/lib/cjs/SQLiteDb.js.map +1 -1
  89. package/lib/cjs/Schema.js.map +1 -1
  90. package/lib/cjs/SchemaSync.js.map +1 -1
  91. package/lib/cjs/SchemaUtils.js.map +1 -1
  92. package/lib/cjs/SheetIndex.js.map +1 -1
  93. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  94. package/lib/cjs/SqliteStatement.js.map +1 -1
  95. package/lib/cjs/StashManager.js.map +1 -1
  96. package/lib/cjs/Texture.js.map +1 -1
  97. package/lib/cjs/TileStorage.js.map +1 -1
  98. package/lib/cjs/TxnManager.js.map +1 -1
  99. package/lib/cjs/ViewDefinition.js.map +1 -1
  100. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  101. package/lib/cjs/ViewStore.js +1 -1
  102. package/lib/cjs/ViewStore.js.map +1 -1
  103. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  104. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  105. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  106. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  107. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  108. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  109. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  110. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  111. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +36 -36
  112. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +28 -28
  113. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  114. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  115. package/lib/cjs/core-backend.js.map +1 -1
  116. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  117. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  118. package/lib/cjs/domains/GenericElements.js.map +1 -1
  119. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  120. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  121. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  122. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts +23 -0
  123. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  124. package/lib/cjs/internal/ECSqlInstanceReshaper.js +125 -0
  125. package/lib/cjs/internal/ECSqlInstanceReshaper.js.map +1 -0
  126. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  127. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  128. package/lib/cjs/internal/HubMock.js.map +1 -1
  129. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  130. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  131. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  132. package/lib/cjs/internal/NoLocks.js.map +1 -1
  133. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  134. package/lib/cjs/internal/ServerBasedLocks.js +33 -33
  135. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  136. package/lib/cjs/internal/Symbols.js.map +1 -1
  137. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  138. package/lib/cjs/internal/annotations/fields.js +9 -4
  139. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  140. package/lib/cjs/internal/cross-package.js.map +1 -1
  141. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  142. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  143. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  144. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  145. package/lib/cjs/internal/workspace/WorkspaceImpl.js +12 -1
  146. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  147. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  148. package/lib/cjs/rpc/multipart.js.map +1 -1
  149. package/lib/cjs/rpc/tracing.js.map +1 -1
  150. package/lib/cjs/rpc/web/logging.js.map +1 -1
  151. package/lib/cjs/rpc/web/request.js.map +1 -1
  152. package/lib/cjs/rpc/web/response.js.map +1 -1
  153. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  154. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  155. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  156. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  157. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  158. package/lib/cjs/workspace/Settings.js.map +1 -1
  159. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  160. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  161. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  162. package/lib/cjs/workspace/Workspace.d.ts +2 -0
  163. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  164. package/lib/cjs/workspace/Workspace.js.map +1 -1
  165. package/lib/cjs/workspace/WorkspaceEditor.d.ts +3 -0
  166. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  167. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  168. package/lib/esm/BackendHubAccess.js.map +1 -1
  169. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  170. package/lib/esm/BisCoreSchema.js.map +1 -1
  171. package/lib/esm/BlobContainerService.js.map +1 -1
  172. package/lib/esm/BriefcaseManager.js.map +1 -1
  173. package/lib/esm/CatalogDb.js.map +1 -1
  174. package/lib/esm/Category.js.map +1 -1
  175. package/lib/esm/ChangeSummaryManager.js +2 -2
  176. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  177. package/lib/esm/ChangedElementsDb.js.map +1 -1
  178. package/lib/esm/ChangesetECAdaptor.js +248 -248
  179. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  180. package/lib/esm/ChangesetReader.js +3 -3
  181. package/lib/esm/ChangesetReader.js.map +1 -1
  182. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  183. package/lib/esm/ChannelControl.js.map +1 -1
  184. package/lib/esm/CheckpointManager.js.map +1 -1
  185. package/lib/esm/ClassRegistry.d.ts.map +1 -1
  186. package/lib/esm/ClassRegistry.js +6 -7
  187. package/lib/esm/ClassRegistry.js.map +1 -1
  188. package/lib/esm/CloudSqlite.js.map +1 -1
  189. package/lib/esm/CodeService.js.map +1 -1
  190. package/lib/esm/CodeSpecs.js.map +1 -1
  191. package/lib/esm/ConcurrentQuery.js.map +1 -1
  192. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  193. package/lib/esm/DevTools.js.map +1 -1
  194. package/lib/esm/DisplayStyle.js.map +1 -1
  195. package/lib/esm/ECDb.d.ts.map +1 -1
  196. package/lib/esm/ECDb.js +9 -4
  197. package/lib/esm/ECDb.js.map +1 -1
  198. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  199. package/lib/esm/ECSqlRowExecutor.d.ts +23 -10
  200. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  201. package/lib/esm/ECSqlRowExecutor.js +77 -16
  202. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  203. package/lib/esm/ECSqlStatement.js.map +1 -1
  204. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  205. package/lib/esm/EditTxn.js.map +1 -1
  206. package/lib/esm/Element.js.map +1 -1
  207. package/lib/esm/ElementAspect.js.map +1 -1
  208. package/lib/esm/ElementGraphics.js.map +1 -1
  209. package/lib/esm/ElementTreeWalker.js.map +1 -1
  210. package/lib/esm/Entity.js.map +1 -1
  211. package/lib/esm/EntityReferences.js.map +1 -1
  212. package/lib/esm/ExportGraphics.js.map +1 -1
  213. package/lib/esm/ExternalSource.js.map +1 -1
  214. package/lib/esm/FontFile.js.map +1 -1
  215. package/lib/esm/GeoCoordConfig.js.map +1 -1
  216. package/lib/esm/GeographicCRSServices.js.map +1 -1
  217. package/lib/esm/GeometrySummary.js +47 -47
  218. package/lib/esm/GeometrySummary.js.map +1 -1
  219. package/lib/esm/IModelDb.d.ts +20 -8
  220. package/lib/esm/IModelDb.d.ts.map +1 -1
  221. package/lib/esm/IModelDb.js +93 -64
  222. package/lib/esm/IModelDb.js.map +1 -1
  223. package/lib/esm/IModelDbFonts.js.map +1 -1
  224. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  225. package/lib/esm/IModelHost.js.map +1 -1
  226. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  227. package/lib/esm/IModelJsFs.js.map +1 -1
  228. package/lib/esm/ImageSourceConversion.js.map +1 -1
  229. package/lib/esm/IpcHost.d.ts +26 -0
  230. package/lib/esm/IpcHost.d.ts.map +1 -1
  231. package/lib/esm/IpcHost.js +70 -63
  232. package/lib/esm/IpcHost.js.map +1 -1
  233. package/lib/esm/LineStyle.js.map +1 -1
  234. package/lib/esm/LocalHub.js +1 -1
  235. package/lib/esm/LocalHub.js.map +1 -1
  236. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  237. package/lib/esm/LockControl.js.map +1 -1
  238. package/lib/esm/Material.js.map +1 -1
  239. package/lib/esm/Model.js.map +1 -1
  240. package/lib/esm/NativeAppStorage.js.map +1 -1
  241. package/lib/esm/NativeHost.js.map +1 -1
  242. package/lib/esm/NavigationRelationship.js.map +1 -1
  243. package/lib/esm/PartialChangeUnifier.js +7 -7
  244. package/lib/esm/PartialChangeUnifier.js.map +1 -1
  245. package/lib/esm/PromiseMemoizer.js.map +1 -1
  246. package/lib/esm/PropertyStore.js.map +1 -1
  247. package/lib/esm/Relationship.d.ts.map +1 -1
  248. package/lib/esm/Relationship.js +13 -7
  249. package/lib/esm/Relationship.js.map +1 -1
  250. package/lib/esm/RpcBackend.js.map +1 -1
  251. package/lib/esm/SQLiteDb.d.ts +43 -0
  252. package/lib/esm/SQLiteDb.d.ts.map +1 -1
  253. package/lib/esm/SQLiteDb.js +51 -0
  254. package/lib/esm/SQLiteDb.js.map +1 -1
  255. package/lib/esm/Schema.js.map +1 -1
  256. package/lib/esm/SchemaSync.js.map +1 -1
  257. package/lib/esm/SchemaUtils.js.map +1 -1
  258. package/lib/esm/SheetIndex.js.map +1 -1
  259. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  260. package/lib/esm/SqliteStatement.js.map +1 -1
  261. package/lib/esm/StashManager.js.map +1 -1
  262. package/lib/esm/Texture.js.map +1 -1
  263. package/lib/esm/TileStorage.js.map +1 -1
  264. package/lib/esm/TxnManager.js.map +1 -1
  265. package/lib/esm/ViewDefinition.js.map +1 -1
  266. package/lib/esm/ViewStateHydrator.js.map +1 -1
  267. package/lib/esm/ViewStore.js +1 -1
  268. package/lib/esm/ViewStore.js.map +1 -1
  269. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  270. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  271. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  272. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  273. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  274. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  275. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  276. package/lib/esm/core-backend.js.map +1 -1
  277. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  278. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  279. package/lib/esm/domains/GenericElements.js.map +1 -1
  280. package/lib/esm/domains/GenericSchema.js.map +1 -1
  281. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  282. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  283. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts +23 -0
  284. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  285. package/lib/esm/internal/ECSqlInstanceReshaper.js +120 -0
  286. package/lib/esm/internal/ECSqlInstanceReshaper.js.map +1 -0
  287. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  288. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  289. package/lib/esm/internal/HubMock.js.map +1 -1
  290. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  291. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  292. package/lib/esm/internal/NativePlatform.js.map +1 -1
  293. package/lib/esm/internal/NoLocks.js.map +1 -1
  294. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  295. package/lib/esm/internal/ServerBasedLocks.js +33 -33
  296. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  297. package/lib/esm/internal/Symbols.js.map +1 -1
  298. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  299. package/lib/esm/internal/annotations/fields.js +9 -4
  300. package/lib/esm/internal/annotations/fields.js.map +1 -1
  301. package/lib/esm/internal/cross-package.js.map +1 -1
  302. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  303. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  304. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  305. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  306. package/lib/esm/internal/workspace/WorkspaceImpl.js +12 -1
  307. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  308. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  309. package/lib/esm/rpc/multipart.js.map +1 -1
  310. package/lib/esm/rpc/tracing.js.map +1 -1
  311. package/lib/esm/rpc/web/logging.js.map +1 -1
  312. package/lib/esm/rpc/web/request.js.map +1 -1
  313. package/lib/esm/rpc/web/response.js.map +1 -1
  314. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  315. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  316. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  317. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  318. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  319. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  320. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  321. package/lib/esm/test/AttachDb.test.js +11 -11
  322. package/lib/esm/test/AttachDb.test.js.map +1 -1
  323. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  324. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  325. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  326. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  327. package/lib/esm/test/IModelHost.test.js.map +1 -1
  328. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  329. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  330. package/lib/esm/test/IpcHost.test.js +232 -1
  331. package/lib/esm/test/IpcHost.test.js.map +1 -1
  332. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  333. package/lib/esm/test/PrintElementTree.js.map +1 -1
  334. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  335. package/lib/esm/test/RevisionUtility.js.map +1 -1
  336. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js +51 -51
  337. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js.map +1 -1
  338. package/lib/esm/test/SchemaUtils.test.js +25 -25
  339. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  340. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  341. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  342. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  343. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  344. package/lib/esm/test/TestEditTxn.js.map +1 -1
  345. package/lib/esm/test/TestUtils.js.map +1 -1
  346. package/lib/esm/test/annotations/Fields.test.js +53 -53
  347. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  348. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  349. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  350. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  351. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  352. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  353. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  354. package/lib/esm/test/categories/Category.test.js.map +1 -1
  355. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  356. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  357. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  358. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  359. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  360. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  361. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  362. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  363. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  364. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  365. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  366. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  367. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  368. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  369. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  370. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  371. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  372. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +139 -1
  373. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  374. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  375. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  376. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  377. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  378. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  379. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  380. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  381. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  382. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  383. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  384. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  385. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  386. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  387. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  388. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  389. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  390. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  391. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  392. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  393. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  394. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  395. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  396. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  397. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  398. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  399. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  400. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  401. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  402. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  403. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  404. package/lib/esm/test/hubaccess/SemanticRebase.test.js +345 -345
  405. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  406. package/lib/esm/test/imageData.js.map +1 -1
  407. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  408. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  409. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  410. package/lib/esm/test/imodel/IModel.test.js +64 -44
  411. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  412. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  413. package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
  414. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  415. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  416. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  417. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  418. package/lib/esm/test/index.js.map +1 -1
  419. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts +2 -0
  420. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts.map +1 -0
  421. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js +289 -0
  422. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js.map +1 -0
  423. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  424. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  425. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  426. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  427. package/lib/esm/test/rpc/response.test.js.map +1 -1
  428. package/lib/esm/test/schema/ClassRegistry.test.js +101 -101
  429. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  430. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  431. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  432. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  433. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  434. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  435. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  436. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.d.ts +2 -0
  437. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.d.ts.map +1 -0
  438. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.js +546 -0
  439. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.js.map +1 -0
  440. package/lib/esm/test/schema/SchemaViewHidden.test.js +109 -109
  441. package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -1
  442. package/lib/esm/test/schema/SchemaViewKoQ.test.js +13 -13
  443. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
  444. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +17 -17
  445. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -1
  446. package/lib/esm/test/schema/SchemaViewValidation.test.js +8 -8
  447. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
  448. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  449. package/lib/esm/test/standalone/ChangeElementParentModel.test.js.map +1 -1
  450. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  451. package/lib/esm/test/standalone/ChangesetReader.test.js +313 -313
  452. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  453. package/lib/esm/test/standalone/CloudSqlite.test.js.map +1 -1
  454. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  455. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  456. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  457. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  458. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  459. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  460. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  461. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  462. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  463. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  464. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  465. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  466. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  467. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  468. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  469. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
  470. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  471. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  472. package/lib/esm/test/standalone/MergeConflict.test.js +1 -1
  473. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  474. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  475. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  476. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  477. package/lib/esm/test/standalone/SQLiteDb.test.d.ts +1 -1
  478. package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
  479. package/lib/esm/test/standalone/SQLiteDb.test.js +93 -1
  480. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  481. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
  482. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  483. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  484. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  485. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  486. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  487. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  488. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  489. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  490. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  491. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  492. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  493. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  494. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  495. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  496. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  497. package/lib/esm/test/standalone/ViewStoreDb.test.js +30 -0
  498. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  499. package/lib/esm/test/standalone/Workspace.test.js +63 -1
  500. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  501. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  502. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  503. package/lib/esm/workspace/Settings.js.map +1 -1
  504. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  505. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  506. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  507. package/lib/esm/workspace/Workspace.d.ts +2 -0
  508. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  509. package/lib/esm/workspace/Workspace.js.map +1 -1
  510. package/lib/esm/workspace/WorkspaceEditor.d.ts +3 -0
  511. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  512. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  513. package/package.json +14 -15
@@ -0,0 +1,546 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { Guid, Logger, LogLevel, OpenMode } from "@itwin/core-bentley";
6
+ import { GenericSchema, IModelHost, IModelJsFs, StandaloneDb } from "../../core-backend";
7
+ import { SchemaView, schemaViewFormatVersion, SchemaViewPrimitiveType } from "@itwin/ecschema-metadata";
8
+ import { expect } from "chai";
9
+ import * as path from "path";
10
+ import * as sinon from "sinon";
11
+ import { KnownTestLocations } from "../KnownTestLocations";
12
+ import { TestUtils } from "../TestUtils";
13
+ /** Categories of native log messages worth treating as a test failure. Native code routes through
14
+ * `Logger`, so a C++ `warningv`/`errorv` surfaces here once the category level is raised. */
15
+ const monitoredNativeCategories = ["ECDb", "ECObjectsNative"];
16
+ /** Run `body` while capturing native warnings and errors from the monitored categories.
17
+ *
18
+ * The test harness initializes the logger with all categories off, so native warnings/errors are
19
+ * dropped before they ever reach JS. To observe them we must (1) raise each monitored category to
20
+ * Warning - which fires onLogLevelChanged, prompting the native side to re-read levels and start
21
+ * emitting (Warning and anything more severe, i.e. Error too) - and (2) install sinks to collect
22
+ * what arrives. Returns the captured logs so the caller can assert none were produced.
23
+ */
24
+ async function captureNativeLogs(body) {
25
+ const logs = [];
26
+ const previousLevels = new Map(monitoredNativeCategories.map((category) => [category, Logger.getLevel(category)]));
27
+ const warningStub = sinon.stub(Logger, "logWarning").callsFake((category, message) => {
28
+ if (monitoredNativeCategories.includes(category))
29
+ logs.push({ level: "Warning", category, message });
30
+ });
31
+ const errorStub = sinon.stub(Logger, "logError").callsFake((category, messageOrError) => {
32
+ if (monitoredNativeCategories.includes(category))
33
+ logs.push({ level: "Error", category, message: typeof messageOrError === "string" ? messageOrError : String(messageOrError) });
34
+ });
35
+ for (const category of monitoredNativeCategories)
36
+ Logger.setLevel(category, LogLevel.Warning);
37
+ try {
38
+ await body();
39
+ }
40
+ finally {
41
+ warningStub.restore();
42
+ errorStub.restore();
43
+ for (const [category, previousLevel] of previousLevels)
44
+ Logger.setLevel(category, previousLevel ?? LogLevel.None);
45
+ }
46
+ return logs;
47
+ }
48
+ /** SchemaB references BisCore and defines BElement deriving from a BisCore class. */
49
+ const schemaB = `<?xml version="1.0" encoding="UTF-8"?>
50
+ <ECSchema schemaName="FragB" alias="fb" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
51
+ <ECSchemaReference name="BisCore" version="01.00.00" alias="bis"/>
52
+ <ECEntityClass typeName="BElement">
53
+ <BaseClass>bis:PhysicalElement</BaseClass>
54
+ <ECProperty propertyName="BProp" typeName="string"/>
55
+ </ECEntityClass>
56
+ </ECSchema>`;
57
+ /** SchemaA references FragB and derives AElement from FragB:BElement.
58
+ * So loading FragA must transitively pull FragB (and, through it, BisCore). */
59
+ const schemaA = `<?xml version="1.0" encoding="UTF-8"?>
60
+ <ECSchema schemaName="FragA" alias="fa" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
61
+ <ECSchemaReference name="FragB" version="01.00.00" alias="fb"/>
62
+ <ECEntityClass typeName="AElement">
63
+ <BaseClass>fb:BElement</BaseClass>
64
+ <ECProperty propertyName="AProp" typeName="int"/>
65
+ </ECEntityClass>
66
+ </ECSchema>`;
67
+ /** A third schema imported after the first load, to exercise cache invalidation. */
68
+ const schemaC = `<?xml version="1.0" encoding="UTF-8"?>
69
+ <ECSchema schemaName="FragC" alias="fc" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
70
+ <ECSchemaReference name="BisCore" version="01.00.00" alias="bis"/>
71
+ <ECEntityClass typeName="CElement">
72
+ <BaseClass>bis:PhysicalElement</BaseClass>
73
+ <ECProperty propertyName="CProp" typeName="string"/>
74
+ </ECEntityClass>
75
+ </ECSchema>`;
76
+ /**
77
+ * Tests the incremental ("husk") schema-view path: `getSchemaView({ schemas: [...] })` loads only
78
+ * the requested schemas plus their references via `PRAGMA schema_view_fragment`, accumulating
79
+ * across calls. These run against a real iModel - the blob is exercised end to end (native writer ->
80
+ * TS reader/merge), which is where the fragment mechanism actually has to work. The blob format
81
+ * itself is an internal C++-writer-to-TS-reader contract.
82
+ */
83
+ describe("SchemaView fragment loading", () => {
84
+ // Building an empty iModel and importing schemas into it dominates this suite's runtime, so each
85
+ // seed below is created once in `before`. Each test then just needs a writable file of its own -
86
+ // a raw file copy plus `StandaloneDb.openFile` - rather than paying for createEmpty + schema import
87
+ // again, or for the checkpoint/vacuum overhead that `SnapshotDb.createFrom` adds on top of the copy.
88
+ let fragSeedDb;
89
+ let genericSeedDb;
90
+ before(async () => {
91
+ if (!IModelHost.isValid)
92
+ await TestUtils.startBackend();
93
+ const fragSeedPath = path.join(KnownTestLocations.outputDir, `SchemaViewFragmentSeed-${Guid.createValue()}.bim`);
94
+ fragSeedDb = StandaloneDb.createEmpty(fragSeedPath, { rootSubject: { name: "SchemaViewFragmentLoadingSeed" } });
95
+ await fragSeedDb.importSchemaStrings([schemaB, schemaA]);
96
+ fragSeedDb.performCheckpoint(); // flush + truncate the WAL so the raw file copy below is consistent
97
+ GenericSchema.registerSchema();
98
+ const genericSeedPath = path.join(KnownTestLocations.outputDir, `SchemaViewFragmentGenericSeed-${Guid.createValue()}.bim`);
99
+ genericSeedDb = StandaloneDb.createEmpty(genericSeedPath, { rootSubject: { name: "SchemaViewFragmentGenericSeed" } });
100
+ await genericSeedDb.importSchemas([GenericSchema.schemaFilePath]);
101
+ genericSeedDb.performCheckpoint();
102
+ });
103
+ after(() => {
104
+ fragSeedDb.close();
105
+ genericSeedDb.close();
106
+ });
107
+ /** Clone a writable iModel from a seed's file via a raw file copy - no checkpoint/vacuum. Only
108
+ * needed by the handful of tests that mutate the iModel (e.g. importing another schema); every
109
+ * other test just opens a second read-only connection directly onto the seed's file below. */
110
+ function cloneSeed(seedDb, namePrefix) {
111
+ const filePath = path.join(KnownTestLocations.outputDir, `${namePrefix}-${Guid.createValue()}.bim`);
112
+ IModelJsFs.copySync(seedDb.pathName, filePath);
113
+ return StandaloneDb.openFile(filePath, OpenMode.ReadWrite);
114
+ }
115
+ /** Get an iModel backed by the FragA/FragB (and BisCore) seed. Read-only by default - just another
116
+ * connection onto the same file, no copy - since most tests only read a `SchemaView` off it. Pass
117
+ * `writable: true` for the rare test that needs to mutate the iModel (e.g. import another schema),
118
+ * which gets its own private copy so it can't affect the shared seed or other tests. */
119
+ async function createIModelWithFragSchemas(options) {
120
+ if (options?.writable)
121
+ return cloneSeed(fragSeedDb, "SchemaViewFragment");
122
+ return StandaloneDb.openFile(fragSeedDb.pathName, OpenMode.Readonly);
123
+ }
124
+ /** Every schema name in the iModel, straight from ECDbMeta - the same source the schema manifest
125
+ * is built from - so tests never hardcode the schema inventory of an empty snapshot. */
126
+ async function queryAllSchemaNames(iModel) {
127
+ const schemaNames = [];
128
+ for await (const row of iModel.createQueryReader("SELECT Name FROM meta.ECSchemaDef"))
129
+ schemaNames.push(row[0]);
130
+ return schemaNames;
131
+ }
132
+ /** The sorted names of every schema present in a view. */
133
+ function getSortedViewSchemaNames(view) {
134
+ return [...view.getSchemas()].map((schema) => schema.name).sort();
135
+ }
136
+ it("loads a requested schema and its reference closure, leaving unrequested schemas absent", async () => {
137
+ const iModel = await createIModelWithFragSchemas();
138
+ try {
139
+ // Request only FragB. It references BisCore, so both must be present; FragA must not be.
140
+ const view = await iModel.getSchemaView({ schemas: ["FragB"] });
141
+ expect(view.getSchema("FragB"), "FragB was requested").to.not.be.undefined;
142
+ expect(view.getSchema("BisCore"), "BisCore is in FragB's closure").to.not.be.undefined;
143
+ expect(view.getSchema("FragA"), "FragA was not requested and nothing pulled it in").to.be.undefined;
144
+ expect(view.findClass("FragB:BElement")).to.not.be.undefined;
145
+ expect(view.findClass("FragA:AElement")).to.be.undefined;
146
+ }
147
+ finally {
148
+ iModel.close();
149
+ }
150
+ });
151
+ it("pulls transitive dependencies when loading a dependent schema", async () => {
152
+ const iModel = await createIModelWithFragSchemas();
153
+ try {
154
+ // FragA -> FragB -> BisCore. Requesting FragA alone must make the whole chain resolvable.
155
+ const view = await iModel.getSchemaView({ schemas: ["FragA"] });
156
+ expect(view.getSchema("FragA")).to.not.be.undefined;
157
+ expect(view.getSchema("FragB")).to.not.be.undefined;
158
+ expect(view.getSchema("BisCore")).to.not.be.undefined;
159
+ const aElement = view.findClass("FragA:AElement");
160
+ expect(aElement).to.not.be.undefined;
161
+ // Cross-schema base class resolves across the closure.
162
+ expect(aElement.baseClass?.fullName).to.equal("FragB:BElement");
163
+ // And transitively up into BisCore.
164
+ expect(aElement.is("BisCore:PhysicalElement")).to.be.true;
165
+ }
166
+ finally {
167
+ iModel.close();
168
+ }
169
+ });
170
+ it("accumulates schemas across calls into one view", async () => {
171
+ const iModel = await createIModelWithFragSchemas();
172
+ try {
173
+ const view1 = await iModel.getSchemaView({ schemas: ["FragB"] });
174
+ expect(view1.getSchema("FragA")).to.be.undefined;
175
+ // A second call for FragA merges into the same accumulating view.
176
+ const view2 = await iModel.getSchemaView({ schemas: ["FragA"] });
177
+ expect(view2, "subset view is a single accumulating instance").to.equal(view1);
178
+ // Both schemas are now resolvable on the one view.
179
+ expect(view2.findClass("FragA:AElement")).to.not.be.undefined;
180
+ expect(view2.findClass("FragB:BElement")).to.not.be.undefined;
181
+ }
182
+ finally {
183
+ iModel.close();
184
+ }
185
+ });
186
+ it("is idempotent when re-requesting an already-loaded schema", async () => {
187
+ const iModel = await createIModelWithFragSchemas();
188
+ try {
189
+ const view1 = await iModel.getSchemaView({ schemas: ["FragA"] });
190
+ const aElement1 = view1.findClass("FragA:AElement");
191
+ expect(aElement1).to.not.be.undefined;
192
+ // Re-requesting loads nothing new and returns the same instance with stable indices.
193
+ const view2 = await iModel.getSchemaView({ schemas: ["FragA", "FragB"] });
194
+ expect(view2).to.equal(view1);
195
+ expect(view2.findClass("FragA:AElement").idx).to.equal(aElement1.idx);
196
+ }
197
+ finally {
198
+ iModel.close();
199
+ }
200
+ });
201
+ it("ignores schema names the iModel does not contain", async () => {
202
+ const iModel = await createIModelWithFragSchemas();
203
+ try {
204
+ const view = await iModel.getSchemaView({ schemas: ["DoesNotExist"] });
205
+ expect(view.getSchema("DoesNotExist")).to.be.undefined;
206
+ // No real schemas requested; the view is a valid, empty husk.
207
+ expect(view.schemaCount).to.equal(0);
208
+ }
209
+ finally {
210
+ iModel.close();
211
+ }
212
+ });
213
+ it("serializes overlapping concurrent loads without double-merging", async () => {
214
+ const iModel = await createIModelWithFragSchemas();
215
+ try {
216
+ // Fire overlapping requests whose closures share BisCore. The merge queue must coalesce so no
217
+ // schema is merged twice (which would surface as duplicate classes).
218
+ const [v1, v2] = await Promise.all([
219
+ iModel.getSchemaView({ schemas: ["FragA"] }),
220
+ iModel.getSchemaView({ schemas: ["FragB"] }),
221
+ ]);
222
+ expect(v2).to.equal(v1);
223
+ // Exactly one BElement and one AElement - no duplicates from a double merge.
224
+ let bElementCount = 0;
225
+ let aElementCount = 0;
226
+ for (const schema of v1.getSchemas()) {
227
+ for (const cls of schema.getClasses()) {
228
+ if (cls.fullName === "FragB:BElement")
229
+ bElementCount++;
230
+ if (cls.fullName === "FragA:AElement")
231
+ aElementCount++;
232
+ }
233
+ }
234
+ expect(bElementCount, "BElement merged exactly once").to.equal(1);
235
+ expect(aElementCount, "AElement merged exactly once").to.equal(1);
236
+ }
237
+ finally {
238
+ iModel.close();
239
+ }
240
+ });
241
+ it("invalidates the subset husk after a schema import", async () => {
242
+ const iModel = await createIModelWithFragSchemas({ writable: true });
243
+ try {
244
+ const view1 = await iModel.getSchemaView({ schemas: ["FragB"] });
245
+ expect(view1.getSchema("FragB")).to.not.be.undefined;
246
+ expect(view1.isOutdated).to.be.false;
247
+ // Importing a schema calls clearCaches, which drops the husk and its loaded-set.
248
+ await iModel.importSchemaStrings([schemaC]);
249
+ expect(view1.isOutdated, "the old husk is marked outdated").to.be.true;
250
+ // A fresh request rebuilds against the new schema state - a different instance that can now
251
+ // load the newly imported schema.
252
+ const view2 = await iModel.getSchemaView({ schemas: ["FragC"] });
253
+ expect(view2, "a new husk is built after invalidation").to.not.equal(view1);
254
+ expect(view2.findClass("FragC:CElement")).to.not.be.undefined;
255
+ }
256
+ finally {
257
+ iModel.close();
258
+ }
259
+ });
260
+ it("the full view (no args) still contains everything the subset path can load", async () => {
261
+ const iModel = await createIModelWithFragSchemas();
262
+ try {
263
+ const full = await iModel.getSchemaView();
264
+ expect(full.findClass("FragA:AElement"), "full view has the domain class").to.not.be.undefined;
265
+ expect(full.findClass("FragB:BElement")).to.not.be.undefined;
266
+ }
267
+ finally {
268
+ iModel.close();
269
+ }
270
+ });
271
+ it("an unfiltered call after a filtered one merges the remaining schemas into the same view and collapses to full mode", async () => {
272
+ const iModel = await createIModelWithFragSchemas();
273
+ try {
274
+ // Start incremental: only FragB (+ BisCore) is loaded.
275
+ const subsetView = await iModel.getSchemaView({ schemas: ["FragB"] });
276
+ expect(subsetView.getSchema("FragA")).to.be.undefined;
277
+ // The unfiltered call means "I need everything": it must merge the rest into the SAME instance.
278
+ const fullView = await iModel.getSchemaView();
279
+ expect(fullView, "the husk accumulates; no new instance").to.equal(subsetView);
280
+ expect(fullView.findClass("FragA:AElement"), "previously missing schema is now merged").to.not.be.undefined;
281
+ expect(fullView.findClass("FragB:BElement"), "earlier schemas remain available").to.not.be.undefined;
282
+ // The unfiltered merge must have collapsed the incremental bookkeeping into full mode: any
283
+ // further request - filtered or not - is a synchronous no-op that issues no queries.
284
+ const queryReaderSpy = sinon.spy(iModel, "createQueryReader");
285
+ try {
286
+ const filteredAgain = await iModel.getSchemaView({ schemas: ["FragA"] });
287
+ const unfilteredAgain = await iModel.getSchemaView();
288
+ expect(filteredAgain).to.equal(fullView);
289
+ expect(unfilteredAgain).to.equal(fullView);
290
+ expect(queryReaderSpy.notCalled, "fully loaded view is served without any queries").to.be.true;
291
+ }
292
+ finally {
293
+ queryReaderSpy.restore();
294
+ }
295
+ }
296
+ finally {
297
+ iModel.close();
298
+ }
299
+ });
300
+ it("filling the view schema-by-schema via filters collapses to full mode and matches a full load", async () => {
301
+ const iModel = await createIModelWithFragSchemas();
302
+ try {
303
+ // Request every schema the iModel contains, one filtered call at a time. The names come from
304
+ // ECDbMeta (the manifest's own source), so nothing about the snapshot's schema inventory is
305
+ // hardcoded - this also exercises requesting excluded schemas (e.g. CoreCustomAttributes)
306
+ // directly, which must be tolerated and contribute nothing.
307
+ const allSchemaNames = await queryAllSchemaNames(iModel);
308
+ expect(allSchemaNames.length, "snapshot contains more schemas than the two imported ones").to.be.greaterThan(2);
309
+ let accumulatingView;
310
+ for (const schemaName of allSchemaNames) {
311
+ const view = await iModel.getSchemaView({ schemas: [schemaName] });
312
+ if (accumulatingView === undefined)
313
+ accumulatingView = view;
314
+ else
315
+ expect(view, "every filtered call returns the one accumulating instance").to.equal(accumulatingView);
316
+ }
317
+ if (accumulatingView === undefined)
318
+ expect.fail("no schema view was obtained");
319
+ // Once every schema has been requested, the view must have collapsed to full mode: an
320
+ // unfiltered request is a synchronous no-op on the same instance, with no queries issued.
321
+ const queryReaderSpy = sinon.spy(iModel, "createQueryReader");
322
+ try {
323
+ const fullRequest = await iModel.getSchemaView();
324
+ expect(fullRequest).to.equal(accumulatingView);
325
+ expect(queryReaderSpy.notCalled, "collapsed view is served without any queries").to.be.true;
326
+ }
327
+ finally {
328
+ queryReaderSpy.restore();
329
+ }
330
+ // The fragment-filled view must be equivalent to a from-scratch full load of the same iModel:
331
+ // same schemas present (both paths apply the same exclusion list in the native writer).
332
+ const rebuiltFullView = await iModel.getSchemaView({ forceReload: true });
333
+ expect(rebuiltFullView).to.not.equal(accumulatingView);
334
+ expect(getSortedViewSchemaNames(accumulatingView), "fragment fill and full load agree on the schema set")
335
+ .to.deep.equal(getSortedViewSchemaNames(rebuiltFullView));
336
+ }
337
+ finally {
338
+ iModel.close();
339
+ }
340
+ });
341
+ describe("forceReload", () => {
342
+ it("discards an accumulated husk and rebuilds from scratch", async () => {
343
+ const iModel = await createIModelWithFragSchemas();
344
+ try {
345
+ // Accumulate FragA + FragB into one husk.
346
+ const view1 = await iModel.getSchemaView({ schemas: ["FragA"] });
347
+ expect(view1.getSchema("FragB")).to.not.be.undefined;
348
+ expect(view1.isOutdated).to.be.false;
349
+ // forceReload with a narrower filter: the old husk is dropped and marked outdated, and the
350
+ // rebuilt view contains only the newly requested closure - FragA is gone.
351
+ const view2 = await iModel.getSchemaView({ schemas: ["FragB"], forceReload: true });
352
+ expect(view2).to.not.equal(view1);
353
+ expect(view1.isOutdated, "the discarded husk is marked outdated").to.be.true;
354
+ expect(view2.isOutdated).to.be.false;
355
+ expect(view2.getSchema("FragB")).to.not.be.undefined;
356
+ expect(view2.getSchema("FragA"), "rebuild starts from scratch; earlier schemas are not carried over").to.be.undefined;
357
+ }
358
+ finally {
359
+ iModel.close();
360
+ }
361
+ });
362
+ it("rebuilds a fully loaded view", async () => {
363
+ const iModel = await createIModelWithFragSchemas();
364
+ try {
365
+ const view1 = await iModel.getSchemaView();
366
+ const view2 = await iModel.getSchemaView({ forceReload: true });
367
+ expect(view2).to.not.equal(view1);
368
+ expect(view1.isOutdated).to.be.true;
369
+ expect(view2.isOutdated).to.be.false;
370
+ // The rebuilt view is complete again.
371
+ expect(getSortedViewSchemaNames(view2)).to.deep.equal(getSortedViewSchemaNames(view1));
372
+ }
373
+ finally {
374
+ iModel.close();
375
+ }
376
+ });
377
+ it("is serialized behind an in-flight load", async () => {
378
+ const iModel = await createIModelWithFragSchemas();
379
+ try {
380
+ // Fire a load and a forceReload without awaiting in between. The reload must wait for the
381
+ // first load to finish, then discard its result - never tearing down state mid-load.
382
+ const [view1, view2] = await Promise.all([
383
+ iModel.getSchemaView({ schemas: ["FragA"] }),
384
+ iModel.getSchemaView({ schemas: ["FragA"], forceReload: true }),
385
+ ]);
386
+ expect(view2).to.not.equal(view1);
387
+ expect(view1.isOutdated, "the first load's view was discarded by the reload").to.be.true;
388
+ expect(view2.isOutdated).to.be.false;
389
+ expect(view2.findClass("FragA:AElement"), "the rebuilt view is fully usable").to.not.be.undefined;
390
+ }
391
+ finally {
392
+ iModel.close();
393
+ }
394
+ });
395
+ });
396
+ describe("PRAGMA schema_view_fragment version prefix", () => {
397
+ // The frontend must pin the blob format version (frontend and backend can be version-skewed),
398
+ // so it will issue the pragma with the `v<N>;` prefix. These tests prove the prefix contract
399
+ // works end to end through ConcurrentQuery, not just in the native unit tests.
400
+ /** Fetch one fragment blob directly via the pragma. Calls `next()` exactly once - PRAGMA
401
+ * results must not be iterated, since ConcurrentQuery cannot paginate them. */
402
+ async function fetchFragmentBlob(iModel, argument) {
403
+ const reader = iModel.createQueryReader(`PRAGMA schema_view_fragment('${argument}')`);
404
+ const result = await reader.next();
405
+ expect(result.done, "pragma returned a row").to.be.false;
406
+ const data = result.value.data;
407
+ if (data === undefined || data === null)
408
+ expect.fail("pragma returned no data column");
409
+ return { data, formatVersion: result.value.formatVersion };
410
+ }
411
+ it("accepts a v1; prefix and returns the same blob as the unprefixed form", async () => {
412
+ const iModel = await createIModelWithFragSchemas();
413
+ try {
414
+ const nameList = (await queryAllSchemaNames(iModel)).join(",");
415
+ const prefixed = await fetchFragmentBlob(iModel, `v${schemaViewFormatVersion};${nameList}`);
416
+ expect(prefixed.formatVersion, "reported format version matches the requested one").to.equal(schemaViewFormatVersion);
417
+ // Omitting the prefix means "latest", which today is the same version - identical blob bytes.
418
+ const unprefixed = await fetchFragmentBlob(iModel, nameList);
419
+ expect(unprefixed.formatVersion).to.equal(schemaViewFormatVersion);
420
+ expect(Buffer.from(prefixed.data).equals(Buffer.from(unprefixed.data)), "explicit version and latest produce identical blobs").to.be.true;
421
+ // The prefixed blob is a valid fragment end to end: it merges into a husk and resolves classes.
422
+ const husk = SchemaView.createMergeable();
423
+ husk.mergeFragment(prefixed.data);
424
+ expect(husk.findClass("FragA:AElement")).to.not.be.undefined;
425
+ expect(husk.findClass("FragB:BElement")).to.not.be.undefined;
426
+ }
427
+ finally {
428
+ iModel.close();
429
+ }
430
+ });
431
+ it("rejects malformed and unsupported version prefixes", async () => {
432
+ const iModel = await createIModelWithFragSchemas();
433
+ try {
434
+ const nameList = (await queryAllSchemaNames(iModel)).join(",");
435
+ const invalidArguments = [
436
+ `v99;${nameList}`, // unsupported version
437
+ `v;${nameList}`, // malformed version token (no digits)
438
+ `vx;${nameList}`, // malformed version token (non-digit)
439
+ "v1;", // version present, empty name list
440
+ ];
441
+ // Native rejects these at prepare time; ConcurrentQuery surfaces that as a rejected read.
442
+ for (const argument of invalidArguments) {
443
+ const reader = iModel.createQueryReader(`PRAGMA schema_view_fragment('${argument}')`);
444
+ let rejected = false;
445
+ try {
446
+ await reader.next();
447
+ }
448
+ catch {
449
+ rejected = true;
450
+ }
451
+ expect(rejected, `'${argument}' is rejected`).to.be.true;
452
+ }
453
+ }
454
+ finally {
455
+ iModel.close();
456
+ }
457
+ });
458
+ });
459
+ it("loads a real domain schema's reference closure, dropping references that are excluded", async () => {
460
+ // Walk against real schemas. Generic references BisCore plus three schemas that are all on SchemaView's
461
+ // exclusion list. BisCore in turn references four schemas that are ALL excluded.
462
+ // So requesting Generic must yield a view containing exactly Generic + BisCore - the walk
463
+ // pulls BisCore, and every excluded reference contributes no rows.
464
+ const iModel = StandaloneDb.openFile(genericSeedDb.pathName, OpenMode.Readonly);
465
+ try {
466
+ // Capture native warnings and errors while the fragment blob is written + parsed.
467
+ // assert nothing was logged as a safeguard against regressions.
468
+ let schemaView;
469
+ const nativeLogs = await captureNativeLogs(async () => {
470
+ schemaView = await iModel.getSchemaView({ schemas: ["Generic"] });
471
+ });
472
+ expect(nativeLogs, `native warnings/errors during getSchemaView:\n${nativeLogs.map((l) => `${l.level} | ${l.category} | ${l.message}`).join("\n")}`).to.be.empty;
473
+ expect(schemaView, "schema view was obtained").to.not.be.undefined;
474
+ if (!schemaView)
475
+ return;
476
+ // The requested schema and its one non-excluded reference are present.
477
+ expect(schemaView.getSchema("Generic"), "Generic was requested").to.not.be.undefined;
478
+ expect(schemaView.getSchema("BisCore"), "BisCore is Generic's only non-excluded reference").to.not.be.undefined;
479
+ // Every excluded reference in the closure contributes nothing to the view.
480
+ for (const excluded of ["CoreCustomAttributes", "BisCustomAttributes", "ECDbMap", "ECDbSchemaPolicies"])
481
+ expect(schemaView.getSchema(excluded), `${excluded} is excluded from SchemaView`).to.be.undefined;
482
+ // The view contains exactly the two non-excluded schemas - nothing leaked in from the closure.
483
+ expect(schemaView.schemaCount, "view holds exactly Generic + BisCore").to.equal(2);
484
+ // A cross-schema base-class reference resolves across the loaded closure.
485
+ const physicalObject = schemaView.findClass("Generic:PhysicalObject");
486
+ expect(physicalObject, "Generic:PhysicalObject is loaded").to.not.be.undefined;
487
+ expect(physicalObject.is("BisCore:PhysicalElement"), "resolves up into BisCore").to.be.true;
488
+ // PhysicalObject's immediate base is bis:PhysicalElement, resolved across the schema boundary.
489
+ const baseClass = physicalObject.baseClass;
490
+ expect(baseClass, "PhysicalObject has a base class").to.not.be.undefined;
491
+ expect(baseClass.fullName, "base class is bis:PhysicalElement").to.equal("BisCore:PhysicalElement");
492
+ // PhysicalObject defines no own properties, so walking its properties must surface only the
493
+ // ones inherited from the BisCore ancestor chain (PhysicalElement -> ... -> Element). This
494
+ // proves the cross-schema property inheritance walk is hydrated correctly.
495
+ expect(physicalObject.getOwnProperties(), "PhysicalObject has no own properties").to.have.lengthOf(0);
496
+ // Expected primitive type for a sampling of inherited primitive properties, one (or more) from
497
+ // each ancestor.
498
+ const expectedPrimitiveTypes = new Map([
499
+ ["FederationGuid", SchemaViewPrimitiveType.Binary], // Element, binary
500
+ ["CodeValue", SchemaViewPrimitiveType.String], // Element, string
501
+ ["UserLabel", SchemaViewPrimitiveType.String], // Element, string
502
+ ["LastMod", SchemaViewPrimitiveType.DateTime], // Element, dateTime
503
+ ["InSpatialIndex", SchemaViewPrimitiveType.Boolean], // GeometricElement3d, boolean
504
+ ["Origin", SchemaViewPrimitiveType.Point3d], // GeometricElement3d, point3d
505
+ ["Yaw", SchemaViewPrimitiveType.Double], // GeometricElement3d, double
506
+ ["GeometryStream", SchemaViewPrimitiveType.Binary], // GeometricElement3d, binary
507
+ ]);
508
+ // Navigation properties contributed by the chain
509
+ const expectedNavProperties = ["Model", "CodeSpec", "Category", "PhysicalMaterial"];
510
+ // First walk: getProperties() returns the full inherited set. Verify each expected property is
511
+ // present and, for primitives, that its primitive type survived hydration intact.
512
+ const propertiesByName = new Map(physicalObject.getProperties().map((p) => [p.name, p]));
513
+ for (const [name, primitiveType] of expectedPrimitiveTypes) {
514
+ const property = propertiesByName.get(name);
515
+ expect(property, `inherited property "${name}" is present`).to.not.be.undefined;
516
+ if (!property)
517
+ continue; // narrows for the type checker; expect already failed if undefined
518
+ if (!property.isPrimitive())
519
+ expect.fail(`inherited property "${name}" should be primitive`);
520
+ expect(property.primitiveType, `"${name}" primitive type`).to.equal(primitiveType);
521
+ }
522
+ for (const name of expectedNavProperties) {
523
+ const property = propertiesByName.get(name);
524
+ expect(property, `inherited navigation property "${name}" is present`).to.not.be.undefined;
525
+ if (!property)
526
+ continue;
527
+ expect(property.isNavigation(), `"${name}" is a navigation property`).to.be.true;
528
+ }
529
+ // Second walk: the single getProperty(name) accessor resolves the same inherited properties
530
+ // (case-insensitively) and reports the same primitive types.
531
+ for (const [name, primitiveType] of expectedPrimitiveTypes) {
532
+ const property = physicalObject.getProperty(name);
533
+ expect(property, `getProperty("${name}") resolves`).to.not.be.undefined;
534
+ if (!property)
535
+ continue;
536
+ if (!property.isPrimitive())
537
+ expect.fail(`getProperty("${name}") should be primitive`);
538
+ expect(property.primitiveType, `getProperty("${name}") primitive type`).to.equal(primitiveType);
539
+ }
540
+ }
541
+ finally {
542
+ iModel.close();
543
+ }
544
+ });
545
+ });
546
+ //# sourceMappingURL=SchemaViewFragmentLoading.test.js.map