@itwin/core-backend 5.8.0-dev.10 → 5.8.0-dev.12

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 (99) 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/core-backend.d.ts +2 -0
  5. package/lib/cjs/core-backend.d.ts.map +1 -1
  6. package/lib/cjs/core-backend.js +2 -0
  7. package/lib/cjs/core-backend.js.map +1 -1
  8. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
  9. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  10. package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
  11. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
  12. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  13. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  14. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  15. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  16. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
  17. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  18. package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
  19. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  20. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  21. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  22. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
  23. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
  24. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
  25. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  26. package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
  27. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  28. package/lib/cjs/workspace/Settings.d.ts +8 -0
  29. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  30. package/lib/cjs/workspace/Settings.js.map +1 -1
  31. package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
  32. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
  33. package/lib/cjs/workspace/SettingsDb.js +19 -0
  34. package/lib/cjs/workspace/SettingsDb.js.map +1 -0
  35. package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
  36. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
  37. package/lib/cjs/workspace/SettingsEditor.js +53 -0
  38. package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
  39. package/lib/cjs/workspace/Workspace.d.ts +42 -19
  40. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  41. package/lib/cjs/workspace/Workspace.js.map +1 -1
  42. package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
  43. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  44. package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
  45. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  46. package/lib/esm/IModelDb.d.ts.map +1 -1
  47. package/lib/esm/IModelDb.js +0 -3
  48. package/lib/esm/IModelDb.js.map +1 -1
  49. package/lib/esm/core-backend.d.ts +2 -0
  50. package/lib/esm/core-backend.d.ts.map +1 -1
  51. package/lib/esm/core-backend.js +2 -0
  52. package/lib/esm/core-backend.js.map +1 -1
  53. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
  54. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  55. package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
  56. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
  57. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  58. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  59. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  60. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  61. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
  62. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  63. package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
  64. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  65. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  66. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  67. package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
  68. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
  69. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
  70. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  71. package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
  72. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  73. package/lib/esm/test/standalone/Settings.test.js +18 -0
  74. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  75. package/lib/esm/test/standalone/Workspace.test.js +160 -0
  76. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  77. package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
  78. package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
  79. package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
  80. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
  81. package/lib/esm/workspace/Settings.d.ts +8 -0
  82. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  83. package/lib/esm/workspace/Settings.js.map +1 -1
  84. package/lib/esm/workspace/SettingsDb.d.ts +109 -0
  85. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
  86. package/lib/esm/workspace/SettingsDb.js +16 -0
  87. package/lib/esm/workspace/SettingsDb.js.map +1 -0
  88. package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
  89. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
  90. package/lib/esm/workspace/SettingsEditor.js +50 -0
  91. package/lib/esm/workspace/SettingsEditor.js.map +1 -0
  92. package/lib/esm/workspace/Workspace.d.ts +42 -19
  93. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  94. package/lib/esm/workspace/Workspace.js.map +1 -1
  95. package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
  96. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  97. package/lib/esm/workspace/WorkspaceEditor.js +19 -0
  98. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  99. package/package.json +13 -13
@@ -7,18 +7,19 @@
7
7
  * @module Workspace
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.SettingsImpl = void 0;
10
+ exports.SettingsImpl = exports.dictionaryMatches = void 0;
11
11
  const fs = require("fs-extra");
12
12
  const json5_1 = require("json5");
13
13
  const path_1 = require("path");
14
14
  const core_bentley_1 = require("@itwin/core-bentley");
15
15
  const IModelJsFs_1 = require("../../IModelJsFs");
16
- const Settings_1 = require("../../workspace/Settings");
17
16
  const IModelHost_1 = require("../../IModelHost");
17
+ const Settings_1 = require("../../workspace/Settings");
18
18
  const Symbols_1 = require("../Symbols");
19
19
  const dictionaryMatches = (d1, d2) => {
20
20
  return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);
21
21
  };
22
+ exports.dictionaryMatches = dictionaryMatches;
22
23
  class SettingsDictionaryImpl {
23
24
  [Symbols_1._implementationProhibited] = undefined;
24
25
  props;
@@ -31,6 +32,9 @@ class SettingsDictionaryImpl {
31
32
  const value = this.settings[settingName];
32
33
  return undefined !== value ? Settings_1.Setting.clone(value) : undefined;
33
34
  }
35
+ toJSON() {
36
+ return Settings_1.Setting.clone(this.settings);
37
+ }
34
38
  }
