@itwin/core-backend 5.8.0-dev.18 → 5.8.0-dev.19

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 (415) hide show
  1. package/lib/cjs/BackendHubAccess.js.map +1 -1
  2. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  3. package/lib/cjs/BisCoreSchema.js.map +1 -1
  4. package/lib/cjs/BlobContainerService.js.map +1 -1
  5. package/lib/cjs/BriefcaseManager.js.map +1 -1
  6. package/lib/cjs/CatalogDb.js.map +1 -1
  7. package/lib/cjs/Category.js.map +1 -1
  8. package/lib/cjs/ChangeSummaryManager.js +2 -2
  9. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  10. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  11. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  12. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  13. package/lib/cjs/ChannelControl.js.map +1 -1
  14. package/lib/cjs/CheckpointManager.js.map +1 -1
  15. package/lib/cjs/ClassRegistry.js +5 -5
  16. package/lib/cjs/ClassRegistry.js.map +1 -1
  17. package/lib/cjs/CloudSqlite.js.map +1 -1
  18. package/lib/cjs/CodeService.js.map +1 -1
  19. package/lib/cjs/CodeSpecs.js.map +1 -1
  20. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  21. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  22. package/lib/cjs/DevTools.js.map +1 -1
  23. package/lib/cjs/DisplayStyle.js.map +1 -1
  24. package/lib/cjs/ECDb.js.map +1 -1
  25. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  26. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  27. package/lib/cjs/ECSqlStatement.js.map +1 -1
  28. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  29. package/lib/cjs/Element.js.map +1 -1
  30. package/lib/cjs/ElementAspect.js.map +1 -1
  31. package/lib/cjs/ElementGraphics.js.map +1 -1
  32. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  33. package/lib/cjs/Entity.js.map +1 -1
  34. package/lib/cjs/EntityReferences.js.map +1 -1
  35. package/lib/cjs/ExportGraphics.js.map +1 -1
  36. package/lib/cjs/ExternalSource.js.map +1 -1
  37. package/lib/cjs/FontFile.js.map +1 -1
  38. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  39. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  40. package/lib/cjs/GeometrySummary.js +47 -47
  41. package/lib/cjs/GeometrySummary.js.map +1 -1
  42. package/lib/cjs/IModelDb.js +8 -8
  43. package/lib/cjs/IModelDb.js.map +1 -1
  44. package/lib/cjs/IModelDbFonts.js.map +1 -1
  45. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  46. package/lib/cjs/IModelHost.js.map +1 -1
  47. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  48. package/lib/cjs/IModelJsFs.js.map +1 -1
  49. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  50. package/lib/cjs/IpcHost.d.ts.map +1 -1
  51. package/lib/cjs/IpcHost.js +28 -4
  52. package/lib/cjs/IpcHost.js.map +1 -1
  53. package/lib/cjs/LineStyle.js.map +1 -1
  54. package/lib/cjs/LocalHub.js +1 -1
  55. package/lib/cjs/LocalHub.js.map +1 -1
  56. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  57. package/lib/cjs/LockControl.js.map +1 -1
  58. package/lib/cjs/Material.js.map +1 -1
  59. package/lib/cjs/Model.js.map +1 -1
  60. package/lib/cjs/NativeAppStorage.js.map +1 -1
  61. package/lib/cjs/NativeHost.js.map +1 -1
  62. package/lib/cjs/NavigationRelationship.js.map +1 -1
  63. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  64. package/lib/cjs/PropertyStore.js.map +1 -1
  65. package/lib/cjs/Relationship.js.map +1 -1
  66. package/lib/cjs/RpcBackend.js.map +1 -1
  67. package/lib/cjs/SQLiteDb.js.map +1 -1
  68. package/lib/cjs/Schema.js.map +1 -1
  69. package/lib/cjs/SchemaSync.js.map +1 -1
  70. package/lib/cjs/SchemaUtils.js.map +1 -1
  71. package/lib/cjs/SheetIndex.js.map +1 -1
  72. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  73. package/lib/cjs/SqliteStatement.js.map +1 -1
  74. package/lib/cjs/StashManager.js.map +1 -1
  75. package/lib/cjs/Texture.js.map +1 -1
  76. package/lib/cjs/TileStorage.js.map +1 -1
  77. package/lib/cjs/TxnManager.js.map +1 -1
  78. package/lib/cjs/ViewDefinition.js.map +1 -1
  79. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  80. package/lib/cjs/ViewStore.js.map +1 -1
  81. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  82. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  83. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  84. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  85. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  86. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  87. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  88. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  89. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  90. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  91. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  92. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  93. package/lib/cjs/core-backend.js.map +1 -1
  94. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  95. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  96. package/lib/cjs/domains/GenericElements.js.map +1 -1
  97. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  98. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  99. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  100. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  101. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  102. package/lib/cjs/internal/HubMock.js.map +1 -1
  103. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  104. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  105. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  106. package/lib/cjs/internal/NoLocks.js.map +1 -1
  107. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  108. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  109. package/lib/cjs/internal/Symbols.js.map +1 -1
  110. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  111. package/lib/cjs/internal/cross-package.js.map +1 -1
  112. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
  113. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  114. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  115. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  116. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -1
  117. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  118. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  119. package/lib/cjs/rpc/multipart.js.map +1 -1
  120. package/lib/cjs/rpc/tracing.js.map +1 -1
  121. package/lib/cjs/rpc/web/logging.js.map +1 -1
  122. package/lib/cjs/rpc/web/request.js.map +1 -1
  123. package/lib/cjs/rpc/web/response.js.map +1 -1
  124. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  125. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  126. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  127. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  128. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  129. package/lib/cjs/workspace/Settings.js.map +1 -1
  130. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  131. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  132. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  133. package/lib/cjs/workspace/Workspace.js.map +1 -1
  134. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  135. package/lib/esm/BackendHubAccess.js.map +1 -1
  136. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  137. package/lib/esm/BisCoreSchema.js.map +1 -1
  138. package/lib/esm/BlobContainerService.js.map +1 -1
  139. package/lib/esm/BriefcaseManager.js.map +1 -1
  140. package/lib/esm/CatalogDb.js.map +1 -1
  141. package/lib/esm/Category.js.map +1 -1
  142. package/lib/esm/ChangeSummaryManager.js +2 -2
  143. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  144. package/lib/esm/ChangedElementsDb.js.map +1 -1
  145. package/lib/esm/ChangesetECAdaptor.js +248 -248
  146. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  147. package/lib/esm/ChannelControl.js.map +1 -1
  148. package/lib/esm/CheckpointManager.js.map +1 -1
  149. package/lib/esm/ClassRegistry.js +5 -5
  150. package/lib/esm/ClassRegistry.js.map +1 -1
  151. package/lib/esm/CloudSqlite.js.map +1 -1
  152. package/lib/esm/CodeService.js.map +1 -1
  153. package/lib/esm/CodeSpecs.js.map +1 -1
  154. package/lib/esm/ConcurrentQuery.js.map +1 -1
  155. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  156. package/lib/esm/DevTools.js.map +1 -1
  157. package/lib/esm/DisplayStyle.js.map +1 -1
  158. package/lib/esm/ECDb.js.map +1 -1
  159. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  160. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  161. package/lib/esm/ECSqlStatement.js.map +1 -1
  162. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  163. package/lib/esm/Element.js.map +1 -1
  164. package/lib/esm/ElementAspect.js.map +1 -1
  165. package/lib/esm/ElementGraphics.js.map +1 -1
  166. package/lib/esm/ElementTreeWalker.js.map +1 -1
  167. package/lib/esm/Entity.js.map +1 -1
  168. package/lib/esm/EntityReferences.js.map +1 -1
  169. package/lib/esm/ExportGraphics.js.map +1 -1
  170. package/lib/esm/ExternalSource.js.map +1 -1
  171. package/lib/esm/FontFile.js.map +1 -1
  172. package/lib/esm/GeoCoordConfig.js.map +1 -1
  173. package/lib/esm/GeographicCRSServices.js.map +1 -1
  174. package/lib/esm/GeometrySummary.js +47 -47
  175. package/lib/esm/GeometrySummary.js.map +1 -1
  176. package/lib/esm/IModelDb.js +8 -8
  177. package/lib/esm/IModelDb.js.map +1 -1
  178. package/lib/esm/IModelDbFonts.js.map +1 -1
  179. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  180. package/lib/esm/IModelHost.js.map +1 -1
  181. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  182. package/lib/esm/IModelJsFs.js.map +1 -1
  183. package/lib/esm/ImageSourceConversion.js.map +1 -1
  184. package/lib/esm/IpcHost.d.ts.map +1 -1
  185. package/lib/esm/IpcHost.js +28 -4
  186. package/lib/esm/IpcHost.js.map +1 -1
  187. package/lib/esm/LineStyle.js.map +1 -1
  188. package/lib/esm/LocalHub.js +1 -1
  189. package/lib/esm/LocalHub.js.map +1 -1
  190. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  191. package/lib/esm/LockControl.js.map +1 -1
  192. package/lib/esm/Material.js.map +1 -1
  193. package/lib/esm/Model.js.map +1 -1
  194. package/lib/esm/NativeAppStorage.js.map +1 -1
  195. package/lib/esm/NativeHost.js.map +1 -1
  196. package/lib/esm/NavigationRelationship.js.map +1 -1
  197. package/lib/esm/PromiseMemoizer.js.map +1 -1
  198. package/lib/esm/PropertyStore.js.map +1 -1
  199. package/lib/esm/Relationship.js.map +1 -1
  200. package/lib/esm/RpcBackend.js.map +1 -1
  201. package/lib/esm/SQLiteDb.js.map +1 -1
  202. package/lib/esm/Schema.js.map +1 -1
  203. package/lib/esm/SchemaSync.js.map +1 -1
  204. package/lib/esm/SchemaUtils.js.map +1 -1
  205. package/lib/esm/SheetIndex.js.map +1 -1
  206. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  207. package/lib/esm/SqliteStatement.js.map +1 -1
  208. package/lib/esm/StashManager.js.map +1 -1
  209. package/lib/esm/Texture.js.map +1 -1
  210. package/lib/esm/TileStorage.js.map +1 -1
  211. package/lib/esm/TxnManager.js.map +1 -1
  212. package/lib/esm/ViewDefinition.js.map +1 -1
  213. package/lib/esm/ViewStateHydrator.js.map +1 -1
  214. package/lib/esm/ViewStore.js.map +1 -1
  215. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  216. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  217. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  218. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  219. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  220. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  221. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  222. package/lib/esm/core-backend.js.map +1 -1
  223. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  224. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  225. package/lib/esm/domains/GenericElements.js.map +1 -1
  226. package/lib/esm/domains/GenericSchema.js.map +1 -1
  227. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  228. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  229. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  230. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  231. package/lib/esm/internal/HubMock.js.map +1 -1
  232. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  233. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  234. package/lib/esm/internal/NativePlatform.js.map +1 -1
  235. package/lib/esm/internal/NoLocks.js.map +1 -1
  236. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  237. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  238. package/lib/esm/internal/Symbols.js.map +1 -1
  239. package/lib/esm/internal/annotations/fields.js.map +1 -1
  240. package/lib/esm/internal/cross-package.js.map +1 -1
  241. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
  242. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  243. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  244. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  245. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -1
  246. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  247. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  248. package/lib/esm/rpc/multipart.js.map +1 -1
  249. package/lib/esm/rpc/tracing.js.map +1 -1
  250. package/lib/esm/rpc/web/logging.js.map +1 -1
  251. package/lib/esm/rpc/web/request.js.map +1 -1
  252. package/lib/esm/rpc/web/response.js.map +1 -1
  253. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  254. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  255. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  256. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  257. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  258. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  259. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  260. package/lib/esm/test/AttachDb.test.js +11 -11
  261. package/lib/esm/test/AttachDb.test.js.map +1 -1
  262. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  263. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  264. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  265. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  266. package/lib/esm/test/IModelHost.test.js.map +1 -1
  267. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  268. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  269. package/lib/esm/test/IpcHost.test.js +64 -13
  270. package/lib/esm/test/IpcHost.test.js.map +1 -1
  271. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  272. package/lib/esm/test/PrintElementTree.js.map +1 -1
  273. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  274. package/lib/esm/test/RevisionUtility.js.map +1 -1
  275. package/lib/esm/test/SchemaUtils.test.js +25 -25
  276. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  277. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  278. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  279. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  280. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  281. package/lib/esm/test/TestUtils.js.map +1 -1
  282. package/lib/esm/test/annotations/Fields.test.js +53 -53
  283. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  284. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  285. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  286. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  287. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  288. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  289. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  290. package/lib/esm/test/categories/Category.test.js.map +1 -1
  291. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  292. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  293. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  294. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  295. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  296. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  297. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  298. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  299. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  300. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  301. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  302. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  303. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  304. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  305. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  306. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  307. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  308. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  309. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  310. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  311. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  312. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  313. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  314. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  315. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  316. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  317. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  318. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  319. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  320. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  321. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  322. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  323. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  324. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  325. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  326. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  327. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  328. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  329. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  330. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  331. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  332. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  333. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  334. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  335. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  336. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  337. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  338. package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
  339. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  340. package/lib/esm/test/imageData.js.map +1 -1
  341. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  342. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  343. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  344. package/lib/esm/test/imodel/IModel.test.js +44 -44
  345. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  346. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  347. package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
  348. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  349. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  350. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  351. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  352. package/lib/esm/test/index.js.map +1 -1
  353. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  354. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  355. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  356. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  357. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  358. package/lib/esm/test/rpc/response.test.js.map +1 -1
  359. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  360. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  361. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  362. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  363. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  364. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  365. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  366. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  367. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  368. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  369. package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
  370. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  371. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  372. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  373. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  374. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  375. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  376. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  377. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  378. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  379. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  380. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  381. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  382. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  383. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  384. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  385. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  386. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  387. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  388. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  389. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  390. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  391. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  392. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  393. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  394. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  395. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  396. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  397. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  398. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  399. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  400. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  401. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  402. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  403. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  404. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  405. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  406. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  407. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  408. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  409. package/lib/esm/workspace/Settings.js.map +1 -1
  410. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  411. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  412. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  413. package/lib/esm/workspace/Workspace.js.map +1 -1
  414. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  415. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Workspace.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { expect } from \"chai\";\nimport * as fs from \"fs-extra\";\nimport { extname } from \"path\";\nimport * as sinon from \"sinon\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { SettingsPriority } from \"../../workspace/Settings\";\nimport { Workspace, WorkspaceContainerProps, WorkspaceDbManifest, WorkspaceDbProps } from \"../../workspace/Workspace\";\nimport { EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { validateWorkspaceContainerId } from \"../../internal/workspace/WorkspaceImpl\";\nimport { _nativeDb } from \"../../internal/Symbols\";\nimport { CloudSqlite } from \"../../CloudSqlite\";\nimport { BlobContainer } from \"../../BlobContainerService\";\n\ndescribe(\"WorkspaceFile\", () => {\n\n let editor: WorkspaceEditor;\n let workspace: Workspace;\n\n before(() => {\n editor = WorkspaceEditor.construct();\n workspace = editor.workspace;\n });\n after(() => {\n editor.close();\n });\n\n async function makeEditableDb(props: WorkspaceDbProps & WorkspaceContainerProps, manifest: WorkspaceDbManifest): Promise<EditableWorkspaceDb> {\n const container = editor.getContainer({ ...props, accessToken: \"\" });\n const wsFile = await container.createDb({ ...props, manifest });\n wsFile.open();\n return wsFile;\n }\n\n function compareFiles(file1: string, file2: string) {\n expect(fs.lstatSync(file1).size).equal(fs.lstatSync(file2).size);\n expect(fs.readFileSync(file1)).to.deep.equal(fs.readFileSync(file2));\n }\n\n it(\"WorkspaceContainer names\", () => {\n const expectBadName = (names: string[]) => {\n names.forEach((containerId) => {\n expect(() => validateWorkspaceContainerId(containerId), containerId).to.throw(\"containerId\");\n });\n };\n\n expectBadName([\n \"\",\n \" \",\n \"12\", // too short\n \"a\\\\b\",\n `a\"b`,\n \"a:b\",\n \"a.b\",\n \"a?b\",\n \"a*b\",\n \"a|b\",\n \"123--4\",\n \"Abc\",\n \"return\\r\",\n \"newline\\n\",\n \"a\".repeat(64), // too long\n \"-leading-dash\",\n \"trailing-dash-\"]);\n\n validateWorkspaceContainerId(Guid.createValue()); // guids should be valid\n });\n\n it(\"WorkspaceDbNames\", () => {\n const expectBadName = (names: string[]) => {\n names.forEach((dbName) => {\n expect(() => CloudSqlite.validateDbName(dbName)).to.throw(\"dbName\");\n });\n };\n\n expectBadName([\n \"\",\n \" \",\n \"1/2\",\n \"a\\\\b\",\n `a\"b`,\n \"base:1.2.3\",\n \"a:b\",\n \"a.b\",\n \"a?b\",\n \"a*b\",\n \"a|b\",\n \"con\",\n \"prn\",\n \"return\\r\",\n \"newline\\n\",\n \"a\".repeat(256), // too long\n \" leading space\",\n \"trailing space \",\n \"per.iod\",\n \"hash#tag\",\n \"back`tick\",\n \"single'quote\",\n ]);\n\n CloudSqlite.validateDbName(Guid.createValue()); // guids should be valid\n });\n\n it(\"WorkspaceDb version fallback\", () => {\n expect(CloudSqlite.validateDbVersion(\"\" as CloudSqlite.DbVersion)).equals(\"0.0.0\");\n expect(CloudSqlite.makeSemverName(\"db1\", \"\" as CloudSqlite.DbVersion)).equals(\"db1:0.0.0\");\n expect(() => CloudSqlite.validateDbVersion(\" \" as CloudSqlite.DbVersion)).to.throw(\"invalid version specification\");\n });\n\n it(\"create new WorkspaceDb\", async () => {\n const manifest: WorkspaceDbManifest = { workspaceName: \"resources for acme users\", contactName: \"contact me\" };\n const wsFile = await makeEditableDb({ containerId: \"acme-engineering-inc-2\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, manifest);\n const inFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\n const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);\n let blobVal = new Uint8Array(testRange.toFloat64Array().buffer);\n let strVal = \"this is test1\";\n const strRscName = \"string-resource/1\";\n const blobRscName = \"blob.resource:1\";\n const fileRscName = \"settings files/my settings/a.json5\";\n\n let testManifest = wsFile.manifest;\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\n expect(testManifest.contactName).equals(manifest.contactName);\n\n wsFile.updateManifest({ ...testManifest, contactName: \"new contact\" });\n testManifest = wsFile.manifest;\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\n expect(testManifest.contactName).equals(\"new contact\");\n\n expect(() => wsFile.addFile(fileRscName, \"bad file name\")).to.throw(\"no such file\");\n expect(() => wsFile.updateFile(fileRscName, inFile)).to.throw(\"error replacing\");\n expect(() => wsFile.removeFile(fileRscName)).to.throw(\"does not exist\");\n\n wsFile.addBlob(blobRscName, blobVal);\n wsFile.addString(strRscName, strVal);\n expect(wsFile.getString(strRscName)).equals(strVal);\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\n strVal = \"updated string\";\n blobVal = Uint8Array.from([0, 1, 2, 3]);\n wsFile.updateString(strRscName, strVal);\n wsFile.updateBlob(blobRscName, blobVal);\n expect(wsFile.getString(strRscName)).equals(strVal);\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\n\n wsFile.removeBlob(blobRscName);\n wsFile.removeString(strRscName);\n expect(wsFile.getString(strRscName)).to.be.undefined;\n expect(wsFile.getBlob(blobRscName)).to.be.undefined;\n\n wsFile.addFile(fileRscName, inFile);\n const writeFile = sinon.spy(wsFile.sqliteDb[_nativeDb], \"extractEmbeddedFile\");\n expect(writeFile.callCount).eq(0);\n const outFile = wsFile.getFile(fileRscName)!;\n expect(writeFile.callCount).eq(1);\n expect(extname(outFile)).equals(\".json5\");\n compareFiles(inFile, outFile);\n\n let outFile2 = wsFile.getFile(fileRscName)!;\n expect(writeFile.callCount).eq(1);\n expect(outFile).eq(outFile2);\n\n const inFile2 = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\n wsFile.updateFile(fileRscName, inFile2);\n outFile2 = wsFile.getFile(fileRscName)!;\n expect(writeFile.callCount).eq(2);\n expect(outFile).eq(outFile2);\n compareFiles(inFile2, outFile);\n });\n\n it(\"load workspace settings\", async () => {\n const settingsFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\n const defaultDb = await makeEditableDb({ containerId: \"default\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, { workspaceName: \"default resources\", contactName: \"contact 123\" });\n defaultDb.addString(\"default-settings\", fs.readFileSync(settingsFile, \"utf-8\"));\n defaultDb.close();\n\n const settings = workspace.settings;\n await workspace.loadSettingsDictionary(\n { dbName: \"db1\", containerId: \"default\", baseUri: \"\", storageType: \"azure\", resourceName: \"default-settings\", priority: SettingsPriority.defaults });\n expect(settings.getSetting(\"editor/renderWhitespace\")).equals(\"selection\");\n\n const workspaceName = \"all fonts workspace\";\n const schemaFile = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\n const fontsDb = await makeEditableDb({ containerId: \"fonts\", dbName: \"fonts\", baseUri: \"\", storageType: \"azure\" }, { workspaceName, contactName: \"font guy\" });\n\n fontsDb.addFile(\"Helvetica.ttf\", schemaFile, \"ttf\");\n fontsDb.close();\n });\n\n\n\ndescribe(\"workspace db version cache key\", () => {\n afterEach(() => sinon.restore());\n\n function getContainer(containerId: string, props?: Partial<WorkspaceContainerProps>) {\n return editor.getContainer({ containerId, baseUri: \"\", storageType: \"azure\", accessToken: \"\", ...props });\n }\n\n function createFakeCloudContainer(containerId: string): CloudSqlite.CloudContainer {\n return {\n connect: () => { },\n disconnect: () => { },\n checkForChanges: () => { },\n queryDatabase: () => undefined,\n queryDatabases: () => [],\n acquireWriteLock: () => { },\n releaseWriteLock: () => { },\n abandonChanges: () => { },\n containerId,\n baseUri: \"https://example.invalid\",\n storageType: \"azure\",\n isPublic: false,\n } as unknown as CloudSqlite.CloudContainer;\n }\n\n function stubCloudLookup(containerId: string, resolveVersion: (props: WorkspaceDbProps) => string) {\n sinon.stub(CloudSqlite, \"createCloudContainer\").returns(createFakeCloudContainer(containerId));\n sinon.stub(CloudSqlite, \"querySemverMatch\").callsFake((props) => CloudSqlite.makeSemverName(props.dbName, resolveVersion(props)));\n sinon.stub(CloudSqlite, \"isSemverEditable\").returns(true);\n }\n\n it(\"local getWorkspaceDb ignores version selectors for cache identity\", async () => {\n const container = getContainer(\"workspace-cache-local\");\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cache-local\" } });\n\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\" });\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\", includePrerelease: true });\n expect(db1).to.equal(db2);\n });\n\n it(\"local createDb with omitted dbName matches an explicit default-name lookup\", async () => {\n const container = getContainer(\"workspace-cache-local-default-name\");\n const db1 = await container.createDb({ manifest: { workspaceName: \"workspace-cache-local-default-name\" } });\n\n const db2 = container.getEditableDb({ dbName: \"workspace-db\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"cloud getWorkspaceDb reuses the same instance for semver-equivalent selectors\", () => {\n const containerId = \"workspace-cache-cloud-equivalent\";\n stubCloudLookup(containerId, (props) => props.version === \"1\" ? \"1.0.0\" : (props.version ?? \"1.0.0\"));\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1\" });\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"cloud getWorkspaceDb returns different instances for different resolved versions\", () => {\n const containerId = \"workspace-cache-cloud-different\";\n stubCloudLookup(containerId, (props) => props.version ?? \"1.0.0\");\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"2.0.0\" });\n expect(db1).to.not.equal(db2);\n });\n\n it(\"cloud getWorkspaceDb respects includePrerelease only when it resolves differently\", () => {\n const containerId = \"workspace-cache-cloud-prerelease\";\n stubCloudLookup(containerId, (props) => props.includePrerelease ? \"1.1.0-beta.1\" : \"1.0.0\");\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n const stable = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\" });\n const prerelease = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\", includePrerelease: true });\n expect(stable).to.not.equal(prerelease);\n });\n\n it(\"createDb with explicit version returns the cached editable db for that resolved version\", async () => {\n const containerId = \"workspace-create-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n const db = await container.createDb({ dbName: \"test-db\", version: \"1.0.0\", manifest: { workspaceName: \"workspace-create-version\" } });\n\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\n expect(db).to.equal(dbAgain);\n });\n\n it(\"createDb without an explicit version returns the cached editable db for version 0.0.0\", async () => {\n const containerId = \"workspace-create-default-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n const db = await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-create-default-version\" } });\n\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" });\n expect(db).to.equal(dbAgain);\n });\n\n it(\"cloud createDb uploads using the requested version\", async () => {\n const containerId = \"workspace-cloud-explicit-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n await container.createDb({ dbName: \"test-db\", version: \"1.2.3\", manifest: { workspaceName: \"workspace-cloud-explicit-version\" } });\n\n expect(uploadDb.calledOnce).to.be.true;\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:1.2.3\");\n });\n\n it(\"cloud createDb defaults omitted version to 0.0.0\", async () => {\n const containerId = \"workspace-cloud-default-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cloud-default-version\" } });\n\n expect(uploadDb.calledOnce).to.be.true;\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:0.0.0\");\n });\n});\n\n describe(\"getContainerAsync token resolution\", () => {\n afterEach(() => sinon.restore());\n\n it(\"preserves an explicitly-provided accessToken\", async () => {\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\n const props: WorkspaceContainerProps = {\n containerId: \"explicit-token-test\",\n baseUri: \"https://some-cloud-uri\",\n storageType: \"azure\",\n accessToken: \"my-explicit-token\",\n };\n\n try {\n await workspace.getContainerAsync(props);\n } catch {\n // expected — no real cloud endpoint\n }\n expect(requestTokenStub.called).to.be.false;\n expect(getContainerSpy.calledOnce).to.be.true;\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"my-explicit-token\");\n });\n\n it(\"uses empty token for local containers with empty baseUri\", async () => {\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\n const props: WorkspaceContainerProps = {\n containerId: \"local-token-test\",\n baseUri: \"\",\n storageType: \"azure\",\n };\n\n await workspace.getContainerAsync(props);\n expect(requestTokenStub.called).to.be.false;\n expect(getContainerSpy.calledOnce).to.be.true;\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"\");\n });\n\n it(\"calls requestToken when no accessToken is provided for a cloud container\", async () => {\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").resolves(\"resolved-token\");\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\n const props: WorkspaceContainerProps = {\n containerId: \"cloud-no-token-test\",\n baseUri: \"https://some-cloud-uri\",\n storageType: \"azure\",\n };\n\n try {\n await workspace.getContainerAsync(props);\n } catch {\n // expected — no real cloud endpoint\n }\n expect(requestTokenStub.calledOnce).to.be.true;\n expect(getContainerSpy.calledOnce).to.be.true;\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"resolved-token\");\n });\n });\n\n describe(\"findContainers\", () => {\n const testContainerId = \"mock-workspace-container-id\";\n const testITwinId = \"mock-itwin-id\";\n const testIModelId = \"mock-imodel-id\";\n let savedService: BlobContainer.ContainerService | undefined;\n\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\n return {\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\n delete: async () => {},\n queryScope: async () => ({ iTwinId: testITwinId }),\n queryMetadata: async () => ({ containerType: \"workspace\", label: \"mock\" }),\n queryContainersMetadata: async (_userToken, args) => {\n return containers.filter((c) =>\n (args.containerType === undefined || c.containerType === args.containerType) &&\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\n );\n },\n updateJson: async () => {},\n requestToken: async (_props) => ({\n token: \"\",\n scope: { iTwinId: testITwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"workspace\", label: \"mock\" },\n baseUri: \"\",\n }),\n };\n }\n\n before(() => {\n savedService = BlobContainer.service;\n });\n\n afterEach(() => {\n BlobContainer.service = savedService;\n });\n\n it(\"finds containers by iTwinId\", async () => {\n BlobContainer.service = createMockService([\n { containerId: testContainerId, containerType: \"workspace\", label: \"Test Workspace\" },\n ]);\n\n const containers = await editor.findContainers({ iTwinId: testITwinId });\n expect(containers).to.have.length(1);\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\n });\n\n it(\"finds a container by iTwinId and iModelId\", async () => {\n BlobContainer.service = createMockService([\n { containerId: \"imodel-scoped-container\", containerType: \"workspace\", label: \"iModel Workspace\" },\n ]);\n\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\n expect(containers).to.have.length(1);\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\n });\n\n it(\"returns empty array when no workspace containers are found\", async () => {\n BlobContainer.service = createMockService([]);\n\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\n expect(containers).to.have.length(0);\n });\n\n it(\"throws when BlobContainer.service is not available\", async () => {\n BlobContainer.service = undefined;\n\n await expect(editor.findContainers({ iTwinId: testITwinId }))\n .to.be.rejectedWith(/BlobContainer.service is not available/);\n });\n });\n\n});\n"]}
