@itwin/core-backend 5.10.0-dev.15 → 5.10.0-dev.16
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/lib/cjs/assets/Settings/Schemas/Base.Schema.json +6 -2
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +1 -0
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +1 -0
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.d.ts +5 -2
- package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js +1 -0
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +2 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js +15 -0
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.d.ts +5 -2
- package/lib/esm/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/package.json +12 -12
|
@@ -19,11 +19,15 @@
|
|
|
19
19
|
},
|
|
20
20
|
"schemaPrefix": {
|
|
21
21
|
"type": "string",
|
|
22
|
-
"description": "The unique prefix of the schema."
|
|
22
|
+
"description": "The stable unique prefix of the schema."
|
|
23
|
+
},
|
|
24
|
+
"title": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"description": "A user-facing title for the schema."
|
|
23
27
|
},
|
|
24
28
|
"description": {
|
|
25
29
|
"type": "string",
|
|
26
|
-
"description": "A description of the schema."
|
|
30
|
+
"description": "A description of the schema, for example as help text accompanying the title."
|
|
27
31
|
},
|
|
28
32
|
"order": {
|
|
29
33
|
"type": "integer",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemasImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAqC,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsSchemasImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAqC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA0RrG,wBAAgB,wBAAwB,IAAI,eAAe,CAE1D"}
|
|
@@ -18,6 +18,7 @@ const makeSettingKey = (prefix, key) => `${prefix}/${key}`;
|
|
|
18
18
|
class SettingsSchemasImpl {
|
|
19
19
|
[Symbols_1._implementationProhibited] = undefined;
|
|
20
20
|
_allGroups = new Map();
|
|
21
|
+
get groups() { return this._allGroups; }
|
|
21
22
|
/** a map of all registered Setting Definitions */
|
|
22
23
|
settingDefs = new Map();
|
|
23
24
|
/** a map of all registered TypeDefs */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAiSH,4DAEC;AAjSD,+BAA+B;AAC/B,iCAA8B;AAC9B,+BAAqC;AACrC,sDAAmG;AAEnG,iDAA8C;AAE9C,wCAAuD;AAEvD,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AAE3E,MAAM,mBAAmB;IACP,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACvC,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpE,mDAAmD;IACnC,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/D,wCAAwC;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5D,qFAAqF;IACrE,eAAe,GAAG,IAAI,sBAAO,EAAc,CAAC;IAEpD,UAAU,CAAI,GAAM,EAAE,YAAgC,EAAE,IAAY;QAC1E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;gBACvB,OAAO;QACX,CAAC;aAAM,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;gBACnC,OAAO;QACX,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,YAAY;YACpC,OAAO;QAET,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IACjG,CAAC;IAEM,eAAe,CAAI,KAAQ,EAAE,WAAmB;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,UAAU,EAAE,uEAAuE;YACnG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,mBAAmB,CAAC,OAAgC,EAAE,KAAa;QACxE,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAChC,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEpC,8FAA8F;QAC9F,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,SAAS,KAAK,OAAO;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,IAAI,QAAQ,CAAC,QAAQ;gBACnB,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAChF,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,gBAAgB;IACT,aAAa,CAAC,OAAgC,EAAE,KAAa;QAClE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,SAAS,KAAK,OAAO;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAC5E,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,IAAI,SAAS,KAAK,KAAK;YACrB,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,0BAA0B,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAI,GAAM,EAAE,OAAgC,EAAE,IAAY;QAChF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAElD,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;oBACjC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YACjC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;QAE/C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzE,mDAAmD;QACnD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAI,GAAW,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,SAAS,KAAK,KAAK;oBACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,oBAAoB,IAAI,GAAG,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,mGAAmG;QACnG,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrD,IAAK,GAAW,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO;oBAChD,GAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,kCAAkC;gBAC1D,IAAI,CAAC,gBAAgB,CAAE,GAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,aAAwD;QACtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC/B,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,2DAA2D;IACpD,OAAO,CAAC,aAAqB;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAA,aAAK,EAAC,aAAa,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,sDAAsD;IAC/C,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,2FAA2F;IACpF,YAAY,CAAC,OAAqB;QACvC,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,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,uEAAuE;IAChE,WAAW,CAAC,YAAoB;QACrC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,aAAmC;QAC/C,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,IAAI,SAAS,KAAK,KAAK,CAAC,YAAY;gBAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAEjE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,YAAoB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,KAAK,EAAE,WAAW,EAAE,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC9C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,IAAY,EAAE,QAAmC;QACzE,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,CAAC,IAAI;YAChB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;QAElD,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,SAAS,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACX,OAAO;YAET,KAAK,QAAQ;gBACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAClC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;oBACtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;wBAC7B,IAAI,SAAS,KAAK,KAAK,CAAC,KAAK,CAAC;4BAC5B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;wBAClC,IAAI,CAAC;4BACH,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC1C,CAAC;wBAAC,OAAO,CAAM,EAAE,CAAC;4BAChB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBAC9D,CAAC;gBACL,CAAC;gBACD,OAAO;YAET,KAAK,OAAO;gBACV,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;oBACtC,OAAO;gBACT,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;oBACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,sBAAsB,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO;YAET;gBACE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,sBAAsB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAyB;QAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAuC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtE,IAAA,qBAAM,EAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;gBAC/B,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAA,qBAAM,EAAC,SAAS,KAAK,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAA+C;QACrE,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ;gBACX,OAAO,CAAC,CAAC;YACX,KAAK,QAAQ;gBACX,OAAO,EAAE,CAAC;YACZ,KAAK,OAAO;gBACV,OAAO,EAAE,CAAC;YACZ,KAAK,QAAQ;gBACX,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAED,SAAgB,wBAAwB;IACtC,OAAO,IAAI,mBAAmB,EAAE,CAAC;AACnC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @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 { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${String(val)}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\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));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${String(property.type)}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.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 { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n public get groups(): ReadonlyMap<string, SettingGroupSchema> { return this._allGroups; }\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${String(val)}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\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));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${String(property.type)}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
|
|
@@ -40,7 +40,7 @@ export interface SettingSchema extends Readonly<JSONSchema> {
|
|
|
40
40
|
* remove them via [[SettingsSchemas.removeGroup]].
|
|
41
41
|
*
|
|
42
42
|
* All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.
|
|
43
|
-
* The prefix is combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer
|
|
43
|
+
* The prefix is a stable identifier combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer
|
|
44
44
|
* to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].
|
|
45
45
|
* In the following example, the fully-qualified name of the setting named "metric" is "format/units/metric".
|
|
46
46
|
*
|
|
@@ -60,11 +60,12 @@ export interface SettingSchema extends Readonly<JSONSchema> {
|
|
|
60
60
|
export interface SettingGroupSchema {
|
|
61
61
|
/** Uniquely identifies this group amongst all other groups.
|
|
62
62
|
* The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes "units/metric" and "units/imperial".
|
|
63
|
-
* The user interface may parse these prefixes to display both groups under a "units" tab or expandable tree view node.
|
|
64
63
|
*
|
|
65
64
|
* @note Schema prefixes beginning with "itwin" are reserved for use by iTwin.js.
|
|
66
65
|
*/
|
|
67
66
|
readonly schemaPrefix: string;
|
|
67
|
+
/** A title of this group suitable for displaying to a user. */
|
|
68
|
+
readonly title?: string;
|
|
68
69
|
/** Metadata for each [[Setting]] in this group. */
|
|
69
70
|
readonly settingDefs?: {
|
|
70
71
|
[name: string]: SettingSchema | undefined;
|
|
@@ -101,6 +102,8 @@ export interface SettingGroupSchema {
|
|
|
101
102
|
export interface SettingsSchemas {
|
|
102
103
|
/** @internal */
|
|
103
104
|
readonly [_implementationProhibited]: unknown;
|
|
105
|
+
/** The map of each registered [[SettingGroupSchema]], accessed by its [[SettingGroupSchema.schemaPrefix]]. */
|
|
106
|
+
readonly groups: ReadonlyMap<string, SettingGroupSchema>;
|
|
104
107
|
/** The map of each individual registered [[SettingSchema]] defining a [[Setting]], accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]). */
|
|
105
108
|
readonly settingDefs: ReadonlyMap<SettingName, SettingSchema>;
|
|
106
109
|
/** The map of each individual registered [[SettingSchema]] defining a type that can be extended by other [[SettingSchema]]s via [[SettingSchema.extends]],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;IAQI;AACJ,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAAC,UAAU,CAAC;IACzD,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;KAAE,CAAC;IAC7D;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,MAAM,WAAW,kBAAkB;IACjC
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;IAQI;AACJ,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAAC,UAAU,CAAC;IACzD,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;KAAE,CAAC;IAC7D;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;KAAE,CAAC;IACrE,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;KAAE,CAAC;IAClE,sJAAsJ;IACtJ,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AAEH;;;;;;;;;;;;;;IAcI;AACJ,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,QAAQ,CAAC,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAE9C,8GAA8G;IAC9G,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAEzD,gLAAgL;IAChL,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAE9D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAE3D,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAE9C;;;;;;;OAOG;IACH,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC;IAE1D;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAEzE,uFAAuF;IACvF,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC,kFAAkF;IAClF,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAEvC,oFAAoF;IACpF,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAE1C,+GAA+G;IAC/G,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.js","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAIH,iDAAgE","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { BeEvent, JSONSchema, JSONSchemaTypeName } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { SettingName } from \"./Settings\";\r\n\r\n/** Metadata describing a single [[Setting]] as part of a [[SettingGroupSchema]].\r\n * Every setting has a [[type]], which can be one of the following:\r\n * - A primitive type like `string` or `number`;\r\n * - An object containing any number of named properties, each with their own types; or\r\n * - An array of elements, all of the same type.\r\n * This metadata is used to validate setting values against the schema, and to enable user interfaces by which\r\n * users can view and modify their settings.\r\n * @beta\r\n */\r\nexport interface SettingSchema extends Readonly<JSONSchema> {\r\n /** For arrays only, the metadata describing every element in the array. */\r\n readonly items?: SettingSchema;\r\n /** The name of the [[Setting]]'s data type. */\r\n readonly type: JSONSchemaTypeName;\r\n /** For objects and arrays only, the name of a [[SettingSchema]] that provides a base definition for this type.\r\n * The name is expected to refer to a type definition registered with [[SettingsSchema.typeDefs]].\r\n * Therefore, it must be the full name, including the [[SettingGroupSchema.schemaPrefix]].\r\n */\r\n readonly extends?: string;\r\n /** For objects only, the name and metadata of each of the object's properties. */\r\n readonly properties?: { [name: SettingName]: SettingSchema };\r\n /** For arrays only, specifies how [[SettingsDictionary.getArray]] resolves the value of the setting.\r\n * By default, like other types of settings, the setting uses the value of the setting from the highest-priority dictionary.\r\n * If `combineArray` is `true`, then the value of the setting is computed by combining the elements of every array from every dictionary,\r\n * ordered by priority and eliminating duplicate elements.\r\n * Two elements are considered duplicates of one another if [[Setting.areEqual]] returns `true`.\r\n */\r\n readonly combineArray?: boolean;\r\n}\r\n\r\n/** Metadata describing a group of related [[SettingSchema]]s. You can register setting schema groups via [[SettingsSchemas.addGroup]] and\r\n * remove them via [[SettingsSchemas.removeGroup]].\r\n *\r\n * All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.\r\n * The prefix is combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer\r\n * to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].\r\n * In the following example, the fully-qualified name of the setting named \"metric\" is \"format/units/metric\".\r\n *\r\n * ```json\r\n * {\r\n * \"schemaPrefix\": \"format/units\",\r\n * \"settingDefs\": {\r\n * \"metric\": { \"type\": \"boolean\" }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * A group can also define [[SettingSchema]]s that, rather than describing actual [[Setting]]s, instead describe types that can be extended by [[Setting]]s via\r\n * [[SettingSchema.extends]]. A [[SettingSchema]] can refer to type definitions defined in its own group or any other group.\r\n * @beta\r\n */\r\nexport interface SettingGroupSchema {\r\n /** Uniquely identifies this group amongst all other groups.\r\n * The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes \"units/metric\" and \"units/imperial\".\r\n
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.js","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAIH,iDAAgE","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { BeEvent, JSONSchema, JSONSchemaTypeName } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { SettingName } from \"./Settings\";\r\n\r\n/** Metadata describing a single [[Setting]] as part of a [[SettingGroupSchema]].\r\n * Every setting has a [[type]], which can be one of the following:\r\n * - A primitive type like `string` or `number`;\r\n * - An object containing any number of named properties, each with their own types; or\r\n * - An array of elements, all of the same type.\r\n * This metadata is used to validate setting values against the schema, and to enable user interfaces by which\r\n * users can view and modify their settings.\r\n * @beta\r\n */\r\nexport interface SettingSchema extends Readonly<JSONSchema> {\r\n /** For arrays only, the metadata describing every element in the array. */\r\n readonly items?: SettingSchema;\r\n /** The name of the [[Setting]]'s data type. */\r\n readonly type: JSONSchemaTypeName;\r\n /** For objects and arrays only, the name of a [[SettingSchema]] that provides a base definition for this type.\r\n * The name is expected to refer to a type definition registered with [[SettingsSchema.typeDefs]].\r\n * Therefore, it must be the full name, including the [[SettingGroupSchema.schemaPrefix]].\r\n */\r\n readonly extends?: string;\r\n /** For objects only, the name and metadata of each of the object's properties. */\r\n readonly properties?: { [name: SettingName]: SettingSchema };\r\n /** For arrays only, specifies how [[SettingsDictionary.getArray]] resolves the value of the setting.\r\n * By default, like other types of settings, the setting uses the value of the setting from the highest-priority dictionary.\r\n * If `combineArray` is `true`, then the value of the setting is computed by combining the elements of every array from every dictionary,\r\n * ordered by priority and eliminating duplicate elements.\r\n * Two elements are considered duplicates of one another if [[Setting.areEqual]] returns `true`.\r\n */\r\n readonly combineArray?: boolean;\r\n}\r\n\r\n/** Metadata describing a group of related [[SettingSchema]]s. You can register setting schema groups via [[SettingsSchemas.addGroup]] and\r\n * remove them via [[SettingsSchemas.removeGroup]].\r\n *\r\n * All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.\r\n * The prefix is a stable identifier combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer\r\n * to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].\r\n * In the following example, the fully-qualified name of the setting named \"metric\" is \"format/units/metric\".\r\n *\r\n * ```json\r\n * {\r\n * \"schemaPrefix\": \"format/units\",\r\n * \"settingDefs\": {\r\n * \"metric\": { \"type\": \"boolean\" }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * A group can also define [[SettingSchema]]s that, rather than describing actual [[Setting]]s, instead describe types that can be extended by [[Setting]]s via\r\n * [[SettingSchema.extends]]. A [[SettingSchema]] can refer to type definitions defined in its own group or any other group.\r\n * @beta\r\n */\r\nexport interface SettingGroupSchema {\r\n /** Uniquely identifies this group amongst all other groups.\r\n * The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes \"units/metric\" and \"units/imperial\".\r\n *\r\n * @note Schema prefixes beginning with \"itwin\" are reserved for use by iTwin.js.\r\n */\r\n readonly schemaPrefix: string;\r\n /** A title of this group suitable for displaying to a user. */\r\n readonly title?: string;\r\n /** Metadata for each [[Setting]] in this group. */\r\n readonly settingDefs?: { [name: string]: SettingSchema | undefined };\r\n /** Metadata for types that can be extended by other [[Setting]]s via [[SettingSchema.extends]]. */\r\n readonly typeDefs?: { [name: string]: SettingSchema | undefined };\r\n /** An integer used when displaying a list of schemas in a user interface, to sort schemas with a lower `order` before those with a `higher` order. */\r\n readonly order?: number;\r\n /** A description of this group suitable for displaying to a user. */\r\n readonly description: string;\r\n}\r\n\r\n/**\r\n * The registry of available [[SettingGroupSchema]]s.\r\n * The registry is used for editing Settings files and for finding default values for settings.\r\n * @beta\r\n */\r\n\r\n/** The registry of metadata describing groups of [[SettingSchema]]s available to the current session.\r\n * The schemas are used to look up the default values of [[Setting]]s, validate that their values are of the type dictated by the schema, and\r\n * query metadata like [[SettingsSchema.combineArray]] that modify their behavior.\r\n * They can also be used to drive a user interface that enables end users to edit [[Settings]].\r\n *\r\n * When [[IModelHost.startup]] is invoked at the beginning of a session, schemas delivered with the application - like those describing\r\n * [[Workspace]]s - are automatically loaded.\r\n * The application can manually register additional schemas using methods like [[addGroup]], [[addFile]], [[addDirectory]], and [[addJson]].\r\n * When [[IModelHost.shutdown]] is invoked at the end of a session, all registered schemas are unregistered.\r\n *\r\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\r\n *\r\n * @see [[IModelHost.settingsSchemas]] to access the registry for the current session.\r\n * @beta\r\n */\r\nexport interface SettingsSchemas {\r\n /** @internal */\r\n readonly [_implementationProhibited]: unknown;\r\n\r\n /** The map of each registered [[SettingGroupSchema]], accessed by its [[SettingGroupSchema.schemaPrefix]]. */\r\n readonly groups: ReadonlyMap<string, SettingGroupSchema>;\r\n\r\n /** The map of each individual registered [[SettingSchema]] defining a [[Setting]], accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]). */\r\n readonly settingDefs: ReadonlyMap<SettingName, SettingSchema>;\r\n\r\n /** The map of each individual registered [[SettingSchema]] defining a type that can be extended by other [[SettingSchema]]s via [[SettingSchema.extends]],\r\n * accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]).\r\n */\r\n readonly typeDefs: ReadonlyMap<SettingName, SettingSchema>;\r\n\r\n /** An event raised whenever schemas are added or removed. */\r\n readonly onSchemaChanged: BeEvent<() => void>;\r\n\r\n /**\r\n * Ensure that the setting value supplied is valid according to its [[SettingSchema]].\r\n * If no schema has been registered for the setting, no validation is performed.\r\n * @param value The value of the setting to validate against the schema.\r\n * @param settingName The fully-qualified setting name.\r\n * @returns `value` if `value` matches the schema corresponding to `settingName`, or if no such schema has been registered.\r\n * @throws Error if `value` is invalid according to the schema.\r\n */\r\n validateSetting<T>(value: T, settingName: SettingName): T;\r\n\r\n /** Register one or more [[SettingGroupSchema]]s.\r\n * If a group with the same [[SettingGroupSchema.prefix]] was previously registered, it will be replaced.\r\n * Each [[SettingSchema]] in the group will be added to [[settingDefs]] or [[typeDefs]].\r\n */\r\n addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void;\r\n\r\n /** Invokes [[addGroup]] for a [[SettingGroupSchema]] supplied as stringified json5. */\r\n addJson(settingSchema: string): void;\r\n\r\n /** Invokes [[addGroup]] for a json5 file containiner a [[SettingGroupSchema]]. */\r\n addFile(fileName: LocalFileName): void;\r\n\r\n /** Invokes [[addFile]] for every json and json5 file in the specified directory. */\r\n addDirectory(dirName: LocalDirName): void;\r\n\r\n /** Unregisters all [[settingDefs]] and [[typeDefs]] with the specified [[SettingGroupSchema.schemaPrefix]]. */\r\n removeGroup(schemaPrefix: string): void;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemasImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAqC,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsSchemasImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAqC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA0RrG,wBAAgB,wBAAwB,IAAI,eAAe,CAE1D"}
|
|
@@ -15,6 +15,7 @@ const makeSettingKey = (prefix, key) => `${prefix}/${key}`;
|
|
|
15
15
|
class SettingsSchemasImpl {
|
|
16
16
|
[_implementationProhibited] = undefined;
|
|
17
17
|
_allGroups = new Map();
|
|
18
|
+
get groups() { return this._allGroups; }
|
|
18
19
|
/** a map of all registered Setting Definitions */
|
|
19
20
|
settingDefs = new Map();
|
|
20
21
|
/** a map of all registered TypeDefs */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAA+C,MAAM,qBAAqB,CAAC;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AAE3E,MAAM,mBAAmB;IACP,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACvC,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpE,mDAAmD;IACnC,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/D,wCAAwC;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5D,qFAAqF;IACrE,eAAe,GAAG,IAAI,OAAO,EAAc,CAAC;IAEpD,UAAU,CAAI,GAAM,EAAE,YAAgC,EAAE,IAAY;QAC1E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;gBACvB,OAAO;QACX,CAAC;aAAM,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;gBACnC,OAAO;QACX,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,YAAY;YACpC,OAAO;QAET,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IACjG,CAAC;IAEM,eAAe,CAAI,KAAQ,EAAE,WAAmB;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,UAAU,EAAE,uEAAuE;YACnG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,mBAAmB,CAAC,OAAgC,EAAE,KAAa;QACxE,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAChC,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEpC,8FAA8F;QAC9F,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,SAAS,KAAK,OAAO;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,IAAI,QAAQ,CAAC,QAAQ;gBACnB,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAChF,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,gBAAgB;IACT,aAAa,CAAC,OAAgC,EAAE,KAAa;QAClE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,SAAS,KAAK,OAAO;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAC5E,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,IAAI,SAAS,KAAK,KAAK;YACrB,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,0BAA0B,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAI,GAAM,EAAE,OAAgC,EAAE,IAAY;QAChF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAElD,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;oBACjC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YACjC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;QAE/C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzE,mDAAmD;QACnD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAI,GAAW,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,SAAS,KAAK,KAAK;oBACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,oBAAoB,IAAI,GAAG,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,mGAAmG;QACnG,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrD,IAAK,GAAW,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO;oBAChD,GAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,kCAAkC;gBAC1D,IAAI,CAAC,gBAAgB,CAAE,GAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,aAAwD;QACtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC/B,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,2DAA2D;IACpD,OAAO,CAAC,aAAqB;QAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,sDAAsD;IAC/C,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,2FAA2F;IACpF,YAAY,CAAC,OAAqB;QACvC,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO;gBACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,uEAAuE;IAChE,WAAW,CAAC,YAAoB;QACrC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,aAAmC;QAC/C,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,IAAI,SAAS,KAAK,KAAK,CAAC,YAAY;gBAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAEjE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,YAAoB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,KAAK,EAAE,WAAW,EAAE,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC9C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,IAAY,EAAE,QAAmC;QACzE,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,CAAC,IAAI;YAChB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;QAElD,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,SAAS,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACX,OAAO;YAET,KAAK,QAAQ;gBACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAClC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;oBACtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;wBAC7B,IAAI,SAAS,KAAK,KAAK,CAAC,KAAK,CAAC;4BAC5B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;wBAClC,IAAI,CAAC;4BACH,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC1C,CAAC;wBAAC,OAAO,CAAM,EAAE,CAAC;4BAChB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBAC9D,CAAC;gBACL,CAAC;gBACD,OAAO;YAET,KAAK,OAAO;gBACV,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;oBACtC,OAAO;gBACT,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;oBACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,sBAAsB,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO;YAET;gBACE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,sBAAsB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAyB;QAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAuC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtE,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;gBAC/B,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAA+C;QACrE,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ;gBACX,OAAO,CAAC,CAAC;YACX,KAAK,QAAQ;gBACX,OAAO,EAAE,CAAC;YACZ,KAAK,OAAO;gBACV,OAAO,EAAE,CAAC;YACZ,KAAK,QAAQ;gBACX,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,mBAAmB,EAAE,CAAC;AACnC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @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 { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${String(val)}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\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));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${String(property.type)}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.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 { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n public get groups(): ReadonlyMap<string, SettingGroupSchema> { return this._allGroups; }\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${String(val)}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\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));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${String(property.type)}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
|
|
@@ -24,6 +24,7 @@ describe("Settings", () => {
|
|
|
24
24
|
const app1 = {
|
|
25
25
|
description: "",
|
|
26
26
|
schemaPrefix: "app1",
|
|
27
|
+
title: "App 1",
|
|
27
28
|
settingDefs: {
|
|
28
29
|
sub1: {
|
|
29
30
|
type: "string",
|
|
@@ -287,6 +288,7 @@ describe("Settings", () => {
|
|
|
287
288
|
const group = {
|
|
288
289
|
description: "",
|
|
289
290
|
schemaPrefix,
|
|
291
|
+
title: schemaPrefix,
|
|
290
292
|
settingDefs: {
|
|
291
293
|
array: {
|
|
292
294
|
type: "array",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Settings.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { assert, Mutable, OpenMode } from \"@itwin/core-bentley\";\r\nimport { SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { Setting, SettingsContainer, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { SettingGroupSchema, SettingSchema } from \"../../workspace/SettingsSchemas\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { GcsDbProps, GeoCoordConfig } from \"../../GeoCoordConfig\";\r\n\r\ndescribe(\"Settings\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n IModelHost.settingsSchemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"SettingsTest\", \"SettingsTest.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n iModel.close();\r\n });\r\n\r\n const app1: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix: \"app1\",\r\n settingDefs: {\r\n sub1: {\r\n type: \"string\",\r\n enum: [\"va1\", \"alt1\"],\r\n enumDescriptions: [\r\n \"descr1\",\r\n \"descr2\",\r\n ],\r\n default: \"val1\",\r\n description: \"the first value\",\r\n },\r\n sub2: {\r\n type: \"array\",\r\n description: \"an array\",\r\n items: {\r\n type: \"string\",\r\n },\r\n },\r\n boolVal: {\r\n type: \"boolean\",\r\n default: true,\r\n description: \"boolean defaults to true\",\r\n },\r\n strVal: {\r\n type: \"string\",\r\n default: \"default string val\",\r\n },\r\n intVal: {\r\n type: \"integer\",\r\n default: 22,\r\n },\r\n obj: {\r\n type: \"object\",\r\n properties: {\r\n out: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\", \"m2\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n },\r\n databases: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n required: [\"name\", \"dbName\", \"containerName\"],\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n },\r\n dbName: {\r\n type: \"string\",\r\n },\r\n containerName: {\r\n type: \"string\",\r\n },\r\n b2: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n const app1Settings = {\r\n \"app1/sub1\": \"app1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"app1\", \"app2\"],\r\n },\r\n \"app1/setting2\": 1002,\r\n \"app1/setting3\": \"app setting 3 val\",\r\n \"app1/setting5\": \"app setting 5 val\",\r\n };\r\n\r\n const imodel1Settings = {\r\n \"app1/sub1\": \"imodel1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a1\", \"a2\"],\r\n },\r\n \"app1/setting2\": 2,\r\n \"app1/setting3\": \"setting 3 val\",\r\n };\r\n\r\n const imodel2Settings = {\r\n \"app1/sub1\": \"imodel2 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a21\", \"a22\"],\r\n },\r\n };\r\n\r\n const iTwinSettings = {\r\n \"app1/sub1\": \"val3\",\r\n \"app1/sub2\": {\r\n arr: [\"a31\", \"a32\", \"a33\"],\r\n },\r\n \"app2/setting6\": \"val 6\",\r\n \"app3/obj\": {\r\n member1: \"test2\",\r\n member2: \"test3\",\r\n member3: {\r\n part1: \"p1\",\r\n part2: [\r\n { m1: 0 },\r\n { m1: 2 },\r\n ],\r\n },\r\n },\r\n };\r\n\r\n it(\"settings priorities\", () => {\r\n const settings = iModel.workspace.settings;\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n IModelHost.appWorkspace.settings.addDictionary({ name: \"app1\", priority: SettingsPriority.application }, app1Settings);\r\n\r\n let settingsChanged = 0;\r\n settings.onSettingsChanged.addListener(() => settingsChanged++);\r\n\r\n settings.addDictionary({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel }, imodel1Settings);\r\n expect(settingsChanged).eq(1);\r\n settings.addDictionary({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel }, imodel2Settings);\r\n expect(settingsChanged).eq(2);\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settingsChanged).eq(3);\r\n\r\n expect(() => IModelHost.appWorkspace.settings.addDictionary({ name: \"iModel\", priority: SettingsPriority.iModel }, imodel1Settings)).to.throw(\"Use IModelSettings\");\r\n\r\n expect(settings.getString(\"app1/sub1\")).equals(imodel2Settings[\"app1/sub1\"]);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settings.getString(\"app1/setting5\")).equals(app1Settings[\"app1/setting5\"]); // comes from app settings\r\n expect(settings.getSetting<any>(\"app1/sub2\").arr).deep.equals(imodel2Settings[\"app1/sub2\"].arr);\r\n\r\n const app3obj = settings.getSetting<any>(\"app3/obj\");\r\n expect(app3obj).deep.equals(iTwinSettings[\"app3/obj\"]);\r\n app3obj.member3.part2[0].m1 = \"bad\"; // should modify a copy\r\n expect(iTwinSettings[\"app3/obj\"].member3.part2[0].m1).equal(0);\r\n\r\n expect(settings.getObject(\"app3/obj\")).deep.equals(iTwinSettings[\"app3/obj\"]); // should be original value\r\n expect(settings.getBoolean(\"app1/boolVal\")).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", true)).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", false)).equals(false);\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n expect(settings.getNumber(\"app1/intVal\")).equals(22);\r\n expect(() => settings.getObject(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getArray(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getString(\"app1/intVal\", \"oops\")).throws(\"app1/intVal\");\r\n expect(() => settings.getBoolean(\"app1/intVal\", true)).throws(\"app1/intVal\");\r\n expect(settings.getNumber(\"app1/not there\", 33)).equals(33);\r\n expect(settings.getSetting(\"app1/not there\")).is.undefined;\r\n expect(settings.getString(\"app2/not there\", \"fallback\")).equals(\"fallback\");\r\n\r\n // list of default Gcs databases is in the backend.setting.json5 file loaded on startup\r\n const defaultGcs = settings.getArray<GcsDbProps>(GeoCoordConfig.settingName.defaultDatabases);\r\n assert(undefined !== defaultGcs);\r\n expect(defaultGcs.length).equals(2);\r\n expect(defaultGcs[0].baseUri).equal(\"https://geocoord-workspace.itwinjs.org\");\r\n expect(defaultGcs[1].baseUri).equal(defaultGcs[1].baseUri);\r\n expect(defaultGcs[0].dbName).equal(\"base\");\r\n expect(defaultGcs[1].dbName).equal(\"allEarth\");\r\n expect(defaultGcs[0].priority).equals(10000);\r\n expect(defaultGcs[1].priority).equals(100);\r\n expect(defaultGcs[0].prefetch).true;\r\n expect(defaultGcs[1].prefetch).undefined;\r\n expect(defaultGcs[1].storageType).equals(\"azure\");\r\n\r\n iTwinSettings[\"app2/setting6\"] = \"new value for 6\";\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settingsChanged).eq(4);\r\n\r\n (app1.settingDefs!.strVal as Mutable<SettingSchema>).default = \"new default\";\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n\r\n // after re-registering, the new default should be updated\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n\r\n expect(settings.dictionaries.length).eq(3);\r\n\r\n const inspect = Array.from(settings.getSettingEntries(\"app1/sub1\"));\r\n expect(inspect.length).equals(5);\r\n expect(inspect[0].dictionary.props).to.deep.equal({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[0].value).equal(\"imodel2 value\");\r\n expect(inspect[1].dictionary.props).to.deep.equal({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[1].value).equal(\"imodel1 value\");\r\n expect(inspect[2].dictionary.props).to.deep.equal({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin });\r\n expect(inspect[2].value).equal(\"val3\");\r\n expect(inspect[3].dictionary.props).to.deep.equal({ name: \"app1\", priority: SettingsPriority.application });\r\n expect(inspect[3].value).equal(\"app1 value\");\r\n expect(inspect[4].dictionary.props).to.deep.equal({ name: \"_default_\", priority: 0 });\r\n expect(inspect[4].value).equal(\"val1\");\r\n\r\n settings.dropDictionary({ name: \"iTwin.setting.json\" });\r\n expect(settingsChanged).eq(5);\r\n expect(settings.getString(\"app2/setting6\")).is.undefined;\r\n\r\n // test validation of values vs. setting schemas\r\n const workspace: any = { dbName: \"abc\", containerId: \"123\", baseUri: \"aab.com\" };\r\n const fontListVal: any = [{ workspace, fontName: \"arial\" }, { workspace, fontName: \"helvetica\", fontType: 3 }];\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"required value for \\\"workspaceLimit\\\" is missing\");\r\n workspace.workspaceLimit = 4; // add missing value\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"value for testApp/fontList[1].fontType\");\r\n fontListVal[1].fontType = \"ttf\"; // correct font type to string\r\n expect(IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).equal(fontListVal); // should now pass\r\n });\r\n\r\n it(\"read settings file\", () => {\r\n const appSettings = IModelHost.appWorkspace.settings;\r\n const iModelSettings = iModel.workspace.settings;\r\n const settingFileName = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n expect(() => appSettings.addFile(settingFileName, SettingsPriority.iTwin)).throws(\"Use IModelSettings\");\r\n appSettings.addFile(settingFileName, SettingsPriority.application);\r\n expect(() => iModelSettings.addFile(settingFileName, SettingsPriority.application)).to.throw(\"Use IModelHost.appSettings\");\r\n expect(appSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n expect(iModelSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n const token = appSettings.getSetting<any>(\"editor/tokenColorCustomizations\")!;\r\n expect(token[\"Visual Studio Light\"].textMateRules[0].settings.foreground).equals(\"#d16c6c\");\r\n expect(token[\"Default High Contrast\"].comments).equals(\"#FF0000\");\r\n expect(appSettings.getArray<string>(\"editor/enableFiletypes\")!.length).equals(17);\r\n appSettings.dropDictionary({ name: settingFileName });\r\n });\r\n\r\n it(\"IModel persistent settings \", () => {\r\n const iModelName = IModelTestUtils.prepareOutputFile(\"IModelSetting\", \"test.bim\");\r\n const iModel2 = IModelTestUtils.createSnapshotFromSeed(iModelName, IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n\r\n const setting1: SettingsContainer = {\r\n \"imodel/setting1\": \"this is from setting1\",\r\n };\r\n const setting1changed: SettingsContainer = {\r\n \"imodel/setting1\": \"this is changed setting1\",\r\n };\r\n const gcsDbDict: SettingsContainer = {\r\n \"gcs/databases\": [\"gcs/Usa\", \"gcs/Canada\"],\r\n };\r\n withEditTxn(iModel2, (txn) => {\r\n txn.saveSettingDictionary(\"gcs-dbs\", gcsDbDict);\r\n txn.saveSettingDictionary(\"test1\", setting1);\r\n });\r\n iModel2.close();\r\n\r\n let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1[\"imodel/setting1\"]);\r\n\r\n withEditTxn(iModel3, (txn) => txn.saveSettingDictionary(\"test1\", setting1changed));\r\n iModel3.close();\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1changed[\"imodel/setting1\"]);\r\n withEditTxn(iModel3, (txn) => txn.deleteSettingDictionary(\"test1\"));\r\n iModel3.close();\r\n\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).to.be.undefined;\r\n iModel3.close();\r\n });\r\n\r\n describe(\"combineArray\", () => {\r\n function addGroup(schemaPrefix: string, type: \"number\" | \"object\", combineArray: boolean | undefined): void {\r\n const group: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix,\r\n settingDefs: {\r\n array: {\r\n type: \"array\",\r\n items: { type },\r\n combineArray,\r\n },\r\n },\r\n };\r\n\r\n IModelHost.settingsSchemas.addGroup(group);\r\n }\r\n\r\n function addArray(schemaPrefix: string, name: string, value: Setting[], priority: SettingsPriority | number): void {\r\n const settings: SettingsContainer = {};\r\n settings[`${schemaPrefix}/array`] = value;\r\n\r\n IModelHost.appWorkspace.settings.addDictionary({\r\n name,\r\n priority,\r\n }, settings);\r\n }\r\n\r\n it(\"combines arrays only if the combineArray flag is explicitly set to true\", () => {\r\n addGroup(\"false\", \"number\", false);\r\n addGroup(\"true\", \"number\", true);\r\n addGroup(\"default\", \"number\", undefined);\r\n\r\n let dictNum = 0;\r\n const prefixes = [\"false\", \"true\", \"default\"];\r\n for (const schemaPrefix of prefixes) {\r\n addArray(schemaPrefix, `app${dictNum++}`, [1, 2], SettingsPriority.application);\r\n addArray(schemaPrefix, `def${dictNum++}`, [3, 4], SettingsPriority.defaults);\r\n }\r\n\r\n for (const prefix of prefixes) {\r\n const settingName = `${prefix}/array`;\r\n expect(IModelHost.appWorkspace.settings.getSetting<number[]>(settingName)).to.deep.equal([1, 2]);\r\n\r\n const expected = (\"true\" === prefix ? [1, 2, 3, 4] : [1, 2]);\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(settingName)).to.deep.equal(expected);\r\n }\r\n });\r\n\r\n it(\"orders elements by priority\", () => {\r\n addGroup(\"combine\", \"number\", true);\r\n function addDictionary(priority: number) {\r\n addArray(\"combine\", priority.toString(), [priority], priority);\r\n }\r\n\r\n addDictionary(100);\r\n addDictionary(120);\r\n addDictionary(80);\r\n addDictionary(150);\r\n addDictionary(30);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"combine/array\")).to.deep.equal([150, 120, 100, 80, 30]);\r\n });\r\n\r\n it(\"ignores duplicates with lower priority\", () => {\r\n addGroup(\"numbers\", \"number\", true);\r\n\r\n addArray(\"numbers\", \"a\", [4, 8], 101);\r\n addArray(\"numbers\", \"c\", [3, 6, 9, 12], 99);\r\n addArray(\"numbers\", \"b\", [2, 4, 6, 8, 10, 12], 100);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"numbers/array\")).to.deep.equal([4, 8, 2, 6, 10, 12, 3, 9]);\r\n\r\n interface Point { x: number, y: number };\r\n addGroup(\"points\", \"object\", true);\r\n\r\n addArray(\"points\", \"a\", [{ x: 1, y: 1 }, { x: 1, y: 2 }], 101);\r\n addArray(\"points\", \"b\", [{ x: 2, y: 1 }, { x: 1, y: 2 }], 100);\r\n addArray(\"points\", \"c\", [{ y: 1, x: 1 }, { y: 2, x: 1 }, { x: 3, y: 3 }], 99);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<Point>(\"points/array\")).to.deep.equal([{ x: 1, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 1 }, { x: 3, y: 3 }]);\r\n });\r\n });\r\n\r\n it(\"toJSON on in-memory SettingsDictionary\", () => {\r\n const settings = IModelHost.appWorkspace.settings;\r\n settings.addDictionary({ name: \"toJsonTest\", priority: SettingsPriority.defaults }, {\r\n \"test/string\": \"hello\",\r\n \"test/number\": 42,\r\n \"test/nested\": { a: [1, 2, 3] },\r\n });\r\n\r\n const dict = settings.getDictionary({ name: \"toJsonTest\" });\r\n expect(dict).to.not.be.undefined;\r\n\r\n const json = dict!.toJSON();\r\n expect(json[\"test/string\"]).to.equal(\"hello\");\r\n expect(json[\"test/number\"]).to.equal(42);\r\n expect(json[\"test/nested\"]).to.deep.equal({ a: [1, 2, 3] });\r\n\r\n // Mutating the clone should not affect the dictionary\r\n (json as any)[\"test/string\"] = \"modified\";\r\n expect(dict!.getSetting<string>(\"test/string\")).to.equal(\"hello\");\r\n\r\n settings.dropDictionary({ name: \"toJsonTest\" });\r\n });\r\n\r\n it(\"dictionaries with same name but different workspaceDb are independent\", () => {\r\n const settings = iModel.workspace.settings;\r\n const fakeWorkspaceDb1 = { name: \"fakeDb1\" } as any;\r\n const fakeWorkspaceDb2 = { name: \"fakeDb2\" } as any;\r\n\r\n settings.addDictionary(\r\n { name: \"shared-name\", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb1 },\r\n { \"test/value\": \"from-db1\" },\r\n );\r\n settings.addDictionary(\r\n { name: \"shared-name\", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb2 },\r\n { \"test/value\": \"from-db2\" },\r\n );\r\n\r\n // Both dictionaries should exist since they have different workspaceDb\r\n const dict1 = settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 });\r\n const dict2 = settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 });\r\n expect(dict1).to.not.be.undefined;\r\n expect(dict2).to.not.be.undefined;\r\n expect(dict1!.getSetting<string>(\"test/value\")).to.equal(\"from-db1\");\r\n expect(dict2!.getSetting<string>(\"test/value\")).to.equal(\"from-db2\");\r\n\r\n // Drop only one — the other should remain\r\n settings.dropDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 });\r\n expect(settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 })).to.be.undefined;\r\n expect(settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 })).to.not.be.undefined;\r\n\r\n settings.dropDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 });\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"Settings.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Settings.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { assert, Mutable, OpenMode } from \"@itwin/core-bentley\";\r\nimport { SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { Setting, SettingsContainer, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { SettingGroupSchema, SettingSchema } from \"../../workspace/SettingsSchemas\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { GcsDbProps, GeoCoordConfig } from \"../../GeoCoordConfig\";\r\n\r\ndescribe(\"Settings\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n IModelHost.settingsSchemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"SettingsTest\", \"SettingsTest.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n iModel.close();\r\n });\r\n\r\n const app1: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix: \"app1\",\r\n title: \"App 1\",\r\n settingDefs: {\r\n sub1: {\r\n type: \"string\",\r\n enum: [\"va1\", \"alt1\"],\r\n enumDescriptions: [\r\n \"descr1\",\r\n \"descr2\",\r\n ],\r\n default: \"val1\",\r\n description: \"the first value\",\r\n },\r\n sub2: {\r\n type: \"array\",\r\n description: \"an array\",\r\n items: {\r\n type: \"string\",\r\n },\r\n },\r\n boolVal: {\r\n type: \"boolean\",\r\n default: true,\r\n description: \"boolean defaults to true\",\r\n },\r\n strVal: {\r\n type: \"string\",\r\n default: \"default string val\",\r\n },\r\n intVal: {\r\n type: \"integer\",\r\n default: 22,\r\n },\r\n obj: {\r\n type: \"object\",\r\n properties: {\r\n out: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\", \"m2\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n },\r\n databases: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n required: [\"name\", \"dbName\", \"containerName\"],\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n },\r\n dbName: {\r\n type: \"string\",\r\n },\r\n containerName: {\r\n type: \"string\",\r\n },\r\n b2: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n const app1Settings = {\r\n \"app1/sub1\": \"app1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"app1\", \"app2\"],\r\n },\r\n \"app1/setting2\": 1002,\r\n \"app1/setting3\": \"app setting 3 val\",\r\n \"app1/setting5\": \"app setting 5 val\",\r\n };\r\n\r\n const imodel1Settings = {\r\n \"app1/sub1\": \"imodel1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a1\", \"a2\"],\r\n },\r\n \"app1/setting2\": 2,\r\n \"app1/setting3\": \"setting 3 val\",\r\n };\r\n\r\n const imodel2Settings = {\r\n \"app1/sub1\": \"imodel2 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a21\", \"a22\"],\r\n },\r\n };\r\n\r\n const iTwinSettings = {\r\n \"app1/sub1\": \"val3\",\r\n \"app1/sub2\": {\r\n arr: [\"a31\", \"a32\", \"a33\"],\r\n },\r\n \"app2/setting6\": \"val 6\",\r\n \"app3/obj\": {\r\n member1: \"test2\",\r\n member2: \"test3\",\r\n member3: {\r\n part1: \"p1\",\r\n part2: [\r\n { m1: 0 },\r\n { m1: 2 },\r\n ],\r\n },\r\n },\r\n };\r\n\r\n it(\"settings priorities\", () => {\r\n const settings = iModel.workspace.settings;\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n IModelHost.appWorkspace.settings.addDictionary({ name: \"app1\", priority: SettingsPriority.application }, app1Settings);\r\n\r\n let settingsChanged = 0;\r\n settings.onSettingsChanged.addListener(() => settingsChanged++);\r\n\r\n settings.addDictionary({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel }, imodel1Settings);\r\n expect(settingsChanged).eq(1);\r\n settings.addDictionary({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel }, imodel2Settings);\r\n expect(settingsChanged).eq(2);\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settingsChanged).eq(3);\r\n\r\n expect(() => IModelHost.appWorkspace.settings.addDictionary({ name: \"iModel\", priority: SettingsPriority.iModel }, imodel1Settings)).to.throw(\"Use IModelSettings\");\r\n\r\n expect(settings.getString(\"app1/sub1\")).equals(imodel2Settings[\"app1/sub1\"]);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settings.getString(\"app1/setting5\")).equals(app1Settings[\"app1/setting5\"]); // comes from app settings\r\n expect(settings.getSetting<any>(\"app1/sub2\").arr).deep.equals(imodel2Settings[\"app1/sub2\"].arr);\r\n\r\n const app3obj = settings.getSetting<any>(\"app3/obj\");\r\n expect(app3obj).deep.equals(iTwinSettings[\"app3/obj\"]);\r\n app3obj.member3.part2[0].m1 = \"bad\"; // should modify a copy\r\n expect(iTwinSettings[\"app3/obj\"].member3.part2[0].m1).equal(0);\r\n\r\n expect(settings.getObject(\"app3/obj\")).deep.equals(iTwinSettings[\"app3/obj\"]); // should be original value\r\n expect(settings.getBoolean(\"app1/boolVal\")).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", true)).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", false)).equals(false);\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n expect(settings.getNumber(\"app1/intVal\")).equals(22);\r\n expect(() => settings.getObject(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getArray(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getString(\"app1/intVal\", \"oops\")).throws(\"app1/intVal\");\r\n expect(() => settings.getBoolean(\"app1/intVal\", true)).throws(\"app1/intVal\");\r\n expect(settings.getNumber(\"app1/not there\", 33)).equals(33);\r\n expect(settings.getSetting(\"app1/not there\")).is.undefined;\r\n expect(settings.getString(\"app2/not there\", \"fallback\")).equals(\"fallback\");\r\n\r\n // list of default Gcs databases is in the backend.setting.json5 file loaded on startup\r\n const defaultGcs = settings.getArray<GcsDbProps>(GeoCoordConfig.settingName.defaultDatabases);\r\n assert(undefined !== defaultGcs);\r\n expect(defaultGcs.length).equals(2);\r\n expect(defaultGcs[0].baseUri).equal(\"https://geocoord-workspace.itwinjs.org\");\r\n expect(defaultGcs[1].baseUri).equal(defaultGcs[1].baseUri);\r\n expect(defaultGcs[0].dbName).equal(\"base\");\r\n expect(defaultGcs[1].dbName).equal(\"allEarth\");\r\n expect(defaultGcs[0].priority).equals(10000);\r\n expect(defaultGcs[1].priority).equals(100);\r\n expect(defaultGcs[0].prefetch).true;\r\n expect(defaultGcs[1].prefetch).undefined;\r\n expect(defaultGcs[1].storageType).equals(\"azure\");\r\n\r\n iTwinSettings[\"app2/setting6\"] = \"new value for 6\";\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settingsChanged).eq(4);\r\n\r\n (app1.settingDefs!.strVal as Mutable<SettingSchema>).default = \"new default\";\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n\r\n // after re-registering, the new default should be updated\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n\r\n expect(settings.dictionaries.length).eq(3);\r\n\r\n const inspect = Array.from(settings.getSettingEntries(\"app1/sub1\"));\r\n expect(inspect.length).equals(5);\r\n expect(inspect[0].dictionary.props).to.deep.equal({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[0].value).equal(\"imodel2 value\");\r\n expect(inspect[1].dictionary.props).to.deep.equal({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[1].value).equal(\"imodel1 value\");\r\n expect(inspect[2].dictionary.props).to.deep.equal({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin });\r\n expect(inspect[2].value).equal(\"val3\");\r\n expect(inspect[3].dictionary.props).to.deep.equal({ name: \"app1\", priority: SettingsPriority.application });\r\n expect(inspect[3].value).equal(\"app1 value\");\r\n expect(inspect[4].dictionary.props).to.deep.equal({ name: \"_default_\", priority: 0 });\r\n expect(inspect[4].value).equal(\"val1\");\r\n\r\n settings.dropDictionary({ name: \"iTwin.setting.json\" });\r\n expect(settingsChanged).eq(5);\r\n expect(settings.getString(\"app2/setting6\")).is.undefined;\r\n\r\n // test validation of values vs. setting schemas\r\n const workspace: any = { dbName: \"abc\", containerId: \"123\", baseUri: \"aab.com\" };\r\n const fontListVal: any = [{ workspace, fontName: \"arial\" }, { workspace, fontName: \"helvetica\", fontType: 3 }];\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"required value for \\\"workspaceLimit\\\" is missing\");\r\n workspace.workspaceLimit = 4; // add missing value\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"value for testApp/fontList[1].fontType\");\r\n fontListVal[1].fontType = \"ttf\"; // correct font type to string\r\n expect(IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).equal(fontListVal); // should now pass\r\n });\r\n\r\n it(\"read settings file\", () => {\r\n const appSettings = IModelHost.appWorkspace.settings;\r\n const iModelSettings = iModel.workspace.settings;\r\n const settingFileName = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n expect(() => appSettings.addFile(settingFileName, SettingsPriority.iTwin)).throws(\"Use IModelSettings\");\r\n appSettings.addFile(settingFileName, SettingsPriority.application);\r\n expect(() => iModelSettings.addFile(settingFileName, SettingsPriority.application)).to.throw(\"Use IModelHost.appSettings\");\r\n expect(appSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n expect(iModelSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n const token = appSettings.getSetting<any>(\"editor/tokenColorCustomizations\")!;\r\n expect(token[\"Visual Studio Light\"].textMateRules[0].settings.foreground).equals(\"#d16c6c\");\r\n expect(token[\"Default High Contrast\"].comments).equals(\"#FF0000\");\r\n expect(appSettings.getArray<string>(\"editor/enableFiletypes\")!.length).equals(17);\r\n appSettings.dropDictionary({ name: settingFileName });\r\n });\r\n\r\n it(\"IModel persistent settings \", () => {\r\n const iModelName = IModelTestUtils.prepareOutputFile(\"IModelSetting\", \"test.bim\");\r\n const iModel2 = IModelTestUtils.createSnapshotFromSeed(iModelName, IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n\r\n const setting1: SettingsContainer = {\r\n \"imodel/setting1\": \"this is from setting1\",\r\n };\r\n const setting1changed: SettingsContainer = {\r\n \"imodel/setting1\": \"this is changed setting1\",\r\n };\r\n const gcsDbDict: SettingsContainer = {\r\n \"gcs/databases\": [\"gcs/Usa\", \"gcs/Canada\"],\r\n };\r\n withEditTxn(iModel2, (txn) => {\r\n txn.saveSettingDictionary(\"gcs-dbs\", gcsDbDict);\r\n txn.saveSettingDictionary(\"test1\", setting1);\r\n });\r\n iModel2.close();\r\n\r\n let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1[\"imodel/setting1\"]);\r\n\r\n withEditTxn(iModel3, (txn) => txn.saveSettingDictionary(\"test1\", setting1changed));\r\n iModel3.close();\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1changed[\"imodel/setting1\"]);\r\n withEditTxn(iModel3, (txn) => txn.deleteSettingDictionary(\"test1\"));\r\n iModel3.close();\r\n\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).to.be.undefined;\r\n iModel3.close();\r\n });\r\n\r\n describe(\"combineArray\", () => {\r\n function addGroup(schemaPrefix: string, type: \"number\" | \"object\", combineArray: boolean | undefined): void {\r\n const group: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix,\r\n title: schemaPrefix,\r\n settingDefs: {\r\n array: {\r\n type: \"array\",\r\n items: { type },\r\n combineArray,\r\n },\r\n },\r\n };\r\n\r\n IModelHost.settingsSchemas.addGroup(group);\r\n }\r\n\r\n function addArray(schemaPrefix: string, name: string, value: Setting[], priority: SettingsPriority | number): void {\r\n const settings: SettingsContainer = {};\r\n settings[`${schemaPrefix}/array`] = value;\r\n\r\n IModelHost.appWorkspace.settings.addDictionary({\r\n name,\r\n priority,\r\n }, settings);\r\n }\r\n\r\n it(\"combines arrays only if the combineArray flag is explicitly set to true\", () => {\r\n addGroup(\"false\", \"number\", false);\r\n addGroup(\"true\", \"number\", true);\r\n addGroup(\"default\", \"number\", undefined);\r\n\r\n let dictNum = 0;\r\n const prefixes = [\"false\", \"true\", \"default\"];\r\n for (const schemaPrefix of prefixes) {\r\n addArray(schemaPrefix, `app${dictNum++}`, [1, 2], SettingsPriority.application);\r\n addArray(schemaPrefix, `def${dictNum++}`, [3, 4], SettingsPriority.defaults);\r\n }\r\n\r\n for (const prefix of prefixes) {\r\n const settingName = `${prefix}/array`;\r\n expect(IModelHost.appWorkspace.settings.getSetting<number[]>(settingName)).to.deep.equal([1, 2]);\r\n\r\n const expected = (\"true\" === prefix ? [1, 2, 3, 4] : [1, 2]);\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(settingName)).to.deep.equal(expected);\r\n }\r\n });\r\n\r\n it(\"orders elements by priority\", () => {\r\n addGroup(\"combine\", \"number\", true);\r\n function addDictionary(priority: number) {\r\n addArray(\"combine\", priority.toString(), [priority], priority);\r\n }\r\n\r\n addDictionary(100);\r\n addDictionary(120);\r\n addDictionary(80);\r\n addDictionary(150);\r\n addDictionary(30);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"combine/array\")).to.deep.equal([150, 120, 100, 80, 30]);\r\n });\r\n\r\n it(\"ignores duplicates with lower priority\", () => {\r\n addGroup(\"numbers\", \"number\", true);\r\n\r\n addArray(\"numbers\", \"a\", [4, 8], 101);\r\n addArray(\"numbers\", \"c\", [3, 6, 9, 12], 99);\r\n addArray(\"numbers\", \"b\", [2, 4, 6, 8, 10, 12], 100);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"numbers/array\")).to.deep.equal([4, 8, 2, 6, 10, 12, 3, 9]);\r\n\r\n interface Point { x: number, y: number };\r\n addGroup(\"points\", \"object\", true);\r\n\r\n addArray(\"points\", \"a\", [{ x: 1, y: 1 }, { x: 1, y: 2 }], 101);\r\n addArray(\"points\", \"b\", [{ x: 2, y: 1 }, { x: 1, y: 2 }], 100);\r\n addArray(\"points\", \"c\", [{ y: 1, x: 1 }, { y: 2, x: 1 }, { x: 3, y: 3 }], 99);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<Point>(\"points/array\")).to.deep.equal([{ x: 1, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 1 }, { x: 3, y: 3 }]);\r\n });\r\n });\r\n\r\n it(\"toJSON on in-memory SettingsDictionary\", () => {\r\n const settings = IModelHost.appWorkspace.settings;\r\n settings.addDictionary({ name: \"toJsonTest\", priority: SettingsPriority.defaults }, {\r\n \"test/string\": \"hello\",\r\n \"test/number\": 42,\r\n \"test/nested\": { a: [1, 2, 3] },\r\n });\r\n\r\n const dict = settings.getDictionary({ name: \"toJsonTest\" });\r\n expect(dict).to.not.be.undefined;\r\n\r\n const json = dict!.toJSON();\r\n expect(json[\"test/string\"]).to.equal(\"hello\");\r\n expect(json[\"test/number\"]).to.equal(42);\r\n expect(json[\"test/nested\"]).to.deep.equal({ a: [1, 2, 3] });\r\n\r\n // Mutating the clone should not affect the dictionary\r\n (json as any)[\"test/string\"] = \"modified\";\r\n expect(dict!.getSetting<string>(\"test/string\")).to.equal(\"hello\");\r\n\r\n settings.dropDictionary({ name: \"toJsonTest\" });\r\n });\r\n\r\n it(\"dictionaries with same name but different workspaceDb are independent\", () => {\r\n const settings = iModel.workspace.settings;\r\n const fakeWorkspaceDb1 = { name: \"fakeDb1\" } as any;\r\n const fakeWorkspaceDb2 = { name: \"fakeDb2\" } as any;\r\n\r\n settings.addDictionary(\r\n { name: \"shared-name\", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb1 },\r\n { \"test/value\": \"from-db1\" },\r\n );\r\n settings.addDictionary(\r\n { name: \"shared-name\", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb2 },\r\n { \"test/value\": \"from-db2\" },\r\n );\r\n\r\n // Both dictionaries should exist since they have different workspaceDb\r\n const dict1 = settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 });\r\n const dict2 = settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 });\r\n expect(dict1).to.not.be.undefined;\r\n expect(dict2).to.not.be.undefined;\r\n expect(dict1!.getSetting<string>(\"test/value\")).to.equal(\"from-db1\");\r\n expect(dict2!.getSetting<string>(\"test/value\")).to.equal(\"from-db2\");\r\n\r\n // Drop only one — the other should remain\r\n settings.dropDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 });\r\n expect(settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb1 })).to.be.undefined;\r\n expect(settings.getDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 })).to.not.be.undefined;\r\n\r\n settings.dropDictionary({ name: \"shared-name\", workspaceDb: fakeWorkspaceDb2 });\r\n });\r\n\r\n});\r\n"]}
|
|
@@ -23,7 +23,22 @@ describe("SettingsSchemas", () => {
|
|
|
23
23
|
const schemas = IModelHost.settingsSchemas;
|
|
24
24
|
// can't add a group with no name
|
|
25
25
|
expect(() => schemas.addGroup({})).throws(`has no "schemaPrefix" member`);
|
|
26
|
+
schemas.addGroup({
|
|
27
|
+
schemaPrefix: "title-test",
|
|
28
|
+
title: "Title Test",
|
|
29
|
+
description: "schema with a user-facing title",
|
|
30
|
+
settingDefs: {
|
|
31
|
+
setting: {
|
|
32
|
+
type: "string",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
expect(schemas.groups.get("title-test")?.title).equals("Title Test");
|
|
37
|
+
expect(schemas.groups.get("title-test")?.description).equals("schema with a user-facing title");
|
|
38
|
+
expect(schemas.settingDefs.get("title-test/setting").type).equals("string");
|
|
26
39
|
schemas.addFile(IModelTestUtils.resolveAssetFile("TestSettings.schema.json"));
|
|
40
|
+
expect(schemas.groups.get("testApp")?.title).equals("Test App");
|
|
41
|
+
expect(schemas.groups.get("testApp")?.description).equals("the settings for test application 1");
|
|
27
42
|
expect(schemas.settingDefs.get("testApp/list/openMode").type).equals("string");
|
|
28
43
|
expect(schemas.settingDefs.get("testApp/list/openMode").default).equals("singleClick");
|
|
29
44
|
expect(schemas.settingDefs.get("testApp/tree/blah").default).equals(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SettingsSchemas.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAE/B,2FAA2F;IAC3F,kIAAkI;IAClI,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAS,CAAC,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAEjF,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { TestUtils } from \"../TestUtils\";\r\n\r\ndescribe(\"SettingsSchemas\", () => {\r\n\r\n // SettingsSchema tests change the state of the IModelHost object. They should always clear\r\n // the current state before and after they run so they're not affected by, nor influence, other tests running in the same process.\r\n const restartSession = async () => {\r\n await IModelHost.shutdown();\r\n await TestUtils.startBackend();\r\n };\r\n before(async () => {\r\n await restartSession();\r\n });\r\n after(async () => {\r\n await restartSession();\r\n });\r\n\r\n it(\"add groups\", async () => {\r\n const schemas = IModelHost.settingsSchemas;\r\n // can't add a group with no name\r\n expect(() => schemas.addGroup({} as any)).throws(`has no \"schemaPrefix\" member`);\r\n\r\n schemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.type).equals(\"string\");\r\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.default).equals(\"singleClick\");\r\n expect(schemas.settingDefs.get(\"testApp/tree/blah\")!.default).equals(true);\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SettingsSchemas.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAE/B,2FAA2F;IAC3F,kIAAkI;IAClI,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAS,CAAC,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAEjF,OAAO,CAAC,QAAQ,CAAC;YACf,YAAY,EAAE,YAAY;YAC1B,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,iCAAiC;YAC9C,WAAW,EAAE;gBACX,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7E,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;QACjG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { TestUtils } from \"../TestUtils\";\r\n\r\ndescribe(\"SettingsSchemas\", () => {\r\n\r\n // SettingsSchema tests change the state of the IModelHost object. They should always clear\r\n // the current state before and after they run so they're not affected by, nor influence, other tests running in the same process.\r\n const restartSession = async () => {\r\n await IModelHost.shutdown();\r\n await TestUtils.startBackend();\r\n };\r\n before(async () => {\r\n await restartSession();\r\n });\r\n after(async () => {\r\n await restartSession();\r\n });\r\n\r\n it(\"add groups\", async () => {\r\n const schemas = IModelHost.settingsSchemas;\r\n // can't add a group with no name\r\n expect(() => schemas.addGroup({} as any)).throws(`has no \"schemaPrefix\" member`);\r\n\r\n schemas.addGroup({\r\n schemaPrefix: \"title-test\",\r\n title: \"Title Test\",\r\n description: \"schema with a user-facing title\",\r\n settingDefs: {\r\n setting: {\r\n type: \"string\",\r\n },\r\n },\r\n });\r\n expect(schemas.groups.get(\"title-test\")?.title).equals(\"Title Test\");\r\n expect(schemas.groups.get(\"title-test\")?.description).equals(\"schema with a user-facing title\");\r\n expect(schemas.settingDefs.get(\"title-test/setting\")!.type).equals(\"string\");\r\n\r\n schemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n expect(schemas.groups.get(\"testApp\")?.title).equals(\"Test App\");\r\n expect(schemas.groups.get(\"testApp\")?.description).equals(\"the settings for test application 1\");\r\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.type).equals(\"string\");\r\n expect(schemas.settingDefs.get(\"testApp/list/openMode\")!.default).equals(\"singleClick\");\r\n expect(schemas.settingDefs.get(\"testApp/tree/blah\")!.default).equals(true);\r\n });\r\n\r\n});\r\n"]}
|
|
@@ -40,7 +40,7 @@ export interface SettingSchema extends Readonly<JSONSchema> {
|
|
|
40
40
|
* remove them via [[SettingsSchemas.removeGroup]].
|
|
41
41
|
*
|
|
42
42
|
* All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.
|
|
43
|
-
* The prefix is combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer
|
|
43
|
+
* The prefix is a stable identifier combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer
|
|
44
44
|
* to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].
|
|
45
45
|
* In the following example, the fully-qualified name of the setting named "metric" is "format/units/metric".
|
|
46
46
|
*
|
|
@@ -60,11 +60,12 @@ export interface SettingSchema extends Readonly<JSONSchema> {
|
|
|
60
60
|
export interface SettingGroupSchema {
|
|
61
61
|
/** Uniquely identifies this group amongst all other groups.
|
|
62
62
|
* The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes "units/metric" and "units/imperial".
|
|
63
|
-
* The user interface may parse these prefixes to display both groups under a "units" tab or expandable tree view node.
|
|
64
63
|
*
|
|
65
64
|
* @note Schema prefixes beginning with "itwin" are reserved for use by iTwin.js.
|
|
66
65
|
*/
|
|
67
66
|
readonly schemaPrefix: string;
|
|
67
|
+
/** A title of this group suitable for displaying to a user. */
|
|
68
|
+
readonly title?: string;
|
|
68
69
|
/** Metadata for each [[Setting]] in this group. */
|
|
69
70
|
readonly settingDefs?: {
|
|
70
71
|
[name: string]: SettingSchema | undefined;
|
|
@@ -101,6 +102,8 @@ export interface SettingGroupSchema {
|
|
|
101
102
|
export interface SettingsSchemas {
|
|
102
103
|
/** @internal */
|
|
103
104
|
readonly [_implementationProhibited]: unknown;
|
|
105
|
+
/** The map of each registered [[SettingGroupSchema]], accessed by its [[SettingGroupSchema.schemaPrefix]]. */
|
|
106
|
+
readonly groups: ReadonlyMap<string, SettingGroupSchema>;
|
|
104
107
|
/** The map of each individual registered [[SettingSchema]] defining a [[Setting]], accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]). */
|
|
105
108
|
readonly settingDefs: ReadonlyMap<SettingName, SettingSchema>;
|
|
106
109
|
/** The map of each individual registered [[SettingSchema]] defining a type that can be extended by other [[SettingSchema]]s via [[SettingSchema.extends]],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;IAQI;AACJ,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAAC,UAAU,CAAC;IACzD,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;KAAE,CAAC;IAC7D;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,MAAM,WAAW,kBAAkB;IACjC
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;IAQI;AACJ,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAAC,UAAU,CAAC;IACzD,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;KAAE,CAAC;IAC7D;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;KAAE,CAAC;IACrE,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;KAAE,CAAC;IAClE,sJAAsJ;IACtJ,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AAEH;;;;;;;;;;;;;;IAcI;AACJ,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,QAAQ,CAAC,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAE9C,8GAA8G;IAC9G,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAEzD,gLAAgL;IAChL,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAE9D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAE3D,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAE9C;;;;;;;OAOG;IACH,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC;IAE1D;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAEzE,uFAAuF;IACvF,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC,kFAAkF;IAClF,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAEvC,oFAAoF;IACpF,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAE1C,+GAA+G;IAC/G,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsSchemas.js","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { BeEvent, JSONSchema, JSONSchemaTypeName } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { SettingName } from \"./Settings\";\r\n\r\n/** Metadata describing a single [[Setting]] as part of a [[SettingGroupSchema]].\r\n * Every setting has a [[type]], which can be one of the following:\r\n * - A primitive type like `string` or `number`;\r\n * - An object containing any number of named properties, each with their own types; or\r\n * - An array of elements, all of the same type.\r\n * This metadata is used to validate setting values against the schema, and to enable user interfaces by which\r\n * users can view and modify their settings.\r\n * @beta\r\n */\r\nexport interface SettingSchema extends Readonly<JSONSchema> {\r\n /** For arrays only, the metadata describing every element in the array. */\r\n readonly items?: SettingSchema;\r\n /** The name of the [[Setting]]'s data type. */\r\n readonly type: JSONSchemaTypeName;\r\n /** For objects and arrays only, the name of a [[SettingSchema]] that provides a base definition for this type.\r\n * The name is expected to refer to a type definition registered with [[SettingsSchema.typeDefs]].\r\n * Therefore, it must be the full name, including the [[SettingGroupSchema.schemaPrefix]].\r\n */\r\n readonly extends?: string;\r\n /** For objects only, the name and metadata of each of the object's properties. */\r\n readonly properties?: { [name: SettingName]: SettingSchema };\r\n /** For arrays only, specifies how [[SettingsDictionary.getArray]] resolves the value of the setting.\r\n * By default, like other types of settings, the setting uses the value of the setting from the highest-priority dictionary.\r\n * If `combineArray` is `true`, then the value of the setting is computed by combining the elements of every array from every dictionary,\r\n * ordered by priority and eliminating duplicate elements.\r\n * Two elements are considered duplicates of one another if [[Setting.areEqual]] returns `true`.\r\n */\r\n readonly combineArray?: boolean;\r\n}\r\n\r\n/** Metadata describing a group of related [[SettingSchema]]s. You can register setting schema groups via [[SettingsSchemas.addGroup]] and\r\n * remove them via [[SettingsSchemas.removeGroup]].\r\n *\r\n * All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.\r\n * The prefix is combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer\r\n * to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].\r\n * In the following example, the fully-qualified name of the setting named \"metric\" is \"format/units/metric\".\r\n *\r\n * ```json\r\n * {\r\n * \"schemaPrefix\": \"format/units\",\r\n * \"settingDefs\": {\r\n * \"metric\": { \"type\": \"boolean\" }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * A group can also define [[SettingSchema]]s that, rather than describing actual [[Setting]]s, instead describe types that can be extended by [[Setting]]s via\r\n * [[SettingSchema.extends]]. A [[SettingSchema]] can refer to type definitions defined in its own group or any other group.\r\n * @beta\r\n */\r\nexport interface SettingGroupSchema {\r\n /** Uniquely identifies this group amongst all other groups.\r\n * The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes \"units/metric\" and \"units/imperial\".\r\n
|
|
1
|
+
{"version":3,"file":"SettingsSchemas.js","sourceRoot":"","sources":["../../../src/workspace/SettingsSchemas.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport { BeEvent, JSONSchema, JSONSchemaTypeName } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { SettingName } from \"./Settings\";\r\n\r\n/** Metadata describing a single [[Setting]] as part of a [[SettingGroupSchema]].\r\n * Every setting has a [[type]], which can be one of the following:\r\n * - A primitive type like `string` or `number`;\r\n * - An object containing any number of named properties, each with their own types; or\r\n * - An array of elements, all of the same type.\r\n * This metadata is used to validate setting values against the schema, and to enable user interfaces by which\r\n * users can view and modify their settings.\r\n * @beta\r\n */\r\nexport interface SettingSchema extends Readonly<JSONSchema> {\r\n /** For arrays only, the metadata describing every element in the array. */\r\n readonly items?: SettingSchema;\r\n /** The name of the [[Setting]]'s data type. */\r\n readonly type: JSONSchemaTypeName;\r\n /** For objects and arrays only, the name of a [[SettingSchema]] that provides a base definition for this type.\r\n * The name is expected to refer to a type definition registered with [[SettingsSchema.typeDefs]].\r\n * Therefore, it must be the full name, including the [[SettingGroupSchema.schemaPrefix]].\r\n */\r\n readonly extends?: string;\r\n /** For objects only, the name and metadata of each of the object's properties. */\r\n readonly properties?: { [name: SettingName]: SettingSchema };\r\n /** For arrays only, specifies how [[SettingsDictionary.getArray]] resolves the value of the setting.\r\n * By default, like other types of settings, the setting uses the value of the setting from the highest-priority dictionary.\r\n * If `combineArray` is `true`, then the value of the setting is computed by combining the elements of every array from every dictionary,\r\n * ordered by priority and eliminating duplicate elements.\r\n * Two elements are considered duplicates of one another if [[Setting.areEqual]] returns `true`.\r\n */\r\n readonly combineArray?: boolean;\r\n}\r\n\r\n/** Metadata describing a group of related [[SettingSchema]]s. You can register setting schema groups via [[SettingsSchemas.addGroup]] and\r\n * remove them via [[SettingsSchemas.removeGroup]].\r\n *\r\n * All of the settings share the same [[schemaPrefix]], which must be unique amongst all other groups.\r\n * The prefix is a stable identifier combined with the name of each [[SettingSchema]] in the group to form the fully-qualified name used to refer\r\n * to the setting outside of the group, e.g., when accessing [[SettingsSchemas.settingDefs]] or in [[SettingSchema.extends]].\r\n * In the following example, the fully-qualified name of the setting named \"metric\" is \"format/units/metric\".\r\n *\r\n * ```json\r\n * {\r\n * \"schemaPrefix\": \"format/units\",\r\n * \"settingDefs\": {\r\n * \"metric\": { \"type\": \"boolean\" }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * A group can also define [[SettingSchema]]s that, rather than describing actual [[Setting]]s, instead describe types that can be extended by [[Setting]]s via\r\n * [[SettingSchema.extends]]. A [[SettingSchema]] can refer to type definitions defined in its own group or any other group.\r\n * @beta\r\n */\r\nexport interface SettingGroupSchema {\r\n /** Uniquely identifies this group amongst all other groups.\r\n * The prefix can use forward-slashes to define logical subgroups - for example, two related groups with the prefixes \"units/metric\" and \"units/imperial\".\r\n *\r\n * @note Schema prefixes beginning with \"itwin\" are reserved for use by iTwin.js.\r\n */\r\n readonly schemaPrefix: string;\r\n /** A title of this group suitable for displaying to a user. */\r\n readonly title?: string;\r\n /** Metadata for each [[Setting]] in this group. */\r\n readonly settingDefs?: { [name: string]: SettingSchema | undefined };\r\n /** Metadata for types that can be extended by other [[Setting]]s via [[SettingSchema.extends]]. */\r\n readonly typeDefs?: { [name: string]: SettingSchema | undefined };\r\n /** An integer used when displaying a list of schemas in a user interface, to sort schemas with a lower `order` before those with a `higher` order. */\r\n readonly order?: number;\r\n /** A description of this group suitable for displaying to a user. */\r\n readonly description: string;\r\n}\r\n\r\n/**\r\n * The registry of available [[SettingGroupSchema]]s.\r\n * The registry is used for editing Settings files and for finding default values for settings.\r\n * @beta\r\n */\r\n\r\n/** The registry of metadata describing groups of [[SettingSchema]]s available to the current session.\r\n * The schemas are used to look up the default values of [[Setting]]s, validate that their values are of the type dictated by the schema, and\r\n * query metadata like [[SettingsSchema.combineArray]] that modify their behavior.\r\n * They can also be used to drive a user interface that enables end users to edit [[Settings]].\r\n *\r\n * When [[IModelHost.startup]] is invoked at the beginning of a session, schemas delivered with the application - like those describing\r\n * [[Workspace]]s - are automatically loaded.\r\n * The application can manually register additional schemas using methods like [[addGroup]], [[addFile]], [[addDirectory]], and [[addJson]].\r\n * When [[IModelHost.shutdown]] is invoked at the end of a session, all registered schemas are unregistered.\r\n *\r\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\r\n *\r\n * @see [[IModelHost.settingsSchemas]] to access the registry for the current session.\r\n * @beta\r\n */\r\nexport interface SettingsSchemas {\r\n /** @internal */\r\n readonly [_implementationProhibited]: unknown;\r\n\r\n /** The map of each registered [[SettingGroupSchema]], accessed by its [[SettingGroupSchema.schemaPrefix]]. */\r\n readonly groups: ReadonlyMap<string, SettingGroupSchema>;\r\n\r\n /** The map of each individual registered [[SettingSchema]] defining a [[Setting]], accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]). */\r\n readonly settingDefs: ReadonlyMap<SettingName, SettingSchema>;\r\n\r\n /** The map of each individual registered [[SettingSchema]] defining a type that can be extended by other [[SettingSchema]]s via [[SettingSchema.extends]],\r\n * accessed by its fully-qualified name (including its [[SettingGroupSchema.schemaPrefix]]).\r\n */\r\n readonly typeDefs: ReadonlyMap<SettingName, SettingSchema>;\r\n\r\n /** An event raised whenever schemas are added or removed. */\r\n readonly onSchemaChanged: BeEvent<() => void>;\r\n\r\n /**\r\n * Ensure that the setting value supplied is valid according to its [[SettingSchema]].\r\n * If no schema has been registered for the setting, no validation is performed.\r\n * @param value The value of the setting to validate against the schema.\r\n * @param settingName The fully-qualified setting name.\r\n * @returns `value` if `value` matches the schema corresponding to `settingName`, or if no such schema has been registered.\r\n * @throws Error if `value` is invalid according to the schema.\r\n */\r\n validateSetting<T>(value: T, settingName: SettingName): T;\r\n\r\n /** Register one or more [[SettingGroupSchema]]s.\r\n * If a group with the same [[SettingGroupSchema.prefix]] was previously registered, it will be replaced.\r\n * Each [[SettingSchema]] in the group will be added to [[settingDefs]] or [[typeDefs]].\r\n */\r\n addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void;\r\n\r\n /** Invokes [[addGroup]] for a [[SettingGroupSchema]] supplied as stringified json5. */\r\n addJson(settingSchema: string): void;\r\n\r\n /** Invokes [[addGroup]] for a json5 file containiner a [[SettingGroupSchema]]. */\r\n addFile(fileName: LocalFileName): void;\r\n\r\n /** Invokes [[addFile]] for every json and json5 file in the specified directory. */\r\n addDirectory(dirName: LocalDirName): void;\r\n\r\n /** Unregisters all [[settingDefs]] and [[typeDefs]] with the specified [[SettingGroupSchema.schemaPrefix]]. */\r\n removeGroup(schemaPrefix: string): void;\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-backend",
|
|
3
|
-
"version": "5.10.0-dev.
|
|
3
|
+
"version": "5.10.0-dev.16",
|
|
4
4
|
"description": "iTwin.js backend components",
|
|
5
5
|
"main": "lib/cjs/core-backend.js",
|
|
6
6
|
"module": "lib/esm/core-backend.js",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@opentelemetry/api": "^1.0.4",
|
|
30
|
-
"@itwin/core-bentley": "5.10.0-dev.
|
|
31
|
-
"@itwin/core-common": "5.10.0-dev.
|
|
32
|
-
"@itwin/
|
|
33
|
-
"@itwin/
|
|
30
|
+
"@itwin/core-bentley": "5.10.0-dev.16",
|
|
31
|
+
"@itwin/core-common": "5.10.0-dev.16",
|
|
32
|
+
"@itwin/core-geometry": "5.10.0-dev.16",
|
|
33
|
+
"@itwin/ecschema-metadata": "5.10.0-dev.16"
|
|
34
34
|
},
|
|
35
35
|
"peerDependenciesMeta": {
|
|
36
36
|
"@opentelemetry/api": {
|
|
@@ -77,13 +77,13 @@
|
|
|
77
77
|
"marked": "^14.1.3",
|
|
78
78
|
"sql-formatter": "^15.4.6",
|
|
79
79
|
"webpack": "^5.97.1",
|
|
80
|
-
"@itwin/ecschema-locaters": "5.10.0-dev.
|
|
81
|
-
"@itwin/core-
|
|
82
|
-
"@itwin/
|
|
83
|
-
"@itwin/
|
|
84
|
-
"@itwin/
|
|
85
|
-
"@itwin/
|
|
86
|
-
"@itwin/
|
|
80
|
+
"@itwin/ecschema-locaters": "5.10.0-dev.16",
|
|
81
|
+
"@itwin/core-common": "5.10.0-dev.16",
|
|
82
|
+
"@itwin/ecsql-common": "5.10.0-dev.16",
|
|
83
|
+
"@itwin/core-bentley": "5.10.0-dev.16",
|
|
84
|
+
"@itwin/build-tools": "5.10.0-dev.16",
|
|
85
|
+
"@itwin/ecschema-metadata": "5.10.0-dev.16",
|
|
86
|
+
"@itwin/core-geometry": "5.10.0-dev.16",
|
|
87
87
|
"internal-tools": "3.0.0-dev.69"
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|