diff --git a/.pnp.cjs b/.pnp.cjs index 7403dbec76..d8cfa7fe81 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -5844,7 +5844,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-36806e37cf/0/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip/node_modules/@rollup/pluginutils/",\ "packageDependencies": [\ ["@rollup/pluginutils", "virtual:984962544e32f8d81418bd22c5c5f144badc7187f06ed1f904493e6a62d7255d6ca3314eee56b13e800567a82646c22bc030945bf7fecefe3fe65e8b6a273a89#npm:5.1.0"],\ - ["@types/estree", "npm:1.0.5"],\ + ["@types/estree", "npm:1.0.6"],\ ["@types/rollup", null],\ ["estree-walker", "npm:2.0.2"],\ ["picomatch", "npm:2.3.1"],\ @@ -5858,145 +5858,145 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@rollup/rollup-android-arm-eabi", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm-eabi-npm-4.21.3-a8b8da21d1/node_modules/@rollup/rollup-android-arm-eabi/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm-eabi-npm-4.24.0-0e40f06bc0/node_modules/@rollup/rollup-android-arm-eabi/",\ "packageDependencies": [\ - ["@rollup/rollup-android-arm-eabi", "npm:4.21.3"]\ + ["@rollup/rollup-android-arm-eabi", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-android-arm64", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm64-npm-4.21.3-72b57fa7f1/node_modules/@rollup/rollup-android-arm64/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm64-npm-4.24.0-ed44e29a69/node_modules/@rollup/rollup-android-arm64/",\ "packageDependencies": [\ - ["@rollup/rollup-android-arm64", "npm:4.21.3"]\ + ["@rollup/rollup-android-arm64", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-darwin-arm64", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-arm64-npm-4.21.3-64dcd050f5/node_modules/@rollup/rollup-darwin-arm64/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-arm64-npm-4.24.0-9d2c88b8fe/node_modules/@rollup/rollup-darwin-arm64/",\ "packageDependencies": [\ - ["@rollup/rollup-darwin-arm64", "npm:4.21.3"]\ + ["@rollup/rollup-darwin-arm64", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-darwin-x64", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-x64-npm-4.21.3-8f4e0d1fcf/node_modules/@rollup/rollup-darwin-x64/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-x64-npm-4.24.0-41f32a0153/node_modules/@rollup/rollup-darwin-x64/",\ "packageDependencies": [\ - ["@rollup/rollup-darwin-x64", "npm:4.21.3"]\ + ["@rollup/rollup-darwin-x64", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-arm-gnueabihf", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-gnueabihf-npm-4.21.3-92a56b5e34/node_modules/@rollup/rollup-linux-arm-gnueabihf/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-gnueabihf-npm-4.24.0-650cc735cc/node_modules/@rollup/rollup-linux-arm-gnueabihf/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.21.3"]\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-arm-musleabihf", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-musleabihf-npm-4.21.3-4068b5a8ca/node_modules/@rollup/rollup-linux-arm-musleabihf/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-musleabihf-npm-4.24.0-0a78a73f98/node_modules/@rollup/rollup-linux-arm-musleabihf/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-arm-musleabihf", "npm:4.21.3"]\ + ["@rollup/rollup-linux-arm-musleabihf", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-arm64-gnu", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-gnu-npm-4.21.3-50b76e8a5e/node_modules/@rollup/rollup-linux-arm64-gnu/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-gnu-npm-4.24.0-241f3660dd/node_modules/@rollup/rollup-linux-arm64-gnu/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-arm64-gnu", "npm:4.21.3"]\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-arm64-musl", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-musl-npm-4.21.3-7e5688d28c/node_modules/@rollup/rollup-linux-arm64-musl/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-musl-npm-4.24.0-627e691c95/node_modules/@rollup/rollup-linux-arm64-musl/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-arm64-musl", "npm:4.21.3"]\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-powerpc64le-gnu", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-powerpc64le-gnu-npm-4.21.3-d7338a1520/node_modules/@rollup/rollup-linux-powerpc64le-gnu/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-powerpc64le-gnu-npm-4.24.0-c820d6337d/node_modules/@rollup/rollup-linux-powerpc64le-gnu/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-powerpc64le-gnu", "npm:4.21.3"]\ + ["@rollup/rollup-linux-powerpc64le-gnu", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-riscv64-gnu", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-riscv64-gnu-npm-4.21.3-03d252fdfd/node_modules/@rollup/rollup-linux-riscv64-gnu/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-riscv64-gnu-npm-4.24.0-3c39472e35/node_modules/@rollup/rollup-linux-riscv64-gnu/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-riscv64-gnu", "npm:4.21.3"]\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-s390x-gnu", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-s390x-gnu-npm-4.21.3-ca59a81fe6/node_modules/@rollup/rollup-linux-s390x-gnu/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-s390x-gnu-npm-4.24.0-9e542e6b3d/node_modules/@rollup/rollup-linux-s390x-gnu/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-s390x-gnu", "npm:4.21.3"]\ + ["@rollup/rollup-linux-s390x-gnu", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-x64-gnu", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-gnu-npm-4.21.3-750edf75c9/node_modules/@rollup/rollup-linux-x64-gnu/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-gnu-npm-4.24.0-a67121f2c9/node_modules/@rollup/rollup-linux-x64-gnu/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-x64-gnu", "npm:4.21.3"]\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-linux-x64-musl", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-musl-npm-4.21.3-a6b322d470/node_modules/@rollup/rollup-linux-x64-musl/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-musl-npm-4.24.0-379cd4fc6b/node_modules/@rollup/rollup-linux-x64-musl/",\ "packageDependencies": [\ - ["@rollup/rollup-linux-x64-musl", "npm:4.21.3"]\ + ["@rollup/rollup-linux-x64-musl", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-win32-arm64-msvc", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-arm64-msvc-npm-4.21.3-813a79e8b7/node_modules/@rollup/rollup-win32-arm64-msvc/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-arm64-msvc-npm-4.24.0-e78e2670bf/node_modules/@rollup/rollup-win32-arm64-msvc/",\ "packageDependencies": [\ - ["@rollup/rollup-win32-arm64-msvc", "npm:4.21.3"]\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-win32-ia32-msvc", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-ia32-msvc-npm-4.21.3-daea7f26bf/node_modules/@rollup/rollup-win32-ia32-msvc/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-ia32-msvc-npm-4.24.0-707da1afbc/node_modules/@rollup/rollup-win32-ia32-msvc/",\ "packageDependencies": [\ - ["@rollup/rollup-win32-ia32-msvc", "npm:4.21.3"]\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/rollup-win32-x64-msvc", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-x64-msvc-npm-4.21.3-7f400f01d1/node_modules/@rollup/rollup-win32-x64-msvc/",\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-x64-msvc-npm-4.24.0-1ea88baa4a/node_modules/@rollup/rollup-win32-x64-msvc/",\ "packageDependencies": [\ - ["@rollup/rollup-win32-x64-msvc", "npm:4.21.3"]\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.24.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -8596,10 +8596,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:1.0.5", {\ - "packageLocation": "./.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-dd8b5bed28.zip/node_modules/@types/estree/",\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-8825d6e729.zip/node_modules/@types/estree/",\ "packageDependencies": [\ - ["@types/estree", "npm:1.0.5"]\ + ["@types/estree", "npm:1.0.6"]\ ],\ "linkType": "HARD"\ }]\ @@ -9026,7 +9026,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-tern-npm-0.23.4-9168cf1c58-d8fd304f14.zip/node_modules/@types/tern/",\ "packageDependencies": [\ ["@types/tern", "npm:0.23.4"],\ - ["@types/estree", "npm:1.0.5"]\ + ["@types/estree", "npm:1.0.6"]\ ],\ "linkType": "HARD"\ }]\ @@ -13771,7 +13771,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/estree-walker-npm-3.0.3-0372979673-a65728d572.zip/node_modules/estree-walker/",\ "packageDependencies": [\ ["estree-walker", "npm:3.0.3"],\ - ["@types/estree", "npm:1.0.5"]\ + ["@types/estree", "npm:1.0.6"]\ ],\ "linkType": "HARD"\ }]\ @@ -22361,27 +22361,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["rollup", [\ - ["npm:4.21.3", {\ - "packageLocation": "./.yarn/cache/rollup-npm-4.21.3-cbe01455fc-19689840d2.zip/node_modules/rollup/",\ - "packageDependencies": [\ - ["rollup", "npm:4.21.3"],\ - ["@rollup/rollup-android-arm-eabi", "npm:4.21.3"],\ - ["@rollup/rollup-android-arm64", "npm:4.21.3"],\ - ["@rollup/rollup-darwin-arm64", "npm:4.21.3"],\ - ["@rollup/rollup-darwin-x64", "npm:4.21.3"],\ - ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.21.3"],\ - ["@rollup/rollup-linux-arm-musleabihf", "npm:4.21.3"],\ - ["@rollup/rollup-linux-arm64-gnu", "npm:4.21.3"],\ - ["@rollup/rollup-linux-arm64-musl", "npm:4.21.3"],\ - ["@rollup/rollup-linux-powerpc64le-gnu", "npm:4.21.3"],\ - ["@rollup/rollup-linux-riscv64-gnu", "npm:4.21.3"],\ - ["@rollup/rollup-linux-s390x-gnu", "npm:4.21.3"],\ - ["@rollup/rollup-linux-x64-gnu", "npm:4.21.3"],\ - ["@rollup/rollup-linux-x64-musl", "npm:4.21.3"],\ - ["@rollup/rollup-win32-arm64-msvc", "npm:4.21.3"],\ - ["@rollup/rollup-win32-ia32-msvc", "npm:4.21.3"],\ - ["@rollup/rollup-win32-x64-msvc", "npm:4.21.3"],\ - ["@types/estree", "npm:1.0.5"],\ + ["npm:4.24.0", {\ + "packageLocation": "./.yarn/cache/rollup-npm-4.24.0-e772e759c0-b7e915b0cc.zip/node_modules/rollup/",\ + "packageDependencies": [\ + ["rollup", "npm:4.24.0"],\ + ["@rollup/rollup-android-arm-eabi", "npm:4.24.0"],\ + ["@rollup/rollup-android-arm64", "npm:4.24.0"],\ + ["@rollup/rollup-darwin-arm64", "npm:4.24.0"],\ + ["@rollup/rollup-darwin-x64", "npm:4.24.0"],\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.24.0"],\ + ["@rollup/rollup-linux-arm-musleabihf", "npm:4.24.0"],\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.24.0"],\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.24.0"],\ + ["@rollup/rollup-linux-powerpc64le-gnu", "npm:4.24.0"],\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.24.0"],\ + ["@rollup/rollup-linux-s390x-gnu", "npm:4.24.0"],\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.24.0"],\ + ["@rollup/rollup-linux-x64-musl", "npm:4.24.0"],\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.24.0"],\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.24.0"],\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.24.0"],\ + ["@types/estree", "npm:1.0.6"],\ ["fsevents", "patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1"]\ ],\ "linkType": "HARD"\ @@ -24655,7 +24655,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["less", null],\ ["lightningcss", null],\ ["postcss", "npm:8.4.47"],\ - ["rollup", "npm:4.21.3"],\ + ["rollup", "npm:4.24.0"],\ ["sass", null],\ ["sass-embedded", null],\ ["stylus", null],\ @@ -24698,7 +24698,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["less", null],\ ["lightningcss", null],\ ["postcss", "npm:8.4.47"],\ - ["rollup", "npm:4.21.3"],\ + ["rollup", "npm:4.24.0"],\ ["sass", null],\ ["sass-embedded", null],\ ["stylus", null],\ @@ -24741,7 +24741,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["less", null],\ ["lightningcss", null],\ ["postcss", "npm:8.4.47"],\ - ["rollup", "npm:4.21.3"],\ + ["rollup", "npm:4.24.0"],\ ["sass", null],\ ["sass-embedded", null],\ ["stylus", null],\ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.21.3-64dcd050f5-8.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.21.3-64dcd050f5-8.zip deleted file mode 100644 index 70d9c62816..0000000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.21.3-64dcd050f5-8.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.24.0-9d2c88b8fe-8.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.24.0-9d2c88b8fe-8.zip new file mode 100644 index 0000000000..187093929b Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.24.0-9d2c88b8fe-8.zip differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.21.3-8f4e0d1fcf-8.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.21.3-8f4e0d1fcf-8.zip deleted file mode 100644 index a103a8eb7a..0000000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.21.3-8f4e0d1fcf-8.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.24.0-41f32a0153-8.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.24.0-41f32a0153-8.zip new file mode 100644 index 0000000000..2869bf3455 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.24.0-41f32a0153-8.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.21.3-50b76e8a5e-8.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.21.3-50b76e8a5e-8.zip deleted file mode 100644 index beab4ec674..0000000000 Binary files a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.21.3-50b76e8a5e-8.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.24.0-241f3660dd-8.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.24.0-241f3660dd-8.zip new file mode 100644 index 0000000000..130aafb1d6 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.24.0-241f3660dd-8.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.21.3-750edf75c9-8.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.21.3-750edf75c9-8.zip deleted file mode 100644 index 6bbed9b434..0000000000 Binary files a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.21.3-750edf75c9-8.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.24.0-a67121f2c9-8.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.24.0-a67121f2c9-8.zip new file mode 100644 index 0000000000..b3346ad9d9 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.24.0-a67121f2c9-8.zip differ diff --git a/.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-dd8b5bed28.zip b/.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-dd8b5bed28.zip deleted file mode 100644 index ebfecb5fda..0000000000 Binary files a/.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-dd8b5bed28.zip and /dev/null differ diff --git a/.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-8825d6e729.zip b/.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-8825d6e729.zip new file mode 100644 index 0000000000..95bab1b051 Binary files /dev/null and b/.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-8825d6e729.zip differ diff --git a/.yarn/cache/rollup-npm-4.21.3-cbe01455fc-19689840d2.zip b/.yarn/cache/rollup-npm-4.21.3-cbe01455fc-19689840d2.zip deleted file mode 100644 index 3715713075..0000000000 Binary files a/.yarn/cache/rollup-npm-4.21.3-cbe01455fc-19689840d2.zip and /dev/null differ diff --git a/.yarn/cache/rollup-npm-4.24.0-e772e759c0-b7e915b0cc.zip b/.yarn/cache/rollup-npm-4.24.0-e772e759c0-b7e915b0cc.zip new file mode 100644 index 0000000000..389e94b729 Binary files /dev/null and b/.yarn/cache/rollup-npm-4.24.0-e772e759c0-b7e915b0cc.zip differ diff --git a/integration-tests/tests/run-analysis-azure.ts b/integration-tests/tests/run-analysis-azure.ts index 427e7feb9c..5daa3883fd 100644 --- a/integration-tests/tests/run-analysis-azure.ts +++ b/integration-tests/tests/run-analysis-azure.ts @@ -21,7 +21,7 @@ const { getAnimatedDrawer, input, noSpinnersAfter, - waitForNoModal, + waitForNoModalDrawer, waitForNoSpinners, } = require('../utils/integration-utils'); const { registerTest } = require('../utils/jest-utils'); @@ -51,7 +51,7 @@ const testRunAnalysisAzure = _.flowRight( timeout: Millis.ofMinute, }); await click(page, clickable({ textContains: 'Close' }), { timeout: Millis.ofMinute }); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Navigate to analysis launcher await click(page, clickable({ textContains: `${notebookName}.ipynb` })); @@ -63,7 +63,7 @@ const testRunAnalysisAzure = _.flowRight( await click(page, clickable({ textContains: 'Open' })); await findText(page, 'Azure Cloud Environment'); await click(page, clickable({ textContains: 'Create' })); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Wait for env to begin creating await findElement(page, clickable({ textContains: 'JupyterLab Environment' })); diff --git a/integration-tests/tests/run-analysis.js b/integration-tests/tests/run-analysis.js index 351451c745..6d2c2a40e1 100644 --- a/integration-tests/tests/run-analysis.js +++ b/integration-tests/tests/run-analysis.js @@ -16,7 +16,7 @@ const { getAnimatedDrawer, input, noSpinnersAfter, - waitForNoModal, + waitForNoModalDrawer, waitForNoSpinners, } = require('../utils/integration-utils'); const { registerTest } = require('../utils/jest-utils'); @@ -47,7 +47,7 @@ const testRunAnalysisFn = _.flowRight( timeout: Millis.ofMinute, }); await click(page, clickable({ textContains: 'Close' }), { timeout: Millis.ofMinute }); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Navigate to analysis launcher await click(page, clickable({ textContains: `${notebookName}.ipynb` })); @@ -61,7 +61,7 @@ const testRunAnalysisFn = _.flowRight( }); await findText(page, 'Jupyter Cloud Environment'); await click(page, clickable({ text: 'Create' })); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Wait for env to begin creating await findElement(page, clickable({ textContains: 'Jupyter Environment' }), { timeout: Millis.ofSeconds(40) }); diff --git a/integration-tests/tests/run-rstudio.js b/integration-tests/tests/run-rstudio.js index 4399b3fdc2..3941577bd3 100644 --- a/integration-tests/tests/run-rstudio.js +++ b/integration-tests/tests/run-rstudio.js @@ -16,7 +16,7 @@ const { getAnimatedDrawer, input, noSpinnersAfter, - waitForNoModal, + waitForNoModalDrawer, waitForNoSpinners, } = require('../utils/integration-utils'); const { registerTest } = require('../utils/jest-utils'); @@ -50,7 +50,7 @@ const testRunRStudioFn = _.flowRight( timeout: Millis.ofMinute, }); await click(page, clickable({ textContains: 'Close' }), { timeout: Millis.ofMinute }); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Navigate to analysis launcher await click(page, clickable({ textContains: `${rFileName}.Rmd` })); @@ -63,7 +63,7 @@ const testRunRStudioFn = _.flowRight( action: () => click(page, clickable({ textContains: 'Open' })), }); await click(page, clickable({ text: 'Create' })); - await waitForNoModal(page); + await waitForNoModalDrawer(page); // Wait for env to begin creating await findElement(page, clickable({ textContains: 'RStudio Environment' }), { timeout: Millis.ofMinutes(2) }); diff --git a/integration-tests/utils/integration-utils.js b/integration-tests/utils/integration-utils.js index 9fa654afdc..3594309f34 100644 --- a/integration-tests/utils/integration-utils.js +++ b/integration-tests/utils/integration-utils.js @@ -233,6 +233,12 @@ const waitForModal = (page, { timeout = 30000 } = {}) => { return page.waitForSelector('.ReactModal__Overlay', { hidden: false, timeout }); }; +const waitForNoModalDrawer = async (page) => { + await waitForNoModal(page); + // Matches the animation transition time + await delay(200); +}; + // Puppeteer works by internally using MutationObserver. We are setting up the listener before // the action to ensure that the spinner rendering is captured by the observer, followed by // waiting for the spinner to be removed @@ -631,6 +637,7 @@ module.exports = { waitForNoModal, waitForMenu, waitForModal, + waitForNoModalDrawer, waitForNoSpinners, withPageLogging, withScreenshot, diff --git a/src/libs/ajax/billing/Billing.ts b/src/libs/ajax/billing/Billing.ts index 2c122d0254..34609d01ca 100644 --- a/src/libs/ajax/billing/Billing.ts +++ b/src/libs/ajax/billing/Billing.ts @@ -12,6 +12,7 @@ import { GoogleBillingAccount, SpendReport, } from 'src/libs/ajax/billing/billing-models'; +import { SupportSummary } from 'src/support/SupportResourceType'; export const Billing = (signal?: AbortSignal) => ({ listProjects: async (): Promise => { @@ -25,6 +26,11 @@ export const Billing = (signal?: AbortSignal) => ({ return res.json(); }, + adminGetProject: async (projectName: string): Promise => { + const res = await fetchRawls(`admin/billing/${projectName}`, _.merge(authOpts(), { signal })); + return res.json(); + }, + listAccounts: async (): Promise => { const res = await fetchRawls('user/billingAccounts?firecloudHasAccess=true', _.merge(authOpts(), { signal })); return res.json(); diff --git a/src/libs/ajax/workspaces/Workspaces.ts b/src/libs/ajax/workspaces/Workspaces.ts index 517522215b..773c61060c 100644 --- a/src/libs/ajax/workspaces/Workspaces.ts +++ b/src/libs/ajax/workspaces/Workspaces.ts @@ -24,6 +24,7 @@ import { } from 'src/libs/ajax/workspaces/workspace-models'; import { getTerraUser } from 'src/libs/state'; import * as Utils from 'src/libs/utils'; +import { SupportSummary } from 'src/support/SupportResourceType'; const getSnapshotEntityMetadata = Utils.memoizeAsync( async ( @@ -95,6 +96,11 @@ export const Workspaces = (signal?: AbortSignal) => ({ return response.json(); }, + adminGetById: async (workspaceId: string): Promise => { + const res = await fetchRawls(`admin/workspaces/${workspaceId}`, _.merge(authOpts(), { signal })); + return res.json(); + }, + workspaceV2: (namespace: string, name: string) => { const root = `workspaces/v2/${namespace}/${name}`; diff --git a/src/libs/ajax/workspaces/workspace-models.ts b/src/libs/ajax/workspaces/workspace-models.ts index 17da806e3d..7fb2056a62 100644 --- a/src/libs/ajax/workspaces/workspace-models.ts +++ b/src/libs/ajax/workspaces/workspace-models.ts @@ -32,7 +32,11 @@ export interface MethodConfiguration { } // TYPES RELATED TO WORKSPACE SETTINGS -export type WorkspaceSetting = BucketLifecycleSetting | SoftDeleteSetting | RequesterPaysSetting; +export type WorkspaceSetting = + | BucketLifecycleSetting + | SoftDeleteSetting + | RequesterPaysSetting + | SeparateSubmissionFinalOutputsSetting; export interface BucketLifecycleSetting { settingType: 'GcpBucketLifecycle'; @@ -49,6 +53,11 @@ export interface RequesterPaysSetting { config: { enabled: boolean }; } +export interface SeparateSubmissionFinalOutputsSetting { + settingType: 'SeparateSubmissionFinalOutputs'; + config: { enabled: boolean }; +} + export interface BucketLifecycleRule { action: { actionType: string; diff --git a/src/pages/workspaces/workspace/workflows/WorkflowView.test.js b/src/pages/workspaces/workspace/workflows/WorkflowView.test.js index 50ba33a0a6..8681a12f68 100644 --- a/src/pages/workspaces/workspace/workflows/WorkflowView.test.js +++ b/src/pages/workspaces/workspace/workflows/WorkflowView.test.js @@ -2,7 +2,9 @@ import { act, fireEvent, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { h } from 'react-hyperscript-helpers'; import { Ajax } from 'src/libs/ajax'; +import { Apps } from 'src/libs/ajax/leonardo/Apps'; import { leoDiskProvider } from 'src/libs/ajax/leonardo/providers/LeoDiskProvider'; +import { Runtimes } from 'src/libs/ajax/leonardo/Runtimes'; import { Methods } from 'src/libs/ajax/methods/Methods'; import { Workspaces } from 'src/libs/ajax/workspaces/Workspaces'; import { getLocalPref, setLocalPref } from 'src/libs/prefs'; @@ -16,6 +18,8 @@ jest.mock('src/libs/ajax'); jest.mock('src/libs/ajax/Dockstore'); jest.mock('src/libs/ajax/GoogleStorage'); +jest.mock('src/libs/ajax/leonardo/Apps'); +jest.mock('src/libs/ajax/leonardo/Runtimes'); jest.mock('src/libs/ajax/methods/Methods'); jest.mock('src/libs/ajax/Metrics'); jest.mock('src/libs/ajax/workspaces/Workspaces'); @@ -247,8 +251,6 @@ describe('Workflow View (GCP)', () => { const mockLaunchResponse = jest.fn(() => Promise.resolve({ submissionId: 'abc123', ...initializedGoogleWorkspace.workspaceId })); const mockDefaultAjax = () => { - asMockedFn(leoDiskProvider.list).mockImplementation(jest.fn()); - Methods.mockReturnValue({ list: jest.fn(() => Promise.resolve(methodList)), method: () => ({ @@ -284,19 +286,9 @@ describe('Workflow View (GCP)', () => { }), }), }); - Ajax.mockImplementation(() => ({ - Disks: { - disksV1: () => ({ - list: jest.fn(), - }), - }, - Runtimes: { - listV2: jest.fn(), - }, - Apps: { - list: jest.fn().mockReturnValue([]), - }, - })); + Apps.mockReturnValue({ list: jest.fn().mockReturnValue([]) }); + Runtimes.mockReturnValue({ listV2: jest.fn() }); + asMockedFn(leoDiskProvider.list).mockImplementation(jest.fn()); }; it('view workflow in workspace from mock import', async () => { diff --git a/src/support/SupportResourceType.ts b/src/support/SupportResourceType.ts index b9986f2108..9d2dec7a78 100644 --- a/src/support/SupportResourceType.ts +++ b/src/support/SupportResourceType.ts @@ -22,8 +22,16 @@ export const supportResources: SupportResourceType[] = [ resourceType: 'managed-group', loadSupportSummaryFn: (id: FullyQualifiedResourceId) => Ajax().Groups.group(id.resourceId).getSupportSummary(), }, - { displayName: 'Workspace', resourceType: 'workspace', loadSupportSummaryFn: undefined }, - { displayName: 'Billing Project', resourceType: 'billing-project', loadSupportSummaryFn: undefined }, + { + displayName: 'Workspace', + resourceType: 'workspace', + loadSupportSummaryFn: (id: FullyQualifiedResourceId) => Ajax().Workspaces.adminGetById(id.resourceId), + }, + { + displayName: 'Billing Project', + resourceType: 'billing-project', + loadSupportSummaryFn: (id: FullyQualifiedResourceId) => Ajax().Billing.adminGetProject(id.resourceId), + }, { displayName: 'Dataset', resourceType: 'dataset', loadSupportSummaryFn: undefined }, { displayName: 'Snapshot', resourceType: 'datasnapshot', loadSupportSummaryFn: undefined }, ].sort((a, b) => a.displayName.localeCompare(b.displayName)); diff --git a/src/workspaces/SettingsModal/BucketLifecycleSettings.tsx b/src/workspaces/SettingsModal/BucketLifecycleSettings.tsx index ed908500af..bb72d5d493 100644 --- a/src/workspaces/SettingsModal/BucketLifecycleSettings.tsx +++ b/src/workspaces/SettingsModal/BucketLifecycleSettings.tsx @@ -1,7 +1,9 @@ -import { CreatableSelect, ExternalLink, useUniqueId } from '@terra-ui-packages/components'; +import { CreatableSelect, ExternalLink, Icon, useUniqueId } from '@terra-ui-packages/components'; import _ from 'lodash/fp'; import React, { ReactNode } from 'react'; import { NumberInput } from 'src/components/input'; +import colors from 'src/libs/colors'; +import * as Style from 'src/libs/style'; import Setting from 'src/workspaces/SettingsModal/Setting'; import { suggestedPrefixes } from 'src/workspaces/SettingsModal/utils'; @@ -59,6 +61,25 @@ const BucketLifecycleSettings = (props: BucketLifecycleSettingsProps): ReactNode } >
+
+
+ +
+ Enabling lifecycle rules will also change the directory structure for future workflow submissions by + separating files into submission/intermediates and submissions/final-outputs directories. +
+
+
Delete objects in:
{ config: { enabled: false }, }; + const separateSubmissionOutputsDisabledSetting: SeparateSubmissionFinalOutputsSetting = { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: false }, + }; + + const separateSubmissionOutputsEnabledSetting: SeparateSubmissionFinalOutputsSetting = { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: true }, + }; + const setup = (currentSetting: WorkspaceSetting[], updateSettingsMock: jest.Mock) => { jest.resetAllMocks(); jest.spyOn(console, 'log').mockImplementation(() => {}); @@ -174,7 +185,7 @@ describe('SettingsModal', () => { // Assert expect(onDismiss).toHaveBeenCalled(); expect(captureEvent).not.toHaveBeenCalled(); - // On save we do persist the default soft delete setting so it now explicit. + // On save we do persist the default soft delete setting so it is now explicit. expect(updateSettingsMock).toHaveBeenCalledWith([defaultSoftDeleteSetting]); }); @@ -276,7 +287,11 @@ describe('SettingsModal', () => { expect(prefixInput.getSelectedOptions()).toEqual([suggestedPrefixes.allObjects]); expect(prefixInput.inputElement).not.toHaveAttribute('disabled'); const allOptions = await prefixInput.getOptions(); - expect(allOptions).toEqual([suggestedPrefixes.submissions, suggestedPrefixes.submissionIntermediaries]); + expect(allOptions).toEqual([ + suggestedPrefixes.submissionIntermediaries, + suggestedPrefixes.submissionFinalOutputs, + suggestedPrefixes.submissions, + ]); const daysInput = getDays(); expect(daysInput).toHaveValue(4); @@ -366,7 +381,11 @@ describe('SettingsModal', () => { await user.click(screen.getByRole('button', { name: 'Save' })); // Assert - expect(updateSettingsMock).toHaveBeenCalledWith([defaultSoftDeleteSetting, noLifecycleRules]); + expect(updateSettingsMock).toHaveBeenCalledWith([ + defaultSoftDeleteSetting, + separateSubmissionOutputsDisabledSetting, + noLifecycleRules, + ]); expect(captureEvent).toHaveBeenCalledWith(Events.workspaceSettingsBucketLifecycle, { enabled: false, prefix: null, @@ -401,6 +420,7 @@ describe('SettingsModal', () => { // Assert expect(updateSettingsMock).toHaveBeenCalledWith([ defaultSoftDeleteSetting, + separateSubmissionOutputsDisabledSetting, { config: { rules: [ @@ -447,6 +467,7 @@ describe('SettingsModal', () => { // Assert expect(updateSettingsMock).toHaveBeenCalledWith([ defaultSoftDeleteSetting, + separateSubmissionOutputsEnabledSetting, { config: { rules: [ @@ -501,6 +522,7 @@ describe('SettingsModal', () => { // Assert expect(updateSettingsMock).toHaveBeenCalledWith([ defaultSoftDeleteSetting, + separateSubmissionOutputsEnabledSetting, { config: { rules: [ @@ -558,6 +580,7 @@ describe('SettingsModal', () => { // Assert expect(updateSettingsMock).toHaveBeenCalledWith([ defaultSoftDeleteSetting, + separateSubmissionOutputsEnabledSetting, { config: { rules: [ diff --git a/src/workspaces/SettingsModal/SettingsModal.tsx b/src/workspaces/SettingsModal/SettingsModal.tsx index 79a7abb0d2..016e441237 100644 --- a/src/workspaces/SettingsModal/SettingsModal.tsx +++ b/src/workspaces/SettingsModal/SettingsModal.tsx @@ -249,7 +249,7 @@ const SettingsModal = (props: SettingsModalProps): ReactNode => { Save diff --git a/src/workspaces/SettingsModal/utils.test.ts b/src/workspaces/SettingsModal/utils.test.ts index 32cc9a0a39..e7b1ab6771 100644 --- a/src/workspaces/SettingsModal/utils.test.ts +++ b/src/workspaces/SettingsModal/utils.test.ts @@ -80,6 +80,10 @@ describe('disableFirstBucketDeletionRule', () => { // Assert expect(result).toEqual([ + { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: false }, + }, { settingType: 'GcpBucketLifecycle', config: { @@ -149,6 +153,10 @@ describe('disableFirstBucketDeletionRule', () => { // Assert expect(result).toEqual([ + { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: false }, + }, { settingType: 'GcpBucketLifecycle', config: { @@ -228,6 +236,10 @@ describe('modifyFirstBucketDeletionRule', () => { // Assert expect(result).toEqual([ + { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: true }, + }, { settingType: 'GcpBucketLifecycle', config: { @@ -324,6 +336,10 @@ describe('modifyFirstBucketDeletionRule', () => { // Assert expect(result).toEqual([ + { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled: true }, + }, { settingType: 'GcpBucketLifecycle', config: { diff --git a/src/workspaces/SettingsModal/utils.ts b/src/workspaces/SettingsModal/utils.ts index 213b199bbc..0d4c068f5b 100644 --- a/src/workspaces/SettingsModal/utils.ts +++ b/src/workspaces/SettingsModal/utils.ts @@ -4,6 +4,7 @@ import { BucketLifecycleSetting, DeleteBucketLifecycleRule, RequesterPaysSetting, + SeparateSubmissionFinalOutputsSetting, SoftDeleteSetting, WorkspaceSetting, } from 'src/libs/ajax/workspaces/workspace-models'; @@ -18,8 +19,9 @@ export type { export const suggestedPrefixes = { allObjects: 'All Objects', - submissions: 'submissions/', submissionIntermediaries: 'submissions/intermediates/', + submissionFinalOutputs: 'submissions/final-outputs/', + submissions: 'submissions/', }; export const secondsInADay = 86400; @@ -37,6 +39,10 @@ export const isSoftDeleteSetting = (setting: WorkspaceSetting): setting is SoftD export const isRequesterPaysSetting = (setting: WorkspaceSetting): setting is RequesterPaysSetting => setting.settingType === 'GcpBucketRequesterPays'; +const isSeparateSubmissionFinalOutputsSetting = ( + setting: WorkspaceSetting +): setting is SeparateSubmissionFinalOutputsSetting => setting.settingType === 'SeparateSubmissionFinalOutputs'; + /** * Removes the first delete rule from the first bucketLifecycleSetting in the workspace settings. * @@ -51,7 +57,7 @@ export const removeFirstBucketDeletionRule = (originalSettings: WorkspaceSetting ) as BucketLifecycleSetting[]; const otherSettings: WorkspaceSetting[] = workspaceSettings.filter((setting) => !isBucketLifecycleSetting(setting)); - // If no bucketLifecycleSettings existed, nothing to delete + // If no bucketLifecycleSettings existed, nothing to delete (and we don't set the new submission directory setting). if (bucketLifecycleSettings.length === 0) { return otherSettings; } @@ -63,7 +69,9 @@ export const removeFirstBucketDeletionRule = (originalSettings: WorkspaceSetting const otherRules = existingSetting.config.rules.filter((rule) => !isDeleteBucketLifecycleRule(rule)); bucketLifecycleSettings[0].config.rules = _.concat(deleteRules.slice(1), otherRules); - return _.concat(bucketLifecycleSettings, otherSettings); + const newSettings = _.concat(bucketLifecycleSettings, otherSettings); + // When disabling bucket lifecycle rules, we also disable separate submission outputs. + return modifySeparateSubmissionOutputsSetting(newSettings, false); }; /** @@ -122,7 +130,10 @@ export const modifyFirstBucketDeletionRule = ( deleteRules[0].conditions.matchesPrefix = prefixes; } bucketLifecycleSettings[0].config.rules = _.concat(deleteRules, otherRules); - return _.concat(bucketLifecycleSettings, otherSettings); + const newSettings = _.concat(bucketLifecycleSettings, otherSettings); + + // When enable bucket lifecycle rules, we also enable separate submission outputs. + return modifySeparateSubmissionOutputsSetting(newSettings, true); }; /** @@ -196,3 +207,31 @@ export const modifyRequesterPaysSetting = ( otherSettings ); }; + +/** + * Modifies the "separate submission outputs" setting in the workspace settings. + * If no such setting exists, it will be created. + * + * Note that any other settings will be preserved but moved to the end of the array. + */ +const modifySeparateSubmissionOutputsSetting = ( + originalSettings: WorkspaceSetting[], + enabled: boolean +): WorkspaceSetting[] => { + // Clone original for testing purposes and to allow eventing only if there was a change. + const workspaceSettings = _.cloneDeep(originalSettings); + + const otherSettings: WorkspaceSetting[] = workspaceSettings.filter( + (setting) => !isSeparateSubmissionFinalOutputsSetting(setting) + ); + + return _.concat( + [ + { + settingType: 'SeparateSubmissionFinalOutputs', + config: { enabled }, + } as SeparateSubmissionFinalOutputsSetting, + ], + otherSettings + ); +}; diff --git a/src/workspaces/common/state/useAppPolling.ts b/src/workspaces/common/state/useAppPolling.ts index 4b9ffc94ef..adcdca7d3b 100644 --- a/src/workspaces/common/state/useAppPolling.ts +++ b/src/workspaces/common/state/useAppPolling.ts @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from 'react'; -import { Ajax } from 'src/libs/ajax'; +import { Apps } from 'src/libs/ajax/leonardo/Apps'; import { ListAppItem } from 'src/libs/ajax/leonardo/models/app-models'; import { withErrorIgnoring, withErrorReporting } from 'src/libs/error'; import { InitializedWorkspaceWrapper as Workspace } from 'src/workspaces/common/state/useWorkspace'; @@ -30,14 +30,14 @@ export const useAppPolling = (name: string, namespace: string, workspace?: Works try { const newGoogleApps = workspace?.workspaceInitialized && isGoogleWorkspace(workspace) - ? await Ajax(signal).Apps.list(workspace.workspace.googleProject, { + ? await Apps(signal).list(workspace.workspace.googleProject, { role: 'creator', saturnWorkspaceName: workspace.workspace.name, }) : []; const newAzureApps = workspace?.workspaceInitialized && isAzureWorkspace(workspace) - ? await Ajax(signal).Apps.listAppsV2(workspace.workspace.workspaceId) + ? await Apps(signal).listAppsV2(workspace.workspace.workspaceId) : []; const combinedNewApps = [...newGoogleApps, ...newAzureApps]; diff --git a/src/workspaces/common/state/useCloningWorkspaceNotifications.test.tsx b/src/workspaces/common/state/useCloningWorkspaceNotifications.test.tsx index b35bf85b01..02f95bd078 100644 --- a/src/workspaces/common/state/useCloningWorkspaceNotifications.test.tsx +++ b/src/workspaces/common/state/useCloningWorkspaceNotifications.test.tsx @@ -2,10 +2,10 @@ import { DeepPartial } from '@terra-ui-packages/core-utils'; import { NotificationType } from '@terra-ui-packages/notifications'; import { waitFor } from '@testing-library/react'; import React from 'react'; -import { Ajax } from 'src/libs/ajax'; +import { WorkspaceContract, Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces'; import { clearNotification, notify } from 'src/libs/notifications'; import { cloningWorkspacesStore } from 'src/libs/state'; -import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils'; +import { asMockedFn, partial, renderWithAppContexts as render } from 'src/testing/test-utils'; import { defaultAzureWorkspace } from 'src/testing/workspace-fixtures'; import { notifyNewWorkspaceClone, @@ -14,15 +14,7 @@ import { import { WORKSPACE_UPDATE_POLLING_INTERVAL } from 'src/workspaces/common/state/useWorkspaceStatePolling'; import { WorkspaceInfo, WorkspaceState, WorkspaceWrapper } from 'src/workspaces/utils'; -type AjaxContract = ReturnType; -type AjaxWorkspacesContract = AjaxContract['Workspaces']; - -jest.mock('src/libs/ajax', (): typeof import('src/libs/ajax') => { - return { - ...jest.requireActual('src/libs/ajax'), - Ajax: jest.fn(), - }; -}); +jest.mock('src/libs/ajax/workspaces/Workspaces'); type NotificationExports = typeof import('src/libs/notifications'); jest.mock( @@ -95,15 +87,11 @@ describe('useCloningWorkspaceNotifications', () => { }, }; const mockDetailsFn = jest.fn().mockResolvedValue(update); - const mockAjax: DeepPartial = { - Workspaces: { - workspace: () => - ({ - details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue( + partial({ + workspace: () => partial({ details: mockDetailsFn }), + }) + ); // Act render(); @@ -136,12 +124,11 @@ describe('useCloningWorkspaceNotifications', () => { }, }; const mockDetailsFn = jest.fn().mockImplementation(() => Promise.resolve(update)); - const mockAjax: DeepPartial = { - Workspaces: { - workspace: () => ({ details: mockDetailsFn }), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue( + partial({ + workspace: () => partial({ details: mockDetailsFn }), + }) + ); jest.useFakeTimers(); // Act render(); @@ -170,15 +157,11 @@ describe('useCloningWorkspaceNotifications', () => { }, }; const mockDetailsFn = jest.fn().mockResolvedValue(update); - const mockAjax: DeepPartial = { - Workspaces: { - workspace: () => - ({ - details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue( + partial({ + workspace: () => partial({ details: mockDetailsFn }), + }) + ); jest.useFakeTimers(); // Act diff --git a/src/workspaces/common/state/useCloudEnvironmentPolling.test.ts b/src/workspaces/common/state/useCloudEnvironmentPolling.test.ts index c849f3714d..95f5e3285b 100644 --- a/src/workspaces/common/state/useCloudEnvironmentPolling.test.ts +++ b/src/workspaces/common/state/useCloudEnvironmentPolling.test.ts @@ -1,17 +1,15 @@ import { generateTestDiskWithGoogleWorkspace } from 'src/analysis/_testData/testData'; -import { Ajax } from 'src/libs/ajax'; import { leoDiskProvider, PersistentDisk } from 'src/libs/ajax/leonardo/providers/LeoDiskProvider'; -import { RuntimesAjaxContract } from 'src/libs/ajax/leonardo/Runtimes'; -import { asMockedFn, renderHookInAct } from 'src/testing/test-utils'; +import { Runtimes, RuntimesAjaxContract } from 'src/libs/ajax/leonardo/Runtimes'; +import { asMockedFn, partial, renderHookInAct } from 'src/testing/test-utils'; import { defaultGoogleWorkspace, defaultInitializedGoogleWorkspace } from 'src/testing/workspace-fixtures'; import { useCloudEnvironmentPolling } from './useCloudEnvironmentPolling'; -jest.mock('src/libs/ajax'); +jest.mock('src/libs/ajax/leonardo/Runtimes'); jest.mock('src/libs/ajax/leonardo/providers/LeoDiskProvider'); // This code will be needed when we mock and test the runtime methods -type AjaxContract = ReturnType; type RuntimesNeeds = Pick; interface RuntimeMockNeeds { topLevel: RuntimesNeeds; @@ -30,9 +28,9 @@ const mockAjaxNeeds = (): AjaxMockNeeds => { const partialRuntimes: RuntimesNeeds = { listV2: jest.fn(), }; - const mockRuntimes = partialRuntimes as RuntimesAjaxContract; + const mockRuntimes = partial(partialRuntimes); - asMockedFn(Ajax).mockReturnValue({ Runtimes: mockRuntimes } as AjaxContract); + asMockedFn(Runtimes).mockReturnValue(mockRuntimes); return { Runtimes: { @@ -69,7 +67,7 @@ describe('useCloudEnvironmentPolling', () => { // Assert // Runtimes and disk ajax calls - expect(Ajax).toBeCalledTimes(1); + expect(Runtimes).toBeCalledTimes(1); expect(leoDiskProvider.list).toBeCalledTimes(1); expect(result.current.persistentDisks).toEqual([persistentDisk]); expect(result.current.appDataDisks).toEqual([appDisk]); diff --git a/src/workspaces/common/state/useCloudEnvironmentPolling.ts b/src/workspaces/common/state/useCloudEnvironmentPolling.ts index 0c3a3ba6fd..99d12b946d 100644 --- a/src/workspaces/common/state/useCloudEnvironmentPolling.ts +++ b/src/workspaces/common/state/useCloudEnvironmentPolling.ts @@ -2,9 +2,9 @@ import _ from 'lodash/fp'; import { useEffect, useRef, useState } from 'react'; import { getDiskAppType } from 'src/analysis/utils/app-utils'; import { getConvertedRuntimeStatus, getCurrentRuntime } from 'src/analysis/utils/runtime-utils'; -import { Ajax } from 'src/libs/ajax'; import { ListRuntimeItem } from 'src/libs/ajax/leonardo/models/runtime-models'; import { leoDiskProvider, PersistentDisk } from 'src/libs/ajax/leonardo/providers/LeoDiskProvider'; +import { Runtimes } from 'src/libs/ajax/leonardo/Runtimes'; import { withErrorIgnoring, withErrorReporting } from 'src/libs/error'; import { InitializedWorkspaceWrapper as Workspace } from 'src/workspaces/common/state/useWorkspace'; @@ -58,7 +58,7 @@ export const useCloudEnvironmentPolling = ( }, { signal: controller.current.signal } ), - Ajax(controller.current.signal).Runtimes.listV2(cloudEnvFilters), + Runtimes(controller.current.signal).listV2(cloudEnvFilters), ]); setRuntimes(newRuntimes); diff --git a/src/workspaces/common/state/useWorkspace.test.ts b/src/workspaces/common/state/useWorkspace.test.ts index 05d11ab227..9b9d872da3 100644 --- a/src/workspaces/common/state/useWorkspace.test.ts +++ b/src/workspaces/common/state/useWorkspace.test.ts @@ -17,7 +17,6 @@ import { } from 'src/workspaces/common/state/useWorkspace'; jest.mock('src/libs/ajax/AzureStorage'); - jest.mock('src/libs/ajax/Metrics'); jest.mock('src/libs/ajax/workspaces/Workspaces'); diff --git a/src/workspaces/common/state/useWorkspaceById.test.ts b/src/workspaces/common/state/useWorkspaceById.test.ts index af6124b8dd..3976d53868 100644 --- a/src/workspaces/common/state/useWorkspaceById.test.ts +++ b/src/workspaces/common/state/useWorkspaceById.test.ts @@ -1,31 +1,16 @@ -import { DeepPartial } from '@terra-ui-packages/core-utils'; import { act } from '@testing-library/react'; -import { Ajax } from 'src/libs/ajax'; -import { asMockedFn, renderHookInAct } from 'src/testing/test-utils'; +import { Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces'; +import { asMockedFn, partial, renderHookInAct } from 'src/testing/test-utils'; import { useWorkspaceById } from './useWorkspaceById'; -type AjaxExports = typeof import('src/libs/ajax'); -jest.mock('src/libs/ajax', (): AjaxExports => { - const actual = jest.requireActual('src/libs/ajax'); - return { - ...actual, - Ajax: jest.fn(), - }; -}); - -type AjaxContract = ReturnType; +jest.mock('src/libs/ajax/workspaces/Workspaces'); describe('useWorkspaceById', () => { it('fetches a workspace by ID', async () => { // Arrange const getWorkspaceById = jest.fn().mockResolvedValue({}); - const mockAjax: DeepPartial = { - Workspaces: { - getById: getWorkspaceById, - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue(partial({ getById: getWorkspaceById })); // Act await renderHookInAct(() => useWorkspaceById('test-workspace')); @@ -37,12 +22,7 @@ describe('useWorkspaceById', () => { it('fetches workspace when ID changes', async () => { // Arrange const getWorkspaceById = jest.fn().mockResolvedValue({}); - const mockAjax: DeepPartial = { - Workspaces: { - getById: getWorkspaceById, - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue(partial({ getById: getWorkspaceById })); const { rerender } = await renderHookInAct(useWorkspaceById, { initialProps: 'workspace-1' }); diff --git a/src/workspaces/common/state/useWorkspaceById.ts b/src/workspaces/common/state/useWorkspaceById.ts index 90a39174d8..6c9f35be84 100644 --- a/src/workspaces/common/state/useWorkspaceById.ts +++ b/src/workspaces/common/state/useWorkspaceById.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Ajax } from 'src/libs/ajax'; +import { Workspaces } from 'src/libs/ajax/workspaces/Workspaces'; import { useCancellation } from 'src/libs/react-utils'; import { WorkspaceWrapper } from 'src/workspaces/utils'; @@ -27,7 +27,7 @@ export const useWorkspaceById = (workspaceId: string, fields?: string[]): UseWor const loadWorkspace = async () => { setState({ status: 'Loading', workspace: null }); try { - const workspace = await Ajax(signal).Workspaces.getById(workspaceId, fields); + const workspace = await Workspaces(signal).getById(workspaceId, fields); setState({ status: 'Ready', workspace }); } catch (error: unknown) { setState({ status: 'Error', workspace: null, error }); diff --git a/src/workspaces/common/state/useWorkspaceDetails.ts b/src/workspaces/common/state/useWorkspaceDetails.ts index dbeed76406..d1c87f31d0 100644 --- a/src/workspaces/common/state/useWorkspaceDetails.ts +++ b/src/workspaces/common/state/useWorkspaceDetails.ts @@ -1,6 +1,6 @@ import _ from 'lodash/fp'; import { useState } from 'react'; -import { Ajax } from 'src/libs/ajax'; +import { Workspaces } from 'src/libs/ajax/workspaces/Workspaces'; import { withErrorReporting } from 'src/libs/error'; import { useCancellation, useOnMount } from 'src/libs/react-utils'; import * as Utils from 'src/libs/utils'; @@ -18,7 +18,7 @@ export const useWorkspaceDetails = (workspaceName: { namespace: string; name: st withErrorReporting('Error loading workspace details'), Utils.withBusyState(setLoading) )(async () => { - const ws: Workspace = await Ajax(signal).Workspaces.workspace(namespace, name).details(fields); + const ws: Workspace = await Workspaces(signal).workspace(namespace, name).details(fields); setWorkspace(ws); }); diff --git a/src/workspaces/common/state/useWorkspaceStatePolling.ts b/src/workspaces/common/state/useWorkspaceStatePolling.ts index 870bbf6822..51fd9a36a3 100644 --- a/src/workspaces/common/state/useWorkspaceStatePolling.ts +++ b/src/workspaces/common/state/useWorkspaceStatePolling.ts @@ -1,7 +1,7 @@ import { LoadedState } from '@terra-ui-packages/core-utils'; import _ from 'lodash/fp'; import { useEffect, useRef } from 'react'; -import { Ajax } from 'src/libs/ajax'; +import { Workspaces } from 'src/libs/ajax/workspaces/Workspaces'; import { workspacesStore, workspaceStore } from 'src/libs/state'; import { pollWithCancellation } from 'src/libs/utils'; import { BaseWorkspaceInfo, WorkspaceInfo, WorkspaceState, WorkspaceWrapper as Workspace } from 'src/workspaces/utils'; @@ -47,8 +47,8 @@ const checkWorkspaceState = async ( ): Promise => { const startingState = workspace.state; try { - const wsResp: Workspace = await Ajax(signal) - .Workspaces.workspace(workspace.namespace, workspace.name) + const wsResp: Workspace = await Workspaces(signal) + .workspace(workspace.namespace, workspace.name) .details(['workspace.state', 'workspace.errorMessage']); const state = wsResp.workspace.state; diff --git a/src/workspaces/container/WorkspaceContainer.test.ts b/src/workspaces/container/WorkspaceContainer.test.ts index 285f97b1c8..a7fb1cd9d1 100644 --- a/src/workspaces/container/WorkspaceContainer.test.ts +++ b/src/workspaces/container/WorkspaceContainer.test.ts @@ -1,10 +1,9 @@ -import { DeepPartial } from '@terra-ui-packages/core-utils'; import { screen, waitFor, within } from '@testing-library/react'; import { h } from 'react-hyperscript-helpers'; -import { Ajax } from 'src/libs/ajax'; +import { WorkspaceContract, Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces'; import { goToPath } from 'src/libs/nav'; import { workspacesStore, workspaceStore } from 'src/libs/state'; -import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils'; +import { asMockedFn, partial, renderWithAppContexts as render } from 'src/testing/test-utils'; import { defaultAzureWorkspace, defaultGoogleWorkspace } from 'src/testing/workspace-fixtures'; import { InitializedWorkspaceWrapper } from 'src/workspaces/common/state/useWorkspace'; import { WORKSPACE_UPDATE_POLLING_INTERVAL } from 'src/workspaces/common/state/useWorkspaceStatePolling'; @@ -21,16 +20,9 @@ jest.mock( }) ); -type AjaxExports = typeof import('src/libs/ajax'); -type AjaxContract = ReturnType; -type AjaxWorkspacesContract = AjaxContract['Workspaces']; - -jest.mock('src/libs/ajax', (): AjaxExports => { - return { - ...jest.requireActual('src/libs/ajax'), - Ajax: jest.fn(), - }; -}); +jest.mock('src/libs/ajax/AzureStorage'); +jest.mock('src/libs/ajax/Metrics'); +jest.mock('src/libs/ajax/workspaces/Workspaces'); type StateExports = typeof import('src/libs/state'); jest.mock( @@ -128,15 +120,14 @@ describe('WorkspaceContainer', () => { const mockDetailsFn = jest.fn(); - const mockAjax: DeepPartial = { - Workspaces: { + asMockedFn(Workspaces).mockReturnValue( + partial({ workspace: () => - ({ + partial({ details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + }), + }) + ); const workspace: InitializedWorkspaceWrapper = { ...defaultAzureWorkspace, @@ -186,15 +177,14 @@ describe('WorkspaceContainer', () => { }; const mockDetailsFn = jest.fn().mockResolvedValue({ workspace: { state: 'Deleting' } }); - const mockAjax: DeepPartial = { - Workspaces: { + asMockedFn(Workspaces).mockReturnValue( + partial({ workspace: () => - ({ + partial({ details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + }), + }) + ); const props = { namespace: workspace.workspace.namespace, @@ -239,15 +229,14 @@ describe('WorkspaceContainer', () => { // Arrange const mockDetailsFn = jest.fn().mockRejectedValue(new Response(null, { status: 404 })); - const mockAjax: DeepPartial = { - Workspaces: { + asMockedFn(Workspaces).mockReturnValue( + partial({ workspace: () => - ({ + partial({ details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + }), + }) + ); const workspace: InitializedWorkspaceWrapper = { ...defaultAzureWorkspace, @@ -310,15 +299,14 @@ describe('WorkspaceContainer', () => { const errorMessage = 'this is an error message'; const mockDetailsFn = jest.fn().mockResolvedValue({ workspace: { state: 'DeleteFailed', errorMessage } }); - const mockAjax: DeepPartial = { - Workspaces: { + asMockedFn(Workspaces).mockReturnValue( + partial({ workspace: () => - ({ + partial({ details: mockDetailsFn, - } as Partial), - }, - }; - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + }), + }) + ); const workspace: InitializedWorkspaceWrapper = { ...defaultAzureWorkspace, diff --git a/src/workspaces/list/WorkspacesList.test.ts b/src/workspaces/list/WorkspacesList.test.ts index b9a40fb874..36062c933d 100644 --- a/src/workspaces/list/WorkspacesList.test.ts +++ b/src/workspaces/list/WorkspacesList.test.ts @@ -1,8 +1,10 @@ import { DeepPartial } from '@terra-ui-packages/core-utils'; import { act, waitFor } from '@testing-library/react'; import { h } from 'react-hyperscript-helpers'; -import { Ajax, AjaxContract } from 'src/libs/ajax'; -import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils'; +import { FirecloudBucket, FirecloudBucketAjaxContract } from 'src/libs/ajax/firecloud/FirecloudBucket'; +import { Metrics, MetricsContract } from 'src/libs/ajax/Metrics'; +import { WorkspaceContract, Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces'; +import { asMockedFn, partial, renderWithAppContexts as render } from 'src/testing/test-utils'; import { defaultAzureWorkspace, defaultGoogleWorkspace } from 'src/testing/workspace-fixtures'; import { useWorkspaces } from 'src/workspaces/common/state/useWorkspaces'; import { WORKSPACE_UPDATE_POLLING_INTERVAL } from 'src/workspaces/common/state/useWorkspaceStatePolling'; @@ -37,14 +39,9 @@ jest.mock('src/libs/notifications', (): NotificationExports => { }; }); -type AjaxExports = typeof import('src/libs/ajax'); - -jest.mock('src/libs/ajax', (): AjaxExports => { - return { - ...jest.requireActual('src/libs/ajax'), - Ajax: jest.fn(), - }; -}); +jest.mock('src/libs/ajax/firecloud/FirecloudBucket'); +jest.mock('src/libs/ajax/workspaces/Workspaces'); +jest.mock('src/libs/ajax/Metrics'); type WorkspaceFiltersExports = typeof import('src/workspaces/list/WorkspaceFilters'); jest.mock('src/workspaces/list/WorkspaceFilters', () => ({ @@ -72,19 +69,17 @@ describe('WorkspaceList', () => { status: 'Ready', }); const mockDetailsFn = jest.fn(); - const mockAjax: DeepPartial = { - Workspaces: { - workspace: () => ({ - details: mockDetailsFn, - }), - }, - FirecloudBucket: { - getFeaturedWorkspaces: () => [], - }, - Metrics: { captureEvent: jest.fn() } as Partial, - }; - - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue( + partial({ + workspace: () => partial({ details: mockDetailsFn }), + }) + ); + asMockedFn(FirecloudBucket).mockReturnValue( + partial({ + getFeaturedWorkspaces: async () => [], + }) + ); + asMockedFn(Metrics).mockReturnValue(partial({ captureEvent: jest.fn() })); jest.useFakeTimers(); @@ -119,24 +114,21 @@ describe('WorkspaceList', () => { loading: false, status: 'Ready', }); - const mockDetailsFn: ReturnType['details'] = jest - .fn() - .mockResolvedValue({ workspace: { state } } satisfies DeepPartial); - const mockWorkspacesFn = jest.fn().mockReturnValue({ - details: mockDetailsFn, - } satisfies DeepPartial); - - const mockAjax: DeepPartial = { - Workspaces: { - workspace: mockWorkspacesFn, - }, - FirecloudBucket: { - getFeaturedWorkspaces: () => [], - }, - Metrics: { captureEvent: jest.fn() } as Partial, - }; - - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + const mockDetailsFn: WorkspaceContract['details'] = jest.fn().mockResolvedValue({ + workspace: { state }, + } satisfies DeepPartial); + const mockWorkspacesFn: () => WorkspaceContract = jest.fn().mockReturnValue( + partial({ + details: mockDetailsFn, + }) + ); + asMockedFn(Workspaces).mockReturnValue(partial({ workspace: mockWorkspacesFn })); + asMockedFn(FirecloudBucket).mockReturnValue( + partial({ + getFeaturedWorkspaces: async () => [], + }) + ); + asMockedFn(Metrics).mockReturnValue(partial({ captureEvent: jest.fn() })); jest.useFakeTimers(); @@ -191,31 +183,27 @@ describe('WorkspaceList', () => { loading: false, status: 'Ready', }); - const mockDeletingDetailsFn: ReturnType['details'] = jest - .fn() - .mockResolvedValue({ workspace: { state: 'Deleting' } } satisfies DeepPartial); - const mockCloningDetailsFn: ReturnType['details'] = jest - .fn() - .mockResolvedValue({ workspace: { state: 'Cloning' } } satisfies DeepPartial); - - const mockWorkspacesFn = jest.fn().mockImplementation((_, name) => { + const mockDeletingDetailsFn: WorkspaceContract['details'] = jest.fn().mockResolvedValue({ + workspace: { state: 'Deleting' }, + } satisfies DeepPartial); + const mockCloningDetailsFn: WorkspaceContract['details'] = jest.fn().mockResolvedValue({ + workspace: { state: 'Cloning' }, + } satisfies DeepPartial); + + const mockWorkspaceFn: () => WorkspaceContract = jest.fn().mockImplementation((_, name) => { const detailsFn = name === defaultAzureWorkspace.workspace.name ? mockDeletingDetailsFn : mockCloningDetailsFn; - return { + return partial({ details: detailsFn, - } satisfies DeepPartial; + }); }); - const mockAjax: DeepPartial = { - Workspaces: { - workspace: mockWorkspacesFn, - }, - FirecloudBucket: { - getFeaturedWorkspaces: () => [], - }, - Metrics: { captureEvent: jest.fn() } as Partial, - }; - - asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract); + asMockedFn(Workspaces).mockReturnValue(partial({ workspace: mockWorkspaceFn })); + asMockedFn(FirecloudBucket).mockReturnValue( + partial({ + getFeaturedWorkspaces: async () => [], + }) + ); + asMockedFn(Metrics).mockReturnValue(partial({ captureEvent: jest.fn() })); jest.useFakeTimers(); @@ -236,22 +224,22 @@ describe('WorkspaceList', () => { await waitFor(() => expect(mockDeletingDetailsFn).toBeCalledTimes(2)); await waitFor(() => expect(mockCloningDetailsFn).toBeCalledTimes(2)); - expect(mockWorkspacesFn).toHaveBeenNthCalledWith( + expect(mockWorkspaceFn).toHaveBeenNthCalledWith( 1, defaultAzureWorkspace.workspace.namespace, defaultAzureWorkspace.workspace.name ); - expect(mockWorkspacesFn).toHaveBeenNthCalledWith( + expect(mockWorkspaceFn).toHaveBeenNthCalledWith( 2, defaultGoogleWorkspace.workspace.namespace, defaultGoogleWorkspace.workspace.name ); - expect(mockWorkspacesFn).toHaveBeenNthCalledWith( + expect(mockWorkspaceFn).toHaveBeenNthCalledWith( 3, defaultAzureWorkspace.workspace.namespace, defaultAzureWorkspace.workspace.name ); - expect(mockWorkspacesFn).toHaveBeenNthCalledWith( + expect(mockWorkspaceFn).toHaveBeenNthCalledWith( 4, defaultGoogleWorkspace.workspace.namespace, defaultGoogleWorkspace.workspace.name diff --git a/src/workspaces/list/WorkspacesList.ts b/src/workspaces/list/WorkspacesList.ts index e9295a10be..ba48917114 100644 --- a/src/workspaces/list/WorkspacesList.ts +++ b/src/workspaces/list/WorkspacesList.ts @@ -6,7 +6,7 @@ import { Link, topSpinnerOverlay, transparentSpinnerOverlay } from 'src/componen import FooterWrapper from 'src/components/FooterWrapper'; import { icon } from 'src/components/icons'; import { TopBar } from 'src/components/TopBar'; -import { Ajax } from 'src/libs/ajax'; +import { FirecloudBucket } from 'src/libs/ajax/firecloud/FirecloudBucket'; import { withErrorIgnoring } from 'src/libs/error'; import { updateSearch, useRoute } from 'src/libs/nav'; import { useOnMount } from 'src/libs/react-utils'; @@ -79,7 +79,7 @@ export const WorkspacesList = (): ReactNode => { useOnMount(() => { const loadFeatured = withErrorIgnoring(async () => { - setFeaturedList(await Ajax().FirecloudBucket.getFeaturedWorkspaces()); + setFeaturedList(await FirecloudBucket().getFeaturedWorkspaces()); }); loadFeatured(); }); diff --git a/yarn.lock b/yarn.lock index f5c86b46e8..742d607813 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3559,114 +3559,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.3" +"@rollup/rollup-android-arm-eabi@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-android-arm64@npm:4.21.3" +"@rollup/rollup-android-arm64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-android-arm64@npm:4.24.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-darwin-arm64@npm:4.21.3" +"@rollup/rollup-darwin-arm64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.24.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-darwin-x64@npm:4.21.3" +"@rollup/rollup-darwin-x64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.24.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.3" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.3" +"@rollup/rollup-linux-arm-musleabihf@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.3" +"@rollup/rollup-linux-arm64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.3" +"@rollup/rollup-linux-arm64-musl@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.3" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.3" +"@rollup/rollup-linux-riscv64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.3" +"@rollup/rollup-linux-s390x-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.3" +"@rollup/rollup-linux-x64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.3" +"@rollup/rollup-linux-x64-musl@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.3" +"@rollup/rollup-win32-arm64-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.3" +"@rollup/rollup-win32-ia32-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.21.3": - version: 4.21.3 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.3" +"@rollup/rollup-win32-x64-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5335,10 +5335,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 languageName: node linkType: hard @@ -16483,26 +16483,26 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.21.3 - resolution: "rollup@npm:4.21.3" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.21.3 - "@rollup/rollup-android-arm64": 4.21.3 - "@rollup/rollup-darwin-arm64": 4.21.3 - "@rollup/rollup-darwin-x64": 4.21.3 - "@rollup/rollup-linux-arm-gnueabihf": 4.21.3 - "@rollup/rollup-linux-arm-musleabihf": 4.21.3 - "@rollup/rollup-linux-arm64-gnu": 4.21.3 - "@rollup/rollup-linux-arm64-musl": 4.21.3 - "@rollup/rollup-linux-powerpc64le-gnu": 4.21.3 - "@rollup/rollup-linux-riscv64-gnu": 4.21.3 - "@rollup/rollup-linux-s390x-gnu": 4.21.3 - "@rollup/rollup-linux-x64-gnu": 4.21.3 - "@rollup/rollup-linux-x64-musl": 4.21.3 - "@rollup/rollup-win32-arm64-msvc": 4.21.3 - "@rollup/rollup-win32-ia32-msvc": 4.21.3 - "@rollup/rollup-win32-x64-msvc": 4.21.3 - "@types/estree": 1.0.5 + version: 4.24.0 + resolution: "rollup@npm:4.24.0" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.24.0 + "@rollup/rollup-android-arm64": 4.24.0 + "@rollup/rollup-darwin-arm64": 4.24.0 + "@rollup/rollup-darwin-x64": 4.24.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.24.0 + "@rollup/rollup-linux-arm-musleabihf": 4.24.0 + "@rollup/rollup-linux-arm64-gnu": 4.24.0 + "@rollup/rollup-linux-arm64-musl": 4.24.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.24.0 + "@rollup/rollup-linux-riscv64-gnu": 4.24.0 + "@rollup/rollup-linux-s390x-gnu": 4.24.0 + "@rollup/rollup-linux-x64-gnu": 4.24.0 + "@rollup/rollup-linux-x64-musl": 4.24.0 + "@rollup/rollup-win32-arm64-msvc": 4.24.0 + "@rollup/rollup-win32-ia32-msvc": 4.24.0 + "@rollup/rollup-win32-x64-msvc": 4.24.0 + "@types/estree": 1.0.6 fsevents: ~2.3.2 dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -16541,7 +16541,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 19689840d25ced3924124b012d7e0048f2b0844a0765a5dde0804ae9961af1103657c2ec3e90f7a19876ebe40b3fa2c33f53fca071d46639c57bd327b82aba22 + checksum: b7e915b0cc43749c2c71255ff58858496460b1a75148db2abecc8e9496af83f488517768593826715f610e20e480a5ae7f1132a1408eb1d364830d6b239325cf languageName: node linkType: hard