@itwin/core-backend 5.8.0-dev.1 → 5.8.0-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/ECDb.d.ts +26 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +53 -2
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +66 -0
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/cjs/ECSqlRowExecutor.js +135 -0
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -0
- package/lib/cjs/ECSqlStatement.d.ts +13 -1
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +30 -0
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts +104 -0
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/cjs/ECSqlSyncReader.js +191 -0
- package/lib/cjs/ECSqlSyncReader.js.map +1 -0
- package/lib/cjs/IModelDb.d.ts +26 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +55 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +3 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +3 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +106 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +3 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +251 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +54 -5
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +8 -0
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsDb.js +19 -0
- package/lib/cjs/workspace/SettingsDb.js.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts +246 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.js +51 -0
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
- package/lib/cjs/workspace/Workspace.d.ts +39 -18
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +28 -0
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +17 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/ECDb.d.ts +26 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +54 -3
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +66 -0
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/esm/ECSqlRowExecutor.js +131 -0
- package/lib/esm/ECSqlRowExecutor.js.map +1 -0
- package/lib/esm/ECSqlStatement.d.ts +13 -1
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +30 -0
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts +104 -0
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/esm/ECSqlSyncReader.js +187 -0
- package/lib/esm/ECSqlSyncReader.js.map +1 -0
- package/lib/esm/IModelDb.d.ts +26 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +55 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/core-backend.d.ts +3 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +3 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js +102 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +3 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +253 -4
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +54 -6
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +113 -14
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts +2 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +122 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js +1427 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -0
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js +11 -5
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +178 -100
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +18 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +113 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/iModelDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/iModelDb.test.js +35 -0
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.js +372 -0
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
- package/lib/esm/workspace/Settings.d.ts +8 -0
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +109 -0
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsDb.js +16 -0
- package/lib/esm/workspace/SettingsDb.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +246 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsEditor.js +48 -0
- package/lib/esm/workspace/SettingsEditor.js.map +1 -0
- package/lib/esm/workspace/Workspace.d.ts +39 -18
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +28 -0
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +17 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +13 -13
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts +0 -2
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts.map +0 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +0 -669
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
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.SettingsDbImpl = exports.settingsManifestProperty = exports.settingsDbDefaultName = void 0;
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
|
+
const CloudSqlite_1 = require("../../CloudSqlite");
|
|
13
|
+
const Settings_1 = require("../../workspace/Settings");
|
|
14
|
+
const SettingsDb_1 = require("../../workspace/SettingsDb");
|
|
15
|
+
const WorkspaceSqliteDb_1 = require("./WorkspaceSqliteDb");
|
|
16
|
+
const Symbols_1 = require("../Symbols");
|
|
17
|
+
exports.settingsDbDefaultName = "settings-db";
|
|
18
|
+
exports.settingsManifestProperty = { namespace: "settings", name: "manifest" };
|
|
19
|
+
/** Internal implementation of [[SettingsDb]]. Wraps a [[WorkspaceSqliteDb]] to provide a
|
|
20
|
+
* settings-only read interface over the `strings` table.
|
|
21
|
+
*/
|
|
22
|
+
class SettingsDbImpl {
|
|
23
|
+
[Symbols_1._implementationProhibited] = undefined;
|
|
24
|
+
sqliteDb = new WorkspaceSqliteDb_1.WorkspaceSqliteDb();
|
|
25
|
+
dbName;
|
|
26
|
+
dbFileName;
|
|
27
|
+
_container;
|
|
28
|
+
priority;
|
|
29
|
+
_manifest;
|
|
30
|
+
constructor(props, container, priority) {
|
|
31
|
+
this.dbName = props.dbName ?? exports.settingsDbDefaultName;
|
|
32
|
+
CloudSqlite_1.CloudSqlite.validateDbName(this.dbName);
|
|
33
|
+
this._container = container;
|
|
34
|
+
this.dbFileName = container.resolveDbFileName(props);
|
|
35
|
+
this.priority = priority;
|
|
36
|
+
}
|
|
37
|
+
get container() { return this._container; }
|
|
38
|
+
get isOpen() { return this.sqliteDb.isOpen; }
|
|
39
|
+
get version() {
|
|
40
|
+
const cloudContainer = this.container.cloudContainer;
|
|
41
|
+
if (undefined === cloudContainer)
|
|
42
|
+
return "0.0.0";
|
|
43
|
+
return CloudSqlite_1.CloudSqlite.parseDbFileName(this.dbFileName).version;
|
|
44
|
+
}
|
|
45
|
+
get manifest() {
|
|
46
|
+
return this._manifest ??= this.withOpenDb((db) => {
|
|
47
|
+
const manifestJson = db[Symbols_1._nativeDb].queryFileProperty(exports.settingsManifestProperty, true);
|
|
48
|
+
if (!manifestJson)
|
|
49
|
+
return { settingsName: this.dbName };
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(manifestJson);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
throw new Error(`Failed to parse manifest in SettingsDb "${this.dbName}": ${e instanceof Error ? e.message : String(e)}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Check whether the underlying database has a settings manifest property.
|
|
59
|
+
* Used to validate that a container actually holds a SettingsDb rather than a WorkspaceDb.
|
|
60
|
+
*/
|
|
61
|
+
get hasSettingsManifestProperty() {
|
|
62
|
+
return this.withOpenDb((db) => {
|
|
63
|
+
const manifestJson = db[Symbols_1._nativeDb].queryFileProperty(exports.settingsManifestProperty, true);
|
|
64
|
+
return manifestJson !== undefined;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
withOpenDb(operation) {
|
|
68
|
+
const done = this.isOpen ? () => { } : (this.open(), () => this.close());
|
|
69
|
+
try {
|
|
70
|
+
return operation(this.sqliteDb);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
done();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
open() {
|
|
77
|
+
this.sqliteDb.openDb(this.dbFileName, core_bentley_1.OpenMode.Readonly, this._container.cloudContainer);
|
|
78
|
+
}
|
|
79
|
+
close() {
|
|
80
|
+
if (this.isOpen)
|
|
81
|
+
this.sqliteDb.closeDb();
|
|
82
|
+
}
|
|
83
|
+
getSettings() {
|
|
84
|
+
return this.withOpenDb((db) => {
|
|
85
|
+
return db.withSqliteStatement("SELECT value FROM strings WHERE id=?", (stmt) => {
|
|
86
|
+
stmt.bindString(1, SettingsDb_1.settingsResourceName);
|
|
87
|
+
if (core_bentley_1.DbResult.BE_SQLITE_ROW !== stmt.step())
|
|
88
|
+
return {};
|
|
89
|
+
try {
|
|
90
|
+
// JSON.parse already returns a fresh object tree — no explicit clone needed.
|
|
91
|
+
return JSON.parse(stmt.getValueString(0));
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
throw new Error(`Failed to parse settings in SettingsDb "${this.dbName}": ${e instanceof Error ? e.message : String(e)}`);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
getSetting(settingName) {
|
|
100
|
+
const settings = this.getSettings();
|
|
101
|
+
const value = settings[settingName];
|
|
102
|
+
return value !== undefined ? Settings_1.Setting.clone(value) : undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.SettingsDbImpl = SettingsDbImpl;
|
|
106
|
+
//# sourceMappingURL=SettingsDbImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsDbImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsDbImpl.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 { DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { FilePropertyProps } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { Setting, SettingName, SettingsContainer, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { CloudSqliteContainer, WorkspaceDbName } from \"../../workspace/Workspace\";\r\nimport { SettingsDb, SettingsDbManifest, SettingsDbProps, settingsResourceName } from \"../../workspace/SettingsDb\";\r\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\n\r\nexport const settingsDbDefaultName: WorkspaceDbName = \"settings-db\";\r\n\r\nexport const settingsManifestProperty: FilePropertyProps = { namespace: \"settings\", name: \"manifest\" };\r\n\r\n/** Internal implementation of [[SettingsDb]]. Wraps a [[WorkspaceSqliteDb]] to provide a\r\n * settings-only read interface over the `strings` table.\r\n */\r\nexport class SettingsDbImpl implements SettingsDb {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly sqliteDb = new WorkspaceSqliteDb();\r\n public readonly dbName: string;\r\n public readonly dbFileName: string;\r\n protected readonly _container: CloudSqliteContainer;\r\n public readonly priority: SettingsPriority;\r\n protected _manifest?: SettingsDbManifest;\r\n\r\n public constructor(props: SettingsDbProps, container: CloudSqliteContainer, priority: SettingsPriority) {\r\n this.dbName = props.dbName ?? settingsDbDefaultName;\r\n CloudSqlite.validateDbName(this.dbName);\r\n this._container = container;\r\n this.dbFileName = container.resolveDbFileName(props);\r\n this.priority = priority;\r\n }\r\n\r\n public get container(): CloudSqliteContainer { return this._container; }\r\n public get isOpen() { return this.sqliteDb.isOpen; }\r\n\r\n public get version(): string {\r\n const cloudContainer = this.container.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return \"0.0.0\";\r\n return CloudSqlite.parseDbFileName(this.dbFileName).version;\r\n }\r\n\r\n public get manifest(): SettingsDbManifest {\r\n return this._manifest ??= this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(settingsManifestProperty, true) as string | undefined;\r\n if (!manifestJson)\r\n return { settingsName: this.dbName };\r\n try {\r\n return JSON.parse(manifestJson);\r\n } catch (e) {\r\n throw new Error(`Failed to parse manifest in SettingsDb \"${this.dbName}\": ${e instanceof Error ? e.message : String(e)}`);\r\n }\r\n });\r\n }\r\n\r\n /** Check whether the underlying database has a settings manifest property.\r\n * Used to validate that a container actually holds a SettingsDb rather than a WorkspaceDb.\r\n */\r\n public get hasSettingsManifestProperty(): boolean {\r\n return this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(settingsManifestProperty, true) as string | undefined;\r\n return manifestJson !== undefined;\r\n });\r\n }\r\n\r\n protected withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\r\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\r\n try {\r\n return operation(this.sqliteDb);\r\n } finally {\r\n done();\r\n }\r\n }\r\n\r\n public open(): void {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\r\n }\r\n\r\n public close(): void {\r\n if (this.isOpen)\r\n this.sqliteDb.closeDb();\r\n }\r\n\r\n public getSettings(): SettingsContainer {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value FROM strings WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, settingsResourceName);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n return {};\r\n try {\r\n // JSON.parse already returns a fresh object tree — no explicit clone needed.\r\n return JSON.parse(stmt.getValueString(0));\r\n } catch (e) {\r\n throw new Error(`Failed to parse settings in SettingsDb \"${this.dbName}\": ${e instanceof Error ? e.message : String(e)}`);\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: SettingName): T | undefined {\r\n const settings = this.getSettings();\r\n const value = settings[settingName] as T | undefined;\r\n return value !== undefined ? Setting.clone(value) : undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { BeEvent } from "@itwin/core-bentley";
|
|
5
5
|
import { LocalDirName, LocalFileName } from "@itwin/core-common";
|
|
6
6
|
import { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from "../../workspace/Settings";
|
|
7
|
+
import { type SettingsEditor } from "../../workspace/SettingsEditor";
|
|
7
8
|
import { _implementationProhibited } from "../Symbols";
|
|
8
9
|
/**
|
|
9
10
|
* Internal implementation of Settings interface.
|
|
@@ -40,4 +41,6 @@ export declare class SettingsImpl implements Settings {
|
|
|
40
41
|
getArray<T extends Setting>(name: SettingName): T[] | undefined;
|
|
41
42
|
private getCombinedArray;
|
|
42
43
|
}
|
|
44
|
+
/** Construct a new [[SettingsEditor]]. Called by the [[SettingsEditor]] namespace. */
|
|
45
|
+
export declare function constructSettingsEditor(): SettingsEditor;
|
|
43
46
|
//# sourceMappingURL=SettingsImpl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"SettingsImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,OAAO,EAA4B,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAoB,YAAY,EAAE,aAAa,EAAkB,MAAM,oBAAoB,CAAC;AAInG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAItL,OAAO,EAEyB,KAAK,cAAc,EAElD,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAE,yBAAyB,EAAa,MAAM,YAAY,CAAC;AA0BlE;;;GAGG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,SAAgB,CAAC,yBAAyB,CAAC,YAAa;IACjD,YAAY,EAAE,kBAAkB,EAAE,CAAM;IAC/C,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,gBAAgB;IAC7C,KAAK;IACZ,SAAgB,iBAAiB,gBAAqB,IAAI,EAAI;IAEvD,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB;IAI3D,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB;IAQ9D,OAAO,CAAC,KAAK,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM;IAI5D,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,iBAAiB;IAiBzE,aAAa,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,SAAS;IAQ/E,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,UAAO;IAYhE,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAC,CAAC;IASrH,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC;IAM5E,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS/F,OAAO,CAAC,SAAS;IAMV,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IAC7D,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS;IAIlD,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAClE,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,GAAG,SAAS;IAK7D,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IACtE,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,SAAS;IActE,OAAO,CAAC,gBAAgB;CAgBzB;AAMD,sFAAsF;AACtF,wBAAgB,uBAAuB,IAAI,cAAc,CAExD"}
|
|
@@ -8,13 +8,22 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.SettingsImpl = void 0;
|
|
11
|
+
exports.constructSettingsEditor = constructSettingsEditor;
|
|
11
12
|
const fs = require("fs-extra");
|
|
12
13
|
const json5_1 = require("json5");
|
|
13
14
|
const path_1 = require("path");
|
|
14
15
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
16
|
+
const core_common_1 = require("@itwin/core-common");
|
|
17
|
+
const CloudSqlite_1 = require("../../CloudSqlite");
|
|
15
18
|
const IModelJsFs_1 = require("../../IModelJsFs");
|
|
16
|
-
const Settings_1 = require("../../workspace/Settings");
|
|
17
19
|
const IModelHost_1 = require("../../IModelHost");
|
|
20
|
+
const Settings_1 = require("../../workspace/Settings");
|
|
21
|
+
const SettingsDb_1 = require("../../workspace/SettingsDb");
|
|
22
|
+
const SettingsEditor_1 = require("../../workspace/SettingsEditor");
|
|
23
|
+
const BlobContainerService_1 = require("../../BlobContainerService");
|
|
24
|
+
const SettingsDbImpl_1 = require("./SettingsDbImpl");
|
|
25
|
+
const SettingsSqliteDb_1 = require("./SettingsSqliteDb");
|
|
26
|
+
const WorkspaceImpl_1 = require("./WorkspaceImpl");
|
|
18
27
|
const Symbols_1 = require("../Symbols");
|
|
19
28
|
const dictionaryMatches = (d1, d2) => {
|
|
20
29
|
return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);
|
|
@@ -31,6 +40,9 @@ class SettingsDictionaryImpl {
|
|
|
31
40
|
const value = this.settings[settingName];
|
|
32
41
|
return undefined !== value ? Settings_1.Setting.clone(value) : undefined;
|
|
33
42
|
}
|
|
43
|
+
toJSON() {
|
|
44
|
+
return Settings_1.Setting.clone(this.settings);
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
/**
|
|
36
48
|
* Internal implementation of Settings interface.
|
|
@@ -155,4 +167,242 @@ class SettingsImpl {
|
|
|
155
167
|
}
|
|
156
168
|
}
|
|
157
169
|
exports.SettingsImpl = SettingsImpl;
|
|
170
|
+
// ==================== SettingsEditor implementation ====================
|
|
171
|
+
const settingsEditorName = "SettingsEditor";
|
|
172
|
+
/** Construct a new [[SettingsEditor]]. Called by the [[SettingsEditor]] namespace. */
|
|
173
|
+
function constructSettingsEditor() {
|
|
174
|
+
return new SettingsEditorImpl();
|
|
175
|
+
}
|
|
176
|
+
class SettingsEditorImpl {
|
|
177
|
+
[Symbols_1._implementationProhibited] = undefined;
|
|
178
|
+
_workspace;
|
|
179
|
+
_containers = new Map();
|
|
180
|
+
constructor() {
|
|
181
|
+
this._workspace = (0, WorkspaceImpl_1.constructSettingsEditorWorkspace)(new SettingsImpl(), { containerDir: (0, path_1.join)(IModelHost_1.IModelHost.cacheDir, settingsEditorName) });
|
|
182
|
+
}
|
|
183
|
+
get workspace() { return this._workspace; }
|
|
184
|
+
async initializeContainer(args) {
|
|
185
|
+
class CloudAccess extends CloudSqlite_1.CloudSqlite.DbAccess {
|
|
186
|
+
static _cacheName = settingsEditorName;
|
|
187
|
+
static async initializeSettings(initArgs) {
|
|
188
|
+
const props = await this.createBlobContainer({ scope: initArgs.scope, metadata: { ...initArgs.metadata, containerType: "settings" } });
|
|
189
|
+
const dbFullName = CloudSqlite_1.CloudSqlite.makeSemverName(initArgs.dbName ?? SettingsDbImpl_1.settingsDbDefaultName, "0.0.0");
|
|
190
|
+
await super._initializeDb({ ...initArgs, props, dbName: dbFullName, dbType: SettingsSqliteDb_1.SettingsSqliteDb, blockSize: "4M" });
|
|
191
|
+
return props;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return CloudAccess.initializeSettings(args);
|
|
195
|
+
}
|
|
196
|
+
async createNewCloudContainer(args) {
|
|
197
|
+
const cloudContainer = await this.initializeContainer(args);
|
|
198
|
+
const userToken = await IModelHost_1.IModelHost.authorizationClient?.getAccessToken();
|
|
199
|
+
const accessToken = await CloudSqlite_1.CloudSqlite.requestToken({ ...cloudContainer, accessLevel: "write", userToken });
|
|
200
|
+
return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });
|
|
201
|
+
}
|
|
202
|
+
getContainer(args) {
|
|
203
|
+
const existing = this._containers.get(args.containerId);
|
|
204
|
+
if (existing)
|
|
205
|
+
return existing;
|
|
206
|
+
const baseContainer = this._workspace.getContainer(args);
|
|
207
|
+
const editable = new EditableSettingsContainerImpl(baseContainer);
|
|
208
|
+
this._containers.set(args.containerId, editable);
|
|
209
|
+
return editable;
|
|
210
|
+
}
|
|
211
|
+
async getContainerAsync(props) {
|
|
212
|
+
let accessToken = props.accessToken;
|
|
213
|
+
if (undefined === accessToken && props.baseUri !== "")
|
|
214
|
+
accessToken = await CloudSqlite_1.CloudSqlite.requestToken({ ...props, accessLevel: "write" });
|
|
215
|
+
return this.getContainer({ ...props, accessToken: accessToken ?? "" });
|
|
216
|
+
}
|
|
217
|
+
async findContainers(args) {
|
|
218
|
+
const containers = await SettingsEditor_1.SettingsEditor.queryContainers(args);
|
|
219
|
+
const userToken = await IModelHost_1.IModelHost.getAccessToken();
|
|
220
|
+
const results = [];
|
|
221
|
+
for (const containerMeta of containers) {
|
|
222
|
+
// queryContainers already validates that BlobContainer.service is defined, so the non-null assertion is safe here.
|
|
223
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
224
|
+
const tokenProps = await BlobContainerService_1.BlobContainer.service.requestToken({ containerId: containerMeta.containerId, userToken, accessLevel: "write" });
|
|
225
|
+
results.push(this.getContainer({
|
|
226
|
+
containerId: containerMeta.containerId,
|
|
227
|
+
baseUri: tokenProps.baseUri,
|
|
228
|
+
storageType: tokenProps.provider,
|
|
229
|
+
accessToken: tokenProps.token,
|
|
230
|
+
writeable: true,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
close() {
|
|
236
|
+
const errors = [];
|
|
237
|
+
for (const [_, container] of this._containers) {
|
|
238
|
+
try {
|
|
239
|
+
container.cleanup();
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
errors.push(e);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
this._containers.clear();
|
|
246
|
+
try {
|
|
247
|
+
this._workspace.close();
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
errors.push(e);
|
|
251
|
+
}
|
|
252
|
+
if (errors.length === 1)
|
|
253
|
+
throw errors[0];
|
|
254
|
+
if (errors.length > 1)
|
|
255
|
+
throw new Error(`SettingsEditor.close() encountered ${errors.length} errors: ${errors.map((e) => e instanceof Error ? e.message : String(e)).join("; ")}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
class EditableSettingsContainerImpl {
|
|
259
|
+
[Symbols_1._implementationProhibited] = undefined;
|
|
260
|
+
_inner;
|
|
261
|
+
_settingsDbs = new Map();
|
|
262
|
+
writeLockHeldBy;
|
|
263
|
+
constructor(inner) {
|
|
264
|
+
this._inner = inner;
|
|
265
|
+
}
|
|
266
|
+
// CloudSqliteContainer delegation
|
|
267
|
+
get workspace() { return this._inner.workspace; }
|
|
268
|
+
get filesDir() { return this._inner.filesDir; }
|
|
269
|
+
get cloudContainer() { return this._inner.cloudContainer; }
|
|
270
|
+
get fromProps() { return this._inner.fromProps; }
|
|
271
|
+
resolveDbFileName(props) { return this._inner.resolveDbFileName(props); }
|
|
272
|
+
get cloudProps() {
|
|
273
|
+
const cc = this.cloudContainer;
|
|
274
|
+
if (undefined === cc)
|
|
275
|
+
return undefined;
|
|
276
|
+
return {
|
|
277
|
+
baseUri: cc.baseUri,
|
|
278
|
+
containerId: cc.containerId,
|
|
279
|
+
storageType: cc.storageType,
|
|
280
|
+
isPublic: cc.isPublic,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
getEditableDb(props) {
|
|
284
|
+
const dbName = props?.dbName ?? SettingsDbImpl_1.settingsDbDefaultName;
|
|
285
|
+
let db = this._settingsDbs.get(dbName);
|
|
286
|
+
if (undefined === db) {
|
|
287
|
+
db = new EditableSettingsDbImpl(props ?? { dbName }, this);
|
|
288
|
+
this._settingsDbs.set(dbName, db);
|
|
289
|
+
}
|
|
290
|
+
if (this.cloudContainer && !CloudSqlite_1.CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {
|
|
291
|
+
this._settingsDbs.delete(dbName);
|
|
292
|
+
core_common_1.CloudSqliteError.throwError("already-published", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });
|
|
293
|
+
}
|
|
294
|
+
return db;
|
|
295
|
+
}
|
|
296
|
+
async createNewSettingsDbVersion(args) {
|
|
297
|
+
const container = this.cloudContainer;
|
|
298
|
+
if (undefined === container)
|
|
299
|
+
core_common_1.WorkspaceError.throwError("no-cloud-container", { message: "versions require cloud containers" });
|
|
300
|
+
const fromDb = { ...args.fromProps, dbName: args.fromProps?.dbName ?? SettingsDbImpl_1.settingsDbDefaultName };
|
|
301
|
+
return CloudSqlite_1.CloudSqlite.createNewDbVersion(container, { ...args, fromDb });
|
|
302
|
+
}
|
|
303
|
+
async createDb(args) {
|
|
304
|
+
const dbName = args.dbName ?? SettingsDbImpl_1.settingsDbDefaultName;
|
|
305
|
+
if (!this.cloudContainer) {
|
|
306
|
+
SettingsSqliteDb_1.SettingsSqliteDb.createNewDb(this.resolveDbFileName({ dbName }), { manifest: args.manifest });
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const tempDbFile = (0, path_1.join)(IModelHost_1.KnownLocations.tmpdir, `empty-${core_bentley_1.Guid.createValue()}.itwin-settings`);
|
|
310
|
+
try {
|
|
311
|
+
SettingsSqliteDb_1.SettingsSqliteDb.createNewDb(tempDbFile, { manifest: args.manifest });
|
|
312
|
+
await CloudSqlite_1.CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite_1.CloudSqlite.makeSemverName(dbName, args.version) });
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
if (fs.existsSync(tempDbFile))
|
|
316
|
+
IModelJsFs_1.IModelJsFs.removeSync(tempDbFile);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return this.getEditableDb({ dbName });
|
|
320
|
+
}
|
|
321
|
+
acquireWriteLock(user) {
|
|
322
|
+
if (this.cloudContainer) {
|
|
323
|
+
this.cloudContainer.acquireWriteLock(user);
|
|
324
|
+
this.writeLockHeldBy = user;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
releaseWriteLock() {
|
|
328
|
+
if (this.cloudContainer) {
|
|
329
|
+
this.cloudContainer.releaseWriteLock();
|
|
330
|
+
this.writeLockHeldBy = undefined;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
abandonChanges() {
|
|
334
|
+
if (this.cloudContainer) {
|
|
335
|
+
this.cloudContainer.abandonChanges();
|
|
336
|
+
this.writeLockHeldBy = undefined;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/** Close all editable settings dbs tracked by this container. */
|
|
340
|
+
cleanup() {
|
|
341
|
+
for (const [_, db] of this._settingsDbs)
|
|
342
|
+
db.close();
|
|
343
|
+
this._settingsDbs.clear();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
class EditableSettingsDbImpl extends SettingsDbImpl_1.SettingsDbImpl {
|
|
347
|
+
get container() {
|
|
348
|
+
return this._container;
|
|
349
|
+
}
|
|
350
|
+
constructor(props, container) {
|
|
351
|
+
super(props, container, Settings_1.SettingsPriority.application);
|
|
352
|
+
}
|
|
353
|
+
open() {
|
|
354
|
+
this.sqliteDb.openDb(this.dbFileName, core_bentley_1.OpenMode.ReadWrite, this._container.cloudContainer);
|
|
355
|
+
}
|
|
356
|
+
close() {
|
|
357
|
+
let error;
|
|
358
|
+
try {
|
|
359
|
+
if (this.isOpen) {
|
|
360
|
+
const lastEditedBy = this._container.writeLockHeldBy;
|
|
361
|
+
if (lastEditedBy !== undefined)
|
|
362
|
+
this.updateManifest({ ...this.manifest, lastEditedBy });
|
|
363
|
+
this.sqliteDb.saveChanges();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
error = e;
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
super.close();
|
|
371
|
+
}
|
|
372
|
+
if (error) {
|
|
373
|
+
if (error instanceof Error)
|
|
374
|
+
throw error;
|
|
375
|
+
throw new Error(`EditableSettingsDb.close() failed`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
updateManifest(manifest) {
|
|
379
|
+
this.sqliteDb[Symbols_1._nativeDb].saveFileProperty(SettingsDbImpl_1.settingsManifestProperty, JSON.stringify(manifest));
|
|
380
|
+
this._manifest = undefined;
|
|
381
|
+
}
|
|
382
|
+
updateSettings(settings) {
|
|
383
|
+
const val = JSON.stringify(settings);
|
|
384
|
+
this.sqliteDb.withSqliteStatement("INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value", (stmt) => {
|
|
385
|
+
stmt.bindString(1, SettingsDb_1.settingsResourceName);
|
|
386
|
+
stmt.bindString(2, val);
|
|
387
|
+
const rc = stmt.step();
|
|
388
|
+
if (core_bentley_1.DbResult.BE_SQLITE_DONE !== rc)
|
|
389
|
+
core_common_1.WorkspaceError.throwError("write-error", { message: `settings [updateSettings], rc=${rc}` });
|
|
390
|
+
});
|
|
391
|
+
this.sqliteDb.saveChanges();
|
|
392
|
+
}
|
|
393
|
+
updateSetting(args) {
|
|
394
|
+
this.withOpenDb(() => {
|
|
395
|
+
const container = this.getSettings();
|
|
396
|
+
container[args.settingName] = args.value;
|
|
397
|
+
this.updateSettings(container);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
removeSetting(settingName) {
|
|
401
|
+
this.withOpenDb(() => {
|
|
402
|
+
const container = this.getSettings();
|
|
403
|
+
delete container[settingName];
|
|
404
|
+
this.updateSettings(container);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
158
408
|
//# sourceMappingURL=SettingsImpl.js.map
|
|
@@ -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":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AA0MH,0DAEC;AA1MD,+BAA+B;AAC/B,iCAA8B;AAC9B,+BAAqC;AACrC,sDAAwE;AACxE,oDAAmG;AACnG,mDAAgD;AAChD,iDAA8C;AAC9C,iDAA8D;AAC9D,uDAAsL;AAGtL,2DAAuG;AACvG,mEAIwC;AACxC,qEAA2D;AAC3D,qDAAmG;AACnG,yDAAsD;AACtD,mDAAmF;AACnF,wCAAkE;AAElE,MAAM,iBAAiB,GAAG,CAAC,EAA4B,EAAE,EAA4B,EAAW,EAAE;IAChG,OAAO,CAAC,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,sBAAsB;IACV,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACxC,KAAK,CAA0B;IAC/B,QAAQ,CAAoB;IAE5C,YAAmB,KAA8B,EAAE,QAA2B;QAC5E,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,+CAA+C;QAC1E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,UAAU,CAAoB,WAAmB;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAkB,CAAC;QAC1D,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAEM,MAAM;QACX,OAAO,kBAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,MAAa,YAAY;IACP,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACjD,YAAY,GAAyB,EAAE,CAAC;IACrC,cAAc,CAAC,SAA2B,IAAI,CAAC;IAClD,KAAK,KAAK,CAAC;IACF,iBAAiB,GAAG,IAAI,sBAAO,EAAc,CAAC;IAEvD,OAAO,CAAC,QAAuB,EAAE,QAA0B;QAChE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IAEM,YAAY,CAAC,OAAqB,EAAE,QAA0B;QACnE,KAAK,MAAM,QAAQ,IAAI,uBAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO;gBACrC,IAAI,CAAC,OAAO,CAAC,IAAA,WAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,OAAO,CAAC,KAA8B,EAAE,YAAoB;QACjE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAA,aAAK,EAAC,YAAY,CAAC,CAAC,CAAC;IACjD,CAAC;IAEM,aAAa,CAAC,KAA8B,EAAE,QAA2B;QAC9E,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,oDAAoD;QACvF,MAAM,IAAI,GAAG,IAAI,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC/D,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;oBACrC,OAAO;gBACT,CAAC;YACH,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAEM,aAAa,CAAC,MAAgC;QACnD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;gBAC7C,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,cAAc,CAAC,MAAgC,EAAE,UAAU,GAAG,IAAI;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/B,IAAI,UAAU;oBACZ,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,CAAE,iBAAiB,CAAoB,WAAwB;QACpE,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAI,WAAW,CAAC,CAAC;YACpD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAEM,CAAE,gBAAgB,CAAoB,WAAwB;QACnE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAI,WAAW,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,CAAC,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAEM,UAAU,CAAoB,WAAwB,EAAE,YAAgB;QAC7E,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAI,WAAW,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,iIAAiI;IACzH,SAAS,CAAoB,IAAiB,EAAE,YAAoB;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAI,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,YAAY;YAClD,OAAO,GAAG,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,YAAY,KAAK,OAAO,GAAG,EAAE,CAAC,CAAC;IAC/E,CAAC;IAGM,SAAS,CAAC,IAAiB,EAAE,YAAqB;QACvD,OAAO,IAAI,CAAC,SAAS,CAAS,IAAI,EAAE,QAAQ,CAAC,IAAI,YAAY,CAAC;IAChE,CAAC;IAGM,UAAU,CAAC,IAAiB,EAAE,YAAsB;QACzD,OAAO,IAAI,CAAC,SAAS,CAAU,IAAI,EAAE,SAAS,CAAC,IAAI,YAAY,CAAC;IAClE,CAAC;IAGM,SAAS,CAAC,IAAiB,EAAE,YAAqB;QACvD,OAAO,IAAI,CAAC,SAAS,CAAS,IAAI,EAAE,QAAQ,CAAC,IAAI,YAAY,CAAC;IAChE,CAAC;IAGM,SAAS,CAAmB,IAAiB,EAAE,YAAgB;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,CAAC,CAAC,uBAAU,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACpF,CAAC;IAGM,QAAQ,CAAoB,IAAiB,EAAE,YAAkB;QACtE,IAAI,uBAAU,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,gBAAgB,CAAI,IAAI,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAM,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,SAAS;YACnB,OAAO,YAAY,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,qBAAqB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,uBAAU,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAEO,gBAAgB,CAAoB,IAAiB,EAAE,YAAkB;QAC/E,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAM,IAAI,CAAC,EAAE,CAAC;YACrD,YAAY,GAAG,IAAI,CAAC;YAEpB,uBAAU,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,SAAS,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC9D,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AA9ID,oCA8IC;AAED,0EAA0E;AAE1E,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,sFAAsF;AACtF,SAAgB,uBAAuB;IACrC,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,kBAAkB;IACN,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACvC,UAAU,CAAiB;IACpC,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEvE;QACE,IAAI,CAAC,UAAU,GAAG,IAAA,gDAAgC,EAAC,IAAI,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,IAAA,WAAI,EAAC,uBAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IAED,IAAW,SAAS,KAAgB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAErD,KAAK,CAAC,mBAAmB,CAAC,IAAoC;QACpE,MAAM,WAAY,SAAQ,yBAAW,CAAC,QAA0B;YACpD,MAAM,CAAU,UAAU,GAAG,kBAAkB,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAwC;gBAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gBACvI,MAAM,UAAU,GAAG,yBAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,IAAI,sCAAqB,EAAE,OAAO,CAAC,CAAC;gBACjG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,mCAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjH,OAAO,KAAK,CAAC;YACf,CAAC;;QAEH,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAAC,IAAoC;QACvE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,mBAAmB,EAAE,cAAc,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACxH,CAAC;IAEM,YAAY,CAAC,IAA+B;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,KAA8B;QAC3D,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACpC,IAAI,SAAS,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;YACnD,WAAW,GAAG,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnF,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,IAAkD;QAC5E,MAAM,UAAU,GAAG,MAAM,+BAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,cAAc,EAAE,CAAC;QACpD,MAAM,OAAO,GAAqC,EAAE,CAAC;QACrD,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;YACvC,mHAAmH;YACnH,oEAAoE;YACpE,MAAM,UAAU,GAAG,MAAM,oCAAa,CAAC,OAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1I,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7B,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,WAAW,EAAE,UAAU,CAAC,QAAQ;gBAChC,WAAW,EAAE,UAAU,CAAC,KAAK;gBAC7B,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/J,CAAC;CACF;AAED,MAAM,6BAA6B;IACjB,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACvC,MAAM,CAAuB;IACtC,YAAY,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,eAAe,CAAU;IAEhC,YAAmB,KAA2B;QAC5C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,kCAAkC;IAClC,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,iBAAiB,CAAC,KAAuB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElG,IAAW,UAAU;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAC/B,IAAI,SAAS,KAAK,EAAE;YAClB,OAAO,SAAS,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,WAAW,EAAE,EAAE,CAAC,WAAiC;YACjD,QAAQ,EAAE,EAAE,CAAC,QAAQ;SACtB,CAAC;IACJ,CAAC;IAEM,aAAa,CAAC,KAAuB;QAC1C,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,sCAAqB,CAAC;QACtD,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,EAAE,GAAG,IAAI,sBAAsB,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,yBAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,8BAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,oEAAoE,EAAE,CAAC,CAAC;QACtJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,0BAA0B,CAAC,IAAoC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS;YACzB,4BAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAEpG,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,sCAAqB,EAAE,CAAC;QAC9F,OAAO,yBAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAA0B;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sCAAqB,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,2BAAc,CAAC,MAAM,EAAE,SAAS,mBAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC7F,IAAI,CAAC;gBACH,mCAAgB,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtE,MAAM,yBAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAW,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3I,CAAC;oBAAS,CAAC;gBACT,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;oBAC3B,uBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAEM,gBAAgB,CAAC,IAAY;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAEM,gBAAgB;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC;IAED,iEAAiE;IAC1D,OAAO;QACZ,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY;YACrC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,sBAAuB,SAAQ,+BAAc;IACjD,IAAoB,SAAS;QAC3B,OAAO,IAAI,CAAC,UAA4C,CAAC;IAC3D,CAAC;IAED,YAAmB,KAAsB,EAAE,SAAwC;QACjF,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,2BAAgB,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAEe,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IAEe,KAAK;QACnB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAI,IAAI,CAAC,UAA4C,CAAC,eAAe,CAAC;gBACxF,IAAI,YAAY,KAAK,SAAS;oBAC5B,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,YAAY,KAAK;gBACxB,MAAM,KAAK,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,QAA4B;QAChD,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,gBAAgB,CAAC,yCAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEM,cAAc,CAAC,QAA2B;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,0HAA0H,EAC1H,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,iCAAoB,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,uBAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,4BAAc,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjG,CAAC,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,aAAa,CAAC,IAAuB;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,WAAwB;QAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;CACF","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, DbResult, Guid, OpenMode } from \"@itwin/core-bentley\";\r\nimport { CloudSqliteError, LocalDirName, LocalFileName, WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\r\nimport { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { CloudSqliteContainer, GetWorkspaceContainerArgs, Workspace, WorkspaceContainerProps, WorkspaceDbProps,\r\n} from \"../../workspace/Workspace\";\r\nimport { SettingsDbManifest, SettingsDbProps, settingsResourceName } from \"../../workspace/SettingsDb\";\r\nimport {\r\n type CreateNewSettingsContainerArgs, type CreateNewSettingsDbVersionArgs, type CreateSettingsDbArgs, type EditableSettingsCloudContainer, type EditableSettingsDb,\r\n type SettingsDbVersionResult, type SettingsEditor, SettingsEditor as SettingsEditorNs,\r\n type UpdateSettingArgs,\r\n} from \"../../workspace/SettingsEditor\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\nimport { settingsDbDefaultName, SettingsDbImpl, settingsManifestProperty } from \"./SettingsDbImpl\";\r\nimport { SettingsSqliteDb } from \"./SettingsSqliteDb\";\r\nimport { constructSettingsEditorWorkspace, OwnedWorkspace } from \"./WorkspaceImpl\";\r\nimport { _implementationProhibited, _nativeDb } 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 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\r\n// ==================== SettingsEditor implementation ====================\r\n\r\nconst settingsEditorName = \"SettingsEditor\";\r\n\r\n/** Construct a new [[SettingsEditor]]. Called by the [[SettingsEditor]] namespace. */\r\nexport function constructSettingsEditor(): SettingsEditor {\r\n return new SettingsEditorImpl();\r\n}\r\n\r\nclass SettingsEditorImpl implements SettingsEditor {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _workspace: OwnedWorkspace;\r\n private _containers = new Map<string, EditableSettingsContainerImpl>();\r\n\r\n public constructor() {\r\n this._workspace = constructSettingsEditorWorkspace(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, settingsEditorName) });\r\n }\r\n\r\n public get workspace(): Workspace { return this._workspace; }\r\n\r\n private async initializeContainer(args: CreateNewSettingsContainerArgs) {\r\n class CloudAccess extends CloudSqlite.DbAccess<SettingsSqliteDb> {\r\n protected static override _cacheName = settingsEditorName;\r\n public static async initializeSettings(initArgs: CreateNewSettingsContainerArgs) {\r\n const props = await this.createBlobContainer({ scope: initArgs.scope, metadata: { ...initArgs.metadata, containerType: \"settings\" } });\r\n const dbFullName = CloudSqlite.makeSemverName(initArgs.dbName ?? settingsDbDefaultName, \"0.0.0\");\r\n await super._initializeDb({ ...initArgs, props, dbName: dbFullName, dbType: SettingsSqliteDb, blockSize: \"4M\" });\r\n return props;\r\n }\r\n }\r\n return CloudAccess.initializeSettings(args);\r\n }\r\n\r\n public async createNewCloudContainer(args: CreateNewSettingsContainerArgs): Promise<EditableSettingsCloudContainer> {\r\n const cloudContainer = await this.initializeContainer(args);\r\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\r\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\r\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\r\n }\r\n\r\n public getContainer(args: GetWorkspaceContainerArgs): EditableSettingsCloudContainer {\r\n const existing = this._containers.get(args.containerId);\r\n if (existing)\r\n return existing;\r\n const baseContainer = this._workspace.getContainer(args);\r\n const editable = new EditableSettingsContainerImpl(baseContainer);\r\n this._containers.set(args.containerId, editable);\r\n return editable;\r\n }\r\n\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableSettingsCloudContainer> {\r\n let accessToken = props.accessToken;\r\n if (undefined === accessToken && props.baseUri !== \"\")\r\n accessToken = await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\r\n\r\n return this.getContainer({ ...props, accessToken: accessToken ?? \"\" });\r\n }\r\n\r\n public async findContainers(args: SettingsEditorNs.QuerySettingsContainersArgs): Promise<EditableSettingsCloudContainer[]> {\r\n const containers = await SettingsEditorNs.queryContainers(args);\r\n const userToken = await IModelHost.getAccessToken();\r\n const results: EditableSettingsCloudContainer[] = [];\r\n for (const containerMeta of containers) {\r\n // queryContainers already validates that BlobContainer.service is defined, so the non-null assertion is safe here.\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const tokenProps = await BlobContainer.service!.requestToken({ containerId: containerMeta.containerId, userToken, accessLevel: \"write\" });\r\n results.push(this.getContainer({\r\n containerId: containerMeta.containerId,\r\n baseUri: tokenProps.baseUri,\r\n storageType: tokenProps.provider,\r\n accessToken: tokenProps.token,\r\n writeable: true,\r\n }));\r\n }\r\n return results;\r\n }\r\n\r\n public close() {\r\n const errors: unknown[] = [];\r\n for (const [_, container] of this._containers) {\r\n try {\r\n container.cleanup();\r\n } catch (e) {\r\n errors.push(e);\r\n }\r\n }\r\n this._containers.clear();\r\n try {\r\n this._workspace.close();\r\n } catch (e) {\r\n errors.push(e);\r\n }\r\n if (errors.length === 1)\r\n throw errors[0];\r\n if (errors.length > 1)\r\n throw new Error(`SettingsEditor.close() encountered ${errors.length} errors: ${errors.map((e) => e instanceof Error ? e.message : String(e)).join(\"; \")}`);\r\n }\r\n}\r\n\r\nclass EditableSettingsContainerImpl implements EditableSettingsCloudContainer {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _inner: CloudSqliteContainer;\r\n private _settingsDbs = new Map<string, EditableSettingsDbImpl>();\r\n public writeLockHeldBy?: string;\r\n\r\n public constructor(inner: CloudSqliteContainer) {\r\n this._inner = inner;\r\n }\r\n\r\n // CloudSqliteContainer delegation\r\n public get workspace() { return this._inner.workspace; }\r\n public get filesDir() { return this._inner.filesDir; }\r\n public get cloudContainer() { return this._inner.cloudContainer; }\r\n public get fromProps() { return this._inner.fromProps; }\r\n public resolveDbFileName(props: WorkspaceDbProps) { return this._inner.resolveDbFileName(props); }\r\n\r\n public get cloudProps(): WorkspaceContainerProps | undefined {\r\n const cc = this.cloudContainer;\r\n if (undefined === cc)\r\n return undefined;\r\n return {\r\n baseUri: cc.baseUri,\r\n containerId: cc.containerId,\r\n storageType: cc.storageType as \"azure\" | \"google\",\r\n isPublic: cc.isPublic,\r\n };\r\n }\r\n\r\n public getEditableDb(props?: SettingsDbProps): EditableSettingsDb {\r\n const dbName = props?.dbName ?? settingsDbDefaultName;\r\n let db = this._settingsDbs.get(dbName);\r\n if (undefined === db) {\r\n db = new EditableSettingsDbImpl(props ?? { dbName }, this);\r\n this._settingsDbs.set(dbName, db);\r\n }\r\n\r\n if (this.cloudContainer && !CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {\r\n this._settingsDbs.delete(dbName);\r\n CloudSqliteError.throwError(\"already-published\", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public async createNewSettingsDbVersion(args: CreateNewSettingsDbVersionArgs): Promise<SettingsDbVersionResult> {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"versions require cloud containers\" });\r\n\r\n const fromDb = { ...args.fromProps, dbName: args.fromProps?.dbName ?? settingsDbDefaultName };\r\n return CloudSqlite.createNewDbVersion(container, { ...args, fromDb });\r\n }\r\n\r\n public async createDb(args: CreateSettingsDbArgs): Promise<EditableSettingsDb> {\r\n const dbName = args.dbName ?? settingsDbDefaultName;\r\n if (!this.cloudContainer) {\r\n SettingsSqliteDb.createNewDb(this.resolveDbFileName({ dbName }), { manifest: args.manifest });\r\n } else {\r\n const tempDbFile = join(KnownLocations.tmpdir, `empty-${Guid.createValue()}.itwin-settings`);\r\n try {\r\n SettingsSqliteDb.createNewDb(tempDbFile, { manifest: args.manifest });\r\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite.makeSemverName(dbName, args.version) });\r\n } finally {\r\n if (fs.existsSync(tempDbFile))\r\n IModelJsFs.removeSync(tempDbFile);\r\n }\r\n }\r\n\r\n return this.getEditableDb({ dbName });\r\n }\r\n\r\n public acquireWriteLock(user: string): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.acquireWriteLock(user);\r\n this.writeLockHeldBy = user;\r\n }\r\n }\r\n\r\n public releaseWriteLock(): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.releaseWriteLock();\r\n this.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public abandonChanges(): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.abandonChanges();\r\n this.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n /** Close all editable settings dbs tracked by this container. */\r\n public cleanup(): void {\r\n for (const [_, db] of this._settingsDbs)\r\n db.close();\r\n this._settingsDbs.clear();\r\n }\r\n}\r\n\r\nclass EditableSettingsDbImpl extends SettingsDbImpl implements EditableSettingsDb {\r\n public override get container(): EditableSettingsCloudContainer {\r\n return this._container as EditableSettingsCloudContainer;\r\n }\r\n\r\n public constructor(props: SettingsDbProps, container: EditableSettingsContainerImpl) {\r\n super(props, container, SettingsPriority.application);\r\n }\r\n\r\n public override open(): void {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\r\n }\r\n\r\n public override close(): void {\r\n let error: unknown;\r\n try {\r\n if (this.isOpen) {\r\n const lastEditedBy = (this._container as EditableSettingsContainerImpl).writeLockHeldBy;\r\n if (lastEditedBy !== undefined)\r\n this.updateManifest({ ...this.manifest, lastEditedBy });\r\n this.sqliteDb.saveChanges();\r\n }\r\n } catch (e) {\r\n error = e;\r\n } finally {\r\n super.close();\r\n }\r\n if (error) {\r\n if (error instanceof Error)\r\n throw error;\r\n throw new Error(`EditableSettingsDb.close() failed`);\r\n }\r\n }\r\n\r\n public updateManifest(manifest: SettingsDbManifest): void {\r\n this.sqliteDb[_nativeDb].saveFileProperty(settingsManifestProperty, JSON.stringify(manifest));\r\n this._manifest = undefined;\r\n }\r\n\r\n public updateSettings(settings: SettingsContainer): void {\r\n const val = JSON.stringify(settings);\r\n this.sqliteDb.withSqliteStatement(\r\n \"INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\",\r\n (stmt) => {\r\n stmt.bindString(1, settingsResourceName);\r\n stmt.bindString(2, val);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n WorkspaceError.throwError(\"write-error\", { message: `settings [updateSettings], rc=${rc}` });\r\n },\r\n );\r\n this.sqliteDb.saveChanges();\r\n }\r\n\r\n public updateSetting(args: UpdateSettingArgs): void {\r\n this.withOpenDb(() => {\r\n const container = this.getSettings();\r\n container[args.settingName] = args.value;\r\n this.updateSettings(container);\r\n });\r\n }\r\n\r\n public removeSetting(settingName: SettingName): void {\r\n this.withOpenDb(() => {\r\n const container = this.getSettings();\r\n delete container[settingName];\r\n this.updateSettings(container);\r\n });\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;
|
|
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,EAC1F,aAAa,EACvE,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAqH,eAAe,EAAwC,MAAM,iCAAiC,CAAC;AAY3N,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AA6tBpD,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"}
|