@itwin/core-backend 5.8.0-dev.11 → 5.8.0-dev.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +0 -3
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +126 -28
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +2 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -3
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +4 -250
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +13 -11
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +4 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +7 -5
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +3 -1
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +4 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +2 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +0 -3
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +127 -29
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.js +2 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -3
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -251
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +13 -11
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +100 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js +95 -2
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.d.ts +4 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +6 -4
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +3 -1
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +4 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +2 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAe,IAAI,EAAW,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAsB,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAoB,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAgB,YAAY,CAAC;IAE9C,MAAM,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAE9E,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,uDAAuD;QACvD,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACvG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9F,IAAI,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QACnF,IAAI,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEpD,yBAAyB;QACzB,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC1I,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;SAC/C,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvD,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QAC/E,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEhD,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC9I,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC;YACnG,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;QACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,sBAAsB;QACtB,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvG,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEtE,wCAAwC;QACxC,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY;YACxC,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACrJ,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC7E,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChE,oDAAoD;QACpD,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAC3F,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAEjE,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC;QACtB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAErE,yBAAyB;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,aAAa;QACb,MAAM,KAAK,GAAuB;YAChC,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,EAAE,EAAE,MAAM;SACX,CAAC;QACF,uCAAuC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QAExE,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,IAAI,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC5N,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE7H,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAE7C,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;QAClC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACpL,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACpN,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAE9C,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC3G,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAE,QAAgC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAE9C,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAE,QAAgC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEzC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAElG,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9B,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,8DAA8D;QAC9F,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAE7C,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEtD,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACvI,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,EAAE,QAAQ;SAC/B,CAAC;QACF,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC3I,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC;SACpG,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEvC,oDAAoD;QACpD,IAAI,eAAe,GAA4C,EAAE,CAAC;QAClE,IAAI,gBAAgB,GAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YAC7D,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,cAAc,CAAC,QAAQ,CAAC;QACjC,CAAC,CAAC;QACF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC;YAC3C,QAAQ;YACR,SAAS,EAAE;gBACT,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB;YACD,SAAS,EAAE,MAAM;YACjB,gBAAgB;SACjB,CAAC,CAAC;QACH,IAAI,cAAc,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,uDAAuD;QACvD,eAAe,GAAG,EAAE,CAAC;QACrB,IAAI,SAAS,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC;YAC/C,QAAQ;YACR,SAAS,EAAE,MAAM;YACjB,gBAAgB;SACjB,CAAC,CAAC;QACH,cAAc,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,qCAAqC;QACrC,eAAe,GAAG,EAAE,CAAC;QACrB,gBAAgB,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACvC,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;QACjF,CAAC,CAAC;QACF,IAAI,WAAW,GAAY,KAAK,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC;gBACvC,QAAQ;gBACR,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,CAAC,KAAK;iBACjB;gBACD,SAAS,EAAE,MAAM;gBACjB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,UAAU,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAExD,wCAAwC;QACxC,eAAe,GAAG,EAAE,CAAC;QACrB,WAAW,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC;gBAC3C,QAAQ;gBACR,SAAS,EAAE,MAAM;gBACjB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,UAAU,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,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 { assert, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LockState } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastCsIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastCsIndex, undefined);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.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 { assert, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, GuidString, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LocalBriefcaseProps, LockState, RequestNewBriefcaseProps } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { ChannelControl } from \"../../ChannelControl\";\r\nimport { PhysicalElement } from \"../../Element\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, undefined);\r\n assert.equal(lockStat.lastSharedReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n describe(\"locking behavior\", () => {\r\n const createVersion0 = async () => {\r\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\r\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\r\n assert.isFalse(sourceDb.locks.isServerBased);\r\n await ExtensiveTestScenario.prepareDb(sourceDb);\r\n await ExtensiveTestScenario.populateDb(sourceDb);\r\n sourceDb.saveChanges();\r\n sourceDb.close();\r\n return dbName;\r\n };\r\n\r\n const accessToken1: AccessToken = \"user1\";\r\n const accessToken2: AccessToken = \"user2\";\r\n let iModelId: GuidString;\r\n let briefcase1Props: LocalBriefcaseProps;\r\n let briefcase2Props: LocalBriefcaseProps;\r\n\r\n //afterEach(() => sinonRestore());\r\n before(async () => {\r\n const iModelProps = {\r\n iModelName: \"HubMock locks test\",\r\n iTwinId: HubMock.iTwinId,\r\n version0: await createVersion0(),\r\n };\r\n\r\n iModelId = await HubMock.createNewIModel(iModelProps);\r\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\r\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken1, ...args });\r\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken2, ...args });\r\n });\r\n\r\n let bc1: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n\r\n beforeEach(async () => {\r\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc1.locks.isServerBased).to.be.true;\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc1.pullChanges();\r\n });\r\n\r\n afterEach(async () => {\r\n await bc1.discardChanges();\r\n bc1.close();\r\n\r\n if (bc2 !== undefined) {\r\n await bc2.discardChanges();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"a pushed change to an element prevents acquiring an exclusive lock on the same element without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock because bc1 still holds it.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire it yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"parent lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: parentId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the child because bc1 holds a lock on the parent.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the child lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the child lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"model lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: modelId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the sub-model because bc1 holds a lock on the model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the sub-model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the sub-model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: elementId });\r\n });\r\n\r\n it(\"a pushed change to sibling element should not prevent acquiring an exclusive lock\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const child1Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\r\n const child2Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: child1Id });\r\n const element = bc1.elements.getElement<PhysicalElement>(child1Id);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // Pushing bc1's changes will release the lock.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n\r\n // bc2 should be able to acquire an exclusive lock on a sibling element without pulling.\r\n await bc2.locks.acquireLocks({ exclusive: child2Id });\r\n });\r\n\r\n it(\"edited child prevents acquiring parent lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the parent because bc1 holds a lock on the child.\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the parent lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the parent lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: parentId });\r\n });\r\n\r\n it(\"edited sub-model prevents acquiring model lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: elementId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the model because bc1 holds a lock on the sub-model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: modelId });\r\n });\r\n });\r\n});\r\n"]}
|
|
@@ -164,6 +164,106 @@ describe("WorkspaceFile", () => {
|
|
|
164
164
|
fontsDb.addFile("Helvetica.ttf", schemaFile, "ttf");
|
|
165
165
|
fontsDb.close();
|
|
166
166
|
});
|
|
167
|
+
describe("workspace db version cache key", () => {
|
|
168
|
+
afterEach(() => sinon.restore());
|
|
169
|
+
function getContainer(containerId, props) {
|
|
170
|
+
return editor.getContainer({ containerId, baseUri: "", storageType: "azure", accessToken: "", ...props });
|
|
171
|
+
}
|
|
172
|
+
function createFakeCloudContainer(containerId) {
|
|
173
|
+
return {
|
|
174
|
+
connect: () => { },
|
|
175
|
+
disconnect: () => { },
|
|
176
|
+
checkForChanges: () => { },
|
|
177
|
+
queryDatabase: () => undefined,
|
|
178
|
+
queryDatabases: () => [],
|
|
179
|
+
acquireWriteLock: () => { },
|
|
180
|
+
releaseWriteLock: () => { },
|
|
181
|
+
abandonChanges: () => { },
|
|
182
|
+
containerId,
|
|
183
|
+
baseUri: "https://example.invalid",
|
|
184
|
+
storageType: "azure",
|
|
185
|
+
isPublic: false,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function stubCloudLookup(containerId, resolveVersion) {
|
|
189
|
+
sinon.stub(CloudSqlite, "createCloudContainer").returns(createFakeCloudContainer(containerId));
|
|
190
|
+
sinon.stub(CloudSqlite, "querySemverMatch").callsFake((props) => CloudSqlite.makeSemverName(props.dbName, resolveVersion(props)));
|
|
191
|
+
sinon.stub(CloudSqlite, "isSemverEditable").returns(true);
|
|
192
|
+
}
|
|
193
|
+
it("local getWorkspaceDb ignores version selectors for cache identity", async () => {
|
|
194
|
+
const container = getContainer("workspace-cache-local");
|
|
195
|
+
await container.createDb({ dbName: "test-db", manifest: { workspaceName: "workspace-cache-local" } });
|
|
196
|
+
const db1 = container.getWorkspaceDb({ dbName: "test-db" });
|
|
197
|
+
const db2 = container.getWorkspaceDb({ dbName: "test-db", version: "1.0.0", includePrerelease: true });
|
|
198
|
+
expect(db1).to.equal(db2);
|
|
199
|
+
});
|
|
200
|
+
it("local createDb with omitted dbName matches an explicit default-name lookup", async () => {
|
|
201
|
+
const container = getContainer("workspace-cache-local-default-name");
|
|
202
|
+
const db1 = await container.createDb({ manifest: { workspaceName: "workspace-cache-local-default-name" } });
|
|
203
|
+
const db2 = container.getEditableDb({ dbName: "workspace-db" });
|
|
204
|
+
expect(db1).to.equal(db2);
|
|
205
|
+
});
|
|
206
|
+
it("cloud getWorkspaceDb reuses the same instance for semver-equivalent selectors", () => {
|
|
207
|
+
const containerId = "workspace-cache-cloud-equivalent";
|
|
208
|
+
stubCloudLookup(containerId, (props) => props.version === "1" ? "1.0.0" : (props.version ?? "1.0.0"));
|
|
209
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
210
|
+
const db1 = container.getWorkspaceDb({ dbName: "test-db", version: "1" });
|
|
211
|
+
const db2 = container.getWorkspaceDb({ dbName: "test-db", version: "1.0.0" });
|
|
212
|
+
expect(db1).to.equal(db2);
|
|
213
|
+
});
|
|
214
|
+
it("cloud getWorkspaceDb returns different instances for different resolved versions", () => {
|
|
215
|
+
const containerId = "workspace-cache-cloud-different";
|
|
216
|
+
stubCloudLookup(containerId, (props) => props.version ?? "1.0.0");
|
|
217
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
218
|
+
const db1 = container.getWorkspaceDb({ dbName: "test-db", version: "1.0.0" });
|
|
219
|
+
const db2 = container.getWorkspaceDb({ dbName: "test-db", version: "2.0.0" });
|
|
220
|
+
expect(db1).to.not.equal(db2);
|
|
221
|
+
});
|
|
222
|
+
it("cloud getWorkspaceDb respects includePrerelease only when it resolves differently", () => {
|
|
223
|
+
const containerId = "workspace-cache-cloud-prerelease";
|
|
224
|
+
stubCloudLookup(containerId, (props) => props.includePrerelease ? "1.1.0-beta.1" : "1.0.0");
|
|
225
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
226
|
+
const stable = container.getWorkspaceDb({ dbName: "test-db", version: "*" });
|
|
227
|
+
const prerelease = container.getWorkspaceDb({ dbName: "test-db", version: "*", includePrerelease: true });
|
|
228
|
+
expect(stable).to.not.equal(prerelease);
|
|
229
|
+
});
|
|
230
|
+
it("createDb with explicit version returns the cached editable db for that resolved version", async () => {
|
|
231
|
+
const containerId = "workspace-create-version";
|
|
232
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
233
|
+
sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
234
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
235
|
+
const db = await container.createDb({ dbName: "test-db", version: "1.0.0", manifest: { workspaceName: "workspace-create-version" } });
|
|
236
|
+
const dbAgain = container.getEditableDb({ dbName: "test-db", version: "1.0.0" });
|
|
237
|
+
expect(db).to.equal(dbAgain);
|
|
238
|
+
});
|
|
239
|
+
it("createDb without an explicit version returns the cached editable db for version 0.0.0", async () => {
|
|
240
|
+
const containerId = "workspace-create-default-version";
|
|
241
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
242
|
+
sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
243
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
244
|
+
const db = await container.createDb({ dbName: "test-db", manifest: { workspaceName: "workspace-create-default-version" } });
|
|
245
|
+
const dbAgain = container.getEditableDb({ dbName: "test-db", version: "0.0.0" });
|
|
246
|
+
expect(db).to.equal(dbAgain);
|
|
247
|
+
});
|
|
248
|
+
it("cloud createDb uploads using the requested version", async () => {
|
|
249
|
+
const containerId = "workspace-cloud-explicit-version";
|
|
250
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
251
|
+
const uploadDb = sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
252
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
253
|
+
await container.createDb({ dbName: "test-db", version: "1.2.3", manifest: { workspaceName: "workspace-cloud-explicit-version" } });
|
|
254
|
+
expect(uploadDb.calledOnce).to.be.true;
|
|
255
|
+
expect(uploadDb.firstCall.args[1].dbName).to.equal("test-db:1.2.3");
|
|
256
|
+
});
|
|
257
|
+
it("cloud createDb defaults omitted version to 0.0.0", async () => {
|
|
258
|
+
const containerId = "workspace-cloud-default-version";
|
|
259
|
+
stubCloudLookup(containerId, (props) => props.version ?? "0.0.0");
|
|
260
|
+
const uploadDb = sinon.stub(CloudSqlite, "uploadDb").resolves();
|
|
261
|
+
const container = getContainer(containerId, { baseUri: "https://example.invalid" });
|
|
262
|
+
await container.createDb({ dbName: "test-db", manifest: { workspaceName: "workspace-cloud-default-version" } });
|
|
263
|
+
expect(uploadDb.calledOnce).to.be.true;
|
|
264
|
+
expect(uploadDb.firstCall.args[1].dbName).to.equal("test-db:0.0.0");
|
|
265
|
+
});
|
|
266
|
+
});
|
|
167
267
|
describe("getContainerAsync token resolution", () => {
|
|
168
268
|
afterEach(() => sinon.restore());
|
|
169
269
|
it("preserves an explicitly-provided accessToken", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Workspace.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as fs from \"fs-extra\";\r\nimport { extname } from \"path\";\r\nimport * as sinon from \"sinon\";\r\nimport { Guid } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { SettingsPriority } from \"../../workspace/Settings\";\r\nimport { Workspace, WorkspaceContainerProps, WorkspaceDbManifest, WorkspaceDbProps } from \"../../workspace/Workspace\";\r\nimport { EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { validateWorkspaceContainerId } from \"../../internal/workspace/WorkspaceImpl\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\ndescribe(\"WorkspaceFile\", () => {\r\n\r\n let editor: WorkspaceEditor;\r\n let workspace: Workspace;\r\n\r\n before(() => {\r\n editor = WorkspaceEditor.construct();\r\n workspace = editor.workspace;\r\n });\r\n after(() => {\r\n editor.close();\r\n });\r\n\r\n async function makeEditableDb(props: WorkspaceDbProps & WorkspaceContainerProps, manifest: WorkspaceDbManifest): Promise<EditableWorkspaceDb> {\r\n const container = editor.getContainer({ ...props, accessToken: \"\" });\r\n const wsFile = await container.createDb({ ...props, manifest });\r\n wsFile.open();\r\n return wsFile;\r\n }\r\n\r\n function compareFiles(file1: string, file2: string) {\r\n expect(fs.lstatSync(file1).size).equal(fs.lstatSync(file2).size);\r\n expect(fs.readFileSync(file1)).to.deep.equal(fs.readFileSync(file2));\r\n }\r\n\r\n it(\"WorkspaceContainer names\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((containerId) => {\r\n expect(() => validateWorkspaceContainerId(containerId), containerId).to.throw(\"containerId\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"12\", // too short\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"123--4\",\r\n \"Abc\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(64), // too long\r\n \"-leading-dash\",\r\n \"trailing-dash-\"]);\r\n\r\n validateWorkspaceContainerId(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDbNames\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((dbName) => {\r\n expect(() => CloudSqlite.validateDbName(dbName)).to.throw(\"dbName\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"1/2\",\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"base:1.2.3\",\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"con\",\r\n \"prn\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(256), // too long\r\n \" leading space\",\r\n \"trailing space \",\r\n \"per.iod\",\r\n \"hash#tag\",\r\n \"back`tick\",\r\n \"single'quote\",\r\n ]);\r\n\r\n CloudSqlite.validateDbName(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDb version fallback\", () => {\r\n expect(CloudSqlite.validateDbVersion(\"\" as CloudSqlite.DbVersion)).equals(\"0.0.0\");\r\n expect(CloudSqlite.makeSemverName(\"db1\", \"\" as CloudSqlite.DbVersion)).equals(\"db1:0.0.0\");\r\n expect(() => CloudSqlite.validateDbVersion(\" \" as CloudSqlite.DbVersion)).to.throw(\"invalid version specification\");\r\n });\r\n\r\n it(\"create new WorkspaceDb\", async () => {\r\n const manifest: WorkspaceDbManifest = { workspaceName: \"resources for acme users\", contactName: \"contact me\" };\r\n const wsFile = await makeEditableDb({ containerId: \"acme-engineering-inc-2\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, manifest);\r\n const inFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);\r\n let blobVal = new Uint8Array(testRange.toFloat64Array().buffer);\r\n let strVal = \"this is test1\";\r\n const strRscName = \"string-resource/1\";\r\n const blobRscName = \"blob.resource:1\";\r\n const fileRscName = \"settings files/my settings/a.json5\";\r\n\r\n let testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(manifest.contactName);\r\n\r\n wsFile.updateManifest({ ...testManifest, contactName: \"new contact\" });\r\n testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(\"new contact\");\r\n\r\n expect(() => wsFile.addFile(fileRscName, \"bad file name\")).to.throw(\"no such file\");\r\n expect(() => wsFile.updateFile(fileRscName, inFile)).to.throw(\"error replacing\");\r\n expect(() => wsFile.removeFile(fileRscName)).to.throw(\"does not exist\");\r\n\r\n wsFile.addBlob(blobRscName, blobVal);\r\n wsFile.addString(strRscName, strVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n strVal = \"updated string\";\r\n blobVal = Uint8Array.from([0, 1, 2, 3]);\r\n wsFile.updateString(strRscName, strVal);\r\n wsFile.updateBlob(blobRscName, blobVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n\r\n wsFile.removeBlob(blobRscName);\r\n wsFile.removeString(strRscName);\r\n expect(wsFile.getString(strRscName)).to.be.undefined;\r\n expect(wsFile.getBlob(blobRscName)).to.be.undefined;\r\n\r\n wsFile.addFile(fileRscName, inFile);\r\n const writeFile = sinon.spy(wsFile.sqliteDb[_nativeDb], \"extractEmbeddedFile\");\r\n expect(writeFile.callCount).eq(0);\r\n const outFile = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(extname(outFile)).equals(\".json5\");\r\n compareFiles(inFile, outFile);\r\n\r\n let outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(outFile).eq(outFile2);\r\n\r\n const inFile2 = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n wsFile.updateFile(fileRscName, inFile2);\r\n outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(2);\r\n expect(outFile).eq(outFile2);\r\n compareFiles(inFile2, outFile);\r\n });\r\n\r\n it(\"load workspace settings\", async () => {\r\n const settingsFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const defaultDb = await makeEditableDb({ containerId: \"default\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, { workspaceName: \"default resources\", contactName: \"contact 123\" });\r\n defaultDb.addString(\"default-settings\", fs.readFileSync(settingsFile, \"utf-8\"));\r\n defaultDb.close();\r\n\r\n const settings = workspace.settings;\r\n await workspace.loadSettingsDictionary(\r\n { dbName: \"db1\", containerId: \"default\", baseUri: \"\", storageType: \"azure\", resourceName: \"default-settings\", priority: SettingsPriority.defaults });\r\n expect(settings.getSetting(\"editor/renderWhitespace\")).equals(\"selection\");\r\n\r\n const workspaceName = \"all fonts workspace\";\r\n const schemaFile = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n const fontsDb = await makeEditableDb({ containerId: \"fonts\", dbName: \"fonts\", baseUri: \"\", storageType: \"azure\" }, { workspaceName, contactName: \"font guy\" });\r\n\r\n fontsDb.addFile(\"Helvetica.ttf\", schemaFile, \"ttf\");\r\n fontsDb.close();\r\n });\r\n\r\n describe(\"getContainerAsync token resolution\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n it(\"preserves an explicitly-provided accessToken\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"explicit-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n accessToken: \"my-explicit-token\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"my-explicit-token\");\r\n });\r\n\r\n it(\"uses empty token for local containers with empty baseUri\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"local-token-test\",\r\n baseUri: \"\",\r\n storageType: \"azure\",\r\n };\r\n\r\n await workspace.getContainerAsync(props);\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"\");\r\n });\r\n\r\n it(\"calls requestToken when no accessToken is provided for a cloud container\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").resolves(\"resolved-token\");\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"cloud-no-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.calledOnce).to.be.true;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"resolved-token\");\r\n });\r\n });\r\n\r\n describe(\"findContainers\", () => {\r\n const testContainerId = \"mock-workspace-container-id\";\r\n const testITwinId = \"mock-itwin-id\";\r\n const testIModelId = \"mock-imodel-id\";\r\n let savedService: BlobContainer.ContainerService | undefined;\r\n\r\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\r\n return {\r\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\r\n delete: async () => {},\r\n queryScope: async () => ({ iTwinId: testITwinId }),\r\n queryMetadata: async () => ({ containerType: \"workspace\", label: \"mock\" }),\r\n queryContainersMetadata: async (_userToken, args) => {\r\n return containers.filter((c) =>\r\n (args.containerType === undefined || c.containerType === args.containerType) &&\r\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\r\n );\r\n },\r\n updateJson: async () => {},\r\n requestToken: async (_props) => ({\r\n token: \"\",\r\n scope: { iTwinId: testITwinId },\r\n provider: \"azure\" as const,\r\n expiration: new Date(Date.now() + 3600000),\r\n metadata: { containerType: \"workspace\", label: \"mock\" },\r\n baseUri: \"\",\r\n }),\r\n };\r\n }\r\n\r\n before(() => {\r\n savedService = BlobContainer.service;\r\n });\r\n\r\n afterEach(() => {\r\n BlobContainer.service = savedService;\r\n });\r\n\r\n it(\"finds containers by iTwinId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: testContainerId, containerType: \"workspace\", label: \"Test Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\r\n });\r\n\r\n it(\"finds a container by iTwinId and iModelId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: \"imodel-scoped-container\", containerType: \"workspace\", label: \"iModel Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\r\n });\r\n\r\n it(\"returns empty array when no workspace containers are found\", async () => {\r\n BlobContainer.service = createMockService([]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\r\n expect(containers).to.have.length(0);\r\n });\r\n\r\n it(\"throws when BlobContainer.service is not available\", async () => {\r\n BlobContainer.service = undefined;\r\n\r\n await expect(editor.findContainers({ iTwinId: testITwinId }))\r\n .to.be.rejectedWith(/BlobContainer.service is not available/);\r\n });\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"Workspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Workspace.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAuB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAE7B,IAAI,MAAuB,CAAC;IAC5B,IAAI,SAAoB,CAAC;IAEzB,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC;QACrC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,cAAc,CAAC,KAAiD,EAAE,QAA6B;QAC5G,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;QAChD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,EAAE;YACxC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC/F,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,aAAa,CAAC;YACZ,EAAE;YACF,IAAI;YACJ,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,UAAU;YACV,WAAW;YACX,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW;YAC3B,eAAe;YACf,gBAAgB;SAAC,CAAC,CAAC;QAErB,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,wBAAwB;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,EAAE;YACxC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvB,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,aAAa,CAAC;YACZ,EAAE;YACF,IAAI;YACJ,KAAK;YACL,MAAM;YACN,KAAK;YACL,YAAY;YACZ,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,UAAU;YACV,WAAW;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW;YAC5B,gBAAgB;YAChB,iBAAiB;YACjB,SAAS;YACT,UAAU;YACV,WAAW;YACX,cAAc;SACf,CAAC,CAAC;QAEH,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,wBAAwB;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,EAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAA4B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,QAAQ,GAAwB,EAAE,aAAa,EAAE,0BAA0B,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QAC/G,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3I,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,OAAO,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,MAAM,GAAG,eAAe,CAAC;QAC7B,MAAM,UAAU,GAAG,mBAAmB,CAAC;QACvC,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACtC,MAAM,WAAW,GAAG,oCAAoC,CAAC;QAEzD,IAAI,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAClE,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,cAAc,CAAC,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QACvE,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAClE,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEvD,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACpF,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjF,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAExE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,GAAG,gBAAgB,CAAC;QAC1B,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE3D,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/B,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAEpD,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC/E,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9B,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAE7B,MAAM,OAAO,GAAG,eAAe,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;QAC7E,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC7B,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QACzL,SAAS,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAChF,SAAS,CAAC,KAAK,EAAE,CAAC;QAElB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,MAAM,SAAS,CAAC,sBAAsB,CACpC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvJ,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3E,MAAM,aAAa,GAAG,qBAAqB,CAAC;QAC5C,MAAM,UAAU,GAAG,eAAe,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;QAE/J,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAIL,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEjC,SAAS,YAAY,CAAC,WAAmB,EAAE,KAAwC;YACjF,OAAO,MAAM,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,SAAS,wBAAwB,CAAC,WAAmB;YACnD,OAAO;gBACL,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC;gBAClB,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC;gBACrB,eAAe,EAAE,GAAG,EAAE,GAAG,CAAC;gBAC1B,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;gBAC9B,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE;gBACxB,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC;gBAC3B,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC;gBAC3B,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC;gBACzB,WAAW;gBACX,OAAO,EAAE,yBAAyB;gBAClC,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,KAAK;aACyB,CAAC;QAC7C,CAAC;QAED,SAAS,eAAe,CAAC,WAAmB,EAAE,cAAmD;YAC/F,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/F,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;QAED,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;YACxD,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAEtG,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YACvG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,SAAS,GAAG,YAAY,CAAC,oCAAoC,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,oCAAoC,EAAE,EAAE,CAAC,CAAC;YAE5G,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;YACvF,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;YAEtG,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;YAC1F,MAAM,WAAW,GAAG,iCAAiC,CAAC;YACtD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YAElE,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;YAC3F,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAE5F,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7E,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1G,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;YACvG,MAAM,WAAW,GAAG,0BAA0B,CAAC;YAC/C,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;YAE/C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAEtI,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;YACrG,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;YAE/C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,kCAAkC,EAAE,EAAE,CAAC,CAAC;YAE5H,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;YAEhE,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,kCAAkC,EAAE,EAAE,CAAC,CAAC;YAEnI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,WAAW,GAAG,iCAAiC,CAAC;YACtD,eAAe,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;YAEhE,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpF,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,iCAAiC,EAAE,EAAE,CAAC,CAAC;YAEhH,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAED,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEjC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC5G,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC7D,MAAM,KAAK,GAA4B;gBACrC,WAAW,EAAE,qBAAqB;gBAClC,OAAO,EAAE,wBAAwB;gBACjC,WAAW,EAAE,OAAO;gBACpB,WAAW,EAAE,mBAAmB;aACjC,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC9C,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC5G,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC7D,MAAM,KAAK,GAA4B;gBACrC,WAAW,EAAE,kBAAkB;gBAC/B,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,OAAO;aACrB,CAAC;YAEF,MAAM,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC9C,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAC5F,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC7D,MAAM,KAAK,GAA4B;gBACrC,WAAW,EAAE,qBAAqB;gBAClC,OAAO,EAAE,wBAAwB;gBACjC,WAAW,EAAE,OAAO;aACrB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC/C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC9C,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,eAAe,GAAG,6BAA6B,CAAC;QACtD,MAAM,WAAW,GAAG,eAAe,CAAC;QACpC,MAAM,YAAY,GAAG,gBAAgB,CAAC;QACtC,IAAI,YAAwD,CAAC;QAE7D,SAAS,iBAAiB,CAAC,UAA4C;YACrE,OAAO;gBACL,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;gBACtH,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;gBACtB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAClD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBAC1E,uBAAuB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;oBAClD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC;wBAC5E,CAAC,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAC7D,CAAC;gBACJ,CAAC;gBACD,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;gBAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC/B,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;oBAC/B,QAAQ,EAAE,OAAgB;oBAC1B,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;oBAC1C,QAAQ,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;oBACvD,OAAO,EAAE,EAAE;iBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,GAAG,EAAE;YACV,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,aAAa,CAAC,OAAO,GAAG,YAAY,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,aAAa,CAAC,OAAO,GAAG,iBAAiB,CAAC;gBACxC,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE;aACtF,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACzE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,aAAa,CAAC,OAAO,GAAG,iBAAiB,CAAC;gBACxC,EAAE,WAAW,EAAE,yBAAyB,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE;aAClG,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACjG,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,aAAa,CAAC,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAE9C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;YAElC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;iBAC1D,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,wCAAwC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,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 * as fs from \"fs-extra\";\r\nimport { extname } from \"path\";\r\nimport * as sinon from \"sinon\";\r\nimport { Guid } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { SettingsPriority } from \"../../workspace/Settings\";\r\nimport { Workspace, WorkspaceContainerProps, WorkspaceDbManifest, WorkspaceDbProps } from \"../../workspace/Workspace\";\r\nimport { EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { validateWorkspaceContainerId } from \"../../internal/workspace/WorkspaceImpl\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\ndescribe(\"WorkspaceFile\", () => {\r\n\r\n let editor: WorkspaceEditor;\r\n let workspace: Workspace;\r\n\r\n before(() => {\r\n editor = WorkspaceEditor.construct();\r\n workspace = editor.workspace;\r\n });\r\n after(() => {\r\n editor.close();\r\n });\r\n\r\n async function makeEditableDb(props: WorkspaceDbProps & WorkspaceContainerProps, manifest: WorkspaceDbManifest): Promise<EditableWorkspaceDb> {\r\n const container = editor.getContainer({ ...props, accessToken: \"\" });\r\n const wsFile = await container.createDb({ ...props, manifest });\r\n wsFile.open();\r\n return wsFile;\r\n }\r\n\r\n function compareFiles(file1: string, file2: string) {\r\n expect(fs.lstatSync(file1).size).equal(fs.lstatSync(file2).size);\r\n expect(fs.readFileSync(file1)).to.deep.equal(fs.readFileSync(file2));\r\n }\r\n\r\n it(\"WorkspaceContainer names\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((containerId) => {\r\n expect(() => validateWorkspaceContainerId(containerId), containerId).to.throw(\"containerId\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"12\", // too short\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"123--4\",\r\n \"Abc\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(64), // too long\r\n \"-leading-dash\",\r\n \"trailing-dash-\"]);\r\n\r\n validateWorkspaceContainerId(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDbNames\", () => {\r\n const expectBadName = (names: string[]) => {\r\n names.forEach((dbName) => {\r\n expect(() => CloudSqlite.validateDbName(dbName)).to.throw(\"dbName\");\r\n });\r\n };\r\n\r\n expectBadName([\r\n \"\",\r\n \" \",\r\n \"1/2\",\r\n \"a\\\\b\",\r\n `a\"b`,\r\n \"base:1.2.3\",\r\n \"a:b\",\r\n \"a.b\",\r\n \"a?b\",\r\n \"a*b\",\r\n \"a|b\",\r\n \"con\",\r\n \"prn\",\r\n \"return\\r\",\r\n \"newline\\n\",\r\n \"a\".repeat(256), // too long\r\n \" leading space\",\r\n \"trailing space \",\r\n \"per.iod\",\r\n \"hash#tag\",\r\n \"back`tick\",\r\n \"single'quote\",\r\n ]);\r\n\r\n CloudSqlite.validateDbName(Guid.createValue()); // guids should be valid\r\n });\r\n\r\n it(\"WorkspaceDb version fallback\", () => {\r\n expect(CloudSqlite.validateDbVersion(\"\" as CloudSqlite.DbVersion)).equals(\"0.0.0\");\r\n expect(CloudSqlite.makeSemverName(\"db1\", \"\" as CloudSqlite.DbVersion)).equals(\"db1:0.0.0\");\r\n expect(() => CloudSqlite.validateDbVersion(\" \" as CloudSqlite.DbVersion)).to.throw(\"invalid version specification\");\r\n });\r\n\r\n it(\"create new WorkspaceDb\", async () => {\r\n const manifest: WorkspaceDbManifest = { workspaceName: \"resources for acme users\", contactName: \"contact me\" };\r\n const wsFile = await makeEditableDb({ containerId: \"acme-engineering-inc-2\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, manifest);\r\n const inFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);\r\n let blobVal = new Uint8Array(testRange.toFloat64Array().buffer);\r\n let strVal = \"this is test1\";\r\n const strRscName = \"string-resource/1\";\r\n const blobRscName = \"blob.resource:1\";\r\n const fileRscName = \"settings files/my settings/a.json5\";\r\n\r\n let testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(manifest.contactName);\r\n\r\n wsFile.updateManifest({ ...testManifest, contactName: \"new contact\" });\r\n testManifest = wsFile.manifest;\r\n expect(testManifest.workspaceName).equals(manifest.workspaceName);\r\n expect(testManifest.contactName).equals(\"new contact\");\r\n\r\n expect(() => wsFile.addFile(fileRscName, \"bad file name\")).to.throw(\"no such file\");\r\n expect(() => wsFile.updateFile(fileRscName, inFile)).to.throw(\"error replacing\");\r\n expect(() => wsFile.removeFile(fileRscName)).to.throw(\"does not exist\");\r\n\r\n wsFile.addBlob(blobRscName, blobVal);\r\n wsFile.addString(strRscName, strVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n strVal = \"updated string\";\r\n blobVal = Uint8Array.from([0, 1, 2, 3]);\r\n wsFile.updateString(strRscName, strVal);\r\n wsFile.updateBlob(blobRscName, blobVal);\r\n expect(wsFile.getString(strRscName)).equals(strVal);\r\n expect(wsFile.getBlob(blobRscName)).to.deep.equal(blobVal);\r\n\r\n wsFile.removeBlob(blobRscName);\r\n wsFile.removeString(strRscName);\r\n expect(wsFile.getString(strRscName)).to.be.undefined;\r\n expect(wsFile.getBlob(blobRscName)).to.be.undefined;\r\n\r\n wsFile.addFile(fileRscName, inFile);\r\n const writeFile = sinon.spy(wsFile.sqliteDb[_nativeDb], \"extractEmbeddedFile\");\r\n expect(writeFile.callCount).eq(0);\r\n const outFile = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(extname(outFile)).equals(\".json5\");\r\n compareFiles(inFile, outFile);\r\n\r\n let outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(1);\r\n expect(outFile).eq(outFile2);\r\n\r\n const inFile2 = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n wsFile.updateFile(fileRscName, inFile2);\r\n outFile2 = wsFile.getFile(fileRscName)!;\r\n expect(writeFile.callCount).eq(2);\r\n expect(outFile).eq(outFile2);\r\n compareFiles(inFile2, outFile);\r\n });\r\n\r\n it(\"load workspace settings\", async () => {\r\n const settingsFile = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n const defaultDb = await makeEditableDb({ containerId: \"default\", dbName: \"db1\", baseUri: \"\", storageType: \"azure\" }, { workspaceName: \"default resources\", contactName: \"contact 123\" });\r\n defaultDb.addString(\"default-settings\", fs.readFileSync(settingsFile, \"utf-8\"));\r\n defaultDb.close();\r\n\r\n const settings = workspace.settings;\r\n await workspace.loadSettingsDictionary(\r\n { dbName: \"db1\", containerId: \"default\", baseUri: \"\", storageType: \"azure\", resourceName: \"default-settings\", priority: SettingsPriority.defaults });\r\n expect(settings.getSetting(\"editor/renderWhitespace\")).equals(\"selection\");\r\n\r\n const workspaceName = \"all fonts workspace\";\r\n const schemaFile = IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\");\r\n const fontsDb = await makeEditableDb({ containerId: \"fonts\", dbName: \"fonts\", baseUri: \"\", storageType: \"azure\" }, { workspaceName, contactName: \"font guy\" });\r\n\r\n fontsDb.addFile(\"Helvetica.ttf\", schemaFile, \"ttf\");\r\n fontsDb.close();\r\n });\r\n\r\n\r\n\r\ndescribe(\"workspace db version cache key\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n function getContainer(containerId: string, props?: Partial<WorkspaceContainerProps>) {\r\n return editor.getContainer({ containerId, baseUri: \"\", storageType: \"azure\", accessToken: \"\", ...props });\r\n }\r\n\r\n function createFakeCloudContainer(containerId: string): CloudSqlite.CloudContainer {\r\n return {\r\n connect: () => { },\r\n disconnect: () => { },\r\n checkForChanges: () => { },\r\n queryDatabase: () => undefined,\r\n queryDatabases: () => [],\r\n acquireWriteLock: () => { },\r\n releaseWriteLock: () => { },\r\n abandonChanges: () => { },\r\n containerId,\r\n baseUri: \"https://example.invalid\",\r\n storageType: \"azure\",\r\n isPublic: false,\r\n } as unknown as CloudSqlite.CloudContainer;\r\n }\r\n\r\n function stubCloudLookup(containerId: string, resolveVersion: (props: WorkspaceDbProps) => string) {\r\n sinon.stub(CloudSqlite, \"createCloudContainer\").returns(createFakeCloudContainer(containerId));\r\n sinon.stub(CloudSqlite, \"querySemverMatch\").callsFake((props) => CloudSqlite.makeSemverName(props.dbName, resolveVersion(props)));\r\n sinon.stub(CloudSqlite, \"isSemverEditable\").returns(true);\r\n }\r\n\r\n it(\"local getWorkspaceDb ignores version selectors for cache identity\", async () => {\r\n const container = getContainer(\"workspace-cache-local\");\r\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cache-local\" } });\r\n\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\", includePrerelease: true });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"local createDb with omitted dbName matches an explicit default-name lookup\", async () => {\r\n const container = getContainer(\"workspace-cache-local-default-name\");\r\n const db1 = await container.createDb({ manifest: { workspaceName: \"workspace-cache-local-default-name\" } });\r\n\r\n const db2 = container.getEditableDb({ dbName: \"workspace-db\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb reuses the same instance for semver-equivalent selectors\", () => {\r\n const containerId = \"workspace-cache-cloud-equivalent\";\r\n stubCloudLookup(containerId, (props) => props.version === \"1\" ? \"1.0.0\" : (props.version ?? \"1.0.0\"));\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db1).to.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb returns different instances for different resolved versions\", () => {\r\n const containerId = \"workspace-cache-cloud-different\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"1.0.0\");\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db1 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n const db2 = container.getWorkspaceDb({ dbName: \"test-db\", version: \"2.0.0\" });\r\n expect(db1).to.not.equal(db2);\r\n });\r\n\r\n it(\"cloud getWorkspaceDb respects includePrerelease only when it resolves differently\", () => {\r\n const containerId = \"workspace-cache-cloud-prerelease\";\r\n stubCloudLookup(containerId, (props) => props.includePrerelease ? \"1.1.0-beta.1\" : \"1.0.0\");\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const stable = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\" });\r\n const prerelease = container.getWorkspaceDb({ dbName: \"test-db\", version: \"*\", includePrerelease: true });\r\n expect(stable).to.not.equal(prerelease);\r\n });\r\n\r\n it(\"createDb with explicit version returns the cached editable db for that resolved version\", async () => {\r\n const containerId = \"workspace-create-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db = await container.createDb({ dbName: \"test-db\", version: \"1.0.0\", manifest: { workspaceName: \"workspace-create-version\" } });\r\n\r\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"1.0.0\" });\r\n expect(db).to.equal(dbAgain);\r\n });\r\n\r\n it(\"createDb without an explicit version returns the cached editable db for version 0.0.0\", async () => {\r\n const containerId = \"workspace-create-default-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n const db = await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-create-default-version\" } });\r\n\r\n const dbAgain = container.getEditableDb({ dbName: \"test-db\", version: \"0.0.0\" });\r\n expect(db).to.equal(dbAgain);\r\n });\r\n\r\n it(\"cloud createDb uploads using the requested version\", async () => {\r\n const containerId = \"workspace-cloud-explicit-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n await container.createDb({ dbName: \"test-db\", version: \"1.2.3\", manifest: { workspaceName: \"workspace-cloud-explicit-version\" } });\r\n\r\n expect(uploadDb.calledOnce).to.be.true;\r\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:1.2.3\");\r\n });\r\n\r\n it(\"cloud createDb defaults omitted version to 0.0.0\", async () => {\r\n const containerId = \"workspace-cloud-default-version\";\r\n stubCloudLookup(containerId, (props) => props.version ?? \"0.0.0\");\r\n const uploadDb = sinon.stub(CloudSqlite, \"uploadDb\").resolves();\r\n\r\n const container = getContainer(containerId, { baseUri: \"https://example.invalid\" });\r\n await container.createDb({ dbName: \"test-db\", manifest: { workspaceName: \"workspace-cloud-default-version\" } });\r\n\r\n expect(uploadDb.calledOnce).to.be.true;\r\n expect(uploadDb.firstCall.args[1].dbName).to.equal(\"test-db:0.0.0\");\r\n });\r\n});\r\n\r\n describe(\"getContainerAsync token resolution\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n it(\"preserves an explicitly-provided accessToken\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"explicit-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n accessToken: \"my-explicit-token\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"my-explicit-token\");\r\n });\r\n\r\n it(\"uses empty token for local containers with empty baseUri\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").rejects(new Error(\"should not be called\"));\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"local-token-test\",\r\n baseUri: \"\",\r\n storageType: \"azure\",\r\n };\r\n\r\n await workspace.getContainerAsync(props);\r\n expect(requestTokenStub.called).to.be.false;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"\");\r\n });\r\n\r\n it(\"calls requestToken when no accessToken is provided for a cloud container\", async () => {\r\n const requestTokenStub = sinon.stub(CloudSqlite, \"requestToken\").resolves(\"resolved-token\");\r\n const getContainerSpy = sinon.spy(workspace, \"getContainer\");\r\n const props: WorkspaceContainerProps = {\r\n containerId: \"cloud-no-token-test\",\r\n baseUri: \"https://some-cloud-uri\",\r\n storageType: \"azure\",\r\n };\r\n\r\n try {\r\n await workspace.getContainerAsync(props);\r\n } catch {\r\n // expected — no real cloud endpoint\r\n }\r\n expect(requestTokenStub.calledOnce).to.be.true;\r\n expect(getContainerSpy.calledOnce).to.be.true;\r\n expect(getContainerSpy.firstCall.args[0].accessToken).to.equal(\"resolved-token\");\r\n });\r\n });\r\n\r\n describe(\"findContainers\", () => {\r\n const testContainerId = \"mock-workspace-container-id\";\r\n const testITwinId = \"mock-itwin-id\";\r\n const testIModelId = \"mock-imodel-id\";\r\n let savedService: BlobContainer.ContainerService | undefined;\r\n\r\n function createMockService(containers: BlobContainer.MetadataResponse[]): BlobContainer.ContainerService {\r\n return {\r\n create: async () => ({ containerId: testContainerId, baseUri: \"https://mock.blob.core/\", provider: \"azure\" as const }),\r\n delete: async () => {},\r\n queryScope: async () => ({ iTwinId: testITwinId }),\r\n queryMetadata: async () => ({ containerType: \"workspace\", label: \"mock\" }),\r\n queryContainersMetadata: async (_userToken, args) => {\r\n return containers.filter((c) =>\r\n (args.containerType === undefined || c.containerType === args.containerType) &&\r\n (args.iTwinId === testITwinId || args.iTwinId === undefined),\r\n );\r\n },\r\n updateJson: async () => {},\r\n requestToken: async (_props) => ({\r\n token: \"\",\r\n scope: { iTwinId: testITwinId },\r\n provider: \"azure\" as const,\r\n expiration: new Date(Date.now() + 3600000),\r\n metadata: { containerType: \"workspace\", label: \"mock\" },\r\n baseUri: \"\",\r\n }),\r\n };\r\n }\r\n\r\n before(() => {\r\n savedService = BlobContainer.service;\r\n });\r\n\r\n afterEach(() => {\r\n BlobContainer.service = savedService;\r\n });\r\n\r\n it(\"finds containers by iTwinId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: testContainerId, containerType: \"workspace\", label: \"Test Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(testContainerId);\r\n });\r\n\r\n it(\"finds a container by iTwinId and iModelId\", async () => {\r\n BlobContainer.service = createMockService([\r\n { containerId: \"imodel-scoped-container\", containerType: \"workspace\", label: \"iModel Workspace\" },\r\n ]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: testITwinId, iModelId: testIModelId });\r\n expect(containers).to.have.length(1);\r\n expect(containers[0].fromProps.containerId).to.equal(\"imodel-scoped-container\");\r\n });\r\n\r\n it(\"returns empty array when no workspace containers are found\", async () => {\r\n BlobContainer.service = createMockService([]);\r\n\r\n const containers = await editor.findContainers({ iTwinId: \"nonexistent-itwin\" });\r\n expect(containers).to.have.length(0);\r\n });\r\n\r\n it(\"throws when BlobContainer.service is not available\", async () => {\r\n BlobContainer.service = undefined;\r\n\r\n await expect(editor.findContainers({ iTwinId: testITwinId }))\r\n .to.be.rejectedWith(/BlobContainer.service is not available/);\r\n });\r\n });\r\n\r\n});\r\n"]}
|