@itwin/core-backend 5.8.0-dev.11 → 5.8.0-dev.13

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 (71) hide show
  1. package/lib/cjs/IModelDb.d.ts.map +1 -1
  2. package/lib/cjs/IModelDb.js +0 -3
  3. package/lib/cjs/IModelDb.js.map +1 -1
  4. package/lib/cjs/LocalHub.d.ts +17 -10
  5. package/lib/cjs/LocalHub.d.ts.map +1 -1
  6. package/lib/cjs/LocalHub.js +126 -28
  7. package/lib/cjs/LocalHub.js.map +1 -1
  8. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  9. package/lib/cjs/internal/workspace/SettingsDbImpl.js +2 -0
  10. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
  11. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  12. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  13. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  14. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  15. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -3
  16. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  17. package/lib/cjs/internal/workspace/SettingsImpl.js +4 -250
  18. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  19. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  20. package/lib/cjs/internal/workspace/WorkspaceImpl.js +13 -11
  21. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  22. package/lib/cjs/workspace/SettingsEditor.d.ts +4 -0
  23. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  24. package/lib/cjs/workspace/SettingsEditor.js +7 -5
  25. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  26. package/lib/cjs/workspace/Workspace.d.ts +3 -1
  27. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  28. package/lib/cjs/workspace/Workspace.js.map +1 -1
  29. package/lib/cjs/workspace/WorkspaceEditor.d.ts +4 -1
  30. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  31. package/lib/cjs/workspace/WorkspaceEditor.js +2 -0
  32. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  33. package/lib/esm/IModelDb.d.ts.map +1 -1
  34. package/lib/esm/IModelDb.js +0 -3
  35. package/lib/esm/IModelDb.js.map +1 -1
  36. package/lib/esm/LocalHub.d.ts +17 -10
  37. package/lib/esm/LocalHub.d.ts.map +1 -1
  38. package/lib/esm/LocalHub.js +127 -29
  39. package/lib/esm/LocalHub.js.map +1 -1
  40. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  41. package/lib/esm/internal/workspace/SettingsDbImpl.js +2 -0
  42. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
  43. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  44. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  45. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  46. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  47. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -3
  48. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  49. package/lib/esm/internal/workspace/SettingsImpl.js +5 -251
  50. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  51. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  52. package/lib/esm/internal/workspace/WorkspaceImpl.js +13 -11
  53. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  54. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  55. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  56. package/lib/esm/test/standalone/Workspace.test.js +100 -0
  57. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  58. package/lib/esm/test/workspace/SettingsDb.test.js +95 -2
  59. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  60. package/lib/esm/workspace/SettingsEditor.d.ts +4 -0
  61. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  62. package/lib/esm/workspace/SettingsEditor.js +6 -4
  63. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  64. package/lib/esm/workspace/Workspace.d.ts +3 -1
  65. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  66. package/lib/esm/workspace/Workspace.js.map +1 -1
  67. package/lib/esm/workspace/WorkspaceEditor.d.ts +4 -1
  68. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  69. package/lib/esm/workspace/WorkspaceEditor.js +2 -0
  70. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  71. package/package.json +13 -13
@@ -3,7 +3,9 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { expect } from "chai";
6
+ import * as sinon from "sinon";
6
7
  import { WorkspaceError } from "@itwin/core-common";
8
+ import { CloudSqlite } from "../../CloudSqlite";
7
9
  import { IModelHost } from "../../IModelHost";
8
10
  import { SettingsPriority } from "../../workspace/Settings";
9
11
  import { SettingsEditor } from "../../workspace/SettingsEditor";
