@itwin/core-backend 5.8.0-dev.9 → 5.9.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +248 -248
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +8 -11
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +28 -4
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +127 -29
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.d.ts +2 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +2 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +8 -0
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsDb.js +19 -0
- package/lib/cjs/workspace/SettingsDb.js.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.js +53 -0
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +42 -19
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +248 -248
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +8 -11
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +28 -4
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +128 -30
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.d.ts +2 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +2 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +64 -13
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +62 -27
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +8 -0
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +18 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +160 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
- package/lib/esm/workspace/Settings.d.ts +8 -0
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +109 -0
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsDb.js +16 -0
- package/lib/esm/workspace/SettingsDb.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsEditor.js +50 -0
- package/lib/esm/workspace/SettingsEditor.js.map +1 -0
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +42 -19
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +19 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { expect } from "chai";
|
|
6
|
+
import * as sinon from "sinon";
|
|
7
|
+
import { WorkspaceError } from "@itwin/core-common";
|
|
8
|
+
import { CloudSqlite } from "../../CloudSqlite";
|
|
9
|
+
import { IModelHost } from "../../IModelHost";
|
|
10
|
+
import { SettingsPriority } from "../../workspace/Settings";
|
|
11
|
+
import { SettingsEditor } from "../../workspace/SettingsEditor";
|
|
12
|
+
import { SettingsDbImpl } from "../../internal/workspace/SettingsDbImpl";
|
|
13
|
+
import { BlobContainer } from "../../BlobContainerService";
|
|
14
|
+
describe("SettingsDb", () => {
|
|
15
|
+
let editor;
|
|
16
|
+
before(async () => {
|
|
17
|
+
await IModelHost.startup();
|
|
18
|
+
editor = SettingsEditor.construct();
|
|
19
|
+
});
|
|
20
|
+
after(() => {
|
|
21
|
+
editor.close();
|
|
22
|
+
});
|
|
23
|
+
function getContainer(containerId, baseUri = "") {
|
|
24
|
+
return editor.getContainer({ containerId, baseUri, storageType: "azure", accessToken: "" });
|
|
25
|
+
}
|
|
26
|
+
it("SettingsDbImpl construction", async () => {
|
|
27
|
+
const container = getContainer("construct-test");
|
|
28
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "construct-test" } });
|
|
29
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
30
|
+
expect(settingsDb.dbName).to.equal("test-db");
|
|
31
|
+
expect(settingsDb.priority).to.equal(SettingsPriority.application);
|
|
32
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
33
|
+
expect(settingsDb.container).to.equal(container);
|
|
34
|
+
expect(settingsDb.version).to.equal("0.0.0");
|
|
35
|
+
});
|
|
36
|
+
it("open and close", async () => {
|
|
37
|
+
const container = getContainer("open-close-test");
|
|
38
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "open-close-test" } });
|
|
39
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
40
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
41
|
+
settingsDb.open();
|
|
42
|
+
expect(settingsDb.isOpen).to.be.true;
|
|
43
|
+
settingsDb.close();
|
|
44
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
45
|
+
// closing an already-closed db is safe
|
|
46
|
+
settingsDb.close();
|
|
47
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
48
|
+
});
|
|
49
|
+
it("getSetting reads a written setting", async () => {
|
|
50
|
+
const container = getContainer("get-setting-test");
|
|
51
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "get-setting-test" } });
|
|
52
|
+
editableDb.open();
|
|
53
|
+
editableDb.updateSettings({
|
|
54
|
+
"setting1": "value1",
|
|
55
|
+
"setting2": 42,
|
|
56
|
+
"setting3": true,
|
|
57
|
+
});
|
|
58
|
+
editableDb.close();
|
|
59
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.iTwin);
|
|
60
|
+
settingsDb.open();
|
|
61
|
+
expect(settingsDb.getSetting("setting1")).to.equal("value1");
|
|
62
|
+
expect(settingsDb.getSetting("setting2")).to.equal(42);
|
|
63
|
+
expect(settingsDb.getSetting("setting3")).to.equal(true);
|
|
64
|
+
settingsDb.close();
|
|
65
|
+
});
|
|
66
|
+
it("getSettings reads all settings", async () => {
|
|
67
|
+
const container = getContainer("get-settings-test");
|
|
68
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "get-settings-test" } });
|
|
69
|
+
editableDb.open();
|
|
70
|
+
editableDb.updateSettings({
|
|
71
|
+
"keyA": "valA",
|
|
72
|
+
"keyB": 100,
|
|
73
|
+
"keyC": [1, 2, 3],
|
|
74
|
+
});
|
|
75
|
+
editableDb.close();
|
|
76
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.organization);
|
|
77
|
+
settingsDb.open();
|
|
78
|
+
const all = settingsDb.getSettings();
|
|
79
|
+
expect(all.keyA).to.equal("valA");
|
|
80
|
+
expect(all.keyB).to.equal(100);
|
|
81
|
+
expect(all.keyC).to.deep.equal([1, 2, 3]);
|
|
82
|
+
settingsDb.close();
|
|
83
|
+
});
|
|
84
|
+
it("getSetting returns undefined for non-existent setting", async () => {
|
|
85
|
+
const container = getContainer("no-setting-test");
|
|
86
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "no-setting-test" } });
|
|
87
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.defaults);
|
|
88
|
+
settingsDb.open();
|
|
89
|
+
expect(settingsDb.getSetting("nonExistentSetting")).to.be.undefined;
|
|
90
|
+
settingsDb.close();
|
|
91
|
+
});
|
|
92
|
+
it("manifest reads stored manifest", async () => {
|
|
93
|
+
const container = getContainer("manifest-test");
|
|
94
|
+
await container.createDb({
|
|
95
|
+
dbName: "test-db",
|
|
96
|
+
manifest: { settingsName: "My Settings DB", description: "A test settings database" },
|
|
97
|
+
});
|
|
98
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
99
|
+
// manifest auto-opens the db via withOpenDb when not explicitly opened
|
|
100
|
+
const manifest = settingsDb.manifest;
|
|
101
|
+
expect(manifest.settingsName).to.equal("My Settings DB");
|
|
102
|
+
expect(manifest.description).to.equal("A test settings database");
|
|
103
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
104
|
+
});
|
|
105
|
+
it("getSetting auto-opens and auto-closes when db is not open", async () => {
|
|
106
|
+
const container = getContainer("auto-open-test");
|
|
107
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "auto-open-test" } });
|
|
108
|
+
editableDb.open();
|
|
109
|
+
editableDb.updateSettings({ "key": "auto-value" });
|
|
110
|
+
editableDb.close();
|
|
111
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
112
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
113
|
+
// getSetting should auto-open, read, and auto-close
|
|
114
|
+
expect(settingsDb.getSetting("key")).to.equal("auto-value");
|
|
115
|
+
expect(settingsDb.isOpen).to.be.false;
|
|
116
|
+
});
|
|
117
|
+
it("removeSetting removes a setting", async () => {
|
|
118
|
+
const container = getContainer("remove-setting-test");
|
|
119
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "remove-setting-test" } });
|
|
120
|
+
editableDb.open();
|
|
121
|
+
editableDb.updateSettings({ "toKeep": 1, "toRemove": 2 });
|
|
122
|
+
editableDb.close();
|
|
123
|
+
// Verify both exist
|
|
124
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
125
|
+
settingsDb.open();
|
|
126
|
+
expect(settingsDb.getSetting("toKeep")).to.equal(1);
|
|
127
|
+
expect(settingsDb.getSetting("toRemove")).to.equal(2);
|
|
128
|
+
settingsDb.close();
|
|
129
|
+
// Remove one
|
|
130
|
+
editableDb.open();
|
|
131
|
+
editableDb.removeSetting("toRemove");
|
|
132
|
+
editableDb.close();
|
|
133
|
+
// Verify only one remains
|
|
134
|
+
settingsDb.open();
|
|
135
|
+
const all = settingsDb.getSettings();
|
|
136
|
+
expect(all.toKeep).to.equal(1);
|
|
137
|
+
expect(all.toRemove).to.be.undefined;
|
|
138
|
+
expect(settingsDb.getSetting("toRemove")).to.be.undefined;
|
|
139
|
+
settingsDb.close();
|
|
140
|
+
});
|
|
141
|
+
it("close updates lastEditedBy in manifest when write lock is held", async () => {
|
|
142
|
+
const container = getContainer("manifest-update-test");
|
|
143
|
+
const editableDb = await container.createDb({
|
|
144
|
+
dbName: "test-db",
|
|
145
|
+
manifest: { settingsName: "manifest-update-test", contactName: "Original Author" },
|
|
146
|
+
});
|
|
147
|
+
// For local (non-cloud) containers, acquireWriteLock is a no-op,
|
|
148
|
+
// so lastEditedBy should remain unchanged after close.
|
|
149
|
+
container.acquireWriteLock("Jane Admin");
|
|
150
|
+
editableDb.open();
|
|
151
|
+
editableDb.updateSettings({ "key": "value" });
|
|
152
|
+
editableDb.close();
|
|
153
|
+
container.releaseWriteLock();
|
|
154
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
155
|
+
const manifest = settingsDb.manifest;
|
|
156
|
+
expect(manifest.settingsName).to.equal("manifest-update-test");
|
|
157
|
+
expect(manifest.contactName).to.equal("Original Author");
|
|
158
|
+
// lastEditedBy is only auto-set for cloud containers (where acquireWriteLock actually tracks the user)
|
|
159
|
+
expect(manifest.lastEditedBy).to.be.undefined;
|
|
160
|
+
});
|
|
161
|
+
it("getSettingsDb returns a SettingsDb from a loaded container", async () => {
|
|
162
|
+
const container = getContainer("getsettingsdb-test");
|
|
163
|
+
await container.createDb({ dbName: "settings-db", manifest: { settingsName: "getsettingsdb-test" } });
|
|
164
|
+
const settingsDb = editor.workspace.getSettingsDb({ containerId: "getsettingsdb-test", priority: SettingsPriority.iTwin });
|
|
165
|
+
expect(settingsDb).to.not.be.undefined;
|
|
166
|
+
expect(settingsDb.dbName).to.equal("settings-db");
|
|
167
|
+
expect(settingsDb.manifest.settingsName).to.equal("getsettingsdb-test");
|
|
168
|
+
});
|
|
169
|
+
it("getSettingsDb throws for unloaded container", () => {
|
|
170
|
+
expect(() => editor.workspace.getSettingsDb({ containerId: "nonexistent-container-id", priority: SettingsPriority.iTwin }))
|
|
171
|
+
.to.throw()
|
|
172
|
+
.and.satisfy((e) => WorkspaceError.isError(e, "does-not-exist"));
|
|
173
|
+
});
|
|
174
|
+
it("getSettingsDb uses caller-supplied priority", async () => {
|
|
175
|
+
const container = getContainer("imodel-scope-test");
|
|
176
|
+
await container.createDb({ dbName: "settings-db", manifest: { settingsName: "imodel-scope-test" } });
|
|
177
|
+
const settingsDb = editor.workspace.getSettingsDb({ containerId: "imodel-scope-test", priority: SettingsPriority.iModel });
|
|
178
|
+
expect(settingsDb).to.not.be.undefined;
|
|
179
|
+
expect(settingsDb.priority).to.equal(SettingsPriority.iModel);
|
|
180
|
+
});
|
|
181
|
+
it("getSettingsDb respects iTwin priority", async () => {
|
|
182
|
+
const container = getContainer("itwin-priority-test");
|
|
183
|
+
await container.createDb({ dbName: "settings-db", manifest: { settingsName: "itwin-priority-test" } });
|
|
184
|
+
const settingsDb = editor.workspace.getSettingsDb({ containerId: "itwin-priority-test", priority: SettingsPriority.iTwin });
|
|
185
|
+
expect(settingsDb.priority).to.equal(SettingsPriority.iTwin);
|
|
186
|
+
});
|
|
187
|
+
it("hasSettingsManifestProperty returns true for SettingsDb containers", async () => {
|
|
188
|
+
const container = getContainer("has-manifest-test");
|
|
189
|
+
await container.createDb({ dbName: "settings-db", manifest: { settingsName: "has-manifest-test" } });
|
|
190
|
+
const settingsDb = new SettingsDbImpl({ dbName: "settings-db" }, container, SettingsPriority.application);
|
|
191
|
+
expect(settingsDb.hasSettingsManifestProperty).to.be.true;
|
|
192
|
+
});
|
|
193
|
+
it("getSetting returns undefined on empty db", async () => {
|
|
194
|
+
const container = getContainer("missing-setting-test");
|
|
195
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "missing-setting-test" } });
|
|
196
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
197
|
+
settingsDb.open();
|
|
198
|
+
expect(settingsDb.getSetting("does-not-exist")).to.be.undefined;
|
|
199
|
+
settingsDb.close();
|
|
200
|
+
});
|
|
201
|
+
it("editor close is resilient to container cleanup failures", () => {
|
|
202
|
+
// Verify that closing an editor with no containers doesn't throw
|
|
203
|
+
const freshEditor = SettingsEditor.construct();
|
|
204
|
+
expect(() => freshEditor.close()).to.not.throw();
|
|
205
|
+
});
|
|
206
|
+
it("getSettingsDb with custom dbName", async () => {
|
|
207
|
+
const container = getContainer("custom-dbname-test");
|
|
208
|
+
await container.createDb({ dbName: "my-custom-db", manifest: { settingsName: "custom-dbname" } });
|
|
209
|
+
const settingsDb = editor.workspace.getSettingsDb({ containerId: "custom-dbname-test", priority: SettingsPriority.application, dbName: "my-custom-db" });
|
|
210
|
+
expect(settingsDb.dbName).to.equal("my-custom-db");
|
|
211
|
+
});
|
|
212
|
+
it("iTwin and iModel settings containers coexist with correct priorities", async () => {
|
|
213
|
+
// Simulate the real scenario: an iTwin has its own settings container, and one of its
|
|
214
|
+
// iModels also has a settings container. Both are loaded into the workspace with separate
|
|
215
|
+
// containerId GUIDs (assigned by the storage container service) and different priorities.
|
|
216
|
+
const itwinContainer = getContainer("itwin-container-guid");
|
|
217
|
+
const imodelContainer = getContainer("imodel-container-guid");
|
|
218
|
+
const itwinDb = await itwinContainer.createDb({ dbName: "settings-db", manifest: { settingsName: "iTwin Settings" } });
|
|
219
|
+
const imodelDb = await imodelContainer.createDb({ dbName: "settings-db", manifest: { settingsName: "iModel Settings" } });
|
|
220
|
+
// Write the same setting name to both, with different values
|
|
221
|
+
itwinDb.open();
|
|
222
|
+
itwinDb.updateSettings({ "theme": "light", "itwinOnly": true });
|
|
223
|
+
itwinDb.close();
|
|
224
|
+
imodelDb.open();
|
|
225
|
+
imodelDb.updateSettings({ "theme": "dark", "imodelOnly": true });
|
|
226
|
+
imodelDb.close();
|
|
227
|
+
// Retrieve both via getSettingsDb with the priorities a real caller would assign
|
|
228
|
+
const itwinSettingsDb = editor.workspace.getSettingsDb({ containerId: "itwin-container-guid", priority: SettingsPriority.iTwin });
|
|
229
|
+
const imodelSettingsDb = editor.workspace.getSettingsDb({ containerId: "imodel-container-guid", priority: SettingsPriority.iModel });
|
|
230
|
+
// Verify they are independent dbs with correct priorities
|
|
231
|
+
expect(itwinSettingsDb.priority).to.equal(SettingsPriority.iTwin);
|
|
232
|
+
expect(imodelSettingsDb.priority).to.equal(SettingsPriority.iModel);
|
|
233
|
+
expect(imodelSettingsDb.priority).to.be.greaterThan(itwinSettingsDb.priority);
|
|
234
|
+
// Verify each db returns its own setting values
|
|
235
|
+
expect(itwinSettingsDb.getSetting("theme")).to.equal("light");
|
|
236
|
+
expect(itwinSettingsDb.getSetting("itwinOnly")).to.equal(true);
|
|
237
|
+
expect(imodelSettingsDb.getSetting("theme")).to.equal("dark");
|
|
238
|
+
expect(imodelSettingsDb.getSetting("imodelOnly")).to.equal(true);
|
|
239
|
+
});
|
|
240
|
+
it("SettingsEditor uses a separate cloud cache from the read-only Workspace", () => {
|
|
241
|
+
const editorCache = editor.workspace.getCloudCache();
|
|
242
|
+
const workspaceCache = IModelHost.appWorkspace.getCloudCache();
|
|
243
|
+
expect(editorCache.name).to.equal("SettingsEditor");
|
|
244
|
+
expect(workspaceCache.name).to.equal("Workspace");
|
|
245
|
+
expect(editorCache).to.not.equal(workspaceCache);
|
|
246
|
+
});
|
|
247
|
+
describe("findContainers", () => {
|
|
248
|
+
const testContainerId = "mock-settings-container-id";
|
|
249
|
+
const testITwinId = "mock-itwin-id";
|
|
250
|
+
const testIModelId = "mock-imodel-id";
|
|
251
|
+
let savedService;
|
|
252
|
+
function createMockService(containers) {
|
|
253
|
+
return {
|
|
254
|
+
create: async () => ({ containerId: testContainerId, baseUri: "https://mock.blob.core/", provider: "azure" }),
|
|
255
|
+
delete: async () => { },
|
|
256
|
+
queryScope: async () => ({ iTwinId: testITwinId }),
|
|
257
|
+
queryMetadata: async () => ({ containerType: "settings", label: "mock" }),
|
|
258
|
+
queryContainersMetadata: async (_userToken, args) => {
|
|
259
|
+
// Filter by containerType and iTwinId like the real service would
|
|
260
|
+
return containers.filter((c) => (args.containerType === undefined || c.containerType === args.containerType) &&
|
|
261
|
+
(args.iTwinId === testITwinId || args.iTwinId === undefined));
|
|
262
|
+
},
|
|
263
|
+
updateJson: async () => { },
|
|
264
|
+
requestToken: async (_props) => ({
|
|
265
|
+
token: "",
|
|
266
|
+
scope: { iTwinId: testITwinId },
|
|
267
|
+
provider: "azure",
|
|
268
|
+
expiration: new Date(Date.now() + 3600000),
|
|
269
|
+
metadata: { containerType: "settings", label: "mock" },
|
|
270
|
+
baseUri: "",
|
|
271
|
+
}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
before(() => {
|
|
275
|
+
savedService = BlobContainer.service;
|
|
276
|
+
});
|
|
277
|
+
afterEach(() => {
|
|
278
|
+
BlobContainer.service = savedService;
|
|
279
|
+
});
|
|
280
|
+
it("finds containers by iTwinId", async () => {
|
|
281
|
+
BlobContainer.service = createMockService([
|
|
282
|
+
{ containerId: testContainerId, containerType: "settings", label: "Test Settings" },
|
|
283
|
+
]);
|
|
284
|
+
const containers = await editor.findContainers({ iTwinId: testITwinId });
|
|
285
|
+
expect(containers).to.have.length(1);
|
|
286
|
+
expect(containers[0].fromProps.containerId).to.equal(testContainerId);
|
|
287
|
+
});
|
|
288
|
+
it("finds a container by iTwinId and iModelId", async () => {
|
|
289
|
+
BlobContainer.service = createMockService([
|
|
290
|
+
{ containerId: "imodel-scoped-container", containerType: "settings", label: "iModel Settings" },
|
|
291
|
+
]);
|
|
292
|
+
const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });
|
|
293
|
+
expect(containers).to.have.length(1);
|
|
294
|
+
expect(containers[0].fromProps.containerId).to.equal("imodel-scoped-container");
|
|
295
|
+
});
|
|
296
|
+
it("returns empty array when no settings containers are found", async () => {
|
|
297
|
+
BlobContainer.service = createMockService([]);
|
|
298
|
+
const containers = await editor.findContainers({ iTwinId: "nonexistent-itwin" });
|
|
299
|
+
expect(containers).to.have.length(0);
|
|
300
|
+
});
|
|
301
|
+
it("throws when BlobContainer.service is not available", async () => {
|
|
302
|
+
BlobContainer.service = undefined;
|
|
303
|
+
await expect(editor.findContainers({ iTwinId: testITwinId }))
|
|
304
|
+
.to.be.rejectedWith(/BlobContainer.service is not available/);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe("getSettings", () => {
|
|
308
|
+
it("returns a deep copy of all settings", async () => {
|
|
309
|
+
const container = getContainer("getsettings-deep-copy-test");
|
|
310
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "getsettings-deep-copy-test" } });
|
|
311
|
+
editableDb.open();
|
|
312
|
+
editableDb.updateSettings({
|
|
313
|
+
"theme": "dark",
|
|
314
|
+
"fontSize": 14,
|
|
315
|
+
"nested": { "a": 1, "b": [2, 3] },
|
|
316
|
+
});
|
|
317
|
+
editableDb.close();
|
|
318
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
319
|
+
const all = settingsDb.getSettings();
|
|
320
|
+
expect(all).to.deep.equal({ "theme": "dark", "fontSize": 14, "nested": { "a": 1, "b": [2, 3] } });
|
|
321
|
+
// Mutating the copy should not affect the stored settings
|
|
322
|
+
all.theme = "light";
|
|
323
|
+
all.nested.a = 999;
|
|
324
|
+
expect(settingsDb.getSetting("theme")).to.equal("dark");
|
|
325
|
+
expect(settingsDb.getSetting("nested")).to.deep.equal({ "a": 1, "b": [2, 3] });
|
|
326
|
+
});
|
|
327
|
+
it("returns empty object for empty db", async () => {
|
|
328
|
+
const container = getContainer("getsettings-empty-test");
|
|
329
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "getsettings-empty-test" } });
|
|
330
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
331
|
+
expect(settingsDb.getSettings()).to.deep.equal({});
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
it("getSetting returns undefined for inherited prototype properties", async () => {
|
|
335
|
+
const container = getContainer("prototype-safety-test");
|
|
336
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "prototype-safety-test" } });
|
|
337
|
+
editableDb.open();
|
|
338
|
+
editableDb.updateSettings({ "realSetting": "value" });
|
|
339
|
+
editableDb.close();
|
|
340
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
341
|
+
expect(settingsDb.getSetting("realSetting")).to.equal("value");
|
|
342
|
+
expect(settingsDb.getSetting("constructor")).to.be.undefined;
|
|
343
|
+
expect(settingsDb.getSetting("toString")).to.be.undefined;
|
|
344
|
+
});
|
|
345
|
+
describe("editable db version cache key", () => {
|
|
346
|
+
afterEach(() => sinon.restore());
|
|
347
|
+
function createFakeCloudContainer(containerId) {
|
|
348
|
+
return {
|
|
349
|
+
connect: () => { },
|
|
350
|
+
disconnect: () => { },
|
|
351
|
+
checkForChanges: () => { },
|
|
352
|
+
queryDatabase: () => undefined,
|
|
353
|
+
queryDatabases: () => [],
|
|
354
|
+
acquireWriteLock: () => { },
|
|
355
|
+
releaseWriteLock: () => { },
|
|
356
|
+
abandonChanges: () => { },
|
|
357
|
+
containerId,
|
|
358
|
+
baseUri: "https://example.invalid",
|
|
359
|
+
storageType: "azure",
|
|
360
|
+
isPublic: false,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
function stubCloudLookup(containerId, resolveVersion) {
|
|
364
|
+
sinon.stub(CloudSqlite, "createCloudContainer").returns(createFakeCloudContainer(containerId));
|
|
365
|
+
sinon.stub(CloudSqlite, "querySemverMatch").callsFake((props) => CloudSqlite.makeSemverName(props.dbName ?? "settings-db", resolveVersion(props)));
|
|
366
|
+
sinon.stub(CloudSqlite, "isSemverEditable").returns(true);
|
|
367
|
+
}
|
|
368
|
+
it("local getEditableDb ignores version selectors for cache identity", async () => {
|
|
369
|
+
const container = getContainer("cache-local-version-selectors");
|
|
370
|
+
await container.createDb({ dbName: "test-db", manifest: { settingsName: "cache-local-version-selectors" } });
|
|
371
|
+
const db1 = container.getEditableDb({ dbName: "test-db" });
|
|
372
|
+
const db2 = container.getEditableDb({ dbName: "test-db", version: "1.0.0" });
|
|
373
|
+
expect(db1).to.equal(db2);
|
|
374
|
+
});
|
|
375
|
+
it("local getEditableDb reuses the same instance for omitted vs explicit default dbName", async () => {
|
|
376
|
+
const container = getContainer("cache-local-default-name");
|
|
377
|
+
const db1 = await container.createDb({ manifest: { settingsName: "cache-local-default-name" } });
|
|
378
|
+
const db2 = container.getEditableDb({ dbName: "settings-db" });
|
|
379
|
+
expect(db1).to.equal(db2);
|
|
380
|
+
});
|
|
381
|
+
it("cloud getEditableDb reuses the same instance for omitted vs explicit resolved version", () => {
|
|
382
|
+
const containerId = "cache-cloud-default-vs-resolved";
|
|
383
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
384
|
+
const container = getContainer(containerId, "https://example.invalid");
|
|
385
|
+
const db1 = container.getEditableDb({ dbName: "test-db" });
|
|
386
|
+
const db2 = container.getEditableDb({ dbName: "test-db", version: "0.0.0" });
|
|
387
|
+
expect(db1).to.equal(db2);
|
|
388
|
+
});
|
|
389
|
+
it("cloud getEditableDb reuses the same instance for semver-equivalent selectors", () => {
|
|
390
|
+
const containerId = "cache-cloud-semver-equivalent";
|
|
391
|
+
stubCloudLookup(containerId, (props) => props.version === "1" ? "1.0.0" : (props.version ?? "1.0.0"));
|
|
392
|
+
const container = getContainer(containerId, "https://example.invalid");
|
|
393
|
+
const db1 = container.getEditableDb({ dbName: "test-db", version: "1" });
|
|
394
|
+
const db2 = container.getEditableDb({ dbName: "test-db", version: "1.0.0" });
|
|
395
|
+
expect(db1).to.equal(db2);
|
|
396
|
+
});
|
|
397
|
+
it("cloud getEditableDb returns different instances for different resolved versions", () => {
|
|
398
|
+
const containerId = "cache-cloud-different-versions";
|
|
399
|
+
stubCloudLookup(containerId, (props) => props.version ?? "1.0.0");
|
|
400
|
+
const container = getContainer(containerId, "https://example.invalid");
|
|
401
|
+
const db1 = container.getEditableDb({ dbName: "test-db", version: "1.0.0" });
|
|
402
|
+
const db2 = container.getEditableDb({ dbName: "test-db", version: "2.0.0" });
|
|
403
|
+
expect(db1).to.not.equal(db2);
|
|
404
|
+
});
|
|
405
|
+
it("createDb with explicit version returns db matching that resolved version", async () => {
|
|
406
|
+
const containerId = "cache-create-explicit-version";
|
|
407
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
408
|
+
sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
409
|
+
const container = getContainer(containerId, "https://example.invalid");
|
|
410
|
+
const db = await container.createDb({ dbName: "test-db", version: "1.0.0", manifest: { settingsName: "cache-create-explicit-version" } });
|
|
411
|
+
const dbAgain = container.getEditableDb({ dbName: "test-db", version: "1.0.0" });
|
|
412
|
+
expect(db).to.equal(dbAgain);
|
|
413
|
+
});
|
|
414
|
+
it("createDb without an explicit version returns the new 0.0.0 db instead of the latest match", async () => {
|
|
415
|
+
const containerId = "cache-create-default-version";
|
|
416
|
+
stubCloudLookup(containerId, (props) => props.version ?? "2.0.0");
|
|
417
|
+
sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
418
|
+
const container = getContainer(containerId, "https://example.invalid");
|
|
419
|
+
const db = await container.createDb({ dbName: "test-db", manifest: { settingsName: "cache-create-default-version" } });
|
|
420
|
+
expect(db.version).to.equal("0.0.0");
|
|
421
|
+
expect(db).to.equal(container.getEditableDb({ dbName: "test-db", version: "0.0.0" }));
|
|
422
|
+
expect(db).to.not.equal(container.getEditableDb({ dbName: "test-db" }));
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
describe("updateSetting", () => {
|
|
426
|
+
it("adds a setting to an empty db", async () => {
|
|
427
|
+
const container = getContainer("updatesetting-new-test");
|
|
428
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "updatesetting-new-test" } });
|
|
429
|
+
editableDb.open();
|
|
430
|
+
editableDb.updateSetting({ settingName: "myKey", value: "myValue" });
|
|
431
|
+
editableDb.close();
|
|
432
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
433
|
+
expect(settingsDb.getSetting("myKey")).to.equal("myValue");
|
|
434
|
+
});
|
|
435
|
+
it("patches existing settings without losing other keys", async () => {
|
|
436
|
+
const container = getContainer("updatesetting-patch-test");
|
|
437
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "updatesetting-patch-test" } });
|
|
438
|
+
editableDb.open();
|
|
439
|
+
editableDb.updateSettings({
|
|
440
|
+
"theme": "light",
|
|
441
|
+
"fontSize": 12,
|
|
442
|
+
"showGrid": true,
|
|
443
|
+
});
|
|
444
|
+
// Patch just one key
|
|
445
|
+
editableDb.updateSetting({ settingName: "theme", value: "dark" });
|
|
446
|
+
editableDb.close();
|
|
447
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
448
|
+
expect(settingsDb.getSetting("theme")).to.equal("dark");
|
|
449
|
+
expect(settingsDb.getSetting("fontSize")).to.equal(12);
|
|
450
|
+
expect(settingsDb.getSetting("showGrid")).to.equal(true);
|
|
451
|
+
});
|
|
452
|
+
it("adds a new key to existing settings", async () => {
|
|
453
|
+
const container = getContainer("updatesetting-addkey-test");
|
|
454
|
+
const editableDb = await container.createDb({ dbName: "test-db", manifest: { settingsName: "updatesetting-addkey-test" } });
|
|
455
|
+
editableDb.open();
|
|
456
|
+
editableDb.updateSettings({ "existing": "value" });
|
|
457
|
+
editableDb.updateSetting({ settingName: "newKey", value: 42 });
|
|
458
|
+
editableDb.close();
|
|
459
|
+
const settingsDb = new SettingsDbImpl({ dbName: "test-db" }, container, SettingsPriority.application);
|
|
460
|
+
expect(settingsDb.getSetting("existing")).to.equal("value");
|
|
461
|
+
expect(settingsDb.getSetting("newKey")).to.equal(42);
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
//# sourceMappingURL=SettingsDb.test.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -90,6 +90,14 @@ export interface SettingsDictionary {
|
|
|
90
90
|
* dictionaries. Those methods - unlike this one - also validate that `settingName` is of type `T` as defined by its [[SettingSchema]].
|
|
91
91
|
*/
|
|
92
92
|
getSetting<T extends Setting>(settingName: SettingName): T | undefined;
|
|
93
|
+
/** Return a deep copy of all settings in this dictionary as a [[SettingsContainer]].
|
|
94
|
+
* This is useful for inspecting the full contents of the dictionary or for building a modified copy
|
|
95
|
+
* to pass to [[EditableSettingsDb.updateSettingsDictionary]].
|
|
96
|
+
* The returned container is cloned using [[Setting.clone]], so callers may freely mutate it without
|
|
97
|
+
* affecting this dictionary's internal state.
|
|
98
|
+
* @beta
|
|
99
|
+
*/
|
|
100
|
+
toJSON(): SettingsContainer;
|
|
93
101
|
}
|
|
94
102
|
/** Uniquely identifies a [[SettingsDictionary]].
|
|
95
103
|
* @beta
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.d.ts","sourceRoot":"","sources":["../../../src/workspace/Settings.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC;AAErC,YAAY;AACZ,yBAAiB,OAAO,CAAC;IACvB,2CAA2C;IAC3C,SAAgB,KAAK,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAOtD;IAED;;;;;;OAMG;IACH,SAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CA4ChF;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC,YAAY;AACZ,yBAAiB,gBAAgB,CAAC;IAChC,yGAAyG;IAClG,MAAM,QAAQ,MAAM,CAAC;IAC5B,sDAAsD;IAC/C,MAAM,WAAW,MAAM,CAAC;IAC/B,6DAA6D;IACtD,MAAM,YAAY,MAAM,CAAC;IAChC,sDAAsD;IAC/C,MAAM,KAAK,MAAM,CAAC;IACzB,wDAAwD;IACjD,MAAM,MAAM,MAAM,CAAC;IAC1B,gDAAgD;IACzC,MAAM,MAAM,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAErC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IAExC;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Settings.d.ts","sourceRoot":"","sources":["../../../src/workspace/Settings.ts"],"names":[],"mappings":"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"}
|