1
+ {"version":3,"file":"Workspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Workspace.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as fs from \"fs-extra\";\r\nimport { extname } from \"path\";\r\nimport * as sinon from \"sinon\";\r\nimport { Guid } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { SettingsPriority } from \"../../workspace/Settings\";\r\nimport { Workspace, WorkspaceContainerProps, WorkspaceDbManifest, WorkspaceDbProps } from \"../../workspace/Workspace\";\r\nimport { EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { validateWorkspaceContainerId } from \"../../internal/workspace/WorkspaceImpl\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\ndescribe(\"WorkspaceFile\", () => {\r\n\r\n let editor: WorkspaceEditor;\r\n let workspace: Workspace;\r\n\r\n before(() => {\r\n editor = WorkspaceEditor.construct();\r\n workspace = editor.workspace;\r\n });\r\n after(() => {\r\n editor.close();\r\n });\r\n\r\n async function makeEditableDb(props: WorkspaceDbProps & WorkspaceContainerProps, manifest: WorkspaceDbManifest): Promise<EditableWorkspaceDb> {\r\n const container = editor.getContainer({ ...props, accessToken: \"\" });\r\n const wsFile = await container.createDb({ ...props, manifest });\r\n wsFile.open();\r\n return wsFile;\r\n }\r\n\r\n function compareFiles(file1: string, file2: string) {\r\n expect(fs.lstatSync(file1).size).equal(fs.lstatSync(file2).size);\r\n expect(fs.readFileSync(file1)).to.deep.equal(fs.readFileSync(file2));\r\n }\r\n\r\n it(\"WorkspaceContainer names\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((containerId) => {\r\n expect(() => validateWorkspaceContainerId(containerId), containerId).to.throw(\"containerId\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"12\", // too short\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"123--4\",\r\n \"Abc\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(64), // too long\r\n \"-leading-dash\",\r\n \"trailing-dash-\"]);\r\n\r\n validateWorkspaceContainerId(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDbNames\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((dbName) => {\r\n expect(() => CloudSqlite.validateDbName(dbName)).to.throw(\"dbName\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"1/2\",\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"base:1.2.3\",\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"con\",\r\n \"prn\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(256), // too long\r\n \" leading space\",\r\n \"trailing space \",\r\n \"per.iod\",\r\n \"hash#tag\",\r\n \"back`tick\",\r\n \"single'quote\",\r\n ]);\r\n\r\n CloudSqlite.validateDbName(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDb version fallback\", () => {\r\n expect(CloudSqlite.validateDbVersion(\"\" as CloudSqlite.DbVersion)).equals(\"0.0.0\");\r\n expect(CloudSqlite.makeSemverName(\"db1\", \"\" as CloudSqlite.DbVersion)).equals(\"db1:0.0.0\");\r\n expect(() => CloudSqlite.validateDbVersion(\" \" as CloudSqlite.DbVersion)).to.throw(\"invalid version specification\");\r\n });\r\n\r\n it(\"create new WorkspaceDb\", async () => {\r\n const manifest: WorkspaceDbManifest = { workspaceName: \"resources for acme users\", contactName: \"contact me\" };\r\n const wsFile = await makeEditableDb({ containerId: \"acme-engineering-inc-2\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, manifest);\r\n const inFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);\r\n let blobVal = new Uint8Array(testRange.toFloat64Array().buffer);\r\n let strVal = \"this is test1\";\r\n const strRscName = \"string-resource/1\";\r\n const blobRscName = \"blob.resource:1\";\r\n const fileRscName = \"settings files/my settings/a.json5\";\r\n\r\n let testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(manifest.contactName);\r\n\r\n wsFile.updateManifest({ ...testManifest, contactName: \"new contact\" });\r\n testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(\"new contact\");\r\n\r\n expect(() => wsFile.addFile(fileRscName, \"bad file name\")).to.throw(\"no such file\");\r\n expect(() => wsFile.updateFile(fileRscName, inFile)).to.throw(\"error replacing\");\r\n expect(() => wsFile.removeFile(fileRscName)).to.throw(\"does not exist\");\r\n\r\n wsFile.addBlob(blobRscName, blobVal);\r\n wsFile.addString(strRscName, strVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n strVal = \"updated string\";\r\n blobVal = Uint8Array.from([0, 1, 2, 3]);\r\n wsFile.updateString(strRscName, strVal);\r\n wsFile.updateBlob(blobRscName, blobVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n\r\n wsFile.removeBlob(blobRscName);\r\n wsFile.removeString(strRscName);\r\n expect(wsFile.getString(strRscName)).to.be.undefined;\r\n expect(wsFile.getBlob(blobRscName)).to.be.undefined;\r\n\r\n wsFile.addFile(fileRscName, inFile);\r\n const writeFile = sinon.spy(wsFile.sqliteDb[_nativeDb], \"extractEmbeddedFile\");\r\n expect(writeFile.callCount).eq(0);\r\n const outFile = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(extname(outFile)).equals(\".json5\");\r\n compareFiles(inFile, outFile);\r\n\r\n let outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(outFile).eq(outFile2);\r\n\r\n const inFile2 = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n wsFile.updateFile(fileRscName, inFile2);\r\n outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(2);\r\n expect(outFile).eq(outFile2);\r\n compareFiles(inFile2, outFile);\r\n });\r\n\r\n it(\"load workspace settings\", async () => {\r\n const settingsFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const defaultDb = await makeEditableDb({ containerId: \"default\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, { workspaceName: \"default resources\", contactName: \"contact 123\" });\r\n defaultDb.addString(\"default-settings\", fs.readFileSync(settingsFile, \"utf-8\"));\r\n defaultDb.close();\r\n\r\n const settings = workspace.settings;\r\n await workspace.loadSettingsDictionary(\r\n { dbName: \"db1\", containerId: \"default\", baseUri: \"\", storageType: \"azure\", resourceName: \"default-settings\", priority: SettingsPriority.defaults });\r\n expect(settings.getSetting(\"editor/renderWhitespace\")).equals(\"selection\");\r\n\r\n const workspaceName = \"all fonts workspace\";\r\n const schemaFile = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n const fontsDb = await makeEditableDb({ containerId: \"fonts\", dbName: \"fonts\", baseUri: \"\", storageType: \"azure\" }, { workspaceName, contactName: \"font guy\" });\r\n\r\n fontsDb.addFile(\"Helvetica.ttf\", schemaFile, \"ttf\");\r\n fontsDb.close();\r\n });\r\n\r\n\r\n\r\ndescribe(\"workspace db version cache key\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n function getContainer(containerId: string, props?: Partial<WorkspaceContainerProps>) {\r\n return editor.getContainer({ containerId, baseUri: \"\", storageType: \"azure\", accessToken: \"\", ...props });\r\n }\r\n\r\n function createFakeCloudContainer(containerId: string): CloudSqlite.CloudContainer {\r\n return {\r\n connect: () => { },\r\n disconnect: () => { },\r\n checkForChanges: () => { },\r\n queryDatabase: () => undefined,\r\n queryDatabases: () => [],\r\n acquireWriteLock: () => { },\r\n releaseWriteLock: () => { },\r\n abandonChanges: () => { },\r\n containerId,\r\n baseUri: \"https://example.invalid\",\r\n storageType: \"azure\",\r\n isPublic: false,\r\n } as unknown as CloudSqlite.CloudContainer;\r\n }\r\n\r\n function stubCloudLookup(containerId: string, resolveVersion: (props: WorkspaceDbProps) => string) {\r\n sinon.stub(CloudSqlite, \"createCloudContainer\").returns(createFakeCloudContainer(containerId));\r\n sinon.stub(CloudSqlite, \"querySemverMatch\").callsFake((props) => CloudSqlite.makeSemverName(props.dbName, resolveVersion(props)));\r\n sinon.stub(CloudSqlite, \"isSemverEditable\").returns(true);\r\n }\r\n\r\n it(\"local getWorkspaceDb ignores version selectors for cache identity\", async () => {\r\n const container = getContainer(\"workspace-cache-local\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cache-local\" } });\r\n\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\", includePrerelease: true });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"local createDb with omitted dbName matches an explicit default-name lookup\", async () => {\r\n const container = getContainer(\"workspace-cache-local-default-name\");\r\n const db1 = await container.createDb({ manifest: { workspaceName: \"workspace-cache-local-default-name\" } });\r\n\r\n const db2 = container.getEditableDb({ dbName: \"workspace-db\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb reuses the same instance for semver-equivalent selectors\", () => {\r\n const containerId = \"workspace-cache-cloud-equivalent\";\r\n stubCloudLookup(containerId, (props) => props.version === \"1\" ? \"1.0.0\" : (props.version ?? \"1.0.0\"));\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb returns different instances for different resolved versions\", () => {\r\n const containerId = \"workspace-cache-cloud-different\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"1.0.0\");\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"2.0.0\" });\r\n expect(db1).to.not.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb respects includePrerelease only when it resolves differently\", () => {\r\n const containerId = \"workspace-cache-cloud-prerelease\";\r\n stubCloudLookup(containerId, (props) => props.includePrerelease ? \"1.1.0-beta.1\" : \"1.0.0\");\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const stable = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\" });\r\n const prerelease = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\", includePrerelease: true });\r\n expect(stable).to.not.equal(prerelease);\r\n });\r\n\r\n it(\"createDb with explicit version returns the cached editable db for that resolved version\", async () => {\r\n const containerId = \"workspace-create-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db = await container.createDb({ dbName: \"test-db\", version: \"1.0.0\", manifest: { workspaceName: \"workspace-create-version\" } });\r\n\r\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db).to.equal(dbAgain);\r\n });\r\n\r\n it(\"createDb without an explicit version returns the cached editable db for version 0.0.0\", async () => {\r\n const containerId = \"workspace-create-default-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db = await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-create-default-version\" } });\r\n\r\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" });\r\n expect(db).to.equal(dbAgain);\r\n });\r\n\r\n it(\"cloud createDb uploads using the requested version\", async () => {\r\n const containerId = \"workspace-cloud-explicit-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n await container.createDb({ dbName: \"test-db\", version: \"1.2.3\", manifest: { workspaceName: \"workspace-cloud-explicit-version\" } });\r\n\r\n expect(uploadDb.calledOnce).to.be.true;\r\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:1.2.3\");\r\n });\r\n\r\n it(\"cloud createDb defaults omitted version to 0.0.0\", async () => {\r\n const containerId = \"workspace-cloud-default-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cloud-default-version\" } });\r\n\r\n expect(uploadDb.calledOnce).to.be.true;\r\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:0.0.0\");\r\n });\r\n});\r\n\r\n describe(\"getContainerAsync token resolution\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n it(\"preserves an explicitly-provided accessToken\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"explicit-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n accessToken: \"my-explicit-token\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"my-explicit-token\");\r\n });\r\n\r\n it(\"uses empty token for local containers with empty baseUri\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"local-token-test\",\r\n baseUri: \"\",\r\n storageType: \"azure\",\r\n };\r\n\r\n await workspace.getContainerAsync(props);\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"\");\r\n });\r\n\r\n it(\"calls requestToken when no accessToken is provided for a cloud container\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").resolves(\"resolved-token\");\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"cloud-no-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.calledOnce).to.be.true;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"resolved-token\");\r\n });\r\n });\r\n\r\n describe(\"findContainers\", () => {\r\n const testContainerId = \"mock-workspace-container-id\";\r\n const testITwinId = \"mock-itwin-id\";\r\n const testIModelId = \"mock-imodel-id\";\r\n let savedService: BlobContainer.ContainerService | undefined;\r\n\r\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\r\n return {\r\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\r\n delete: async () => {},\r\n queryScope: async () => ({ iTwinId: testITwinId }),\r\n queryMetadata: async () => ({ containerType: \"workspace\", label: \"mock\" }),\r\n queryContainersMetadata: async (_userToken, args) => {\r\n return containers.filter((c) =>\r\n (args.containerType === undefined || c.containerType === args.containerType) &&\r\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\r\n );\r\n },\r\n updateJson: async () => {},\r\n requestToken: async (_props) => ({\r\n token: \"\",\r\n scope: { iTwinId: testITwinId },\r\n provider: \"azure\" as const,\r\n expiration: new Date(Date.now() + 3600000),\r\n metadata: { containerType: \"workspace\", label: \"mock\" },\r\n baseUri: \"\",\r\n }),\r\n };\r\n }\r\n\r\n before(() => {\r\n savedService = BlobContainer.service;\r\n });\r\n\r\n afterEach(() => {\r\n BlobContainer.service = savedService;\r\n });\r\n\r\n it(\"finds containers by iTwinId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: testContainerId, containerType: \"workspace\", label: \"Test Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\r\n });\r\n\r\n it(\"finds a container by iTwinId and iModelId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: \"imodel-scoped-container\", containerType: \"workspace\", label: \"iModel Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\r\n });\r\n\r\n it(\"returns empty array when no workspace containers are found\", async () => {\r\n BlobContainer.service = createMockService([]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\r\n expect(containers).to.have.length(0);\r\n });\r\n\r\n it(\"throws when BlobContainer.service is not available\", async () => {\r\n BlobContainer.service = undefined;\r\n\r\n await expect(editor.findContainers({ iTwinId: testITwinId }))\r\n .to.be.rejectedWith(/BlobContainer.service is not available/);\r\n });\r\n });\r\n\r\n});\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"iModelDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/iModelDb.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAI/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAmB,CAAC;IAExB,MAAM,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YACtF,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEzE,IAAI,CAAC;gBACH,MAAM,IAAI,GAA6B,EAAE,CAAC,MAAM,EAAE,CAAC;gBAEnD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;gBAE/C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACnC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { GuidString } from \"@itwin/core-bentley\";\nimport { BriefcaseConnectionProps } from \"@itwin/core-common\";\nimport { assert } from \"chai\";\nimport { BriefcaseDb, BriefcaseManager } from \"../../core-backend\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\n\ndescribe(\"BriefcaseDb\", () => {\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"BriefcaseDbTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n\n after(() => HubMock.shutdown());\n\n describe(\"toJSON\", () => {\n it(\"should include briefcaseId in the returned BriefcaseConnectionProps\", async () => {\n const iModelId = await HubMock.createNewIModel({ iModelName: \"ToJsonTest\", iTwinId });\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\n const db = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n\n try {\n const json: BriefcaseConnectionProps = db.toJSON();\n\n assert.isDefined(json.briefcaseId);\n assert.equal(json.briefcaseId, db.briefcaseId);\n\n assert.isDefined(json.rootSubject);\n assert.isDefined(json.key);\n assert.isDefined(json.projectExtents);\n } finally {\n db.close();\n }\n });\n });\n});\n"]}
1
+ {"version":3,"file":"iModelDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/iModelDb.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAI/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAmB,CAAC;IAExB,MAAM,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YACtF,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEzE,IAAI,CAAC;gBACH,MAAM,IAAI,GAA6B,EAAE,CAAC,MAAM,EAAE,CAAC;gBAEnD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;gBAE/C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACnC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { GuidString } from \"@itwin/core-bentley\";\r\nimport { BriefcaseConnectionProps } from \"@itwin/core-common\";\r\nimport { assert } from \"chai\";\r\nimport { BriefcaseDb, BriefcaseManager } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\n\r\ndescribe(\"BriefcaseDb\", () => {\r\n let iTwinId: GuidString;\r\n\r\n before(() => {\r\n HubMock.startup(\"BriefcaseDbTest\", KnownTestLocations.outputDir);\r\n iTwinId = HubMock.iTwinId;\r\n });\r\n\r\n after(() => HubMock.shutdown());\r\n\r\n describe(\"toJSON\", () => {\r\n it(\"should include briefcaseId in the returned BriefcaseConnectionProps\", async () => {\r\n const iModelId = await HubMock.createNewIModel({ iModelName: \"ToJsonTest\", iTwinId });\r\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\r\n const db = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\r\n\r\n try {\r\n const json: BriefcaseConnectionProps = db.toJSON();\r\n\r\n assert.isDefined(json.briefcaseId);\r\n assert.equal(json.briefcaseId, db.briefcaseId);\r\n\r\n assert.isDefined(json.rootSubject);\r\n assert.isDefined(json.key);\r\n assert.isDefined(json.projectExtents);\r\n } finally {\r\n db.close();\r\n }\r\n });\r\n });\r\n});\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsDb.test.js","sourceRoot":"","sources":["../../../../src/test/workspace/SettingsDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { expect } from \"chai\";\nimport * as sinon from \"sinon\";\nimport { WorkspaceError } from \"@itwin/core-common\";\nimport { CloudSqlite } from \"../../CloudSqlite\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { SettingsPriority } from \"../../workspace/Settings\";\nimport { EditableSettingsCloudContainer, SettingsEditor } from \"../../workspace/SettingsEditor\";\nimport { SettingsDbProps } from \"../../workspace/SettingsDb\";\nimport { SettingsDbImpl } from \"../../internal/workspace/SettingsDbImpl\";\nimport { BlobContainer } from \"../../BlobContainerService\";\n\ndescribe(\"SettingsDb\", () => {\n let editor: SettingsEditor;\n\n before(async () => {\n await IModelHost.startup();\n editor = SettingsEditor.construct();\n });\n\n after(() => {\n editor.close();\n });\n\n function getContainer(containerId: string, baseUri = \"\"): EditableSettingsCloudContainer {\n return editor.getContainer({ containerId, baseUri, storageType: \"azure\", accessToken: \"\" });\n }\n\n it(\"SettingsDbImpl construction\", async () => {\n const container = getContainer(\"construct-test\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"construct-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.dbName).to.equal(\"test-db\");\n expect(settingsDb.priority).to.equal(SettingsPriority.application);\n expect(settingsDb.isOpen).to.be.false;\n expect(settingsDb.container).to.equal(container);\n expect(settingsDb.version).to.equal(\"0.0.0\");\n });\n\n it(\"open and close\", async () => {\n const container = getContainer(\"open-close-test\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"open-close-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.isOpen).to.be.false;\n\n settingsDb.open();\n expect(settingsDb.isOpen).to.be.true;\n\n settingsDb.close();\n expect(settingsDb.isOpen).to.be.false;\n\n // closing an already-closed db is safe\n settingsDb.close();\n expect(settingsDb.isOpen).to.be.false;\n });\n\n it(\"getSetting reads a written setting\", async () => {\n const container = getContainer(\"get-setting-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"get-setting-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({\n \"setting1\": \"value1\",\n \"setting2\": 42,\n \"setting3\": true,\n });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.iTwin);\n settingsDb.open();\n\n expect(settingsDb.getSetting<string>(\"setting1\")).to.equal(\"value1\");\n expect(settingsDb.getSetting<number>(\"setting2\")).to.equal(42);\n expect(settingsDb.getSetting<boolean>(\"setting3\")).to.equal(true);\n\n settingsDb.close();\n });\n\n it(\"getSettings reads all settings\", async () => {\n const container = getContainer(\"get-settings-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"get-settings-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({\n \"keyA\": \"valA\",\n \"keyB\": 100,\n \"keyC\": [1, 2, 3],\n });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.organization);\n settingsDb.open();\n\n const all = settingsDb.getSettings();\n expect(all.keyA).to.equal(\"valA\");\n expect(all.keyB).to.equal(100);\n expect(all.keyC).to.deep.equal([1, 2, 3]);\n\n settingsDb.close();\n });\n\n it(\"getSetting returns undefined for non-existent setting\", async () => {\n const container = getContainer(\"no-setting-test\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"no-setting-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.defaults);\n settingsDb.open();\n\n expect(settingsDb.getSetting(\"nonExistentSetting\")).to.be.undefined;\n\n settingsDb.close();\n });\n\n it(\"manifest reads stored manifest\", async () => {\n const container = getContainer(\"manifest-test\");\n await container.createDb({\n dbName: \"test-db\",\n manifest: { settingsName: \"My Settings DB\", description: \"A test settings database\" },\n });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n\n // manifest auto-opens the db via withOpenDb when not explicitly opened\n const manifest = settingsDb.manifest;\n expect(manifest.settingsName).to.equal(\"My Settings DB\");\n expect(manifest.description).to.equal(\"A test settings database\");\n expect(settingsDb.isOpen).to.be.false;\n });\n\n it(\"getSetting auto-opens and auto-closes when db is not open\", async () => {\n const container = getContainer(\"auto-open-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"auto-open-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({ \"key\": \"auto-value\" });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.isOpen).to.be.false;\n\n // getSetting should auto-open, read, and auto-close\n expect(settingsDb.getSetting<string>(\"key\")).to.equal(\"auto-value\");\n expect(settingsDb.isOpen).to.be.false;\n });\n\n it(\"removeSetting removes a setting\", async () => {\n const container = getContainer(\"remove-setting-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"remove-setting-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({ \"toKeep\": 1, \"toRemove\": 2 });\n editableDb.close();\n\n // Verify both exist\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n settingsDb.open();\n expect(settingsDb.getSetting(\"toKeep\")).to.equal(1);\n expect(settingsDb.getSetting(\"toRemove\")).to.equal(2);\n settingsDb.close();\n\n // Remove one\n editableDb.open();\n editableDb.removeSetting(\"toRemove\");\n editableDb.close();\n\n // Verify only one remains\n settingsDb.open();\n const all = settingsDb.getSettings();\n expect(all.toKeep).to.equal(1);\n expect(all.toRemove).to.be.undefined;\n expect(settingsDb.getSetting(\"toRemove\")).to.be.undefined;\n settingsDb.close();\n });\n\n it(\"close updates lastEditedBy in manifest when write lock is held\", async () => {\n const container = getContainer(\"manifest-update-test\");\n const editableDb = await container.createDb({\n dbName: \"test-db\",\n manifest: { settingsName: \"manifest-update-test\", contactName: \"Original Author\" },\n });\n\n // For local (non-cloud) containers, acquireWriteLock is a no-op,\n // so lastEditedBy should remain unchanged after close.\n container.acquireWriteLock(\"Jane Admin\");\n editableDb.open();\n editableDb.updateSettings({ \"key\": \"value\" });\n editableDb.close();\n container.releaseWriteLock();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n const manifest = settingsDb.manifest;\n expect(manifest.settingsName).to.equal(\"manifest-update-test\");\n expect(manifest.contactName).to.equal(\"Original Author\");\n // lastEditedBy is only auto-set for cloud containers (where acquireWriteLock actually tracks the user)\n expect(manifest.lastEditedBy).to.be.undefined;\n });\n\n it(\"getSettingsDb returns a SettingsDb from a loaded container\", async () => {\n const container = getContainer(\"getsettingsdb-test\");\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"getsettingsdb-test\" } });\n\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"getsettingsdb-test\", priority: SettingsPriority.iTwin });\n expect(settingsDb).to.not.be.undefined;\n expect(settingsDb.dbName).to.equal(\"settings-db\");\n expect(settingsDb.manifest.settingsName).to.equal(\"getsettingsdb-test\");\n });\n\n it(\"getSettingsDb throws for unloaded container\", () => {\n expect(() => editor.workspace.getSettingsDb({ containerId: \"nonexistent-container-id\", priority: SettingsPriority.iTwin }))\n .to.throw()\n .and.satisfy((e: unknown) => WorkspaceError.isError(e, \"does-not-exist\"));\n });\n\n it(\"getSettingsDb uses caller-supplied priority\", async () => {\n const container = getContainer(\"imodel-scope-test\");\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"imodel-scope-test\" } });\n\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"imodel-scope-test\", priority: SettingsPriority.iModel });\n expect(settingsDb).to.not.be.undefined;\n expect(settingsDb.priority).to.equal(SettingsPriority.iModel);\n });\n\n it(\"getSettingsDb respects iTwin priority\", async () => {\n const container = getContainer(\"itwin-priority-test\");\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"itwin-priority-test\" } });\n\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"itwin-priority-test\", priority: SettingsPriority.iTwin });\n expect(settingsDb.priority).to.equal(SettingsPriority.iTwin);\n });\n\n it(\"hasSettingsManifestProperty returns true for SettingsDb containers\", async () => {\n const container = getContainer(\"has-manifest-test\");\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"has-manifest-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"settings-db\" }, container, SettingsPriority.application);\n expect(settingsDb.hasSettingsManifestProperty).to.be.true;\n });\n\n it(\"getSetting returns undefined on empty db\", async () => {\n const container = getContainer(\"missing-setting-test\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"missing-setting-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n settingsDb.open();\n expect(settingsDb.getSetting(\"does-not-exist\")).to.be.undefined;\n settingsDb.close();\n });\n\n it(\"editor close is resilient to container cleanup failures\", () => {\n // Verify that closing an editor with no containers doesn't throw\n const freshEditor = SettingsEditor.construct();\n expect(() => freshEditor.close()).to.not.throw();\n });\n\n it(\"getSettingsDb with custom dbName\", async () => {\n const container = getContainer(\"custom-dbname-test\");\n await container.createDb({ dbName: \"my-custom-db\", manifest: { settingsName: \"custom-dbname\" } });\n\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"custom-dbname-test\", priority: SettingsPriority.application, dbName: \"my-custom-db\" });\n expect(settingsDb.dbName).to.equal(\"my-custom-db\");\n });\n\n it(\"iTwin and iModel settings containers coexist with correct priorities\", async () => {\n // Simulate the real scenario: an iTwin has its own settings container, and one of its\n // iModels also has a settings container. Both are loaded into the workspace with separate\n // containerId GUIDs (assigned by the storage container service) and different priorities.\n const itwinContainer = getContainer(\"itwin-container-guid\");\n const imodelContainer = getContainer(\"imodel-container-guid\");\n\n const itwinDb = await itwinContainer.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"iTwin Settings\" } });\n const imodelDb = await imodelContainer.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"iModel Settings\" } });\n\n // Write the same setting name to both, with different values\n itwinDb.open();\n itwinDb.updateSettings({ \"theme\": \"light\", \"itwinOnly\": true });\n itwinDb.close();\n\n imodelDb.open();\n imodelDb.updateSettings({ \"theme\": \"dark\", \"imodelOnly\": true });\n imodelDb.close();\n\n // Retrieve both via getSettingsDb with the priorities a real caller would assign\n const itwinSettingsDb = editor.workspace.getSettingsDb({ containerId: \"itwin-container-guid\", priority: SettingsPriority.iTwin });\n const imodelSettingsDb = editor.workspace.getSettingsDb({ containerId: \"imodel-container-guid\", priority: SettingsPriority.iModel });\n\n // Verify they are independent dbs with correct priorities\n expect(itwinSettingsDb.priority).to.equal(SettingsPriority.iTwin);\n expect(imodelSettingsDb.priority).to.equal(SettingsPriority.iModel);\n expect(imodelSettingsDb.priority).to.be.greaterThan(itwinSettingsDb.priority);\n\n // Verify each db returns its own setting values\n expect(itwinSettingsDb.getSetting<string>(\"theme\")).to.equal(\"light\");\n expect(itwinSettingsDb.getSetting<boolean>(\"itwinOnly\")).to.equal(true);\n\n expect(imodelSettingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\n expect(imodelSettingsDb.getSetting<boolean>(\"imodelOnly\")).to.equal(true);\n });\n\n it(\"SettingsEditor uses a separate cloud cache from the read-only Workspace\", () => {\n const editorCache = editor.workspace.getCloudCache();\n const workspaceCache = IModelHost.appWorkspace.getCloudCache();\n expect(editorCache.name).to.equal(\"SettingsEditor\");\n expect(workspaceCache.name).to.equal(\"Workspace\");\n expect(editorCache).to.not.equal(workspaceCache);\n });\n\n describe(\"findContainers\", () => {\n const testContainerId = \"mock-settings-container-id\";\n const testITwinId = \"mock-itwin-id\";\n const testIModelId = \"mock-imodel-id\";\n let savedService: BlobContainer.ContainerService | undefined;\n\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\n return {\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\n delete: async () => {},\n queryScope: async () => ({ iTwinId: testITwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"mock\" }),\n queryContainersMetadata: async (_userToken, args) => {\n // Filter by containerType and iTwinId like the real service would\n return containers.filter((c) =>\n (args.containerType === undefined || c.containerType === args.containerType) &&\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\n );\n },\n updateJson: async () => {},\n requestToken: async (_props) => ({\n token: \"\",\n scope: { iTwinId: testITwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: \"mock\" },\n baseUri: \"\",\n }),\n };\n }\n\n before(() => {\n savedService = BlobContainer.service;\n });\n\n afterEach(() => {\n BlobContainer.service = savedService;\n });\n\n it(\"finds containers by iTwinId\", async () => {\n BlobContainer.service = createMockService([\n { containerId: testContainerId, containerType: \"settings\", label: \"Test Settings\" },\n ]);\n\n const containers = await editor.findContainers({ iTwinId: testITwinId });\n expect(containers).to.have.length(1);\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\n });\n\n it(\"finds a container by iTwinId and iModelId\", async () => {\n BlobContainer.service = createMockService([\n { containerId: \"imodel-scoped-container\", containerType: \"settings\", label: \"iModel Settings\" },\n ]);\n\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\n expect(containers).to.have.length(1);\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\n });\n\n it(\"returns empty array when no settings containers are found\", async () => {\n BlobContainer.service = createMockService([]);\n\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\n expect(containers).to.have.length(0);\n });\n\n it(\"throws when BlobContainer.service is not available\", async () => {\n BlobContainer.service = undefined;\n\n await expect(editor.findContainers({ iTwinId: testITwinId }))\n .to.be.rejectedWith(/BlobContainer.service is not available/);\n });\n });\n\n describe(\"getSettings\", () => {\n it(\"returns a deep copy of all settings\", async () => {\n const container = getContainer(\"getsettings-deep-copy-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"getsettings-deep-copy-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({\n \"theme\": \"dark\",\n \"fontSize\": 14,\n \"nested\": { \"a\": 1, \"b\": [2, 3] },\n });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n const all = settingsDb.getSettings();\n expect(all).to.deep.equal({ \"theme\": \"dark\", \"fontSize\": 14, \"nested\": { \"a\": 1, \"b\": [2, 3] } });\n\n // Mutating the copy should not affect the stored settings\n (all as any).theme = \"light\";\n (all as any).nested.a = 999;\n expect(settingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\n expect(settingsDb.getSetting<{ a: number }>(\"nested\")).to.deep.equal({ \"a\": 1, \"b\": [2, 3] });\n });\n\n it(\"returns empty object for empty db\", async () => {\n const container = getContainer(\"getsettings-empty-test\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"getsettings-empty-test\" } });\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.getSettings()).to.deep.equal({});\n });\n });\n\n it(\"getSetting returns undefined for inherited prototype properties\", async () => {\n const container = getContainer(\"prototype-safety-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"prototype-safety-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({ \"realSetting\": \"value\" });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.getSetting<string>(\"realSetting\")).to.equal(\"value\");\n expect(settingsDb.getSetting(\"constructor\")).to.be.undefined;\n expect(settingsDb.getSetting(\"toString\")).to.be.undefined;\n });\n\n\n\n describe(\"editable db version cache key\", () => {\n afterEach(() => sinon.restore());\n\n function createFakeCloudContainer(containerId: string): CloudSqlite.CloudContainer {\n return {\n connect: () => { },\n disconnect: () => { },\n checkForChanges: () => { },\n queryDatabase: () => undefined,\n queryDatabases: () => [],\n acquireWriteLock: () => { },\n releaseWriteLock: () => { },\n abandonChanges: () => { },\n containerId,\n baseUri: \"https://example.invalid\",\n storageType: \"azure\",\n isPublic: false,\n } as unknown as CloudSqlite.CloudContainer;\n }\n\n function stubCloudLookup(containerId: string, resolveVersion: (props: SettingsDbProps) => string) {\n sinon.stub(CloudSqlite, \"createCloudContainer\").returns(createFakeCloudContainer(containerId));\n sinon.stub(CloudSqlite, \"querySemverMatch\").callsFake((props) => CloudSqlite.makeSemverName(props.dbName ?? \"settings-db\", resolveVersion(props)));\n sinon.stub(CloudSqlite, \"isSemverEditable\").returns(true);\n }\n\n it(\"local getEditableDb ignores version selectors for cache identity\", async () => {\n const container = getContainer(\"cache-local-version-selectors\");\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"cache-local-version-selectors\" } });\n\n const db1 = container.getEditableDb({ dbName: \"test-db\" });\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"local getEditableDb reuses the same instance for omitted vs explicit default dbName\", async () => {\n const container = getContainer(\"cache-local-default-name\");\n const db1 = await container.createDb({ manifest: { settingsName: \"cache-local-default-name\" } });\n\n const db2 = container.getEditableDb({ dbName: \"settings-db\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"cloud getEditableDb reuses the same instance for omitted vs explicit resolved version\", () => {\n const containerId = \"cache-cloud-default-vs-resolved\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n\n const container = getContainer(containerId, \"https://example.invalid\");\n const db1 = container.getEditableDb({ dbName: \"test-db\" });\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"cloud getEditableDb reuses the same instance for semver-equivalent selectors\", () => {\n const containerId = \"cache-cloud-semver-equivalent\";\n stubCloudLookup(containerId, (props) => props.version === \"1\" ? \"1.0.0\" : (props.version ?? \"1.0.0\"));\n\n const container = getContainer(containerId, \"https://example.invalid\");\n const db1 = container.getEditableDb({ dbName: \"test-db\", version: \"1\" });\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\n expect(db1).to.equal(db2);\n });\n\n it(\"cloud getEditableDb returns different instances for different resolved versions\", () => {\n const containerId = \"cache-cloud-different-versions\";\n stubCloudLookup(containerId, (props) => props.version ?? \"1.0.0\");\n\n const container = getContainer(containerId, \"https://example.invalid\");\n const db1 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"2.0.0\" });\n expect(db1).to.not.equal(db2);\n });\n\n it(\"createDb with explicit version returns db matching that resolved version\", async () => {\n const containerId = \"cache-create-explicit-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, \"https://example.invalid\");\n const db = await container.createDb({ dbName: \"test-db\", version: \"1.0.0\", manifest: { settingsName: \"cache-create-explicit-version\" } });\n\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\n expect(db).to.equal(dbAgain);\n });\n\n it(\"createDb without an explicit version returns the new 0.0.0 db instead of the latest match\", async () => {\n const containerId = \"cache-create-default-version\";\n stubCloudLookup(containerId, (props) => props.version ?? \"2.0.0\");\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\n\n const container = getContainer(containerId, \"https://example.invalid\");\n const db = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"cache-create-default-version\" } });\n\n expect(db.version).to.equal(\"0.0.0\");\n expect(db).to.equal(container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" }));\n expect(db).to.not.equal(container.getEditableDb({ dbName: \"test-db\" }));\n });\n });\n\n describe(\"updateSetting\", () => {\n it(\"adds a setting to an empty db\", async () => {\n const container = getContainer(\"updatesetting-new-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-new-test\" } });\n\n editableDb.open();\n editableDb.updateSetting({ settingName: \"myKey\", value: \"myValue\" });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.getSetting<string>(\"myKey\")).to.equal(\"myValue\");\n });\n\n it(\"patches existing settings without losing other keys\", async () => {\n const container = getContainer(\"updatesetting-patch-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-patch-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({\n \"theme\": \"light\",\n \"fontSize\": 12,\n \"showGrid\": true,\n });\n\n // Patch just one key\n editableDb.updateSetting({ settingName: \"theme\", value: \"dark\" });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\n expect(settingsDb.getSetting<number>(\"fontSize\")).to.equal(12);\n expect(settingsDb.getSetting<boolean>(\"showGrid\")).to.equal(true);\n });\n\n it(\"adds a new key to existing settings\", async () => {\n const container = getContainer(\"updatesetting-addkey-test\");\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-addkey-test\" } });\n\n editableDb.open();\n editableDb.updateSettings({ \"existing\": \"value\" });\n\n editableDb.updateSetting({ settingName: \"newKey\", value: 42 });\n editableDb.close();\n\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\n expect(settingsDb.getSetting<string>(\"existing\")).to.equal(\"value\");\n expect(settingsDb.getSetting<number>(\"newKey\")).to.equal(42);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"SettingsDb.test.js","sourceRoot":"","sources":["../../../../src/test/workspace/SettingsDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { SettingsPriority } from \"../../workspace/Settings\";\r\nimport { EditableSettingsCloudContainer, SettingsEditor } from \"../../workspace/SettingsEditor\";\r\nimport { SettingsDbProps } from \"../../workspace/SettingsDb\";\r\nimport { SettingsDbImpl } from \"../../internal/workspace/SettingsDbImpl\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\ndescribe(\"SettingsDb\", () => {\r\n let editor: SettingsEditor;\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n editor = SettingsEditor.construct();\r\n });\r\n\r\n after(() => {\r\n editor.close();\r\n });\r\n\r\n function getContainer(containerId: string, baseUri = \"\"): EditableSettingsCloudContainer {\r\n return editor.getContainer({ containerId, baseUri, storageType: \"azure\", accessToken: \"\" });\r\n }\r\n\r\n it(\"SettingsDbImpl construction\", async () => {\r\n const container = getContainer(\"construct-test\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"construct-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.dbName).to.equal(\"test-db\");\r\n expect(settingsDb.priority).to.equal(SettingsPriority.application);\r\n expect(settingsDb.isOpen).to.be.false;\r\n expect(settingsDb.container).to.equal(container);\r\n expect(settingsDb.version).to.equal(\"0.0.0\");\r\n });\r\n\r\n it(\"open and close\", async () => {\r\n const container = getContainer(\"open-close-test\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"open-close-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.isOpen).to.be.false;\r\n\r\n settingsDb.open();\r\n expect(settingsDb.isOpen).to.be.true;\r\n\r\n settingsDb.close();\r\n expect(settingsDb.isOpen).to.be.false;\r\n\r\n // closing an already-closed db is safe\r\n settingsDb.close();\r\n expect(settingsDb.isOpen).to.be.false;\r\n });\r\n\r\n it(\"getSetting reads a written setting\", async () => {\r\n const container = getContainer(\"get-setting-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"get-setting-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({\r\n \"setting1\": \"value1\",\r\n \"setting2\": 42,\r\n \"setting3\": true,\r\n });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.iTwin);\r\n settingsDb.open();\r\n\r\n expect(settingsDb.getSetting<string>(\"setting1\")).to.equal(\"value1\");\r\n expect(settingsDb.getSetting<number>(\"setting2\")).to.equal(42);\r\n expect(settingsDb.getSetting<boolean>(\"setting3\")).to.equal(true);\r\n\r\n settingsDb.close();\r\n });\r\n\r\n it(\"getSettings reads all settings\", async () => {\r\n const container = getContainer(\"get-settings-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"get-settings-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({\r\n \"keyA\": \"valA\",\r\n \"keyB\": 100,\r\n \"keyC\": [1, 2, 3],\r\n });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.organization);\r\n settingsDb.open();\r\n\r\n const all = settingsDb.getSettings();\r\n expect(all.keyA).to.equal(\"valA\");\r\n expect(all.keyB).to.equal(100);\r\n expect(all.keyC).to.deep.equal([1, 2, 3]);\r\n\r\n settingsDb.close();\r\n });\r\n\r\n it(\"getSetting returns undefined for non-existent setting\", async () => {\r\n const container = getContainer(\"no-setting-test\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"no-setting-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.defaults);\r\n settingsDb.open();\r\n\r\n expect(settingsDb.getSetting(\"nonExistentSetting\")).to.be.undefined;\r\n\r\n settingsDb.close();\r\n });\r\n\r\n it(\"manifest reads stored manifest\", async () => {\r\n const container = getContainer(\"manifest-test\");\r\n await container.createDb({\r\n dbName: \"test-db\",\r\n manifest: { settingsName: \"My Settings DB\", description: \"A test settings database\" },\r\n });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n\r\n // manifest auto-opens the db via withOpenDb when not explicitly opened\r\n const manifest = settingsDb.manifest;\r\n expect(manifest.settingsName).to.equal(\"My Settings DB\");\r\n expect(manifest.description).to.equal(\"A test settings database\");\r\n expect(settingsDb.isOpen).to.be.false;\r\n });\r\n\r\n it(\"getSetting auto-opens and auto-closes when db is not open\", async () => {\r\n const container = getContainer(\"auto-open-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"auto-open-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({ \"key\": \"auto-value\" });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.isOpen).to.be.false;\r\n\r\n // getSetting should auto-open, read, and auto-close\r\n expect(settingsDb.getSetting<string>(\"key\")).to.equal(\"auto-value\");\r\n expect(settingsDb.isOpen).to.be.false;\r\n });\r\n\r\n it(\"removeSetting removes a setting\", async () => {\r\n const container = getContainer(\"remove-setting-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"remove-setting-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({ \"toKeep\": 1, \"toRemove\": 2 });\r\n editableDb.close();\r\n\r\n // Verify both exist\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n settingsDb.open();\r\n expect(settingsDb.getSetting(\"toKeep\")).to.equal(1);\r\n expect(settingsDb.getSetting(\"toRemove\")).to.equal(2);\r\n settingsDb.close();\r\n\r\n // Remove one\r\n editableDb.open();\r\n editableDb.removeSetting(\"toRemove\");\r\n editableDb.close();\r\n\r\n // Verify only one remains\r\n settingsDb.open();\r\n const all = settingsDb.getSettings();\r\n expect(all.toKeep).to.equal(1);\r\n expect(all.toRemove).to.be.undefined;\r\n expect(settingsDb.getSetting(\"toRemove\")).to.be.undefined;\r\n settingsDb.close();\r\n });\r\n\r\n it(\"close updates lastEditedBy in manifest when write lock is held\", async () => {\r\n const container = getContainer(\"manifest-update-test\");\r\n const editableDb = await container.createDb({\r\n dbName: \"test-db\",\r\n manifest: { settingsName: \"manifest-update-test\", contactName: \"Original Author\" },\r\n });\r\n\r\n // For local (non-cloud) containers, acquireWriteLock is a no-op,\r\n // so lastEditedBy should remain unchanged after close.\r\n container.acquireWriteLock(\"Jane Admin\");\r\n editableDb.open();\r\n editableDb.updateSettings({ \"key\": \"value\" });\r\n editableDb.close();\r\n container.releaseWriteLock();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n const manifest = settingsDb.manifest;\r\n expect(manifest.settingsName).to.equal(\"manifest-update-test\");\r\n expect(manifest.contactName).to.equal(\"Original Author\");\r\n // lastEditedBy is only auto-set for cloud containers (where acquireWriteLock actually tracks the user)\r\n expect(manifest.lastEditedBy).to.be.undefined;\r\n });\r\n\r\n it(\"getSettingsDb returns a SettingsDb from a loaded container\", async () => {\r\n const container = getContainer(\"getsettingsdb-test\");\r\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"getsettingsdb-test\" } });\r\n\r\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"getsettingsdb-test\", priority: SettingsPriority.iTwin });\r\n expect(settingsDb).to.not.be.undefined;\r\n expect(settingsDb.dbName).to.equal(\"settings-db\");\r\n expect(settingsDb.manifest.settingsName).to.equal(\"getsettingsdb-test\");\r\n });\r\n\r\n it(\"getSettingsDb throws for unloaded container\", () => {\r\n expect(() => editor.workspace.getSettingsDb({ containerId: \"nonexistent-container-id\", priority: SettingsPriority.iTwin }))\r\n .to.throw()\r\n .and.satisfy((e: unknown) => WorkspaceError.isError(e, \"does-not-exist\"));\r\n });\r\n\r\n it(\"getSettingsDb uses caller-supplied priority\", async () => {\r\n const container = getContainer(\"imodel-scope-test\");\r\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"imodel-scope-test\" } });\r\n\r\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"imodel-scope-test\", priority: SettingsPriority.iModel });\r\n expect(settingsDb).to.not.be.undefined;\r\n expect(settingsDb.priority).to.equal(SettingsPriority.iModel);\r\n });\r\n\r\n it(\"getSettingsDb respects iTwin priority\", async () => {\r\n const container = getContainer(\"itwin-priority-test\");\r\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"itwin-priority-test\" } });\r\n\r\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"itwin-priority-test\", priority: SettingsPriority.iTwin });\r\n expect(settingsDb.priority).to.equal(SettingsPriority.iTwin);\r\n });\r\n\r\n it(\"hasSettingsManifestProperty returns true for SettingsDb containers\", async () => {\r\n const container = getContainer(\"has-manifest-test\");\r\n await container.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"has-manifest-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"settings-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.hasSettingsManifestProperty).to.be.true;\r\n });\r\n\r\n it(\"getSetting returns undefined on empty db\", async () => {\r\n const container = getContainer(\"missing-setting-test\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"missing-setting-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n settingsDb.open();\r\n expect(settingsDb.getSetting(\"does-not-exist\")).to.be.undefined;\r\n settingsDb.close();\r\n });\r\n\r\n it(\"editor close is resilient to container cleanup failures\", () => {\r\n // Verify that closing an editor with no containers doesn't throw\r\n const freshEditor = SettingsEditor.construct();\r\n expect(() => freshEditor.close()).to.not.throw();\r\n });\r\n\r\n it(\"getSettingsDb with custom dbName\", async () => {\r\n const container = getContainer(\"custom-dbname-test\");\r\n await container.createDb({ dbName: \"my-custom-db\", manifest: { settingsName: \"custom-dbname\" } });\r\n\r\n const settingsDb = editor.workspace.getSettingsDb({ containerId: \"custom-dbname-test\", priority: SettingsPriority.application, dbName: \"my-custom-db\" });\r\n expect(settingsDb.dbName).to.equal(\"my-custom-db\");\r\n });\r\n\r\n it(\"iTwin and iModel settings containers coexist with correct priorities\", async () => {\r\n // Simulate the real scenario: an iTwin has its own settings container, and one of its\r\n // iModels also has a settings container. Both are loaded into the workspace with separate\r\n // containerId GUIDs (assigned by the storage container service) and different priorities.\r\n const itwinContainer = getContainer(\"itwin-container-guid\");\r\n const imodelContainer = getContainer(\"imodel-container-guid\");\r\n\r\n const itwinDb = await itwinContainer.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"iTwin Settings\" } });\r\n const imodelDb = await imodelContainer.createDb({ dbName: \"settings-db\", manifest: { settingsName: \"iModel Settings\" } });\r\n\r\n // Write the same setting name to both, with different values\r\n itwinDb.open();\r\n itwinDb.updateSettings({ \"theme\": \"light\", \"itwinOnly\": true });\r\n itwinDb.close();\r\n\r\n imodelDb.open();\r\n imodelDb.updateSettings({ \"theme\": \"dark\", \"imodelOnly\": true });\r\n imodelDb.close();\r\n\r\n // Retrieve both via getSettingsDb with the priorities a real caller would assign\r\n const itwinSettingsDb = editor.workspace.getSettingsDb({ containerId: \"itwin-container-guid\", priority: SettingsPriority.iTwin });\r\n const imodelSettingsDb = editor.workspace.getSettingsDb({ containerId: \"imodel-container-guid\", priority: SettingsPriority.iModel });\r\n\r\n // Verify they are independent dbs with correct priorities\r\n expect(itwinSettingsDb.priority).to.equal(SettingsPriority.iTwin);\r\n expect(imodelSettingsDb.priority).to.equal(SettingsPriority.iModel);\r\n expect(imodelSettingsDb.priority).to.be.greaterThan(itwinSettingsDb.priority);\r\n\r\n // Verify each db returns its own setting values\r\n expect(itwinSettingsDb.getSetting<string>(\"theme\")).to.equal(\"light\");\r\n expect(itwinSettingsDb.getSetting<boolean>(\"itwinOnly\")).to.equal(true);\r\n\r\n expect(imodelSettingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\r\n expect(imodelSettingsDb.getSetting<boolean>(\"imodelOnly\")).to.equal(true);\r\n });\r\n\r\n it(\"SettingsEditor uses a separate cloud cache from the read-only Workspace\", () => {\r\n const editorCache = editor.workspace.getCloudCache();\r\n const workspaceCache = IModelHost.appWorkspace.getCloudCache();\r\n expect(editorCache.name).to.equal(\"SettingsEditor\");\r\n expect(workspaceCache.name).to.equal(\"Workspace\");\r\n expect(editorCache).to.not.equal(workspaceCache);\r\n });\r\n\r\n describe(\"findContainers\", () => {\r\n const testContainerId = \"mock-settings-container-id\";\r\n const testITwinId = \"mock-itwin-id\";\r\n const testIModelId = \"mock-imodel-id\";\r\n let savedService: BlobContainer.ContainerService | undefined;\r\n\r\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\r\n return {\r\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\r\n delete: async () => {},\r\n queryScope: async () => ({ iTwinId: testITwinId }),\r\n queryMetadata: async () => ({ containerType: \"settings\", label: \"mock\" }),\r\n queryContainersMetadata: async (_userToken, args) => {\r\n // Filter by containerType and iTwinId like the real service would\r\n return containers.filter((c) =>\r\n (args.containerType === undefined || c.containerType === args.containerType) &&\r\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\r\n );\r\n },\r\n updateJson: async () => {},\r\n requestToken: async (_props) => ({\r\n token: \"\",\r\n scope: { iTwinId: testITwinId },\r\n provider: \"azure\" as const,\r\n expiration: new Date(Date.now() + 3600000),\r\n metadata: { containerType: \"settings\", label: \"mock\" },\r\n baseUri: \"\",\r\n }),\r\n };\r\n }\r\n\r\n before(() => {\r\n savedService = BlobContainer.service;\r\n });\r\n\r\n afterEach(() => {\r\n BlobContainer.service = savedService;\r\n });\r\n\r\n it(\"finds containers by iTwinId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: testContainerId, containerType: \"settings\", label: \"Test Settings\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\r\n });\r\n\r\n it(\"finds a container by iTwinId and iModelId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: \"imodel-scoped-container\", containerType: \"settings\", label: \"iModel Settings\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\r\n });\r\n\r\n it(\"returns empty array when no settings containers are found\", async () => {\r\n BlobContainer.service = createMockService([]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\r\n expect(containers).to.have.length(0);\r\n });\r\n\r\n it(\"throws when BlobContainer.service is not available\", async () => {\r\n BlobContainer.service = undefined;\r\n\r\n await expect(editor.findContainers({ iTwinId: testITwinId }))\r\n .to.be.rejectedWith(/BlobContainer.service is not available/);\r\n });\r\n });\r\n\r\n describe(\"getSettings\", () => {\r\n it(\"returns a deep copy of all settings\", async () => {\r\n const container = getContainer(\"getsettings-deep-copy-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"getsettings-deep-copy-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({\r\n \"theme\": \"dark\",\r\n \"fontSize\": 14,\r\n \"nested\": { \"a\": 1, \"b\": [2, 3] },\r\n });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n const all = settingsDb.getSettings();\r\n expect(all).to.deep.equal({ \"theme\": \"dark\", \"fontSize\": 14, \"nested\": { \"a\": 1, \"b\": [2, 3] } });\r\n\r\n // Mutating the copy should not affect the stored settings\r\n (all as any).theme = \"light\";\r\n (all as any).nested.a = 999;\r\n expect(settingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\r\n expect(settingsDb.getSetting<{ a: number }>(\"nested\")).to.deep.equal({ \"a\": 1, \"b\": [2, 3] });\r\n });\r\n\r\n it(\"returns empty object for empty db\", async () => {\r\n const container = getContainer(\"getsettings-empty-test\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"getsettings-empty-test\" } });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.getSettings()).to.deep.equal({});\r\n });\r\n });\r\n\r\n it(\"getSetting returns undefined for inherited prototype properties\", async () => {\r\n const container = getContainer(\"prototype-safety-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"prototype-safety-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({ \"realSetting\": \"value\" });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.getSetting<string>(\"realSetting\")).to.equal(\"value\");\r\n expect(settingsDb.getSetting(\"constructor\")).to.be.undefined;\r\n expect(settingsDb.getSetting(\"toString\")).to.be.undefined;\r\n });\r\n\r\n\r\n\r\n describe(\"editable db version cache key\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n function createFakeCloudContainer(containerId: string): CloudSqlite.CloudContainer {\r\n return {\r\n connect: () => { },\r\n disconnect: () => { },\r\n checkForChanges: () => { },\r\n queryDatabase: () => undefined,\r\n queryDatabases: () => [],\r\n acquireWriteLock: () => { },\r\n releaseWriteLock: () => { },\r\n abandonChanges: () => { },\r\n containerId,\r\n baseUri: \"https://example.invalid\",\r\n storageType: \"azure\",\r\n isPublic: false,\r\n } as unknown as CloudSqlite.CloudContainer;\r\n }\r\n\r\n function stubCloudLookup(containerId: string, resolveVersion: (props: SettingsDbProps) => string) {\r\n sinon.stub(CloudSqlite, \"createCloudContainer\").returns(createFakeCloudContainer(containerId));\r\n sinon.stub(CloudSqlite, \"querySemverMatch\").callsFake((props) => CloudSqlite.makeSemverName(props.dbName ?? \"settings-db\", resolveVersion(props)));\r\n sinon.stub(CloudSqlite, \"isSemverEditable\").returns(true);\r\n }\r\n\r\n it(\"local getEditableDb ignores version selectors for cache identity\", async () => {\r\n const container = getContainer(\"cache-local-version-selectors\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"cache-local-version-selectors\" } });\r\n\r\n const db1 = container.getEditableDb({ dbName: \"test-db\" });\r\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"local getEditableDb reuses the same instance for omitted vs explicit default dbName\", async () => {\r\n const container = getContainer(\"cache-local-default-name\");\r\n const db1 = await container.createDb({ manifest: { settingsName: \"cache-local-default-name\" } });\r\n\r\n const db2 = container.getEditableDb({ dbName: \"settings-db\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getEditableDb reuses the same instance for omitted vs explicit resolved version\", () => {\r\n const containerId = \"cache-cloud-default-vs-resolved\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n\r\n const container = getContainer(containerId, \"https://example.invalid\");\r\n const db1 = container.getEditableDb({ dbName: \"test-db\" });\r\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getEditableDb reuses the same instance for semver-equivalent selectors\", () => {\r\n const containerId = \"cache-cloud-semver-equivalent\";\r\n stubCloudLookup(containerId, (props) => props.version === \"1\" ? \"1.0.0\" : (props.version ?? \"1.0.0\"));\r\n\r\n const container = getContainer(containerId, \"https://example.invalid\");\r\n const db1 = container.getEditableDb({ dbName: \"test-db\", version: \"1\" });\r\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getEditableDb returns different instances for different resolved versions\", () => {\r\n const containerId = \"cache-cloud-different-versions\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"1.0.0\");\r\n\r\n const container = getContainer(containerId, \"https://example.invalid\");\r\n const db1 = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n const db2 = container.getEditableDb({ dbName: \"test-db\", version: \"2.0.0\" });\r\n expect(db1).to.not.equal(db2);\r\n });\r\n\r\n it(\"createDb with explicit version returns db matching that resolved version\", async () => {\r\n const containerId = \"cache-create-explicit-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, \"https://example.invalid\");\r\n const db = await container.createDb({ dbName: \"test-db\", version: \"1.0.0\", manifest: { settingsName: \"cache-create-explicit-version\" } });\r\n\r\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db).to.equal(dbAgain);\r\n });\r\n\r\n it(\"createDb without an explicit version returns the new 0.0.0 db instead of the latest match\", async () => {\r\n const containerId = \"cache-create-default-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"2.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, \"https://example.invalid\");\r\n const db = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"cache-create-default-version\" } });\r\n\r\n expect(db.version).to.equal(\"0.0.0\");\r\n expect(db).to.equal(container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" }));\r\n expect(db).to.not.equal(container.getEditableDb({ dbName: \"test-db\" }));\r\n });\r\n });\r\n\r\n describe(\"updateSetting\", () => {\r\n it(\"adds a setting to an empty db\", async () => {\r\n const container = getContainer(\"updatesetting-new-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-new-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSetting({ settingName: \"myKey\", value: \"myValue\" });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.getSetting<string>(\"myKey\")).to.equal(\"myValue\");\r\n });\r\n\r\n it(\"patches existing settings without losing other keys\", async () => {\r\n const container = getContainer(\"updatesetting-patch-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-patch-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({\r\n \"theme\": \"light\",\r\n \"fontSize\": 12,\r\n \"showGrid\": true,\r\n });\r\n\r\n // Patch just one key\r\n editableDb.updateSetting({ settingName: \"theme\", value: \"dark\" });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.getSetting<string>(\"theme\")).to.equal(\"dark\");\r\n expect(settingsDb.getSetting<number>(\"fontSize\")).to.equal(12);\r\n expect(settingsDb.getSetting<boolean>(\"showGrid\")).to.equal(true);\r\n });\r\n\r\n it(\"adds a new key to existing settings\", async () => {\r\n const container = getContainer(\"updatesetting-addkey-test\");\r\n const editableDb = await container.createDb({ dbName: \"test-db\", manifest: { settingsName: \"updatesetting-addkey-test\" } });\r\n\r\n editableDb.open();\r\n editableDb.updateSettings({ \"existing\": \"value\" });\r\n\r\n editableDb.updateSetting({ settingName: \"newKey\", value: 42 });\r\n editableDb.close();\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: \"test-db\" }, container, SettingsPriority.application);\r\n expect(settingsDb.getSetting<string>(\"existing\")).to.equal(\"value\");\r\n expect(settingsDb.getSetting<number>(\"newKey\")).to.equal(42);\r\n });\r\n });\r\n});\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../../src/workspace/Settings.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Workspace\n */\n\nimport { BeEvent, JSONSchemaType } from \"@itwin/core-bentley\";\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\nimport { WorkspaceDb } from \"./Workspace\";\nimport { _implementationProhibited } from \"../internal/Symbols\";\n\n/** The value of a single named parameter within a [[Workspace.settings]] that configures some aspect of the applications run-time behavior.\n * Settings are stored in a [[SettingsDictionary]]. A setting is described by its [[SettingSchema]].\n * @beta\n */\nexport type Setting = JSONSchemaType;\n\n/** @beta */\nexport namespace Setting { // eslint-disable-line @typescript-eslint/no-redeclare\n /** Create a deep copy of a [[Setting]]. */\n export function clone<T extends Setting>(setting: T): T {\n if (!setting || typeof setting !== \"object\")\n return setting;\n\n const result = Array.isArray(setting) ? [] : {} as any;\n Object.keys(setting).forEach((key: string) => result[key] = clone((setting as any)[key]));\n return result;\n }\n\n /** Returns true if `a` and `b` are considered equivalent [[Setting]] values.\n * Settings of primitive types like `number` and `string` are compared using `===`.\n * Settings of type \"object\" are compared by comparing each property using `areEqual`; the objects are considered\n * equal if they have the exact same set of property names with equivalent values.\n * Settings of type \"array\" are compared by comparing each element of the arrays use `areEqual`; the arrays are considered\n * equal if they have the same number of elements with equivalent values in the same exact order.\n */\n export function areEqual(a: Setting | undefined, b: Setting | undefined): boolean {\n if (a === b) {\n return true;\n }\n\n // For primitive types, === suffices.\n if (typeof a !== \"object\" || typeof b !== \"object\") {\n return false;\n }\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!areEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n aKeys.sort();\n bKeys.sort();\n for (let i = 0; i < aKeys.length; i++) {\n const key = aKeys[i];\n if (key !== bKeys[i]) {\n return false;\n }\n\n if (!areEqual((a as SettingsContainer)[key], (b as SettingsContainer)[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n/**\n * The name of a [[Setting]].\n * Setting names must be [valid JavaScript property names](https://developer.mozilla.org/en-US/docs/Glossary/property/JavaScript) containing no spaces or periods.\n * The name of a setting begins with the schema prefix of the [[SettingGroupSchema]] in which its [[SettingSchema]] is defined.\n * A setting name therefore forms a path like file names in a file system.\n * For example, the following are setting names defined in the `energyAnalysis`, `iot-scan-visualization`, and `vibration-map` schemas.\n *\n * ```ts\n * \"energyAnalysis/formats/totalWork\"\n * \"energyAnalysis/formats/totalHours\"\n * \"energyAnalysis/units/power\"\n * \"energyAnalysis/units/temperature\"\n * \"energyAnalysis/startupMode\"\n * \"iot-scan-visualization/ports/cameras\"\n * \"vibration-map/filters/scope\"\n * \"vibration-map/filters/prefabricated\"\n * ```\n *\n * @beta\n */\nexport type SettingName = string;\n\n/** An object that defines the values for any number of [[Setting]]s. Each of its properties' names must conform to the semantics of a [[SettingName]].\n * @beta\n */\nexport interface SettingsContainer {\n /** Accesses settings by their names. */\n [name: SettingName]: Setting | undefined;\n}\n\n/** Defines the precedence of a [[SettingsDictionary]].\n * [[Settings]] may contain multiple dictionaries containing different values for the same [[SettingName]].\n * When resolving the value of a [[Setting]], the value from the highest-priority dictionary is used.\n * Priorities are grouped into coarse categories like [[SettingsPriority.application]] and [[SettingsPriority.iModel]].\n * Settings with priorities less than or equal to [[SettingsPriority.application]] are stored in [[IModelHost.appWorkspace]], while\n * those with priorities higher than [[SettingsPriority.application]] are stored inside [[IModelDb.workspace]].\n * @beta\n */\nexport type SettingsPriority = number;\n\n/** @beta */\nexport namespace SettingsPriority { // eslint-disable-line @typescript-eslint/no-redeclare\n /** Settings that originate from default setting files loaded automatically at the start of a session. */\n export const defaults = 100;\n /** Settings supplied by an application at runtime. */\n export const application = 200;\n /** Settings that apply to all iTwins for an organization. */\n export const organization = 300;\n /** Settings that apply to all iModels in an iTwin. */\n export const iTwin = 400;\n /** Settings that apply to all branches of an iModel. */\n export const branch = 500;\n /** Settings that apply to a specific iModel. */\n export const iModel = 600;\n}\n\n/** A named container that supplies values for [[Setting]]s.\n * @see [[Settings.addDictionary]] to register a new settings dictionary.\n * @beta\n */\nexport interface SettingsDictionary {\n /** @internal */\n [_implementationProhibited]: unknown;\n\n /** Metadata describing the dictionary. */\n readonly props: SettingsDictionaryProps;\n\n /** Obtain a copy of the value of the setting named `settingName` stored in this dictionary, or `undefined` if no such setting exists.\n * The returned value is always cloned using [[Setting.clone]].\n * @note Generally, applications use methods like [[Settings.getString]] and [[Setting.getArray]] to resolve a setting value from multiple\n * dictionaries. Those methods - unlike this one - also validate that `settingName` is of type `T` as defined by its [[SettingSchema]].\n */\n getSetting<T extends Setting>(settingName: SettingName): T | undefined;\n\n /** Return a deep copy of all settings in this dictionary as a [[SettingsContainer]].\n * This is useful for inspecting the full contents of the dictionary or for building a modified copy\n * to pass to [[EditableSettingsDb.updateSettingsDictionary]].\n * The returned container is cloned using [[Setting.clone]], so callers may freely mutate it without\n * affecting this dictionary's internal state.\n * @beta\n */\n toJSON(): SettingsContainer;\n}\n\n/** Uniquely identifies a [[SettingsDictionary]].\n * @beta\n */\nexport interface SettingsDictionarySource {\n /** The name of the dictionary, which must be unique within its [[workspaceDb]], or - if [[workspaceDb]] is undefined - unique among all dictionaries not associated with any [[WorkspaceDb]]. */\n readonly name: string;\n /** The [[WorkspaceDb]] from which the dictionary originated. */\n readonly workspaceDb?: WorkspaceDb;\n}\n\n/** Properties of a [[SettingsDictionary]], defining its name, the [[WorkspaceDb]] (if any) from which it originated, and its [[priority]] relative to other dictionaries.\n * @beta\n */\nexport interface SettingsDictionaryProps extends SettingsDictionarySource {\n /** Precedence value determining which setting value to use when multiple dictionaries supply values for the same [[SettingName]]. */\n readonly priority: SettingsPriority;\n}\n\n/**\n * The collection of [[Setting]]s that supply the run-time configuration of a [[Workspace]].\n * The `Settings` object comprises a collection of named [[SettingsDictionary]] objects.\n * Methods like [[getSetting]], [[getString]], and [[getArray]] provide access to the value of an individual [[Setting]] by searching\n * the [[dictionaries]] in order by their [[SettingsPriority]] to find the highest-priority setting with the requested [[SettingName]].\n * Most methods that retrieve [[Setting]] values validate them against their [[SettingSchema]]s to ensure that they are of the correct type.\n * A [[SettingsDictionary]] can be added or removed using [[addDictionary]] and [[dropDictionary]].\n * Because [[Setting]]s can change at any time during the session, you should avoid caching their values wherever possible.\n * If you must cache them (for example, to display in a user interface), you should listen for the [[onSettingsChanged]] event to be\n * notified of potential changes.\n *\n * Settings are accessed via [[Workspace.settings]]. They are defined at the application level by [[IModelHost.appWorkspace]], but individual iModels may supply\n * additional iModel-specific settings or overrides for application-level settings. When working in the context of a specific iModel, use [[IModelDb.workspace]]'s `settings`\n * property. Any settings not overridden by the iModel will fall back to the settings defined in [[IModelHost.appWorkspace]].\n *\n * Application settings are loaded into [[IModelHost.appWorkspace]] when the session begins (i.e., when [[IModelHost.startup]] is invoked), and unloaded when it ends (in [[IModelHost.shutdown]]).\n * They are read from [JSON5](https://json5.org/) files delivered with the application. The application should register any additional [[SettingsDictionary]]'s '(and their corresponding\n * [[SettingGroupSchema]]s) at this time.\n *\n * iModel-specific settings are stored in the iModel's property table and loaded into [[IModelDb.workspace]] when the iModel is first opened.\n * You can add and remove a [[SettingsDictionary]] from the property table using [[IModelDb.saveSettingDictionary]] and [[IModelDb.deleteSettingDictionary]].\n *\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\n *\n * @see [[IModelHost.appWorkspace]] application-wide settings, and [[IModelDb.workspace]] for settings specific to a given iModel.\n * @beta\n */\nexport interface Settings {\n /** @internal */\n [_implementationProhibited]: unknown;\n\n /** @internal */\n close(): void;\n\n /** The set of settings dictionaries from which [[Setting]] values are obtained, sorted by [[SettingsPriority]].\n * The set can contain at most one dictionary for each unique combination of name and [[WorkspaceDb]].\n * @see [[addDictionary]], [[addFile]], [[addJson]], and [[addDirectory]] to add a new dictionary.\n * @see [[dropDictionary]] to remove a dictionary.\n * @see [[getDictionary]] to look up a dictionary.\n */\n readonly dictionaries: readonly SettingsDictionary[];\n\n /** Event raised whenever a [[SettingsDictionary]] is added or removed. */\n readonly onSettingsChanged: BeEvent<() => void>;\n\n /** Parses the contents of a local [JSON5](https://json5.org/) file as a [[SettingsContainer]] and invokes [[addDictionary]] to\n * add a [[SettingsDictionary]] named `fileName` with the specified priority.\n * @param fileName the name of a local settings file containing the dictionary.\n * @param priority the priority for the dictionary.\n */\n addFile(fileName: LocalFileName, priority: SettingsPriority): void;\n\n /** Invokes [[addFile]] for all files in `directory` with the extension \".json\" or \".json5\". */\n addDirectory(directory: LocalDirName, priority: SettingsPriority): void;\n\n /** Parses `settingsJson` as a [[SettingsContainer]] and invokes [[addDictionary]] to add a [[SettingsDictionary]] with the specified `props`.\n * This is typically used when reading dictionaries out of a [[WorkspaceDb]], where they are stored as stringified JSON.\n */\n addJson(props: SettingsDictionaryProps, settingsJson: string): void;\n\n /** Find a [[SettingsDictionary]] with the same name and [[WorkspaceDb]] as `source`. */\n getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined;\n\n /** Add a new [[SettingsDictionary]] with the priority, name, and [[WorkspaceDb]] specified by `props` and setting values supplied by `settings`.\n * @note If a dictionary with the same name and [[WorkspaceDb]] already exists, it will be replaced.\n * @see [[addFile]], [[addJson]], and [[addDirectory]] for convenient ways to add dictionaries from various sources.\n */\n addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer): void;\n\n /** Removes a previously-added [[SettingsDictionary]]. */\n dropDictionary(props: SettingsDictionarySource): void;\n\n /** Looks up the highest priority setting value for a SettingName, falling back to a default value if no value for the setting is found.\n * The [[dictionaries]] are searched in order by [[SettingsPriority]]; the first one that provides a value for `settingName` wins.\n * @param settingName The name of the setting.\n * @param defaultValue value returned if settingName is not present in any [[SettingsDictionary]].\n * @note This method is generic on [[Setting]] type, but no type checking is actually performed at run time. So, if you\n * use this method to get a setting with an expected type, but its value is a different type, the return type of this method will be wrong.\n * You must always type check the result. Use the non-generic \"get\" methods like [[getString]] and [[getArray]] if you only want the value\n * if its type is correct.\n * @note Unlike [[getArray]], this method does not combine arrays - it ignores [[SettingsSchema.combineArrays]].\n */\n getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined;\n\n /** Obtain an iterator over all of the values in the [[dictionaries]] for the [[Setting]] identified by `settingName`, ordered by [[SettingsPriority]]. */\n getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}>;\n\n /** Obtain an iterator over all of the values in the [[dictionaries]] for the [[Setting]] identified by `settingName`, ordered by [[SettingsPriority]]. */\n getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T>;\n\n /** Look up the value of a string [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\n * @throws Error if the setting exists but is not a string.\n */\n getString(settingName: SettingName, defaultValue: string): string;\n getString(settingName: SettingName, defaultValue?: string): string | undefined;\n\n /** Look up the value of a boolean [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\n * @throws Error if the setting exists but is not a boolean.\n */\n getBoolean(settingName: SettingName, defaultValue: boolean): boolean;\n getBoolean(settingName: SettingName, defaultValue?: boolean): boolean | undefined;\n\n /** Look up the value of a numeric [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\n * @throws Error if the setting exists but is not a number.\n */\n getNumber(settingName: SettingName, defaultValue: number): number;\n getNumber(settingName: SettingName): number | undefined;\n\n /** Look up the value of an object [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\n * @throws Error if the setting exists but is not an object.\n */\n getObject<T extends object>(settingName: SettingName, defaultValue: T): T;\n getObject<T extends object>(settingName: SettingName): T | undefined;\n\n /** Look up the value of an array [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\n * @throws Error if the setting exists but is not an array.\n */\n getArray<T extends Setting>(settingName: SettingName, defaultValue: Array<T>): Array<T>;\n getArray<T extends Setting>(settingName: SettingName): Array<T> | undefined;\n}\n"]}
1
+ {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../../src/workspace/Settings.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { BeEvent, JSONSchemaType } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { WorkspaceDb } from \"./Workspace\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\n\r\n/** The value of a single named parameter within a [[Workspace.settings]] that configures some aspect of the applications run-time behavior.\r\n * Settings are stored in a [[SettingsDictionary]]. A setting is described by its [[SettingSchema]].\r\n * @beta\r\n */\r\nexport type Setting = JSONSchemaType;\r\n\r\n/** @beta */\r\nexport namespace Setting { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** Create a deep copy of a [[Setting]]. */\r\n export function clone<T extends Setting>(setting: T): T {\r\n if (!setting || typeof setting !== \"object\")\r\n return setting;\r\n\r\n const result = Array.isArray(setting) ? [] : {} as any;\r\n Object.keys(setting).forEach((key: string) => result[key] = clone((setting as any)[key]));\r\n return result;\r\n }\r\n\r\n /** Returns true if `a` and `b` are considered equivalent [[Setting]] values.\r\n * Settings of primitive types like `number` and `string` are compared using `===`.\r\n * Settings of type \"object\" are compared by comparing each property using `areEqual`; the objects are considered\r\n * equal if they have the exact same set of property names with equivalent values.\r\n * Settings of type \"array\" are compared by comparing each element of the arrays use `areEqual`; the arrays are considered\r\n * equal if they have the same number of elements with equivalent values in the same exact order.\r\n */\r\n export function areEqual(a: Setting | undefined, b: Setting | undefined): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n // For primitive types, === suffices.\r\n if (typeof a !== \"object\" || typeof b !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(a) || Array.isArray(b)) {\r\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n if (!areEqual(a[i], b[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n if (aKeys.length !== bKeys.length) {\r\n return false;\r\n }\r\n\r\n aKeys.sort();\r\n bKeys.sort();\r\n for (let i = 0; i < aKeys.length; i++) {\r\n const key = aKeys[i];\r\n if (key !== bKeys[i]) {\r\n return false;\r\n }\r\n\r\n if (!areEqual((a as SettingsContainer)[key], (b as SettingsContainer)[key])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * The name of a [[Setting]].\r\n * Setting names must be [valid JavaScript property names](https://developer.mozilla.org/en-US/docs/Glossary/property/JavaScript) containing no spaces or periods.\r\n * The name of a setting begins with the schema prefix of the [[SettingGroupSchema]] in which its [[SettingSchema]] is defined.\r\n * A setting name therefore forms a path like file names in a file system.\r\n * For example, the following are setting names defined in the `energyAnalysis`, `iot-scan-visualization`, and `vibration-map` schemas.\r\n *\r\n * ```ts\r\n * \"energyAnalysis/formats/totalWork\"\r\n * \"energyAnalysis/formats/totalHours\"\r\n * \"energyAnalysis/units/power\"\r\n * \"energyAnalysis/units/temperature\"\r\n * \"energyAnalysis/startupMode\"\r\n * \"iot-scan-visualization/ports/cameras\"\r\n * \"vibration-map/filters/scope\"\r\n * \"vibration-map/filters/prefabricated\"\r\n * ```\r\n *\r\n * @beta\r\n */\r\nexport type SettingName = string;\r\n\r\n/** An object that defines the values for any number of [[Setting]]s. Each of its properties' names must conform to the semantics of a [[SettingName]].\r\n * @beta\r\n */\r\nexport interface SettingsContainer {\r\n /** Accesses settings by their names. */\r\n [name: SettingName]: Setting | undefined;\r\n}\r\n\r\n/** Defines the precedence of a [[SettingsDictionary]].\r\n * [[Settings]] may contain multiple dictionaries containing different values for the same [[SettingName]].\r\n * When resolving the value of a [[Setting]], the value from the highest-priority dictionary is used.\r\n * Priorities are grouped into coarse categories like [[SettingsPriority.application]] and [[SettingsPriority.iModel]].\r\n * Settings with priorities less than or equal to [[SettingsPriority.application]] are stored in [[IModelHost.appWorkspace]], while\r\n * those with priorities higher than [[SettingsPriority.application]] are stored inside [[IModelDb.workspace]].\r\n * @beta\r\n */\r\nexport type SettingsPriority = number;\r\n\r\n/** @beta */\r\nexport namespace SettingsPriority { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** Settings that originate from default setting files loaded automatically at the start of a session. */\r\n export const defaults = 100;\r\n /** Settings supplied by an application at runtime. */\r\n export const application = 200;\r\n /** Settings that apply to all iTwins for an organization. */\r\n export const organization = 300;\r\n /** Settings that apply to all iModels in an iTwin. */\r\n export const iTwin = 400;\r\n /** Settings that apply to all branches of an iModel. */\r\n export const branch = 500;\r\n /** Settings that apply to a specific iModel. */\r\n export const iModel = 600;\r\n}\r\n\r\n/** A named container that supplies values for [[Setting]]s.\r\n * @see [[Settings.addDictionary]] to register a new settings dictionary.\r\n * @beta\r\n */\r\nexport interface SettingsDictionary {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /** Metadata describing the dictionary. */\r\n readonly props: SettingsDictionaryProps;\r\n\r\n /** Obtain a copy of the value of the setting named `settingName` stored in this dictionary, or `undefined` if no such setting exists.\r\n * The returned value is always cloned using [[Setting.clone]].\r\n * @note Generally, applications use methods like [[Settings.getString]] and [[Setting.getArray]] to resolve a setting value from multiple\r\n * dictionaries. Those methods - unlike this one - also validate that `settingName` is of type `T` as defined by its [[SettingSchema]].\r\n */\r\n getSetting<T extends Setting>(settingName: SettingName): T | undefined;\r\n\r\n /** Return a deep copy of all settings in this dictionary as a [[SettingsContainer]].\r\n * This is useful for inspecting the full contents of the dictionary or for building a modified copy\r\n * to pass to [[EditableSettingsDb.updateSettingsDictionary]].\r\n * The returned container is cloned using [[Setting.clone]], so callers may freely mutate it without\r\n * affecting this dictionary's internal state.\r\n * @beta\r\n */\r\n toJSON(): SettingsContainer;\r\n}\r\n\r\n/** Uniquely identifies a [[SettingsDictionary]].\r\n * @beta\r\n */\r\nexport interface SettingsDictionarySource {\r\n /** The name of the dictionary, which must be unique within its [[workspaceDb]], or - if [[workspaceDb]] is undefined - unique among all dictionaries not associated with any [[WorkspaceDb]]. */\r\n readonly name: string;\r\n /** The [[WorkspaceDb]] from which the dictionary originated. */\r\n readonly workspaceDb?: WorkspaceDb;\r\n}\r\n\r\n/** Properties of a [[SettingsDictionary]], defining its name, the [[WorkspaceDb]] (if any) from which it originated, and its [[priority]] relative to other dictionaries.\r\n * @beta\r\n */\r\nexport interface SettingsDictionaryProps extends SettingsDictionarySource {\r\n /** Precedence value determining which setting value to use when multiple dictionaries supply values for the same [[SettingName]]. */\r\n readonly priority: SettingsPriority;\r\n}\r\n\r\n/**\r\n * The collection of [[Setting]]s that supply the run-time configuration of a [[Workspace]].\r\n * The `Settings` object comprises a collection of named [[SettingsDictionary]] objects.\r\n * Methods like [[getSetting]], [[getString]], and [[getArray]] provide access to the value of an individual [[Setting]] by searching\r\n * the [[dictionaries]] in order by their [[SettingsPriority]] to find the highest-priority setting with the requested [[SettingName]].\r\n * Most methods that retrieve [[Setting]] values validate them against their [[SettingSchema]]s to ensure that they are of the correct type.\r\n * A [[SettingsDictionary]] can be added or removed using [[addDictionary]] and [[dropDictionary]].\r\n * Because [[Setting]]s can change at any time during the session, you should avoid caching their values wherever possible.\r\n * If you must cache them (for example, to display in a user interface), you should listen for the [[onSettingsChanged]] event to be\r\n * notified of potential changes.\r\n *\r\n * Settings are accessed via [[Workspace.settings]]. They are defined at the application level by [[IModelHost.appWorkspace]], but individual iModels may supply\r\n * additional iModel-specific settings or overrides for application-level settings. When working in the context of a specific iModel, use [[IModelDb.workspace]]'s `settings`\r\n * property. Any settings not overridden by the iModel will fall back to the settings defined in [[IModelHost.appWorkspace]].\r\n *\r\n * Application settings are loaded into [[IModelHost.appWorkspace]] when the session begins (i.e., when [[IModelHost.startup]] is invoked), and unloaded when it ends (in [[IModelHost.shutdown]]).\r\n * They are read from [JSON5](https://json5.org/) files delivered with the application. The application should register any additional [[SettingsDictionary]]'s '(and their corresponding\r\n * [[SettingGroupSchema]]s) at this time.\r\n *\r\n * iModel-specific settings are stored in the iModel's property table and loaded into [[IModelDb.workspace]] when the iModel is first opened.\r\n * You can add and remove a [[SettingsDictionary]] from the property table using [[IModelDb.saveSettingDictionary]] and [[IModelDb.deleteSettingDictionary]].\r\n *\r\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\r\n *\r\n * @see [[IModelHost.appWorkspace]] application-wide settings, and [[IModelDb.workspace]] for settings specific to a given iModel.\r\n * @beta\r\n */\r\nexport interface Settings {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /** @internal */\r\n close(): void;\r\n\r\n /** The set of settings dictionaries from which [[Setting]] values are obtained, sorted by [[SettingsPriority]].\r\n * The set can contain at most one dictionary for each unique combination of name and [[WorkspaceDb]].\r\n * @see [[addDictionary]], [[addFile]], [[addJson]], and [[addDirectory]] to add a new dictionary.\r\n * @see [[dropDictionary]] to remove a dictionary.\r\n * @see [[getDictionary]] to look up a dictionary.\r\n */\r\n readonly dictionaries: readonly SettingsDictionary[];\r\n\r\n /** Event raised whenever a [[SettingsDictionary]] is added or removed. */\r\n readonly onSettingsChanged: BeEvent<() => void>;\r\n\r\n /** Parses the contents of a local [JSON5](https://json5.org/) file as a [[SettingsContainer]] and invokes [[addDictionary]] to\r\n * add a [[SettingsDictionary]] named `fileName` with the specified priority.\r\n * @param fileName the name of a local settings file containing the dictionary.\r\n * @param priority the priority for the dictionary.\r\n */\r\n addFile(fileName: LocalFileName, priority: SettingsPriority): void;\r\n\r\n /** Invokes [[addFile]] for all files in `directory` with the extension \".json\" or \".json5\". */\r\n addDirectory(directory: LocalDirName, priority: SettingsPriority): void;\r\n\r\n /** Parses `settingsJson` as a [[SettingsContainer]] and invokes [[addDictionary]] to add a [[SettingsDictionary]] with the specified `props`.\r\n * This is typically used when reading dictionaries out of a [[WorkspaceDb]], where they are stored as stringified JSON.\r\n */\r\n addJson(props: SettingsDictionaryProps, settingsJson: string): void;\r\n\r\n /** Find a [[SettingsDictionary]] with the same name and [[WorkspaceDb]] as `source`. */\r\n getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined;\r\n\r\n /** Add a new [[SettingsDictionary]] with the priority, name, and [[WorkspaceDb]] specified by `props` and setting values supplied by `settings`.\r\n * @note If a dictionary with the same name and [[WorkspaceDb]] already exists, it will be replaced.\r\n * @see [[addFile]], [[addJson]], and [[addDirectory]] for convenient ways to add dictionaries from various sources.\r\n */\r\n addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer): void;\r\n\r\n /** Removes a previously-added [[SettingsDictionary]]. */\r\n dropDictionary(props: SettingsDictionarySource): void;\r\n\r\n /** Looks up the highest priority setting value for a SettingName, falling back to a default value if no value for the setting is found.\r\n * The [[dictionaries]] are searched in order by [[SettingsPriority]]; the first one that provides a value for `settingName` wins.\r\n * @param settingName The name of the setting.\r\n * @param defaultValue value returned if settingName is not present in any [[SettingsDictionary]].\r\n * @note This method is generic on [[Setting]] type, but no type checking is actually performed at run time. So, if you\r\n * use this method to get a setting with an expected type, but its value is a different type, the return type of this method will be wrong.\r\n * You must always type check the result. Use the non-generic \"get\" methods like [[getString]] and [[getArray]] if you only want the value\r\n * if its type is correct.\r\n * @note Unlike [[getArray]], this method does not combine arrays - it ignores [[SettingsSchema.combineArrays]].\r\n */\r\n getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined;\r\n\r\n /** Obtain an iterator over all of the values in the [[dictionaries]] for the [[Setting]] identified by `settingName`, ordered by [[SettingsPriority]]. */\r\n getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}>;\r\n\r\n /** Obtain an iterator over all of the values in the [[dictionaries]] for the [[Setting]] identified by `settingName`, ordered by [[SettingsPriority]]. */\r\n getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T>;\r\n\r\n /** Look up the value of a string [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\r\n * @throws Error if the setting exists but is not a string.\r\n */\r\n getString(settingName: SettingName, defaultValue: string): string;\r\n getString(settingName: SettingName, defaultValue?: string): string | undefined;\r\n\r\n /** Look up the value of a boolean [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\r\n * @throws Error if the setting exists but is not a boolean.\r\n */\r\n getBoolean(settingName: SettingName, defaultValue: boolean): boolean;\r\n getBoolean(settingName: SettingName, defaultValue?: boolean): boolean | undefined;\r\n\r\n /** Look up the value of a numeric [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\r\n * @throws Error if the setting exists but is not a number.\r\n */\r\n getNumber(settingName: SettingName, defaultValue: number): number;\r\n getNumber(settingName: SettingName): number | undefined;\r\n\r\n /** Look up the value of an object [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\r\n * @throws Error if the setting exists but is not an object.\r\n */\r\n getObject<T extends object>(settingName: SettingName, defaultValue: T): T;\r\n getObject<T extends object>(settingName: SettingName): T | undefined;\r\n\r\n /** Look up the value of an array [[Setting]] named `settingName`, returning `defaultValue` if no such value is defined.\r\n * @throws Error if the setting exists but is not an array.\r\n */\r\n getArray<T extends Setting>(settingName: SettingName, defaultValue: Array<T>): Array<T>;\r\n getArray<T extends Setting>(settingName: SettingName): Array<T> | undefined;\r\n}\r\n"]}