35
39
  /**
36
40
  * Internal implementation of Settings interface.
@@ -73,14 +77,14 @@ class SettingsImpl {
73
77
  }
74
78
  getDictionary(source) {
75
79
  for (const dictionary of this.dictionaries) {
76
- if (dictionaryMatches(dictionary.props, source))
80
+ if ((0, exports.dictionaryMatches)(dictionary.props, source))
77
81
  return dictionary;
78
82
  }
79
83
  return undefined;
80
84
  }
81
85
  dropDictionary(source, raiseEvent = true) {
82
86
  for (let i = 0; i < this.dictionaries.length; ++i) {
83
- if (dictionaryMatches(this.dictionaries[i].props, source)) {
87
+ if ((0, exports.dictionaryMatches)(this.dictionaries[i].props, source)) {
84
88
  this.dictionaries.splice(i, 1);
85
89
  if (raiseEvent)
86
90
  this.onSettingsChanged.raiseEvent();
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { BeEvent } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst dictionaryMatches = (d1: SettingsDictionarySource, d2: SettingsDictionarySource): boolean => {\r\n return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);\r\n};\r\n\r\nclass SettingsDictionaryImpl implements SettingsDictionary {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly props: SettingsDictionaryProps;\r\n public readonly settings: SettingsContainer;\r\n\r\n public constructor(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.props = { ...props }; // make a copy so it can't be changed by caller\r\n this.settings = settings;\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: string): T | undefined {\r\n const value = this.settings[settingName] as T | undefined;\r\n return undefined !== value ? Setting.clone(value) : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Internal implementation of Settings interface.\r\n * @internal\r\n */\r\nexport class SettingsImpl implements Settings {\r\n public readonly [_implementationProhibited] = undefined;\r\n public dictionaries: SettingsDictionary[] = [];\r\n protected verifyPriority(_priority: SettingsPriority) { }\r\n public close() { }\r\n public readonly onSettingsChanged = new BeEvent<() => void>();\r\n\r\n public addFile(fileName: LocalFileName, priority: SettingsPriority) {\r\n this.addJson({ name: fileName, priority }, fs.readFileSync(fileName, \"utf-8\"));\r\n }\r\n\r\n public addDirectory(dirName: LocalDirName, priority: SettingsPriority) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName), priority);\r\n }\r\n }\r\n\r\n public addJson(props: SettingsDictionaryProps, settingsJson: string) {\r\n this.addDictionary(props, parse(settingsJson));\r\n }\r\n\r\n public addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.verifyPriority(props.priority);\r\n this.dropDictionary(props, false); // make sure we don't have the same dictionary twice\r\n const dict = new SettingsDictionaryImpl(props, settings);\r\n const doAdd = () => {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (this.dictionaries[i].props.priority <= dict.props.priority) {\r\n this.dictionaries.splice(i, 0, dict);\r\n return;\r\n }\r\n }\r\n this.dictionaries.push(dict);\r\n };\r\n doAdd();\r\n this.onSettingsChanged.raiseEvent();\r\n }\r\n\r\n public getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined {\r\n for (const dictionary of this.dictionaries) {\r\n if (dictionaryMatches(dictionary.props, source))\r\n return dictionary;\r\n }\r\n return undefined;\r\n }\r\n\r\n public dropDictionary(source: SettingsDictionarySource, raiseEvent = true) {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (dictionaryMatches(this.dictionaries[i].props, source)) {\r\n this.dictionaries.splice(i, 1);\r\n if (raiseEvent)\r\n this.onSettingsChanged.raiseEvent();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public * getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}> {\r\n for (const dictionary of this.dictionaries) {\r\n const value = dictionary.getSetting<T>(settingName);\r\n if (undefined !== value) {\r\n yield { value, dictionary };\r\n }\r\n }\r\n }\r\n\r\n public * getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T> {\r\n for (const entry of this.getSettingEntries<T>(settingName)) {\r\n yield entry.value;\r\n }\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined {\r\n for (const value of this.getSettingValues<T>(settingName)) {\r\n return value;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // get the setting and verify the result is either undefined or the correct type. If so, return it. Otherwise throw an exception.\r\n private getResult<T extends Setting>(name: SettingName, expectedType: string) {\r\n const out = this.getSetting<T>(name);\r\n if (out === undefined || typeof out === expectedType)\r\n return out;\r\n throw new Error(`setting \"${name}\" is not a ${expectedType}: ${typeof out}`);\r\n }\r\n public getString(name: SettingName, defaultValue: string): string;\r\n public getString(name: SettingName): string | undefined;\r\n public getString(name: SettingName, defaultValue?: string): string | undefined {\r\n return this.getResult<string>(name, \"string\") ?? defaultValue;\r\n }\r\n public getBoolean(name: SettingName, defaultValue: boolean): boolean;\r\n public getBoolean(name: SettingName): boolean | undefined;\r\n public getBoolean(name: SettingName, defaultValue?: boolean): boolean | undefined {\r\n return this.getResult<boolean>(name, \"boolean\") ?? defaultValue;\r\n }\r\n public getNumber(name: SettingName, defaultValue: number): number;\r\n public getNumber(name: SettingName): number | undefined;\r\n public getNumber(name: SettingName, defaultValue?: number): number | undefined {\r\n return this.getResult<number>(name, \"number\") ?? defaultValue;\r\n }\r\n public getObject<T extends object>(name: SettingName, defaultValue: T): T;\r\n public getObject<T extends object>(name: SettingName): T | undefined;\r\n public getObject<T extends object>(name: SettingName, defaultValue?: T): T | undefined {\r\n const out = this.getResult<T>(name, \"object\");\r\n return out ? IModelHost.settingsSchemas.validateSetting(out, name) : defaultValue;\r\n }\r\n public getArray<T extends Setting>(name: SettingName, defaultValue: T[]): T[];\r\n public getArray<T extends Setting>(name: SettingName): T[] | undefined;\r\n public getArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n if (IModelHost.settingsSchemas.settingDefs.get(name)?.combineArray) {\r\n return this.getCombinedArray<T>(name, defaultValue);\r\n }\r\n\r\n const out = this.getSetting<T[]>(name);\r\n if (out === undefined)\r\n return defaultValue;\r\n if (!Array.isArray(out))\r\n throw new Error(`setting ${name} is not an array: ${String(out)}`);\r\n return IModelHost.settingsSchemas.validateSetting(out, name);\r\n }\r\n\r\n private getCombinedArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n let foundSetting = false;\r\n const out: T[] = [];\r\n for (const array of this.getSettingValues<T[]>(name)) {\r\n foundSetting = true;\r\n\r\n IModelHost.settingsSchemas.validateSetting(array, name);\r\n for (const value of array) {\r\n if (undefined === out.find((x) => Setting.areEqual(x, value))) {\r\n out.push(value);\r\n }\r\n }\r\n }\r\n\r\n return foundSetting ? out : defaultValue;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SettingsImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { BeEvent } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nexport const dictionaryMatches = (d1: SettingsDictionarySource, d2: SettingsDictionarySource): boolean => {\r\n return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);\r\n};\r\n\r\nclass SettingsDictionaryImpl implements SettingsDictionary {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly props: SettingsDictionaryProps;\r\n public readonly settings: SettingsContainer;\r\n\r\n public constructor(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.props = { ...props }; // make a copy so it can't be changed by caller\r\n this.settings = settings;\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: string): T | undefined {\r\n const value = this.settings[settingName] as T | undefined;\r\n return undefined !== value ? Setting.clone(value) : undefined;\r\n }\r\n\r\n public toJSON(): SettingsContainer {\r\n return Setting.clone(this.settings);\r\n }\r\n}\r\n\r\n/**\r\n * Internal implementation of Settings interface.\r\n * @internal\r\n */\r\nexport class SettingsImpl implements Settings {\r\n public readonly [_implementationProhibited] = undefined;\r\n public dictionaries: SettingsDictionary[] = [];\r\n protected verifyPriority(_priority: SettingsPriority) { }\r\n public close() { }\r\n public readonly onSettingsChanged = new BeEvent<() => void>();\r\n\r\n public addFile(fileName: LocalFileName, priority: SettingsPriority) {\r\n this.addJson({ name: fileName, priority }, fs.readFileSync(fileName, \"utf-8\"));\r\n }\r\n\r\n public addDirectory(dirName: LocalDirName, priority: SettingsPriority) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName), priority);\r\n }\r\n }\r\n\r\n public addJson(props: SettingsDictionaryProps, settingsJson: string) {\r\n this.addDictionary(props, parse(settingsJson));\r\n }\r\n\r\n public addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.verifyPriority(props.priority);\r\n this.dropDictionary(props, false); // make sure we don't have the same dictionary twice\r\n const dict = new SettingsDictionaryImpl(props, settings);\r\n const doAdd = () => {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (this.dictionaries[i].props.priority <= dict.props.priority) {\r\n this.dictionaries.splice(i, 0, dict);\r\n return;\r\n }\r\n }\r\n this.dictionaries.push(dict);\r\n };\r\n doAdd();\r\n this.onSettingsChanged.raiseEvent();\r\n }\r\n\r\n public getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined {\r\n for (const dictionary of this.dictionaries) {\r\n if (dictionaryMatches(dictionary.props, source))\r\n return dictionary;\r\n }\r\n return undefined;\r\n }\r\n\r\n public dropDictionary(source: SettingsDictionarySource, raiseEvent = true) {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (dictionaryMatches(this.dictionaries[i].props, source)) {\r\n this.dictionaries.splice(i, 1);\r\n if (raiseEvent)\r\n this.onSettingsChanged.raiseEvent();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public * getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}> {\r\n for (const dictionary of this.dictionaries) {\r\n const value = dictionary.getSetting<T>(settingName);\r\n if (undefined !== value) {\r\n yield { value, dictionary };\r\n }\r\n }\r\n }\r\n\r\n public * getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T> {\r\n for (const entry of this.getSettingEntries<T>(settingName)) {\r\n yield entry.value;\r\n }\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined {\r\n for (const value of this.getSettingValues<T>(settingName)) {\r\n return value;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // get the setting and verify the result is either undefined or the correct type. If so, return it. Otherwise throw an exception.\r\n private getResult<T extends Setting>(name: SettingName, expectedType: string) {\r\n const out = this.getSetting<T>(name);\r\n if (out === undefined || typeof out === expectedType)\r\n return out;\r\n throw new Error(`setting \"${name}\" is not a ${expectedType}: ${typeof out}`);\r\n }\r\n public getString(name: SettingName, defaultValue: string): string;\r\n public getString(name: SettingName): string | undefined;\r\n public getString(name: SettingName, defaultValue?: string): string | undefined {\r\n return this.getResult<string>(name, \"string\") ?? defaultValue;\r\n }\r\n public getBoolean(name: SettingName, defaultValue: boolean): boolean;\r\n public getBoolean(name: SettingName): boolean | undefined;\r\n public getBoolean(name: SettingName, defaultValue?: boolean): boolean | undefined {\r\n return this.getResult<boolean>(name, \"boolean\") ?? defaultValue;\r\n }\r\n public getNumber(name: SettingName, defaultValue: number): number;\r\n public getNumber(name: SettingName): number | undefined;\r\n public getNumber(name: SettingName, defaultValue?: number): number | undefined {\r\n return this.getResult<number>(name, \"number\") ?? defaultValue;\r\n }\r\n public getObject<T extends object>(name: SettingName, defaultValue: T): T;\r\n public getObject<T extends object>(name: SettingName): T | undefined;\r\n public getObject<T extends object>(name: SettingName, defaultValue?: T): T | undefined {\r\n const out = this.getResult<T>(name, \"object\");\r\n return out ? IModelHost.settingsSchemas.validateSetting(out, name) : defaultValue;\r\n }\r\n public getArray<T extends Setting>(name: SettingName, defaultValue: T[]): T[];\r\n public getArray<T extends Setting>(name: SettingName): T[] | undefined;\r\n public getArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n if (IModelHost.settingsSchemas.settingDefs.get(name)?.combineArray) {\r\n return this.getCombinedArray<T>(name, defaultValue);\r\n }\r\n\r\n const out = this.getSetting<T[]>(name);\r\n if (out === undefined)\r\n return defaultValue;\r\n if (!Array.isArray(out))\r\n throw new Error(`setting ${name} is not an array: ${String(out)}`);\r\n return IModelHost.settingsSchemas.validateSetting(out, name);\r\n }\r\n\r\n private getCombinedArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n let foundSetting = false;\r\n const out: T[] = [];\r\n for (const array of this.getSettingValues<T[]>(name)) {\r\n foundSetting = true;\r\n\r\n IModelHost.settingsSchemas.validateSetting(array, name);\r\n for (const value of array) {\r\n if (undefined === out.find((x) => Setting.areEqual(x, value))) {\r\n out.push(value);\r\n }\r\n }\r\n }\r\n\r\n return foundSetting ? out : defaultValue;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,14 @@
1
+ /** @packageDocumentation
2
+ * @module Workspace
3
+ */
4
+ import { SQLiteDb, VersionedSqliteDb } from "../../SQLiteDb";
5
+ /** A [[VersionedSqliteDb]] that stores settings dictionaries. Unlike [[WorkspaceSqliteDb]], the
6
+ * manifest is stored using [[settingsManifestProperty]] so that settings and workspace databases
7
+ * can coexist in the same container without ambiguity.
8
+ */
9
+ export declare class SettingsSqliteDb extends VersionedSqliteDb {
10
+ myVersion: string;
11
+ getRequiredVersions(): SQLiteDb.RequiredVersionRanges;
12
+ protected createDDL(args: any): void;
13
+ }
14
+ //# sourceMappingURL=SettingsSqliteDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsSqliteDb.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSqliteDb.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAK7D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrC,SAAS,SAAW;IACpB,mBAAmB,IAAI,QAAQ,CAAC,qBAAqB;cAUlD,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;CAO9C"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Workspace
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SettingsSqliteDb = void 0;
11
+ const SQLiteDb_1 = require("../../SQLiteDb");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const Symbols_1 = require("../Symbols");
14
+ const SettingsDbImpl_1 = require("./SettingsDbImpl");
15
+ /** A [[VersionedSqliteDb]] that stores settings dictionaries. Unlike [[WorkspaceSqliteDb]], the
16
+ * manifest is stored using [[settingsManifestProperty]] so that settings and workspace databases
17
+ * can coexist in the same container without ambiguity.
18
+ */
19
+ class SettingsSqliteDb extends SQLiteDb_1.VersionedSqliteDb {
20
+ myVersion = "1.0.0";
21
+ getRequiredVersions() {
22
+ try {
23
+ return super.getRequiredVersions();
24
+ }
25
+ catch (e) {
26
+ if (core_common_1.SqliteError.isError(e, "invalid-versions-property"))
27
+ return { readVersion: "^1", writeVersion: "^1" };
28
+ throw e;
29
+ }
30
+ }
31
+ createDDL(args) {
32
+ const timeStampCol = "lastMod TIMESTAMP NOT NULL DEFAULT(julianday('now'))";
33
+ this.executeSQL(`CREATE TABLE strings(id TEXT PRIMARY KEY NOT NULL,value TEXT,${timeStampCol})`);
34
+ this.executeSQL(`CREATE TRIGGER strings_timeStamp AFTER UPDATE ON strings WHEN old.lastMod=new.lastMod AND old.lastMod != julianday('now') BEGIN UPDATE strings SET lastMod=julianday('now') WHERE id=new.id; END`);
35
+ if (args?.manifest)
36
+ this[Symbols_1._nativeDb].saveFileProperty(SettingsDbImpl_1.settingsManifestProperty, JSON.stringify(args.manifest));
37
+ }
38
+ }
39
+ exports.SettingsSqliteDb = SettingsSqliteDb;
40
+ //# sourceMappingURL=SettingsSqliteDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsSqliteDb.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSqliteDb.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,6CAA6D;AAC7D,oDAAiD;AACjD,wCAAuC;AACvC,qDAA4D;AAE5D;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,4BAAiB;IACrC,SAAS,GAAG,OAAO,CAAC;IACpB,mBAAmB;QACjC,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,mBAAmB,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,yBAAW,CAAC,OAAO,CAAC,CAAC,EAAE,2BAA2B,CAAC;gBACrD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAEkB,SAAS,CAAC,IAAS;QACpC,MAAM,YAAY,GAAG,sDAAsD,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,gEAAgE,YAAY,GAAG,CAAC,CAAC;QACjG,IAAI,CAAC,UAAU,CAAC,kMAAkM,CAAC,CAAC;QACpN,IAAI,IAAI,EAAE,QAAQ;YAChB,IAAI,CAAC,mBAAS,CAAC,CAAC,gBAAgB,CAAC,yCAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9F,CAAC;CACF;AAnBD,4CAmBC","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 { SQLiteDb, VersionedSqliteDb } from \"../../SQLiteDb\";\r\nimport { SqliteError } from \"@itwin/core-common\";\r\nimport { _nativeDb } from \"../Symbols\";\r\nimport { settingsManifestProperty } from \"./SettingsDbImpl\";\r\n\r\n/** A [[VersionedSqliteDb]] that stores settings dictionaries. Unlike [[WorkspaceSqliteDb]], the\r\n * manifest is stored using [[settingsManifestProperty]] so that settings and workspace databases\r\n * can coexist in the same container without ambiguity.\r\n */\r\nexport class SettingsSqliteDb extends VersionedSqliteDb {\r\n public override myVersion = \"1.0.0\";\r\n public override getRequiredVersions(): SQLiteDb.RequiredVersionRanges {\r\n try {\r\n return super.getRequiredVersions();\r\n } catch (e) {\r\n if (SqliteError.isError(e, \"invalid-versions-property\"))\r\n return { readVersion: \"^1\", writeVersion: \"^1\" };\r\n throw e;\r\n }\r\n }\r\n\r\n protected override createDDL(args: any): void {\r\n const timeStampCol = \"lastMod TIMESTAMP NOT NULL DEFAULT(julianday('now'))\";\r\n this.executeSQL(`CREATE TABLE strings(id TEXT PRIMARY KEY NOT NULL,value TEXT,${timeStampCol})`);\r\n this.executeSQL(`CREATE TRIGGER strings_timeStamp AFTER UPDATE ON strings WHEN old.lastMod=new.lastMod AND old.lastMod != julianday('now') BEGIN UPDATE strings SET lastMod=julianday('now') WHERE id=new.id; END`);\r\n if (args?.manifest)\r\n this[_nativeDb].saveFileProperty(settingsManifestProperty, JSON.stringify(args.manifest));\r\n }\r\n}\r\n"]}
@@ -10,6 +10,7 @@ export declare const workspaceDbFileExt = "itwin-workspace";
10
10
  export declare function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb;
11
11
  export declare function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace;
12
12
  export declare function constructWorkspaceEditor(): WorkspaceEditor;
13
+ export declare function constructSettingsEditorWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace;
13
14
  /**
14
15
  * Validate that a WorkspaceContainer.Id is valid.
15
16
  * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAAoB,iBAAiB,EAA+C,MAAM,oBAAoB,CAAC;AAMtH,OAAO,EAAe,QAAQ,EAAgE,MAAM,0BAA0B,CAAC;AAE/H,OAAO,EACsB,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAA2B,WAAW,EAC/F,oBAAoB,EAA0F,gBAAgB,EAC1F,aAAa,EACvE,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAqH,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAUrL,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAqrBpD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,GAAG,WAAW,CAExG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAE3F;AAED,wBAAgB,wBAAwB,IAAI,eAAe,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,oBAAoB,QAGpE;AAED,eAAO,MAAM,yBAAyB,EAAE,iBAAgE,CAAC;AAOzG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAEvG;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,kDAAkD;IAClD,KAAK,IAAI,IAAI,CAAC;CACf"}
1
+ {"version":3,"file":"WorkspaceImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAAoB,iBAAiB,EAA+C,MAAM,oBAAoB,CAAC;AAMtH,OAAO,EAAe,QAAQ,EAAgE,MAAM,0BAA0B,CAAC;AAG/H,OAAO,EACsB,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAA2B,WAAW,EAC/F,oBAAoB,EAA0F,gBAAgB,EACtE,aAAa,EAC3F,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAqH,eAAe,EAAwC,MAAM,iCAAiC,CAAC;AAY3N,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AA+tBpD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,GAAG,WAAW,CAExG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAE3F;AAED,wBAAgB,wBAAwB,IAAI,eAAe,CAE1D;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAEzG;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,oBAAoB,QAGpE;AAED,eAAO,MAAM,yBAAyB,EAAE,iBAAgE,CAAC;AAOzG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAEvG;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,kDAAkD;IAClD,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -11,6 +11,7 @@ exports.workspaceManifestProperty = exports.workspaceDbFileExt = void 0;
11
11
  exports.constructWorkspaceDb = constructWorkspaceDb;
12
12
  exports.constructWorkspace = constructWorkspace;
13
13
  exports.constructWorkspaceEditor = constructWorkspaceEditor;
14
+ exports.constructSettingsEditorWorkspace = constructSettingsEditorWorkspace;
14
15
  exports.validateWorkspaceContainerId = validateWorkspaceContainerId;
15
16
  exports.throwWorkspaceDbLoadErrors = throwWorkspaceDbLoadErrors;
16
17
  const crypto_1 = require("crypto");
@@ -23,12 +24,15 @@ const IModelHost_1 = require("../../IModelHost");
23
24
  const IModelJsFs_1 = require("../../IModelJsFs");
24
25
  const SQLiteDb_1 = require("../../SQLiteDb");
25
26
  const Settings_1 = require("../../workspace/Settings");
27
+ const SettingsDb_1 = require("../../workspace/SettingsDb");
26
28
  const Workspace_1 = require("../../workspace/Workspace");
27
29
  const WorkspaceEditor_1 = require("../../workspace/WorkspaceEditor");
28
30
  const WorkspaceSqliteDb_1 = require("./WorkspaceSqliteDb");
31
+ const SettingsDbImpl_1 = require("./SettingsDbImpl");
29
32
  const SettingsImpl_1 = require("./SettingsImpl");
30
33
  const Symbols_1 = require("../Symbols");
31
34
  const OnlineStatus_1 = require("../OnlineStatus");
35
+ const BlobContainerService_1 = require("../../BlobContainerService");
32
36
  function workspaceDbNameWithDefault(dbName) {
33
37
  return dbName ?? "workspace-db";
34
38
  }
@@ -113,24 +117,25 @@ class WorkspaceContainerImpl {
113
117
  }
114
118
  }
115
119
  resolveDbFileName(props) {
120
+ const dbName = workspaceDbNameWithDefault(props.dbName);
116
121
  const container = this.cloudContainer;
117
122
  if (undefined === container)
118
- return (0, path_1.join)(this.dirName, `${props.dbName}.${exports.workspaceDbFileExt}`); // local file, versions not allowed
119
- return CloudSqlite_1.CloudSqlite.querySemverMatch({ ...props, container, dbName: workspaceDbNameWithDefault(props.dbName) });
123
+ return (0, path_1.join)(this.dirName, `${dbName}.${exports.workspaceDbFileExt}`); // local file, versions not allowed
124
+ return CloudSqlite_1.CloudSqlite.querySemverMatch({ ...props, container, dbName });
120
125
  }
121
126
  addWorkspaceDb(toAdd) {
122
- if (undefined !== this._wsDbs.get(toAdd.dbName))
127
+ if (undefined !== this._wsDbs.get(toAdd.dbFileName))
123
128
  core_common_1.WorkspaceError.throwError("already-exists", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });
124
- this._wsDbs.set(toAdd.dbName, toAdd);
129
+ this._wsDbs.set(toAdd.dbFileName, toAdd);
125
130
  }
126
131
  getWorkspaceDb(props) {
127
- return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);
132
+ const dbFileName = this.resolveDbFileName(props ?? {});
133
+ return this._wsDbs.get(dbFileName) ?? new WorkspaceDbImpl(props ?? {}, this);
128
134
  }
129
135
  closeWorkspaceDb(toDrop) {
130
- const name = toDrop.dbName;
131
- const wsDb = this._wsDbs.get(name);
136
+ const wsDb = this._wsDbs.get(toDrop.dbFileName);
132
137
  if (wsDb === toDrop) {
133
- this._wsDbs.delete(name);
138
+ this._wsDbs.delete(toDrop.dbFileName);
134
139
  wsDb.close();
135
140
  }
136
141
  }
@@ -321,6 +326,15 @@ class WorkspaceImpl {
321
326
  }
322
327
  return container.getWorkspaceDb(props);
323
328
  }
329
+ getSettingsDb(args) {
330
+ const container = this.findContainer(args.containerId);
331
+ if (undefined === container)
332
+ core_common_1.WorkspaceError.throwError("does-not-exist", { message: `No settings container found for containerId "${args.containerId}"` });
333
+ const settingsDb = new SettingsDbImpl_1.SettingsDbImpl({ dbName: args.dbName ?? "settings-db", version: args.version }, container, args.priority);
334
+ if (!settingsDb.hasSettingsManifestProperty)
335
+ core_common_1.WorkspaceError.throwError("does-not-exist", { message: `Container "${args.containerId}" does not contain a SettingsDb — missing settings manifest` });
336
+ return settingsDb;
337
+ }
324
338
  async loadSettingsDictionary(props, problems) {
325
339
  if (!Array.isArray(props))
326
340
  props = [props];
@@ -329,12 +343,13 @@ class WorkspaceImpl {
329
343
  db.open();
330
344
  try {
331
345
  const manifest = db.manifest;
332
- const dictProps = { name: prop.resourceName, workspaceDb: db, priority: prop.priority };
346
+ const resourceName = prop.resourceName ?? SettingsDb_1.settingsResourceName;
347
+ const dictProps = { name: resourceName, workspaceDb: db, priority: prop.priority };
333
348
  // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list
334
349
  if (undefined === this.settings.getDictionary(dictProps)) {
335
- const settingsJson = db.getString(prop.resourceName);
350
+ const settingsJson = db.getString(resourceName);
336
351
  if (undefined === settingsJson)
337
- throwWorkspaceDbLoadError(`could not load setting dictionary resource '${prop.resourceName}' from: '${manifest.workspaceName}'`, prop, db);
352
+ throwWorkspaceDbLoadError(`could not load setting dictionary resource '${resourceName}' from: '${manifest.workspaceName}'`, prop, db);
338
353
  db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.
339
354
  this.settings.addJson(dictProps, settingsJson);
340
355
  const dict = this.settings.getDictionary(dictProps);
@@ -409,6 +424,12 @@ class EditorWorkspaceImpl extends WorkspaceImpl {
409
424
  return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: "20G" });
410
425
  }
411
426
  }
427
+ const settingsEditorCacheName = "SettingsEditor";
428
+ class SettingsEditorWorkspaceImpl extends WorkspaceImpl {
429
+ getCloudCache() {
430
+ return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: settingsEditorCacheName, cacheSize: "2G" });
431
+ }
432
+ }
412
433
  class EditorImpl {
413
434
  [Symbols_1._implementationProhibited] = undefined;
414
435
  workspace = new EditorWorkspaceImpl(new SettingsImpl_1.SettingsImpl(), { containerDir: (0, path_1.join)(IModelHost_1.IModelHost.cacheDir, workspaceEditorName) });
@@ -441,6 +462,24 @@ class EditorImpl {
441
462
  : await CloudSqlite_1.CloudSqlite.requestToken({ ...props, accessLevel: "write" });
442
463
  return this.getContainer({ ...props, accessToken });
443
464
  }
465
+ async findContainers(args) {
466
+ const containers = await WorkspaceEditor_1.WorkspaceEditor.queryContainers(args);
467
+ const userToken = await IModelHost_1.IModelHost.getAccessToken();
468
+ const results = [];
469
+ for (const containerMeta of containers) {
470
+ // queryContainers already validates that BlobContainer.service is defined, so the non-null assertion is safe here.
471
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
472
+ const tokenProps = await BlobContainerService_1.BlobContainer.service.requestToken({ containerId: containerMeta.containerId, userToken, accessLevel: "write" });
473
+ results.push(this.getContainer({
474
+ containerId: containerMeta.containerId,
475
+ baseUri: tokenProps.baseUri,
476
+ storageType: tokenProps.provider,
477
+ accessToken: tokenProps.token,
478
+ writeable: true,
479
+ }));
480
+ }
481
+ return results;
482
+ }
444
483
  close() {
445
484
  this.workspace.close();
446
485
  }
@@ -471,9 +510,10 @@ class EditorContainerImpl extends WorkspaceContainerImpl {
471
510
  return this.getEditableDb(props);
472
511
  }
473
512
  getEditableDb(props) {
474
- const db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) ?? new EditableDbImpl(props, this);
513
+ const dbFileName = this.resolveDbFileName(props);
514
+ const db = this._wsDbs.get(dbFileName) ?? new EditableDbImpl(props, this);
475
515
  if (this.cloudContainer && !CloudSqlite_1.CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {
476
- this._wsDbs.delete(workspaceDbNameWithDefault(props.dbName));
516
+ this._wsDbs.delete(dbFileName);
477
517
  core_common_1.CloudSqliteError.throwError("already-published", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });
478
518
  }
479
519
  return db;
@@ -506,7 +546,7 @@ class EditorContainerImpl extends WorkspaceContainerImpl {
506
546
  if (fs.existsSync(tempDbFile))
507
547
  IModelJsFs_1.IModelJsFs.removeSync(tempDbFile);
508
548
  WorkspaceEditor_1.WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });
509
- await CloudSqlite_1.CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite_1.CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName)) });
549
+ await CloudSqlite_1.CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite_1.CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), args.version) });
510
550
  IModelJsFs_1.IModelJsFs.removeSync(tempDbFile);
511
551
  }
512
552
  return this.getWorkspaceDb(args);
@@ -634,6 +674,9 @@ function constructWorkspace(settings, opts) {
634
674
  function constructWorkspaceEditor() {
635
675
  return new EditorImpl();
636
676
  }
677
+ function constructSettingsEditorWorkspace(settings, opts) {
678
+ return new SettingsEditorWorkspaceImpl(settings, opts);
679
+ }
637
680
  /**
638
681
  * Validate that a WorkspaceContainer.Id is valid.
639
682
  * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):