From 0e4c1cc6296e8318f43efa5805b78adfa9eeaeba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 08:12:07 -0500 Subject: [PATCH 01/19] Bump @swc/core from 1.3.21 to 1.3.22 (#6735) Bumps [@swc/core](https://github.com/swc-project/swc) from 1.3.21 to 1.3.22. - [Release notes](https://github.com/swc-project/swc/releases) - [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md) - [Commits](https://github.com/swc-project/swc/compare/v1.3.21...v1.3.22) --- updated-dependencies: - dependency-name: "@swc/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 108 +++++++++++++++++++++++++-------------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index efd3e8cc06..bdf8c954ef 100644 --- a/package.json +++ b/package.json @@ -289,7 +289,7 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@sentry/types": "^6.19.7", "@swc/cli": "^0.1.57", - "@swc/core": "^1.3.21", + "@swc/core": "^1.3.22", "@swc/jest": "^0.2.24", "@testing-library/dom": "^7.31.2", "@testing-library/jest-dom": "^5.16.5", diff --git a/yarn.lock b/yarn.lock index 032aae3cc1..f5c195f43f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1734,71 +1734,71 @@ slash "3.0.0" source-map "^0.7.3" -"@swc/core-darwin-arm64@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.21.tgz#9fe6d5c4c3ca0854194ab7d3e42ac29cda422abf" - integrity sha512-5dBrJyrCzdHOQ9evS9NBJm2geKcXffIuAvSrnwbMHkfTpl+pOM7crry2tolydFXdOE/Jbx8yyahAIXPne1fTHw== +"@swc/core-darwin-arm64@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.22.tgz#296db00b567d7fab0fc438eccc7334b53d54e2f2" + integrity sha512-MMhtPsuXp8gpUgr9bs+RZQ2IyFGiUNDG93usCDAFgAF+6VVp+YaAVjET/3/Bx5Lk2WAt0RxT62C9KTEw1YMo3w== -"@swc/core-darwin-x64@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.21.tgz#6fb005ff27c5521534dd75732973182f45836681" - integrity sha512-CAtzfsRoVZr7DLKOOWPua6npFdj06wRuv1us275CY2QS3mg1bPl9BxA3c94q3mMcu5Bf06+dzUOjJSGrsBD7Ig== +"@swc/core-darwin-x64@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.22.tgz#3922972fccaa8c42e5bb1ec3f784e88b884bc3c7" + integrity sha512-SG6QbNat4GZ5VJU3Zo6a54oQOtbhJVE6BCQw4JjOCZJmAeBzNebGy9wsT4+fCJNHC3C5qtaRw7ToXJvLniXwfg== -"@swc/core-linux-arm-gnueabihf@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.21.tgz#3c54f62c1718408993b82ae4726c081e3271f002" - integrity sha512-oPO7oFr89pjDFlHJ2aZvzGR6hwy5nmQyeiuqpTgfn+RFFLLbipFawJe/2NBWyD35bxuguW6a3/w9I6edKTpLUw== +"@swc/core-linux-arm-gnueabihf@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.22.tgz#5484415986e6c498f295b73c0d9dffb777237ca6" + integrity sha512-4E+TdQT1oHnHjDaPs/DyrRy9lOuFd6ncEd67yYA4j9lFqt6nuz/jnXss45k8KU7wR5kOTtdW73xPwkU4NbOWdw== -"@swc/core-linux-arm64-gnu@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.21.tgz#7a4e17420ad98f35712cd2cbde46b8a78c39beb3" - integrity sha512-cgPw35T8HO4gB/tvPJMwjJuNNpydmw6U5hkxZ+7jiE+qA8hN8a71i+BBfXeSzlo60t4c44+zK4t+gK7UacZg2w== +"@swc/core-linux-arm64-gnu@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.22.tgz#951406151966225e4082cc643aa202f18f6d0bcf" + integrity sha512-6VcynOMbOBcbLutIPENI3Ejvg5LGz/Pwvzm25hM0FoiEtPxHA+tawQUwLx8Alk1Yr+Rnqid06UEZ0veJOGn2pQ== -"@swc/core-linux-arm64-musl@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.21.tgz#2b98140cc6dcd23c28f823a8ab8d61df8f876aed" - integrity sha512-kwH+HHtcakSqR3gF5QJ7N7SPs96ilFiXuauB02Ct3UflaGbVYVoeFYj/VEIJ+ZJvlvvOEDByOiLyrk2bw0bG7A== +"@swc/core-linux-arm64-musl@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.22.tgz#1f63fa7e3e61b00f9102e49f60520377491b61d6" + integrity sha512-86RxGy0L3qa4De3xWHx8vL2caTxvSLSWTlgUW/Yd4l1pvrCFibMjhkImGu5ViKiReX9DlBtJ7CBs4dln2kHidw== -"@swc/core-linux-x64-gnu@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.21.tgz#6dc8105f6a6252322010896e79ad8a12269862ed" - integrity sha512-/kLQLNxwdX6kO2R751uUrxXZsAhOkA1EeQzAqj+5Y+bzt3hA5asH5evkY0w0Aj1zCofX4p4o/Q35mandUPxMlw== +"@swc/core-linux-x64-gnu@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.22.tgz#64a38d253c7cdc8944980fa1f8cb3b6fc260afd1" + integrity sha512-FLkbiqsdXsVIFZi6iedx4rSBGX8x0vo/5aDlklSxJAAYOcQpO0QADKP5Yr65iMT1d6ABCt2d+/StpGLF7GWOcA== -"@swc/core-linux-x64-musl@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.21.tgz#e94eeecf389b441f09cf2de712caf5c9d0a0d5da" - integrity sha512-s+l3LqUzDli6rbmIPR3IfO23IOLYBVxk97CDdcJWrRTVtCwUKFhFVJVZyErveriqLXSGJhy5+UL+aOuxC4dk8g== +"@swc/core-linux-x64-musl@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.22.tgz#33f6abf28cc26eba1979e488776e006a09285463" + integrity sha512-giBuw+Z0Bq6fpZ0Y5TcfpcQwf9p/cE1fOQyO/K1XSTn/haQOqFi7421Jq/dFThSARZiXw1u9Om9VFbwxr8VI+A== -"@swc/core-win32-arm64-msvc@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.21.tgz#07374179e0422ad7352430e8b8fd7fd0f92e099c" - integrity sha512-59gWcdbZxvmyzh+J50yCCodKDYRUnMwNypzzfamF1Vusa4Np+IGMWEaE2KsZUq50OQIRo0PGHpBPMKVYkuGv8g== +"@swc/core-win32-arm64-msvc@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.22.tgz#4b5a05157d5d442866d543090a52b2a9624766bc" + integrity sha512-loKGO+ZM2By6VdrmVJk1G79jVgDPaee93qLFuis5KyeoLLb4m1MlNMc/6SIDZUSuYg6NqaGP1spFeiFetMQ4Zg== -"@swc/core-win32-ia32-msvc@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.21.tgz#abc4aa533a21da7c0812698ba485314797032edf" - integrity sha512-3gH86ffVAiCmeRy+xSxR5iWSbKy4nUddo4PIahD1zwGJx6LC5ahC/I6EpL1pvoX3KdJKVioUBn0KDfPDUYfqJw== +"@swc/core-win32-ia32-msvc@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.22.tgz#ec067667b7a665ef3b4fe97c3aa4c1d15e3a496d" + integrity sha512-lvNWAZ3QjXMsrsch6oLLQVikT/hC/4ZcLrTBXa14HwQylaYigkGElgp3ekJr78HjWDPwB46GXwBbNMG0VNAfvA== -"@swc/core-win32-x64-msvc@1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.21.tgz#2d5264370a737e0842434988f9afe9924cc0c4b6" - integrity sha512-JKWLJdJ3oFc8fGBk4P6mGKhW8n+FmEjLLbsST+h94bZmelrSTeShBt3rr+pMMatFevlu/c9lM3OW2GHsZeZNkg== +"@swc/core-win32-x64-msvc@1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.22.tgz#fb820b1aa03605363d141c9656d966a25000790f" + integrity sha512-ESyn4lZXAKEE3mcTaDfXatsolCiEfVGstsXdgBmZYa6o1IE1bDW8FE7Ob/Y+82WTpm9+A9ZYXYjZ62t67POHZg== -"@swc/core@^1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.21.tgz#5168604c9bcd81740d8aa3a602a2a64dbb9377d1" - integrity sha512-RTmqkm5e5sb+Q+YbyqiE52xjvX+kcIVDgaSdSD7mNy2opgDfIdFMhExmB8UQStt3TLrlpAslWaFNWNmvaHP9rg== +"@swc/core@^1.3.22": + version "1.3.22" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.22.tgz#2b631f7b54d6e11eb2e8ae505bca1dbbc6fb7160" + integrity sha512-oQ9EPEb7NgWcGIDoVfLCuffvtC4MzVtrwjqwKzFHP8FUh1fn8+2wraOjkkDXW74BB4Hgve5ykkaHix9bebB9Ww== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.21" - "@swc/core-darwin-x64" "1.3.21" - "@swc/core-linux-arm-gnueabihf" "1.3.21" - "@swc/core-linux-arm64-gnu" "1.3.21" - "@swc/core-linux-arm64-musl" "1.3.21" - "@swc/core-linux-x64-gnu" "1.3.21" - "@swc/core-linux-x64-musl" "1.3.21" - "@swc/core-win32-arm64-msvc" "1.3.21" - "@swc/core-win32-ia32-msvc" "1.3.21" - "@swc/core-win32-x64-msvc" "1.3.21" + "@swc/core-darwin-arm64" "1.3.22" + "@swc/core-darwin-x64" "1.3.22" + "@swc/core-linux-arm-gnueabihf" "1.3.22" + "@swc/core-linux-arm64-gnu" "1.3.22" + "@swc/core-linux-arm64-musl" "1.3.22" + "@swc/core-linux-x64-gnu" "1.3.22" + "@swc/core-linux-x64-musl" "1.3.22" + "@swc/core-win32-arm64-msvc" "1.3.22" + "@swc/core-win32-ia32-msvc" "1.3.22" + "@swc/core-win32-x64-msvc" "1.3.22" "@swc/jest@^0.2.24": version "0.2.24" From 02b505dba735c63043e10ae2dd943a64777f7d6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 08:14:09 -0500 Subject: [PATCH 02/19] Bump typedoc from 0.23.21 to 0.23.22 (#6736) Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.23.21 to 0.23.22. - [Release notes](https://github.com/TypeStrong/TypeDoc/releases) - [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.23.21...v0.23.22) --- updated-dependencies: - dependency-name: typedoc dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index bdf8c954ef..f9418ad93d 100644 --- a/package.json +++ b/package.json @@ -413,7 +413,7 @@ "ts-node": "^10.9.1", "type-fest": "^2.14.0", "typed-emitter": "^1.4.0", - "typedoc": "0.23.21", + "typedoc": "0.23.22", "typedoc-plugin-markdown": "^3.13.6", "typescript": "^4.9.4", "typescript-plugin-css-modules": "^3.4.0", diff --git a/yarn.lock b/yarn.lock index f5c195f43f..1b64b3754d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8901,12 +8901,7 @@ markdown@^0.5.0: dependencies: nopt "~2.1.1" -marked@^4.0.19: - version "4.2.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.0.tgz#f1683b077626a6c53e28926b798a18184aa13a91" - integrity sha512-1qWHjHlBKwjnDfrkxd0L3Yx4LTad/WO7+d13YsXAC/ZfKj7p0xkLV3sDXJzfWgL7GfW4IBZwMAYWaz+ifyQouQ== - -marked@^4.2.3: +marked@^4.0.19, marked@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== @@ -12581,10 +12576,10 @@ typedoc-plugin-markdown@^3.13.6: dependencies: handlebars "^4.7.7" -typedoc@0.23.21: - version "0.23.21" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.21.tgz#2a6b0e155f91ffa9689086706ad7e3e4bc11d241" - integrity sha512-VNE9Jv7BgclvyH9moi2mluneSviD43dCE9pY8RWkO88/DrEgJZk9KpUk7WO468c9WWs/+aG6dOnoH7ccjnErhg== +typedoc@0.23.22: + version "0.23.22" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.22.tgz#e25281ca816cd92ecfdaf3ec336d27e7bebb69ac" + integrity sha512-5sJkjK60xp8A7YpcYniu3+Wf0QcgojEnhzHuCN+CkdpQkKRhOspon/9+sGTkGI8kjVkZs3KHrhltpQyVhRMVfw== dependencies: lunr "^2.3.9" marked "^4.0.19" From 7a0ada9571770197588fb4b459f9d178ee3c309a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 08:17:04 -0500 Subject: [PATCH 03/19] Bump @types/react-beautiful-dnd from 13.1.2 to 13.1.3 (#6737) * Bump @types/react-beautiful-dnd from 13.1.2 to 13.1.3 Bumps [@types/react-beautiful-dnd](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-beautiful-dnd) from 13.1.2 to 13.1.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-beautiful-dnd) --- updated-dependencies: - dependency-name: "@types/react-beautiful-dnd" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Fix type error Signed-off-by: Sebastian Malton Signed-off-by: dependabot[bot] Signed-off-by: Sebastian Malton Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Malton --- package.json | 2 +- src/renderer/components/hotbar/hotbar-menu.tsx | 13 ++++++++----- yarn.lock | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index f9418ad93d..eac4829181 100644 --- a/package.json +++ b/package.json @@ -324,7 +324,7 @@ "@types/proper-lockfile": "^4.1.2", "@types/randomcolor": "^0.5.7", "@types/react": "^17.0.45", - "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-beautiful-dnd": "^13.1.3", "@types/react-dom": "^17.0.16", "@types/react-router": "^5.1.19", "@types/react-router-dom": "^5.3.3", diff --git a/src/renderer/components/hotbar/hotbar-menu.tsx b/src/renderer/components/hotbar/hotbar-menu.tsx index 05e11bf659..53191c2d87 100644 --- a/src/renderer/components/hotbar/hotbar-menu.tsx +++ b/src/renderer/components/hotbar/hotbar-menu.tsx @@ -89,7 +89,7 @@ class NonInjectedHotbarMenu extends React.Component {item && ( diff --git a/yarn.lock b/yarn.lock index 1b64b3754d..d4803588ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2403,10 +2403,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-beautiful-dnd@^13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.2.tgz#510405abb09f493afdfd898bf83995dc6385c130" - integrity sha512-+OvPkB8CdE/bGdXKyIhc/Lm2U7UAYCCJgsqmopFmh9gbAudmslkI8eOrPDjg4JhwSE6wytz4a3/wRjKtovHVJg== +"@types/react-beautiful-dnd@^13.1.3": + version "13.1.3" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.3.tgz#9812f6086c4b77ce08c83120788d92084a26db0f" + integrity sha512-BNdmvONKtsrZq3AGrujECQrIn8cDT+fZsxBLXuX3YWY/nHfZinUFx4W88eS0rkcXzuLbXpKOsu/1WCMPMLEpPg== dependencies: "@types/react" "*" From 4af8fbaa345ddf714ea68947e265c9d2842bc214 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Tue, 13 Dec 2022 16:36:51 +0300 Subject: [PATCH 04/19] Using custom properties for z-index values (#6733) * Using custom properties for z-index values Signed-off-by: Alex Andreev * Reorder values Signed-off-by: Alex Andreev * Remove unused styles Signed-off-by: Alex Andreev * Different set of z-index css vars Signed-off-by: Alex Andreev * Revert z-index to main layout Signed-off-by: Alex Andreev Signed-off-by: Alex Andreev --- .../update-button/styles.module.scss | 1 - .../+namespaces/namespace-select-filter.scss | 1 - src/renderer/components/+welcome/welcome.scss | 2 +- .../add-remove-buttons.scss | 1 - src/renderer/components/app.scss | 19 ++++++------------- .../cluster-manager/cluster-manager.scss | 2 +- .../cluster-status.module.scss | 1 - src/renderer/components/dialog/dialog.scss | 2 +- .../components/dock/dock-tabs.module.scss | 2 +- src/renderer/components/dock/dock.scss | 2 +- src/renderer/components/drawer/drawer.scss | 2 +- .../editable-list/editable-list.scss | 1 - .../components/hotbar/hotbar-menu.scss | 1 + .../hotbar/hotbar-selector.module.scss | 2 +- .../kube-object-details.scss | 2 -- .../components/layout/main-layout.module.scss | 2 +- .../components/layout/setting-layout.scss | 2 +- .../layout/top-bar/top-bar.module.scss | 2 +- .../markdown-viewer/markdown-viewer.scss | 2 +- src/renderer/components/menu/menu.scss | 2 +- .../notifications/notifications.scss | 2 +- .../resizing-anchor/resizing-anchor.scss | 2 +- src/renderer/components/select/select.scss | 2 +- src/renderer/components/table/table-head.scss | 2 -- src/renderer/components/tooltip/tooltip.scss | 2 +- src/renderer/components/vars.scss | 6 ------ 26 files changed, 23 insertions(+), 44 deletions(-) diff --git a/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/styles.module.scss b/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/styles.module.scss index 14b607327b..ade34c8a76 100644 --- a/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/styles.module.scss +++ b/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/styles.module.scss @@ -33,7 +33,6 @@ height: 100%; left: 0; opacity: 0.15; - z-index: -1; transition: opacity 0.1s; } } diff --git a/src/renderer/components/+namespaces/namespace-select-filter.scss b/src/renderer/components/+namespaces/namespace-select-filter.scss index f227976b46..de82c192a0 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter.scss +++ b/src/renderer/components/+namespaces/namespace-select-filter.scss @@ -33,7 +33,6 @@ &::before, &::after { content: ' '; position: absolute; - z-index: 20; display: block; width: 8px; height: var(--font-size); diff --git a/src/renderer/components/+welcome/welcome.scss b/src/renderer/components/+welcome/welcome.scss index 0c87c062df..6e1ebbbced 100644 --- a/src/renderer/components/+welcome/welcome.scss +++ b/src/renderer/components/+welcome/welcome.scss @@ -7,7 +7,7 @@ text-align: center; width: 100%; height: 100%; - z-index: 1; + z-index: var(--z-index-base); h2 { color: var(--textColorAccent); diff --git a/src/renderer/components/add-remove-buttons/add-remove-buttons.scss b/src/renderer/components/add-remove-buttons/add-remove-buttons.scss index b2b462c027..ef3951c5e3 100644 --- a/src/renderer/components/add-remove-buttons/add-remove-buttons.scss +++ b/src/renderer/components/add-remove-buttons/add-remove-buttons.scss @@ -9,7 +9,6 @@ margin-right: $padding * 4; bottom: 0; right: 0; - z-index: 99; .Button { &.remove-button { diff --git a/src/renderer/components/app.scss b/src/renderer/components/app.scss index 434159eee0..38beffe3c3 100755 --- a/src/renderer/components/app.scss +++ b/src/renderer/components/app.scss @@ -27,6 +27,12 @@ --font-weight-normal: 400; --font-weight-bold: 500; --main-layout-header: 40px; + + --z-index-base: 0; + --z-index-above: 1; + --z-index-modals: 2; + --z-index-menus: 3; + --z-index-topmost: 9999; } *, *:before, *:after { @@ -249,19 +255,6 @@ iframe { } } -// app's common loading indicator, displaying on the route transitions -#loading { - position: absolute; - left: 50%; - top: 50%; - margin: -15px; - z-index: 1000; - - &.hidden { - display: none; - } -} - // hack-fix: remove crappy yellow background from auto-filled inputs in chrome @keyframes autofill-remove-bgc { to { diff --git a/src/renderer/components/cluster-manager/cluster-manager.scss b/src/renderer/components/cluster-manager/cluster-manager.scss index 7644d1f4d3..67d17676d0 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.scss +++ b/src/renderer/components/cluster-manager/cluster-manager.scss @@ -27,7 +27,7 @@ } .error { - z-index: 1; + z-index: var(--z-index-base); } #lens-views { diff --git a/src/renderer/components/cluster-manager/cluster-status.module.scss b/src/renderer/components/cluster-manager/cluster-status.module.scss index 194ef467db..a009434196 100644 --- a/src/renderer/components/cluster-manager/cluster-status.module.scss +++ b/src/renderer/components/cluster-manager/cluster-status.module.scss @@ -5,7 +5,6 @@ min-width: 350px; margin: auto; text-align: center; - z-index: 1; background: var(--mainBackground); width: 100%; height: 100%; diff --git a/src/renderer/components/dialog/dialog.scss b/src/renderer/components/dialog/dialog.scss index 4efb628881..ddc7590915 100644 --- a/src/renderer/components/dialog/dialog.scss +++ b/src/renderer/components/dialog/dialog.scss @@ -12,7 +12,7 @@ width: 100%; height: 100%; padding: $unit * 5; - z-index: $zIndex-dialog; + z-index: var(--z-index-modals); overscroll-behavior: none; // prevent swiping with touch-pad on MacOSX overflow: auto; diff --git a/src/renderer/components/dock/dock-tabs.module.scss b/src/renderer/components/dock/dock-tabs.module.scss index 4a68a00c8a..48edc4d22c 100644 --- a/src/renderer/components/dock/dock-tabs.module.scss +++ b/src/renderer/components/dock/dock-tabs.module.scss @@ -44,7 +44,7 @@ content: "\00A0"; position: sticky; min-width: 8px; - z-index: 1; + z-index: var(--z-index-base); } &::before { diff --git a/src/renderer/components/dock/dock.scss b/src/renderer/components/dock/dock.scss index 365d74bad1..2db21de66f 100644 --- a/src/renderer/components/dock/dock.scss +++ b/src/renderer/components/dock/dock.scss @@ -26,7 +26,7 @@ right: 0; left: 0; bottom: 0; - z-index: 100; + z-index: var(--z-index-base); } } diff --git a/src/renderer/components/drawer/drawer.scss b/src/renderer/components/drawer/drawer.scss index 2ef81a82dc..cb2944beeb 100644 --- a/src/renderer/components/drawer/drawer.scss +++ b/src/renderer/components/drawer/drawer.scss @@ -11,7 +11,7 @@ position: absolute; background: var(--contentColor); box-shadow: 0 0 $unit * 2 var(--boxShadow); - z-index: $zIndex-drawer; + z-index: var(--z-index-above); height: 100%; &.left { diff --git a/src/renderer/components/editable-list/editable-list.scss b/src/renderer/components/editable-list/editable-list.scss index 089c92bce0..cb61178099 100644 --- a/src/renderer/components/editable-list/editable-list.scss +++ b/src/renderer/components/editable-list/editable-list.scss @@ -37,7 +37,6 @@ &::before, &::after { content: ' '; position: absolute; - z-index: 20; display: block; width: 8px; height: var(--font-size); diff --git a/src/renderer/components/hotbar/hotbar-menu.scss b/src/renderer/components/hotbar/hotbar-menu.scss index d92e325350..9d09e04c1a 100644 --- a/src/renderer/components/hotbar/hotbar-menu.scss +++ b/src/renderer/components/hotbar/hotbar-menu.scss @@ -12,6 +12,7 @@ padding-top: 1px; width: var(--hotbar-width); overflow: hidden; + isolation: isolate; &.draggingOver::after { content: " "; diff --git a/src/renderer/components/hotbar/hotbar-selector.module.scss b/src/renderer/components/hotbar/hotbar-selector.module.scss index a8154c4579..1318b30d1f 100644 --- a/src/renderer/components/hotbar/hotbar-selector.module.scss +++ b/src/renderer/components/hotbar/hotbar-selector.module.scss @@ -40,7 +40,7 @@ } &:focus-visible { - z-index: 1; + z-index: var(--z-index-base); } } } diff --git a/src/renderer/components/kube-object-details/kube-object-details.scss b/src/renderer/components/kube-object-details/kube-object-details.scss index 678652a244..58676aff2e 100644 --- a/src/renderer/components/kube-object-details/kube-object-details.scss +++ b/src/renderer/components/kube-object-details/kube-object-details.scss @@ -4,8 +4,6 @@ */ .KubeObjectDetails { - z-index: $zIndex-drawer + 1 !important; - .drawer-title { .Menu { border: none; diff --git a/src/renderer/components/layout/main-layout.module.scss b/src/renderer/components/layout/main-layout.module.scss index e882310427..d12331cb3b 100644 --- a/src/renderer/components/layout/main-layout.module.scss +++ b/src/renderer/components/layout/main-layout.module.scss @@ -11,7 +11,7 @@ grid-template-rows: [contents] 1fr [footer] auto; grid-template-columns: [sidebar] var(--sidebar-width) [contents] 1fr; width: 100%; - z-index: 1; + z-index: var(--z-index-base); height: 100%; } diff --git a/src/renderer/components/layout/setting-layout.scss b/src/renderer/components/layout/setting-layout.scss index b37a68a569..611fd0aa7b 100644 --- a/src/renderer/components/layout/setting-layout.scss +++ b/src/renderer/components/layout/setting-layout.scss @@ -10,7 +10,7 @@ display: grid; color: var(--settingsColor); position: fixed; - z-index: 13!important; + z-index: var(--z-index-modals); left: 0; top: 0; right: 0; diff --git a/src/renderer/components/layout/top-bar/top-bar.module.scss b/src/renderer/components/layout/top-bar/top-bar.module.scss index 7b3646dec3..acb0d51b09 100644 --- a/src/renderer/components/layout/top-bar/top-bar.module.scss +++ b/src/renderer/components/layout/top-bar/top-bar.module.scss @@ -5,7 +5,7 @@ .topBar { background-color: var(--layoutBackground); - z-index: 2; + z-index: var(--z-index-above); grid-area: topbar; height: var(--main-layout-header); diff --git a/src/renderer/components/markdown-viewer/markdown-viewer.scss b/src/renderer/components/markdown-viewer/markdown-viewer.scss index 62397dba24..e38ccda5c8 100644 --- a/src/renderer/components/markdown-viewer/markdown-viewer.scss +++ b/src/renderer/components/markdown-viewer/markdown-viewer.scss @@ -658,7 +658,7 @@ :checked + .radio-label { position: relative; - z-index: 1; + z-index: var(--z-index-base); border-color: #4078c0; } diff --git a/src/renderer/components/menu/menu.scss b/src/renderer/components/menu/menu.scss index 30e92d2a75..baee399b7f 100644 --- a/src/renderer/components/menu/menu.scss +++ b/src/renderer/components/menu/menu.scss @@ -12,7 +12,7 @@ background: var(--bgc); list-style: none; border: 1px solid var(--borderColor); - z-index: 101; + z-index: var(--z-index-menus); box-shadow: rgb(0 0 0 / 17%) 0px 6px 9px 0px; border-radius: 4px; diff --git a/src/renderer/components/notifications/notifications.scss b/src/renderer/components/notifications/notifications.scss index f91ebde44c..82d1246b4f 100644 --- a/src/renderer/components/notifications/notifications.scss +++ b/src/renderer/components/notifications/notifications.scss @@ -11,7 +11,7 @@ top: 0; padding: $padding * 2; max-height: 100vh; - z-index: 100000; + z-index: var(--z-index-topmost); height: min-content!important; &:empty { diff --git a/src/renderer/components/resizing-anchor/resizing-anchor.scss b/src/renderer/components/resizing-anchor/resizing-anchor.scss index bcdb159a43..7e18e789c5 100644 --- a/src/renderer/components/resizing-anchor/resizing-anchor.scss +++ b/src/renderer/components/resizing-anchor/resizing-anchor.scss @@ -13,7 +13,7 @@ body.resizing { $dimension: 12px; position: absolute; - z-index: 10; + z-index: var(--z-index-base); &::after { content: " "; diff --git a/src/renderer/components/select/select.scss b/src/renderer/components/select/select.scss index 1cc50a2c00..68532e844c 100644 --- a/src/renderer/components/select/select.scss +++ b/src/renderer/components/select/select.scss @@ -145,7 +145,7 @@ html { //-- Themes .Select__menu { - z-index: $zIndex-select-portal; // render at the top when used inside dialog + z-index: var(--z-index-menus); // render at the top when used inside dialog } .Select, .Select__menu { diff --git a/src/renderer/components/table/table-head.scss b/src/renderer/components/table/table-head.scss index ff9c6afec7..e926d5e1f0 100644 --- a/src/renderer/components/table/table-head.scss +++ b/src/renderer/components/table/table-head.scss @@ -15,9 +15,7 @@ } &.sticky { - position: -webkit-sticky; // safari position: sticky; - z-index: 1; top: 0; } diff --git a/src/renderer/components/tooltip/tooltip.scss b/src/renderer/components/tooltip/tooltip.scss index 10b7669679..38af5f709e 100644 --- a/src/renderer/components/tooltip/tooltip.scss +++ b/src/renderer/components/tooltip/tooltip.scss @@ -24,7 +24,7 @@ text-align: center; pointer-events: none; transition: opacity 150ms 150ms ease-in-out; - z-index: 100000; + z-index: var(--z-index-topmost); box-shadow: 0 8px 16px rgba(0,0,0,0.24); left: 0; top: 0; diff --git a/src/renderer/components/vars.scss b/src/renderer/components/vars.scss index 2a4deb6f30..b22341d572 100755 --- a/src/renderer/components/vars.scss +++ b/src/renderer/components/vars.scss @@ -21,12 +21,6 @@ $font-weight-thin: var(--font-weight-thin); $font-weight-normal: var(--font-weight-normal); $font-weight-bold: var(--font-weight-bold); -// Z-index correlations -$zIndex-sidebar-hover: 500; -$zIndex-select-portal: 300; -$zIndex-dialog: 200; -$zIndex-drawer: 100; - // Animation timing functions $animation-curve-fast-out-slow-in: cubic-bezier(0.4, 0, 0.2, 1); $animation-curve-linear-out-slow-in: cubic-bezier(0, 0, 0.2, 1); From c47b7cbf7f50dbed0999950d9a7349231c166908 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:36:36 -0500 Subject: [PATCH 05/19] Bump esbuild from 0.16.3 to 0.16.5 (#6747) Bumps [esbuild](https://github.com/evanw/esbuild) from 0.16.3 to 0.16.5. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.16.3...v0.16.5) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 228 +++++++++++++++++++++++++-------------------------- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index eac4829181..47d90b22d9 100644 --- a/package.json +++ b/package.json @@ -364,7 +364,7 @@ "electron": "^19.1.9", "electron-builder": "^23.6.0", "electron-notarize": "^0.3.0", - "esbuild": "^0.16.3", + "esbuild": "^0.16.5", "esbuild-loader": "^2.20.0", "eslint": "^8.29.0", "eslint-import-resolver-typescript": "^3.5.2", diff --git a/yarn.lock b/yarn.lock index d4803588ef..f42ec46125 100644 --- a/yarn.lock +++ b/yarn.lock @@ -598,125 +598,125 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@esbuild/android-arm64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.3.tgz#6af6d16be6d534d776a51fc215bfd81a68906d2c" - integrity sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg== +"@esbuild/android-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.5.tgz#4d86e00dee422c76a86904d6b863d115db34f862" + integrity sha512-BCWkmAqFoW6xXzz6Up16bU0vdZqe23UxkrabbrmXXUuH27Tts3LVcHFCi/dGLYa6ZqC/txhtJm2kAJdoyOfHxg== "@esbuild/android-arm@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== -"@esbuild/android-arm@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.3.tgz#2a091222f3b1928e3246fb3c5202eaca88baab67" - integrity sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA== +"@esbuild/android-arm@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.5.tgz#e6dd899ab0727d31c04309b6db2fb70ca4331af1" + integrity sha512-eNkNuLSKpbZTH0BZklJ9B9Sml7fTIamhrQNBwftsEHCUuSLBVunzV3LfghryVGpE5lSkOwOfeX6gR6+3yLaEfQ== -"@esbuild/android-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.3.tgz#a6d749c58b022d371dc40d50ac1bb4aebd1eb953" - integrity sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ== +"@esbuild/android-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.5.tgz#c5237c582bb038a9403afe5ad7e451cc79187505" + integrity sha512-E0R7d0dy9+QlpMps8gJXXhtfn+fQFaTXbq8kV2u/HfHyyhxr4nIIuXZCcYxxA9LSKnsFBBbSQIGDUVY9FGgx0w== -"@esbuild/darwin-arm64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.3.tgz#92d1826ed2f21dcac5830b70d7215c6afbb744e2" - integrity sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw== +"@esbuild/darwin-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.5.tgz#6e553f4be193d25a5e7cb6a73077d407a64bd6ad" + integrity sha512-4HlbUMy50cRaHGVriBjShs46WRPshtnVOqkxEGhEuDuJhgZ3regpWzaQxXOcDXFvVwue8RiqDAAcOi/QlVLE6Q== -"@esbuild/darwin-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.3.tgz#7fc3570c2b16e9ff4fc178593a0a4adb1ae8ea57" - integrity sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ== +"@esbuild/darwin-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.5.tgz#a9c466dbeca614edb5fe1a9c1ccd97bce30301af" + integrity sha512-ZDCAxAPwbtKJ5YxRZusQKDFuywH+7YNKbilss0DCRPtXMxrKRZETcuSfcgIWGYBBc+ypdOazousx3yZss2Az0A== -"@esbuild/freebsd-arm64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.3.tgz#16735ce16f8c9a4e7289e9e259aa01a8d9874307" - integrity sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw== +"@esbuild/freebsd-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.5.tgz#e101c671b150a6e0fe06b5978f2005505afd97b8" + integrity sha512-w0dJ8om4KiagLCHURgwxXVWzi5xa0W7F5woMxzWO+LDCebrlyZUhCIbSXUKa4qD3XbdG7K4Y8N4mLDRMkZzMuw== -"@esbuild/freebsd-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.3.tgz#f4edd1464cb072799ed6b8ab5178478e71c13459" - integrity sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug== +"@esbuild/freebsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.5.tgz#79bf9368634f390d16f5032a9b6603f02b0d999b" + integrity sha512-qCdC0T7XUxngX8otO4nmPUE/cHZfvF8jk+GMr9qkAGP0nIMACD7t/AWoY2N5rsn5/dOJ1VKM/aMF4wCFBP5AqQ== -"@esbuild/linux-arm64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.3.tgz#4b7ae6fe3618d9a40d6ca39c6edc991ac1447203" - integrity sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ== +"@esbuild/linux-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.5.tgz#9025197f1d4007743d130413f7579607f943a0f2" + integrity sha512-h84QZmBhBdEclyxf9Wm/UESY6ITI7/gYLNvj/3emhDd0ILAqwHdWnMDmKqqubrMcpb1O4sWOYRm7EZ+Av8eGiQ== -"@esbuild/linux-arm@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.3.tgz#4b3e9f849822e16a76a70844c4db68075b259a58" - integrity sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ== +"@esbuild/linux-arm@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.5.tgz#4cc5ff0fc093610598f32f7fd5565326c0c4e5c6" + integrity sha512-6crdpqwFjl+DObBgwaJMtB+VWrZd87Jy05gQTERysc1ujnUJNCJzemUcRDT5hM34dzTYThlXfFW32qQy9QpPGQ== -"@esbuild/linux-ia32@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.3.tgz#2ff3936b91bfff62f9ecf7f6411ef399b29ed22d" - integrity sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA== +"@esbuild/linux-ia32@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.5.tgz#9d897e7fff2f31433fa2c7b00048738dc9d47a69" + integrity sha512-P1WNzGqy6ipvbt8iNoYY66+qUANCiM80D8bGJIU8jqSZ613eG0lUWBePi4xQazcNgIi9tSiCa9Ba3f4krXtQDw== "@esbuild/linux-loong64@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== -"@esbuild/linux-loong64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.3.tgz#ff8aa59f49d9ccbc1ff952ba1f5cd01a534562df" - integrity sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw== +"@esbuild/linux-loong64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.5.tgz#9fc800568028d1a1d5601375cd9f20f33fd91093" + integrity sha512-r8wKqs+rl4gIT/xDB6CHMaYcvvyZ7tWf5LulH9NsDvgQEy3gIXQPR4Oy9tYrjM75uKkvBv1uw15Iz4EWsvve9Q== -"@esbuild/linux-mips64el@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.3.tgz#5dd5e118071c3912df69beedbfd11fb117f0fe5e" - integrity sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw== +"@esbuild/linux-mips64el@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.5.tgz#ef9ee33e33c13771055f3726a3350cb0a4e1e550" + integrity sha512-0WMhOlwfeeAp6KMx3E6LZKDN6INk4Me8dwIw1XMSFvmE6r31vRnwXkrQlAk5FI44KZ/rIi+yynRZqEd7UJAV2g== -"@esbuild/linux-ppc64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.3.tgz#36c62e24eae7fa3f0d921506da8fc1e6098a1364" - integrity sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q== +"@esbuild/linux-ppc64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.5.tgz#175d4a6f7b304c63686059861f276151d015cf26" + integrity sha512-29x+DtRGcYH0Sh3QSnoF+D2SYkHLxwx5AugoGLIlVtcVqDb4fEb654d67k9VcAR2RiTAYUZ764KXzWB+ItQfgw== -"@esbuild/linux-riscv64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.3.tgz#f0fec8e7affb5bcc817fefc61a21cbb95539e393" - integrity sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ== +"@esbuild/linux-riscv64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.5.tgz#69fe8bc94f49fdcead8ed6144cb40e45920c4196" + integrity sha512-ZX4SSKOJUcuqFNDydfN4yCo9je9f1T72Pj+RLsAGRiuiREVCwRkXIBp810C01+MdPqYExp322kY78ISEq5XGLQ== -"@esbuild/linux-s390x@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.3.tgz#22e10edd6e91f53c2e1f60e46abd453d7794409b" - integrity sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ== +"@esbuild/linux-s390x@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.5.tgz#18d418673579081e7ec3c376b110cea832efadbc" + integrity sha512-pYY86RiLD1s5RN8q0aMhWD44NiHmAZxv2bSzaNlL63/ibWETld+m6F+MPh9+ZNOqGJw53E/0qHukYI5Lm+1k7A== -"@esbuild/linux-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.3.tgz#38388b73fd9eebe45b073d7d8099b9c2e54f7139" - integrity sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w== +"@esbuild/linux-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.5.tgz#3dadd838a89b38e0653fcd3d74455d965c6c400d" + integrity sha512-vsOwzKN+4NenUTyuoWLmg5dAuO8JKuLD9MXSeENA385XucuOZbblmOMwwgPlHsgVRtSjz38riqPJU2ALI/CWYQ== -"@esbuild/netbsd-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.3.tgz#e0270569567f1530b8dbe6d11d5b4930b9cc71ae" - integrity sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA== +"@esbuild/netbsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.5.tgz#ab0ffb19dc14c0efc2317372e4e4782fdb8cbd9c" + integrity sha512-ZhfELxpZLXg7OidX9MrjgQNhjhYx3GXm59EAQVZds8GTyOOPj+Hg7ttKenlXoV8PZVkoCm0dgoWXzhasZJGfWw== -"@esbuild/openbsd-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.3.tgz#3b16642d443848bca605f33ee3978a1890911e6d" - integrity sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg== +"@esbuild/openbsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.5.tgz#0f33fb3acb8ac207cd366576030d17688acd2c60" + integrity sha512-2HY2L0afN8IUgvxCAWY04bB6mhHSnC7YNGM2hmEkyAgP+n8jpZgGjiRokuk3AQ0g0IpX8h0KnS+xaznGEr5CGw== -"@esbuild/sunos-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.3.tgz#a838f247867380f0ae25ce1936dc5ab6f57b7734" - integrity sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw== +"@esbuild/sunos-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.5.tgz#9f0da4e9c594bdbe92c27fe1d3d1effb8f036ad3" + integrity sha512-Q7+HbDnW52LLW8YIU5h0sYZ23TvaaC0vuwiIbJUa91Qr77NKNJCe8stfunN1TRZo+6OwGpM3MrdUcUVUfr5wuA== -"@esbuild/win32-arm64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.3.tgz#bedd9bef5fb41f89ce2599f1761973cf6d6a67b6" - integrity sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg== +"@esbuild/win32-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.5.tgz#5ebb50418ed224061a049a59c876283962134cee" + integrity sha512-KcegNS7IgLm/cAcjIW3kZyLiZi/p8I+A2a6OonDA77em9xHewdA2yTA+9pO4gr77MkXATcnDAFBrWw5oLHIZkQ== -"@esbuild/win32-ia32@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.3.tgz#49800aa812d8cc35ceef61e8d3b01224684cc0b1" - integrity sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ== +"@esbuild/win32-ia32@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.5.tgz#57f008d3a2b8336ab0f7bd07431619c46921dbd0" + integrity sha512-ReUCJSzLNGH6WcvwjMzpEy2SX5GTZBeRTvCdklN4DT2YrgRIe82lYVikVHwA7fdiL3xHKvmdiicMqxE8QYmxrA== -"@esbuild/win32-x64@0.16.3": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.3.tgz#94047dae921949cfb308117d993c4b941291ae10" - integrity sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow== +"@esbuild/win32-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.5.tgz#9398d079a83b309b44021634ae6b4f7bc6a0cad0" + integrity sha512-q00Jasz6/wCOD2XxRj4GEwj27u1zfpiBniL1ip3/YGGcYtvOoGKCNSS47sufO/8ixEgrSYDlkglSd6CxcS7m0g== "@eslint/eslintrc@^1.3.3": version "1.3.3" @@ -5568,33 +5568,33 @@ esbuild@^0.15.6: esbuild-windows-64 "0.15.18" esbuild-windows-arm64 "0.15.18" -esbuild@^0.16.3: - version "0.16.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.3.tgz#5868632fa23f7a8547f2a4ea359c44e946515c94" - integrity sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg== +esbuild@^0.16.5: + version "0.16.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.5.tgz#4e14ef61a4c906cacc5f0d997d372ff815254b23" + integrity sha512-te0zG5CDzAxhnBKeddXUtK8xDnYL6jv100ekldhtUk0ALXPXcDAtuH0fAR7rbKwUdz3bOey6HVq2N+aWCKZ1cw== optionalDependencies: - "@esbuild/android-arm" "0.16.3" - "@esbuild/android-arm64" "0.16.3" - "@esbuild/android-x64" "0.16.3" - "@esbuild/darwin-arm64" "0.16.3" - "@esbuild/darwin-x64" "0.16.3" - "@esbuild/freebsd-arm64" "0.16.3" - "@esbuild/freebsd-x64" "0.16.3" - "@esbuild/linux-arm" "0.16.3" - "@esbuild/linux-arm64" "0.16.3" - "@esbuild/linux-ia32" "0.16.3" - "@esbuild/linux-loong64" "0.16.3" - "@esbuild/linux-mips64el" "0.16.3" - "@esbuild/linux-ppc64" "0.16.3" - "@esbuild/linux-riscv64" "0.16.3" - "@esbuild/linux-s390x" "0.16.3" - "@esbuild/linux-x64" "0.16.3" - "@esbuild/netbsd-x64" "0.16.3" - "@esbuild/openbsd-x64" "0.16.3" - "@esbuild/sunos-x64" "0.16.3" - "@esbuild/win32-arm64" "0.16.3" - "@esbuild/win32-ia32" "0.16.3" - "@esbuild/win32-x64" "0.16.3" + "@esbuild/android-arm" "0.16.5" + "@esbuild/android-arm64" "0.16.5" + "@esbuild/android-x64" "0.16.5" + "@esbuild/darwin-arm64" "0.16.5" + "@esbuild/darwin-x64" "0.16.5" + "@esbuild/freebsd-arm64" "0.16.5" + "@esbuild/freebsd-x64" "0.16.5" + "@esbuild/linux-arm" "0.16.5" + "@esbuild/linux-arm64" "0.16.5" + "@esbuild/linux-ia32" "0.16.5" + "@esbuild/linux-loong64" "0.16.5" + "@esbuild/linux-mips64el" "0.16.5" + "@esbuild/linux-ppc64" "0.16.5" + "@esbuild/linux-riscv64" "0.16.5" + "@esbuild/linux-s390x" "0.16.5" + "@esbuild/linux-x64" "0.16.5" + "@esbuild/netbsd-x64" "0.16.5" + "@esbuild/openbsd-x64" "0.16.5" + "@esbuild/sunos-x64" "0.16.5" + "@esbuild/win32-arm64" "0.16.5" + "@esbuild/win32-ia32" "0.16.5" + "@esbuild/win32-x64" "0.16.5" escalade@^3.1.1: version "3.1.1" From 1c5f9fd8782aefceb24bdec1d8259b1c103af1e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:36:53 -0500 Subject: [PATCH 06/19] Bump @types/node from 16.18.6 to 16.18.9 (#6746) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.18.6 to 16.18.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 47d90b22d9..9717bb74ff 100644 --- a/package.json +++ b/package.json @@ -320,7 +320,7 @@ "@types/memorystream": "^0.3.0", "@types/mini-css-extract-plugin": "^2.4.0", "@types/mock-fs": "^4.13.1", - "@types/node": "^16.18.6", + "@types/node": "^16.18.9", "@types/proper-lockfile": "^4.1.2", "@types/randomcolor": "^0.5.7", "@types/react": "^17.0.45", diff --git a/yarn.lock b/yarn.lock index f42ec46125..62e9fb52f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2348,10 +2348,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.24.tgz#20ba1bf69c1b4ab405c7a01e950c4f446b05029f" integrity sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g== -"@types/node@^16.11.26", "@types/node@^16.18.6": - version "16.18.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.6.tgz#87846192fd51b693368fad3e99123169225621d4" - integrity sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA== +"@types/node@^16.11.26", "@types/node@^16.18.9": + version "16.18.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.9.tgz#47c491cfbc10460571d766c16526748fa9ad96a1" + integrity sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ== "@types/parse-json@^4.0.0": version "4.0.0" From c843c8a1d7021046dfb4b26c13aa11a5ba059e58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:37:12 -0500 Subject: [PATCH 07/19] Bump @typescript-eslint/parser from 5.46.0 to 5.46.1 (#6745) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.46.0 to 5.46.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.46.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 48 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 9717bb74ff..fd47e88884 100644 --- a/package.json +++ b/package.json @@ -348,7 +348,7 @@ "@types/webpack-env": "^1.18.0", "@types/webpack-node-externals": "^2.5.3", "@typescript-eslint/eslint-plugin": "^5.46.0", - "@typescript-eslint/parser": "^5.46.0", + "@typescript-eslint/parser": "^5.46.1", "adr": "^1.4.3", "ansi_up": "^5.1.0", "chalk": "^4.1.2", diff --git a/yarn.lock b/yarn.lock index 62e9fb52f1..95f3669531 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2760,14 +2760,14 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.0.tgz#002d8e67122947922a62547acfed3347cbf2c0b6" - integrity sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA== +"@typescript-eslint/parser@^5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.1.tgz#1fc8e7102c1141eb64276c3b89d70da8c0ba5699" + integrity sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg== dependencies: - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/typescript-estree" "5.46.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.46.0": @@ -2778,6 +2778,14 @@ "@typescript-eslint/types" "5.46.0" "@typescript-eslint/visitor-keys" "5.46.0" +"@typescript-eslint/scope-manager@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz#70af8425c79bbc1178b5a63fb51102ddf48e104a" + integrity sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA== + dependencies: + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" + "@typescript-eslint/type-utils@5.46.0": version "5.46.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz#3a4507b3b437e2fd9e95c3e5eea5ae16f79d64b3" @@ -2793,6 +2801,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.0.tgz#f4d76622a996b88153bbd829ea9ccb9f7a5d28bc" integrity sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw== +"@typescript-eslint/types@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.1.tgz#4e9db2107b9a88441c4d5ecacde3bb7a5ebbd47e" + integrity sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== + "@typescript-eslint/typescript-estree@5.46.0": version "5.46.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz#a6c2b84b9351f78209a1d1f2d99ca553f7fa29a5" @@ -2806,6 +2819,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz#5358088f98a8f9939355e0996f9c8f41c25eced2" + integrity sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg== + dependencies: + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.46.0": version "5.46.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.0.tgz#600cd873ba471b7d8b0b9f35de34cf852c6fcb31" @@ -2828,6 +2854,14 @@ "@typescript-eslint/types" "5.46.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz#126cc6fe3c0f83608b2b125c5d9daced61394242" + integrity sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg== + dependencies: + "@typescript-eslint/types" "5.46.1" + eslint-visitor-keys "^3.3.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" From 406270e03e15118af199b6d99274de365d7b5bdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:45:02 -0500 Subject: [PATCH 08/19] Bump @typescript-eslint/eslint-plugin from 5.46.0 to 5.46.1 (#6744) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.46.0 to 5.46.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.46.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 74 ++++++++++++++-------------------------------------- 2 files changed, 21 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index fd47e88884..933775cf08 100644 --- a/package.json +++ b/package.json @@ -347,7 +347,7 @@ "@types/webpack-dev-server": "^4.7.2", "@types/webpack-env": "^1.18.0", "@types/webpack-node-externals": "^2.5.3", - "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/eslint-plugin": "^5.46.1", "@typescript-eslint/parser": "^5.46.1", "adr": "^1.4.3", "ansi_up": "^5.1.0", diff --git a/yarn.lock b/yarn.lock index 95f3669531..ecb923d675 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2745,14 +2745,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz#9a96a713b9616c783501a3c1774c9e2b40217ad0" - integrity sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q== +"@typescript-eslint/eslint-plugin@^5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz#098abb4c9354e19f460d57ab18bff1f676a6cff0" + integrity sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA== dependencies: - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/type-utils" "5.46.0" - "@typescript-eslint/utils" "5.46.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/type-utils" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -2770,14 +2770,6 @@ "@typescript-eslint/typescript-estree" "5.46.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz#60790b14d0c687dd633b22b8121374764f76ce0d" - integrity sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA== - dependencies: - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/visitor-keys" "5.46.0" - "@typescript-eslint/scope-manager@5.46.1": version "5.46.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz#70af8425c79bbc1178b5a63fb51102ddf48e104a" @@ -2786,39 +2778,21 @@ "@typescript-eslint/types" "5.46.1" "@typescript-eslint/visitor-keys" "5.46.1" -"@typescript-eslint/type-utils@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz#3a4507b3b437e2fd9e95c3e5eea5ae16f79d64b3" - integrity sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg== +"@typescript-eslint/type-utils@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz#195033e4b30b51b870dfcf2828e88d57b04a11cc" + integrity sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng== dependencies: - "@typescript-eslint/typescript-estree" "5.46.0" - "@typescript-eslint/utils" "5.46.0" + "@typescript-eslint/typescript-estree" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.0.tgz#f4d76622a996b88153bbd829ea9ccb9f7a5d28bc" - integrity sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw== - "@typescript-eslint/types@5.46.1": version "5.46.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.1.tgz#4e9db2107b9a88441c4d5ecacde3bb7a5ebbd47e" integrity sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== -"@typescript-eslint/typescript-estree@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz#a6c2b84b9351f78209a1d1f2d99ca553f7fa29a5" - integrity sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw== - dependencies: - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/visitor-keys" "5.46.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - "@typescript-eslint/typescript-estree@5.46.1": version "5.46.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz#5358088f98a8f9939355e0996f9c8f41c25eced2" @@ -2832,28 +2806,20 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.0.tgz#600cd873ba471b7d8b0b9f35de34cf852c6fcb31" - integrity sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g== +"@typescript-eslint/utils@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.1.tgz#7da3c934d9fd0eb4002a6bb3429f33298b469b4a" + integrity sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/typescript-estree" "5.46.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz#36d87248ae20c61ef72404bcd61f14aa2563915f" - integrity sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw== - dependencies: - "@typescript-eslint/types" "5.46.0" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@5.46.1": version "5.46.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz#126cc6fe3c0f83608b2b125c5d9daced61394242" From cb2ce209cbfc18c74b74ff5f5cb5955a651348c7 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 15 Dec 2022 06:28:31 -0800 Subject: [PATCH 09/19] Fix publishing @k8slens/extension package to NPM (#6758) Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton --- .github/workflows/publish-release-npm.yml | 5 ++--- .github/workflows/release.yml | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-release-npm.yml b/.github/workflows/publish-release-npm.yml index 0ce928e3d1..3aa6239284 100644 --- a/.github/workflows/publish-release-npm.yml +++ b/.github/workflows/publish-release-npm.yml @@ -1,8 +1,7 @@ name: Publish NPM Package Release on: - release: - types: - - published + workflow_call: + workflow_dispatch: jobs: publish: name: Publish NPM Package Release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f66347a93f..28b1a14bbd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,3 +28,6 @@ jobs: commit: master tag: ${{ steps.tagger.outputs.tagname }} body: ${{ github.event.pull_request.body }} + publish-npm: + uses: ./.github/workflows/publish-release-npm.yml + needs: release From b4d6dbeb2d75905f8a5db3f43cafeb10de5a02da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 09:43:02 -0500 Subject: [PATCH 10/19] Bump marked and @types/marked (#6753) Bumps [marked](https://github.com/markedjs/marked) and [@types/marked](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/marked). These dependencies needed to be updated together. Updates `marked` from 4.2.3 to 4.2.4 - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v4.2.3...v4.2.4) Updates `@types/marked` from 4.0.7 to 4.0.8 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/marked) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: "@types/marked" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 933775cf08..f9f4bd934f 100644 --- a/package.json +++ b/package.json @@ -238,7 +238,7 @@ "lens-node-menu": "file:./extensions/node-menu", "lens-pod-menu": "file:./extensions/pod-menu", "lodash": "^4.17.15", - "marked": "^4.2.3", + "marked": "^4.2.4", "md5-file": "^5.0.0", "metrics-cluster-feature": "file:./extensions/metrics-cluster-feature", "mobx": "^6.7.0", @@ -315,7 +315,7 @@ "@types/js-yaml": "^4.0.5", "@types/jsdom": "^16.2.14", "@types/lodash": "^4.14.191", - "@types/marked": "^4.0.7", + "@types/marked": "^4.0.8", "@types/md5-file": "^4.0.2", "@types/memorystream": "^0.3.0", "@types/mini-css-extract-plugin": "^2.4.0", diff --git a/yarn.lock b/yarn.lock index ecb923d675..eed2a01b84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2290,10 +2290,10 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== -"@types/marked@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.7.tgz#400a76809fd08c2bbd9e25f3be06ea38c8e0a1d3" - integrity sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw== +"@types/marked@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.8.tgz#b316887ab3499d0a8f4c70b7bd8508f92d477955" + integrity sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw== "@types/md5-file@^4.0.2": version "4.0.2" @@ -8901,10 +8901,10 @@ markdown@^0.5.0: dependencies: nopt "~2.1.1" -marked@^4.0.19, marked@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" - integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== +marked@^4.0.19, marked@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.4.tgz#5a4ce6c7a1ae0c952601fce46376ee4cf1797e1c" + integrity sha512-Wcc9ikX7Q5E4BYDPvh1C6QNSxrjC9tBgz+A/vAhp59KXUgachw++uMvMKiSW8oA85nopmPZcEvBoex/YLMsiyA== matcher-collection@^2.0.0: version "2.0.1" From 4875fb8a4dd2a44b12bf42df52cc073b22b7bbe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 09:43:12 -0500 Subject: [PATCH 11/19] Bump esbuild from 0.16.5 to 0.16.7 (#6755) Bumps [esbuild](https://github.com/evanw/esbuild) from 0.16.5 to 0.16.7. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.16.5...v0.16.7) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 228 +++++++++++++++++++++++++-------------------------- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index f9f4bd934f..0cc49f7576 100644 --- a/package.json +++ b/package.json @@ -364,7 +364,7 @@ "electron": "^19.1.9", "electron-builder": "^23.6.0", "electron-notarize": "^0.3.0", - "esbuild": "^0.16.5", + "esbuild": "^0.16.7", "esbuild-loader": "^2.20.0", "eslint": "^8.29.0", "eslint-import-resolver-typescript": "^3.5.2", diff --git a/yarn.lock b/yarn.lock index eed2a01b84..f76359a6a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -598,125 +598,125 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@esbuild/android-arm64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.5.tgz#4d86e00dee422c76a86904d6b863d115db34f862" - integrity sha512-BCWkmAqFoW6xXzz6Up16bU0vdZqe23UxkrabbrmXXUuH27Tts3LVcHFCi/dGLYa6ZqC/txhtJm2kAJdoyOfHxg== +"@esbuild/android-arm64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.7.tgz#2df472016c77dba3e79596a84da74c541698910f" + integrity sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw== "@esbuild/android-arm@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== -"@esbuild/android-arm@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.5.tgz#e6dd899ab0727d31c04309b6db2fb70ca4331af1" - integrity sha512-eNkNuLSKpbZTH0BZklJ9B9Sml7fTIamhrQNBwftsEHCUuSLBVunzV3LfghryVGpE5lSkOwOfeX6gR6+3yLaEfQ== +"@esbuild/android-arm@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.7.tgz#15f1a9b27b1637c38377b3e1f2d90b9782cdc141" + integrity sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g== -"@esbuild/android-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.5.tgz#c5237c582bb038a9403afe5ad7e451cc79187505" - integrity sha512-E0R7d0dy9+QlpMps8gJXXhtfn+fQFaTXbq8kV2u/HfHyyhxr4nIIuXZCcYxxA9LSKnsFBBbSQIGDUVY9FGgx0w== +"@esbuild/android-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.7.tgz#cb34b7d666bf52266061cfb1a19c1d788b6c5ac1" + integrity sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg== -"@esbuild/darwin-arm64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.5.tgz#6e553f4be193d25a5e7cb6a73077d407a64bd6ad" - integrity sha512-4HlbUMy50cRaHGVriBjShs46WRPshtnVOqkxEGhEuDuJhgZ3regpWzaQxXOcDXFvVwue8RiqDAAcOi/QlVLE6Q== +"@esbuild/darwin-arm64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.7.tgz#be1fabd0c2f6af111c16e9e9b18bf336c1e11634" + integrity sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg== -"@esbuild/darwin-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.5.tgz#a9c466dbeca614edb5fe1a9c1ccd97bce30301af" - integrity sha512-ZDCAxAPwbtKJ5YxRZusQKDFuywH+7YNKbilss0DCRPtXMxrKRZETcuSfcgIWGYBBc+ypdOazousx3yZss2Az0A== +"@esbuild/darwin-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.7.tgz#2206042ac4396bb18dd53b379df83bec47eeb5fb" + integrity sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w== -"@esbuild/freebsd-arm64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.5.tgz#e101c671b150a6e0fe06b5978f2005505afd97b8" - integrity sha512-w0dJ8om4KiagLCHURgwxXVWzi5xa0W7F5woMxzWO+LDCebrlyZUhCIbSXUKa4qD3XbdG7K4Y8N4mLDRMkZzMuw== +"@esbuild/freebsd-arm64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.7.tgz#ca52bd64b0bba69ae4063245366f25838357c332" + integrity sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ== -"@esbuild/freebsd-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.5.tgz#79bf9368634f390d16f5032a9b6603f02b0d999b" - integrity sha512-qCdC0T7XUxngX8otO4nmPUE/cHZfvF8jk+GMr9qkAGP0nIMACD7t/AWoY2N5rsn5/dOJ1VKM/aMF4wCFBP5AqQ== +"@esbuild/freebsd-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.7.tgz#bc01c146e6af5430c5eb325844de43f01e0264c4" + integrity sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g== -"@esbuild/linux-arm64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.5.tgz#9025197f1d4007743d130413f7579607f943a0f2" - integrity sha512-h84QZmBhBdEclyxf9Wm/UESY6ITI7/gYLNvj/3emhDd0ILAqwHdWnMDmKqqubrMcpb1O4sWOYRm7EZ+Av8eGiQ== +"@esbuild/linux-arm64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.7.tgz#23267ff1cdd2a8f150d5aca1d6d2a4dfd4be7909" + integrity sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg== -"@esbuild/linux-arm@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.5.tgz#4cc5ff0fc093610598f32f7fd5565326c0c4e5c6" - integrity sha512-6crdpqwFjl+DObBgwaJMtB+VWrZd87Jy05gQTERysc1ujnUJNCJzemUcRDT5hM34dzTYThlXfFW32qQy9QpPGQ== +"@esbuild/linux-arm@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.7.tgz#2c7cf7244e4b8a6f757a87a113d83d8a0c1f5297" + integrity sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ== -"@esbuild/linux-ia32@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.5.tgz#9d897e7fff2f31433fa2c7b00048738dc9d47a69" - integrity sha512-P1WNzGqy6ipvbt8iNoYY66+qUANCiM80D8bGJIU8jqSZ613eG0lUWBePi4xQazcNgIi9tSiCa9Ba3f4krXtQDw== +"@esbuild/linux-ia32@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.7.tgz#a15dc3edf6953c5414add4264fd8335f48775490" + integrity sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg== "@esbuild/linux-loong64@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== -"@esbuild/linux-loong64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.5.tgz#9fc800568028d1a1d5601375cd9f20f33fd91093" - integrity sha512-r8wKqs+rl4gIT/xDB6CHMaYcvvyZ7tWf5LulH9NsDvgQEy3gIXQPR4Oy9tYrjM75uKkvBv1uw15Iz4EWsvve9Q== +"@esbuild/linux-loong64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.7.tgz#b3ce8539cf307b543796530839cf62507d9c7e84" + integrity sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw== -"@esbuild/linux-mips64el@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.5.tgz#ef9ee33e33c13771055f3726a3350cb0a4e1e550" - integrity sha512-0WMhOlwfeeAp6KMx3E6LZKDN6INk4Me8dwIw1XMSFvmE6r31vRnwXkrQlAk5FI44KZ/rIi+yynRZqEd7UJAV2g== +"@esbuild/linux-mips64el@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.7.tgz#7c1c8f3de254b4e975ac2580bba187b87b959256" + integrity sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA== -"@esbuild/linux-ppc64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.5.tgz#175d4a6f7b304c63686059861f276151d015cf26" - integrity sha512-29x+DtRGcYH0Sh3QSnoF+D2SYkHLxwx5AugoGLIlVtcVqDb4fEb654d67k9VcAR2RiTAYUZ764KXzWB+ItQfgw== +"@esbuild/linux-ppc64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.7.tgz#72a00c9788f3ca5df56ecec060d5b92f945c9a2d" + integrity sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw== -"@esbuild/linux-riscv64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.5.tgz#69fe8bc94f49fdcead8ed6144cb40e45920c4196" - integrity sha512-ZX4SSKOJUcuqFNDydfN4yCo9je9f1T72Pj+RLsAGRiuiREVCwRkXIBp810C01+MdPqYExp322kY78ISEq5XGLQ== +"@esbuild/linux-riscv64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.7.tgz#545fd57e44dc3331a86956889f2a5b42bd116c9b" + integrity sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ== -"@esbuild/linux-s390x@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.5.tgz#18d418673579081e7ec3c376b110cea832efadbc" - integrity sha512-pYY86RiLD1s5RN8q0aMhWD44NiHmAZxv2bSzaNlL63/ibWETld+m6F+MPh9+ZNOqGJw53E/0qHukYI5Lm+1k7A== +"@esbuild/linux-s390x@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.7.tgz#a36fd4605904c49310616dd648c0c25a267a19c0" + integrity sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA== -"@esbuild/linux-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.5.tgz#3dadd838a89b38e0653fcd3d74455d965c6c400d" - integrity sha512-vsOwzKN+4NenUTyuoWLmg5dAuO8JKuLD9MXSeENA385XucuOZbblmOMwwgPlHsgVRtSjz38riqPJU2ALI/CWYQ== +"@esbuild/linux-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.7.tgz#104f3f8f3f25f1f26b70cee05470974861ca5a5e" + integrity sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg== -"@esbuild/netbsd-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.5.tgz#ab0ffb19dc14c0efc2317372e4e4782fdb8cbd9c" - integrity sha512-ZhfELxpZLXg7OidX9MrjgQNhjhYx3GXm59EAQVZds8GTyOOPj+Hg7ttKenlXoV8PZVkoCm0dgoWXzhasZJGfWw== +"@esbuild/netbsd-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.7.tgz#0fd59fea5e6b94ee82e81b3b389e561efe77b347" + integrity sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ== -"@esbuild/openbsd-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.5.tgz#0f33fb3acb8ac207cd366576030d17688acd2c60" - integrity sha512-2HY2L0afN8IUgvxCAWY04bB6mhHSnC7YNGM2hmEkyAgP+n8jpZgGjiRokuk3AQ0g0IpX8h0KnS+xaznGEr5CGw== +"@esbuild/openbsd-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.7.tgz#c04072a70f31be1bd47204955d2c71ca393c9eb4" + integrity sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA== -"@esbuild/sunos-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.5.tgz#9f0da4e9c594bdbe92c27fe1d3d1effb8f036ad3" - integrity sha512-Q7+HbDnW52LLW8YIU5h0sYZ23TvaaC0vuwiIbJUa91Qr77NKNJCe8stfunN1TRZo+6OwGpM3MrdUcUVUfr5wuA== +"@esbuild/sunos-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.7.tgz#11c4cd341be1de93cb5e3bf096f3b63ae1497626" + integrity sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ== -"@esbuild/win32-arm64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.5.tgz#5ebb50418ed224061a049a59c876283962134cee" - integrity sha512-KcegNS7IgLm/cAcjIW3kZyLiZi/p8I+A2a6OonDA77em9xHewdA2yTA+9pO4gr77MkXATcnDAFBrWw5oLHIZkQ== +"@esbuild/win32-arm64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.7.tgz#95091269394f16352e318124790a3906bf370141" + integrity sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg== -"@esbuild/win32-ia32@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.5.tgz#57f008d3a2b8336ab0f7bd07431619c46921dbd0" - integrity sha512-ReUCJSzLNGH6WcvwjMzpEy2SX5GTZBeRTvCdklN4DT2YrgRIe82lYVikVHwA7fdiL3xHKvmdiicMqxE8QYmxrA== +"@esbuild/win32-ia32@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.7.tgz#2bda285a0b7084a93417472c460b0209bef0c39d" + integrity sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg== -"@esbuild/win32-x64@0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.5.tgz#9398d079a83b309b44021634ae6b4f7bc6a0cad0" - integrity sha512-q00Jasz6/wCOD2XxRj4GEwj27u1zfpiBniL1ip3/YGGcYtvOoGKCNSS47sufO/8ixEgrSYDlkglSd6CxcS7m0g== +"@esbuild/win32-x64@0.16.7": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.7.tgz#966ac3fc41758e6843cbd5844b2466bbdc34dada" + integrity sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw== "@eslint/eslintrc@^1.3.3": version "1.3.3" @@ -5568,33 +5568,33 @@ esbuild@^0.15.6: esbuild-windows-64 "0.15.18" esbuild-windows-arm64 "0.15.18" -esbuild@^0.16.5: - version "0.16.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.5.tgz#4e14ef61a4c906cacc5f0d997d372ff815254b23" - integrity sha512-te0zG5CDzAxhnBKeddXUtK8xDnYL6jv100ekldhtUk0ALXPXcDAtuH0fAR7rbKwUdz3bOey6HVq2N+aWCKZ1cw== +esbuild@^0.16.7: + version "0.16.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.7.tgz#3288f685a83c6097dea8ddf1759ca30d6e06535b" + integrity sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A== optionalDependencies: - "@esbuild/android-arm" "0.16.5" - "@esbuild/android-arm64" "0.16.5" - "@esbuild/android-x64" "0.16.5" - "@esbuild/darwin-arm64" "0.16.5" - "@esbuild/darwin-x64" "0.16.5" - "@esbuild/freebsd-arm64" "0.16.5" - "@esbuild/freebsd-x64" "0.16.5" - "@esbuild/linux-arm" "0.16.5" - "@esbuild/linux-arm64" "0.16.5" - "@esbuild/linux-ia32" "0.16.5" - "@esbuild/linux-loong64" "0.16.5" - "@esbuild/linux-mips64el" "0.16.5" - "@esbuild/linux-ppc64" "0.16.5" - "@esbuild/linux-riscv64" "0.16.5" - "@esbuild/linux-s390x" "0.16.5" - "@esbuild/linux-x64" "0.16.5" - "@esbuild/netbsd-x64" "0.16.5" - "@esbuild/openbsd-x64" "0.16.5" - "@esbuild/sunos-x64" "0.16.5" - "@esbuild/win32-arm64" "0.16.5" - "@esbuild/win32-ia32" "0.16.5" - "@esbuild/win32-x64" "0.16.5" + "@esbuild/android-arm" "0.16.7" + "@esbuild/android-arm64" "0.16.7" + "@esbuild/android-x64" "0.16.7" + "@esbuild/darwin-arm64" "0.16.7" + "@esbuild/darwin-x64" "0.16.7" + "@esbuild/freebsd-arm64" "0.16.7" + "@esbuild/freebsd-x64" "0.16.7" + "@esbuild/linux-arm" "0.16.7" + "@esbuild/linux-arm64" "0.16.7" + "@esbuild/linux-ia32" "0.16.7" + "@esbuild/linux-loong64" "0.16.7" + "@esbuild/linux-mips64el" "0.16.7" + "@esbuild/linux-ppc64" "0.16.7" + "@esbuild/linux-riscv64" "0.16.7" + "@esbuild/linux-s390x" "0.16.7" + "@esbuild/linux-x64" "0.16.7" + "@esbuild/netbsd-x64" "0.16.7" + "@esbuild/openbsd-x64" "0.16.7" + "@esbuild/sunos-x64" "0.16.7" + "@esbuild/win32-arm64" "0.16.7" + "@esbuild/win32-ia32" "0.16.7" + "@esbuild/win32-x64" "0.16.7" escalade@^3.1.1: version "3.1.1" From 35a14671259d9efea6454155ba4b3020daf46622 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 09:43:24 -0500 Subject: [PATCH 12/19] Bump @swc/core from 1.3.22 to 1.3.23 (#6754) Bumps [@swc/core](https://github.com/swc-project/swc) from 1.3.22 to 1.3.23. - [Release notes](https://github.com/swc-project/swc/releases) - [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md) - [Commits](https://github.com/swc-project/swc/compare/v1.3.22...v1.3.23) --- updated-dependencies: - dependency-name: "@swc/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 108 +++++++++++++++++++++++++-------------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 0cc49f7576..04de7a8181 100644 --- a/package.json +++ b/package.json @@ -289,7 +289,7 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@sentry/types": "^6.19.7", "@swc/cli": "^0.1.57", - "@swc/core": "^1.3.22", + "@swc/core": "^1.3.23", "@swc/jest": "^0.2.24", "@testing-library/dom": "^7.31.2", "@testing-library/jest-dom": "^5.16.5", diff --git a/yarn.lock b/yarn.lock index f76359a6a1..b791c6e76b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1734,71 +1734,71 @@ slash "3.0.0" source-map "^0.7.3" -"@swc/core-darwin-arm64@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.22.tgz#296db00b567d7fab0fc438eccc7334b53d54e2f2" - integrity sha512-MMhtPsuXp8gpUgr9bs+RZQ2IyFGiUNDG93usCDAFgAF+6VVp+YaAVjET/3/Bx5Lk2WAt0RxT62C9KTEw1YMo3w== +"@swc/core-darwin-arm64@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.23.tgz#5e52f19bf96eef92d2ae0533e1598a717b2ca765" + integrity sha512-IGOEHmE4aBDX7gQWpanI3A0ni47UcvX7rmcy0H8kE6mm/y7mEMWskvNsYhYzJl4GVZgw38v1/lL/A7MRX6g71A== -"@swc/core-darwin-x64@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.22.tgz#3922972fccaa8c42e5bb1ec3f784e88b884bc3c7" - integrity sha512-SG6QbNat4GZ5VJU3Zo6a54oQOtbhJVE6BCQw4JjOCZJmAeBzNebGy9wsT4+fCJNHC3C5qtaRw7ToXJvLniXwfg== +"@swc/core-darwin-x64@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.23.tgz#3a466b47821284e7fcab6ee7c5b8251dfec0697a" + integrity sha512-eQSN+JJqx/5Dk2C5uet2l7HifGsDBorQHD3PAVnge5jxl+rXU/zbzX9Un56+uuUB0QYeS4Dyr8cN7NHuIKGxBA== -"@swc/core-linux-arm-gnueabihf@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.22.tgz#5484415986e6c498f295b73c0d9dffb777237ca6" - integrity sha512-4E+TdQT1oHnHjDaPs/DyrRy9lOuFd6ncEd67yYA4j9lFqt6nuz/jnXss45k8KU7wR5kOTtdW73xPwkU4NbOWdw== +"@swc/core-linux-arm-gnueabihf@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.23.tgz#42984694b7ffc508188e64bdba6379c37fbf4abf" + integrity sha512-zxYvggbw6R/sTNey0qgsigFMY59DYepm1+JNojxOKjbnvxmgyeIa5sPdu/5gLj0TtJOiWvSGrpMPNUIVreUSGA== -"@swc/core-linux-arm64-gnu@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.22.tgz#951406151966225e4082cc643aa202f18f6d0bcf" - integrity sha512-6VcynOMbOBcbLutIPENI3Ejvg5LGz/Pwvzm25hM0FoiEtPxHA+tawQUwLx8Alk1Yr+Rnqid06UEZ0veJOGn2pQ== +"@swc/core-linux-arm64-gnu@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.23.tgz#6579f0f715a9646ab0ddcbaec2cd94815788c4af" + integrity sha512-l8UWhcNvZ6RzNZBBToMYuKYijF0h7mbw2RuFV5rpCYF/k/Wh85PaDHPQIQ6qjMHJsIBHYXUt0HLAP+fiAfBiDw== -"@swc/core-linux-arm64-musl@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.22.tgz#1f63fa7e3e61b00f9102e49f60520377491b61d6" - integrity sha512-86RxGy0L3qa4De3xWHx8vL2caTxvSLSWTlgUW/Yd4l1pvrCFibMjhkImGu5ViKiReX9DlBtJ7CBs4dln2kHidw== +"@swc/core-linux-arm64-musl@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.23.tgz#5c377db95ca3ceca3222945ce170398691e57863" + integrity sha512-TZDPp1wUE1ynVyY0vwIToyOULKEQ91H49R+p6Iu/2YY+UQQwUamhX0Gp8O85RT+j72/iHyhbQkz7yRg6v+GB5A== -"@swc/core-linux-x64-gnu@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.22.tgz#64a38d253c7cdc8944980fa1f8cb3b6fc260afd1" - integrity sha512-FLkbiqsdXsVIFZi6iedx4rSBGX8x0vo/5aDlklSxJAAYOcQpO0QADKP5Yr65iMT1d6ABCt2d+/StpGLF7GWOcA== +"@swc/core-linux-x64-gnu@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.23.tgz#e77b3a63c800418ea234d70c1a0ad5762367b6d5" + integrity sha512-rKqWnOmUyQfoKZuuXs/S0RNobN+kcUyMtwoCdRdCNqOlk1XZRCMpjGc9Aqn73K3xlZ6JXX6oLrXKn375b2dydw== -"@swc/core-linux-x64-musl@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.22.tgz#33f6abf28cc26eba1979e488776e006a09285463" - integrity sha512-giBuw+Z0Bq6fpZ0Y5TcfpcQwf9p/cE1fOQyO/K1XSTn/haQOqFi7421Jq/dFThSARZiXw1u9Om9VFbwxr8VI+A== +"@swc/core-linux-x64-musl@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.23.tgz#f8cac09286f9ffaffe990ef61e759ce3785fd02e" + integrity sha512-1MK9eocIhuIr/+yUKnTNHpYovMQvfKTJQbU4UMfQLg2qyCGKAvO+jOy5JIGR9x04MWqz9U3EHHS/7Id35ekhFQ== -"@swc/core-win32-arm64-msvc@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.22.tgz#4b5a05157d5d442866d543090a52b2a9624766bc" - integrity sha512-loKGO+ZM2By6VdrmVJk1G79jVgDPaee93qLFuis5KyeoLLb4m1MlNMc/6SIDZUSuYg6NqaGP1spFeiFetMQ4Zg== +"@swc/core-win32-arm64-msvc@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.23.tgz#7a723c3e5360573b5c1d21e504e3c11cc3cc024c" + integrity sha512-3nmdugj0SJIGWeCJBhvPWIfnE2Ax8H2KZsJfcaWmWg0SDh19aAt48Ncyd8WHHBandJmVm2fSjaANSjp+cS2S9A== -"@swc/core-win32-ia32-msvc@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.22.tgz#ec067667b7a665ef3b4fe97c3aa4c1d15e3a496d" - integrity sha512-lvNWAZ3QjXMsrsch6oLLQVikT/hC/4ZcLrTBXa14HwQylaYigkGElgp3ekJr78HjWDPwB46GXwBbNMG0VNAfvA== +"@swc/core-win32-ia32-msvc@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.23.tgz#43a439fc21144682e624d46ba4da5e7bb33b2629" + integrity sha512-2AlGRhys1BsfLjXyWOd+5J/Ko2kkVQVuy3ZR8OBGy7XI54p0PpepabloYI9irr+4bi9vtyxoc5rS21PmJxB83Q== -"@swc/core-win32-x64-msvc@1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.22.tgz#fb820b1aa03605363d141c9656d966a25000790f" - integrity sha512-ESyn4lZXAKEE3mcTaDfXatsolCiEfVGstsXdgBmZYa6o1IE1bDW8FE7Ob/Y+82WTpm9+A9ZYXYjZ62t67POHZg== +"@swc/core-win32-x64-msvc@1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.23.tgz#00ad332d847f2e3961d7bba4d1886dd767e1f92e" + integrity sha512-qYKP8sIM7VVLuDb5BkRBoHy28OHZWrUhPTO7WgpErhVVM9wnzmMi/Jgg8SyfMy6oheBjO0QiwWbXONxBwByjnQ== -"@swc/core@^1.3.22": - version "1.3.22" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.22.tgz#2b631f7b54d6e11eb2e8ae505bca1dbbc6fb7160" - integrity sha512-oQ9EPEb7NgWcGIDoVfLCuffvtC4MzVtrwjqwKzFHP8FUh1fn8+2wraOjkkDXW74BB4Hgve5ykkaHix9bebB9Ww== +"@swc/core@^1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.23.tgz#62078fb161fad7edf7c8a8267cceccdeb2ab4a0d" + integrity sha512-Aa7yw5+7ErOxr+G0J1eU2hkb9nEMSdt1Ye3isdAgg9mrsPuttk+cfLp6nP/Lux/VUnu5k4eOxeTy9UhjJhRAFw== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.22" - "@swc/core-darwin-x64" "1.3.22" - "@swc/core-linux-arm-gnueabihf" "1.3.22" - "@swc/core-linux-arm64-gnu" "1.3.22" - "@swc/core-linux-arm64-musl" "1.3.22" - "@swc/core-linux-x64-gnu" "1.3.22" - "@swc/core-linux-x64-musl" "1.3.22" - "@swc/core-win32-arm64-msvc" "1.3.22" - "@swc/core-win32-ia32-msvc" "1.3.22" - "@swc/core-win32-x64-msvc" "1.3.22" + "@swc/core-darwin-arm64" "1.3.23" + "@swc/core-darwin-x64" "1.3.23" + "@swc/core-linux-arm-gnueabihf" "1.3.23" + "@swc/core-linux-arm64-gnu" "1.3.23" + "@swc/core-linux-arm64-musl" "1.3.23" + "@swc/core-linux-x64-gnu" "1.3.23" + "@swc/core-linux-x64-musl" "1.3.23" + "@swc/core-win32-arm64-msvc" "1.3.23" + "@swc/core-win32-ia32-msvc" "1.3.23" + "@swc/core-win32-x64-msvc" "1.3.23" "@swc/jest@^0.2.24": version "0.2.24" From 7c5faaaf1d4b038c66ef0a45777d5e83d03e4027 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Dec 2022 09:43:37 -0500 Subject: [PATCH 13/19] Bump css-loader from 6.7.2 to 6.7.3 (#6752) Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 6.7.2 to 6.7.3. - [Release notes](https://github.com/webpack-contrib/css-loader/releases) - [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-loader/compare/v6.7.2...v6.7.3) --- updated-dependencies: - dependency-name: css-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 04de7a8181..23bcebe136 100644 --- a/package.json +++ b/package.json @@ -358,7 +358,7 @@ "color": "^3.2.1", "command-line-args": "^5.2.1", "concurrently": "^7.6.0", - "css-loader": "^6.7.2", + "css-loader": "^6.7.3", "deepdash": "^5.3.9", "dompurify": "^2.4.1", "electron": "^19.1.9", diff --git a/yarn.lock b/yarn.lock index b791c6e76b..cd23c803c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4546,13 +4546,13 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-loader@^6.7.2: - version "6.7.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.2.tgz#26bc22401b5921686a10fbeba75d124228302304" - integrity sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q== +css-loader@^6.7.3: + version "6.7.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.18" + postcss "^8.4.19" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" @@ -10370,7 +10370,7 @@ postcss@^6.0.14, postcss@^6.0.2: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.3.0, postcss@^8.4.18, postcss@^8.4.20: +postcss@^8.3.0, postcss@^8.4.18, postcss@^8.4.19, postcss@^8.4.20: version "8.4.20" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== From 25f37ac1d1de2c5b6e152c5fa09be5c5b6170e46 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 15 Dec 2022 07:07:19 -0800 Subject: [PATCH 14/19] Make base store non Singleton (#6690) * Remove Singleton from BaseStore to remove global shared state Signed-off-by: Sebastian Malton * Remove more usages of Singleton Signed-off-by: Sebastian Malton * Replace use of legacy global execHelm with injectable Signed-off-by: Sebastian Malton * Remove last use of legacy global execHelm Signed-off-by: Sebastian Malton * Extract BaseStore deps into constructor argument Signed-off-by: Sebastian Malton * Introduce method to make store migrations injectable - Use it for ClusterStore Signed-off-by: Sebastian Malton * Switch HotbarStore to injectable migrations Signed-off-by: Sebastian Malton * Switch UserStore to injectable migrations Signed-off-by: Sebastian Malton * Move migration utils into common/utils/ Signed-off-by: Sebastian Malton * Switch WeblinkStore to injectable migrations Signed-off-by: Sebastian Malton * Remove dead code Signed-off-by: Sebastian Malton * Fix type error in base-store tests Signed-off-by: Sebastian Malton * Remove tests that reference lastSeenVersion - That value is not used anywhere in code Signed-off-by: Sebastian Malton * Remove usage of legacy global .getInstance Signed-off-by: Sebastian Malton * Remove usage of legacy global ClusterStore.getInstance Signed-off-by: Sebastian Malton * Add simple migrations dependency for stores without any preexisting migrations Signed-off-by: Sebastian Malton * Fix messed up import Signed-off-by: Sebastian Malton * Add typing to transient injectable Signed-off-by: Sebastian Malton * Cleanup formatting Signed-off-by: Sebastian Malton * Fix typing in tests to satisfy requirement to have cacheFile Signed-off-by: Sebastian Malton * More consistent use of BaseStore.displayName Signed-off-by: Sebastian Malton * Add catching of error while starting main application Signed-off-by: Sebastian Malton * Move initializing sentry to runnable Signed-off-by: Sebastian Malton * Remove unneeded appPathsInjectionToken - Only had once impl, which was in common anyway Signed-off-by: Sebastian Malton * Add support for multiple "runAfter" runnables - Needed so that several dependencies can be declared Signed-off-by: Sebastian Malton * Use multiple runAfter support to fix crash on renderer Signed-off-by: Sebastian Malton * Remove traces Signed-off-by: Sebastian Malton * Add global override to fix tests Signed-off-by: Sebastian Malton * Fix base store tests Signed-off-by: Sebastian Malton * Fix runManyFor tests Signed-off-by: Sebastian Malton * Fix hotbar store tests Signed-off-by: Sebastian Malton * Fix user store tests Signed-off-by: Sebastian Malton * Add global override for getConfigurationFileModel to fix tests Signed-off-by: Sebastian Malton * Remove overrides for configuration stores - Now that there is an override for getConfiguration Signed-off-by: Sebastian Malton * Overhaul FS fakes with full in-memory filesystem - This increases our confidence in fs related logic Signed-off-by: Sebastian Malton * Remove use of global shared Electron.App Signed-off-by: Sebastian Malton * Add fake access support Signed-off-by: Sebastian Malton * Handle copy as part of fake FS Signed-off-by: Sebastian Malton * Add ensureDir/Sync support to fake FS Signed-off-by: Sebastian Malton * Fix type error Signed-off-by: Sebastian Malton * Use pathExistsSync instead of fsInjectable Signed-off-by: Sebastian Malton * Add createReadStream to fake FS Signed-off-by: Sebastian Malton * Add stat to fake FS Signed-off-by: Sebastian Malton * Remove dead code Signed-off-by: Sebastian Malton * Fix test failures due to incomplete overrides Signed-off-by: Sebastian Malton * Fully injectable-ize BaseStore so that ApplicationBuilder tests work Signed-off-by: Sebastian Malton * Consolidate more bootstrapping into startFrame Signed-off-by: Sebastian Malton * Move initializing CatalogCategories to runnable in bootstrap Signed-off-by: Sebastian Malton * Convert contextMenuOpen initializers into runnables Signed-off-by: Sebastian Malton * Convert navigateForExtension init to runnable Signed-off-by: Sebastian Malton * Make cluster state sync fully injectable Signed-off-by: Sebastian Malton * Move init hotbar store into runnables Signed-off-by: Sebastian Malton * Make LensTheme fully injectable and runnable Signed-off-by: Sebastian Malton * Cleanup old code from missed from previous commit Signed-off-by: Sebastian Malton * Manually split out terminal color names and fully type LensTheme Signed-off-by: Sebastian Malton * Fix old imports Signed-off-by: Sebastian Malton * Remove unnecessart awaits Signed-off-by: Sebastian Malton * Remove dead code Signed-off-by: Sebastian Malton * Fully cherry pick injectablizing custom monaco themes Signed-off-by: Sebastian Malton * Fix duplicate mock warning Signed-off-by: Sebastian Malton * Fix incorrectly fully cherry picking new runnable Signed-off-by: Sebastian Malton * Complete cherry-pick of current cluster injcetablization Signed-off-by: Sebastian Malton * Fix override file name Signed-off-by: Sebastian Malton * Fix injecting before app paths are set up Signed-off-by: Sebastian Malton * Fix injecting before app paths are set up Signed-off-by: Sebastian Malton * Fix ordering of runnable and order of injection Signed-off-by: Sebastian Malton * Convert all renderer runnables to late-inject style - To help fix issues around injection time Signed-off-by: Sebastian Malton * Fix react-beautiful-dnd mocks Signed-off-by: Sebastian Malton * Update and fix WriteJson(Sync) to fix error in tests Signed-off-by: Sebastian Malton * Fix HotbarStore.load being called twice is being buggy Signed-off-by: Sebastian Malton * Update listing-active-helm-repositories-in-preferences snapshots Signed-off-by: Sebastian Malton * Fix sidebar-and-tab-navigation-tests - Move enabling extensions in tests to a proper location - Fix flushing promises Signed-off-by: Sebastian Malton * Remove props from dnd mock to make snapshot diffs smaller Signed-off-by: Sebastian Malton * Fix import Signed-off-by: Sebastian Malton * Update snapshots Signed-off-by: Sebastian Malton * Fix tests by overriding things that are no longer overriden by default - NOTE: They are overridden when using ApplicationBuilder Signed-off-by: Sebastian Malton * Fix hotbar store tests Signed-off-by: Sebastian Malton * Fix cluster store tests Signed-off-by: Sebastian Malton * Fix extension-loader tests Signed-off-by: Sebastian Malton * Fix extension-discovery tests Signed-off-by: Sebastian Malton * Fix cluster-role-dialog tests Signed-off-by: Sebastian Malton * Fix user store tests Signed-off-by: Sebastian Malton * Fix kubeconfig sync tests Signed-off-by: Sebastian Malton * Fix sidebar and tab tests Signed-off-by: Sebastian Malton * Remove unused code Signed-off-by: Sebastian Malton * Fix pick paths import type error and simplify signature Signed-off-by: Sebastian Malton * Fix type error in legacy ipc registration Signed-off-by: Sebastian Malton * Remove another use of legacy requestOpenPathPicker Signed-off-by: Sebastian Malton * Replace use of legacy global PathPicker.Pick Signed-off-by: Sebastian Malton * Fix usage in light of changed prop names Signed-off-by: Sebastian Malton * Fix catalog tests Signed-off-by: Sebastian Malton * Fix more type errors Signed-off-by: Sebastian Malton * Fix test flakiness by removing side effects from userStore preferences Signed-off-by: Sebastian Malton * Update snapshots Signed-off-by: Sebastian Malton * Fix loading Signed-off-by: Sebastian Malton * Fix type error Signed-off-by: Sebastian Malton * Fix crash Signed-off-by: Sebastian Malton * Cherry pick updated startFrameInjectable Signed-off-by: Sebastian Malton * Add tests to verify runMany behaviour in new possible incorrect configuration Signed-off-by: Sebastian Malton * Fix init ordering during start frame Signed-off-by: Sebastian Malton * Fix cluster state sync Signed-off-by: Sebastian Malton * Update snapshots after removing side-effects Signed-off-by: Sebastian Malton * Add override for technical test Signed-off-by: Sebastian Malton * Correctly mark currentlyInClusterFrame as causedSideEffects Signed-off-by: Sebastian Malton * Better formatting Signed-off-by: Sebastian Malton * Fix behaviour regression Signed-off-by: Sebastian Malton * Add better logging Signed-off-by: Sebastian Malton * Fix BaseStore sync Signed-off-by: Sebastian Malton * Fix tests Signed-off-by: Sebastian Malton * Update last snapshot Signed-off-by: Sebastian Malton * Add global override for randomBytes Signed-off-by: Sebastian Malton * Make startMainApplication not an injection time side effect Signed-off-by: Sebastian Malton * Choose better names for start-frame runnable tokens Signed-off-by: Sebastian Malton * Remove duplication of code in RunManyFor Signed-off-by: Sebastian Malton * Add unit tests and fix handling empty runAfter array Signed-off-by: Sebastian Malton * Replace use of mobx from runManyFor with custom barrier Signed-off-by: Sebastian Malton * Add missing test Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton --- __mocks__/monaco-editor.ts | 14 - __mocks__/react-beautiful-dnd.tsx | 44 +- build/build_theme_vars.ts | 31 - package.json | 1 + src/common/__tests__/base-store.test.ts | 148 --- src/common/__tests__/cluster-store.test.ts | 38 +- src/common/__tests__/hotbar-store.test.ts | 22 +- src/common/__tests__/user-store.test.ts | 30 +- .../app-paths/app-path-injection-token.ts | 5 - src/common/app-paths/app-paths.injectable.ts | 2 - src/common/app-paths/app-paths.test.ts | 10 +- .../directory-for-downloads.injectable.ts | 4 +- .../directory-for-exes.injectable.ts | 4 +- .../directory-for-temp.injectable.ts | 4 +- .../directory-for-user-data.injectable.ts | 4 +- src/common/base-store.ts | 194 ---- src/common/base-store/base-store.ts | 148 +++ src/common/base-store/channel-prefix.ts | 11 + .../base-store/disable-sync.ts} | 8 +- .../base-store/migrations.injectable.ts | 46 + src/common/base-store/save-to-file.ts | 12 + .../catalog-entities/kubernetes-cluster.ts | 9 +- src/common/catalog-entities/web-link.ts | 5 +- .../catalog/catalog-category-registry.ts | 12 - src/common/catalog/index.ts | 1 - ...er-store.global-override-for-injectable.ts | 17 - .../cluster-store/cluster-store.injectable.ts | 37 +- src/common/cluster-store/cluster-store.ts | 76 +- src/common/cluster-store/migration-token.ts | 11 + src/common/cluster/cluster.ts | 25 +- src/common/cluster/current-cluster-channel.ts | 11 + src/common/fetch/fetch.injectable.ts | 17 +- ...ete-file.global-override-for-injectable.ts | 11 - ...xec-file.global-override-for-injectable.ts | 9 + src/common/fs/fs.injectable.ts | 52 +- src/common/fs/move.injectable.ts | 16 - ...able.ts => path-exists-sync.injectable.ts} | 10 +- ...h-exists.global-override-for-injectable.ts | 11 - src/common/fs/read-directory.injectable.ts | 8 +- .../fs/read-file-buffer-sync.injectable.ts | 19 + src/common/fs/read-json-sync.injectable.ts | 13 + ... remove.global-override-for-injectable.ts} | 4 +- ...ath.injectable.ts => remove.injectable.ts} | 8 +- src/common/fs/{stat => }/stat.injectable.ts | 2 +- .../stat.global-override-for-injectable.ts | 10 - .../fs/validate-directory.injectable.ts | 2 +- src/common/fs/write-file-sync.injectable.ts | 29 + src/common/fs/write-file.injectable.ts | 10 +- src/common/fs/write-json-file.injectable.ts | 3 +- src/common/fs/write-json-sync.injectable.ts | 31 + ...le-model.global-override-for-injectable.ts | 53 + ...get-configuration-file-model.injectable.ts | 6 +- src/common/helm/helm-repo.ts | 8 +- src/common/hotbars/migrations-token.ts | 11 + src/common/hotbars/store.injectable.ts | 33 +- src/common/hotbars/store.ts | 27 +- src/common/ipc/dialog.ts | 6 - src/common/ipc/native-theme.ts | 8 - src/common/request.ts | 34 - src/common/runnable/run-many-for.test.ts | 380 ++++++- src/common/runnable/run-many-for.ts | 142 ++- ...imezone.global-override-for-injectable.ts} | 6 +- .../user-store/current-timezone.injectable.ts | 14 + .../user-store/https-proxy.injectable.ts | 18 + .../user-store/kubeconfig-syncs.injectable.ts | 6 +- .../user-store/lens-color-theme.injectable.ts | 37 + src/common/user-store/migrations-token.ts | 11 + .../preference-descriptors.injectable.ts | 143 +++ src/common/user-store/preferences-helpers.ts | 269 +---- .../user-store/terminal-theme.injectable.ts | 37 + .../user-store/user-store.injectable.ts | 37 +- src/common/user-store/user-store.ts | 89 +- src/common/utils/collection-functions.ts | 12 +- .../utils/generate-new-id-for.ts} | 0 ...om-bytes.global-override-for-injectable.ts | 17 + src/common/utils/random-bytes.injectable.ts | 17 + src/common/utils/singleton.ts | 7 +- src/common/utils/type-narrowing.ts | 13 + src/common/vars.ts | 10 +- src/common/weblink-store.injectable.ts | 18 - src/common/weblinks-store/migration-token.ts | 11 + .../weblink-store.injectable.ts | 35 + .../{ => weblinks-store}/weblink-store.ts | 12 +- .../__tests__/extension-loader.test.ts | 5 + src/extensions/common-api/user-preferences.ts | 7 +- .../extension-discovery.injectable.ts | 2 +- .../extension-discovery.test.ts | 8 +- .../extension-discovery.ts | 2 +- .../extension-installer.injectable.ts | 9 +- ...nsion-package-root-directory.injectable.ts | 3 +- ...ile-system-provisioner-store.injectable.ts | 37 +- .../file-system-provisioner-store.ts | 34 +- src/extensions/extension-store.ts | 67 +- .../extensions-store.injectable.ts | 29 +- .../extensions-store/extensions-store.ts | 8 +- src/extensions/renderer-api/theming.ts | 2 +- ...acters-in-page-registrations.test.tsx.snap | 40 +- .../navigate-to-extension-page.test.tsx.snap | 100 +- .../navigating-between-routes.test.tsx.snap | 40 +- ...ation-using-application-menu.test.tsx.snap | 40 +- .../main/start-application-menu.injectable.ts | 4 +- .../installing-update.test.ts.snap | 120 ++- ...g-update-using-topbar-button.test.tsx.snap | 40 +- .../installing-update-using-tray.test.ts.snap | 120 ++- ...e-since-update-was-downloaded.test.ts.snap | 60 +- ...eriodical-checking-of-updates.test.ts.snap | 20 +- ...-updates.global-override-for-injectable.ts | 4 +- .../start-checking-for-updates.injectable.ts | 4 +- ...selection-of-update-stability.test.ts.snap | 20 +- .../check-for-platform-updates.test.ts | 10 +- .../download-platform-update.test.ts | 10 +- .../opening-entity-details.test.tsx.snap | 160 ++- .../delete-cluster-dialog.test.tsx.snap | 100 +- .../delete-channel-listener.injectable.ts | 4 +- ...debar-and-tab-navigation-for-core.test.tsx | 3 + ...and-tab-navigation-for-extensions.test.tsx | 3 + .../cluster/state-sync/common/channels.ts | 21 + .../state-sync/main/emit-update.injectable.ts | 21 + .../main/handle-initial.injectable.ts | 21 + .../state-sync/main/setup-sync.injectable.ts | 44 + .../renderer/listener.injectable.ts | 19 + .../renderer/request-initial.injectable.ts | 21 + .../renderer/setup-sync.injectable.ts | 29 + .../cluster/store/main/init.injectable.ts | 26 + .../cluster/store/renderer/init.injectable.ts | 24 + .../keyboard-shortcuts.test.tsx.snap | 160 ++- ...-settings-for-correct-entity.test.tsx.snap | 115 ++- ...gation-using-application-menu.test.ts.snap | 40 +- .../extensions/navigate/common/channel.ts | 16 + .../navigate/renderer/listener.injectable.ts | 26 + .../main/init-store.injectable.ts | 22 + .../renderer/init-store.injectable.ts | 22 + ...elm-repository-in-preferences.test.ts.snap | 932 +++++++++++++----- ...tory-from-list-in-preferences.test.ts.snap | 772 +++++++++++---- ...m-repositories-in-preferences.test.ts.snap | 772 +++++++++++---- ...ive-repository-in-preferences.test.ts.snap | 236 +++-- ...tom-helm-repository-in-preferences.test.ts | 12 +- ...epository-from-list-in-preferences.test.ts | 36 +- ...-custom-helm-repository-dialog-content.tsx | 27 +- .../custom-helm-repo.injectable.ts | 4 +- .../get-file-paths.injectable.ts | 33 +- .../helm-file-input/helm-file-input.tsx | 45 +- ...for-public-helm-repositories.injectable.ts | 29 - .../public-helm-repositories.injectable.ts | 14 +- ...est-public-helm-repositories.injectable.ts | 40 + ...e-helm-repositories-in-preferences.test.ts | 13 +- ...f-active-repository-in-preferences.test.ts | 12 +- .../hotbar/store/main/init.injectable.ts | 26 + .../hotbar/store/renderer/init.injectable.ts | 24 + .../path-picking-dialog/common/channel.ts | 18 + .../main/handle-pick-paths.injectable.ts | 15 + .../renderer/pick-paths.injectable.ts | 30 + .../closing-preferences.test.tsx.snap | 196 +++- ...nsion-adding-preference-tabs.test.tsx.snap | 38 +- .../hiding-of-empty-branches.test.tsx.snap | 114 ++- ...n-to-application-preferences.test.tsx.snap | 172 +++- ...igation-to-editor-preferences.test.ts.snap | 81 +- ...tension-specific-preferences.test.tsx.snap | 234 ++++- ...ion-to-kubernetes-preferences.test.ts.snap | 90 +- ...vigation-to-proxy-preferences.test.ts.snap | 58 +- ...ion-to-telemetry-preferences.test.tsx.snap | 139 ++- ...ation-to-terminal-preferences.test.ts.snap | 80 +- ...gation-using-application-menu.test.ts.snap | 58 +- .../navigation-using-tray.test.ts.snap | 58 +- .../urls-of-legacy-extensions.test.tsx.snap | 100 +- ...vigation-to-kubernetes-preferences.test.ts | 4 +- .../application/theme/theme.tsx | 40 +- .../application/timezone/timezone.tsx | 25 +- .../discover-all-sync-kinds.injectable.ts | 20 + .../discover-sync-kind.injectable.ts | 46 + .../kubeconfig-sync/kubeconfig-sync.tsx | 91 +- .../terminal-theme/terminal-theme.tsx | 74 +- ...-originating-from-extensions.test.tsx.snap | 20 +- .../theme/system-type/common/channels.ts | 17 + .../main/emit-update.injectable.ts | 21 + .../main/handle-initial.injectable.ts | 19 + .../main/setup-update-emitter.injectable.ts | 33 + .../renderer/initialize.injectable.ts | 26 + .../renderer/request-initial.injectable.ts | 21 + .../renderer/update-listener.injectable.ts | 19 + ...dability-using-extension-api.test.tsx.snap | 80 +- ...gation-using-application-menu.test.ts.snap | 78 +- src/jest.setup.ts | 2 + src/main/__test__/cluster.test.ts | 8 + src/main/__test__/kube-auth-proxy.test.ts | 8 + src/main/__test__/kubeconfig-manager.test.ts | 14 +- ...disable-sync-in-ipc-listener.injectable.ts | 14 + .../ipc-channel-prefix.injectable.ts | 17 + .../persist-state-to-config.injectable.ts | 25 + .../__test__/kubeconfig-sync.test.ts | 12 +- .../watch-file-changes.injectable.ts | 2 +- .../sync-weblinks.injectable.ts | 2 +- src/main/catalog-sources/weblinks.ts | 2 +- .../start-catalog-sync.injectable.ts | 4 +- .../3.6.0-beta.1.injectable.ts | 97 ++ .../5.0.0-beta.10.injectable.ts | 63 ++ .../5.0.0-beta.13.injectable.ts} | 76 +- .../store-migrations/snap.injectable.ts | 60 ++ ...tron-app.global-override-for-injectable.ts | 3 +- .../set-login-item-settings.injectable.ts | 20 + ...n-dialog.global-override-for-injectable.ts | 9 + .../features/show-open-dialog.injectable.ts | 17 + .../setup-ipc-main-handlers.injectable.ts | 9 +- .../setup-ipc-main-handlers.ts | 37 +- src/main/getDiForUnitTesting.ts | 23 - src/main/helm/__tests__/helm-service.test.ts | 19 +- .../helm/exec-helm/exec-env.injectable.ts | 6 +- src/main/helm/exec.ts | 45 - .../helm/helm-chart-manager.injectable.ts | 16 +- src/main/helm/helm-chart-manager.ts | 33 +- src/main/helm/helm-release-manager.ts | 61 +- .../update-helm-release.injectable.ts | 2 +- .../migrations/5.0.0-alpha.0.injectable.ts | 34 + .../migrations/5.0.0-alpha.2.injectable.ts | 30 + .../migrations/5.0.0-beta.10.injectable.ts | 173 ++++ .../migrations/5.0.0-beta.5.injectable.ts | 54 + src/main/index.ts | 11 +- .../ipc/ask-user-for-file-paths.injectable.ts | 25 +- .../create-kubeconfig-manager.injectable.ts | 4 +- .../kubeconfig-manager/kubeconfig-manager.ts | 6 +- .../protocol-handler/__test__/router.test.ts | 9 + .../create-resource-applier.injectable.ts | 4 +- src/main/resource-applier/resource-applier.ts | 4 +- .../local-shell-session/open.injectable.ts | 2 +- .../local-shell-session/techincal.test.ts | 10 + .../node-shell-session/open.injectable.ts | 2 +- src/main/shell-session/shell-session.ts | 2 +- .../create-electron-window.injectable.ts | 5 +- .../listener.injectable.ts | 19 + ...er-for-current-cluster-frame.injectable.ts | 35 - .../navigate-for-extension.injectable.ts | 6 +- .../setup-hotbar-store.injectable.ts | 27 - ...etup-reactions-in-user-store.injectable.ts | 26 - .../start-main-application.injectable.ts | 26 +- .../broadcast-theme-change.injectable.ts | 27 - ...rt-broadcasting-theme-change.injectable.ts | 26 - ...op-broadcasting-theme-change.injectable.ts | 24 - ...-theme-from-operating-system.injectable.ts | 4 +- .../menu-icon/start-reactivity.injectable.ts | 4 +- .../migrations/5.0.0-alpha.3.injectable.ts | 36 + .../migrations/5.0.3-beta.1.injectable.ts | 91 ++ .../sync-open-at-login-with-os.injectable.ts | 35 + src/main/weblinks-store/links.ts | 24 + .../migrations/5.1.4.injectable.ts | 35 + .../migrations/5.4.5-beta.1.injectable.ts | 61 ++ .../migrations/currentVersion.injectable.ts | 42 + src/migrations/cluster-store/3.6.0-beta.1.ts | 93 -- src/migrations/cluster-store/5.0.0-beta.10.ts | 57 -- src/migrations/cluster-store/index.ts | 20 - src/migrations/cluster-store/snap.ts | 43 - src/migrations/helpers.ts | 41 - src/migrations/hotbar-store/5.0.0-alpha.0.ts | 25 - src/migrations/hotbar-store/5.0.0-alpha.2.ts | 22 - src/migrations/hotbar-store/5.0.0-beta.10.ts | 166 ---- src/migrations/hotbar-store/5.0.0-beta.5.ts | 45 - src/migrations/hotbar-store/index.ts | 20 - src/migrations/user-store/2.1.0-beta.4.ts | 14 - src/migrations/user-store/5.0.0-alpha.3.ts | 23 - src/migrations/user-store/5.0.3-beta.1.ts | 81 -- src/migrations/user-store/index.ts | 18 - src/migrations/weblinks-store/5.1.4.ts | 34 - src/migrations/weblinks-store/5.4.5-beta.1.ts | 55 -- .../weblinks-store/currentVersion.ts | 31 - src/migrations/weblinks-store/index.ts | 16 - .../app-paths/setup-app-paths.injectable.ts | 25 +- ...disable-sync-in-ipc-listener.injectable.ts | 14 + .../ipc-channel-prefix.injectable.ts | 17 + .../persist-state-to-config.injectable.ts | 15 + .../runnables/configure-immer.injectable.ts | 23 + .../runnables/configure-mobx.injectable.ts | 28 + .../load-monaco-themes.injectable.ts | 24 + .../setup-auto-registration.injectable.ts | 79 ++ ...up-current-cluster-broadcast.injectable.ts | 32 + ...tes-cluster-catalog-add-menu.injectable.ts | 81 ++ ...es-cluster-context-menu-open.injectable.ts | 56 ++ .../setup-root-mac-class.injectable.ts | 23 + .../runnables/setup-sentry.injectable.ts | 23 + ...p-weblink-context-menu-open.injectable.tsx | 34 + src/renderer/before-frame-starts/tokens.ts | 26 + src/renderer/bootstrap.tsx | 91 -- .../+catalog/__tests__/custom-columns.test.ts | 3 + .../components/+catalog/catalog.test.tsx | 15 +- .../components/+cluster/cluster-issues.tsx | 2 +- .../+cluster/cluster-pie-charts.tsx | 2 +- .../+extensions/__tests__/extensions.test.tsx | 10 +- .../get-base-registry-url.injectable.ts | 21 - .../get-base-registry-url.injectable.tsx | 58 ++ .../get-base-registry-url.tsx | 49 - ...tall-from-select-file-dialog.injectable.ts | 39 +- .../release-details-model.injectable.tsx | 2 +- .../components/+nodes/node-charts.tsx | 2 +- .../volume-claim-disk-chart.tsx | 2 +- .../__tests__/dialog.test.tsx | 2 + .../+welcome/__test__/welcome.test.tsx | 4 + .../overview-workload-status.tsx | 2 +- .../+workloads-pods/container-charts.tsx | 2 +- src/renderer/components/app.scss | 1 - .../catalog-entities/weblink-add-command.tsx | 11 +- src/renderer/components/chart/bar-chart.tsx | 2 +- src/renderer/components/chart/pie-chart.tsx | 2 +- .../cluster-manager/cluster-frame-handler.ts | 9 +- .../cluster-manager/cluster-view.tsx | 11 +- .../cluster-local-terminal-settings.test.tsx | 2 +- .../local-terminal-settings.tsx | 10 +- src/renderer/components/dock/logs/list.tsx | 21 +- .../terminal/create-terminal.injectable.ts | 4 +- .../components/dock/terminal/terminal.ts | 16 +- .../components/dock/terminal/view.tsx | 2 +- .../components/item-object-list/content.tsx | 2 +- .../top-bar/start-state-sync.injectable.ts | 30 +- .../layout/top-bar/top-bar.test.tsx | 2 + .../components/locale-date/locale-date.tsx | 26 +- .../monaco-editor/monaco-editor.tsx | 2 +- .../components/monaco-editor/monaco-themes.ts | 23 +- .../clouds-midnight.injectable.ts | 143 +++ .../components/path-picker/path-picker.tsx | 74 +- src/renderer/components/select/select.tsx | 2 +- .../test-utils/get-application-builder.tsx | 80 +- .../cluster-frame/cluster-frame.test.tsx | 2 + .../root-frame/setup-system-ca.injectable.ts | 2 +- src/renderer/getDiForUnitTesting.tsx | 46 +- .../add-sync-entries.injectable.tsx | 16 +- .../catalog-category-registry.tsx | 76 -- src/renderer/initializers/catalog.tsx | 58 -- src/renderer/initializers/index.ts | 8 - src/renderer/initializers/ipc.ts | 16 - src/renderer/ipc/index.ts | 6 - ...amespaces-forbidden-handler.injectable.tsx | 5 +- ...ew-theme.global-override-for-injectable.ts | 9 + .../monaco/add-new-theme.injectable.ts | 15 + ...-protocol-add-route-handlers.injectable.ts | 2 + .../bind-protocol-add-route-handlers.tsx | 8 +- .../currently-in-cluster-frame.injectable.ts | 1 + .../start-frame/start-frame.injectable.ts | 24 +- .../stores/init-user-store.injectable.ts | 19 +- src/renderer/themes/active-type.injectable.ts | 8 +- src/renderer/themes/active.injectable.ts | 28 +- .../themes/apply-lens-theme.injectable.ts | 38 + ...ly-theme.global-override-for-injectable.ts | 9 + src/renderer/themes/declaration.ts | 12 + .../themes/default-theme.injectable.ts | 26 + src/renderer/themes/lens-dark.injectable.ts | 156 +++ src/renderer/themes/lens-dark.ts | 148 --- src/renderer/themes/lens-light.injectable.ts | 154 +++ src/renderer/themes/lens-light.ts | 147 --- src/renderer/themes/lens-theme.ts | 154 +++ .../setup-apply-active-theme.injectable.ts | 37 + src/renderer/themes/store.injectable.ts | 19 - src/renderer/themes/store.ts | 150 --- .../themes/system-theme.injectable.ts | 13 + .../themes/terminal-colors.injectable.ts | 32 + src/renderer/themes/theme-vars.css | 138 --- src/renderer/themes/themes.injectable.ts | 17 + .../utils/__tests__/storageHelper.test.ts | 32 +- .../start-listening-of-channels.injectable.ts | 18 +- .../utils/create-storage/create-storage.ts | 32 +- src/renderer/utils/storageHelper.ts | 23 +- ...nitial-values-for-sync-boxes.injectable.ts | 41 +- .../vars/build-version/init.injectable.ts | 16 +- .../default-update-channel/init.injectable.ts | 18 +- .../vars/release-channel/init.injectable.ts | 18 +- .../semantic-build-version/init.injectable.ts | 18 +- src/test-utils/override-fs-with-fakes.ts | 95 +- yarn.lock | 5 + 364 files changed, 10039 insertions(+), 5250 deletions(-) delete mode 100644 __mocks__/monaco-editor.ts delete mode 100644 build/build_theme_vars.ts delete mode 100644 src/common/__tests__/base-store.test.ts delete mode 100644 src/common/base-store.ts create mode 100644 src/common/base-store/base-store.ts create mode 100644 src/common/base-store/channel-prefix.ts rename src/{renderer/before-frame-starts/before-frame-starts-injection-token.ts => common/base-store/disable-sync.ts} (54%) create mode 100644 src/common/base-store/migrations.injectable.ts create mode 100644 src/common/base-store/save-to-file.ts delete mode 100644 src/common/catalog/catalog-category-registry.ts delete mode 100644 src/common/cluster-store/cluster-store.global-override-for-injectable.ts create mode 100644 src/common/cluster-store/migration-token.ts create mode 100644 src/common/cluster/current-cluster-channel.ts delete mode 100644 src/common/fs/delete-file.global-override-for-injectable.ts create mode 100644 src/common/fs/exec-file.global-override-for-injectable.ts delete mode 100644 src/common/fs/move.injectable.ts rename src/common/fs/{delete-file.injectable.ts => path-exists-sync.injectable.ts} (52%) delete mode 100644 src/common/fs/path-exists.global-override-for-injectable.ts create mode 100644 src/common/fs/read-file-buffer-sync.injectable.ts create mode 100644 src/common/fs/read-json-sync.injectable.ts rename src/common/fs/{remove-path.global-override-for-injectable.ts => remove.global-override-for-injectable.ts} (70%) rename src/common/fs/{remove-path.injectable.ts => remove.injectable.ts} (63%) rename src/common/fs/{stat => }/stat.injectable.ts (90%) delete mode 100644 src/common/fs/stat/stat.global-override-for-injectable.ts create mode 100644 src/common/fs/write-file-sync.injectable.ts create mode 100644 src/common/fs/write-json-sync.injectable.ts create mode 100644 src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts create mode 100644 src/common/hotbars/migrations-token.ts delete mode 100644 src/common/ipc/dialog.ts delete mode 100644 src/common/ipc/native-theme.ts delete mode 100644 src/common/request.ts rename src/common/{fs/move.global-override-for-injectable.ts => user-store/current-timezone.global-override-for-injectable.ts} (55%) create mode 100644 src/common/user-store/current-timezone.injectable.ts create mode 100644 src/common/user-store/https-proxy.injectable.ts create mode 100644 src/common/user-store/lens-color-theme.injectable.ts create mode 100644 src/common/user-store/migrations-token.ts create mode 100644 src/common/user-store/preference-descriptors.injectable.ts create mode 100644 src/common/user-store/terminal-theme.injectable.ts rename src/{migrations/utils.ts => common/utils/generate-new-id-for.ts} (100%) create mode 100644 src/common/utils/random-bytes.global-override-for-injectable.ts create mode 100644 src/common/utils/random-bytes.injectable.ts delete mode 100644 src/common/weblink-store.injectable.ts create mode 100644 src/common/weblinks-store/migration-token.ts create mode 100644 src/common/weblinks-store/weblink-store.injectable.ts rename src/common/{ => weblinks-store}/weblink-store.ts (86%) create mode 100644 src/features/cluster/state-sync/common/channels.ts create mode 100644 src/features/cluster/state-sync/main/emit-update.injectable.ts create mode 100644 src/features/cluster/state-sync/main/handle-initial.injectable.ts create mode 100644 src/features/cluster/state-sync/main/setup-sync.injectable.ts create mode 100644 src/features/cluster/state-sync/renderer/listener.injectable.ts create mode 100644 src/features/cluster/state-sync/renderer/request-initial.injectable.ts create mode 100644 src/features/cluster/state-sync/renderer/setup-sync.injectable.ts create mode 100644 src/features/cluster/store/main/init.injectable.ts create mode 100644 src/features/cluster/store/renderer/init.injectable.ts create mode 100644 src/features/extensions/navigate/common/channel.ts create mode 100644 src/features/extensions/navigate/renderer/listener.injectable.ts create mode 100644 src/features/file-system-provisioner/main/init-store.injectable.ts create mode 100644 src/features/file-system-provisioner/renderer/init-store.injectable.ts delete mode 100644 src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable.ts create mode 100644 src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable.ts create mode 100644 src/features/hotbar/store/main/init.injectable.ts create mode 100644 src/features/hotbar/store/renderer/init.injectable.ts create mode 100644 src/features/path-picking-dialog/common/channel.ts create mode 100644 src/features/path-picking-dialog/main/handle-pick-paths.injectable.ts create mode 100644 src/features/path-picking-dialog/renderer/pick-paths.injectable.ts create mode 100644 src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-all-sync-kinds.injectable.ts create mode 100644 src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts create mode 100644 src/features/theme/system-type/common/channels.ts create mode 100644 src/features/theme/system-type/main/emit-update.injectable.ts create mode 100644 src/features/theme/system-type/main/handle-initial.injectable.ts create mode 100644 src/features/theme/system-type/main/setup-update-emitter.injectable.ts create mode 100644 src/features/theme/system-type/renderer/initialize.injectable.ts create mode 100644 src/features/theme/system-type/renderer/request-initial.injectable.ts create mode 100644 src/features/theme/system-type/renderer/update-listener.injectable.ts create mode 100644 src/main/base-store/disable-sync-in-ipc-listener.injectable.ts create mode 100644 src/main/base-store/ipc-channel-prefix.injectable.ts create mode 100644 src/main/base-store/persist-state-to-config.injectable.ts create mode 100644 src/main/cluster/store-migrations/3.6.0-beta.1.injectable.ts create mode 100644 src/main/cluster/store-migrations/5.0.0-beta.10.injectable.ts rename src/{migrations/cluster-store/5.0.0-beta.13.ts => main/cluster/store-migrations/5.0.0-beta.13.injectable.ts} (59%) create mode 100644 src/main/cluster/store-migrations/snap.injectable.ts create mode 100644 src/main/electron-app/features/set-login-item-settings.injectable.ts create mode 100644 src/main/electron-app/features/show-open-dialog.global-override-for-injectable.ts create mode 100644 src/main/electron-app/features/show-open-dialog.injectable.ts delete mode 100644 src/main/helm/exec.ts create mode 100644 src/main/hotbar-store/migrations/5.0.0-alpha.0.injectable.ts create mode 100644 src/main/hotbar-store/migrations/5.0.0-alpha.2.injectable.ts create mode 100644 src/main/hotbar-store/migrations/5.0.0-beta.10.injectable.ts create mode 100644 src/main/hotbar-store/migrations/5.0.0-beta.5.injectable.ts create mode 100644 src/main/start-main-application/lens-window/current-cluster-frame/listener.injectable.ts delete mode 100644 src/main/start-main-application/lens-window/current-cluster-frame/setup-listener-for-current-cluster-frame.injectable.ts delete mode 100644 src/main/start-main-application/runnables/setup-hotbar-store.injectable.ts delete mode 100644 src/main/start-main-application/runnables/setup-reactions-in-user-store.injectable.ts delete mode 100644 src/main/theme/broadcast-theme-change/broadcast-theme-change.injectable.ts delete mode 100644 src/main/theme/broadcast-theme-change/start-broadcasting-theme-change.injectable.ts delete mode 100644 src/main/theme/broadcast-theme-change/stop-broadcasting-theme-change.injectable.ts create mode 100644 src/main/user-store/migrations/5.0.0-alpha.3.injectable.ts create mode 100644 src/main/user-store/migrations/5.0.3-beta.1.injectable.ts create mode 100644 src/main/user-store/sync-open-at-login-with-os.injectable.ts create mode 100644 src/main/weblinks-store/links.ts create mode 100644 src/main/weblinks-store/migrations/5.1.4.injectable.ts create mode 100644 src/main/weblinks-store/migrations/5.4.5-beta.1.injectable.ts create mode 100644 src/main/weblinks-store/migrations/currentVersion.injectable.ts delete mode 100644 src/migrations/cluster-store/3.6.0-beta.1.ts delete mode 100644 src/migrations/cluster-store/5.0.0-beta.10.ts delete mode 100644 src/migrations/cluster-store/index.ts delete mode 100644 src/migrations/cluster-store/snap.ts delete mode 100644 src/migrations/helpers.ts delete mode 100644 src/migrations/hotbar-store/5.0.0-alpha.0.ts delete mode 100644 src/migrations/hotbar-store/5.0.0-alpha.2.ts delete mode 100644 src/migrations/hotbar-store/5.0.0-beta.10.ts delete mode 100644 src/migrations/hotbar-store/5.0.0-beta.5.ts delete mode 100644 src/migrations/hotbar-store/index.ts delete mode 100644 src/migrations/user-store/2.1.0-beta.4.ts delete mode 100644 src/migrations/user-store/5.0.0-alpha.3.ts delete mode 100644 src/migrations/user-store/5.0.3-beta.1.ts delete mode 100644 src/migrations/user-store/index.ts delete mode 100644 src/migrations/weblinks-store/5.1.4.ts delete mode 100644 src/migrations/weblinks-store/5.4.5-beta.1.ts delete mode 100644 src/migrations/weblinks-store/currentVersion.ts delete mode 100644 src/migrations/weblinks-store/index.ts create mode 100644 src/renderer/base-store/disable-sync-in-ipc-listener.injectable.ts create mode 100644 src/renderer/base-store/ipc-channel-prefix.injectable.ts create mode 100644 src/renderer/base-store/persist-state-to-config.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/configure-immer.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/configure-mobx.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/load-monaco-themes.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-auto-registration.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-current-cluster-broadcast.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-catalog-add-menu.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-root-mac-class.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-sentry.injectable.ts create mode 100644 src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx create mode 100644 src/renderer/before-frame-starts/tokens.ts delete mode 100644 src/renderer/components/+extensions/get-base-registry-url/get-base-registry-url.injectable.ts create mode 100644 src/renderer/components/+extensions/get-base-registry-url/get-base-registry-url.injectable.tsx delete mode 100644 src/renderer/components/+extensions/get-base-registry-url/get-base-registry-url.tsx create mode 100644 src/renderer/components/monaco-editor/monaco-themes/clouds-midnight.injectable.ts delete mode 100644 src/renderer/initializers/catalog-category-registry.tsx delete mode 100644 src/renderer/initializers/catalog.tsx delete mode 100644 src/renderer/initializers/index.ts delete mode 100644 src/renderer/initializers/ipc.ts create mode 100644 src/renderer/monaco/add-new-theme.global-override-for-injectable.ts create mode 100644 src/renderer/monaco/add-new-theme.injectable.ts create mode 100644 src/renderer/themes/apply-lens-theme.injectable.ts create mode 100644 src/renderer/themes/apply-theme.global-override-for-injectable.ts create mode 100644 src/renderer/themes/declaration.ts create mode 100644 src/renderer/themes/default-theme.injectable.ts create mode 100644 src/renderer/themes/lens-dark.injectable.ts delete mode 100644 src/renderer/themes/lens-dark.ts create mode 100644 src/renderer/themes/lens-light.injectable.ts delete mode 100644 src/renderer/themes/lens-light.ts create mode 100644 src/renderer/themes/lens-theme.ts create mode 100644 src/renderer/themes/setup-apply-active-theme.injectable.ts delete mode 100644 src/renderer/themes/store.injectable.ts delete mode 100644 src/renderer/themes/store.ts create mode 100644 src/renderer/themes/system-theme.injectable.ts create mode 100644 src/renderer/themes/terminal-colors.injectable.ts delete mode 100644 src/renderer/themes/theme-vars.css create mode 100644 src/renderer/themes/themes.injectable.ts diff --git a/__mocks__/monaco-editor.ts b/__mocks__/monaco-editor.ts deleted file mode 100644 index 1623a6f00b..0000000000 --- a/__mocks__/monaco-editor.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export default {}; - -export const Uri = { - file: (path: string) => path, -}; - -export const editor = { - getModel: () => ({}), - create: () => ({}), -}; diff --git a/__mocks__/react-beautiful-dnd.tsx b/__mocks__/react-beautiful-dnd.tsx index 79eec81f6e..e3549c2968 100644 --- a/__mocks__/react-beautiful-dnd.tsx +++ b/__mocks__/react-beautiful-dnd.tsx @@ -7,9 +7,49 @@ import React from "react"; import type { DragDropContextProps, DraggableProps, + DraggableProvidedDraggableProps, DroppableProps, + DroppableProvidedProps, } from "react-beautiful-dnd"; export const DragDropContext = ({ children }: DragDropContextProps) => <>{ children }; -export const Draggable = ({ children }: DraggableProps) => <>{ children({} as any, {} as any, {} as any) }; -export const Droppable = ({ children }: DroppableProps) => <>{ children({} as any, {} as any) }; +export const Draggable = ({ children }: DraggableProps) => ( + <> + { + children( + { + draggableProps: {} as DraggableProvidedDraggableProps, + innerRef: () => {}, + }, + { + isDragging: false, + isDropAnimating: false, + }, + { + draggableId: "some-mock-draggable-id", + mode: "FLUID", + source: { + droppableId: "some-mock-droppable-id", + index: 0, + }, + }, + ) + } + +); +export const Droppable = ({ children }: DroppableProps) => ( + <> + { + children( + { + droppableProps: {} as DroppableProvidedProps, + innerRef: () => {}, + }, + { + isDraggingOver: false, + isUsingPlaceholder: false, + }, + ) + } + +); diff --git a/build/build_theme_vars.ts b/build/build_theme_vars.ts deleted file mode 100644 index dbade45847..0000000000 --- a/build/build_theme_vars.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import fs from "fs-extra"; -import path from "path"; -import defaultBaseLensTheme from "../src/renderer/themes/lens-dark"; - -const outputCssFile = path.resolve("src/renderer/themes/theme-vars.css"); - -const banner = `/* - Generated Lens theme CSS-variables, don't edit manually. - To refresh file run $: yarn run ts-node build/${path.basename(__filename)} -*/`; - -const themeCssVars = Object.entries(defaultBaseLensTheme.colors) - .map(([varName, value]) => `--${varName}: ${value};`); - -const content = ` -${banner} - -:root { -${themeCssVars.join("\n")} -} -`; - -// Run -console.info(`"Saving default Lens theme css-variables to "${outputCssFile}""`); -fs.ensureFileSync(outputCssFile); -fs.writeFile(outputCssFile, content); diff --git a/package.json b/package.json index 23bcebe136..a7614cc063 100644 --- a/package.json +++ b/package.json @@ -228,6 +228,7 @@ "grapheme-splitter": "^1.0.4", "handlebars": "^4.7.7", "history": "^4.10.1", + "hpagent": "^1.2.0", "http-proxy": "^1.18.1", "immer": "^9.0.16", "joi": "^17.7.0", diff --git a/src/common/__tests__/base-store.test.ts b/src/common/__tests__/base-store.test.ts deleted file mode 100644 index e6b1c2d1d2..0000000000 --- a/src/common/__tests__/base-store.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import mockFs from "mock-fs"; -import { BaseStore } from "../base-store"; -import { action, comparer, makeObservable, observable, toJS } from "mobx"; -import { readFileSync } from "fs"; -import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; - -jest.mock("electron", () => ({ - ipcMain: { - on: jest.fn(), - off: jest.fn(), - }, -})); - -interface TestStoreModel { - a: string; - b: string; - c: string; -} - -class TestStore extends BaseStore { - @observable a = ""; - @observable b = ""; - @observable c = ""; - - constructor() { - super({ - configName: "test-store", - accessPropertiesByDotNotation: false, // To make dots safe in cluster context names - syncOptions: { - equals: comparer.structural, - }, - }); - - makeObservable(this); - this.load(); - } - - @action updateAll(data: TestStoreModel) { - this.a = data.a; - this.b = data.b; - this.c = data.c; - } - - @action fromStore(data: Partial = {}) { - this.a = data.a || ""; - this.b = data.b || ""; - this.c = data.c || ""; - } - - onSync(data: TestStoreModel) { - super.onSync(data); - } - - async saveToFile(model: TestStoreModel) { - return super.saveToFile(model); - } - - toJSON(): TestStoreModel { - const data: TestStoreModel = { - a: this.a, - b: this.b, - c: this.c, - }; - - return toJS(data); - } -} - -describe("BaseStore", () => { - let store: TestStore; - - beforeEach(() => { - const mainDi = getDiForUnitTesting({ doGeneralOverrides: true }); - - mainDi.override(directoryForUserDataInjectable, () => "some-user-data-directory"); - mainDi.permitSideEffects(getConfigurationFileModelInjectable); - - TestStore.resetInstance(); - - const mockOpts = { - "some-user-data-directory": { - "test-store.json": JSON.stringify({}), - }, - }; - - mockFs(mockOpts); - - store = TestStore.createInstance(); - }); - - afterEach(() => { - mockFs.restore(); - store.disableSync(); - TestStore.resetInstance(); - }); - - describe("persistence", () => { - it("persists changes to the filesystem", () => { - store.updateAll({ - a: "foo", b: "bar", c: "hello", - }); - - const data = JSON.parse(readFileSync("some-user-data-directory/test-store.json").toString()); - - expect(data).toEqual({ a: "foo", b: "bar", c: "hello" }); - }); - - it("persists transaction only once", () => { - const fileSpy = jest.spyOn(store, "saveToFile"); - - store.updateAll({ - a: "foo", b: "bar", c: "hello", - }); - - expect(fileSpy).toHaveBeenCalledTimes(1); - }); - - it("persists changes one-by-one without transaction", () => { - const fileSpy = jest.spyOn(store, "saveToFile"); - - store.a = "a"; - store.b = "b"; - - expect(fileSpy).toHaveBeenCalledTimes(2); - - const data = JSON.parse(readFileSync("some-user-data-directory/test-store.json").toString()); - - expect(data).toEqual({ a: "a", b: "b", c: "" }); - }); - - it("persists changes coming via onSync (sync from different process)", () => { - const fileSpy = jest.spyOn(store, "saveToFile"); - - store.onSync({ a: "foo", b: "", c: "bar" }); - - expect(store.toJSON()).toEqual({ a: "foo", b: "", c: "bar" }); - - expect(fileSpy).toHaveBeenCalledTimes(1); - }); - }); -}); diff --git a/src/common/__tests__/cluster-store.test.ts b/src/common/__tests__/cluster-store.test.ts index 2253c7662f..28357ae5ff 100644 --- a/src/common/__tests__/cluster-store.test.ts +++ b/src/common/__tests__/cluster-store.test.ts @@ -93,10 +93,9 @@ describe("cluster-store", () => { mainDi.override(normalizedPlatformInjectable, () => "darwin"); mainDi.permitSideEffects(getConfigurationFileModelInjectable); - mainDi.permitSideEffects(clusterStoreInjectable); - mainDi.permitSideEffects(fsInjectable); + mainDi.unoverride(getConfigurationFileModelInjectable); - mainDi.unoverride(clusterStoreInjectable); + mainDi.permitSideEffects(fsInjectable); }); afterEach(() => { @@ -107,23 +106,19 @@ describe("cluster-store", () => { let getCustomKubeConfigDirectory: (directoryName: string) => string; beforeEach(async () => { - getCustomKubeConfigDirectory = mainDi.inject( - getCustomKubeConfigDirectoryInjectable, - ); + getCustomKubeConfigDirectory = mainDi.inject(getCustomKubeConfigDirectoryInjectable); - const mockOpts = { + mockFs({ "some-directory-for-user-data": { "lens-cluster-store.json": JSON.stringify({}), }, - }; - - mockFs(mockOpts); + }); createCluster = mainDi.inject(createClusterInjectionToken); clusterStore = mainDi.inject(clusterStoreInjectable); - clusterStore.unregisterIpcListener(); + clusterStore.load(); }); afterEach(() => { @@ -207,7 +202,7 @@ describe("cluster-store", () => { describe("config with existing clusters", () => { beforeEach(() => { - const mockOpts = { + mockFs({ "temp-kube-config": kubeconfig, "some-directory-for-user-data": { "lens-cluster-store.json": JSON.stringify({ @@ -241,13 +236,12 @@ describe("cluster-store", () => { ], }), }, - }; - - mockFs(mockOpts); + }); createCluster = mainDi.inject(createClusterInjectionToken); clusterStore = mainDi.inject(clusterStoreInjectable); + clusterStore.load(); }); afterEach(() => { @@ -297,7 +291,7 @@ users: token: kubeconfig-user-q4lm4:xxxyyyy `; - const mockOpts = { + mockFs({ "invalid-kube-config": invalidKubeconfig, "valid-kube-config": kubeconfig, "some-directory-for-user-data": { @@ -325,13 +319,12 @@ users: ], }), }, - }; - - mockFs(mockOpts); + }); createCluster = mainDi.inject(createClusterInjectionToken); clusterStore = mainDi.inject(clusterStoreInjectable); + clusterStore.load(); }); afterEach(() => { @@ -347,7 +340,7 @@ users: describe("pre 3.6.0-beta.1 config with an existing cluster", () => { beforeEach(() => { - const mockOpts = { + mockFs({ "some-directory-for-user-data": { "lens-cluster-store.json": JSON.stringify({ __internal__: { @@ -368,15 +361,14 @@ users: }), icon_path: testDataIcon, }, - }; - - mockFs(mockOpts); + }); mainDi.override(storeMigrationVersionInjectable, () => "3.6.0"); createCluster = mainDi.inject(createClusterInjectionToken); clusterStore = mainDi.inject(clusterStoreInjectable); + clusterStore.load(); }); afterEach(() => { diff --git a/src/common/__tests__/hotbar-store.test.ts b/src/common/__tests__/hotbar-store.test.ts index 0e1b3e27a2..a0a618d4df 100644 --- a/src/common/__tests__/hotbar-store.test.ts +++ b/src/common/__tests__/hotbar-store.test.ts @@ -19,6 +19,7 @@ import loggerInjectable from "../logger.injectable"; import type { Logger } from "../logger"; import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; +import fsInjectable from "../fs/fs.injectable"; function getMockCatalogEntity(data: Partial & CatalogEntityKindData): CatalogEntity { return { @@ -46,7 +47,7 @@ describe("HotbarStore", () => { beforeEach(async () => { di = getDiForUnitTesting({ doGeneralOverrides: true }); - (di as any).unoverride(hotbarStoreInjectable); + di.unoverride(hotbarStoreInjectable); testCluster = getMockCatalogEntity({ apiVersion: "v1", @@ -112,8 +113,9 @@ describe("HotbarStore", () => { catalogCatalogEntity, ])); + di.permitSideEffects(fsInjectable); di.permitSideEffects(getConfigurationFileModelInjectable); - di.permitSideEffects(hotbarStoreInjectable); + di.unoverride(getConfigurationFileModelInjectable); }); afterEach(() => { @@ -255,22 +257,12 @@ describe("HotbarStore", () => { }); it("throws if invalid arguments provided", () => { - // Prevent writing to stderr during this render. - const { error, warn } = console; - - console.error = jest.fn(); - console.warn = jest.fn(); - hotbarStore.addToHotbar(testCluster); expect(() => hotbarStore.restackItems(-5, 0)).toThrow(); expect(() => hotbarStore.restackItems(2, -1)).toThrow(); expect(() => hotbarStore.restackItems(14, 1)).toThrow(); expect(() => hotbarStore.restackItems(11, 112)).toThrow(); - - // Restore writing to stderr. - console.error = error; - console.warn = warn; }); it("checks if entity already pinned to hotbar", () => { @@ -284,7 +276,7 @@ describe("HotbarStore", () => { describe("given data from 5.0.0-beta.3 and version being 5.0.0-beta.10", () => { beforeEach(() => { - const configurationToBeMigrated = { + mockFs({ "some-directory-for-user-data": { "lens-hotbar-store.json": JSON.stringify({ __internal__: { @@ -344,9 +336,7 @@ describe("HotbarStore", () => { ], }), }, - }; - - mockFs(configurationToBeMigrated); + }); di.override(storeMigrationVersionInjectable, () => "5.0.0-beta.10"); diff --git a/src/common/__tests__/user-store.test.ts b/src/common/__tests__/user-store.test.ts index eeadbc1e6c..8ae213d412 100644 --- a/src/common/__tests__/user-store.test.ts +++ b/src/common/__tests__/user-store.test.ts @@ -35,6 +35,7 @@ import getConfigurationFileModelInjectable from "../get-configuration-file-model import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; import releaseChannelInjectable from "../vars/release-channel.injectable"; import defaultUpdateChannelInjectable from "../../features/application-update/common/selected-update-channel/default-update-channel.injectable"; +import fsInjectable from "../fs/fs.injectable"; console = new Console(stdout, stderr); @@ -49,8 +50,10 @@ describe("user store tests", () => { di.override(writeFileInjectable, () => () => Promise.resolve()); di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data"); + di.permitSideEffects(getConfigurationFileModelInjectable); - di.permitSideEffects(userStoreInjectable); + di.unoverride(getConfigurationFileModelInjectable); + di.permitSideEffects(fsInjectable); di.override(releaseChannelInjectable, () => ({ get: () => "latest" as const, @@ -58,7 +61,7 @@ describe("user store tests", () => { })); await di.inject(defaultUpdateChannelInjectable).init(); - di.unoverride(userStoreInjectable); + userStore = di.inject(userStoreInjectable); }); afterEach(() => { @@ -67,17 +70,11 @@ describe("user store tests", () => { describe("for an empty config", () => { beforeEach(() => { - mockFs({ "some-directory-for-user-data": { "config.json": "{}", "kube_config": "{}" }}); + mockFs({ "some-directory-for-user-data": { "lens-user-store.json": "{}", "kube_config": "{}" }}); - userStore = di.inject(userStoreInjectable); userStore.load(); }); - it("allows setting and retrieving lastSeenAppVersion", () => { - userStore.lastSeenAppVersion = "1.2.3"; - expect(userStore.lastSeenAppVersion).toBe("1.2.3"); - }); - it("allows setting and getting preferences", () => { userStore.httpsProxy = "abcd://defg"; @@ -99,10 +96,8 @@ describe("user store tests", () => { beforeEach(() => { mockFs({ "some-directory-for-user-data": { - "config.json": JSON.stringify({ - user: { username: "foobar" }, + "lens-user-store.json": JSON.stringify({ preferences: { colorTheme: "light" }, - lastSeenAppVersion: "1.2.3", }), "lens-cluster-store.json": JSON.stringify({ clusters: [ @@ -127,17 +122,16 @@ describe("user store tests", () => { di.override(storeMigrationVersionInjectable, () => "10.0.0"); - userStore = di.inject(userStoreInjectable); userStore.load(); }); - it("sets last seen app version to 0.0.0", () => { - expect(userStore.lastSeenAppVersion).toBe("0.0.0"); - }); - - it.only("skips clusters for adding to kube-sync with files under extension_data/", () => { + it("skips clusters for adding to kube-sync with files under extension_data/", () => { expect(userStore.syncKubeconfigEntries.has("some-directory-for-user-data/extension_data/foo/bar")).toBe(false); expect(userStore.syncKubeconfigEntries.has("some/other/path")).toBe(true); }); + + it("allows access to the colorTheme preference", () => { + expect(userStore.colorTheme).toBe("light"); + }); }); }); diff --git a/src/common/app-paths/app-path-injection-token.ts b/src/common/app-paths/app-path-injection-token.ts index e29bcdbebf..91e8a580d8 100644 --- a/src/common/app-paths/app-path-injection-token.ts +++ b/src/common/app-paths/app-path-injection-token.ts @@ -2,11 +2,6 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectionToken } from "@ogre-tools/injectable"; import type { PathName } from "./app-path-names"; export type AppPaths = Record; - -export const appPathsInjectionToken = getInjectionToken({ id: "app-paths-token" }); - - diff --git a/src/common/app-paths/app-paths.injectable.ts b/src/common/app-paths/app-paths.injectable.ts index 803f9e1380..0e836a8514 100644 --- a/src/common/app-paths/app-paths.injectable.ts +++ b/src/common/app-paths/app-paths.injectable.ts @@ -3,13 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { appPathsInjectionToken } from "./app-path-injection-token"; import appPathsStateInjectable from "./app-paths-state.injectable"; const appPathsInjectable = getInjectable({ id: "app-paths", instantiate: (di) => di.inject(appPathsStateInjectable).get(), - injectionToken: appPathsInjectionToken, }); export default appPathsInjectable; diff --git a/src/common/app-paths/app-paths.test.ts b/src/common/app-paths/app-paths.test.ts index 0fa6141f33..b26a5aca5d 100644 --- a/src/common/app-paths/app-paths.test.ts +++ b/src/common/app-paths/app-paths.test.ts @@ -3,7 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { AppPaths } from "./app-path-injection-token"; -import { appPathsInjectionToken } from "./app-path-injection-token"; import getElectronAppPathInjectable from "../../main/app-paths/get-electron-app-path/get-electron-app-path.injectable"; import type { PathName } from "./app-path-names"; import setElectronAppPathInjectable from "../../main/app-paths/set-electron-app-path/set-electron-app-path.injectable"; @@ -11,6 +10,7 @@ import directoryForIntegrationTestingInjectable from "../../main/app-paths/direc import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { DiContainer } from "@ogre-tools/injectable"; +import appPathsInjectable from "./app-paths.injectable"; describe("app-paths", () => { let builder: ApplicationBuilder; @@ -68,7 +68,7 @@ describe("app-paths", () => { }); it("given in renderer, when injecting app paths, returns application specific app paths", () => { - const actual = windowDi.inject(appPathsInjectionToken); + const actual = windowDi.inject(appPathsInjectable); expect(actual).toEqual({ currentApp: "some-current-app", @@ -92,7 +92,7 @@ describe("app-paths", () => { }); it("given in main, when injecting app paths, returns application specific app paths", () => { - const actual = mainDi.inject(appPathsInjectionToken); + const actual = mainDi.inject(appPathsInjectable); expect(actual).toEqual({ currentApp: "some-current-app", @@ -133,7 +133,7 @@ describe("app-paths", () => { }); it("given in renderer, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = windowDi.inject(appPathsInjectionToken); + const { appData, userData } = windowDi.inject(appPathsInjectable); expect({ appData, userData }).toEqual({ appData: "some-integration-testing-app-data", @@ -142,7 +142,7 @@ describe("app-paths", () => { }); it("given in main, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = windowDi.inject(appPathsInjectionToken); + const { appData, userData } = windowDi.inject(appPathsInjectable); expect({ appData, userData }).toEqual({ appData: "some-integration-testing-app-data", diff --git a/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts b/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts index 944c8a656a..01f97dbaec 100644 --- a/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts +++ b/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { appPathsInjectionToken } from "../app-path-injection-token"; +import appPathsInjectable from "../app-paths.injectable"; const directoryForDownloadsInjectable = getInjectable({ id: "directory-for-downloads", - instantiate: (di) => di.inject(appPathsInjectionToken).downloads, + instantiate: (di) => di.inject(appPathsInjectable).downloads, }); export default directoryForDownloadsInjectable; diff --git a/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts b/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts index 1bd245daa4..690f53d958 100644 --- a/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts +++ b/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { appPathsInjectionToken } from "../app-path-injection-token"; +import appPathsInjectable from "../app-paths.injectable"; const directoryForExesInjectable = getInjectable({ id: "directory-for-exes", - instantiate: (di) => di.inject(appPathsInjectionToken).exe, + instantiate: (di) => di.inject(appPathsInjectable).exe, }); export default directoryForExesInjectable; diff --git a/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts b/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts index b51e8e0489..460efc073d 100644 --- a/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts +++ b/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { appPathsInjectionToken } from "../app-path-injection-token"; +import appPathsInjectable from "../app-paths.injectable"; const directoryForTempInjectable = getInjectable({ id: "directory-for-temp", - instantiate: (di) => di.inject(appPathsInjectionToken).temp, + instantiate: (di) => di.inject(appPathsInjectable).temp, }); export default directoryForTempInjectable; diff --git a/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts b/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts index bff067b7e5..0eb32221c6 100644 --- a/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts +++ b/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { appPathsInjectionToken } from "../app-path-injection-token"; +import appPathsInjectable from "../app-paths.injectable"; const directoryForUserDataInjectable = getInjectable({ id: "directory-for-user-data", - instantiate: (di) => di.inject(appPathsInjectionToken).userData, + instantiate: (di) => di.inject(appPathsInjectable).userData, }); export default directoryForUserDataInjectable; diff --git a/src/common/base-store.ts b/src/common/base-store.ts deleted file mode 100644 index 92383b328d..0000000000 --- a/src/common/base-store.ts +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import type Config from "conf"; -import type { Options as ConfOptions } from "conf/dist/source/types"; -import { ipcMain, ipcRenderer } from "electron"; -import type { IEqualsComparer } from "mobx"; -import { makeObservable, reaction, runInAction } from "mobx"; -import type { Disposer } from "./utils"; -import { Singleton, toJS } from "./utils"; -import logger from "../main/logger"; -import { broadcastMessage, ipcMainOn, ipcRendererOn } from "./ipc"; -import isEqual from "lodash/isEqual"; -import { isTestEnv } from "./vars"; -import { kebabCase } from "lodash"; -import { getLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; -import directoryForUserDataInjectable from "./app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import getConfigurationFileModelInjectable from "./get-configuration-file-model/get-configuration-file-model.injectable"; -import storeMigrationVersionInjectable from "./vars/store-migration-version.injectable"; - -export interface BaseStoreParams extends ConfOptions { - syncOptions?: { - fireImmediately?: boolean; - equals?: IEqualsComparer; - }; -} - -/** - * Note: T should only contain base JSON serializable types. - */ -export abstract class BaseStore extends Singleton { - protected storeConfig?: Config; - protected syncDisposers: Disposer[] = []; - - readonly displayName: string = this.constructor.name; - - protected constructor(protected params: BaseStoreParams) { - super(); - makeObservable(this); - - if (ipcRenderer) { - params.migrations = undefined; // don't run migrations on renderer - } - } - - /** - * This must be called after the last child's constructor is finished (or just before it finishes) - */ - load() { - if (!isTestEnv) { - logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`); - } - - const di = getLegacyGlobalDiForExtensionApi(); - - const getConfigurationFileModel = di.inject(getConfigurationFileModelInjectable); - - this.storeConfig = getConfigurationFileModel({ - projectName: "lens", - projectVersion: di.inject(storeMigrationVersionInjectable), - cwd: this.cwd(), - ...this.params, - }); - - const res: any = this.fromStore(this.storeConfig.store); - - if (res instanceof Promise || (typeof res === "object" && res && typeof res.then === "function")) { - console.error(`${this.displayName} extends BaseStore's fromStore method returns a Promise or promise-like object. This is an error and must be fixed.`); - } - - this.enableSync(); - - if (!isTestEnv) { - logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADED from ${this.path}`); - } - } - - get name() { - return path.basename(this.path); - } - - protected get syncRendererChannel() { - return `store-sync-renderer:${this.path}`; - } - - protected get syncMainChannel() { - return `store-sync-main:${this.path}`; - } - - get path() { - return this.storeConfig?.path || ""; - } - - protected cwd() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(directoryForUserDataInjectable); - } - - protected saveToFile(model: T) { - logger.info(`[STORE]: SAVING ${this.path}`); - - // todo: update when fixed https://github.com/sindresorhus/conf/issues/114 - if (this.storeConfig) { - for (const [key, value] of Object.entries(model)) { - this.storeConfig.set(key, value); - } - } - } - - enableSync() { - this.syncDisposers.push( - reaction( - () => toJS(this.toJSON()), // unwrap possible observables and react to everything - model => this.onModelChange(model), - this.params.syncOptions, - ), - ); - - if (ipcMain) { - this.syncDisposers.push(ipcMainOn(this.syncMainChannel, (event, model: T) => { - logger.silly(`[STORE]: SYNC ${this.name} from renderer`, { model }); - this.onSync(model); - })); - } - - if (ipcRenderer) { - this.syncDisposers.push(ipcRendererOn(this.syncRendererChannel, (event, model: T) => { - logger.silly(`[STORE]: SYNC ${this.name} from main`, { model }); - this.onSyncFromMain(model); - })); - } - } - - protected onSyncFromMain(model: T) { - this.applyWithoutSync(() => { - this.onSync(model); - }); - } - - unregisterIpcListener() { - ipcRenderer?.removeAllListeners(this.syncMainChannel); - ipcRenderer?.removeAllListeners(this.syncRendererChannel); - } - - disableSync() { - this.syncDisposers.forEach(dispose => dispose()); - this.syncDisposers.length = 0; - } - - protected applyWithoutSync(callback: () => void) { - this.disableSync(); - runInAction(callback); - this.enableSync(); - } - - protected onSync(model: T) { - // todo: use "resourceVersion" if merge required (to avoid equality checks => better performance) - if (!isEqual(this.toJSON(), model)) { - this.fromStore(model); - } - } - - protected onModelChange(model: T) { - if (ipcMain) { - this.saveToFile(model); // save config file - broadcastMessage(this.syncRendererChannel, model); - } else { - broadcastMessage(this.syncMainChannel, model); - } - } - - /** - * fromStore is called internally when a child class syncs with the file - * system. - * - * Note: This function **must** be synchronous. - * - * @param data the parsed information read from the stored JSON file - */ - protected abstract fromStore(data: T): void; - - /** - * toJSON is called when syncing the store to the filesystem. It should - * produce a JSON serializable object representation of the current state. - * - * It is recommended that a round trip is valid. Namely, calling - * `this.fromStore(this.toJSON())` shouldn't change the state. - */ - abstract toJSON(): T; -} diff --git a/src/common/base-store/base-store.ts b/src/common/base-store/base-store.ts new file mode 100644 index 0000000000..9a786329e4 --- /dev/null +++ b/src/common/base-store/base-store.ts @@ -0,0 +1,148 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type Config from "conf"; +import type { Migrations, Options as ConfOptions } from "conf/dist/source/types"; +import type { IEqualsComparer } from "mobx"; +import { makeObservable, reaction } from "mobx"; +import { disposer, isPromiseLike, toJS } from "../utils"; +import { broadcastMessage } from "../ipc"; +import isEqual from "lodash/isEqual"; +import { kebabCase } from "lodash"; +import type { GetConfigurationFileModel } from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import type { Logger } from "../logger"; +import type { PersistStateToConfig } from "./save-to-file"; +import type { GetBasenameOfPath } from "../path/get-basename.injectable"; +import type { EnlistMessageChannelListener } from "../utils/channel/enlist-message-channel-listener-injection-token"; + +export interface BaseStoreParams extends Omit, "migrations"> { + syncOptions?: { + fireImmediately?: boolean; + equals?: IEqualsComparer; + }; + configName: string; +} + +export interface IpcChannelPrefixes { + local: string; + remote: string; +} + +export interface BaseStoreDependencies { + readonly logger: Logger; + readonly storeMigrationVersion: string; + readonly directoryForUserData: string; + readonly migrations: Migrations>; + readonly ipcChannelPrefixes: IpcChannelPrefixes; + readonly shouldDisableSyncInListener: boolean; + getConfigurationFileModel: GetConfigurationFileModel; + persistStateToConfig: PersistStateToConfig; + getBasenameOfPath: GetBasenameOfPath; + enlistMessageChannelListener: EnlistMessageChannelListener; +} + +/** + * Note: T should only contain base JSON serializable types. + */ +export abstract class BaseStore { + private readonly syncDisposers = disposer(); + + readonly displayName = kebabCase(this.params.configName).toUpperCase(); + + protected constructor( + protected readonly dependencies: BaseStoreDependencies, + protected readonly params: BaseStoreParams, + ) { + makeObservable(this); + } + + /** + * This must be called after the last child's constructor is finished (or just before it finishes) + */ + load() { + this.dependencies.logger.info(`[${this.displayName}]: LOADING ...`); + + const config = this.dependencies.getConfigurationFileModel({ + projectName: "lens", + projectVersion: this.dependencies.storeMigrationVersion, + cwd: this.cwd(), + ...this.params, + migrations: this.dependencies.migrations as Migrations, + }); + + const res = this.fromStore(config.store); + + if (isPromiseLike(res)) { + this.dependencies.logger.error(`${this.displayName} extends BaseStore's fromStore method returns a Promise or promise-like object. This is an error and must be fixed.`); + } + + this.startSyncing(config); + this.dependencies.logger.info(`[${this.displayName}]: LOADED from ${config.path}`); + } + + protected cwd() { + return this.dependencies.directoryForUserData; + } + + private startSyncing(config: Config) { + const name = this.dependencies.getBasenameOfPath(config.path); + + const disableSync = () => this.syncDisposers(); + const enableSync = () => { + this.syncDisposers.push( + reaction( + () => toJS(this.toJSON()), // unwrap possible observables and react to everything + model => { + this.dependencies.persistStateToConfig(config, model); + broadcastMessage(`${this.dependencies.ipcChannelPrefixes.remote}:${config.path}`, model); + }, + this.params.syncOptions, + ), + this.dependencies.enlistMessageChannelListener({ + channel: { + id: `${this.dependencies.ipcChannelPrefixes.local}:${config.path}`, + }, + handler: (model) => { + this.dependencies.logger.silly(`[${this.displayName}]: syncing ${name}`, { model }); + + if (this.dependencies.shouldDisableSyncInListener) { + disableSync(); + } + + // todo: use "resourceVersion" if merge required (to avoid equality checks => better performance) + if (!isEqual(this.toJSON(), model)) { + this.fromStore(model as T); + } + + if (this.dependencies.shouldDisableSyncInListener) { + enableSync(); + } + }, + }), + ); + }; + + enableSync(); + } + + /** + * fromStore is called internally when a child class syncs with the file + * system. + * + * Note: This function **must** be synchronous. + * + * @param data the parsed information read from the stored JSON file + */ + protected abstract fromStore(data: T): void; + + /** + * toJSON is called when syncing the store to the filesystem. It should + * produce a JSON serializable object representation of the current state. + * + * It is recommended that a round trip is valid. Namely, calling + * `this.fromStore(this.toJSON())` shouldn't change the state. + */ + abstract toJSON(): T; +} diff --git a/src/common/base-store/channel-prefix.ts b/src/common/base-store/channel-prefix.ts new file mode 100644 index 0000000000..f2662c65e0 --- /dev/null +++ b/src/common/base-store/channel-prefix.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { IpcChannelPrefixes } from "./base-store"; + +export const baseStoreIpcChannelPrefixesInjectionToken = getInjectionToken({ + id: "base-store-ipc-channel-prefix-token", +}); diff --git a/src/renderer/before-frame-starts/before-frame-starts-injection-token.ts b/src/common/base-store/disable-sync.ts similarity index 54% rename from src/renderer/before-frame-starts/before-frame-starts-injection-token.ts rename to src/common/base-store/disable-sync.ts index e494508329..ce7abd16a1 100644 --- a/src/renderer/before-frame-starts/before-frame-starts-injection-token.ts +++ b/src/common/base-store/disable-sync.ts @@ -2,9 +2,9 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { Runnable } from "../../common/runnable/run-many-for"; -export const beforeFrameStartsInjectionToken = getInjectionToken({ - id: "before-frame-starts", +import { getInjectionToken } from "@ogre-tools/injectable"; + +export const shouldBaseStoreDisableSyncInIpcListenerInjectionToken = getInjectionToken({ + id: "should-base-store-disable-sync-in-ipc-listener-token", }); diff --git a/src/common/base-store/migrations.injectable.ts b/src/common/base-store/migrations.injectable.ts new file mode 100644 index 0000000000..27f7489dfa --- /dev/null +++ b/src/common/base-store/migrations.injectable.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { InjectionToken } from "@ogre-tools/injectable"; +import { lifecycleEnum, getInjectable } from "@ogre-tools/injectable"; +import type Conf from "conf/dist/source"; +import type { Migrations } from "conf/dist/source/types"; +import loggerInjectable from "../logger.injectable"; +import { getOrInsert, iter } from "../utils"; + +export interface MigrationDeclaration { + version: string; + run(store: Conf>>): void; +} + +const storeMigrationsInjectable = getInjectable({ + id: "store-migrations", + instantiate: (di, token): Migrations> => { + const logger = di.inject(loggerInjectable); + const declarations = di.injectMany(token); + const migrations = new Map(); + + for (const decl of declarations) { + getOrInsert(migrations, decl.version, []).push(decl.run); + } + + return Object.fromEntries( + iter.map( + migrations, + ([v, fns]) => [v, (store) => { + logger.info(`Running ${v} migration for ${store.path}`); + + for (const fn of fns) { + fn(store); + } + }], + ), + ); + }, + lifecycle: lifecycleEnum.keyedSingleton({ + getInstanceKey: (di, token: InjectionToken) => token.id, + }), +}); + +export default storeMigrationsInjectable; diff --git a/src/common/base-store/save-to-file.ts b/src/common/base-store/save-to-file.ts new file mode 100644 index 0000000000..b4d21ea950 --- /dev/null +++ b/src/common/base-store/save-to-file.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type Config from "conf"; + +export type PersistStateToConfig = (config: Config, state: T) => void; + +export const persistStateToConfigInjectionToken = getInjectionToken({ + id: "persist-state-to-config-token", +}); diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 53e7a52e4b..1af4302bb1 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -5,13 +5,14 @@ import type { CatalogEntityActionContext, CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus, CatalogCategorySpec } from "../catalog"; import { CatalogEntity, CatalogCategory, categoryVersion } from "../catalog/catalog-entity"; -import { ClusterStore } from "../cluster-store/cluster-store"; import { broadcastMessage } from "../ipc"; import { app } from "electron"; import type { CatalogEntityConstructor, CatalogEntitySpec } from "../catalog/catalog-entity"; import { IpcRendererNavigationEvents } from "../../renderer/navigation/events"; import { requestClusterActivation, requestClusterDisconnection } from "../../renderer/ipc"; import KubeClusterCategoryIcon from "./icons/kubernetes.svg"; +import { asLegacyGlobalFunctionForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api"; +import getClusterByIdInjectable from "../cluster-store/get-by-id.injectable"; export interface KubernetesClusterPrometheusMetrics { address?: { @@ -63,6 +64,8 @@ export function isKubernetesCluster(item: unknown): item is KubernetesCluster { return item instanceof KubernetesCluster; } +const getClusterById = asLegacyGlobalFunctionForExtensionApi(getClusterByIdInjectable); + export class KubernetesCluster< Metadata extends KubernetesClusterMetadata = KubernetesClusterMetadata, Status extends KubernetesClusterStatus = KubernetesClusterStatus, @@ -76,7 +79,7 @@ export class KubernetesCluster< async connect(): Promise { if (app) { - await ClusterStore.getInstance().getById(this.getId())?.activate(); + await getClusterById(this.getId())?.activate(); } else { await requestClusterActivation(this.getId(), false); } @@ -84,7 +87,7 @@ export class KubernetesCluster< async disconnect(): Promise { if (app) { - ClusterStore.getInstance().getById(this.getId())?.disconnect(); + getClusterById(this.getId())?.disconnect(); } else { await requestClusterDisconnection(this.getId(), false); } diff --git a/src/common/catalog-entities/web-link.ts b/src/common/catalog-entities/web-link.ts index b79f798566..7c83051c8b 100644 --- a/src/common/catalog-entities/web-link.ts +++ b/src/common/catalog-entities/web-link.ts @@ -7,7 +7,7 @@ import { Environments, getEnvironmentSpecificLegacyGlobalDiForExtensionApi } fro import type { CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus } from "../catalog"; import { CatalogCategory, CatalogEntity, categoryVersion } from "../catalog/catalog-entity"; import productNameInjectable from "../vars/product-name.injectable"; -import weblinkStoreInjectable from "../weblink-store.injectable"; +import weblinkStoreInjectable from "../weblinks-store/weblink-store.injectable"; export type WebLinkStatusPhase = "available" | "unavailable"; @@ -34,12 +34,13 @@ export class WebLink extends CatalogEntity di.inject(weblinkStoreInjectable).removeById(this.getId()), + onClick: async () => weblinkStore.removeById(this.getId()), confirm: { message: `Remove Web Link "${this.getName()}" from ${productName}?`, }, diff --git a/src/common/catalog/catalog-category-registry.ts b/src/common/catalog/catalog-category-registry.ts deleted file mode 100644 index d456f38f06..0000000000 --- a/src/common/catalog/catalog-category-registry.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { asLegacyGlobalForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; -import catalogCategoryRegistryInjectable from "./category-registry.injectable"; - -/** - * @deprecated use `di.inject(catalogCategoryRegistryInjectable)` instead - */ -export const catalogCategoryRegistry = asLegacyGlobalForExtensionApi(catalogCategoryRegistryInjectable); diff --git a/src/common/catalog/index.ts b/src/common/catalog/index.ts index a5c5ec4276..4964dada6a 100644 --- a/src/common/catalog/index.ts +++ b/src/common/catalog/index.ts @@ -3,6 +3,5 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -export * from "./catalog-category-registry"; export * from "./category-registry"; export * from "./catalog-entity"; diff --git a/src/common/cluster-store/cluster-store.global-override-for-injectable.ts b/src/common/cluster-store/cluster-store.global-override-for-injectable.ts deleted file mode 100644 index 32a1ee62a1..0000000000 --- a/src/common/cluster-store/cluster-store.global-override-for-injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getGlobalOverride } from "../test-utils/get-global-override"; -import clusterStoreInjectable from "./cluster-store.injectable"; -import type { Cluster } from "../cluster/cluster"; -import type { ClusterStore } from "./cluster-store"; - -export default getGlobalOverride( - clusterStoreInjectable, - () => - ({ - provideInitialFromMain: () => {}, - getById: (id) => (void id, {}) as Cluster, - } as ClusterStore), -); diff --git a/src/common/cluster-store/cluster-store.injectable.ts b/src/common/cluster-store/cluster-store.injectable.ts index 3e7cf86c53..9712e3fdb0 100644 --- a/src/common/cluster-store/cluster-store.injectable.ts +++ b/src/common/cluster-store/cluster-store.injectable.ts @@ -7,21 +7,36 @@ import { ClusterStore } from "./cluster-store"; import { createClusterInjectionToken } from "../cluster/create-cluster-injection-token"; import readClusterConfigSyncInjectable from "./read-cluster-config.injectable"; import emitAppEventInjectable from "../app-event-bus/emit-event.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; +import storeMigrationsInjectable from "../base-store/migrations.injectable"; +import { clusterStoreMigrationInjectionToken } from "./migration-token"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-store/disable-sync"; +import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; +import getBasenameOfPathInjectable from "../path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../utils/channel/enlist-message-channel-listener-injection-token"; const clusterStoreInjectable = getInjectable({ id: "cluster-store", - instantiate: (di) => { - ClusterStore.resetInstance(); - - return ClusterStore.createInstance({ - createCluster: di.inject(createClusterInjectionToken), - readClusterConfigSync: di.inject(readClusterConfigSyncInjectable), - emitAppEvent: di.inject(emitAppEventInjectable), - }); - }, - - causesSideEffects: true, + instantiate: (di) => new ClusterStore({ + createCluster: di.inject(createClusterInjectionToken), + readClusterConfigSync: di.inject(readClusterConfigSyncInjectable), + emitAppEvent: di.inject(emitAppEventInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: di.inject(storeMigrationsInjectable, clusterStoreMigrationInjectionToken), + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }), }); export default clusterStoreInjectable; diff --git a/src/common/cluster-store/cluster-store.ts b/src/common/cluster-store/cluster-store.ts index 7b46460013..20929cf77e 100644 --- a/src/common/cluster-store/cluster-store.ts +++ b/src/common/cluster-store/cluster-store.ts @@ -4,17 +4,12 @@ */ -import { ipcMain, ipcRenderer, webFrame } from "electron"; -import { action, comparer, computed, makeObservable, observable, reaction } from "mobx"; -import { BaseStore } from "../base-store"; +import { action, comparer, computed, makeObservable, observable } from "mobx"; +import type { BaseStoreDependencies } from "../base-store/base-store"; +import { BaseStore } from "../base-store/base-store"; import { Cluster } from "../cluster/cluster"; -import migrations from "../../migrations/cluster-store"; -import logger from "../../main/logger"; -import { ipcMainHandle } from "../ipc"; -import { disposer, toJS } from "../utils"; -import type { ClusterModel, ClusterId, ClusterState } from "../cluster-types"; -import { requestInitialClusterStates } from "../../renderer/ipc"; -import { clusterStates } from "../ipc/cluster"; +import { toJS } from "../utils"; +import type { ClusterModel, ClusterId } from "../cluster-types"; import type { CreateCluster } from "../cluster/create-cluster-injection-token"; import type { ReadClusterConfigSync } from "./read-cluster-config.injectable"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; @@ -23,76 +18,25 @@ export interface ClusterStoreModel { clusters?: ClusterModel[]; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { createCluster: CreateCluster; readClusterConfigSync: ReadClusterConfigSync; emitAppEvent: EmitAppEvent; } export class ClusterStore extends BaseStore { - readonly displayName = "ClusterStore"; - clusters = observable.map(); + readonly clusters = observable.map(); - protected disposer = disposer(); - - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-cluster-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { equals: comparer.structural, }, - migrations, }); makeObservable(this); - this.load(); - this.pushStateToViewsAutomatically(); - } - - async loadInitialOnRenderer() { - logger.info("[CLUSTER-STORE] requesting initial state sync"); - - for (const { id, state } of await requestInitialClusterStates()) { - this.getById(id)?.setState(state); - } - } - - provideInitialFromMain() { - ipcMainHandle(clusterStates, () => ( - this.clustersList.map(cluster => ({ - id: cluster.id, - state: cluster.getState(), - })) - )); - } - - protected pushStateToViewsAutomatically() { - if (ipcMain) { - this.disposer.push( - reaction(() => this.connectedClustersList, () => this.pushState()), - ); - } - } - - registerIpcListener() { - logger.info(`[CLUSTER-STORE] start to listen (${webFrame.routingId})`); - const ipc = ipcMain ?? ipcRenderer; - - ipc?.on("cluster:state", (event, clusterId: ClusterId, state: ClusterState) => { - this.getById(clusterId)?.setState(state); - }); - } - - unregisterIpcListener() { - super.unregisterIpcListener(); - this.disposer(); - } - - pushState() { - this.clusters.forEach((c) => { - c.pushState(); - }); } @computed get clustersList(): Cluster[] { @@ -150,7 +94,7 @@ export class ClusterStore extends BaseStore { } newClusters.set(clusterModel.id, cluster); } catch (error) { - logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${error}`); + this.dependencies.logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${error}`); } } diff --git a/src/common/cluster-store/migration-token.ts b/src/common/cluster-store/migration-token.ts new file mode 100644 index 0000000000..86489509a2 --- /dev/null +++ b/src/common/cluster-store/migration-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { MigrationDeclaration } from "../base-store/migrations.injectable"; + +export const clusterStoreMigrationInjectionToken = getInjectionToken({ + id: "cluster-store-migration", +}); diff --git a/src/common/cluster/cluster.ts b/src/common/cluster/cluster.ts index 7f27025190..fe66c9fe1b 100644 --- a/src/common/cluster/cluster.ts +++ b/src/common/cluster/cluster.ts @@ -316,7 +316,6 @@ export class Cluster implements ClusterModel, ClusterState { const refreshMetadataTimer = setInterval(() => this.available && this.refreshAccessibilityAndMetadata(), 900000); // every 15 minutes this.eventsDisposer.push( - reaction(() => this.getState(), state => this.pushState(state)), reaction( () => this.prometheusPreferences, prefs => this.contextHandler.setupPrometheus(prefs), @@ -349,7 +348,7 @@ export class Cluster implements ClusterModel, ClusterState { @action async activate(force = false) { if (this.activated && !force) { - return this.pushState(); + return; } this.dependencies.logger.info(`[CLUSTER]: activate`, this.getMeta()); @@ -395,7 +394,6 @@ export class Cluster implements ClusterModel, ClusterState { } this.activated = true; - this.pushState(); } /** @@ -437,7 +435,6 @@ export class Cluster implements ClusterModel, ClusterState { this.activated = false; this.allowedNamespaces = []; this.resourceAccessStatuses.clear(); - this.pushState(); this.dependencies.logger.info(`[CLUSTER]: disconnected`, { id: this.id }); } @@ -448,7 +445,6 @@ export class Cluster implements ClusterModel, ClusterState { async refresh() { this.dependencies.logger.info(`[CLUSTER]: refresh`, this.getMeta()); await this.refreshConnectionStatus(); - this.pushState(); } /** @@ -614,16 +610,15 @@ export class Cluster implements ClusterModel, ClusterState { * @param state cluster state */ @action setState(state: ClusterState) { - Object.assign(this, state); - } - - /** - * @internal - * @param state cluster state - */ - pushState(state = this.getState()) { - this.dependencies.logger.silly(`[CLUSTER]: push-state`, state); - this.dependencies.broadcastMessage("cluster:state", this.id, state); + this.accessible = state.accessible; + this.allowedNamespaces = state.allowedNamespaces; + this.allowedResources = state.allowedResources; + this.apiUrl = state.apiUrl; + this.disconnected = state.disconnected; + this.isAdmin = state.isAdmin; + this.isGlobalWatchEnabled = state.isGlobalWatchEnabled; + this.online = state.online; + this.ready = state.ready; } // get cluster system meta, e.g. use in "logger" diff --git a/src/common/cluster/current-cluster-channel.ts b/src/common/cluster/current-cluster-channel.ts new file mode 100644 index 0000000000..957baa6f9c --- /dev/null +++ b/src/common/cluster/current-cluster-channel.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { ClusterId } from "../cluster-types"; +import type { MessageChannel } from "../utils/channel/message-channel-listener-injection-token"; + +export const currentClusterMessageChannel: MessageChannel = { + id: "current-visible-cluster", +}; diff --git a/src/common/fetch/fetch.injectable.ts b/src/common/fetch/fetch.injectable.ts index e320c0128a..bd1ba89db7 100644 --- a/src/common/fetch/fetch.injectable.ts +++ b/src/common/fetch/fetch.injectable.ts @@ -3,7 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import { HttpsProxyAgent } from "hpagent"; import type * as FetchModule from "node-fetch"; +import userStoreInjectable from "../user-store/user-store.injectable"; const { NodeFetch: { default: fetch }} = require("../../../build/webpack/node-fetch.bundle") as { NodeFetch: typeof FetchModule }; @@ -14,7 +16,20 @@ export type Fetch = (url: string, init?: RequestInit) => Promise; const fetchInjectable = getInjectable({ id: "fetch", - instantiate: (): Fetch => fetch, + instantiate: (di): Fetch => { + const { httpsProxy, allowUntrustedCAs } = di.inject(userStoreInjectable); + const agent = httpsProxy + ? new HttpsProxyAgent({ + proxy: httpsProxy, + rejectUnauthorized: !allowUntrustedCAs, + }) + : undefined; + + return (url, init = {}) => fetch(url, { + agent, + ...init, + }); + }, causesSideEffects: true, }); diff --git a/src/common/fs/delete-file.global-override-for-injectable.ts b/src/common/fs/delete-file.global-override-for-injectable.ts deleted file mode 100644 index c03dca88dc..0000000000 --- a/src/common/fs/delete-file.global-override-for-injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "../test-utils/get-global-override"; -import deleteFileInjectable from "./delete-file.injectable"; - -export default getGlobalOverride(deleteFileInjectable, () => async () => { - throw new Error("tried to delete file without override"); -}); diff --git a/src/common/fs/exec-file.global-override-for-injectable.ts b/src/common/fs/exec-file.global-override-for-injectable.ts new file mode 100644 index 0000000000..162666a130 --- /dev/null +++ b/src/common/fs/exec-file.global-override-for-injectable.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverrideForFunction } from "../test-utils/get-global-override-for-function"; +import execFileInjectable from "./exec-file.injectable"; + +export default getGlobalOverrideForFunction(execFileInjectable); diff --git a/src/common/fs/fs.injectable.ts b/src/common/fs/fs.injectable.ts index ab385e5871..f80375095c 100644 --- a/src/common/fs/fs.injectable.ts +++ b/src/common/fs/fs.injectable.ts @@ -3,11 +3,61 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import type { ReadOptions } from "fs-extra"; import fse from "fs-extra"; +/** + * NOTE: Add corrisponding a corrisponding override of this injecable in `src/test-utils/override-fs-with-fakes.ts` + */ const fsInjectable = getInjectable({ id: "fs", - instantiate: () => fse, + instantiate: () => { + const { + promises: { + readFile, + writeFile, + readdir, + lstat, + rm, + access, + stat, + }, + ensureDir, + ensureDirSync, + readFileSync, + readJson, + writeJson, + readJsonSync, + writeFileSync, + writeJsonSync, + pathExistsSync, + pathExists, + copy, + createReadStream, + } = fse; + + return { + readFile, + readJson: readJson as (file: string, options?: ReadOptions | BufferEncoding) => Promise, + writeFile, + writeJson, + pathExists, + readdir, + readFileSync, + readJsonSync, + writeFileSync, + writeJsonSync, + pathExistsSync, + lstat, + rm, + access, + copy: copy as (src: string, dest: string, options?: fse.CopyOptions) => Promise, + ensureDir: ensureDir as (path: string, options?: number | fse.EnsureOptions ) => Promise, + ensureDirSync, + createReadStream, + stat, + }; + }, causesSideEffects: true, }); diff --git a/src/common/fs/move.injectable.ts b/src/common/fs/move.injectable.ts deleted file mode 100644 index ff11120d80..0000000000 --- a/src/common/fs/move.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MoveOptions } from "fs-extra"; -import fsInjectable from "./fs.injectable"; - -export type Move = (src: string, dest: string, options?: MoveOptions) => Promise; - -const moveInjectable = getInjectable({ - id: "move", - instantiate: (di): Move => di.inject(fsInjectable).move, -}); - -export default moveInjectable; diff --git a/src/common/fs/delete-file.injectable.ts b/src/common/fs/path-exists-sync.injectable.ts similarity index 52% rename from src/common/fs/delete-file.injectable.ts rename to src/common/fs/path-exists-sync.injectable.ts index 57aba5b379..21bcb6d7d1 100644 --- a/src/common/fs/delete-file.injectable.ts +++ b/src/common/fs/path-exists-sync.injectable.ts @@ -5,11 +5,9 @@ import { getInjectable } from "@ogre-tools/injectable"; import fsInjectable from "./fs.injectable"; -export type DeleteFile = (filePath: string) => Promise; - -const deleteFileInjectable = getInjectable({ - id: "delete-file", - instantiate: (di): DeleteFile => di.inject(fsInjectable).unlink, +const pathExistsSyncInjectable = getInjectable({ + id: "path-exists-sync", + instantiate: (di) => di.inject(fsInjectable).pathExistsSync, }); -export default deleteFileInjectable; +export default pathExistsSyncInjectable; diff --git a/src/common/fs/path-exists.global-override-for-injectable.ts b/src/common/fs/path-exists.global-override-for-injectable.ts deleted file mode 100644 index 1b9b96c8dd..0000000000 --- a/src/common/fs/path-exists.global-override-for-injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "../test-utils/get-global-override"; -import pathExistsInjectable from "./path-exists.injectable"; - -export default getGlobalOverride(pathExistsInjectable, () => async () => { - throw new Error("Tried to check if a path exists without override"); -}); diff --git a/src/common/fs/read-directory.injectable.ts b/src/common/fs/read-directory.injectable.ts index 57632bd4d7..8ebeebe75a 100644 --- a/src/common/fs/read-directory.injectable.ts +++ b/src/common/fs/read-directory.injectable.ts @@ -14,18 +14,16 @@ export interface ReadDirectory { ( path: string, options?: - | { encoding: BufferEncoding | string | null; withFileTypes?: false | undefined } + | { encoding: BufferEncoding; withFileTypes?: false | undefined } | BufferEncoding - | string - | null, ): Promise; ( path: string, - options?: { encoding?: BufferEncoding | string | null | undefined; withFileTypes?: false | undefined }, + options?: { encoding?: BufferEncoding; withFileTypes?: false | undefined }, ): Promise; ( path: string, - options: { encoding?: BufferEncoding | string | null | undefined; withFileTypes: true }, + options: { encoding?: BufferEncoding; withFileTypes: true }, ): Promise; } diff --git a/src/common/fs/read-file-buffer-sync.injectable.ts b/src/common/fs/read-file-buffer-sync.injectable.ts new file mode 100644 index 0000000000..98ba8e6d4b --- /dev/null +++ b/src/common/fs/read-file-buffer-sync.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import fsInjectable from "./fs.injectable"; + +export type ReadFileBufferSync = (filePath: string) => Buffer; + +const readFileBufferSyncInjectable = getInjectable({ + id: "read-file-buffer-sync", + instantiate: (di): ReadFileBufferSync => { + const { readFileSync } = di.inject(fsInjectable); + + return (filePath) => readFileSync(filePath); + }, +}); + +export default readFileBufferSyncInjectable; diff --git a/src/common/fs/read-json-sync.injectable.ts b/src/common/fs/read-json-sync.injectable.ts new file mode 100644 index 0000000000..81a9ef478f --- /dev/null +++ b/src/common/fs/read-json-sync.injectable.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import fsInjectable from "./fs.injectable"; + +const readJsonSyncInjectable = getInjectable({ + id: "read-json-sync", + instantiate: (di) => di.inject(fsInjectable).readJsonSync, +}); + +export default readJsonSyncInjectable; diff --git a/src/common/fs/remove-path.global-override-for-injectable.ts b/src/common/fs/remove.global-override-for-injectable.ts similarity index 70% rename from src/common/fs/remove-path.global-override-for-injectable.ts rename to src/common/fs/remove.global-override-for-injectable.ts index 5b9720a837..4b92353344 100644 --- a/src/common/fs/remove-path.global-override-for-injectable.ts +++ b/src/common/fs/remove.global-override-for-injectable.ts @@ -4,8 +4,8 @@ */ import { getGlobalOverride } from "../test-utils/get-global-override"; -import removePathInjectable from "./remove-path.injectable"; +import removePathInjectable from "./remove.injectable"; export default getGlobalOverride(removePathInjectable, () => async () => { - throw new Error("tried to remove a path without override"); + throw new Error("tried to remove path without override"); }); diff --git a/src/common/fs/remove-path.injectable.ts b/src/common/fs/remove.injectable.ts similarity index 63% rename from src/common/fs/remove-path.injectable.ts rename to src/common/fs/remove.injectable.ts index 02c8da0e1e..0c6a629754 100644 --- a/src/common/fs/remove-path.injectable.ts +++ b/src/common/fs/remove.injectable.ts @@ -5,11 +5,15 @@ import { getInjectable } from "@ogre-tools/injectable"; import fsInjectable from "./fs.injectable"; -export type RemovePath = (path: string) => Promise; +export type RemovePath = (filePath: string) => Promise; const removePathInjectable = getInjectable({ id: "remove-path", - instantiate: (di): RemovePath => di.inject(fsInjectable).remove, + instantiate: (di): RemovePath => { + const { rm } = di.inject(fsInjectable); + + return (filePath) => rm(filePath, { force: true }); + }, }); export default removePathInjectable; diff --git a/src/common/fs/stat/stat.injectable.ts b/src/common/fs/stat.injectable.ts similarity index 90% rename from src/common/fs/stat/stat.injectable.ts rename to src/common/fs/stat.injectable.ts index e9924fc088..07f2b298b1 100644 --- a/src/common/fs/stat/stat.injectable.ts +++ b/src/common/fs/stat.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import type { Stats } from "fs"; -import fsInjectable from "../fs.injectable"; +import fsInjectable from "./fs.injectable"; export type Stat = (path: string) => Promise; diff --git a/src/common/fs/stat/stat.global-override-for-injectable.ts b/src/common/fs/stat/stat.global-override-for-injectable.ts deleted file mode 100644 index 2afeda7b77..0000000000 --- a/src/common/fs/stat/stat.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import statInjectable from "./stat.injectable"; -import { getGlobalOverride } from "../../test-utils/get-global-override"; - -export default getGlobalOverride(statInjectable, () => () => { - throw new Error("Tried to call stat without explicit override"); -}); diff --git a/src/common/fs/validate-directory.injectable.ts b/src/common/fs/validate-directory.injectable.ts index 9d68ede8d5..efce915238 100644 --- a/src/common/fs/validate-directory.injectable.ts +++ b/src/common/fs/validate-directory.injectable.ts @@ -7,7 +7,7 @@ import type { AsyncResult } from "../utils/async-result"; import { isErrnoException } from "../utils"; import type { Stats } from "fs-extra"; import { lowerFirst } from "lodash/fp"; -import statInjectable from "./stat/stat.injectable"; +import statInjectable from "./stat.injectable"; export type ValidateDirectory = (path: string) => Promise>; diff --git a/src/common/fs/write-file-sync.injectable.ts b/src/common/fs/write-file-sync.injectable.ts new file mode 100644 index 0000000000..3daccaf610 --- /dev/null +++ b/src/common/fs/write-file-sync.injectable.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; +import fsInjectable from "./fs.injectable"; + +export type WriteFileSync = (filePath: string, contents: string) => void; + +const writeFileSyncInjectable = getInjectable({ + id: "write-file-sync", + instantiate: (di): WriteFileSync => { + const { + writeFileSync, + ensureDirSync, + } = di.inject(fsInjectable); + const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); + + return (filePath, contents) => { + ensureDirSync(getDirnameOfPath(filePath), { + mode: 0o755, + }); + writeFileSync(filePath, contents); + }; + }, +}); + +export default writeFileSyncInjectable; diff --git a/src/common/fs/write-file.injectable.ts b/src/common/fs/write-file.injectable.ts index faa5285ca1..75e07775e3 100644 --- a/src/common/fs/write-file.injectable.ts +++ b/src/common/fs/write-file.injectable.ts @@ -16,15 +16,17 @@ const writeFileInjectable = getInjectable({ const { writeFile, ensureDir } = di.inject(fsInjectable); const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - return async (filePath, content, opts) => { + return async (filePath, content, opts = {}) => { await ensureDir(getDirnameOfPath(filePath), { mode: 0o755, - ...(opts ?? {}), + ...opts, }); + const { encoding = "utf-8", ...options } = opts; + await writeFile(filePath, content, { - encoding: "utf-8", - ...(opts ?? {}), + encoding: encoding as BufferEncoding, + ...options, }); }; }, diff --git a/src/common/fs/write-json-file.injectable.ts b/src/common/fs/write-json-file.injectable.ts index a7079d7f84..5491487849 100644 --- a/src/common/fs/write-json-file.injectable.ts +++ b/src/common/fs/write-json-file.injectable.ts @@ -3,11 +3,10 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { JsonValue } from "type-fest"; import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; import fsInjectable from "./fs.injectable"; -export type WriteJson = (filePath: string, contents: JsonValue) => Promise; +export type WriteJson = (filePath: string, contents: unknown) => Promise; const writeJsonFileInjectable = getInjectable({ id: "write-json-file", diff --git a/src/common/fs/write-json-sync.injectable.ts b/src/common/fs/write-json-sync.injectable.ts new file mode 100644 index 0000000000..eb4abc3936 --- /dev/null +++ b/src/common/fs/write-json-sync.injectable.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; +import fsInjectable from "./fs.injectable"; + +export type WriteJsonSync = (filePath: string, contents: unknown) => void; + +const writeJsonSyncInjectable = getInjectable({ + id: "write-json-sync", + instantiate: (di): WriteJsonSync => { + const { + writeJsonSync, + ensureDirSync, + } = di.inject(fsInjectable); + const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); + + return (filePath, content) => { + ensureDirSync(getDirnameOfPath(filePath), { mode: 0o755 }); + + writeJsonSync(filePath, content, { + encoding: "utf-8", + spaces: 2, + }); + }; + }, +}); + +export default writeJsonSyncInjectable; diff --git a/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts b/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts new file mode 100644 index 0000000000..fba8939880 --- /dev/null +++ b/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts @@ -0,0 +1,53 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import assert from "assert"; +import path from "path"; +import { getGlobalOverride } from "../test-utils/get-global-override"; +import getConfigurationFileModelInjectable from "./get-configuration-file-model.injectable"; +import type Config from "conf"; +import readJsonSyncInjectable from "../fs/read-json-sync.injectable"; +import writeJsonSyncInjectable from "../fs/write-json-sync.injectable"; + +export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { + const readJsonSync = di.inject(readJsonSyncInjectable); + const writeJsonSync = di.inject(writeJsonSyncInjectable); + + return (options) => { + assert(options.cwd, "Missing options.cwd"); + assert(options.configName, "Missing options.configName"); + + const configFilePath = path.posix.join(options.cwd, `${options.configName}.json`); + let store: object = {}; + + try { + store = readJsonSync(configFilePath); + } catch { + // ignore + } + + return { + get store() { + return store; + }, + path: configFilePath, + set: (key: string, value: unknown) => { + let currentState: object; + + try { + currentState = readJsonSync(configFilePath); + } catch { + currentState = {}; + } + + writeJsonSync(configFilePath, { + ...currentState, + [key]: value, + }); + store = readJsonSync(configFilePath); + }, + } as Partial as Config; + }; +}); diff --git a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts index dc54e96de1..e167e464ef 100644 --- a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts +++ b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts @@ -4,11 +4,13 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import Config from "conf"; -import type { BaseStoreParams } from "../base-store"; +import type { Options as ConfOptions } from "conf/dist/source/types"; + +export type GetConfigurationFileModel = (content: ConfOptions) => Config; const getConfigurationFileModelInjectable = getInjectable({ id: "get-configuration-file-model", - instantiate: () => (content: BaseStoreParams) => new Config(content), + instantiate: (): GetConfigurationFileModel => (content) => new Config(content), causesSideEffects: true, }); diff --git a/src/common/helm/helm-repo.ts b/src/common/helm/helm-repo.ts index 9405d59bed..cb4af3449b 100644 --- a/src/common/helm/helm-repo.ts +++ b/src/common/helm/helm-repo.ts @@ -2,15 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export type HelmRepo = { + +export interface HelmRepo { name: string; url: string; - cacheFilePath?: string; + cacheFilePath: string; caFile?: string; certFile?: string; insecureSkipTlsVerify?: boolean; keyFile?: string; username?: string; password?: string; -}; +} diff --git a/src/common/hotbars/migrations-token.ts b/src/common/hotbars/migrations-token.ts new file mode 100644 index 0000000000..5441844933 --- /dev/null +++ b/src/common/hotbars/migrations-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { MigrationDeclaration } from "../base-store/migrations.injectable"; + +export const hotbarStoreMigrationInjectionToken = getInjectionToken({ + id: "hotbar-store-migration-token", +}); diff --git a/src/common/hotbars/store.injectable.ts b/src/common/hotbars/store.injectable.ts index ace13b8be4..cc15f93bf8 100644 --- a/src/common/hotbars/store.injectable.ts +++ b/src/common/hotbars/store.injectable.ts @@ -6,20 +6,33 @@ import { getInjectable } from "@ogre-tools/injectable"; import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable"; import { HotbarStore } from "./store"; import loggerInjectable from "../logger.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; +import storeMigrationsInjectable from "../base-store/migrations.injectable"; +import { hotbarStoreMigrationInjectionToken } from "./migrations-token"; +import getBasenameOfPathInjectable from "../path/get-basename.injectable"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../base-store/channel-prefix"; +import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; +import { enlistMessageChannelListenerInjectionToken } from "../utils/channel/enlist-message-channel-listener-injection-token"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-store/disable-sync"; const hotbarStoreInjectable = getInjectable({ id: "hotbar-store", - instantiate: (di) => { - HotbarStore.resetInstance(); - - return HotbarStore.createInstance({ - catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable), - logger: di.inject(loggerInjectable), - }); - }, - - causesSideEffects: true, + instantiate: (di) => new HotbarStore({ + catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable), + logger: di.inject(loggerInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: di.inject(storeMigrationsInjectable, hotbarStoreMigrationInjectionToken), + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }), }); export default hotbarStoreInjectable; diff --git a/src/common/hotbars/store.ts b/src/common/hotbars/store.ts index a75182b23b..709242f20e 100644 --- a/src/common/hotbars/store.ts +++ b/src/common/hotbars/store.ts @@ -4,8 +4,8 @@ */ import { action, comparer, observable, makeObservable, computed } from "mobx"; -import { BaseStore } from "../base-store"; -import migrations from "../../migrations/hotbar-store"; +import type { BaseStoreDependencies } from "../base-store/base-store"; +import { BaseStore } from "../base-store/base-store"; import { toJS } from "../utils"; import type { CatalogEntity } from "../catalog"; import { broadcastMessage } from "../ipc"; @@ -21,26 +21,23 @@ export interface HotbarStoreModel { activeHotbarId: string; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { readonly catalogCatalogEntity: GeneralEntity; readonly logger: Logger; } export class HotbarStore extends BaseStore { - readonly displayName = "HotbarStore"; @observable hotbars: Hotbar[] = []; @observable private _activeHotbarId!: string; - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-hotbar-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { equals: comparer.structural, }, - migrations, }); - makeObservable(this); } @@ -99,21 +96,19 @@ export class HotbarStore extends BaseStore { this.hotbars.forEach(ensureExactHotbarItemLength); if (data.activeHotbarId) { - this.setActiveHotbar(data.activeHotbarId); + this._activeHotbarId = data.activeHotbarId; } - if (!this.activeHotbarId) { - this.setActiveHotbar(0); + if (!this._activeHotbarId) { + this._activeHotbarId = this.hotbars[0].id; } } toJSON(): HotbarStoreModel { - const model: HotbarStoreModel = { + return toJS({ hotbars: this.hotbars, activeHotbarId: this.activeHotbarId, - }; - - return toJS(model); + }); } getActive(): Hotbar { @@ -148,7 +143,7 @@ export class HotbarStore extends BaseStore { const index = this.hotbars.findIndex((hotbar) => hotbar.id === id); if (index < 0) { - return void console.warn( + return this.dependencies.logger.warn( `[HOTBAR-STORE]: cannot setHotbarName: unknown id`, { id }, ); diff --git a/src/common/ipc/dialog.ts b/src/common/ipc/dialog.ts deleted file mode 100644 index eab621a280..0000000000 --- a/src/common/ipc/dialog.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const openFilePickingDialogChannel = "dialog:open:file-picking"; diff --git a/src/common/ipc/native-theme.ts b/src/common/ipc/native-theme.ts deleted file mode 100644 index 4708a3c9b3..0000000000 --- a/src/common/ipc/native-theme.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - - -export const setNativeThemeChannel = "theme:set-native-theme"; -export const getNativeThemeChannel = "theme:get-native-theme"; diff --git a/src/common/request.ts b/src/common/request.ts deleted file mode 100644 index 331b257f4d..0000000000 --- a/src/common/request.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import request from "request"; -import requestPromise from "request-promise-native"; -import { UserStore } from "./user-store"; - -// todo: get rid of "request" (deprecated) -// https://github.com/lensapp/lens/issues/459 - -function getDefaultRequestOpts(): Partial { - const { httpsProxy, allowUntrustedCAs } = UserStore.getInstance(); - - return { - proxy: httpsProxy || undefined, - rejectUnauthorized: !allowUntrustedCAs, - }; -} - -/** - * @deprecated - */ -export function customRequest(opts: request.Options) { - return request.defaults(getDefaultRequestOpts())(opts); -} - -/** - * @deprecated - */ -export function customRequestPromise(opts: requestPromise.Options) { - return requestPromise.defaults(getDefaultRequestOpts())(opts); -} diff --git a/src/common/runnable/run-many-for.test.ts b/src/common/runnable/run-many-for.test.ts index c2cc152681..6002a149db 100644 --- a/src/common/runnable/run-many-for.test.ts +++ b/src/common/runnable/run-many-for.test.ts @@ -8,6 +8,8 @@ import { createContainer, getInjectable, getInjectionToken } from "@ogre-tools/i import type { Runnable } from "./run-many-for"; import { runManyFor } from "./run-many-for"; import { getPromiseStatus } from "../test-utils/get-promise-status"; +import { runInAction } from "mobx"; +import { flushPromises } from "../test-utils/flush-promises"; describe("runManyFor", () => { describe("given no hierarchy, when running many", () => { @@ -223,7 +225,68 @@ describe("runManyFor", () => { ); return expect(() => runMany()).rejects.toThrow( - /Tried to get a composite but encountered missing parent ids: "some-runnable-2".\n\nAvailable parent ids are:\n"[0-9a-z-]+",\n"some-runnable-1"/, + /Runnable "some-runnable-1" is unreachable for injection token "some-injection-token": run afters "some-runnable-2" are a part of different injection tokens./, + ); + }); + + it("given partially incorrect hierarchy, when running runnables, throws", () => { + const rootDi = createContainer("irrelevant"); + + const runMock = asyncFn<(...args: unknown[]) => void>(); + + const someInjectionToken = getInjectionToken({ + id: "some-injection-token", + }); + + const someOtherInjectionToken = getInjectionToken({ + id: "some-other-injection-token", + }); + + const someInjectable = getInjectable({ + id: "some-runnable-1", + + instantiate: (di) => ({ + id: "some-runnable-1", + run: () => runMock("some-runnable-1"), + runAfter: [ + di.inject(someOtherInjectable), + di.inject(someSecondInjectable), + ], + }), + + injectionToken: someInjectionToken, + }); + + const someSecondInjectable = getInjectable({ + id: "some-runnable-2", + + instantiate: () => ({ + id: "some-runnable-2", + run: () => runMock("some-runnable-2"), + }), + + injectionToken: someInjectionToken, + }); + + const someOtherInjectable = getInjectable({ + id: "some-runnable-3", + + instantiate: () => ({ + id: "some-runnable-3", + run: () => runMock("some-runnable-3"), + }), + + injectionToken: someOtherInjectionToken, + }); + + rootDi.register(someInjectable, someOtherInjectable, someSecondInjectable); + + const runMany = runManyFor(rootDi)( + someInjectionToken, + ); + + return expect(() => runMany()).rejects.toThrow( + /Runnable "some-runnable-3" is not part of the injection token "some-injection-token"/, ); }); @@ -279,4 +342,319 @@ describe("runManyFor", () => { ]); }); }); + + describe("given multiple runAfters", () => { + let runMock: AsyncFnMock<(...args: unknown[]) => void>; + let finishingPromise: Promise; + + beforeEach(async () => { + const rootDi = createContainer("irrelevant"); + + runMock = asyncFn<(...args: unknown[]) => void>(); + + const someInjectionToken = getInjectionToken({ + id: "some-injection-token", + }); + + const runnableOneInjectable = getInjectable({ + id: "runnable-1", + instantiate: () => ({ + id: "runnable-1", + run: () => runMock("runnable-1"), + }), + injectionToken: someInjectionToken, + }); + + const runnableTwoInjectable = getInjectable({ + id: "runnable-2", + instantiate: () => ({ + id: "runnable-2", + run: () => runMock("runnable-2"), + runAfter: [], // shouldn't block being called + }), + injectionToken: someInjectionToken, + }); + + const runnableThreeInjectable = getInjectable({ + id: "runnable-3", + instantiate: (di) => ({ + id: "runnable-3", + run: () => runMock("runnable-3"), + runAfter: di.inject(runnableOneInjectable), + }), + injectionToken: someInjectionToken, + }); + + const runnableFourInjectable = getInjectable({ + id: "runnable-4", + instantiate: (di) => ({ + id: "runnable-4", + run: () => runMock("runnable-4"), + runAfter: [di.inject(runnableThreeInjectable)], // should be the same as an single item + }), + injectionToken: someInjectionToken, + }); + + const runnableFiveInjectable = getInjectable({ + id: "runnable-5", + instantiate: (di) => ({ + id: "runnable-5", + run: () => runMock("runnable-5"), + runAfter: di.inject(runnableThreeInjectable), + }), + injectionToken: someInjectionToken, + }); + + const runnableSixInjectable = getInjectable({ + id: "runnable-6", + instantiate: (di) => ({ + id: "runnable-6", + run: () => runMock("runnable-6"), + runAfter: [ + di.inject(runnableFourInjectable), + di.inject(runnableFiveInjectable), + ], + }), + injectionToken: someInjectionToken, + }); + + const runnableSevenInjectable = getInjectable({ + id: "runnable-7", + instantiate: (di) => ({ + id: "runnable-7", + run: () => runMock("runnable-7"), + runAfter: [ + di.inject(runnableFiveInjectable), + di.inject(runnableSixInjectable), + ], + }), + injectionToken: someInjectionToken, + }); + + runInAction(() => { + rootDi.register( + runnableOneInjectable, + runnableTwoInjectable, + runnableThreeInjectable, + runnableFourInjectable, + runnableFiveInjectable, + runnableSixInjectable, + runnableSevenInjectable, + ); + }); + + const runMany = runManyFor(rootDi); + const runSome = runMany(someInjectionToken); + + finishingPromise = runSome(); + + await flushPromises(); + }); + + it("should run 'runnable-1'", () => { + expect(runMock).toBeCalledWith("runnable-1"); + }); + + it("should run 'runnable-2'", () => { + expect(runMock).toBeCalledWith("runnable-2"); + }); + + it("should not run 'runnable-3'", () => { + expect(runMock).not.toBeCalledWith("runnable-3"); + }); + + describe("when 'runnable-1' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-1"]); + }); + + it("should run 'runnable-3'", () => { + expect(runMock).toBeCalledWith("runnable-3"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(3); + }); + }); + + describe("when 'runnable-3' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-3"]); + }); + + it("should run 'runnable-4'", () => { + expect(runMock).toBeCalledWith("runnable-4"); + }); + + it("should run 'runnable-5'", () => { + expect(runMock).toBeCalledWith("runnable-5"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(5); + }); + }); + + describe("when 'runnable-4' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-4"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(5); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(5); + }); + }); + + describe("when 'runnable-5' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-5"]); + }); + + it("should run 'runnable-6'", () => { + expect(runMock).toBeCalledWith("runnable-6"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(6); + }); + }); + + describe("when 'runnable-6' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-6"]); + }); + + it("should run 'runnable-7'", () => { + expect(runMock).toBeCalledWith("runnable-7"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(7); + }); + + describe("when 'runnable-7' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-7"]); + }); + + it("should resolve the runMany promise call", async () => { + await finishingPromise; + }); + }); + }); + }); + }); + }); + + describe("when 'runnable-5' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-5"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(5); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(5); + }); + }); + + describe("when 'runnable-4' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-4"]); + }); + + it("should run 'runnable-6'", () => { + expect(runMock).toBeCalledWith("runnable-6"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(6); + }); + }); + + describe("when 'runnable-6' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-6"]); + }); + + it("should run 'runnable-7'", () => { + expect(runMock).toBeCalledWith("runnable-7"); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(7); + }); + + describe("when 'runnable-7' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-7"]); + }); + + it("should resolve the runMany promise call", async () => { + await finishingPromise; + }); + }); + }); + }); + }); + }); + }); + }); + + describe("when 'runnable-2' resolves", () => { + beforeEach(async () => { + await runMock.resolveSpecific(["runnable-2"]); + }); + + it("shouldn't call any more runnables", () => { + expect(runMock).toBeCalledTimes(2); + }); + }); + }); }); diff --git a/src/common/runnable/run-many-for.ts b/src/common/runnable/run-many-for.ts index ce3123c0b0..106cc74da1 100644 --- a/src/common/runnable/run-many-for.ts +++ b/src/common/runnable/run-many-for.ts @@ -3,46 +3,138 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { DiContainerForInjection, InjectionToken } from "@ogre-tools/injectable"; -import type { Composite } from "../utils/composite/get-composite/get-composite"; -import { getCompositeFor } from "../utils/composite/get-composite/get-composite"; +import type { SingleOrMany } from "../utils"; +import { getOrInsert, getOrInsertSetFor, isDefined } from "../utils"; import * as uuid from "uuid"; +import assert from "assert"; +import type { Asyncify } from "type-fest"; +import type TypedEventEmitter from "typed-emitter"; +import EventEmitter from "events"; export interface Runnable { id: string; run: Run; - runAfter?: Runnable; + runAfter?: SingleOrMany>; } type Run = (parameter: Param) => Promise | void; -export type RunMany = (injectionToken: InjectionToken, void>) => Run; +export type RunMany = (injectionToken: InjectionToken, void>) => Asyncify>; -async function runCompositeRunnables(param: Param, composite: Composite>) { - await composite.value.run(param); - await Promise.all(composite.children.map(composite => runCompositeRunnables(param, composite))); +const computedNextEdge = (traversed: string[], graph: Map>, currentId: string, seenIds: Set) => { + seenIds.add(currentId); + const currentNode = graph.get(currentId); + + assert(currentNode, `Runnable graph does not contain node with id="${currentId}"`); + + for (const nextId of currentNode.values()) { + if (traversed.includes(nextId)) { + throw new Error(`Cycle in runnable graph: "${traversed.join(`" -> "`)}" -> "${nextId}"`); + } + + computedNextEdge([...traversed, nextId], graph, nextId, seenIds); + } +}; + +const verifyRunnablesAreDAG = (injectionToken: InjectionToken, void>, runnables: Runnable[]) => { + const rootId = uuid.v4(); + const runnableGraph = new Map>(); + const seenIds = new Set(); + const addRunnableId = getOrInsertSetFor(runnableGraph); + + // Build the Directed graph + for (const runnable of runnables) { + addRunnableId(runnable.id); + + if (!runnable.runAfter || (Array.isArray(runnable.runAfter) && runnable.runAfter.length === 0)) { + addRunnableId(rootId).add(runnable.id); + } else if (Array.isArray(runnable.runAfter)) { + for (const parentRunnable of runnable.runAfter) { + addRunnableId(parentRunnable.id).add(runnable.id); + } + } else { + addRunnableId(runnable.runAfter.id).add(runnable.id); + } + } + + addRunnableId(rootId); + + // Do a DFS to find any cycles + computedNextEdge([], runnableGraph, rootId, seenIds); + + for (const id of runnableGraph.keys()) { + if (!seenIds.has(id)) { + const runnable = runnables.find(runnable => runnable.id === id); + + if (!runnable) { + throw new Error(`Runnable "${id}" is not part of the injection token "${injectionToken.id}"`); + } + + const runAfters = [runnable.runAfter] + .flat() + .filter(isDefined) + .map(runnable => runnable.id) + .join('", "'); + + throw new Error(`Runnable "${id}" is unreachable for injection token "${injectionToken.id}": run afters "${runAfters}" are a part of different injection tokens.`); + } + } +}; + +interface BarrierEvent { + finish: (id: string) => void; } +class DynamicBarrier { + private readonly finishedIds = new Map>(); + private readonly events: TypedEventEmitter = new EventEmitter(); + + private initFinishingPromise(id: string): Promise { + return getOrInsert(this.finishedIds, id, new Promise(resolve => { + const handler = (finishedId: string) => { + if (finishedId === id) { + resolve(); + this.events.removeListener("finish", handler); + } + }; + + this.events.addListener("finish", handler); + })); + } + + setFinished(id: string): void { + void this.initFinishingPromise(id); + + this.events.emit("finish", id); + } + + async blockOn(id: string): Promise { + await this.initFinishingPromise(id); + } +} + +const executeRunnableWith = (param: Param) => { + const barrier = new DynamicBarrier(); + + return async (runnable: Runnable): Promise => { + const parentRunnables = [runnable.runAfter].flat().filter(isDefined); + + for (const parentRunnable of parentRunnables) { + await barrier.blockOn(parentRunnable.id); + } + + await runnable.run(param); + barrier.setFinished(runnable.id); + }; +}; + export function runManyFor(di: DiContainerForInjection): RunMany { return (injectionToken: InjectionToken, void>) => async (param: Param) => { + const executeRunnable = executeRunnableWith(param); const allRunnables = di.injectMany(injectionToken); - const rootId = uuid.v4(); - const getCompositeRunnables = getCompositeFor>({ - getId: (runnable) => runnable.id, - getParentId: (runnable) => ( - runnable.id === rootId - ? undefined - : runnable.runAfter?.id ?? rootId - ), - }); - const composite = getCompositeRunnables([ - // This is a dummy runnable to conform to the requirements of `getCompositeFor` to only have one root - { - id: rootId, - run: () => {}, - }, - ...allRunnables, - ]); - await runCompositeRunnables(param, composite); + verifyRunnablesAreDAG(injectionToken, allRunnables); + + await Promise.all(allRunnables.map(executeRunnable)); }; } diff --git a/src/common/fs/move.global-override-for-injectable.ts b/src/common/user-store/current-timezone.global-override-for-injectable.ts similarity index 55% rename from src/common/fs/move.global-override-for-injectable.ts rename to src/common/user-store/current-timezone.global-override-for-injectable.ts index c39907ee6e..6056074d3c 100644 --- a/src/common/fs/move.global-override-for-injectable.ts +++ b/src/common/user-store/current-timezone.global-override-for-injectable.ts @@ -4,8 +4,6 @@ */ import { getGlobalOverride } from "../test-utils/get-global-override"; -import moveInjectable from "./move.injectable"; +import currentTimezoneInjectable from "./current-timezone.injectable"; -export default getGlobalOverride(moveInjectable, () => async () => { - throw new Error("tried to move without override"); -}); +export default getGlobalOverride(currentTimezoneInjectable, () => "Etc/GMT"); diff --git a/src/common/user-store/current-timezone.injectable.ts b/src/common/user-store/current-timezone.injectable.ts new file mode 100644 index 0000000000..6a6043eaf9 --- /dev/null +++ b/src/common/user-store/current-timezone.injectable.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import moment from "moment-timezone"; + +const currentTimezoneInjectable = getInjectable({ + id: "current-timezone", + instantiate: () => moment.tz.guess(true), + causesSideEffects: true, +}); + +export default currentTimezoneInjectable; diff --git a/src/common/user-store/https-proxy.injectable.ts b/src/common/user-store/https-proxy.injectable.ts new file mode 100644 index 0000000000..30569d4e77 --- /dev/null +++ b/src/common/user-store/https-proxy.injectable.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import userStoreInjectable from "./user-store.injectable"; + +const httpsProxyConfigurationInjectable = getInjectable({ + id: "https-proxy-configuration", + instantiate: (di) => { + const userStore = di.inject(userStoreInjectable); + + return computed(() => userStore.httpsProxy); + }, +}); + +export default httpsProxyConfigurationInjectable; diff --git a/src/common/user-store/kubeconfig-syncs.injectable.ts b/src/common/user-store/kubeconfig-syncs.injectable.ts index bbe02fffad..7327b9d8e4 100644 --- a/src/common/user-store/kubeconfig-syncs.injectable.ts +++ b/src/common/user-store/kubeconfig-syncs.injectable.ts @@ -7,11 +7,7 @@ import userStoreInjectable from "./user-store.injectable"; const kubeconfigSyncsInjectable = getInjectable({ id: "kubeconfig-syncs", - instantiate: (di) => { - const store = di.inject(userStoreInjectable); - - return store.syncKubeconfigEntries; - }, + instantiate: (di) => di.inject(userStoreInjectable).syncKubeconfigEntries, }); export default kubeconfigSyncsInjectable; diff --git a/src/common/user-store/lens-color-theme.injectable.ts b/src/common/user-store/lens-color-theme.injectable.ts new file mode 100644 index 0000000000..5b48de1a37 --- /dev/null +++ b/src/common/user-store/lens-color-theme.injectable.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import userStoreInjectable from "./user-store.injectable"; + +export type LensColorThemePreference = { + useSystemTheme: true; +} | { + useSystemTheme: false; + lensThemeId: string; +}; + +const lensColorThemePreferenceInjectable = getInjectable({ + id: "lens-color-theme-preference", + instantiate: (di) => { + const userStore = di.inject(userStoreInjectable); + + return computed((): LensColorThemePreference => { + // TODO: remove magic strings + if (userStore.colorTheme === "system") { + return { + useSystemTheme: true, + }; + } + + return { + useSystemTheme: false, + lensThemeId: userStore.colorTheme, + }; + }); + }, +}); + +export default lensColorThemePreferenceInjectable; diff --git a/src/common/user-store/migrations-token.ts b/src/common/user-store/migrations-token.ts new file mode 100644 index 0000000000..f3959beb3a --- /dev/null +++ b/src/common/user-store/migrations-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { MigrationDeclaration } from "../base-store/migrations.injectable"; + +export const userStoreMigrationInjectionToken = getInjectionToken({ + id: "user-store-migration-token", +}); diff --git a/src/common/user-store/preference-descriptors.injectable.ts b/src/common/user-store/preference-descriptors.injectable.ts new file mode 100644 index 0000000000..35815dbbea --- /dev/null +++ b/src/common/user-store/preference-descriptors.injectable.ts @@ -0,0 +1,143 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { merge } from "lodash"; +import type { ObservableMap } from "mobx"; +import { observable } from "mobx"; +import homeDirectoryPathInjectable from "../os/home-directory-path.injectable"; +import joinPathsInjectable from "../path/join-paths.injectable"; +import { defaultThemeId } from "../vars"; +import currentTimezoneInjectable from "./current-timezone.injectable"; +import type { EditorConfiguration, ExtensionRegistry, KubeconfigSyncEntry, KubeconfigSyncValue, TerminalConfig } from "./preferences-helpers"; +import { defaultExtensionRegistryUrlLocation, defaultEditorConfig, defaultTerminalConfig, defaultPackageMirror, getPreferenceDescriptor, packageMirrors } from "./preferences-helpers"; + +export type PreferenceDescriptors = ReturnType; + +const userStorePreferenceDescriptorsInjectable = getInjectable({ + id: "user-store-preference-descriptors", + instantiate: (di) => { + const currentTimezone = di.inject(currentTimezoneInjectable); + const joinPaths = di.inject(joinPathsInjectable); + const homeDirectoryPath = di.inject(homeDirectoryPathInjectable); + + const mainKubeFolderPath = joinPaths(homeDirectoryPath, ".kube"); + + return ({ + httpsProxy: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + shell: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + colorTheme: getPreferenceDescriptor({ + fromStore: val => val || defaultThemeId, + toStore: val => !val || val === defaultThemeId + ? undefined + : val, + }), + terminalTheme: getPreferenceDescriptor({ + fromStore: val => val || "", + toStore: val => val || undefined, + }), + localeTimezone: getPreferenceDescriptor({ + fromStore: val => val || currentTimezone, + toStore: val => !val || val === currentTimezone + ? undefined + : val, + }), + allowUntrustedCAs: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + allowErrorReporting: getPreferenceDescriptor({ + fromStore: val => val ?? true, + toStore: val => val + ? undefined + : val, + }), + downloadMirror: getPreferenceDescriptor({ + fromStore: val => !val || !packageMirrors.has(val) + ? defaultPackageMirror + : val, + toStore: val => val === defaultPackageMirror + ? undefined + : val, + }), + downloadKubectlBinaries: getPreferenceDescriptor({ + fromStore: val => val ?? true, + toStore: val => val + ? undefined + : val, + }), + downloadBinariesPath: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + kubectlBinariesPath: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + openAtLogin: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + terminalCopyOnSelect: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + hiddenTableColumns: getPreferenceDescriptor<[string, string[]][], Map>>({ + fromStore: (val = []) => new Map( + val.map(([tableId, columnIds]) => [tableId, new Set(columnIds)]), + ), + toStore: (val) => { + const res: [string, string[]][] = []; + + for (const [table, columns] of val) { + if (columns.size) { + res.push([table, Array.from(columns)]); + } + } + + return res.length ? res : undefined; + }, + }), + syncKubeconfigEntries: getPreferenceDescriptor>({ + fromStore: val => observable.map( + val?.map(({ filePath, ...rest }) => [filePath, rest]) + ?? [[mainKubeFolderPath, {}]], + ), + toStore: val => val.size === 1 && val.has(mainKubeFolderPath) + ? undefined + : Array.from(val, ([filePath, rest]) => ({ filePath, ...rest })), + }), + editorConfiguration: getPreferenceDescriptor, EditorConfiguration>({ + fromStore: val => merge(defaultEditorConfig, val), + toStore: val => val, + }), + terminalConfig: getPreferenceDescriptor, TerminalConfig>({ + fromStore: val => merge(defaultTerminalConfig, val), + toStore: val => val, + }), + extensionRegistryUrl: getPreferenceDescriptor({ + fromStore: val => val ?? { + location: defaultExtensionRegistryUrlLocation, + }, + toStore: val => val.location === defaultExtensionRegistryUrlLocation + ? undefined + : val, + }), + }) as const; + }, +}); + +export default userStorePreferenceDescriptorsInjectable; diff --git a/src/common/user-store/preferences-helpers.ts b/src/common/user-store/preferences-helpers.ts index ed3fb7c249..5bdc2a3852 100644 --- a/src/common/user-store/preferences-helpers.ts +++ b/src/common/user-store/preferences-helpers.ts @@ -3,14 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import moment from "moment-timezone"; -import path from "path"; -import os from "os"; import type { editor } from "monaco-editor"; -import merge from "lodash/merge"; -import { defaultThemeId, defaultEditorFontFamily, defaultFontSize, defaultTerminalFontFamily } from "../vars"; -import type { ObservableMap } from "mobx"; -import { observable } from "mobx"; +import { defaultEditorFontFamily, defaultFontSize, defaultTerminalFontFamily } from "../vars"; +import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; export interface KubeconfigSyncEntry extends KubeconfigSyncValue { filePath: string; @@ -54,86 +49,8 @@ export interface PreferenceDescription { toStore(val: R): T | undefined; } -const httpsProxy: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - return val || undefined; - }, -}; +export const getPreferenceDescriptor = (desc: PreferenceDescription) => desc; -const shell: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - return val || undefined; - }, -}; - -const colorTheme: PreferenceDescription = { - fromStore(val) { - return val || defaultThemeId; - }, - toStore(val) { - if (!val || val === defaultThemeId) { - return undefined; - } - - return val; - }, -}; - -const terminalTheme: PreferenceDescription = { - fromStore(val) { - return val || ""; - }, - toStore(val) { - return val || undefined; - }, -}; - -export const defaultLocaleTimezone = "UTC"; - -const localeTimezone: PreferenceDescription = { - fromStore(val) { - return val || moment.tz.guess(true) || defaultLocaleTimezone; - }, - toStore(val) { - if (!val || val === moment.tz.guess(true) || val === defaultLocaleTimezone) { - return undefined; - } - - return val; - }, -}; - -const allowUntrustedCAs: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const allowErrorReporting: PreferenceDescription = { - fromStore(val) { - return val ?? true; - }, - toStore(val) { - if (val === true) { - return undefined; - } - - return val; - }, -}; export interface DownloadMirror { url: string; @@ -157,142 +74,6 @@ export const packageMirrors = new Map([ }], ]); -const downloadMirror: PreferenceDescription = { - fromStore(val) { - return !val || !packageMirrors.has(val) - ? defaultPackageMirror - : val; - }, - toStore(val) { - if (!val || val === defaultPackageMirror) { - return undefined; - } - - return val; - }, -}; - -const downloadKubectlBinaries: PreferenceDescription = { - fromStore(val) { - return val ?? true; - }, - toStore(val) { - if (val === true) { - return undefined; - } - - return val; - }, -}; - -const downloadBinariesPath: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const kubectlBinariesPath: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const openAtLogin: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const terminalCopyOnSelect: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const hiddenTableColumns: PreferenceDescription<[string, string[]][], Map>> = { - fromStore(val) { - return new Map( - (val ?? []).map(([tableId, columnIds]) => [tableId, new Set(columnIds)]), - ); - }, - toStore(val) { - const res: [string, string[]][] = []; - - for (const [table, columns] of val) { - if (columns.size) { - res.push([table, Array.from(columns)]); - } - } - - return res.length ? res : undefined; - }, -}; - -const mainKubeFolder = path.join(os.homedir(), ".kube"); - -const syncKubeconfigEntries: PreferenceDescription> = { - fromStore(val) { - return observable.map( - val - ?.map(({ filePath, ...rest }) => [filePath, rest]) - ?? [[mainKubeFolder, {}]], - ); - }, - toStore(val) { - if (val.size === 1 && val.has(mainKubeFolder)) { - return undefined; - } - - return Array.from(val, ([filePath, rest]) => ({ filePath, ...rest })); - }, -}; - -const editorConfiguration: PreferenceDescription | undefined, EditorConfiguration> = { - fromStore(val) { - return merge(defaultEditorConfig, val); - }, - toStore(val) { - return val; - }, -}; - -const terminalConfig: PreferenceDescription = { - fromStore(val) { - return merge(defaultTerminalConfig, val); - }, - toStore(val) { - return val; - }, -}; - export type ExtensionRegistryLocation = "default" | "npmrc" | "custom"; export type ExtensionRegistry = { @@ -306,49 +87,13 @@ export type ExtensionRegistry = { export const defaultExtensionRegistryUrlLocation = "default"; export const defaultExtensionRegistryUrl = "https://registry.npmjs.org"; -const extensionRegistryUrl: PreferenceDescription = { - fromStore(val) { - return val ?? { - location: defaultExtensionRegistryUrlLocation, - }; - }, - toStore(val) { - if (val.location === defaultExtensionRegistryUrlLocation) { - return undefined; - } - - return val; - }, -}; - -type PreferencesModelType = typeof DESCRIPTORS[field] extends PreferenceDescription ? T : never; -type UserStoreModelType = typeof DESCRIPTORS[field] extends PreferenceDescription ? T : never; +type PreferencesModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; +type UserStoreModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; export type UserStoreFlatModel = { - [field in keyof typeof DESCRIPTORS]: UserStoreModelType; + [field in keyof PreferenceDescriptors]: UserStoreModelType; }; export type UserPreferencesModel = { - [field in keyof typeof DESCRIPTORS]: PreferencesModelType; + [field in keyof PreferenceDescriptors]: PreferencesModelType; } & { updateChannel: string }; - -export const DESCRIPTORS = { - httpsProxy, - shell, - colorTheme, - terminalTheme, - localeTimezone, - allowUntrustedCAs, - allowErrorReporting, - downloadMirror, - downloadKubectlBinaries, - downloadBinariesPath, - kubectlBinariesPath, - openAtLogin, - hiddenTableColumns, - syncKubeconfigEntries, - editorConfiguration, - terminalCopyOnSelect, - terminalConfig, - extensionRegistryUrl, -}; diff --git a/src/common/user-store/terminal-theme.injectable.ts b/src/common/user-store/terminal-theme.injectable.ts new file mode 100644 index 0000000000..a0a00c3253 --- /dev/null +++ b/src/common/user-store/terminal-theme.injectable.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import userStoreInjectable from "./user-store.injectable"; + +export type TerminalThemePreference = { + matchLensTheme: true; +} | { + matchLensTheme: false; + themeId: string; +}; + +const terminalThemePreferenceInjectable = getInjectable({ + id: "terminal-theme-preference", + instantiate: (di) => { + const userStore = di.inject(userStoreInjectable); + + return computed((): TerminalThemePreference => { + // NOTE: remove use of magic strings + if (!userStore.terminalTheme) { + return { + matchLensTheme: true, + }; + } + + return { + matchLensTheme: false, + themeId: userStore.terminalTheme, + }; + }); + }, +}); + +export default terminalThemePreferenceInjectable; diff --git a/src/common/user-store/user-store.injectable.ts b/src/common/user-store/user-store.injectable.ts index 4e01cc50eb..3b45b03b1d 100644 --- a/src/common/user-store/user-store.injectable.ts +++ b/src/common/user-store/user-store.injectable.ts @@ -6,20 +6,37 @@ import { getInjectable } from "@ogre-tools/injectable"; import { UserStore } from "./user-store"; import selectedUpdateChannelInjectable from "../../features/application-update/common/selected-update-channel/selected-update-channel.injectable"; import emitAppEventInjectable from "../app-event-bus/emit-event.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; +import storeMigrationsInjectable from "../base-store/migrations.injectable"; +import { userStoreMigrationInjectionToken } from "./migrations-token"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-store/disable-sync"; +import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; +import getBasenameOfPathInjectable from "../path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../utils/channel/enlist-message-channel-listener-injection-token"; +import userStorePreferenceDescriptorsInjectable from "./preference-descriptors.injectable"; const userStoreInjectable = getInjectable({ id: "user-store", - instantiate: (di) => { - UserStore.resetInstance(); - - return UserStore.createInstance({ - selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable), - emitAppEvent: di.inject(emitAppEventInjectable), - }); - }, - - causesSideEffects: true, + instantiate: (di) => new UserStore({ + selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable), + emitAppEvent: di.inject(emitAppEventInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: di.inject(storeMigrationsInjectable, userStoreMigrationInjectionToken), + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + preferenceDescriptors: di.inject(userStorePreferenceDescriptorsInjectable), + }), }); export default userStoreInjectable; diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 7db6127ed8..8979ba3351 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -3,44 +3,37 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { app } from "electron"; -import { action, observable, reaction, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx"; -import { BaseStore } from "../base-store"; -import migrations from "../../migrations/user-store"; +import { action, observable, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx"; +import type { BaseStoreDependencies } from "../base-store/base-store"; +import { BaseStore } from "../base-store/base-store"; import { getOrInsertSet, toggle, toJS, object } from "../../renderer/utils"; -import { DESCRIPTORS } from "./preferences-helpers"; import type { UserPreferencesModel, StoreType } from "./preferences-helpers"; -import logger from "../../main/logger"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; // TODO: Remove coupling with Feature import type { SelectedUpdateChannel } from "../../features/application-update/common/selected-update-channel/selected-update-channel.injectable"; import type { ReleaseChannel } from "../../features/application-update/common/update-channels"; +import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; export interface UserStoreModel { - lastSeenAppVersion: string; preferences: UserPreferencesModel; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { readonly selectedUpdateChannel: SelectedUpdateChannel; + readonly preferenceDescriptors: PreferenceDescriptors; emitAppEvent: EmitAppEvent; } export class UserStore extends BaseStore /* implements UserStoreFlatModel (when strict null is enabled) */ { - readonly displayName = "UserStore"; - - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-user-store", - migrations, }); makeObservable(this); } - @observable lastSeenAppVersion = "0.0.0"; - /** * @deprecated No longer used */ @@ -51,58 +44,45 @@ export class UserStore extends BaseStore /* implements UserStore */ @observable newContexts = observable.set(); - @observable allowErrorReporting!: StoreType; - @observable allowUntrustedCAs!: StoreType; - @observable colorTheme!: StoreType; - @observable terminalTheme!: StoreType; - @observable localeTimezone!: StoreType; - @observable downloadMirror!: StoreType; - @observable httpsProxy!: StoreType; - @observable shell!: StoreType; - @observable downloadBinariesPath!: StoreType; - @observable kubectlBinariesPath!: StoreType; - @observable terminalCopyOnSelect!: StoreType; - @observable terminalConfig!: StoreType; - @observable extensionRegistryUrl!: StoreType; + @observable allowErrorReporting!: StoreType; + @observable allowUntrustedCAs!: StoreType; + @observable colorTheme!: StoreType; + @observable terminalTheme!: StoreType; + @observable localeTimezone!: StoreType; + @observable downloadMirror!: StoreType; + @observable httpsProxy!: StoreType; + @observable shell!: StoreType; + @observable downloadBinariesPath!: StoreType; + @observable kubectlBinariesPath!: StoreType; + @observable terminalCopyOnSelect!: StoreType; + @observable terminalConfig!: StoreType; + @observable extensionRegistryUrl!: StoreType; /** * Download kubectl binaries matching cluster version */ - @observable downloadKubectlBinaries!: StoreType; + @observable downloadKubectlBinaries!: StoreType; /** * Whether the application should open itself at login. */ - @observable openAtLogin!: StoreType; + @observable openAtLogin!: StoreType; /** * The column IDs under each configurable table ID that have been configured * to not be shown */ - @observable hiddenTableColumns!: StoreType; + @observable hiddenTableColumns!: StoreType; /** * Monaco editor configs */ - @observable editorConfiguration!: StoreType; + @observable editorConfiguration!: StoreType; /** * The set of file/folder paths to be synced */ - @observable syncKubeconfigEntries!: StoreType; - - startMainReactions() { - // open at system start-up - reaction(() => this.openAtLogin, openAtLogin => { - app.setLoginItemSettings({ - openAtLogin, - openAsHidden: true, - args: ["--hidden"], - }); - }, { - fireImmediately: true, - }); - } + @observable syncKubeconfigEntries!: StoreType; /** * Checks if a column (by ID) for a table (by ID) is configured to be hidden @@ -133,18 +113,14 @@ export class UserStore extends BaseStore /* implements UserStore @action resetTheme() { - this.colorTheme = DESCRIPTORS.colorTheme.fromStore(undefined); + this.colorTheme = this.dependencies.preferenceDescriptors.colorTheme.fromStore(undefined); } @action - protected fromStore({ lastSeenAppVersion, preferences }: Partial = {}) { - logger.debug("UserStore.fromStore()", { lastSeenAppVersion, preferences }); + protected fromStore({ preferences }: Partial = {}) { + this.dependencies.logger.debug("UserStore.fromStore()", { preferences }); - if (lastSeenAppVersion) { - this.lastSeenAppVersion = lastSeenAppVersion; - } - - for (const [key, { fromStore }] of object.entries(DESCRIPTORS)) { + for (const [key, { fromStore }] of object.entries(this.dependencies.preferenceDescriptors)) { const curVal = this[key]; const newVal = fromStore((preferences)?.[key] as never) as never; @@ -165,16 +141,13 @@ export class UserStore extends BaseStore /* implements UserStore toJSON(): UserStoreModel { const preferences = object.fromEntries( - object.entries(DESCRIPTORS) + object.entries(this.dependencies.preferenceDescriptors) .map(([key, { toStore }]) => [key, toStore(this[key] as never)]), ) as UserPreferencesModel; return toJS({ - lastSeenAppVersion: this.lastSeenAppVersion, - preferences: { ...preferences, - updateChannel: this.dependencies.selectedUpdateChannel.value.get().id, }, }); diff --git a/src/common/utils/collection-functions.ts b/src/common/utils/collection-functions.ts index 0702230464..5d6dc80548 100644 --- a/src/common/utils/collection-functions.ts +++ b/src/common/utils/collection-functions.ts @@ -48,11 +48,21 @@ export function getOrInsertSet(map: Map>, key: K): Set { return getOrInsert(map, key, new Set()); } +/** + * A currying version of {@link getOrInsertSet} + */ +export function getOrInsertSetFor(map: Map>): (key: K) => Set { + return (key) => getOrInsertSet(map, key); +} + /** * Like `getOrInsert` but with delayed creation of the item. Which is useful * if it is very expensive to create the initial value. */ -export function getOrInsertWith(map: Map, key: K, builder: () => V): V { +export function getOrInsertWith(map: Map, key: K, builder: () => V): V; +export function getOrInsertWith(map: Map | WeakMap, key: K, builder: () => V): V; + +export function getOrInsertWith(map: Map | WeakMap, key: K, builder: () => V): V { if (!map.has(key)) { map.set(key, builder()); } diff --git a/src/migrations/utils.ts b/src/common/utils/generate-new-id-for.ts similarity index 100% rename from src/migrations/utils.ts rename to src/common/utils/generate-new-id-for.ts diff --git a/src/common/utils/random-bytes.global-override-for-injectable.ts b/src/common/utils/random-bytes.global-override-for-injectable.ts new file mode 100644 index 0000000000..6f83a264e4 --- /dev/null +++ b/src/common/utils/random-bytes.global-override-for-injectable.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverride } from "../test-utils/get-global-override"; +import randomBytesInjectable from "./random-bytes.injectable"; + +export default getGlobalOverride(randomBytesInjectable, () => async (size) => { + const res = Buffer.alloc(size); + + for (let i = 0; i < size; i += 1) { + res[i] = i; + } + + return res; +}); diff --git a/src/common/utils/random-bytes.injectable.ts b/src/common/utils/random-bytes.injectable.ts new file mode 100644 index 0000000000..9f00961824 --- /dev/null +++ b/src/common/utils/random-bytes.injectable.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { randomBytes } from "crypto"; +import { promisify } from "util"; + +export type RandomBytes = (size: number) => Promise; + +const randomBytesInjectable = getInjectable({ + id: "random-bytes", + instantiate: (): RandomBytes => promisify(randomBytes), + causesSideEffects: true, +}); + +export default randomBytesInjectable; diff --git a/src/common/utils/singleton.ts b/src/common/utils/singleton.ts index d60fdb0490..0dea1f7526 100644 --- a/src/common/utils/singleton.ts +++ b/src/common/utils/singleton.ts @@ -3,10 +3,13 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -interface StaticThis { new(...args: R): T } +export interface StaticThis { new(...args: R): T } +/** + * @deprecated This is a form of global shared state + */ export class Singleton { - private static instances = new WeakMap(); + private static readonly instances = new WeakMap(); private static creating = ""; constructor() { diff --git a/src/common/utils/type-narrowing.ts b/src/common/utils/type-narrowing.ts index 936fb48816..41552c3136 100644 --- a/src/common/utils/type-narrowing.ts +++ b/src/common/utils/type-narrowing.ts @@ -123,6 +123,10 @@ export function isDefined(val: T | undefined | null): val is T { return val != null; } +export function isFunction(val: unknown): val is (...args: unknown[]) => unknown { + return typeof val === "function"; +} + /** * Checks if the value in the second position is non-nullable */ @@ -146,6 +150,15 @@ export function hasDefiniteField(field: Field): (val: return (val): val is T & { [f in Field]-?: NonNullable } => val[field] != null; } +export function isPromiseLike(res: unknown): res is (Promise | { then: (fn: (val: unknown) => any) => Promise }) { + if (res instanceof Promise) { + return true; + } + + return isObject(res) + && hasTypedProperty(res, "then", isFunction); +} + export function isPromiseSettledRejected(result: PromiseSettledResult): result is PromiseRejectedResult { return result.status === "rejected"; } diff --git a/src/common/vars.ts b/src/common/vars.ts index fe568b5b86..cbde12ff5d 100644 --- a/src/common/vars.ts +++ b/src/common/vars.ts @@ -4,7 +4,7 @@ */ // App's common configuration for any process (main, renderer, build pipeline, etc.) -import type { ThemeId } from "../renderer/themes/store"; +import type { ThemeId } from "../renderer/themes/lens-theme"; /** * @deprecated Switch to using isMacInjectable @@ -55,12 +55,4 @@ export const apiKubePrefix = "/api-kube"; // k8s cluster apis export const issuesTrackerUrl = "https://github.com/lensapp/lens/issues" as string; export const slackUrl = "https://join.slack.com/t/k8slens/shared_invite/zt-wcl8jq3k-68R5Wcmk1o95MLBE5igUDQ" as string; export const supportUrl = "https://docs.k8slens.dev/support/" as string; - -export const lensWebsiteWeblinkId = "lens-website-link"; -export const lensDocumentationWeblinkId = "lens-documentation-link"; -export const lensSlackWeblinkId = "lens-slack-link"; -export const lensTwitterWeblinkId = "lens-twitter-link"; -export const lensBlogWeblinkId = "lens-blog-link"; -export const kubernetesDocumentationWeblinkId = "kubernetes-documentation-link"; - export const docsUrl = "https://docs.k8slens.dev" as string; diff --git a/src/common/weblink-store.injectable.ts b/src/common/weblink-store.injectable.ts deleted file mode 100644 index 4aca7dce2a..0000000000 --- a/src/common/weblink-store.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { WeblinkStore } from "./weblink-store"; - -const weblinkStoreInjectable = getInjectable({ - id: "weblink-store", - - instantiate: () => { - WeblinkStore.resetInstance(); - - return WeblinkStore.createInstance(); - }, -}); - -export default weblinkStoreInjectable; diff --git a/src/common/weblinks-store/migration-token.ts b/src/common/weblinks-store/migration-token.ts new file mode 100644 index 0000000000..d1cea9334b --- /dev/null +++ b/src/common/weblinks-store/migration-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { MigrationDeclaration } from "../base-store/migrations.injectable"; + +export const weblinkStoreMigrationInjectionToken = getInjectionToken({ + id: "weblink-store-migration-token", +}); diff --git a/src/common/weblinks-store/weblink-store.injectable.ts b/src/common/weblinks-store/weblink-store.injectable.ts new file mode 100644 index 0000000000..cf793a2e58 --- /dev/null +++ b/src/common/weblinks-store/weblink-store.injectable.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-store/disable-sync"; +import storeMigrationsInjectable from "../base-store/migrations.injectable"; +import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import getBasenameOfPathInjectable from "../path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../utils/channel/enlist-message-channel-listener-injection-token"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; +import { weblinkStoreMigrationInjectionToken } from "./migration-token"; +import { WeblinkStore } from "./weblink-store"; + +const weblinkStoreInjectable = getInjectable({ + id: "weblink-store", + instantiate: (di) => new WeblinkStore({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: di.inject(storeMigrationsInjectable, weblinkStoreMigrationInjectionToken), + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }), +}); + +export default weblinkStoreInjectable; diff --git a/src/common/weblink-store.ts b/src/common/weblinks-store/weblink-store.ts similarity index 86% rename from src/common/weblink-store.ts rename to src/common/weblinks-store/weblink-store.ts index a8430666e5..2044ca08c1 100644 --- a/src/common/weblink-store.ts +++ b/src/common/weblinks-store/weblink-store.ts @@ -4,10 +4,10 @@ */ import { action, comparer, observable, makeObservable } from "mobx"; -import { BaseStore } from "./base-store"; -import migrations from "../migrations/weblinks-store"; +import type { BaseStoreDependencies } from "../base-store/base-store"; +import { BaseStore } from "../base-store/base-store"; import * as uuid from "uuid"; -import { toJS } from "./utils"; +import { toJS } from "../utils"; export interface WeblinkData { id: string; @@ -27,17 +27,15 @@ export interface WeblinkStoreModel { } export class WeblinkStore extends BaseStore { - readonly displayName = "WeblinkStore"; @observable weblinks: WeblinkData[] = []; - constructor() { - super({ + constructor(deps: BaseStoreDependencies) { + super(deps, { configName: "lens-weblink-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { equals: comparer.structural, }, - migrations, }); makeObservable(this); this.load(); diff --git a/src/extensions/__tests__/extension-loader.test.ts b/src/extensions/__tests__/extension-loader.test.ts index fa14f5856f..6e9c7cd0f9 100644 --- a/src/extensions/__tests__/extension-loader.test.ts +++ b/src/extensions/__tests__/extension-loader.test.ts @@ -14,6 +14,8 @@ import { delay } from "../../renderer/utils"; import { getDiForUnitTesting } from "../../renderer/getDiForUnitTesting"; import ipcRendererInjectable from "../../renderer/utils/channel/ipc-renderer.injectable"; import type { IpcRenderer } from "electron"; +import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import currentlyInClusterFrameInjectable from "../../renderer/routes/currently-in-cluster-frame.injectable"; console = new Console(stdout, stderr); @@ -28,6 +30,9 @@ describe("ExtensionLoader", () => { beforeEach(() => { const di = getDiForUnitTesting({ doGeneralOverrides: true }); + di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); + di.override(currentlyInClusterFrameInjectable, () => false); + di.override(ipcRendererInjectable, () => ({ invoke: jest.fn(async (channel: string) => { if (channel === "extension-loader:main:state") { diff --git a/src/extensions/common-api/user-preferences.ts b/src/extensions/common-api/user-preferences.ts index 3a0a93793b..ed925bd05d 100644 --- a/src/extensions/common-api/user-preferences.ts +++ b/src/extensions/common-api/user-preferences.ts @@ -3,7 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { UserStore } from "../../common/user-store"; +import userStoreInjectable from "../../common/user-store/user-store.injectable"; +import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; export interface UserPreferenceExtensionItems { /** * Get the configured kubectl binaries path. @@ -11,6 +12,8 @@ export interface UserPreferenceExtensionItems { getKubectlPath: () => string | undefined; } +const userStore = asLegacyGlobalForExtensionApi(userStoreInjectable); + export const Preferences: UserPreferenceExtensionItems = { - getKubectlPath: () => UserStore.getInstance().kubectlBinariesPath, + getKubectlPath: () => userStore.kubectlBinariesPath, }; diff --git a/src/extensions/extension-discovery/extension-discovery.injectable.ts b/src/extensions/extension-discovery/extension-discovery.injectable.ts index ad146e2fd7..971850c585 100644 --- a/src/extensions/extension-discovery/extension-discovery.injectable.ts +++ b/src/extensions/extension-discovery/extension-discovery.injectable.ts @@ -25,7 +25,7 @@ import getBasenameOfPathInjectable from "../../common/path/get-basename.injectab import getDirnameOfPathInjectable from "../../common/path/get-dirname.injectable"; import getRelativePathInjectable from "../../common/path/get-relative-path.injectable"; import joinPathsInjectable from "../../common/path/join-paths.injectable"; -import removePathInjectable from "../../common/fs/remove-path.injectable"; +import removePathInjectable from "../../common/fs/remove.injectable"; import homeDirectoryPathInjectable from "../../common/os/home-directory-path.injectable"; import applicationInformationInjectable from "../../common/vars/application-information.injectable"; import lensResourcesDirInjectable from "../../common/vars/lens-resources-dir.injectable"; diff --git a/src/extensions/extension-discovery/extension-discovery.test.ts b/src/extensions/extension-discovery/extension-discovery.test.ts index f3630addaf..d71f8c5292 100644 --- a/src/extensions/extension-discovery/extension-discovery.test.ts +++ b/src/extensions/extension-discovery/extension-discovery.test.ts @@ -15,10 +15,13 @@ import readJsonFileInjectable from "../../common/fs/read-json-file.injectable"; import pathExistsInjectable from "../../common/fs/path-exists.injectable"; import watchInjectable from "../../common/fs/watch/watch.injectable"; import extensionApiVersionInjectable from "../../common/vars/extension-api-version.injectable"; -import removePathInjectable from "../../common/fs/remove-path.injectable"; +import removePathInjectable from "../../common/fs/remove.injectable"; import type { JoinPaths } from "../../common/path/join-paths.injectable"; import joinPathsInjectable from "../../common/path/join-paths.injectable"; import homeDirectoryPathInjectable from "../../common/os/home-directory-path.injectable"; +import pathExistsSyncInjectable from "../../common/fs/path-exists-sync.injectable"; +import readJsonSyncInjectable from "../../common/fs/read-json-sync.injectable"; +import writeJsonSyncInjectable from "../../common/fs/write-json-sync.injectable"; describe("ExtensionDiscovery", () => { let extensionDiscovery: ExtensionDiscovery; @@ -34,6 +37,9 @@ describe("ExtensionDiscovery", () => { di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); di.override(installExtensionInjectable, () => () => Promise.resolve()); di.override(extensionApiVersionInjectable, () => "5.0.0"); + di.override(pathExistsSyncInjectable, () => () => { throw new Error("tried call pathExistsSync without override"); }); + di.override(readJsonSyncInjectable, () => () => { throw new Error("tried call readJsonSync without override"); }); + di.override(writeJsonSyncInjectable, () => () => { throw new Error("tried call writeJsonSync without override"); }); joinPaths = di.inject(joinPathsInjectable); homeDirectoryPath = di.inject(homeDirectoryPathInjectable); diff --git a/src/extensions/extension-discovery/extension-discovery.ts b/src/extensions/extension-discovery/extension-discovery.ts index 511bfba8a9..1d14c427d0 100644 --- a/src/extensions/extension-discovery/extension-discovery.ts +++ b/src/extensions/extension-discovery/extension-discovery.ts @@ -28,7 +28,7 @@ import type { JoinPaths } from "../../common/path/join-paths.injectable"; import type { GetBasenameOfPath } from "../../common/path/get-basename.injectable"; import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable"; import type { GetRelativePath } from "../../common/path/get-relative-path.injectable"; -import type { RemovePath } from "../../common/fs/remove-path.injectable"; +import type { RemovePath } from "../../common/fs/remove.injectable"; import type TypedEventEmitter from "typed-emitter"; import type { ApplicationInformation } from "../../common/vars/application-information.injectable"; diff --git a/src/extensions/extension-installer/extension-installer.injectable.ts b/src/extensions/extension-installer/extension-installer.injectable.ts index 169b758049..528d504958 100644 --- a/src/extensions/extension-installer/extension-installer.injectable.ts +++ b/src/extensions/extension-installer/extension-installer.injectable.ts @@ -9,12 +9,9 @@ import extensionPackageRootDirectoryInjectable from "./extension-package-root-di const extensionInstallerInjectable = getInjectable({ id: "extension-installer", - instantiate: (di) => - new ExtensionInstaller({ - extensionPackageRootDirectory: di.inject( - extensionPackageRootDirectoryInjectable, - ), - }), + instantiate: (di) => new ExtensionInstaller({ + extensionPackageRootDirectory: di.inject(extensionPackageRootDirectoryInjectable), + }), }); export default extensionInstallerInjectable; diff --git a/src/extensions/extension-installer/extension-package-root-directory/extension-package-root-directory.injectable.ts b/src/extensions/extension-installer/extension-package-root-directory/extension-package-root-directory.injectable.ts index 6ab004ef6d..72bd0ad8c2 100644 --- a/src/extensions/extension-installer/extension-package-root-directory/extension-package-root-directory.injectable.ts +++ b/src/extensions/extension-installer/extension-package-root-directory/extension-package-root-directory.injectable.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable - from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; const extensionPackageRootDirectoryInjectable = getInjectable({ id: "extension-package-root-directory", diff --git a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts index a0951baa8f..b511437da9 100644 --- a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts +++ b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts @@ -5,19 +5,38 @@ import { getInjectable } from "@ogre-tools/injectable"; import { FileSystemProvisionerStore } from "./file-system-provisioner-store"; import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; +import ensureDirectoryInjectable from "../../../common/fs/ensure-dir.injectable"; +import joinPathsInjectable from "../../../common/path/join-paths.injectable"; +import randomBytesInjectable from "../../../common/utils/random-bytes.injectable"; +import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; +import storeMigrationVersionInjectable from "../../../common/vars/store-migration-version.injectable"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../../../common/base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../../../common/base-store/disable-sync"; +import { persistStateToConfigInjectionToken } from "../../../common/base-store/save-to-file"; +import getBasenameOfPathInjectable from "../../../common/path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../../../common/utils/channel/enlist-message-channel-listener-injection-token"; const fileSystemProvisionerStoreInjectable = getInjectable({ id: "file-system-provisioner-store", - instantiate: (di) => { - FileSystemProvisionerStore.resetInstance(); - - return FileSystemProvisionerStore.createInstance({ - directoryForExtensionData: di.inject(directoryForExtensionDataInjectable), - }); - }, - - causesSideEffects: true, + instantiate: (di) => new FileSystemProvisionerStore({ + directoryForExtensionData: di.inject(directoryForExtensionDataInjectable), + ensureDirectory: di.inject(ensureDirectoryInjectable), + joinPaths: di.inject(joinPathsInjectable), + randomBytes: di.inject(randomBytesInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: {}, + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }), }); export default fileSystemProvisionerStoreInjectable; diff --git a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts index fab21df3cc..5655a0cf06 100644 --- a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts +++ b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts @@ -3,35 +3,37 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { randomBytes } from "crypto"; import { SHA256 } from "crypto-js"; -import fse from "fs-extra"; import { action, makeObservable, observable } from "mobx"; -import path from "path"; -import { BaseStore } from "../../../common/base-store"; +import type { BaseStoreDependencies } from "../../../common/base-store/base-store"; +import { BaseStore } from "../../../common/base-store/base-store"; import type { LensExtensionId } from "../../lens-extension"; -import { getOrInsertWith, toJS } from "../../../common/utils"; +import { getOrInsertWithAsync, toJS } from "../../../common/utils"; +import type { EnsureDirectory } from "../../../common/fs/ensure-dir.injectable"; +import type { JoinPaths } from "../../../common/path/join-paths.injectable"; +import type { RandomBytes } from "../../../common/utils/random-bytes.injectable"; interface FSProvisionModel { extensions: Record; // extension names to paths } -interface Dependencies { - directoryForExtensionData: string; +interface Dependencies extends BaseStoreDependencies { + readonly directoryForExtensionData: string; + ensureDirectory: EnsureDirectory; + joinPaths: JoinPaths; + randomBytes: RandomBytes; } export class FileSystemProvisionerStore extends BaseStore { - readonly displayName = "FilesystemProvisionerStore"; - registeredExtensions = observable.map(); + readonly registeredExtensions = observable.map(); - constructor(private dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-filesystem-provisioner-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names }); makeObservable(this); - this.load(); } /** @@ -41,14 +43,14 @@ export class FileSystemProvisionerStore extends BaseStore { * @returns path to the folder that the extension can safely write files to. */ async requestDirectory(extensionName: string): Promise { - const dirPath = getOrInsertWith(this.registeredExtensions, extensionName, () => { - const salt = randomBytes(32).toString("hex"); + const dirPath = await getOrInsertWithAsync(this.registeredExtensions, extensionName, async () => { + const salt = (await this.dependencies.randomBytes(32)).toString("hex"); const hashedName = SHA256(`${extensionName}/${salt}`).toString(); - return path.resolve(this.dependencies.directoryForExtensionData, hashedName); + return this.dependencies.joinPaths(this.dependencies.directoryForExtensionData, hashedName); }); - await fse.ensureDir(dirPath); + await this.dependencies.ensureDirectory(dirPath); return dirPath; } diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 4217576d2f..bda3c09c10 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -3,13 +3,76 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { BaseStore } from "../common/base-store"; +import type { BaseStoreParams } from "../common/base-store/base-store"; +import { BaseStore } from "../common/base-store/base-store"; import * as path from "path"; import type { LensExtension } from "./lens-extension"; import assert from "assert"; +import type { StaticThis } from "../common/utils"; +import { getOrInsertWith } from "../common/utils"; +import { getLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; +import directoryForUserDataInjectable from "../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../common/logger.injectable"; +import storeMigrationVersionInjectable from "../common/vars/store-migration-version.injectable"; +import type { Migrations } from "conf/dist/source/types"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../common/base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../common/base-store/disable-sync"; +import { persistStateToConfigInjectionToken } from "../common/base-store/save-to-file"; +import getBasenameOfPathInjectable from "../common/path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../common/utils/channel/enlist-message-channel-listener-injection-token"; + +export interface ExtensionStoreParams extends BaseStoreParams { + migrations?: Migrations; +} export abstract class ExtensionStore extends BaseStore { - readonly displayName = "ExtensionStore"; + private static readonly instances = new WeakMap>(); + + /** + * @deprecated This is a form of global shared state. Just call `new Store(...)` + */ + static createInstance, R extends any[]>(this: StaticThis, ...args: R): T { + return getOrInsertWith(ExtensionStore.instances, this, () => new this(...args)) as T; + } + + /** + * @deprecated This is a form of global shared state. Just call `new Store(...)` + */ + static getInstance(this: StaticThis, strict?: true): T; + static getInstance(this: StaticThis, strict: false): T | undefined; + static getInstance(this: StaticThis, strict = true): T | undefined { + if (!ExtensionStore.instances.has(this) && strict) { + throw new TypeError(`instance of ${this.name} is not created`); + } + + return ExtensionStore.instances.get(this) as (T | undefined); + } + + constructor({ migrations, ...params }: ExtensionStoreParams) { + const di = getLegacyGlobalDiForExtensionApi(); + + super({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: migrations as Migrations>, + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }, params); + } + + /** + * @deprecated This is a form of global shared state. Just call `new Store(...)` + */ + static resetInstance() { + ExtensionStore.instances.delete(this); + } + protected extension?: LensExtension; loadExtension(extension: LensExtension) { diff --git a/src/extensions/extensions-store/extensions-store.injectable.ts b/src/extensions/extensions-store/extensions-store.injectable.ts index edf84e4b66..9f5ff83270 100644 --- a/src/extensions/extensions-store/extensions-store.injectable.ts +++ b/src/extensions/extensions-store/extensions-store.injectable.ts @@ -3,18 +3,31 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import { baseStoreIpcChannelPrefixesInjectionToken } from "../../common/base-store/channel-prefix"; +import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../../common/base-store/disable-sync"; +import { persistStateToConfigInjectionToken } from "../../common/base-store/save-to-file"; +import getConfigurationFileModelInjectable from "../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../common/logger.injectable"; +import getBasenameOfPathInjectable from "../../common/path/get-basename.injectable"; +import { enlistMessageChannelListenerInjectionToken } from "../../common/utils/channel/enlist-message-channel-listener-injection-token"; +import storeMigrationVersionInjectable from "../../common/vars/store-migration-version.injectable"; import { ExtensionsStore } from "./extensions-store"; const extensionsStoreInjectable = getInjectable({ id: "extensions-store", - - instantiate: () => { - ExtensionsStore.resetInstance(); - - return ExtensionsStore.createInstance(); - }, - - causesSideEffects: true, + instantiate: (di) => new ExtensionsStore({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + migrations: {}, + getBasenameOfPath: di.inject(getBasenameOfPathInjectable), + ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), + persistStateToConfig: di.inject(persistStateToConfigInjectionToken), + enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), + shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + }), }); export default extensionsStoreInjectable; diff --git a/src/extensions/extensions-store/extensions-store.ts b/src/extensions/extensions-store/extensions-store.ts index 2ec1c8fd55..3b2dc80eb1 100644 --- a/src/extensions/extensions-store/extensions-store.ts +++ b/src/extensions/extensions-store/extensions-store.ts @@ -6,7 +6,8 @@ import type { LensExtensionId } from "../lens-extension"; import { action, computed, makeObservable, observable } from "mobx"; import { toJS } from "../../common/utils"; -import { BaseStore } from "../../common/base-store"; +import type { BaseStoreDependencies } from "../../common/base-store/base-store"; +import { BaseStore } from "../../common/base-store/base-store"; export interface LensExtensionsStoreModel { extensions: Record; @@ -23,9 +24,8 @@ export interface IsEnabledExtensionDescriptor { } export class ExtensionsStore extends BaseStore { - readonly displayName = "ExtensionsStore"; - constructor() { - super({ + constructor(deps: BaseStoreDependencies) { + super(deps, { configName: "lens-extensions", }); makeObservable(this); diff --git a/src/extensions/renderer-api/theming.ts b/src/extensions/renderer-api/theming.ts index 435cf23504..3e4c9fe97b 100644 --- a/src/extensions/renderer-api/theming.ts +++ b/src/extensions/renderer-api/theming.ts @@ -4,7 +4,7 @@ */ import activeThemeInjectable from "../../renderer/themes/active.injectable"; -import type { LensTheme } from "../../renderer/themes/store"; +import type { LensTheme } from "../../renderer/themes/lens-theme"; import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; export const activeTheme = asLegacyGlobalForExtensionApi(activeThemeInjectable); diff --git a/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap b/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap index 9046b189a9..c520be7f58 100644 --- a/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap +++ b/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap @@ -164,7 +164,23 @@ exports[`extension special characters in page registrations renders 1`] = `
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
{ - await applicationMenu.start(); + run: () => { + applicationMenu.start(); }, }; }, diff --git a/src/features/application-update/__snapshots__/installing-update.test.ts.snap b/src/features/application-update/__snapshots__/installing-update.test.ts.snap index deae3b999d..20df788ab7 100644 --- a/src/features/application-update/__snapshots__/installing-update.test.ts.snap +++ b/src/features/application-update/__snapshots__/installing-update.test.ts.snap @@ -165,7 +165,23 @@ exports[`installing update when started renders 1`] = `
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
({ - start: async () => {}, - stop: async () => {}, + start: () => {}, + stop: () => {}, started: false, })); diff --git a/src/features/application-update/child-features/periodical-checking-of-updates/main/start-checking-for-updates.injectable.ts b/src/features/application-update/child-features/periodical-checking-of-updates/main/start-checking-for-updates.injectable.ts index 0292d148df..20b60af2fa 100644 --- a/src/features/application-update/child-features/periodical-checking-of-updates/main/start-checking-for-updates.injectable.ts +++ b/src/features/application-update/child-features/periodical-checking-of-updates/main/start-checking-for-updates.injectable.ts @@ -16,9 +16,9 @@ const startCheckingForUpdatesInjectable = getInjectable({ return { id: "start-checking-for-updates", - run: async () => { + run: () => { if (updatingIsEnabled && !periodicalCheckForUpdates.started) { - await periodicalCheckForUpdates.start(); + periodicalCheckForUpdates.start(); } }, }; diff --git a/src/features/application-update/child-features/selection-of-update-stability/__snapshots__/selection-of-update-stability.test.ts.snap b/src/features/application-update/child-features/selection-of-update-stability/__snapshots__/selection-of-update-stability.test.ts.snap index bf6bf4674e..de277ddc97 100644 --- a/src/features/application-update/child-features/selection-of-update-stability/__snapshots__/selection-of-update-stability.test.ts.snap +++ b/src/features/application-update/child-features/selection-of-update-stability/__snapshots__/selection-of-update-stability.test.ts.snap @@ -165,7 +165,23 @@ exports[`selection of update stability when started renders 1`] = `
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
{ let checkForPlatformUpdates: CheckForPlatformUpdates; @@ -37,7 +37,13 @@ describe("check-for-platform-updates", () => { logErrorMock = jest.fn(); - di.override(loggerInjectable, () => ({ error: logErrorMock }) as unknown as Logger); + di.override(loggerInjectable, () => ({ + error: logErrorMock, + debug: noop, + info: noop, + silly: noop, + warn: noop, + })); checkForPlatformUpdates = di.inject(checkForPlatformUpdatesInjectable); }); diff --git a/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts b/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts index d60b4eb897..2cedacb68b 100644 --- a/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts +++ b/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts @@ -12,7 +12,7 @@ import asyncFn from "@async-fn/jest"; import { getPromiseStatus } from "../../../../../common/test-utils/get-promise-status"; import type { DiContainer } from "@ogre-tools/injectable"; import loggerInjectable from "../../../../../common/logger.injectable"; -import type { Logger } from "../../../../../common/logger"; +import { noop } from "../../../../../common/utils"; describe("download-platform-update", () => { let downloadPlatformUpdate: DownloadPlatformUpdate; @@ -43,7 +43,13 @@ describe("download-platform-update", () => { di.override(electronUpdaterInjectable, () => electronUpdaterFake); logErrorMock = jest.fn(); - di.override(loggerInjectable, () => ({ error: logErrorMock }) as unknown as Logger); + di.override(loggerInjectable, () => ({ + error: logErrorMock, + debug: noop, + info: noop, + silly: noop, + warn: noop, + })); downloadPlatformUpdate = di.inject(downloadPlatformUpdateInjectable); }); diff --git a/src/features/catalog/__snapshots__/opening-entity-details.test.tsx.snap b/src/features/catalog/__snapshots__/opening-entity-details.test.tsx.snap index 56c4a912e4..f459bdca0a 100644 --- a/src/features/catalog/__snapshots__/opening-entity-details.test.tsx.snap +++ b/src/features/catalog/__snapshots__/opening-entity-details.test.tsx.snap @@ -165,7 +165,23 @@ exports[`opening catalog entity details panel renders 1`] = `
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
{ emitAppEvent({ name: "cluster", action: "remove" }); diff --git a/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx index 519e6bb3c8..fd4d95d760 100644 --- a/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx +++ b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx @@ -24,6 +24,7 @@ import { navigateToRouteInjectionToken } from "../../common/front-end-routing/na import sidebarStorageInjectable from "../../renderer/components/layout/sidebar-storage/sidebar-storage.injectable"; import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time"; import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; +import { flushPromises } from "../../common/test-utils/flush-promises"; describe("cluster - sidebar and tab navigation for core", () => { let builder: ApplicationBuilder; @@ -283,6 +284,8 @@ describe("cluster - sidebar and tab navigation for core", () => { const readJsonFileFake = windowDi.inject(readJsonFileInjectable); + await flushPromises(); + const actual = await readJsonFileFake( "/some-directory-for-lens-local-storage/some-cluster-id.json", ); diff --git a/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx b/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx index a228cc880e..2441afa000 100644 --- a/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx +++ b/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx @@ -20,6 +20,7 @@ import type { IObservableValue } from "mobx"; import { runInAction, computed, observable } from "mobx"; import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; import type { DiContainer } from "@ogre-tools/injectable"; +import { flushPromises } from "../../common/test-utils/flush-promises"; describe("cluster - sidebar and tab navigation for extensions", () => { let applicationBuilder: ApplicationBuilder; @@ -399,6 +400,8 @@ describe("cluster - sidebar and tab navigation for extensions", () => { const readJsonFileFake = windowDi.inject(readJsonFileInjectable); + await flushPromises(); // Needed because of several async calls + const actual = await readJsonFileFake( "/some-directory-for-lens-local-storage/some-cluster-id.json", ); diff --git a/src/features/cluster/state-sync/common/channels.ts b/src/features/cluster/state-sync/common/channels.ts new file mode 100644 index 0000000000..7ceeb82f84 --- /dev/null +++ b/src/features/cluster/state-sync/common/channels.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { ClusterId, ClusterState } from "../../../../common/cluster-types"; +import type { MessageChannel } from "../../../../common/utils/channel/message-channel-listener-injection-token"; +import type { RequestChannel } from "../../../../common/utils/channel/request-channel-listener-injection-token"; + +export interface ClusterStateSync { + clusterId: ClusterId; + state: ClusterState; +} + +export const clusterStateSyncChannel: MessageChannel = { + id: "cluster-state-sync", +}; + +export const initialClusterStatesChannel: RequestChannel = { + id: "initial-cluster-state-sync", +}; diff --git a/src/features/cluster/state-sync/main/emit-update.injectable.ts b/src/features/cluster/state-sync/main/emit-update.injectable.ts new file mode 100644 index 0000000000..8cadd32864 --- /dev/null +++ b/src/features/cluster/state-sync/main/emit-update.injectable.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import type { MessageChannelHandler } from "../../../../common/utils/channel/message-channel-listener-injection-token"; +import { sendMessageToChannelInjectionToken } from "../../../../common/utils/channel/message-to-channel-injection-token"; +import { clusterStateSyncChannel } from "../common/channels"; + +export type EmitClusterStateUpdate = MessageChannelHandler; + +const emitClusterStateUpdateInjectable = getInjectable({ + id: "emit-cluster-state-update", + instantiate: (di): EmitClusterStateUpdate => { + const sendMessageToChannel = di.inject(sendMessageToChannelInjectionToken); + + return (message) => sendMessageToChannel(clusterStateSyncChannel, message); + }, +}); + +export default emitClusterStateUpdateInjectable; diff --git a/src/features/cluster/state-sync/main/handle-initial.injectable.ts b/src/features/cluster/state-sync/main/handle-initial.injectable.ts new file mode 100644 index 0000000000..708f032d48 --- /dev/null +++ b/src/features/cluster/state-sync/main/handle-initial.injectable.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; +import { getRequestChannelListenerInjectable } from "../../../../main/utils/channel/channel-listeners/listener-tokens"; +import { initialClusterStatesChannel } from "../common/channels"; + +const handleInitialClusterStateSyncInjectable = getRequestChannelListenerInjectable({ + channel: initialClusterStatesChannel, + handler: (di) => { + const clusterStore = di.inject(clusterStoreInjectable); + + return () => clusterStore.clustersList.map(cluster => ({ + clusterId: cluster.id, + state: cluster.getState(), + })); + }, +}); + +export default handleInitialClusterStateSyncInjectable; diff --git a/src/features/cluster/state-sync/main/setup-sync.injectable.ts b/src/features/cluster/state-sync/main/setup-sync.injectable.ts new file mode 100644 index 0000000000..9b0e13249d --- /dev/null +++ b/src/features/cluster/state-sync/main/setup-sync.injectable.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { isEqual } from "lodash"; +import { autorun } from "mobx"; +import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; +import type { ClusterId, ClusterState } from "../../../../common/cluster-types"; +import { beforeApplicationIsLoadingInjectionToken } from "../../../../main/start-main-application/runnable-tokens/before-application-is-loading-injection-token"; +import initClusterStoreInjectable from "../../store/main/init.injectable"; +import emitClusterStateUpdateInjectable from "./emit-update.injectable"; + +const setupClusterStateBroadcastingInjectable = getInjectable({ + id: "setup-cluster-state-broadcasting", + instantiate: (di) => ({ + id: "setup-cluster-state-broadcasting", + run: () => { + const emitClusterStateUpdate = di.inject(emitClusterStateUpdateInjectable); + const clusterStore = di.inject(clusterStoreInjectable); + const prevStates = new Map(); + + autorun(() => { + for (const cluster of clusterStore.clusters.values()) { + const prevState = prevStates.get(cluster.id); + const curState = cluster.getState(); + + if (!prevState || !isEqual(prevState, curState)) { + prevStates.set(cluster.id, curState); + + emitClusterStateUpdate({ + clusterId: cluster.id, + state: cluster.getState(), + }); + } + } + }); + }, + runAfter: di.inject(initClusterStoreInjectable), + }), + injectionToken: beforeApplicationIsLoadingInjectionToken, +}); + +export default setupClusterStateBroadcastingInjectable; diff --git a/src/features/cluster/state-sync/renderer/listener.injectable.ts b/src/features/cluster/state-sync/renderer/listener.injectable.ts new file mode 100644 index 0000000000..9863a391e8 --- /dev/null +++ b/src/features/cluster/state-sync/renderer/listener.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import getClusterByIdInjectable from "../../../../common/cluster-store/get-by-id.injectable"; +import { getMessageChannelListenerInjectable } from "../../../../common/utils/channel/message-channel-listener-injection-token"; +import { clusterStateSyncChannel } from "../common/channels"; + +const clusterStateListenerInjectable = getMessageChannelListenerInjectable({ + channel: clusterStateSyncChannel, + id: "main", + handler: (di) => { + const getClusterById = di.inject(getClusterByIdInjectable); + + return ({ clusterId, state }) => getClusterById(clusterId)?.setState(state); + }, +}); + +export default clusterStateListenerInjectable; diff --git a/src/features/cluster/state-sync/renderer/request-initial.injectable.ts b/src/features/cluster/state-sync/renderer/request-initial.injectable.ts new file mode 100644 index 0000000000..89f72fbcf5 --- /dev/null +++ b/src/features/cluster/state-sync/renderer/request-initial.injectable.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import type { RequestChannelHandler } from "../../../../main/utils/channel/channel-listeners/listener-tokens"; +import requestFromChannelInjectable from "../../../../renderer/utils/channel/request-from-channel.injectable"; +import { initialClusterStatesChannel } from "../common/channels"; + +export type RequestInitialClusterStates = RequestChannelHandler; + +const requestInitialClusterStatesInjectable = getInjectable({ + id: "request-initial-cluster-states", + instantiate: (di): RequestInitialClusterStates => { + const requestFromChannel = di.inject(requestFromChannelInjectable); + + return () => requestFromChannel(initialClusterStatesChannel); + }, +}); + +export default requestInitialClusterStatesInjectable; diff --git a/src/features/cluster/state-sync/renderer/setup-sync.injectable.ts b/src/features/cluster/state-sync/renderer/setup-sync.injectable.ts new file mode 100644 index 0000000000..93005543db --- /dev/null +++ b/src/features/cluster/state-sync/renderer/setup-sync.injectable.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import getClusterByIdInjectable from "../../../../common/cluster-store/get-by-id.injectable"; +import { beforeFrameStartsInjectionToken } from "../../../../renderer/before-frame-starts/tokens"; +import initClusterStoreInjectable from "../../store/renderer/init.injectable"; +import requestInitialClusterStatesInjectable from "./request-initial.injectable"; + +const setupClusterStateSyncInjectable = getInjectable({ + id: "setup-cluster-state-sync", + instantiate: (di) => ({ + id: "setup-cluster-state-sync", + run: async () => { + const requestInitialClusterStates = di.inject(requestInitialClusterStatesInjectable); + const getClusterById = di.inject(getClusterByIdInjectable); + const initalStates = await requestInitialClusterStates(); + + for (const { clusterId, state } of initalStates) { + getClusterById(clusterId)?.setState(state); + } + }, + runAfter: di.inject(initClusterStoreInjectable), + }), + injectionToken: beforeFrameStartsInjectionToken, +}); + +export default setupClusterStateSyncInjectable; diff --git a/src/features/cluster/store/main/init.injectable.ts b/src/features/cluster/store/main/init.injectable.ts new file mode 100644 index 0000000000..7849ab6acd --- /dev/null +++ b/src/features/cluster/store/main/init.injectable.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; +import { beforeApplicationIsLoadingInjectionToken } from "../../../../main/start-main-application/runnable-tokens/before-application-is-loading-injection-token"; +import initUserStoreInjectable from "../../../../main/stores/init-user-store.injectable"; + +const initClusterStoreInjectable = getInjectable({ + id: "init-cluster-store", + instantiate: (di) => { + const clusterStore = di.inject(clusterStoreInjectable); + + return { + id: "init-cluster-store", + run: () => { + clusterStore.load(); + }, + runAfter: di.inject(initUserStoreInjectable), + }; + }, + injectionToken: beforeApplicationIsLoadingInjectionToken, +}); + +export default initClusterStoreInjectable; diff --git a/src/features/cluster/store/renderer/init.injectable.ts b/src/features/cluster/store/renderer/init.injectable.ts new file mode 100644 index 0000000000..2c2795de5c --- /dev/null +++ b/src/features/cluster/store/renderer/init.injectable.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; +import { beforeFrameStartsInjectionToken } from "../../../../renderer/before-frame-starts/tokens"; +import initUserStoreInjectable from "../../../../renderer/stores/init-user-store.injectable"; + +const initClusterStoreInjectable = getInjectable({ + id: "init-cluster-store", + instantiate: (di) => ({ + id: "init-cluster-store", + run: () => { + const clusterStore = di.inject(clusterStoreInjectable); + + clusterStore.load(); + }, + runAfter: di.inject(initUserStoreInjectable), + }), + injectionToken: beforeFrameStartsInjectionToken, +}); + +export default initClusterStoreInjectable; diff --git a/src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap b/src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap index 31cc3f76ec..7bc003b784 100644 --- a/src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap +++ b/src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap @@ -256,7 +256,23 @@ exports[`Command Pallet: keyboard shortcut tests when on linux renders 1`] = `
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
Proxy -
-
-
- HTTP Proxy - -
-
- -
-
- - HTTP Proxy server. Used for communicating with Kubernetes API. - -
-
+
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
+ > +
+
+
+ Ca +
+
+
+
- 0 + 1
| undefined; +} + +export const navigateForExtensionChannel: MessageChannel = { + id: "navigate-for-extension", +}; diff --git a/src/features/extensions/navigate/renderer/listener.injectable.ts b/src/features/extensions/navigate/renderer/listener.injectable.ts new file mode 100644 index 0000000000..fccf0efca6 --- /dev/null +++ b/src/features/extensions/navigate/renderer/listener.injectable.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getMessageChannelListenerInjectable } from "../../../../common/utils/channel/message-channel-listener-injection-token"; +import extensionLoaderInjectable from "../../../../extensions/extension-loader/extension-loader.injectable"; +import type { LensRendererExtension } from "../../../../extensions/lens-renderer-extension"; +import { navigateForExtensionChannel } from "../common/channel"; + +const navigateForExtensionListenerInjectable = getMessageChannelListenerInjectable({ + channel: navigateForExtensionChannel, + id: "main", + handler: (di) => { + const extensionLoader = di.inject(extensionLoaderInjectable); + + return ({ extId, pageId, params }) => { + const extension = extensionLoader.getInstanceById(extId) as LensRendererExtension | undefined; + + if (extension) { + extension.navigate(pageId, params); + } + }; + }, +}); + +export default navigateForExtensionListenerInjectable; diff --git a/src/features/file-system-provisioner/main/init-store.injectable.ts b/src/features/file-system-provisioner/main/init-store.injectable.ts new file mode 100644 index 0000000000..0fe3d4f77b --- /dev/null +++ b/src/features/file-system-provisioner/main/init-store.injectable.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import fileSystemProvisionerStoreInjectable from "../../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable"; +import { onLoadOfApplicationInjectionToken } from "../../../main/start-main-application/runnable-tokens/on-load-of-application-injection-token"; + +const initFileSystemProvisionerStoreInjectable = getInjectable({ + id: "init-file-system-provisioner-store", + instantiate: (di) => ({ + id: "init-file-system-provisioner-store", + run: () => { + const store = di.inject(fileSystemProvisionerStoreInjectable); + + store.load(); + }, + }), + injectionToken: onLoadOfApplicationInjectionToken, +}); + +export default initFileSystemProvisionerStoreInjectable; diff --git a/src/features/file-system-provisioner/renderer/init-store.injectable.ts b/src/features/file-system-provisioner/renderer/init-store.injectable.ts new file mode 100644 index 0000000000..d241dcad38 --- /dev/null +++ b/src/features/file-system-provisioner/renderer/init-store.injectable.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import fileSystemProvisionerStoreInjectable from "../../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable"; +import { beforeFrameStartsInjectionToken } from "../../../renderer/before-frame-starts/tokens"; + +const initFileSystemProvisionerStoreInjectable = getInjectable({ + id: "init-file-system-provisioner-store", + instantiate: (di) => ({ + id: "init-file-system-provisioner-store", + run: () => { + const store = di.inject(fileSystemProvisionerStoreInjectable); + + store.load(); + }, + }), + injectionToken: beforeFrameStartsInjectionToken, +}); + +export default initFileSystemProvisionerStoreInjectable; diff --git a/src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap index 095977e374..3c7fbe7b4a 100644 --- a/src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap +++ b/src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap @@ -195,6 +195,7 @@ exports[`add custom helm repository in preferences when navigating to preference > Download kubectl binaries matching the Kubernetes cluster version @@ -215,7 +216,7 @@ exports[`add custom helm repository in preferences when navigating to preference
- Download mirror for kubectl + Default (Google)
- Download mirror for kubectl + Default (Google)