@@ -18,8 +20,8 @@ describe("SettingsDb", () => {
18
20
  after(() => {
19
21
  editor.close();
20
22
  });
21
- function getContainer(containerId) {
22
- return editor.getContainer({ containerId, baseUri: "", storageType: "azure", accessToken: "" });
23
+ function getContainer(containerId, baseUri = "") {
24
+ return editor.getContainer({ containerId, baseUri, storageType: "azure", accessToken: "" });
23
25
  }
24
26
  it("SettingsDbImpl construction", async () => {
25
27
  const container = getContainer("construct-test");
@@ -329,6 +331,97 @@ describe("SettingsDb", () => {
329
331
  expect(settingsDb.getSettings()).to.deep.equal({});
330
332
  });
331
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
+ });
332
425
  describe("updateSetting", () => {
333
426
  it("adds a setting to an empty db", async () => {
334
427
  const container = getContainer("updatesetting-new-test");
@@ -1 +1 @@
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 { WorkspaceError } from \"@itwin/core-common\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { SettingsPriority } from \"../../workspace/Settings\";\r\nimport { EditableSettingsCloudContainer, SettingsEditor } from \"../../workspace/SettingsEditor\";\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): 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 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
+ {"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"]}
@@ -19,6 +19,8 @@ export declare namespace SettingsEditor {
19
19
  function construct(): SettingsEditor;
20
20
  /**
21
21
  * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.
22
+ * @note Do not pass an untrusted or unintended path in `localFileName`.
23
+ * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.
22
24
  */
23
25
  function createEmptyDb(args: {
24
26
  localFileName: LocalFileName;
@@ -139,6 +141,7 @@ export interface EditableSettingsCloudContainer extends CloudSqliteContainer {
139
141
  readonly cloudProps: WorkspaceContainerProps | undefined;
140
142
  /**
141
143
  * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.
144
+ * Repeated calls that resolve to the same SettingsDb return the same cached instance.
142
145
  * @param props - The properties of the SettingsDb.
143
146
  * @returns An EditableSettingsDb for modifying settings.
144
147
  * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.
@@ -172,6 +175,7 @@ export interface EditableSettingsCloudContainer extends CloudSqliteContainer {
172
175
  * @beta
173
176
  */
174
177
  export interface EditableSettingsDb extends SettingsDb {
178
+ /** The editable container that owns this SettingsDb. */
175
179
  readonly container: EditableSettingsCloudContainer;
176
180
  /**
177
181
  * Update the contents of the manifest in this SettingsDb.
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
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
- *--------------------------------------------------------------------------------------------*/
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
5
  /** @packageDocumentation
6
6
  * @module Workspace
7
7
  */
8
8
  import { BlobContainer } from "../BlobContainerService";
9
9
  import { SettingsSqliteDb } from "../internal/workspace/SettingsSqliteDb";
10
- import { constructSettingsEditor } from "../internal/workspace/SettingsImpl";
10
+ import { constructSettingsEditor } from "../internal/workspace/SettingsEditorImpl";
11
11
  import { _implementationProhibited } from "../internal/Symbols";
12
12
  import { IModelHost } from "../IModelHost";
13
13
  /** @beta */
@@ -24,6 +24,8 @@ export var SettingsEditor;
24
24
  SettingsEditor.construct = construct;
25
25
  /**
26
26
  * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.
27
+ * @note Do not pass an untrusted or unintended path in `localFileName`.
28
+ * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.
27
29
  */
28
30
  function createEmptyDb(args) {
29
31
  SettingsSqliteDb.createNewDb(args.localFileName, args);
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsEditor.js","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,YAAY;AACZ,MAAM,KAAW,cAAc,CAyC9B;AAzCD,WAAiB,cAAc;IAC7B;;;;OAIG;IACH,SAAgB,SAAS;QACvB,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAFe,wBAAS,YAExB,CAAA;IAED;;OAEG;IACH,SAAgB,aAAa,CAAC,IAAoE;QAChG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAFe,4BAAa,gBAE5B,CAAA;IAYD;;;;;;;OAOG;IACI,KAAK,UAAU,eAAe,CAAC,IAAiC;QACrE,IAAI,SAAS,KAAK,aAAa,CAAC,OAAO;YACrC,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QAC1H,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QACpD,OAAO,aAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1G,CAAC;IALqB,8BAAe,kBAKpC,CAAA;AACH,CAAC,EAzCgB,cAAc,KAAd,cAAc,QAyC9B","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 { LocalFileName } from \"@itwin/core-common\";\r\nimport { GuidString } from \"@itwin/core-bentley\";\r\nimport { Setting, SettingName, SettingsContainer } from \"./Settings\";\r\nimport { BlobContainer } from \"../BlobContainerService\";\r\nimport { CloudSqliteContainer, GetWorkspaceContainerArgs, Workspace, WorkspaceContainerProps, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbVersion } from \"./Workspace\";\r\nimport { SettingsDb, SettingsDbManifest, SettingsDbProps } from \"./SettingsDb\";\r\nimport { SettingsSqliteDb } from \"../internal/workspace/SettingsSqliteDb\";\r\nimport { constructSettingsEditor } from \"../internal/workspace/SettingsImpl\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/** @beta */\r\nexport namespace SettingsEditor {\r\n /**\r\n * Create a new [[SettingsEditor]] for creating new versions of [[SettingsDb]]s.\r\n * @note The caller becomes the owner of the SettingsEditor and is responsible for calling [[SettingsEditor.close]] on it when finished.\r\n * @note It is illegal to have more than one SettingsEditor active in a single session.\r\n */\r\n export function construct(): SettingsEditor {\r\n return constructSettingsEditor();\r\n }\r\n\r\n /**\r\n * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.\r\n */\r\n export function createEmptyDb(args: { localFileName: LocalFileName; manifest: SettingsDbManifest }): void {\r\n SettingsSqliteDb.createNewDb(args.localFileName, args);\r\n }\r\n\r\n /** Arguments for [[SettingsEditor.queryContainers]] and [[SettingsEditor.findContainers]]. */\r\n export interface QuerySettingsContainersArgs {\r\n /** The iTwinId whose settings containers should be queried. */\r\n iTwinId: GuidString;\r\n /** Optional iModelId to further scope the query to containers associated with a specific iModel. */\r\n iModelId?: GuidString;\r\n /** Optional label filter. */\r\n label?: string;\r\n }\r\n\r\n /**\r\n * Query the [[BlobContainer]] service for all settings containers associated with a given iTwin.\r\n * This is a convenience wrapper around `BlobContainer.service.queryContainersMetadata` that\r\n * automatically filters by `containerType: \"settings\"`.\r\n * @param args - The query arguments including the iTwinId.\r\n * @returns A promise that resolves to the matching container metadata entries.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n export async function queryContainers(args: QuerySettingsContainersArgs): Promise<BlobContainer.MetadataResponse[]> {\r\n if (undefined === BlobContainer.service)\r\n throw new Error(\"BlobContainer.service is not available. Ensure IModelHost is initialized with a valid configuration.\");\r\n const userToken = await IModelHost.getAccessToken();\r\n return BlobContainer.service.queryContainersMetadata(userToken, { ...args, containerType: \"settings\" });\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[SettingsEditor.createNewCloudContainer]] to create a new [[EditableSettingsCloudContainer]].\r\n * The created container will automatically have `containerType: \"settings\"` in its metadata, enabling discovery\r\n * via `BlobContainer.service.queryContainersMetadata({ containerType: \"settings\" })`.\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsContainerArgs {\r\n /**\r\n * The scope of the container. This determines the ownership of the container, how RBAC rights are assigned,\r\n * and the location of the datacenter.\r\n */\r\n scope: BlobContainer.Scope;\r\n /** The manifest to be stored in the default SettingsDb in the new container. */\r\n manifest: SettingsDbManifest;\r\n /** Metadata stored by the BlobContainer service. The `containerType` field is omitted here because it is\r\n * automatically set to `\"settings\"` when the container is created (mirroring the `\"workspace\"` convention for WorkspaceDb containers).\r\n */\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n /** The name of the default [[SettingsDb]] created inside the new container.\r\n * Default: \"settings-db\";\r\n */\r\n dbName?: WorkspaceDbName;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createNewSettingsDbVersion]].\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsDbVersionArgs {\r\n /**\r\n * The properties that determine the source [[SettingsDb]] to serve as the basis for the new version.\r\n * This is usually the latest version, but it is possible to create patches to older versions.\r\n */\r\n fromProps?: SettingsDbProps;\r\n /** The type of version increment to apply to the source version. */\r\n versionType: CloudSqlite.SemverIncrement;\r\n /** For prerelease versions, a string that becomes part of the version name. */\r\n identifier?: string;\r\n}\r\n\r\n/** The result of creating a new version of a [[SettingsDb]].\r\n * @beta\r\n */\r\nexport interface SettingsDbVersionResult {\r\n /** The name and version of the source SettingsDb. */\r\n oldDb: WorkspaceDbNameAndVersion;\r\n /** The name and version of the newly-created SettingsDb. */\r\n newDb: WorkspaceDbNameAndVersion;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createDb]] to create a new [[SettingsDb]] in a container.\r\n * @beta\r\n */\r\nexport interface CreateSettingsDbArgs {\r\n /** The name of the new SettingsDb. Default: `\"settings-db\"`. */\r\n dbName?: WorkspaceDbName;\r\n /** The initial version of the new SettingsDb. Default: `\"0.0.0\"`. */\r\n version?: WorkspaceDbVersion;\r\n /** The manifest for the new SettingsDb. */\r\n manifest: SettingsDbManifest;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsDb.updateSetting]] to add or update a single [[Setting]].\r\n * @beta\r\n */\r\nexport interface UpdateSettingArgs {\r\n /** The [[SettingName]] of the setting to add or update. */\r\n readonly settingName: SettingName;\r\n /** The new value for the setting. */\r\n readonly value: Setting;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] opened for editing settings by a [[SettingsEditor]].\r\n * You can create new [[SettingsDb]]s or new versions of existing [[SettingsDb]]s inside it.\r\n * Before actually making any changes to the container's contents, you must first obtain an exclusive write lock on it via\r\n * [[acquireWriteLock]]. Only one user can hold the write lock at any given time. When you have finished making changes,\r\n * you can use [[releaseWriteLock]] to publish your changes, or [[abandonChanges]] to discard them.\r\n * @note Settings containers are separate from workspace containers, providing independent write locks.\r\n * Editing settings does not block workspace resource editing, and vice versa.\r\n * @beta\r\n */\r\nexport interface EditableSettingsCloudContainer extends CloudSqliteContainer {\r\n /**\r\n * Create a copy of an existing [[SettingsDb]] in this container with a new [[WorkspaceDbVersion]].\r\n * The copy should be modified with new content before the write lock is released,\r\n * and thereafter may never be modified again.\r\n * @param args - The properties that determine the source SettingsDb and the version increment to apply.\r\n * @returns A promise that resolves to an object containing the old and new SettingsDb names and versions.\r\n */\r\n createNewSettingsDbVersion(args: CreateNewSettingsDbVersionArgs): Promise<SettingsDbVersionResult>;\r\n\r\n /**\r\n * Create a new, empty [[SettingsDb]].\r\n * @param args - The arguments for creating the new SettingsDb.\r\n * @returns A promise that resolves to an EditableSettingsDb.\r\n */\r\n createDb(args: CreateSettingsDbArgs): Promise<EditableSettingsDb>;\r\n\r\n /**\r\n * Get the cloud properties of this container.\r\n */\r\n readonly cloudProps: WorkspaceContainerProps | undefined;\r\n\r\n /**\r\n * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.\r\n * @param props - The properties of the SettingsDb.\r\n * @returns An EditableSettingsDb for modifying settings.\r\n * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.\r\n */\r\n getEditableDb(props?: SettingsDbProps): EditableSettingsDb;\r\n\r\n /**\r\n * Acquire the write lock on the container. Use [[releaseWriteLock]] to release the lock after publishing your changes, or\r\n * [[abandonChanges]] to release the lock and discard your changes.\r\n * Only one user can hold the write lock at any given time. However, readers can continue to read the published contents of the container while\r\n * a writer holds the write lock. Readers will only see the writer's changes after they are published by [[releaseWriteLock]].\r\n * @param user - The name of the user acquiring the write lock.\r\n * @throws if the write lock is already held by another user.\r\n */\r\n acquireWriteLock(user: string): void;\r\n\r\n /**\r\n * Release the write lock on the container. This should be called after all changes to the container's contents are complete. It\r\n * publishes and uploads the changes made to any [[SettingsDb]]s while the lock was held, after which those dbs become immutable.\r\n */\r\n releaseWriteLock(): void;\r\n\r\n /**\r\n * Abandon any changes made to the container and release the write lock. Any newly created versions of SettingsDbs are discarded.\r\n */\r\n abandonChanges(): void;\r\n}\r\n\r\n/**\r\n * An editable [[SettingsDb]]. This is used only by tools to allow administrators to create and modify SettingsDbs.\r\n * For cloud-based SettingsDbs, the container's write token must be obtained via [[EditableSettingsCloudContainer.acquireWriteLock]] before the methods in this interface may be used.\r\n * Normally, only admins will have write access.\r\n * Only one admin at a time may be editing a settings container.\r\n * @note Unlike [[EditableWorkspaceDb]], this interface only supports settings operations — no blob, file, or string resource methods.\r\n * @beta\r\n */\r\nexport interface EditableSettingsDb extends SettingsDb {\r\n readonly container: EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Update the contents of the manifest in this SettingsDb.\r\n * @note This replaces the stored manifest entirely; omitted fields are lost.\r\n * @param manifest - The updated manifest.\r\n */\r\n updateManifest(manifest: SettingsDbManifest): void;\r\n\r\n /**\r\n * Replace all settings in this SettingsDb with the given container.\r\n * @param settings - The settings object to store.\r\n */\r\n updateSettings(settings: SettingsContainer): void;\r\n\r\n /**\r\n * Add or update a single [[Setting]] by name.\r\n * If a setting with the given name already exists, its value is replaced.\r\n * If it does not exist, it is added. Other settings are preserved.\r\n * @param args - The arguments specifying the setting name and value.\r\n */\r\n updateSetting(args: UpdateSettingArgs): void;\r\n\r\n /**\r\n * Remove a single [[Setting]] by name. Other settings are preserved.\r\n * @param settingName - The name of the setting to remove.\r\n */\r\n removeSetting(settingName: SettingName): void;\r\n}\r\n\r\n/** An object that permits administrators to modify the contents of settings containers.\r\n * Use [[SettingsEditor.construct]] to obtain a SettingsEditor, and [[close]] when finished using it.\r\n * Only one SettingsEditor may be in use at any given time.\r\n * Use [[getContainer]] to edit an existing container, or [[createNewCloudContainer]] to create a new container.\r\n * @beta\r\n */\r\nexport interface SettingsEditor {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /**\r\n * The workspace dedicated to this editor.\r\n * @note This workspace is independent from [[IModelHost.appWorkspace]] and all [[IModelDb.workspace]]s.\r\n */\r\n readonly workspace: Workspace;\r\n\r\n /**\r\n * Retrieves a container for the editor with the specified properties and access token.\r\n */\r\n getContainer(args: GetWorkspaceContainerArgs): EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Asynchronously retrieves a container for the editor with the specified properties.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Creates a new cloud container for holding SettingsDbs, from the [[BlobContainer]] service.\r\n * The container is automatically assigned `containerType: \"settings\"` in its metadata and\r\n * initialized with a default [[SettingsDb]].\r\n * @param args - The arguments for creating the container, including scope, metadata, and manifest.\r\n * @returns A promise that resolves to the new EditableSettingsCloudContainer.\r\n * @note The current user must have administrator rights for the iTwin for the container.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n createNewCloudContainer(args: CreateNewSettingsContainerArgs): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Find and open existing settings containers by querying the [[BlobContainer]] service.\r\n * This is a convenience method that queries for all settings containers matching the given iTwinId\r\n * (and optionally iModelId), requests write access tokens, and opens each matching container.\r\n * @param args - The query arguments including iTwinId and optionally iModelId and label.\r\n * @returns A promise that resolves to an array of opened [[EditableSettingsCloudContainer]]s.\r\n * @note Requires [[IModelHost.authorizationClient]] and [[BlobContainer.service]] to be configured.\r\n */\r\n findContainers(args: SettingsEditor.QuerySettingsContainersArgs): Promise<EditableSettingsCloudContainer[]>;\r\n\r\n /**\r\n * Closes this editor. All settings containers are dropped.\r\n */\r\n close(): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"SettingsEditor.js","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,YAAY;AACZ,MAAM,KAAW,cAAc,CA0C9B;AA1CD,WAAiB,cAAc;IAC7B;;;;OAIG;IACH,SAAgB,SAAS;QACvB,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAFe,wBAAS,YAExB,CAAA;IAED;;;;OAIG;IACH,SAAgB,aAAa,CAAC,IAAoE;QAChG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAFe,4BAAa,gBAE5B,CAAA;IAYD;;;;;;;OAOG;IACI,KAAK,UAAU,eAAe,CAAC,IAAiC;QACrE,IAAI,SAAS,KAAK,aAAa,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QACjK,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QACpD,OAAO,aAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1G,CAAC;IAJqB,8BAAe,kBAIpC,CAAA;AACH,CAAC,EA1CgB,cAAc,KAAd,cAAc,QA0C9B","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 { LocalFileName } from \"@itwin/core-common\";\r\nimport { GuidString } from \"@itwin/core-bentley\";\r\nimport { Setting, SettingName, SettingsContainer } from \"./Settings\";\r\nimport { BlobContainer } from \"../BlobContainerService\";\r\nimport { CloudSqliteContainer, GetWorkspaceContainerArgs, Workspace, WorkspaceContainerProps, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbVersion } from \"./Workspace\";\r\nimport { SettingsDb, SettingsDbManifest, SettingsDbProps } from \"./SettingsDb\";\r\nimport { SettingsSqliteDb } from \"../internal/workspace/SettingsSqliteDb\";\r\nimport { constructSettingsEditor } from \"../internal/workspace/SettingsEditorImpl\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/** @beta */\r\nexport namespace SettingsEditor {\r\n /**\r\n * Create a new [[SettingsEditor]] for creating new versions of [[SettingsDb]]s.\r\n * @note The caller becomes the owner of the SettingsEditor and is responsible for calling [[SettingsEditor.close]] on it when finished.\r\n * @note It is illegal to have more than one SettingsEditor active in a single session.\r\n */\r\n export function construct(): SettingsEditor {\r\n return constructSettingsEditor();\r\n }\r\n\r\n /**\r\n * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.\r\n * @note Do not pass an untrusted or unintended path in `localFileName`.\r\n * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.\r\n */\r\n export function createEmptyDb(args: { localFileName: LocalFileName; manifest: SettingsDbManifest }): void {\r\n SettingsSqliteDb.createNewDb(args.localFileName, args);\r\n }\r\n\r\n /** Arguments for [[SettingsEditor.queryContainers]] and [[SettingsEditor.findContainers]]. */\r\n export interface QuerySettingsContainersArgs {\r\n /** The iTwinId whose settings containers should be queried. */\r\n iTwinId: GuidString;\r\n /** Optional iModelId to further scope the query to containers associated with a specific iModel. */\r\n iModelId?: GuidString;\r\n /** Optional label filter. */\r\n label?: string;\r\n }\r\n\r\n /**\r\n * Query the [[BlobContainer]] service for all settings containers associated with a given iTwin.\r\n * This is a convenience wrapper around `BlobContainer.service.queryContainersMetadata` that\r\n * automatically filters by `containerType: \"settings\"`.\r\n * @param args - The query arguments including the iTwinId.\r\n * @returns A promise that resolves to the matching container metadata entries.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n export async function queryContainers(args: QuerySettingsContainersArgs): Promise<BlobContainer.MetadataResponse[]> {\r\n if (undefined === BlobContainer.service) throw new Error(\"BlobContainer.service is not available. Ensure IModelHost is initialized with a valid configuration.\");\r\n const userToken = await IModelHost.getAccessToken();\r\n return BlobContainer.service.queryContainersMetadata(userToken, { ...args, containerType: \"settings\" });\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[SettingsEditor.createNewCloudContainer]] to create a new [[EditableSettingsCloudContainer]].\r\n * The created container will automatically have `containerType: \"settings\"` in its metadata, enabling discovery\r\n * via `BlobContainer.service.queryContainersMetadata({ containerType: \"settings\" })`.\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsContainerArgs {\r\n /**\r\n * The scope of the container. This determines the ownership of the container, how RBAC rights are assigned,\r\n * and the location of the datacenter.\r\n */\r\n scope: BlobContainer.Scope;\r\n /** The manifest to be stored in the default SettingsDb in the new container. */\r\n manifest: SettingsDbManifest;\r\n /** Metadata stored by the BlobContainer service. The `containerType` field is omitted here because it is\r\n * automatically set to `\"settings\"` when the container is created (mirroring the `\"workspace\"` convention for WorkspaceDb containers).\r\n */\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n /** The name of the default [[SettingsDb]] created inside the new container.\r\n * Default: \"settings-db\";\r\n */\r\n dbName?: WorkspaceDbName;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createNewSettingsDbVersion]].\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsDbVersionArgs {\r\n /**\r\n * The properties that determine the source [[SettingsDb]] to serve as the basis for the new version.\r\n * This is usually the latest version, but it is possible to create patches to older versions.\r\n */\r\n fromProps?: SettingsDbProps;\r\n /** The type of version increment to apply to the source version. */\r\n versionType: CloudSqlite.SemverIncrement;\r\n /** For prerelease versions, a string that becomes part of the version name. */\r\n identifier?: string;\r\n}\r\n\r\n/** The result of creating a new version of a [[SettingsDb]].\r\n * @beta\r\n */\r\nexport interface SettingsDbVersionResult {\r\n /** The name and version of the source SettingsDb. */\r\n oldDb: WorkspaceDbNameAndVersion;\r\n /** The name and version of the newly-created SettingsDb. */\r\n newDb: WorkspaceDbNameAndVersion;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createDb]] to create a new [[SettingsDb]] in a container.\r\n * @beta\r\n */\r\nexport interface CreateSettingsDbArgs {\r\n /** The name of the new SettingsDb. Default: `\"settings-db\"`. */\r\n dbName?: WorkspaceDbName;\r\n /** The initial version of the new SettingsDb. Default: `\"0.0.0\"`. */\r\n version?: WorkspaceDbVersion;\r\n /** The manifest for the new SettingsDb. */\r\n manifest: SettingsDbManifest;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsDb.updateSetting]] to add or update a single [[Setting]].\r\n * @beta\r\n */\r\nexport interface UpdateSettingArgs {\r\n /** The [[SettingName]] of the setting to add or update. */\r\n readonly settingName: SettingName;\r\n /** The new value for the setting. */\r\n readonly value: Setting;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] opened for editing settings by a [[SettingsEditor]].\r\n * You can create new [[SettingsDb]]s or new versions of existing [[SettingsDb]]s inside it.\r\n * Before actually making any changes to the container's contents, you must first obtain an exclusive write lock on it via\r\n * [[acquireWriteLock]]. Only one user can hold the write lock at any given time. When you have finished making changes,\r\n * you can use [[releaseWriteLock]] to publish your changes, or [[abandonChanges]] to discard them.\r\n * @note Settings containers are separate from workspace containers, providing independent write locks.\r\n * Editing settings does not block workspace resource editing, and vice versa.\r\n * @beta\r\n */\r\nexport interface EditableSettingsCloudContainer extends CloudSqliteContainer {\r\n /**\r\n * Create a copy of an existing [[SettingsDb]] in this container with a new [[WorkspaceDbVersion]].\r\n * The copy should be modified with new content before the write lock is released,\r\n * and thereafter may never be modified again.\r\n * @param args - The properties that determine the source SettingsDb and the version increment to apply.\r\n * @returns A promise that resolves to an object containing the old and new SettingsDb names and versions.\r\n */\r\n createNewSettingsDbVersion(args: CreateNewSettingsDbVersionArgs): Promise<SettingsDbVersionResult>;\r\n\r\n /**\r\n * Create a new, empty [[SettingsDb]].\r\n * @param args - The arguments for creating the new SettingsDb.\r\n * @returns A promise that resolves to an EditableSettingsDb.\r\n */\r\n createDb(args: CreateSettingsDbArgs): Promise<EditableSettingsDb>;\r\n\r\n /**\r\n * Get the cloud properties of this container.\r\n */\r\n readonly cloudProps: WorkspaceContainerProps | undefined;\r\n\r\n /**\r\n * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.\r\n * Repeated calls that resolve to the same SettingsDb return the same cached instance.\r\n * @param props - The properties of the SettingsDb.\r\n * @returns An EditableSettingsDb for modifying settings.\r\n * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.\r\n */\r\n getEditableDb(props?: SettingsDbProps): EditableSettingsDb;\r\n\r\n /**\r\n * Acquire the write lock on the container. Use [[releaseWriteLock]] to release the lock after publishing your changes, or\r\n * [[abandonChanges]] to release the lock and discard your changes.\r\n * Only one user can hold the write lock at any given time. However, readers can continue to read the published contents of the container while\r\n * a writer holds the write lock. Readers will only see the writer's changes after they are published by [[releaseWriteLock]].\r\n * @param user - The name of the user acquiring the write lock.\r\n * @throws if the write lock is already held by another user.\r\n */\r\n acquireWriteLock(user: string): void;\r\n\r\n /**\r\n * Release the write lock on the container. This should be called after all changes to the container's contents are complete. It\r\n * publishes and uploads the changes made to any [[SettingsDb]]s while the lock was held, after which those dbs become immutable.\r\n */\r\n releaseWriteLock(): void;\r\n\r\n /**\r\n * Abandon any changes made to the container and release the write lock. Any newly created versions of SettingsDbs are discarded.\r\n */\r\n abandonChanges(): void;\r\n}\r\n\r\n/**\r\n * An editable [[SettingsDb]]. This is used only by tools to allow administrators to create and modify SettingsDbs.\r\n * For cloud-based SettingsDbs, the container's write token must be obtained via [[EditableSettingsCloudContainer.acquireWriteLock]] before the methods in this interface may be used.\r\n * Normally, only admins will have write access.\r\n * Only one admin at a time may be editing a settings container.\r\n * @note Unlike [[EditableWorkspaceDb]], this interface only supports settings operations — no blob, file, or string resource methods.\r\n * @beta\r\n */\r\nexport interface EditableSettingsDb extends SettingsDb {\r\n /** The editable container that owns this SettingsDb. */\r\n readonly container: EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Update the contents of the manifest in this SettingsDb.\r\n * @note This replaces the stored manifest entirely; omitted fields are lost.\r\n * @param manifest - The updated manifest.\r\n */\r\n updateManifest(manifest: SettingsDbManifest): void;\r\n\r\n /**\r\n * Replace all settings in this SettingsDb with the given container.\r\n * @param settings - The settings object to store.\r\n */\r\n updateSettings(settings: SettingsContainer): void;\r\n\r\n /**\r\n * Add or update a single [[Setting]] by name.\r\n * If a setting with the given name already exists, its value is replaced.\r\n * If it does not exist, it is added. Other settings are preserved.\r\n * @param args - The arguments specifying the setting name and value.\r\n */\r\n updateSetting(args: UpdateSettingArgs): void;\r\n\r\n /**\r\n * Remove a single [[Setting]] by name. Other settings are preserved.\r\n * @param settingName - The name of the setting to remove.\r\n */\r\n removeSetting(settingName: SettingName): void;\r\n}\r\n\r\n/** An object that permits administrators to modify the contents of settings containers.\r\n * Use [[SettingsEditor.construct]] to obtain a SettingsEditor, and [[close]] when finished using it.\r\n * Only one SettingsEditor may be in use at any given time.\r\n * Use [[getContainer]] to edit an existing container, or [[createNewCloudContainer]] to create a new container.\r\n * @beta\r\n */\r\nexport interface SettingsEditor {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /**\r\n * The workspace dedicated to this editor.\r\n * @note This workspace is independent from [[IModelHost.appWorkspace]] and all [[IModelDb.workspace]]s.\r\n */\r\n readonly workspace: Workspace;\r\n\r\n /**\r\n * Retrieves a container for the editor with the specified properties and access token.\r\n */\r\n getContainer(args: GetWorkspaceContainerArgs): EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Asynchronously retrieves a container for the editor with the specified properties.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Creates a new cloud container for holding SettingsDbs, from the [[BlobContainer]] service.\r\n * The container is automatically assigned `containerType: \"settings\"` in its metadata and\r\n * initialized with a default [[SettingsDb]].\r\n * @param args - The arguments for creating the container, including scope, metadata, and manifest.\r\n * @returns A promise that resolves to the new EditableSettingsCloudContainer.\r\n * @note The current user must have administrator rights for the iTwin for the container.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n createNewCloudContainer(args: CreateNewSettingsContainerArgs): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Find and open existing settings containers by querying the [[BlobContainer]] service.\r\n * This is a convenience method that queries for all settings containers matching the given iTwinId\r\n * (and optionally iModelId), requests write access tokens, and opens each matching container.\r\n * @param args - The query arguments including iTwinId and optionally iModelId and label.\r\n * @returns A promise that resolves to an array of opened [[EditableSettingsCloudContainer]]s.\r\n * @note Requires [[IModelHost.authorizationClient]] and [[BlobContainer.service]] to be configured.\r\n */\r\n findContainers(args: SettingsEditor.QuerySettingsContainersArgs): Promise<EditableSettingsCloudContainer[]>;\r\n\r\n /**\r\n * Closes this editor. All settings containers are dropped.\r\n */\r\n close(): void;\r\n}\r\n"]}
@@ -399,7 +399,9 @@ export interface CloudSqliteContainer {
399
399
  export interface WorkspaceContainer extends CloudSqliteContainer {
400
400
  /** @internal */
401
401
  addWorkspaceDb(toAdd: WorkspaceDb): void;
402
- /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`. */
402
+ /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`.
403
+ * Repeated calls that resolve to the same WorkspaceDb return the same cached instance until it is closed.
404
+ */
403
405
  getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb;
404
406
  /** Close and remove a currently opened [[WorkspaceDb]] from this Workspace.
405
407
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":"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"}