From 30d482f0f858d687e9a2d25cf82de9d4256b705d Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:38:42 +0800 Subject: [PATCH 1/6] refactor: optimize user creation (#6480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvement /area core /milestone 2.19.x #### What this PR does / why we need it: 优化用户创建 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../halo/app/core/extension/endpoint/UserEndpoint.java | 10 +++------- .../halo/app/core/extension/service/UserService.java | 2 ++ .../app/core/extension/service/UserServiceImpl.java | 5 +++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java b/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java index bcc18966ba..a09df32cb4 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java +++ b/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java @@ -444,13 +444,9 @@ private Mono createUser(ServerRequest request) { }) .flatMap(userRequest -> { User newUser = CreateUserRequest.from(userRequest); - return userService.createUser(newUser, userRequest.roles()) - .then(Mono.defer(() -> userService.updateWithRawPassword(userRequest.name(), - userRequest.password())) - .retryWhen(Retry.backoff(5, Duration.ofMillis(100)) - .filter(OptimisticLockingFailureException.class::isInstance) - ) - ); + var encryptedPwd = userService.encryptPassword(userRequest.password()); + newUser.getSpec().setPassword(encryptedPwd); + return userService.createUser(newUser, userRequest.roles()); }) .flatMap(user -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserService.java b/application/src/main/java/run/halo/app/core/extension/service/UserService.java index 10f94d66d4..f7d8250006 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserService.java +++ b/application/src/main/java/run/halo/app/core/extension/service/UserService.java @@ -27,4 +27,6 @@ public interface UserService { Mono confirmPassword(String username, String rawPassword); Flux listByEmail(String email); + + String encryptPassword(String rawPassword); } diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java b/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java index 98564e03ab..f81cbbf750 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java @@ -213,6 +213,11 @@ public Flux listByEmail(String email) { ); } + @Override + public String encryptPassword(String rawPassword) { + return passwordEncoder.encode(rawPassword); + } + void publishPasswordChangedEvent(String username) { eventPublisher.publishEvent(new PasswordChangedEvent(this, username)); } From a938712739396c17175c160f6bf356d9853f53b8 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 20 Aug 2024 11:28:47 +0800 Subject: [PATCH 2/6] chore: bump vite-related dependencies (#6482) #### What type of PR is this? /area ui /kind improvement /milestone 2.19.x #### What this PR does / why we need it: Bump vite-related dependencies #### Does this PR introduce a user-facing change? ```release-note None ``` --- ui/package.json | 10 +- ui/packages/api-client/package.json | 2 +- ui/packages/components/package.json | 2 +- ui/packages/editor/package.json | 2 +- ui/packages/shared/package.json | 2 +- ui/pnpm-lock.yaml | 2946 +++++++++++++-------------- 6 files changed, 1439 insertions(+), 1525 deletions(-) diff --git a/ui/package.json b/ui/package.json index a8a3f6aa1d..d896dd939c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -121,8 +121,8 @@ "@types/qs": "^6.9.7", "@types/randomstring": "^1.1.8", "@types/ua-parser-js": "^0.7.39", - "@vitejs/plugin-vue": "^5.0.4", - "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^4.0.1", "@vitest/ui": "^0.34.1", "@vue/compiler-sfc": "^3.4.27", "@vue/eslint-config-prettier": "^7.1.0", @@ -152,12 +152,12 @@ "tailwindcss-themer": "^2.0.3", "typescript": "~5.5.4", "unplugin-icons": "^0.19.2", - "vite": "^5.2.11", + "vite": "^5.4.1", "vite-plugin-externals": "^0.6.2", "vite-plugin-html": "^3.2.2", "vite-plugin-pwa": "^0.20.0", - "vite-plugin-static-copy": "^1.0.4", - "vite-plugin-vue-devtools": "^7.2.1", + "vite-plugin-static-copy": "^1.0.6", + "vite-plugin-vue-devtools": "^7.3.8", "vitest": "^0.34.1", "vue-tsc": "^2.0.29" } diff --git a/ui/packages/api-client/package.json b/ui/packages/api-client/package.json index b3a2a6bf1a..573fab49bd 100644 --- a/ui/packages/api-client/package.json +++ b/ui/packages/api-client/package.json @@ -49,7 +49,7 @@ "rimraf": "^5.0.7", "typescript": "~5.5.4", "unbuild": "^0.7.6", - "vite-plugin-dts": "^3.9.1" + "vite-plugin-dts": "^4.0.3" }, "peerDependencies": { "axios": "^1.7.x" diff --git a/ui/packages/components/package.json b/ui/packages/components/package.json index 25182e9761..d7c1beaa79 100644 --- a/ui/packages/components/package.json +++ b/ui/packages/components/package.json @@ -58,7 +58,7 @@ "react-dom": "^18.2.0", "storybook": "^7.6.3", "unplugin-icons": "^0.14.15", - "vite-plugin-dts": "^3.9.1" + "vite-plugin-dts": "^4.0.3" }, "peerDependencies": { "vue": "^3.4.27", diff --git a/ui/packages/editor/package.json b/ui/packages/editor/package.json index d260373510..9d3d0f309a 100644 --- a/ui/packages/editor/package.json +++ b/ui/packages/editor/package.json @@ -90,7 +90,7 @@ "@iconify/json": "^2.2.117", "@types/linkifyjs": "^2.1.7", "release-it": "^16.1.5", - "vite-plugin-dts": "^3.9.1" + "vite-plugin-dts": "^4.0.3" }, "peerDependencies": { "vue": "^3.4.27" diff --git a/ui/packages/shared/package.json b/ui/packages/shared/package.json index 5969e94fed..18bf080f17 100644 --- a/ui/packages/shared/package.json +++ b/ui/packages/shared/package.json @@ -38,7 +38,7 @@ "homepage": "https://github.com/halo-dev/halo/tree/main/ui/packages/shared#readme", "license": "MIT", "devDependencies": { - "vite-plugin-dts": "^3.9.1" + "vite-plugin-dts": "^4.0.3" }, "peerDependencies": { "vue": "^3.4.27", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 0130cdf765..2b3e262c7d 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -247,11 +247,11 @@ importers: specifier: ^0.7.39 version: 0.7.39 '@vitejs/plugin-vue': - specifier: ^5.0.4 - version: 5.0.4(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + specifier: ^5.1.2 + version: 5.1.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) '@vitejs/plugin-vue-jsx': - specifier: ^3.1.0 - version: 3.1.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + specifier: ^4.0.1 + version: 4.0.1(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) '@vitest/ui': specifier: ^0.34.1 version: 0.34.1(vitest@0.34.1) @@ -340,23 +340,23 @@ importers: specifier: ^0.19.2 version: 0.19.2(@vue/compiler-sfc@3.4.27)(vue-template-compiler@2.7.14) vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + specifier: ^5.4.1 + version: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vite-plugin-externals: specifier: ^0.6.2 - version: 0.6.2(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + version: 0.6.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + version: 3.2.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) vite-plugin-pwa: specifier: ^0.20.0 - version: 0.20.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) + version: 0.20.0(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) vite-plugin-static-copy: - specifier: ^1.0.4 - version: 1.0.5(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + specifier: ^1.0.6 + version: 1.0.6(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) vite-plugin-vue-devtools: - specifier: ^7.2.1 - version: 7.2.1(rollup@4.17.2)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + specifier: ^7.3.8 + version: 7.3.8(rollup@4.17.2)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) vitest: specifier: ^0.34.1 version: 0.34.1(@vitest/ui@0.34.1)(jsdom@20.0.3)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) @@ -386,8 +386,8 @@ importers: specifier: ^0.7.6 version: 0.7.6 vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@20.14.2)(rollup@2.79.1)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + specifier: ^4.0.3 + version: 4.0.3(@types/node@20.14.2)(rollup@2.79.1)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) packages/components: dependencies: @@ -415,7 +415,7 @@ importers: version: 7.6.3(react@18.2.0) '@storybook/addon-styling': specifier: ^1.3.7 - version: 1.3.7(@types/react@18.2.41)(less@4.2.0)(postcss@8.4.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.60.0)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)) + version: 1.3.7(@types/react@18.2.41)(less@4.2.0)(postcss@8.4.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.60.0)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)) '@storybook/blocks': specifier: ^7.6.3 version: 7.6.3(@types/react@18.2.41)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -427,7 +427,7 @@ importers: version: 7.6.3(@vue/compiler-core@3.4.27)(vue@3.4.27(typescript@5.5.4)) '@storybook/vue3-vite': specifier: ^7.6.3 - version: 7.6.3(@vue/compiler-core@3.4.27)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + version: 7.6.3(@vue/compiler-core@3.4.27)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) eslint-plugin-storybook: specifier: ^0.6.15 version: 0.6.15(eslint@8.43.0)(typescript@5.5.4) @@ -444,8 +444,8 @@ importers: specifier: ^0.14.15 version: 0.14.15(@vue/compiler-sfc@3.4.27)(vue-template-compiler@2.7.14) vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@20.14.2)(rollup@4.17.2)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + specifier: ^4.0.3 + version: 4.0.3(@types/node@20.14.2)(rollup@4.17.2)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) packages/editor: dependencies: @@ -598,8 +598,8 @@ importers: specifier: ^16.1.5 version: 16.2.1(typescript@5.5.4) vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + specifier: ^4.0.3 + version: 4.0.3(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) packages/shared: dependencies: @@ -614,8 +614,8 @@ importers: version: 4.3.2(vue@3.4.27(typescript@5.5.4)) devDependencies: vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + specifier: ^4.0.3 + version: 4.0.3(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) packages/ui-plugin-bundler-kit: dependencies: @@ -638,10 +638,6 @@ importers: packages: - '@ampproject/remapping@2.2.0': - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -658,9 +654,6 @@ packages: '@antfu/utils@0.7.6': resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} - '@antfu/utils@0.7.7': - resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} - '@apideck/better-ajv-errors@0.3.6': resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} @@ -671,10 +664,6 @@ packages: resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true - '@babel/code-frame@7.22.5': - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -683,69 +672,53 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.20.10': - resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} '@babel/compat-data@7.24.4': resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.20.12': - resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.23.5': - resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} '@babel/core@7.24.5': resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.22.5': - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.23.5': - resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} '@babel/generator@7.24.5': resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.20.7': - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-compilation-targets@7.22.15': - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.23.7': - resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 '@babel/helper-create-class-features-plugin@7.24.5': resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} @@ -753,6 +726,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.25.0': + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.22.15': resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -773,14 +752,6 @@ packages: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.5': - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.22.5': - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} @@ -789,16 +760,12 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.23.0': - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.5': resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.18.6': - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.22.15': @@ -809,18 +776,18 @@ packages: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.20.11': - resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.5': + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -829,22 +796,20 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.24.5': resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.22.20': - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + '@babel/helper-remap-async-to-generator@7.22.20': + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -855,38 +820,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.20.2': - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 '@babel/helper-simple-access@7.24.5': resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.5': - resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.5': resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.22.5': - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} @@ -895,44 +854,40 @@ packages: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.5': - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.18.6': - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.22.20': - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.20.7': - resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.5': - resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} '@babel/helpers@7.24.5': resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.22.5': - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.23.4': @@ -943,18 +898,17 @@ packages: resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.5': - resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} - '@babel/parser@7.23.9': - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} engines: {node: '>=6.0.0'} hasBin: true @@ -1138,6 +1092,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1678,6 +1638,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.23.3': resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} @@ -1780,26 +1746,22 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} - '@babel/template@7.22.5': - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.22.5': - resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.23.5': - resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} '@babel/traverse@7.24.5': resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.22.5': resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -1812,6 +1774,10 @@ packages: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1941,8 +1907,8 @@ packages: peerDependencies: react: '>=16.8.0' - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -1959,8 +1925,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1977,8 +1943,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1995,8 +1961,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2013,8 +1979,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2031,8 +1997,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2049,8 +2015,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2067,8 +2033,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2085,8 +2051,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2103,8 +2069,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2121,8 +2087,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2145,8 +2111,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -2163,8 +2129,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2181,8 +2147,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2199,8 +2165,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2217,8 +2183,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2235,8 +2201,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2253,8 +2219,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2271,8 +2237,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2289,8 +2255,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2307,8 +2273,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2325,8 +2291,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2343,8 +2309,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2614,30 +2580,14 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.1.1': - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - - '@jridgewell/gen-mapping@0.3.2': - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.0': - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} @@ -2648,17 +2598,11 @@ packages: '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.14': - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.17': - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - - '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2710,18 +2654,18 @@ packages: peerDependencies: react: '>=16' - '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + '@microsoft/api-extractor-model@7.29.4': + resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==} - '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + '@microsoft/api-extractor@7.47.4': + resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==} hasBin: true - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + '@microsoft/tsdoc-config@0.17.0': + resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@microsoft/tsdoc@0.15.0': + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} @@ -3333,27 +3277,27 @@ packages: '@rushstack/eslint-patch@1.3.2': resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} - '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + '@rushstack/node-core-library@5.5.1': + resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + '@rushstack/terminal@0.13.3': + resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + '@rushstack/ts-command-line@4.22.3': + resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} '@sideway/address@4.1.4': resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} @@ -4233,11 +4177,11 @@ packages: peerDependencies: '@uppy/core': ^3.8.0 - '@vitejs/plugin-vue-jsx@3.1.0': - resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-vue-jsx@4.0.1': + resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^4.0.0 || ^5.0.0 + vite: ^5.0.0 vue: ^3.0.0 '@vitejs/plugin-vue@4.2.3': @@ -4247,8 +4191,8 @@ packages: vite: ^4.0.0 vue: ^3.2.25 - '@vitejs/plugin-vue@5.0.4': - resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + '@vitejs/plugin-vue@5.1.2': + resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 @@ -4277,20 +4221,20 @@ packages: '@vitest/utils@0.34.6': resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} - '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + '@volar/language-core@2.4.0': + resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} '@volar/language-core@2.4.0-alpha.18': resolution: {integrity: sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==} - '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + '@volar/source-map@2.4.0': + resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} '@volar/source-map@2.4.0-alpha.18': resolution: {integrity: sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==} - '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@volar/typescript@2.4.0': + resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} '@volar/typescript@2.4.0-alpha.18': resolution: {integrity: sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==} @@ -4298,11 +4242,27 @@ packages: '@vue/babel-helper-vue-transform-on@1.1.5': resolution: {integrity: sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==} + '@vue/babel-helper-vue-transform-on@1.2.2': + resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + '@vue/babel-plugin-jsx@1.1.5': resolution: {integrity: sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==} peerDependencies: '@babel/core': ^7.0.0-0 + '@vue/babel-plugin-jsx@1.2.2': + resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.2': + resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.4.27': resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} @@ -4324,16 +4284,16 @@ packages: '@vue/devtools-api@6.6.1': resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} - '@vue/devtools-core@7.2.1': - resolution: {integrity: sha512-OyWl455UnJIVgZ6lo5WQ79WbDMoXtSRwyNKp9WzCZ0HhuQywIk4qv59KtLRe75uVmtGBde4hXNaSyRm+x9bY6g==} - - '@vue/devtools-kit@7.2.1': - resolution: {integrity: sha512-Wak/fin1X0Q8LLIfCAHBrdaaB+R6IdpSXsDByPHbQ3BmkCP0/cIo/oEGp9i0U2+gEqD4L3V9RDjNf1S34DTzQQ==} + '@vue/devtools-core@7.3.8': + resolution: {integrity: sha512-mEwsR7GMklWuPOBH/++DiJe0GWqQ0syDtWP0HhU8m9tebs5zQtujMXrgu+cgBAKquJAWnBz0PwNzBgBD2P+M9A==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-shared@7.2.1': - resolution: {integrity: sha512-PCJF4UknJmOal68+X9XHyVeQ+idv0LFujkTOIW30+GaMJqwFVN9LkQKX4gLqn61KkGMdJTzQ1bt7EJag3TI6AA==} + '@vue/devtools-kit@7.3.8': + resolution: {integrity: sha512-HYy3MQP1nZ6GbE4vrgJ/UB+MvZnhYmEwCa/UafrEpdpwa+jNCkz1ZdUrC5I7LpkH1ShREEV2/pZlAQdBj+ncLQ==} + + '@vue/devtools-shared@7.3.8': + resolution: {integrity: sha512-1NiJbn7Yp47nPDWhFZyEKpB2+5/+7JYv8IQnU0ccMrgslPR2dL7u1DIyI7mLqy4HN1ll36gQy0k8GqBYSFgZJw==} '@vue/eslint-config-prettier@7.1.0': resolution: {integrity: sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==} @@ -4352,14 +4312,6 @@ packages: typescript: optional: true - '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@vue/language-core@2.0.29': resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} peerDependencies: @@ -4595,6 +4547,22 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -4603,6 +4571,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} @@ -4863,6 +4834,9 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + birpc@0.2.17: + resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -4914,13 +4888,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5023,12 +4997,12 @@ packages: caniuse-lite@1.0.30001472: resolution: {integrity: sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg==} - caniuse-lite@1.0.30001565: - resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} - caniuse-lite@1.0.30001620: resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -5217,6 +5191,9 @@ packages: compare-versions@4.1.4: resolution: {integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -5291,6 +5268,10 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + core-js-compat@3.33.3: resolution: {integrity: sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==} @@ -5701,12 +5682,12 @@ packages: electron-to-chromium@1.4.342: resolution: {integrity: sha512-dTei3VResi5bINDENswBxhL+N0Mw5YnfWyTqO75KGsVldurEkhC9+CelJVAse8jycWyP8pv3VSj4BSyP8wTWJA==} - electron-to-chromium@1.4.595: - resolution: {integrity: sha512-+ozvXuamBhDOKvMNUQvecxfbyICmIAwS4GpLmR0bsiSBlGnLaOcs2Cj7J8XSbW+YEaN3Xl3ffgpm+srTUWFwFQ==} - electron-to-chromium@1.4.776: resolution: {integrity: sha512-s694bi3+gUzlliqxjPHpa9NRTlhzTgB34aan+pVKZmOTGy2xoZXl+8E1B8i5p5rtev3PKMK/H4asgNejC+YHNg==} + electron-to-chromium@1.5.10: + resolution: {integrity: sha512-C3RDERDjrNW262GCRvpoer3a0Ksd66CtgDLxMHhzShQ8fhL4kwnpVXsJPAKg9xJjIROXUbLBrvtOzVAjALMIWA==} + element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} @@ -5767,8 +5748,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error-stack-parser-es@0.1.1: - resolution: {integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==} + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} @@ -5963,8 +5944,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -7081,6 +7062,10 @@ packages: is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -7445,12 +7430,6 @@ packages: lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} @@ -7550,6 +7529,9 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.2: resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} engines: {node: '>=12'} @@ -7791,9 +7773,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -7815,11 +7794,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7895,12 +7869,12 @@ packages: node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -8403,6 +8377,10 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + preact@10.11.2: resolution: {integrity: sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==} @@ -8885,9 +8863,6 @@ packages: resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} engines: {node: '>=12'} - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -8919,8 +8894,8 @@ packages: rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} @@ -9458,6 +9433,10 @@ packages: engines: {node: '>=8'} hasBin: true + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -9953,14 +9932,14 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -10030,10 +10009,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.7.0: - resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} - engines: {node: '>= 0.10'} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -10052,8 +10027,8 @@ packages: engines: {node: '>=v14.18.0'} hasBin: true - vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} + vite-plugin-dts@4.0.3: + resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -10073,8 +10048,8 @@ packages: peerDependencies: vite: '>=2.0.0' - vite-plugin-inspect@0.8.4: - resolution: {integrity: sha512-G0N3rjfw+AiiwnGw50KlObIHYWfulVwaCBUBLh2xTW9G1eM9ocE5olXkEYUbwyTmX+azM8duubi+9w5awdCz+g==} + vite-plugin-inspect@0.8.5: + resolution: {integrity: sha512-JvTUqsP1JNDw0lMZ5Z/r5cSj81VK2B7884LO1DC3GMBhdcjcsAnJjdWq7bzQL01Xbh+v60d3lju3g+z7eAtNew==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -10095,20 +10070,20 @@ packages: '@vite-pwa/assets-generator': optional: true - vite-plugin-static-copy@1.0.5: - resolution: {integrity: sha512-02k0Rox+buYdEOfeilKZSgs1gXfPf9RjVztZEIYZgVIxjsVZi6AXssjzdi+qW6zYt00d3bq+tpP2voVXN2fKLw==} + vite-plugin-static-copy@1.0.6: + resolution: {integrity: sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 - vite-plugin-vue-devtools@7.2.1: - resolution: {integrity: sha512-4k7QNZz0nSojoePQoxnE5fIzi8RU1QJHc0TEg4golv2phZxhBGfjScZD2B8X6bcrRbUQ9CaRKN0dzBs1xtzzNg==} + vite-plugin-vue-devtools@7.3.8: + resolution: {integrity: sha512-b5t4wxCb5g5cjh+odNpgnB7iX7gA6FJnKugFqX2/YZX9I4fvMjlj1bUnCKnvPlmwnFxClYgdmgZcCh2RyhZgvw==} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 - vite-plugin-vue-inspector@5.1.0: - resolution: {integrity: sha512-yIw9dvBz9nQW7DPfbJtUVW6JTnt67hqTPRnTwT2CZWMqDvISyQHRjgKl32nlMh1DRH+92533Sv6t59pWMLUCWA==} + vite-plugin-vue-inspector@5.1.3: + resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 @@ -10137,8 +10112,8 @@ packages: terser: optional: true - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -10146,6 +10121,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -10158,6 +10134,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -10284,12 +10262,6 @@ packages: vue-template-compiler@2.7.14: resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} - vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - vue-tsc@2.0.29: resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} hasBin: true @@ -10618,18 +10590,8 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - z-schema@5.0.4: - resolution: {integrity: sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==} - engines: {node: '>=8.0.0'} - hasBin: true - snapshots: - '@ampproject/remapping@2.2.0': - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -10648,8 +10610,6 @@ snapshots: '@antfu/utils@0.7.6': {} - '@antfu/utils@0.7.7': {} - '@apideck/better-ajv-errors@0.3.6(ajv@8.13.0)': dependencies: ajv: 8.13.0 @@ -10661,65 +10621,25 @@ snapshots: dependencies: default-browser-id: 3.0.0 - '@babel/code-frame@7.22.5': - dependencies: - '@babel/highlight': 7.22.5 - '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 + optional: true '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.5 picocolors: 1.0.1 - '@babel/compat-data@7.20.10': {} - - '@babel/compat-data@7.23.5': {} + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 '@babel/compat-data@7.24.4': {} - '@babel/core@7.20.12': - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) - '@babel/helper-module-transforms': 7.20.11 - '@babel/helpers': 7.20.7 - '@babel/parser': 7.24.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.8.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.23.5': - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helpers': 7.23.5 - '@babel/parser': 7.23.9 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/compat-data@7.25.2': {} '@babel/core@7.24.5': dependencies: @@ -10734,26 +10654,32 @@ snapshots: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.22.5': + '@babel/core@7.25.2': dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - - '@babel/generator@7.23.5': - dependencies: - '@babel/types': 7.23.5 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color '@babel/generator@7.24.5': dependencies: @@ -10762,30 +10688,24 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/generator@7.25.0': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12)': + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.12 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.25.2 - '@babel/helper-compilation-targets@7.22.15': + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.24.5 '@babel/helper-compilation-targets@7.23.6': dependencies: @@ -10795,30 +10715,12 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.5)': - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.24.5)': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': @@ -10834,12 +10736,18 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.5)': + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.3 semver: 6.3.1 + transitivePeerDependencies: + - supports-color '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': dependencies: @@ -10848,23 +10756,30 @@ snapshots: regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.5)': + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -10872,13 +10787,6 @@ snapshots: '@babel/helper-environment-visitor@7.22.20': {} - '@babel/helper-environment-visitor@7.22.5': {} - - '@babel/helper-function-name@7.22.5': - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 @@ -10888,48 +10796,32 @@ snapshots: dependencies: '@babel/types': 7.24.5 - '@babel/helper-member-expression-to-functions@7.23.0': - dependencies: - '@babel/types': 7.24.5 - '@babel/helper-member-expression-to-functions@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-module-imports@7.18.6': + '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.24.5 '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.5 - '@babel/helper-module-transforms@7.20.11': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.24.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5)': - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -10939,20 +10831,27 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.22.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-plugin-utils@7.22.5': {} + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.2 '@babel/helper-plugin-utils@7.24.5': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.5)': - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/helper-plugin-utils@7.24.8': {} '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': dependencies: @@ -10961,19 +10860,12 @@ snapshots: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-replace-supers@7.22.20(@babel/core@7.23.5)': + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - - '@babel/helper-replace-supers@7.22.20(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-wrap-function': 7.22.20 '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': dependencies: @@ -10982,72 +10874,63 @@ snapshots: '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-simple-access@7.20.2': + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color '@babel/helper-simple-access@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.22.5': + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color '@babel/helper-split-export-declaration@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/helper-string-parser@7.22.5': {} - '@babel/helper-string-parser@7.23.4': {} '@babel/helper-string-parser@7.24.1': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-validator-identifier@7.22.5': {} + '@babel/helper-validator-identifier@7.22.20': {} '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-option@7.18.6': {} + '@babel/helper-validator-identifier@7.24.7': {} '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.24.0 '@babel/types': 7.24.5 - '@babel/helpers@7.20.7': - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.23.5': - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - transitivePeerDependencies: - - supports-color - '@babel/helpers@7.24.5': dependencies: '@babel/template': 7.24.0 @@ -11056,17 +10939,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/highlight@7.22.5': + '@babel/helpers@7.25.0': dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 '@babel/highlight@7.23.4': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 chalk: 2.4.2 js-tokens: 4.0.0 + optional: true '@babel/highlight@7.24.5': dependencies: @@ -11075,60 +10958,65 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.23.5': + '@babel/highlight@7.24.7': dependencies: - '@babel/types': 7.23.5 - - '@babel/parser@7.23.9': - dependencies: - '@babel/types': 7.23.5 + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 '@babel/parser@7.24.5': dependencies: '@babel/types': 7.24.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': + '@babel/parser@7.25.3': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/types': 7.25.2 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -11136,97 +11024,97 @@ snapshots: '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.5)': - dependencies: - '@babel/core': 7.23.5 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.5)': + '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': @@ -11234,147 +11122,144 @@ snapshots: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.5)': + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.5)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.5)': + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 @@ -11382,281 +11267,295 @@ snapshots: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.5)': + '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-classes@7.23.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-classes@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-split-export-declaration': 7.24.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/template': 7.24.0 - '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-for-of@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-literals@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-simple-access': 7.24.5 - '@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-hoist-variables': 7.22.5 @@ -11664,150 +11563,160 @@ snapshots: '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 - '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.5)': + '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.24.5)': dependencies: + '@babel/compat-data': 7.24.4 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.5)': + '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 @@ -11815,257 +11724,185 @@ snapshots: '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-spread@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-typescript@7.23.5(@babel/core@7.23.5)': + '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-transform-typescript@7.23.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.5)': + '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - '@babel/preset-env@7.23.5(@babel/core@7.23.5)': + '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.5) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.5) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.5) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.5) - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.5) - babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.5) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.5) - core-js-compat: 3.33.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/preset-env@7.24.5(@babel/core@7.24.5)': + '@babel/preset-env@7.23.5(@babel/core@7.24.5)': dependencies: '@babel/compat-data': 7.24.4 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.24.5) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.24.5) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) @@ -12077,96 +11914,183 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.24.5) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.24.5) '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.24.5) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.24.5) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.24.5) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.24.5) + core-js-compat: 3.33.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-env@7.24.5(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) core-js-compat: 3.37.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.23.3(@babel/core@7.23.5)': + '@babel/preset-flow@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.5) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/types': 7.24.5 esutils: 2.0.3 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.5 '@babel/types': 7.24.5 esutils: 2.0.3 - '@babel/preset-typescript@7.23.3(@babel/core@7.23.5)': + '@babel/preset-typescript@7.23.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.24.5) - '@babel/register@7.22.15(@babel/core@7.23.5)': + '@babel/register@7.22.15(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.24.5 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -12187,13 +12111,7 @@ snapshots: '@babel/template@7.22.15': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - - '@babel/template@7.22.5': - dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 @@ -12203,35 +12121,11 @@ snapshots: '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - '@babel/traverse@7.22.5': + '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.23.5': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.5 - '@babel/types': 7.23.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@babel/traverse@7.24.5': dependencies: @@ -12243,15 +12137,27 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.22.5': dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 '@babel/types@7.23.5': @@ -12266,6 +12172,12 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@changesets/apply-release-plan@6.1.2': @@ -12546,7 +12458,7 @@ snapshots: dependencies: react: 18.2.0 - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.17.19': @@ -12555,7 +12467,7 @@ snapshots: '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.17.19': @@ -12564,7 +12476,7 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.17.19': @@ -12573,7 +12485,7 @@ snapshots: '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.17.19': @@ -12582,7 +12494,7 @@ snapshots: '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.17.19': @@ -12591,7 +12503,7 @@ snapshots: '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.17.19': @@ -12600,7 +12512,7 @@ snapshots: '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.17.19': @@ -12609,7 +12521,7 @@ snapshots: '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.17.19': @@ -12618,7 +12530,7 @@ snapshots: '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.17.19': @@ -12627,7 +12539,7 @@ snapshots: '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.17.19': @@ -12636,7 +12548,7 @@ snapshots: '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.14.54': @@ -12648,7 +12560,7 @@ snapshots: '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.17.19': @@ -12657,7 +12569,7 @@ snapshots: '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.17.19': @@ -12666,7 +12578,7 @@ snapshots: '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.17.19': @@ -12675,7 +12587,7 @@ snapshots: '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.17.19': @@ -12684,7 +12596,7 @@ snapshots: '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.17.19': @@ -12693,7 +12605,7 @@ snapshots: '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.17.19': @@ -12702,7 +12614,7 @@ snapshots: '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.17.19': @@ -12711,7 +12623,7 @@ snapshots: '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.17.19': @@ -12720,7 +12632,7 @@ snapshots: '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.17.19': @@ -12729,7 +12641,7 @@ snapshots: '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.17.19': @@ -12738,7 +12650,7 @@ snapshots: '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.17.19': @@ -12747,7 +12659,7 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.21.5': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.43.0)': @@ -12760,7 +12672,7 @@ snapshots: '@eslint/eslintrc@2.0.3': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) espree: 9.5.2 globals: 13.20.0 ignore: 5.2.0 @@ -12868,7 +12780,7 @@ snapshots: '@humanwhocodes/config-array@0.11.10': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12900,7 +12812,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.6 '@iconify/types': 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 0.4.3 transitivePeerDependencies: @@ -12911,7 +12823,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 0.5.0 mlly: 1.7.1 @@ -13093,9 +13005,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.24.5 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -13128,29 +13040,14 @@ snapshots: '@types/yargs': 17.0.32 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.1.1': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/gen-mapping@0.3.2': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.17 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.0': {} - '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} - '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.5': @@ -13163,19 +13060,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.14': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.17': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - - '@jridgewell/trace-mapping@0.3.20': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: @@ -13250,31 +13137,31 @@ snapshots: '@types/react': 18.2.41 react: 18.2.0 - '@microsoft/api-extractor-model@7.28.13(@types/node@18.13.0)': + '@microsoft/api-extractor-model@7.29.4(@types/node@18.13.0)': dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.13.0) + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1(@types/node@18.13.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.28.13(@types/node@20.14.2)': + '@microsoft/api-extractor-model@7.29.4(@types/node@20.14.2)': dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.2) + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1(@types/node@20.14.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@18.13.0)': + '@microsoft/api-extractor@7.47.4(@types/node@18.13.0)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@18.13.0) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.13.0) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@18.13.0) - '@rushstack/ts-command-line': 4.19.1(@types/node@18.13.0) + '@microsoft/api-extractor-model': 7.29.4(@types/node@18.13.0) + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1(@types/node@18.13.0) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.13.3(@types/node@18.13.0) + '@rushstack/ts-command-line': 4.22.3(@types/node@18.13.0) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -13284,15 +13171,15 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.14.2)': + '@microsoft/api-extractor@7.47.4(@types/node@20.14.2)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.14.2) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.2) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.14.2) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.14.2) + '@microsoft/api-extractor-model': 7.29.4(@types/node@20.14.2) + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1(@types/node@20.14.2) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.13.3(@types/node@20.14.2) + '@rushstack/ts-command-line': 4.22.3(@types/node@20.14.2) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -13302,14 +13189,14 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/tsdoc-config@0.16.2': + '@microsoft/tsdoc-config@0.17.0': dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 + '@microsoft/tsdoc': 0.15.0 + ajv: 8.12.0 jju: 1.4.0 - resolve: 1.19.0 + resolve: 1.22.8 - '@microsoft/tsdoc@0.14.2': {} + '@microsoft/tsdoc@0.15.0': {} '@ndelangen/get-tarball@3.0.9': dependencies: @@ -13801,14 +13688,16 @@ snapshots: rollup: 2.79.1 slash: 3.0.0 - '@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 optionalDependencies: '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color '@rollup/plugin-commonjs@22.0.2(rollup@2.79.1)': dependencies: @@ -13936,59 +13825,63 @@ snapshots: '@rushstack/eslint-patch@1.3.2': {} - '@rushstack/node-core-library@4.0.2(@types/node@18.13.0)': + '@rushstack/node-core-library@5.5.1(@types/node@18.13.0)': dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.8 semver: 7.5.4 - z-schema: 5.0.4 optionalDependencies: '@types/node': 18.13.0 - '@rushstack/node-core-library@4.0.2(@types/node@20.14.2)': + '@rushstack/node-core-library@5.5.1(@types/node@20.14.2)': dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.8 semver: 7.5.4 - z-schema: 5.0.4 optionalDependencies: '@types/node': 20.14.2 - '@rushstack/rig-package@0.5.2': + '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@18.13.0)': + '@rushstack/terminal@0.13.3(@types/node@18.13.0)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@18.13.0) + '@rushstack/node-core-library': 5.5.1(@types/node@18.13.0) supports-color: 8.1.1 optionalDependencies: '@types/node': 18.13.0 - '@rushstack/terminal@0.10.0(@types/node@20.14.2)': + '@rushstack/terminal@0.13.3(@types/node@20.14.2)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.2) + '@rushstack/node-core-library': 5.5.1(@types/node@20.14.2) supports-color: 8.1.1 optionalDependencies: '@types/node': 20.14.2 - '@rushstack/ts-command-line@4.19.1(@types/node@18.13.0)': + '@rushstack/ts-command-line@4.22.3(@types/node@18.13.0)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@18.13.0) + '@rushstack/terminal': 0.13.3(@types/node@18.13.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.1 transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.19.1(@types/node@20.14.2)': + '@rushstack/ts-command-line@4.22.3(@types/node@20.14.2)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.14.2) + '@rushstack/terminal': 0.13.3(@types/node@20.14.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.1 @@ -14118,7 +14011,7 @@ snapshots: '@storybook/global': 5.0.0 ts-dedent: 2.2.0 - '@storybook/addon-styling@1.3.7(@types/react@18.2.41)(less@4.2.0)(postcss@8.4.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.60.0)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20))': + '@storybook/addon-styling@1.3.7(@types/react@18.2.41)(less@4.2.0)(postcss@8.4.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.60.0)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20))': dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.5 @@ -14133,14 +14026,14 @@ snapshots: '@storybook/types': 7.6.3 css-loader: 6.8.1(webpack@5.89.0(esbuild@0.18.20)) less-loader: 11.1.3(less@4.2.0)(webpack@5.89.0(esbuild@0.18.20)) - postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)) + postcss-loader: 7.3.3(postcss@8.4.38)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)) prettier: 2.8.8 resolve-url-loader: 5.0.0 sass-loader: 13.3.2(sass@1.60.0)(webpack@5.89.0(esbuild@0.18.20)) style-loader: 3.3.3(webpack@5.89.0(esbuild@0.18.20)) optionalDependencies: less: 4.2.0 - postcss: 8.4.31 + postcss: 8.4.38 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.89.0(esbuild@0.18.20) @@ -14224,7 +14117,7 @@ snapshots: - encoding - supports-color - '@storybook/builder-vite@7.6.3(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))': + '@storybook/builder-vite@7.6.3(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))': dependencies: '@storybook/channels': 7.6.3 '@storybook/client-logger': 7.6.3 @@ -14242,7 +14135,7 @@ snapshots: fs-extra: 11.2.0 magic-string: 0.30.2 rollup: 3.28.0 - vite: 5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -14260,9 +14153,9 @@ snapshots: '@storybook/cli@7.6.3': dependencies: - '@babel/core': 7.23.5 - '@babel/preset-env': 7.23.5(@babel/core@7.23.5) - '@babel/types': 7.23.5 + '@babel/core': 7.24.5 + '@babel/preset-env': 7.23.5(@babel/core@7.24.5) + '@babel/types': 7.24.5 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.6.3 '@storybook/core-common': 7.6.3 @@ -14288,7 +14181,7 @@ snapshots: get-port: 5.1.1 giget: 1.1.3 globby: 11.1.0 - jscodeshift: 0.15.1(@babel/preset-env@7.23.5(@babel/core@7.23.5)) + jscodeshift: 0.15.1(@babel/preset-env@7.23.5(@babel/core@7.24.5)) leven: 3.1.0 ora: 5.4.1 prettier: 2.8.8 @@ -14313,9 +14206,9 @@ snapshots: '@storybook/codemod@7.6.3': dependencies: - '@babel/core': 7.23.5 - '@babel/preset-env': 7.23.5(@babel/core@7.23.5) - '@babel/types': 7.23.5 + '@babel/core': 7.24.5 + '@babel/preset-env': 7.23.5(@babel/core@7.24.5) + '@babel/types': 7.24.5 '@storybook/csf': 0.1.2 '@storybook/csf-tools': 7.6.3 '@storybook/node-logger': 7.6.3 @@ -14323,7 +14216,7 @@ snapshots: '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.3 globby: 11.1.0 - jscodeshift: 0.15.1(@babel/preset-env@7.23.5(@babel/core@7.23.5)) + jscodeshift: 0.15.1(@babel/preset-env@7.23.5(@babel/core@7.24.5)) lodash: 4.17.21 prettier: 2.8.8 recast: 0.23.4 @@ -14444,10 +14337,10 @@ snapshots: '@storybook/csf-tools@7.6.3': dependencies: - '@babel/generator': 7.23.5 + '@babel/generator': 7.24.5 '@babel/parser': 7.24.5 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 '@storybook/csf': 0.1.2 '@storybook/types': 7.6.3 fs-extra: 11.2.0 @@ -14588,14 +14481,14 @@ snapshots: '@types/express': 4.17.21 file-system-cache: 2.3.0 - '@storybook/vue3-vite@7.6.3(@vue/compiler-core@3.4.27)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': + '@storybook/vue3-vite@7.6.3(@vue/compiler-core@3.4.27)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': dependencies: - '@storybook/builder-vite': 7.6.3(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + '@storybook/builder-vite': 7.6.3(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) '@storybook/core-server': 7.6.3 '@storybook/vue3': 7.6.3(@vue/compiler-core@3.4.27)(vue@3.4.27(typescript@5.5.4)) - '@vitejs/plugin-vue': 4.2.3(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + '@vitejs/plugin-vue': 4.2.3(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) magic-string: 0.30.2 - vite: 5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vue-docgen-api: 4.75.1(vue@3.4.27(typescript@5.5.4)) transitivePeerDependencies: - '@preact/preset-vite' @@ -14665,7 +14558,7 @@ snapshots: '@testing-library/dom@8.20.1': dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.24.2 '@babel/runtime': 7.19.0 '@types/aria-query': 5.0.4 aria-query: 5.1.3 @@ -14893,7 +14786,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 - '@babel/types': 7.23.5 + '@babel/types': 7.24.5 '@types/babel__generator': 7.6.7 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.4 @@ -15130,7 +15023,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.59.6 '@typescript-eslint/type-utils': 5.59.6(eslint@8.43.0)(typescript@5.5.4) '@typescript-eslint/utils': 5.59.6(eslint@8.43.0)(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.43.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 @@ -15147,7 +15040,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.59.6 '@typescript-eslint/types': 5.59.6 '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.43.0 optionalDependencies: typescript: 5.5.4 @@ -15163,7 +15056,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) '@typescript-eslint/utils': 5.59.6(eslint@8.43.0)(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.43.0 tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: @@ -15177,7 +15070,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.59.6 '@typescript-eslint/visitor-keys': 5.59.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -15325,24 +15218,24 @@ snapshots: '@uppy/utils': 5.9.0 nanoid: 4.0.0 - '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': + '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': dependencies: - '@babel/core': 7.23.5 - '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) - '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.5) - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + '@babel/core': 7.25.2 + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vue: 3.4.27(typescript@5.5.4) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@4.2.3(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': + '@vitejs/plugin-vue@4.2.3(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': dependencies: - vite: 5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vue: 3.4.27(typescript@5.5.4) - '@vitejs/plugin-vue@5.0.4(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': + '@vitejs/plugin-vue@5.1.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': dependencies: - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vue: 3.4.27(typescript@5.5.4) '@vitest/expect@0.34.1': @@ -15390,24 +15283,23 @@ snapshots: loupe: 2.3.6 pretty-format: 29.6.2 - '@volar/language-core@1.11.1': + '@volar/language-core@2.4.0': dependencies: - '@volar/source-map': 1.11.1 + '@volar/source-map': 2.4.0 '@volar/language-core@2.4.0-alpha.18': dependencies: '@volar/source-map': 2.4.0-alpha.18 - '@volar/source-map@1.11.1': - dependencies: - muggle-string: 0.3.1 + '@volar/source-map@2.4.0': {} '@volar/source-map@2.4.0-alpha.18': {} - '@volar/typescript@1.11.1': + '@volar/typescript@2.4.0': dependencies: - '@volar/language-core': 1.11.1 + '@volar/language-core': 2.4.0 path-browserify: 1.0.1 + vscode-uri: 3.0.8 '@volar/typescript@2.4.0-alpha.18': dependencies: @@ -15417,14 +15309,16 @@ snapshots: '@vue/babel-helper-vue-transform-on@1.1.5': {} - '@vue/babel-plugin-jsx@1.1.5(@babel/core@7.23.5)': + '@vue/babel-helper-vue-transform-on@1.2.2': {} + + '@vue/babel-plugin-jsx@1.1.5(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.23.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 '@vue/babel-helper-vue-transform-on': 1.1.5 camelcase: 6.3.0 html-tags: 3.3.1 @@ -15432,21 +15326,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/babel-plugin-jsx@1.1.5(@babel/core@7.24.5)': + '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5) - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - '@vue/babel-helper-vue-transform-on': 1.1.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.25.2) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + '@vue/babel-helper-vue-transform-on': 1.2.2 + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.25.2) camelcase: 6.3.0 html-tags: 3.3.1 svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.25.2 transitivePeerDependencies: - supports-color + '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.25.2)': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/parser': 7.24.5 + '@vue/compiler-sfc': 3.4.27 + '@vue/compiler-core@3.4.27': dependencies: '@babel/parser': 7.24.5 @@ -15486,30 +15392,31 @@ snapshots: '@vue/devtools-api@6.6.1': {} - '@vue/devtools-core@7.2.1(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': + '@vue/devtools-core@7.3.8(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4))': dependencies: - '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.4)) - '@vue/devtools-shared': 7.2.1 + '@vue/devtools-kit': 7.3.8 + '@vue/devtools-shared': 7.3.8 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + vite-hot-client: 0.2.3(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + vue: 3.4.27(typescript@5.5.4) transitivePeerDependencies: - vite - - vue - '@vue/devtools-kit@7.2.1(vue@3.4.27(typescript@5.5.4))': + '@vue/devtools-kit@7.3.8': dependencies: - '@vue/devtools-shared': 7.2.1 + '@vue/devtools-shared': 7.3.8 + birpc: 0.2.17 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.27(typescript@5.5.4) + superjson: 2.2.1 - '@vue/devtools-shared@7.2.1': + '@vue/devtools-shared@7.3.8': dependencies: - rfdc: 1.3.1 + rfdc: 1.4.1 '@vue/eslint-config-prettier@7.1.0(eslint@8.43.0)(prettier@2.8.8)': dependencies: @@ -15530,20 +15437,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/language-core@1.8.27(typescript@5.5.4)': - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - vue-template-compiler: 2.7.14 - optionalDependencies: - typescript: 5.5.4 - '@vue/language-core@2.0.29(typescript@5.5.4)': dependencies: '@volar/language-core': 2.4.0-alpha.18 @@ -15747,9 +15640,9 @@ snapshots: acorn: 8.8.2 acorn-walk: 8.2.0 - acorn-import-assertions@1.9.0(acorn@8.11.3): + acorn-import-assertions@1.9.0(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 acorn-jsx@5.3.2(acorn@8.8.2): dependencies: @@ -15780,13 +15673,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.0: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15795,6 +15688,14 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -15806,6 +15707,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ajv@8.13.0: dependencies: fast-deep-equal: 3.1.3 @@ -15992,13 +15900,13 @@ snapshots: transitivePeerDependencies: - debug - babel-core@7.0.0-bridge.0(@babel/core@7.23.5): + babel-core@7.0.0-bridge.0(@babel/core@7.24.5): dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.24.5 babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -16006,51 +15914,51 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.5): + babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.24.5): dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.5 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.24.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) core-js-compat: 3.37.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.5): + babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.24.5): dependencies: - '@babel/core': 7.23.5 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.24.5) core-js-compat: 3.33.3 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.5): + babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.24.5): dependencies: - '@babel/core': 7.23.5 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.5) + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.24.5) transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -16086,6 +15994,8 @@ snapshots: binary-extensions@2.2.0: {} + birpc@0.2.17: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -16166,13 +16076,6 @@ snapshots: node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) - browserslist@4.22.1: - dependencies: - caniuse-lite: 1.0.30001565 - electron-to-chromium: 1.4.595 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001620 @@ -16180,6 +16083,13 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.10 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -16287,10 +16197,10 @@ snapshots: caniuse-lite@1.0.30001472: {} - caniuse-lite@1.0.30001565: {} - caniuse-lite@1.0.30001620: {} + caniuse-lite@1.0.30001651: {} + caseless@0.12.0: {} chai@4.3.7: @@ -16338,7 +16248,7 @@ snapshots: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 chokidar@3.6.0: dependencies: @@ -16482,6 +16392,8 @@ snapshots: compare-versions@4.1.4: {} + compare-versions@6.1.1: {} + compressible@2.0.18: dependencies: mime-db: 1.52.0 @@ -16570,13 +16482,17 @@ snapshots: dependencies: is-what: 3.14.1 + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + core-js-compat@3.33.3: dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 core-js-compat@3.37.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 core-util-is@1.0.2: {} @@ -16625,12 +16541,12 @@ snapshots: css-loader@6.8.1(webpack@5.89.0(esbuild@0.18.20)): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.38) + postcss-modules-scope: 3.0.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.5.4 webpack: 5.89.0(esbuild@0.18.20) @@ -16773,9 +16689,11 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.6: + debug@4.3.6(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 decamelize-keys@1.1.0: dependencies: @@ -16912,7 +16830,7 @@ snapshots: detect-port@1.5.1: dependencies: address: 1.2.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17016,10 +16934,10 @@ snapshots: electron-to-chromium@1.4.342: {} - electron-to-chromium@1.4.595: {} - electron-to-chromium@1.4.776: {} + electron-to-chromium@1.5.10: {} + element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 @@ -17068,7 +16986,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - error-stack-parser-es@0.1.1: {} + error-stack-parser-es@0.1.5: {} es-abstract@1.22.3: dependencies: @@ -17265,7 +17183,7 @@ snapshots: esbuild-register@3.5.0(esbuild@0.18.20): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) esbuild: 0.18.20 transitivePeerDependencies: - supports-color @@ -17356,31 +17274,31 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.20.2: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 escalade@3.1.1: {} @@ -17677,7 +17595,7 @@ snapshots: extract-zip@2.0.1(supports-color@8.1.1): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -17888,13 +17806,13 @@ snapshots: fs-extra@11.2.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 fs-extra@7.0.1: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 @@ -17907,7 +17825,7 @@ snapshots: fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 @@ -17998,7 +17916,7 @@ snapshots: dependencies: basic-ftp: 5.0.3 data-uri-to-buffer: 6.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -18103,7 +18021,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -18111,7 +18029,7 @@ snapshots: globby@13.2.2: dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 ignore: 5.3.0 merge2: 1.4.1 slash: 4.0.0 @@ -18262,14 +18180,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18287,28 +18205,28 @@ snapshots: https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18332,9 +18250,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.4.31): + icss-utils@5.1.0(postcss@8.4.38): dependencies: - postcss: 8.4.31 + postcss: 8.4.38 idb@7.1.1: {} @@ -18577,7 +18495,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.0 + '@types/estree': 1.0.5 is-regex@1.1.4: dependencies: @@ -18645,6 +18563,8 @@ snapshots: is-what@3.14.1: {} + is-what@4.1.16: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -18741,7 +18661,7 @@ snapshots: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 jest-mock@27.5.1: dependencies: @@ -18814,19 +18734,19 @@ snapshots: jsbn@0.1.1: {} - jscodeshift@0.15.1(@babel/preset-env@7.23.5(@babel/core@7.23.5)): + jscodeshift@0.15.1(@babel/preset-env@7.23.5(@babel/core@7.24.5)): dependencies: - '@babel/core': 7.23.5 + '@babel/core': 7.24.5 '@babel/parser': 7.24.5 - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.5) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.5) - '@babel/preset-flow': 7.23.3(@babel/core@7.23.5) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) - '@babel/register': 7.22.15(@babel/core@7.23.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.5) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.5) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.24.5) + '@babel/preset-flow': 7.23.3(@babel/core@7.24.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.24.5) + '@babel/register': 7.22.15(@babel/core@7.24.5) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) chalk: 4.1.2 flow-parser: 0.223.2 graceful-fs: 4.2.11 @@ -18837,7 +18757,7 @@ snapshots: temp: 0.8.4 write-file-atomic: 2.4.3 optionalDependencies: - '@babel/preset-env': 7.23.5(@babel/core@7.23.5) + '@babel/preset-env': 7.23.5(@babel/core@7.24.5) transitivePeerDependencies: - supports-color @@ -18909,13 +18829,13 @@ snapshots: jsonfile@4.0.0: optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonpointer@5.0.1: {} @@ -19045,14 +18965,14 @@ snapshots: load-json-file@4.0.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 load-yaml-file@0.2.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 @@ -19093,10 +19013,6 @@ snapshots: lodash.escaperegexp@4.1.2: {} - lodash.get@4.4.2: {} - - lodash.isequal@4.5.0: {} - lodash.isplainobject@4.0.6: {} lodash.isstring@4.0.1: {} @@ -19191,6 +19107,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.2: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -19413,8 +19333,6 @@ snapshots: ms@2.1.3: {} - muggle-string@0.3.1: {} - muggle-string@0.4.1: {} mute-stream@0.0.8: {} @@ -19431,8 +19349,6 @@ snapshots: nanoid@3.3.4: {} - nanoid@3.3.6: {} - nanoid@3.3.7: {} nanoid@4.0.0: {} @@ -19491,10 +19407,10 @@ snapshots: node-releases@2.0.10: {} - node-releases@2.0.13: {} - node-releases@2.0.14: {} + node-releases@2.0.18: {} + nopt@6.0.0: dependencies: abbrev: 1.1.1 @@ -19722,7 +19638,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) get-uri: 6.0.2 http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 @@ -19930,36 +19846,36 @@ snapshots: optionalDependencies: postcss: 8.4.21 - postcss-loader@7.3.3(postcss@8.4.31)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)): + postcss-loader@7.3.3(postcss@8.4.38)(typescript@5.5.4)(webpack@5.89.0(esbuild@0.18.20)): dependencies: cosmiconfig: 8.3.6(typescript@5.5.4) jiti: 1.18.2 - postcss: 8.4.31 + postcss: 8.4.38 semver: 7.5.4 webpack: 5.89.0(esbuild@0.18.20) transitivePeerDependencies: - typescript - postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + postcss-modules-extract-imports@3.0.0(postcss@8.4.38): dependencies: - postcss: 8.4.31 + postcss: 8.4.38 - postcss-modules-local-by-default@4.0.3(postcss@8.4.31): + postcss-modules-local-by-default@4.0.3(postcss@8.4.38): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.0.0(postcss@8.4.31): + postcss-modules-scope@3.0.0(postcss@8.4.38): dependencies: - postcss: 8.4.31 + postcss: 8.4.38 postcss-selector-parser: 6.0.13 - postcss-modules-values@4.0.0(postcss@8.4.31): + postcss-modules-values@4.0.0(postcss@8.4.38): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-nested@6.0.0(postcss@8.4.21): dependencies: @@ -19995,9 +19911,9 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 postcss@8.4.38: dependencies: @@ -20005,6 +19921,12 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + preact@10.11.2: {} preferred-pm@3.0.3: @@ -20186,7 +20108,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 lru-cache: 7.18.3 @@ -20307,7 +20229,7 @@ snapshots: puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -20618,14 +20540,9 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.8.0 loader-utils: 2.0.4 - postcss: 8.4.31 + postcss: 8.4.38 source-map: 0.6.1 - resolve@1.19.0: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - resolve@1.22.1: dependencies: is-core-module: 2.10.0 @@ -20658,7 +20575,7 @@ snapshots: rfdc@1.3.0: {} - rfdc@1.3.1: {} + rfdc@1.4.1: {} rimraf@2.6.3: dependencies: @@ -20702,7 +20619,7 @@ snapshots: rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 @@ -20714,7 +20631,7 @@ snapshots: rollup@3.28.0: optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 rollup@4.17.2: dependencies: @@ -21020,7 +20937,7 @@ snapshots: socks-proxy-agent@8.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -21275,6 +21192,10 @@ snapshots: pirates: 4.0.5 ts-interface-checker: 0.1.13 + superjson@2.2.1: + dependencies: + copy-anything: 3.0.5 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -21408,7 +21329,7 @@ snapshots: terser@5.31.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -21760,7 +21681,7 @@ snapshots: '@antfu/install-pkg': 0.3.3 '@antfu/utils': 0.7.10 '@iconify/utils': 2.1.30 - debug: 4.3.6 + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 0.5.0 unplugin: 1.12.1 @@ -21780,7 +21701,7 @@ snapshots: unplugin@1.5.1: dependencies: acorn: 8.11.2 - chokidar: 3.5.3 + chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.1 @@ -21788,7 +21709,7 @@ snapshots: untyped@0.4.7: dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.24.5 '@babel/standalone': 7.20.15 '@babel/types': 7.22.5 scule: 0.3.2 @@ -21800,18 +21721,18 @@ snapshots: update-browserslist-db@1.0.10(browserslist@4.21.5): dependencies: browserslist: 4.21.5 - escalade: 3.1.1 + escalade: 3.1.2 picocolors: 1.0.1 - update-browserslist-db@1.0.13(browserslist@4.22.1): + update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 + browserslist: 4.23.0 + escalade: 3.1.2 picocolors: 1.0.1 - update-browserslist-db@1.0.16(browserslist@4.23.0): + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 escalade: 3.1.2 picocolors: 1.0.1 @@ -21882,7 +21803,7 @@ snapshots: v8-to-istanbul@9.0.1: dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.8.0 @@ -21891,8 +21812,6 @@ snapshots: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 - validator@13.7.0: {} - vary@1.1.2: {} verror@1.10.0: @@ -21901,17 +21820,17 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite-hot-client@0.2.3(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-hot-client@0.2.3(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) vite-node@0.34.1(@types/node@18.19.34)(less@4.2.0)(sass@1.60.0)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) mlly: 1.4.0 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 vite: 4.2.3(@types/node@18.19.34)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' @@ -21922,66 +21841,75 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-dts@4.0.3(@types/node@18.13.0)(rollup@4.17.2)(typescript@5.5.4)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.13.0) + '@microsoft/api-extractor': 7.47.4(@types/node@18.13.0) '@rollup/pluginutils': 5.1.0(rollup@4.17.2) - '@vue/language-core': 1.8.27(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + '@volar/typescript': 2.4.0 + '@vue/language-core': 2.0.29(typescript@5.5.4) + compare-versions: 6.1.1 + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 - magic-string: 0.30.10 + local-pkg: 0.5.0 + magic-string: 0.30.11 typescript: 5.5.4 - vue-tsc: 1.8.27(typescript@5.5.4) + vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@20.14.2)(rollup@2.79.1)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-dts@4.0.3(@types/node@20.14.2)(rollup@2.79.1)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.14.2) + '@microsoft/api-extractor': 7.47.4(@types/node@20.14.2) '@rollup/pluginutils': 5.1.0(rollup@2.79.1) - '@vue/language-core': 1.8.27(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + '@volar/typescript': 2.4.0 + '@vue/language-core': 2.0.29(typescript@5.5.4) + compare-versions: 6.1.1 + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 - magic-string: 0.30.10 + local-pkg: 0.5.0 + magic-string: 0.30.11 typescript: 5.5.4 - vue-tsc: 1.8.27(typescript@5.5.4) + vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: - vite: 5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@20.14.2)(rollup@4.17.2)(typescript@5.5.4)(vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-dts@4.0.3(@types/node@20.14.2)(rollup@4.17.2)(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.14.2) + '@microsoft/api-extractor': 7.47.4(@types/node@20.14.2) '@rollup/pluginutils': 5.1.0(rollup@4.17.2) - '@vue/language-core': 1.8.27(typescript@5.5.4) - debug: 4.3.4(supports-color@8.1.1) + '@volar/typescript': 2.4.0 + '@vue/language-core': 2.0.29(typescript@5.5.4) + compare-versions: 6.1.1 + debug: 4.3.6(supports-color@8.1.1) kolorist: 1.8.0 - magic-string: 0.30.10 + local-pkg: 0.5.0 + magic-string: 0.30.11 typescript: 5.5.4 - vue-tsc: 1.8.27(typescript@5.5.4) + vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: - vite: 5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externals@0.6.2(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-externals@0.6.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: acorn: 8.8.2 es-module-lexer: 0.4.1 fs-extra: 10.1.0 magic-string: 0.25.9 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) - vite-plugin-html@3.2.2(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-html@3.2.2(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -21995,60 +21923,60 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) - vite-plugin-inspect@0.8.4(rollup@4.17.2)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-inspect@0.8.5(rollup@4.17.2)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - '@antfu/utils': 0.7.7 + '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.17.2) - debug: 4.3.4(supports-color@8.1.1) - error-stack-parser-es: 0.1.1 + debug: 4.3.6(supports-color@8.1.1) + error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 open: 10.1.0 perfect-debounce: 1.0.0 picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - rollup - supports-color - vite-plugin-pwa@0.20.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0): + vite-plugin-pwa@0.20.0(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0): dependencies: debug: 4.3.4(supports-color@8.1.1) fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) workbox-build: 7.0.0(@types/babel__core@7.20.5) workbox-window: 7.0.0 transitivePeerDependencies: - supports-color - vite-plugin-static-copy@1.0.5(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-static-copy@1.0.6(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 fast-glob: 3.3.2 fs-extra: 11.2.0 - picocolors: 1.0.0 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + picocolors: 1.0.1 + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) - vite-plugin-vue-devtools@7.2.1(rollup@4.17.2)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)): + vite-plugin-vue-devtools@7.3.8(rollup@4.17.2)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)): dependencies: - '@vue/devtools-core': 7.2.1(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) - '@vue/devtools-kit': 7.2.1(vue@3.4.27(typescript@5.5.4)) - '@vue/devtools-shared': 7.2.1 + '@vue/devtools-core': 7.3.8(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0))(vue@3.4.27(typescript@5.5.4)) + '@vue/devtools-kit': 7.3.8 + '@vue/devtools-shared': 7.3.8 execa: 8.0.1 sirv: 2.0.4 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) - vite-plugin-inspect: 0.8.4(rollup@4.17.2)(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) - vite-plugin-vue-inspector: 5.1.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + vite-plugin-inspect: 0.8.5(rollup@4.17.2)(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) + vite-plugin-vue-inspector: 5.1.3(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.1.0(vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): + vite-plugin-vue-inspector@5.1.3(vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)): dependencies: '@babel/core': 7.24.5 '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.24.5) @@ -22058,8 +21986,8 @@ snapshots: '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.5) '@vue/compiler-dom': 3.4.27 kolorist: 1.8.0 - magic-string: 0.30.7 - vite: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) + magic-string: 0.30.10 + vite: 5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0) transitivePeerDependencies: - supports-color @@ -22089,10 +22017,10 @@ snapshots: sass: 1.60.0 terser: 5.31.0 - vite@5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0): + vite@5.4.1(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 + esbuild: 0.21.5 + postcss: 8.4.41 rollup: 4.17.2 optionalDependencies: '@types/node': 18.13.0 @@ -22101,10 +22029,10 @@ snapshots: sass: 1.60.0 terser: 5.31.0 - vite@5.2.11(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0): + vite@5.4.1(@types/node@20.14.2)(less@4.2.0)(sass@1.60.0)(terser@5.31.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 + esbuild: 0.21.5 + postcss: 8.4.41 rollup: 4.17.2 optionalDependencies: '@types/node': 20.14.2 @@ -22168,8 +22096,8 @@ snapshots: vue-docgen-api@4.75.1(vue@3.4.27(typescript@5.5.4)): dependencies: - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 '@vue/compiler-dom': 3.4.27 '@vue/compiler-sfc': 3.4.27 ast-types: 0.16.1 @@ -22187,7 +22115,7 @@ snapshots: vue-eslint-parser@9.3.0(eslint@8.43.0): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.43.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 @@ -22200,7 +22128,7 @@ snapshots: vue-eslint-parser@9.3.1(eslint@8.43.0): dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.43.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 @@ -22248,13 +22176,7 @@ snapshots: dependencies: de-indent: 1.0.2 he: 1.2.0 - - vue-tsc@1.8.27(typescript@5.5.4): - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.5.4) - semver: 7.5.4 - typescript: 5.5.4 + optional: true vue-tsc@2.0.29(typescript@5.5.4): dependencies: @@ -22328,9 +22250,9 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) + browserslist: 4.23.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.16.1 es-module-lexer: 1.5.3 @@ -22460,10 +22382,10 @@ snapshots: workbox-build@7.0.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.13.0) - '@babel/core': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/preset-env': 7.24.5(@babel/core@7.25.2) '@babel/runtime': 7.24.5 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -22669,7 +22591,7 @@ snapshots: yargs@17.5.1: dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -22684,11 +22606,3 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} - - z-schema@5.0.4: - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.7.0 - optionalDependencies: - commander: 2.20.3 From 7ba5fc671f5b3766426499b832c5a3aa75cd5162 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:52:47 +0800 Subject: [PATCH 3/6] chore: cleanup unused index for notification (#6481) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind cleanup /area core /milestone 2.19.x #### What this PR does / why we need it: 清理没有用到的索引 #### Does this PR introduce a user-facing change? ```release-note None ``` --- api-docs/openapi/v3_0/aggregated.json | 8 --- .../run/halo/app/infra/SchemeInitializer.java | 10 --- .../notification/UserNotificationQuery.java | 66 ++----------------- .../src/api/notification-v1alpha1-uc-api.ts | 23 ++----- 4 files changed, 9 insertions(+), 98 deletions(-) diff --git a/api-docs/openapi/v3_0/aggregated.json b/api-docs/openapi/v3_0/aggregated.json index 57a6d08300..22c51fda80 100644 --- a/api-docs/openapi/v3_0/aggregated.json +++ b/api-docs/openapi/v3_0/aggregated.json @@ -6759,14 +6759,6 @@ "type": "string" } } - }, - { - "description": "Keyword", - "in": "query", - "name": "keyword", - "schema": { - "type": "string" - } } ], "responses": { diff --git a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java index 999b6276cb..fbe4f77d0e 100644 --- a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java +++ b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java @@ -533,16 +533,6 @@ public void onApplicationEvent(@NonNull ApplicationContextInitializedEvent event .setIndexFunc(simpleAttribute(Notification.class, notification -> notification.getSpec().getRecipient())) ); - indexSpecs.add(new IndexSpec() - .setName("spec.title") - .setIndexFunc(simpleAttribute(Notification.class, - notification -> notification.getSpec().getTitle())) - ); - indexSpecs.add(new IndexSpec() - .setName("spec.rawContent") - .setIndexFunc(simpleAttribute(Notification.class, - notification -> notification.getSpec().getRawContent())) - ); }); } diff --git a/application/src/main/java/run/halo/app/notification/UserNotificationQuery.java b/application/src/main/java/run/halo/app/notification/UserNotificationQuery.java index 61091828a3..fe331f52e9 100644 --- a/application/src/main/java/run/halo/app/notification/UserNotificationQuery.java +++ b/application/src/main/java/run/halo/app/notification/UserNotificationQuery.java @@ -1,26 +1,13 @@ package run.halo.app.notification; -import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; import static run.halo.app.extension.index.query.QueryFactory.and; -import static run.halo.app.extension.index.query.QueryFactory.contains; import static run.halo.app.extension.index.query.QueryFactory.equal; -import static run.halo.app.extension.index.query.QueryFactory.or; -import static run.halo.app.extension.router.QueryParamBuildUtil.sortParameter; import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToListOptions; -import io.swagger.v3.oas.annotations.enums.ParameterIn; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Schema; import org.apache.commons.lang3.StringUtils; -import org.springdoc.core.fn.builders.operation.Builder; -import org.springframework.data.domain.Sort; -import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; -import run.halo.app.core.extension.endpoint.SortResolver; import run.halo.app.extension.ListOptions; -import run.halo.app.extension.PageRequest; -import run.halo.app.extension.PageRequestImpl; -import run.halo.app.extension.router.IListRequest; +import run.halo.app.extension.router.SortableRequest; import run.halo.app.extension.router.selector.FieldSelector; /** @@ -29,72 +16,27 @@ * @author guqing * @since 2.10.0 */ -public class UserNotificationQuery extends IListRequest.QueryListRequest { - - private final ServerWebExchange exchange; +public class UserNotificationQuery extends SortableRequest { private final String username; public UserNotificationQuery(ServerWebExchange exchange, String username) { - super(exchange.getRequest().getQueryParams()); - this.exchange = exchange; + super(exchange); this.username = username; } - @Nullable - public String getKeyword() { - return StringUtils.defaultIfBlank(queryParams.getFirst("keyword"), null); - } - - @ArraySchema(uniqueItems = true, - arraySchema = @Schema(name = "sort", - description = "Sort property and direction of the list result. Supported fields: " - + "metadata.creationTimestamp"), - schema = @Schema(description = "like field,asc or field,desc", - implementation = String.class, - example = "creationTimestamp,desc")) - public Sort getSort() { - var sort = SortResolver.defaultInstance.resolve(exchange); - return sort.and(Sort.by( - Sort.Order.desc("metadata.creationTimestamp"), - Sort.Order.desc("metadata.name")) - ); - } - /** * Build a list options from the query object. */ + @Override public ListOptions toListOptions() { var listOptions = labelAndFieldSelectorToListOptions(getLabelSelector(), getFieldSelector()); var filedQuery = listOptions.getFieldSelector().query(); - if (StringUtils.isNotBlank(getKeyword())) { - filedQuery = and(filedQuery, - or( - contains("spec.title", getKeyword()), - contains("spec.rawContent", getKeyword()) - ) - ); - } if (StringUtils.isNotBlank(username)) { filedQuery = and(filedQuery, equal("spec.recipient", username)); } listOptions.setFieldSelector(FieldSelector.of(filedQuery)); return listOptions; } - - public PageRequest toPageRequest() { - return PageRequestImpl.of(getPage(), getSize(), getSort()); - } - - public static void buildParameters(Builder builder) { - IListRequest.buildParameters(builder); - builder.parameter(sortParameter()) - .parameter(parameterBuilder() - .in(ParameterIn.QUERY) - .name("keyword") - .description("Keyword") - .implementation(String.class) - .required(false)); - } } diff --git a/ui/packages/api-client/src/api/notification-v1alpha1-uc-api.ts b/ui/packages/api-client/src/api/notification-v1alpha1-uc-api.ts index 6f77e06d2b..e06c404020 100644 --- a/ui/packages/api-client/src/api/notification-v1alpha1-uc-api.ts +++ b/ui/packages/api-client/src/api/notification-v1alpha1-uc-api.ts @@ -131,11 +131,10 @@ export const NotificationV1alpha1UcApiAxiosParamCreator = function (configuratio * @param {Array} [labelSelector] Label selector. e.g.: hidden!=true * @param {Array} [fieldSelector] Field selector. e.g.: metadata.name==halo * @param {Array} [sort] Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. - * @param {string} [keyword] Keyword * @param {*} [options] Override http request option. * @throws {RequiredError} */ - listUserNotifications: async (username: string, page?: number, size?: number, labelSelector?: Array, fieldSelector?: Array, sort?: Array, keyword?: string, options: RawAxiosRequestConfig = {}): Promise => { + listUserNotifications: async (username: string, page?: number, size?: number, labelSelector?: Array, fieldSelector?: Array, sort?: Array, options: RawAxiosRequestConfig = {}): Promise => { // verify required parameter 'username' is not null or undefined assertParamExists('listUserNotifications', 'username', username) const localVarPath = `/apis/api.notification.halo.run/v1alpha1/userspaces/{username}/notifications` @@ -179,10 +178,6 @@ export const NotificationV1alpha1UcApiAxiosParamCreator = function (configuratio localVarQueryParameter['sort'] = sort; } - if (keyword !== undefined) { - localVarQueryParameter['keyword'] = keyword; - } - setSearchParams(localVarUrlObj, localVarQueryParameter); @@ -374,12 +369,11 @@ export const NotificationV1alpha1UcApiFp = function(configuration?: Configuratio * @param {Array} [labelSelector] Label selector. e.g.: hidden!=true * @param {Array} [fieldSelector] Field selector. e.g.: metadata.name==halo * @param {Array} [sort] Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. - * @param {string} [keyword] Keyword * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async listUserNotifications(username: string, page?: number, size?: number, labelSelector?: Array, fieldSelector?: Array, sort?: Array, keyword?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.listUserNotifications(username, page, size, labelSelector, fieldSelector, sort, keyword, options); + async listUserNotifications(username: string, page?: number, size?: number, labelSelector?: Array, fieldSelector?: Array, sort?: Array, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listUserNotifications(username, page, size, labelSelector, fieldSelector, sort, options); const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerBasePath = operationServerMap['NotificationV1alpha1UcApi.listUserNotifications']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); @@ -458,7 +452,7 @@ export const NotificationV1alpha1UcApiFactory = function (configuration?: Config * @throws {RequiredError} */ listUserNotifications(requestParameters: NotificationV1alpha1UcApiListUserNotificationsRequest, options?: RawAxiosRequestConfig): AxiosPromise { - return localVarFp.listUserNotifications(requestParameters.username, requestParameters.page, requestParameters.size, requestParameters.labelSelector, requestParameters.fieldSelector, requestParameters.sort, requestParameters.keyword, options).then((request) => request(axios, basePath)); + return localVarFp.listUserNotifications(requestParameters.username, requestParameters.page, requestParameters.size, requestParameters.labelSelector, requestParameters.fieldSelector, requestParameters.sort, options).then((request) => request(axios, basePath)); }, /** * Mark the specified notification as read. @@ -572,13 +566,6 @@ export interface NotificationV1alpha1UcApiListUserNotificationsRequest { * @memberof NotificationV1alpha1UcApiListUserNotifications */ readonly sort?: Array - - /** - * Keyword - * @type {string} - * @memberof NotificationV1alpha1UcApiListUserNotifications - */ - readonly keyword?: string } /** @@ -681,7 +668,7 @@ export class NotificationV1alpha1UcApi extends BaseAPI { * @memberof NotificationV1alpha1UcApi */ public listUserNotifications(requestParameters: NotificationV1alpha1UcApiListUserNotificationsRequest, options?: RawAxiosRequestConfig) { - return NotificationV1alpha1UcApiFp(this.configuration).listUserNotifications(requestParameters.username, requestParameters.page, requestParameters.size, requestParameters.labelSelector, requestParameters.fieldSelector, requestParameters.sort, requestParameters.keyword, options).then((request) => request(this.axios, this.basePath)); + return NotificationV1alpha1UcApiFp(this.configuration).listUserNotifications(requestParameters.username, requestParameters.page, requestParameters.size, requestParameters.labelSelector, requestParameters.fieldSelector, requestParameters.sort, options).then((request) => request(this.axios, this.basePath)); } /** From 3a782be607d234e54faeb670e3de22a9bcf7f1de Mon Sep 17 00:00:00 2001 From: John Niang Date: Wed, 21 Aug 2024 11:22:50 +0800 Subject: [PATCH 4/6] Fix the problem that roles could not be granted sometimes (#6471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvement /area core #### What this PR does / why we need it: This PR refactors searching roles by using index mechanism to speed up every request and fix the problem of not being able to grant roles to users sometimes. #### Which issue(s) this PR fixes: Fixes #5807 Fixes https://github.com/halo-dev/halo/issues/4954 Fixes https://github.com/halo-dev/halo/issues/5057 #### Does this PR introduce a user-facing change? ```release-note 修复有时无法给用户赋权限的问题 ``` --- api-docs/openapi/v3_0/aggregated.json | 2 - .../v3_0/apis_console.api_v1alpha1.json | 2 - .../halo/app/core/extension/RoleBinding.java | 9 + .../run/halo/app/core/extension/User.java | 2 + .../run/halo/app/extension/ExtensionUtil.java | 24 ++ .../core/extension/endpoint/UserEndpoint.java | 225 +++++++--------- .../reconciler/RoleBindingReconciler.java | 82 ------ .../extension/reconciler/UserReconciler.java | 246 +++++++----------- .../extension/service/DefaultRoleService.java | 180 ++++++++----- .../core/extension/service/RoleService.java | 24 +- .../core/extension/service/UserService.java | 3 - .../extension/service/UserServiceImpl.java | 48 ++-- .../run/halo/app/infra/SchemeInitializer.java | 51 +++- .../security/DefaultUserDetailService.java | 17 +- .../authorization/AuthorityUtils.java | 7 +- .../authorization/DefaultRuleResolver.java | 17 +- .../app/core/extension/RoleBindingTest.java | 17 ++ .../endpoint/UserEndpointIntegrationTest.java | 10 +- .../extension/endpoint/UserEndpointTest.java | 27 +- .../reconciler/RoleBindingReconcilerTest.java | 195 -------------- .../reconciler/UserReconcilerTest.java | 54 ++-- .../service/DefaultRoleServiceTest.java | 62 +++-- .../service/UserServiceImplTest.java | 154 ++--------- .../DefaultUserDetailServiceTest.java | 69 +---- .../authorization/AuthorityUtilsTest.java | 2 +- 25 files changed, 586 insertions(+), 943 deletions(-) delete mode 100644 application/src/main/java/run/halo/app/core/extension/reconciler/RoleBindingReconciler.java delete mode 100644 application/src/test/java/run/halo/app/core/extension/reconciler/RoleBindingReconcilerTest.java diff --git a/api-docs/openapi/v3_0/aggregated.json b/api-docs/openapi/v3_0/aggregated.json index 22c51fda80..b2ef456a47 100644 --- a/api-docs/openapi/v3_0/aggregated.json +++ b/api-docs/openapi/v3_0/aggregated.json @@ -22881,14 +22881,12 @@ } }, "roles": { - "uniqueItems": true, "type": "array", "items": { "$ref": "#/components/schemas/Role" } }, "uiPermissions": { - "uniqueItems": true, "type": "array", "items": { "type": "string" diff --git a/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json b/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json index b87b688092..595b83bd13 100644 --- a/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json +++ b/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json @@ -6236,14 +6236,12 @@ } }, "roles": { - "uniqueItems": true, "type": "array", "items": { "$ref": "#/components/schemas/Role" } }, "uiPermissions": { - "uniqueItems": true, "type": "array", "items": { "type": "string" diff --git a/api/src/main/java/run/halo/app/core/extension/RoleBinding.java b/api/src/main/java/run/halo/app/core/extension/RoleBinding.java index 1d559522e8..09ad63827f 100644 --- a/api/src/main/java/run/halo/app/core/extension/RoleBinding.java +++ b/api/src/main/java/run/halo/app/core/extension/RoleBinding.java @@ -13,6 +13,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; +import org.springframework.util.StringUtils; import run.halo.app.extension.AbstractExtension; import run.halo.app.extension.ExtensionOperator; import run.halo.app.extension.GVK; @@ -118,6 +119,14 @@ public static Predicate containsUser(Set usernames) { && User.GROUP.equals(subject.apiGroup) && usernames.contains(subject.getName()); } + + @Override + public String toString() { + if (StringUtils.hasText(apiGroup)) { + return apiGroup + "/" + kind + "/" + name; + } + return kind + "/" + name; + } } public static RoleBinding create(String username, String roleName) { diff --git a/api/src/main/java/run/halo/app/core/extension/User.java b/api/src/main/java/run/halo/app/core/extension/User.java index 1d796b3ebc..f925bc9bac 100644 --- a/api/src/main/java/run/halo/app/core/extension/User.java +++ b/api/src/main/java/run/halo/app/core/extension/User.java @@ -46,6 +46,8 @@ public class User extends AbstractExtension { public static final String HIDDEN_USER_LABEL = "halo.run/hidden-user"; + public static final String REQUEST_TO_UPDATE = "halo.run/request-to-update"; + @Schema(requiredMode = REQUIRED) private UserSpec spec = new UserSpec(); diff --git a/api/src/main/java/run/halo/app/extension/ExtensionUtil.java b/api/src/main/java/run/halo/app/extension/ExtensionUtil.java index a1f4d5cf96..cb50cd365c 100644 --- a/api/src/main/java/run/halo/app/extension/ExtensionUtil.java +++ b/api/src/main/java/run/halo/app/extension/ExtensionUtil.java @@ -3,6 +3,9 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import org.springframework.data.domain.Sort; +import run.halo.app.extension.index.query.Query; +import run.halo.app.extension.index.query.QueryFactory; public enum ExtensionUtil { ; @@ -34,4 +37,25 @@ public static boolean removeFinalizers(MetadataOperator metadata, Set fi return removed; } + /** + * Query for not deleting. + * + * @return Query + */ + public static Query notDeleting() { + return QueryFactory.isNull("metadata.deletionTimestamp"); + } + + /** + * Default sort by creation timestamp desc and name asc. + * + * @return Sort + */ + public static Sort defaultSort() { + return Sort.by( + Sort.Order.desc("metadata.creationTimestamp"), + Sort.Order.asc("metadata.name") + ); + } + } diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java b/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java index a09df32cb4..932a3925ba 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java +++ b/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java @@ -10,9 +10,9 @@ import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; import static org.springframework.web.reactive.function.server.RequestPredicates.contentType; import static run.halo.app.extension.ListResult.generateGenericClass; -import static run.halo.app.extension.index.query.QueryFactory.and; import static run.halo.app.extension.index.query.QueryFactory.contains; import static run.halo.app.extension.index.query.QueryFactory.equal; +import static run.halo.app.extension.index.query.QueryFactory.in; import static run.halo.app.extension.index.query.QueryFactory.or; import static run.halo.app.extension.router.QueryParamBuildUtil.sortParameter; import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToListOptions; @@ -28,13 +28,15 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.security.Principal; import java.time.Duration; -import java.util.Collections; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -83,8 +85,6 @@ import run.halo.app.extension.PageRequestImpl; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.router.IListRequest; -import run.halo.app.extension.router.selector.FieldSelector; -import run.halo.app.infra.AnonymousUserConst; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting; import run.halo.app.infra.ValidationUtils; @@ -457,11 +457,14 @@ private Mono createUser(ServerRequest request) { private Mono getUserByName(ServerRequest request) { final var name = request.pathVariable("name"); return userService.getUser(name) - .flatMap(this::toDetailedUser) - .flatMap(user -> ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .bodyValue(user) - ); + .flatMap(user -> roleService.getRolesByUsername(name) + .collectList() + .flatMap(roleNames -> roleService.list(new HashSet<>(roleNames), true) + .collectList() + .map(roles -> new DetailedUser(user, roles)) + ) + ) + .flatMap(detailedUser -> ServerResponse.ok().bodyValue(detailedUser)); } record CreateUserRequest(@Schema(requiredMode = REQUIRED) String name, @@ -600,33 +603,16 @@ record ChangePasswordRequest( Mono me(ServerRequest request) { return ReactiveSecurityContextHolder.getContext() .map(SecurityContext::getAuthentication) - .filter(obj -> !(obj instanceof TwoFactorAuthentication)) - .map(Authentication::getName) - .defaultIfEmpty(AnonymousUserConst.PRINCIPAL) - .flatMap(userService::getUser) - .flatMap(this::toDetailedUser) - .flatMap(user -> ServerResponse.ok() - .contentType(MediaType.APPLICATION_JSON) - .bodyValue(user)); - } - - private Mono toDetailedUser(User user) { - Set roleNames = roleNames(user); - return roleService.list(roleNames) - .collectList() - .map(roles -> new DetailedUser(user, roles)) - .defaultIfEmpty(new DetailedUser(user, List.of())); - } - - Set roleNames(User user) { - Assert.notNull(user, "User must not be null"); - Map annotations = MetadataUtil.nullSafeAnnotations(user); - String roleNamesJson = annotations.get(User.ROLE_NAMES_ANNO); - if (StringUtils.isBlank(roleNamesJson)) { - return Set.of(); - } - return JsonUtils.jsonToObject(roleNamesJson, new TypeReference<>() { - }); + .filter(auth -> !(auth instanceof TwoFactorAuthentication)) + .flatMap(auth -> userService.getUser(auth.getName()) + .flatMap(user -> { + var roleNames = authoritiesToRoles(auth.getAuthorities()); + return roleService.list(roleNames, true) + .collectList() + .map(roles -> new DetailedUser(user, roles)); + }) + ) + .flatMap(detailedUser -> ServerResponse.ok().bodyValue(detailedUser)); } record DetailedUser(@Schema(requiredMode = REQUIRED) User user, @@ -649,85 +635,55 @@ record GrantRequest(Set roles) { @NonNull private Mono getUserPermission(ServerRequest request) { - var name = request.pathVariable("name"); - Mono userPermission; - if (SELF_USER.equals(name)) { - userPermission = ReactiveSecurityContextHolder.getContext() - .map(SecurityContext::getAuthentication) - .flatMap(auth -> { - var roleNames = authoritiesToRoles(auth.getAuthorities()); - var up = new UserPermission(); - var roles = roleService.list(roleNames) - .collect(Collectors.toSet()) - .doOnNext(up::setRoles) - .then(); - var permissions = roleService.listPermissions(roleNames) - .distinct() - .collectList() - .doOnNext(up::setPermissions) - .doOnNext(perms -> { - var uiPermissions = uiPermissions(new HashSet<>(perms)); - up.setUiPermissions(uiPermissions); - }) - .then(); - return roles.and(permissions).thenReturn(up); - }); - } else { - // get roles from username - userPermission = userService.listRoles(name) - .collect(Collectors.toSet()) - .flatMap(roles -> { - var up = new UserPermission(); - var setRoles = Mono.fromRunnable(() -> up.setRoles(roles)).then(); - var roleNames = roles.stream() - .map(role -> role.getMetadata().getName()) - .collect(Collectors.toSet()); - var setPermissions = roleService.listPermissions(roleNames) - .distinct() - .collectList() - .doOnNext(up::setPermissions) - .doOnNext(perms -> { - var uiPermissions = uiPermissions(new HashSet<>(perms)); - up.setUiPermissions(uiPermissions); - }) - .then(); - return setRoles.and(setPermissions).thenReturn(up); + var username = request.pathVariable("name"); + return Mono.defer(() -> { + if (SELF_USER.equals(username)) { + return ReactiveSecurityContextHolder.getContext() + .map(SecurityContext::getAuthentication) + .map(auth -> authoritiesToRoles(auth.getAuthorities())); + } + return roleService.getRolesByUsername(username) + .collect(Collectors.toCollection(LinkedHashSet::new)); + }).flatMap(roleNames -> { + var up = new UserPermission(); + var setRoles = roleService.list(roleNames, true) + .distinct() + .collectSortedList() + .doOnNext(up::setRoles); + var setPerms = roleService.listPermissions(roleNames) + .distinct() + .collectSortedList() + .doOnNext(permissions -> { + up.setPermissions(permissions); + up.setUiPermissions(uiPermissions(permissions)); }); - } - - return ServerResponse.ok().body(userPermission, UserPermission.class); + return Mono.when(setRoles, setPerms).thenReturn(up); + }).flatMap(userPermission -> ServerResponse.ok().bodyValue(userPermission)); } - private Set uiPermissions(Set roles) { + private List uiPermissions(Collection roles) { if (CollectionUtils.isEmpty(roles)) { - return Collections.emptySet(); + return List.of(); } - return roles.stream() - .>map(role -> { - var annotations = role.getMetadata().getAnnotations(); - if (annotations == null) { - return Set.of(); - } - var uiPermissionsJson = annotations.get(Role.UI_PERMISSIONS_ANNO); - if (StringUtils.isBlank(uiPermissionsJson)) { - return Set.of(); - } - return JsonUtils.jsonToObject(uiPermissionsJson, - new TypeReference>() { - }); - }) - .flatMap(Set::stream) - .collect(Collectors.toSet()); + var uiPerms = new LinkedList(); + roles.forEach(role -> Optional.ofNullable(role.getMetadata().getAnnotations()) + .map(annotations -> annotations.get(Role.UI_PERMISSIONS_ANNO)) + .filter(StringUtils::isNotBlank) + .map(json -> JsonUtils.jsonToObject(json, new TypeReference>() { + })) + .ifPresent(uiPerms::addAll) + ); + return uiPerms.stream().distinct().sorted().toList(); } @Data public static class UserPermission { @Schema(requiredMode = REQUIRED) - private Set roles; + private List roles; @Schema(requiredMode = REQUIRED) private List permissions; @Schema(requiredMode = REQUIRED) - private Set uiPermissions; + private List uiPermissions; } @@ -767,29 +723,23 @@ public Sort getSort() { * Converts query parameters to list options. */ public ListOptions toListOptions() { - var listOptions = + var defaultListOptions = labelAndFieldSelectorToListOptions(getLabelSelector(), getFieldSelector()); - var fieldQuery = listOptions.getFieldSelector().query(); - if (StringUtils.isNotBlank(getKeyword())) { - fieldQuery = and( - fieldQuery, - or( - contains("spec.displayName", getKeyword()), - equal("metadata.name", getKeyword()) - ) - ); - } + var builder = ListOptions.builder(defaultListOptions); - if (StringUtils.isNotBlank(getRole())) { - fieldQuery = and( - fieldQuery, - equal(User.USER_RELATED_ROLES_INDEX, getRole()) - ); - } + Optional.ofNullable(getKeyword()) + .filter(StringUtils::isNotBlank) + .ifPresent(keyword -> builder.andQuery(or( + contains("spec.displayName", keyword), + equal("metadata.name", keyword) + ))); + + Optional.ofNullable(getRole()) + .filter(StringUtils::isNotBlank) + .ifPresent(role -> builder.andQuery(in(User.USER_RELATED_ROLES_INDEX, role))); - listOptions.setFieldSelector(FieldSelector.of(fieldQuery)); - return listOptions; + return builder.build(); } public static void buildParameters(Builder builder) { @@ -829,17 +779,28 @@ Mono list(ServerRequest request) { } private Mono> toListedUser(ListResult listResult) { - return Flux.fromStream(listResult.get()) - .concatMap(user -> { - Set roleNames = roleNames(user); - return roleService.list(roleNames) - .collectList() - .map(roles -> new ListedUser(user, roles)) - .defaultIfEmpty(new ListedUser(user, List.of())); - }) - .collectList() - .map(items -> convertFrom(listResult, items)) - .defaultIfEmpty(convertFrom(listResult, List.of())); + var usernames = listResult.getItems().stream() + .map(user -> user.getMetadata().getName()) + .collect(Collectors.toList()); + return roleService.getRolesByUsernames(usernames) + .flatMap(usernameRolesMap -> { + var allRoleNames = new HashSet(); + usernameRolesMap.values().forEach(allRoleNames::addAll); + return roleService.list(allRoleNames) + .collectMap(role -> role.getMetadata().getName()) + .map(roleMap -> { + var listedUsers = listResult.getItems().stream() + .map(user -> { + var username = user.getMetadata().getName(); + var roles = Optional.ofNullable(usernameRolesMap.get(username)) + .map(roleNames -> roleNames.stream().map(roleMap::get).toList()) + .orElseGet(List::of); + return new ListedUser(user, roles); + }) + .toList(); + return convertFrom(listResult, listedUsers); + }); + }); } ListResult convertFrom(ListResult listResult, List items) { diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/RoleBindingReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/RoleBindingReconciler.java deleted file mode 100644 index 427fdbec43..0000000000 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/RoleBindingReconciler.java +++ /dev/null @@ -1,82 +0,0 @@ -package run.halo.app.core.extension.reconciler; - -import static run.halo.app.core.extension.RoleBinding.containsUser; - -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.util.Lazy; -import org.springframework.stereotype.Component; -import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding; -import run.halo.app.core.extension.RoleBinding.Subject; -import run.halo.app.core.extension.User; -import run.halo.app.extension.ExtensionClient; -import run.halo.app.extension.controller.Controller; -import run.halo.app.extension.controller.ControllerBuilder; -import run.halo.app.extension.controller.Reconciler; -import run.halo.app.extension.controller.Reconciler.Request; -import run.halo.app.infra.utils.JsonUtils; - -@Slf4j -@Component -public class RoleBindingReconciler implements Reconciler { - - private final ExtensionClient client; - - public RoleBindingReconciler(ExtensionClient client) { - this.client = client; - } - - @Override - public Result reconcile(Request request) { - client.fetch(RoleBinding.class, request.name()).ifPresent(roleBinding -> { - // get all usernames; - var usernames = roleBinding.getSubjects().stream() - .filter(subject -> User.KIND.equals(subject.getKind())) - .map(Subject::getName) - .collect(Collectors.toSet()); - - // get all role-bindings lazily - var bindings = - Lazy.of(() -> client.list(RoleBinding.class, containsUser(usernames), null)); - - usernames.forEach(username -> { - var roleNames = bindings.get().stream() - .filter(containsUser(username)) - .map(RoleBinding::getRoleRef) - .filter(roleRef -> Objects.equals(roleRef.getKind(), Role.KIND)) - .map(RoleBinding.RoleRef::getName) - .sorted() - // we have to use LinkedHashSet below to make sure the sorted above functional - .collect(Collectors.toCollection(LinkedHashSet::new)); - // we should update the role names even if the role names are empty - client.fetch(User.class, username).ifPresent(user -> { - var annotations = user.getMetadata().getAnnotations(); - if (annotations == null) { - annotations = new HashMap<>(); - } - var oldAnnotations = Map.copyOf(annotations); - annotations.put(User.ROLE_NAMES_ANNO, JsonUtils.objectToJson(roleNames)); - user.getMetadata().setAnnotations(annotations); - if (!Objects.deepEquals(oldAnnotations, annotations)) { - // update user - client.update(user); - } - }); - }); - }); - return new Result(false, null); - } - - @Override - public Controller setupWith(ControllerBuilder builder) { - return builder - .extension(new RoleBinding()) - .build(); - } - -} diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java index 2ebcf67422..c74d087b16 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java @@ -1,20 +1,24 @@ package run.halo.app.core.extension.reconciler; -import static run.halo.app.core.extension.User.GROUP; -import static run.halo.app.core.extension.User.KIND; +import static run.halo.app.extension.ExtensionUtil.addFinalizers; +import static run.halo.app.extension.ExtensionUtil.defaultSort; +import static run.halo.app.extension.ExtensionUtil.isDeleted; +import static run.halo.app.extension.ExtensionUtil.removeFinalizers; +import static run.halo.app.extension.index.query.QueryFactory.equal; import java.net.URI; -import java.util.HashSet; +import java.time.Duration; +import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; -import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding; +import org.springframework.util.CollectionUtils; +import org.springframework.web.util.UriComponentsBuilder; import run.halo.app.core.extension.User; import run.halo.app.core.extension.UserConnection; import run.halo.app.core.extension.attachment.Attachment; @@ -22,8 +26,7 @@ import run.halo.app.core.extension.service.RoleService; import run.halo.app.core.extension.service.UserService; import run.halo.app.extension.ExtensionClient; -import run.halo.app.extension.GroupKind; -import run.halo.app.extension.MetadataUtil; +import run.halo.app.extension.ListOptions; import run.halo.app.extension.controller.Controller; import run.halo.app.extension.controller.ControllerBuilder; import run.halo.app.extension.controller.Reconciler; @@ -32,7 +35,6 @@ import run.halo.app.infra.AnonymousUserConst; import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.utils.JsonUtils; -import run.halo.app.infra.utils.PathUtils; @Slf4j @Component @@ -43,26 +45,21 @@ public class UserReconciler implements Reconciler { private final ExternalUrlSupplier externalUrlSupplier; private final RoleService roleService; private final AttachmentService attachmentService; - private final RetryTemplate retryTemplate = RetryTemplate.builder() - .maxAttempts(20) - .fixedBackoff(300) - .retryOn(IllegalStateException.class) - .build(); private final UserService userService; @Override public Result reconcile(Request request) { client.fetch(User.class, request.name()).ifPresent(user -> { - if (user.getMetadata().getDeletionTimestamp() != null) { - cleanUpResourcesAndRemoveFinalizer(request.name()); + if (isDeleted(user)) { + deleteUserConnections(request.name()); + removeFinalizers(user.getMetadata(), Set.of(FINALIZER_NAME)); + client.update(user); return; } - - addFinalizerIfNecessary(user); - ensureRoleNamesAnno(request.name()); - updatePermalink(request.name()); - handleAvatar(request.name()); - + addFinalizers(user.getMetadata(), Set.of(FINALIZER_NAME)); + ensureRoleNamesAnno(user); + updatePermalink(user); + handleAvatar(user); checkVerifiedEmail(user); client.update(user); }); @@ -92,147 +89,102 @@ private Boolean checkEmailInUse(String username, String email) { .orElse(false); } - private void handleAvatar(String name) { - client.fetch(User.class, name).ifPresent(user -> { - Map annotations = MetadataUtil.nullSafeAnnotations(user); - - String avatarAttachmentName = annotations.get(User.AVATAR_ATTACHMENT_NAME_ANNO); - String oldAvatarAttachmentName = annotations.get(User.LAST_AVATAR_ATTACHMENT_NAME_ANNO); - - if (StringUtils.isNotBlank(oldAvatarAttachmentName) - && !StringUtils.equals(oldAvatarAttachmentName, avatarAttachmentName)) { - client.fetch(Attachment.class, oldAvatarAttachmentName) - .ifPresent(client::delete); - annotations.remove(User.LAST_AVATAR_ATTACHMENT_NAME_ANNO); - oldAvatarAttachmentName = null; - } - - if (StringUtils.isNotBlank(avatarAttachmentName)) { - client.fetch(Attachment.class, avatarAttachmentName) - .ifPresent(attachment -> { - URI avatarUri = attachmentService.getPermalink(attachment).block(); - if (avatarUri == null) { - log.warn("Failed to get avatar permalink for user [{}] with attachment " - + "[{}], re-enqueuing...", name, avatarAttachmentName); - throw new RequeueException(new Result(true, null), - "Failed to get avatar permalink."); - } - user.getSpec().setAvatar(avatarUri.toString()); - }); - } else if (StringUtils.isNotBlank(oldAvatarAttachmentName)) { - user.getSpec().setAvatar(null); - } - - if (StringUtils.isBlank(oldAvatarAttachmentName) - && StringUtils.isNotBlank(avatarAttachmentName)) { - annotations.put(User.LAST_AVATAR_ATTACHMENT_NAME_ANNO, avatarAttachmentName); - } - - client.update(user); - }); - } - - private void ensureRoleNamesAnno(String name) { - client.fetch(User.class, name).ifPresent(user -> { - Map annotations = MetadataUtil.nullSafeAnnotations(user); - Map oldAnnotations = Map.copyOf(annotations); - - List roleNames = listRoleNamesRef(name); - annotations.put(User.ROLE_NAMES_ANNO, JsonUtils.objectToJson(roleNames)); + private void handleAvatar(User user) { + var annotations = Optional.ofNullable(user.getMetadata().getAnnotations()) + .orElseGet(HashMap::new); + user.getMetadata().setAnnotations(annotations); + + var avatarAttachmentName = annotations.get(User.AVATAR_ATTACHMENT_NAME_ANNO); + var oldAvatarAttachmentName = + annotations.get(User.LAST_AVATAR_ATTACHMENT_NAME_ANNO); + // remove old avatar if needed + if (StringUtils.isNotBlank(oldAvatarAttachmentName) + && !StringUtils.equals(avatarAttachmentName, oldAvatarAttachmentName)) { + client.fetch(Attachment.class, oldAvatarAttachmentName) + .ifPresent(client::delete); + annotations.remove(User.LAST_AVATAR_ATTACHMENT_NAME_ANNO); + } - if (!oldAnnotations.equals(annotations)) { - client.update(user); + var spec = user.getSpec(); + if (StringUtils.isBlank(avatarAttachmentName)) { + if (StringUtils.isNotBlank(spec.getAvatar())) { + log.info("Remove avatar for user({})", user.getMetadata().getName()); } - }); + spec.setAvatar(null); + return; + } + client.fetch(Attachment.class, avatarAttachmentName) + .flatMap(attachment -> attachmentService.getPermalink(attachment) + .blockOptional(Duration.ofMinutes(1)) + ) + .map(URI::toString) + .ifPresentOrElse(avatar -> { + if (!Objects.equals(avatar, spec.getAvatar())) { + log.info( + "Update avatar for user({}) to {}", + user.getMetadata().getName(), avatar + ); + } + spec.setAvatar(avatar); + // reset last avatar + annotations.put( + User.LAST_AVATAR_ATTACHMENT_NAME_ANNO, + avatarAttachmentName + ); + }, () -> { + throw new RequeueException( + new Result(true, null), + "Avatar permalink(%s) is not available yet." + .formatted(avatarAttachmentName) + ); + }); } - List listRoleNamesRef(String username) { - var subject = new RoleBinding.Subject(KIND, username, GROUP); - return roleService.listRoleRefs(subject) - .filter(this::isRoleRef) - .map(RoleBinding.RoleRef::getName) - .distinct() + private void ensureRoleNamesAnno(User user) { + roleService.getRolesByUsername(user.getMetadata().getName()) .collectList() - .blockOptional() - .orElse(List.of()); - } - - private boolean isRoleRef(RoleBinding.RoleRef roleRef) { - var roleGvk = new Role().groupVersionKind(); - var gk = new GroupKind(roleRef.getApiGroup(), roleRef.getKind()); - return gk.equals(roleGvk.groupKind()); + .map(JsonUtils::objectToJson) + .doOnNext(roleNamesJson -> { + var annotations = Optional.ofNullable(user.getMetadata().getAnnotations()) + .orElseGet(HashMap::new); + user.getMetadata().setAnnotations(annotations); + annotations.put(User.ROLE_NAMES_ANNO, roleNamesJson); + }) + .block(Duration.ofMinutes(1)); } - private void updatePermalink(String name) { - client.fetch(User.class, name).ifPresent(user -> { - if (AnonymousUserConst.isAnonymousUser(name)) { - // anonymous user is not allowed to have permalink - return; - } - if (user.getStatus() == null) { - user.setStatus(new User.UserStatus()); - } - User.UserStatus status = user.getStatus(); - String oldPermalink = status.getPermalink(); - - status.setPermalink(getUserPermalink(user)); - - if (!StringUtils.equals(oldPermalink, status.getPermalink())) { - client.update(user); - } - }); + private void updatePermalink(User user) { + var name = user.getMetadata().getName(); + if (AnonymousUserConst.isAnonymousUser(name)) { + // anonymous user is not allowed to have permalink + return; + } + var status = Optional.ofNullable(user.getStatus()) + .orElseGet(User.UserStatus::new); + user.setStatus(status); + status.setPermalink(getUserPermalink(user)); } private String getUserPermalink(User user) { - return externalUrlSupplier.get() - .resolve(PathUtils.combinePath("authors", user.getMetadata().getName())) - .normalize().toString(); + return UriComponentsBuilder.fromUri(externalUrlSupplier.get()) + .pathSegment("authors", user.getMetadata().getName()) + .toUriString(); } - private void addFinalizerIfNecessary(User oldUser) { - Set finalizers = oldUser.getMetadata().getFinalizers(); - if (finalizers != null && finalizers.contains(FINALIZER_NAME)) { + void deleteUserConnections(String username) { + var userConnections = listConnectionsByUsername(username); + if (CollectionUtils.isEmpty(userConnections)) { return; } - client.fetch(User.class, oldUser.getMetadata().getName()) - .ifPresent(user -> { - Set newFinalizers = user.getMetadata().getFinalizers(); - if (newFinalizers == null) { - newFinalizers = new HashSet<>(); - user.getMetadata().setFinalizers(newFinalizers); - } - newFinalizers.add(FINALIZER_NAME); - client.update(user); - }); - } - - private void cleanUpResourcesAndRemoveFinalizer(String userName) { - client.fetch(User.class, userName).ifPresent(user -> { - // wait for dependent resources to be deleted - deleteUserConnections(userName); - - // remove finalizer - if (user.getMetadata().getFinalizers() != null) { - user.getMetadata().getFinalizers().remove(FINALIZER_NAME); - } - client.update(user); - }); - } - - void deleteUserConnections(String userName) { - listConnectionsByUsername(userName).forEach(client::delete); - // wait for user connection to be deleted - retryTemplate.execute(callback -> { - if (listConnectionsByUsername(userName).size() > 0) { - throw new IllegalStateException("User connection is not deleted yet"); - } - return null; - }); + userConnections.forEach(client::delete); + throw new RequeueException(new Result(true, null), "User connections are not deleted yet"); } List listConnectionsByUsername(String username) { - return client.list(UserConnection.class, - connection -> connection.getSpec().getUsername().equals(username), null); + var listOptions = ListOptions.builder() + .andQuery(equal("spec.username", username)) + .build(); + return client.listAll(UserConnection.class, listOptions, defaultSort()); } @Override diff --git a/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java b/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java index 2feb50f878..6351643c31 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java +++ b/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java @@ -1,13 +1,17 @@ package run.halo.app.core.extension.service; -import static run.halo.app.extension.Comparators.compareCreationTimestamp; +import static run.halo.app.extension.ExtensionUtil.defaultSort; +import static run.halo.app.extension.ExtensionUtil.notDeleting; import static run.halo.app.security.authorization.AuthorityUtils.containsSuperRole; import com.fasterxml.jackson.core.type.TypeReference; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -22,8 +26,12 @@ import run.halo.app.core.extension.RoleBinding; import run.halo.app.core.extension.RoleBinding.RoleRef; import run.halo.app.core.extension.RoleBinding.Subject; +import run.halo.app.core.extension.User; +import run.halo.app.extension.ExtensionUtil; +import run.halo.app.extension.ListOptions; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.ReactiveExtensionClient; +import run.halo.app.extension.index.query.QueryFactory; import run.halo.app.infra.utils.JsonUtils; import run.halo.app.security.SuperAdminInitializer; @@ -35,18 +43,58 @@ @Service public class DefaultRoleService implements RoleService { - private final ReactiveExtensionClient extensionClient; + private final ReactiveExtensionClient client; - public DefaultRoleService(ReactiveExtensionClient extensionClient) { - this.extensionClient = extensionClient; + public DefaultRoleService(ReactiveExtensionClient client) { + this.client = client; + } + + private Flux listRoleRefs(Subject subject) { + return listRoleBindings(subject).map(RoleBinding::getRoleRef); + } + + @Override + public Flux listRoleBindings(Subject subject) { + var listOptions = ListOptions.builder() + .andQuery(notDeleting()) + .andQuery(QueryFactory.in("subjects", subject.toString())) + .build(); + return client.listAll(RoleBinding.class, listOptions, defaultSort()); } @Override - public Flux listRoleRefs(Subject subject) { - return extensionClient.list(RoleBinding.class, - binding -> binding.getSubjects().contains(subject), - null) - .map(RoleBinding::getRoleRef); + public Flux getRolesByUsername(String username) { + return listRoleRefs(toUserSubject(username)) + .filter(DefaultRoleService::isRoleKind) + .map(RoleRef::getName); + } + + @Override + public Mono>> getRolesByUsernames(Collection usernames) { + if (CollectionUtils.isEmpty(usernames)) { + return Mono.empty(); + } + var subjects = usernames.stream().map(DefaultRoleService::toUserSubject) + .map(Object::toString) + .collect(Collectors.toSet()); + var listOptions = ListOptions.builder() + .andQuery(notDeleting()) + .andQuery(QueryFactory.in("subjects", subjects)) + .build(); + + return client.listAll(RoleBinding.class, listOptions, defaultSort()) + .collect(HashMap::new, (map, roleBinding) -> { + for (Subject subject : roleBinding.getSubjects()) { + if (subjects.contains(subject.toString())) { + var username = subject.getName(); + var roleRef = roleBinding.getRoleRef(); + if (isRoleKind(roleRef)) { + var roleName = roleRef.getName(); + map.computeIfAbsent(username, k -> new HashSet<>()).add(roleName); + } + } + } + }); } @Override @@ -54,7 +102,7 @@ public Mono contains(Collection source, Collection cand if (source.contains(SuperAdminInitializer.SUPER_ROLE_NAME)) { return Mono.just(true); } - return listDependencies(new HashSet<>(source), shouldFilterHidden(false)) + return listWithDependencies(new HashSet<>(source), shouldExcludeHidden(false)) .map(role -> role.getMetadata().getName()) .collect(Collectors.toSet()) .map(roleNames -> roleNames.containsAll(candidates)); @@ -64,55 +112,58 @@ public Mono contains(Collection source, Collection cand public Flux listPermissions(Set names) { if (containsSuperRole(names)) { // search all permissions - return extensionClient.list(Role.class, - shouldFilterHidden(true), - compareCreationTimestamp(true)); + return client.listAll(Role.class, + shouldExcludeHidden(true), + ExtensionUtil.defaultSort()); } - return listDependencies(names, shouldFilterHidden(true)); + return listWithDependencies(names, shouldExcludeHidden(true)); } @Override public Flux listDependenciesFlux(Set names) { - return listDependencies(names, shouldFilterHidden(false)); + return listWithDependencies(names, shouldExcludeHidden(false)); + } + + private static boolean isRoleKind(RoleRef roleRef) { + return Role.GROUP.equals(roleRef.getApiGroup()) && Role.KIND.equals(roleRef.getKind()); + } + + private static Subject toUserSubject(String username) { + var subject = new Subject(); + subject.setApiGroup(User.GROUP); + subject.setKind(User.KIND); + subject.setName(username); + return subject; } - private Flux listRoles(Set names, Predicate additionalPredicate) { + private Flux listRoles(Set names, ListOptions additionalListOptions) { if (CollectionUtils.isEmpty(names)) { return Flux.empty(); } - Predicate predicate = role -> names.contains(role.getMetadata().getName()); - if (additionalPredicate != null) { - predicate = predicate.and(additionalPredicate); - } - return extensionClient.list(Role.class, predicate, compareCreationTimestamp(true)); - } + var listOptions = Optional.ofNullable(additionalListOptions) + .map(ListOptions::builder) + .orElseGet(ListOptions::builder) + .andQuery(notDeleting()) + .andQuery(QueryFactory.in("metadata.name", names)) + .build(); - private static Predicate shouldFilterHidden(boolean filterHidden) { - if (!filterHidden) { - return r -> true; - } - return role -> { - var labels = role.getMetadata().getLabels(); - if (labels == null) { - return true; - } - var hiddenValue = labels.get(Role.HIDDEN_LABEL_NAME); - return !Boolean.parseBoolean(hiddenValue); - }; + return client.listAll(Role.class, listOptions, ExtensionUtil.defaultSort()); } - private static boolean isRoleTemplate(Role role) { - var labels = role.getMetadata().getLabels(); - if (labels == null) { - return false; + private static ListOptions shouldExcludeHidden(boolean excludeHidden) { + if (!excludeHidden) { + return null; } - return Boolean.parseBoolean(labels.get(Role.TEMPLATE_LABEL_NAME)); + return ListOptions.builder().labelSelector() + .notEq(Role.HIDDEN_LABEL_NAME, Boolean.TRUE.toString()) + .end() + .build(); } - private Flux listDependencies(Set names, Predicate additionalPredicate) { + private Flux listWithDependencies(Set names, ListOptions additionalListOptions) { var visited = new HashSet(); - return listRoles(names, additionalPredicate) + return listRoles(names, additionalListOptions) .expand(role -> { var name = role.getMetadata().getName(); if (visited.contains(name)) { @@ -128,29 +179,26 @@ private Flux listDependencies(Set names, Predicate additiona return Flux.fromIterable(dependencies) .filter(dep -> !visited.contains(dep)) - .collect(Collectors.toSet()) - .flatMapMany(deps -> listRoles(deps, additionalPredicate)); + .collect(Collectors.toSet()) + .flatMapMany(deps -> listRoles(deps, additionalListOptions)); }) - .concatWith(Flux.defer(() -> listAggregatedRoles(visited, additionalPredicate))); + .concatWith(Flux.defer(() -> listAggregatedRoles(visited, additionalListOptions))); } private Flux listAggregatedRoles(Set roleNames, - Predicate additionalPredicate) { - var aggregatedLabelNames = roleNames.stream() - .map(roleName -> Role.ROLE_AGGREGATE_LABEL_PREFIX + roleName) - .collect(Collectors.toSet()); - Predicate predicate = role -> { - var labels = role.getMetadata().getLabels(); - if (labels == null) { - return false; - } - return aggregatedLabelNames.stream() - .anyMatch(aggregatedLabel -> Boolean.parseBoolean(labels.get(aggregatedLabel))); - }; - if (additionalPredicate != null) { - predicate = predicate.and(additionalPredicate); + ListOptions additionalListOptions) { + if (CollectionUtils.isEmpty(roleNames)) { + return Flux.empty(); } - return extensionClient.list(Role.class, predicate, compareCreationTimestamp(true)); + var listOptionsBuilder = Optional.ofNullable(additionalListOptions) + .map(ListOptions::builder) + .orElseGet(ListOptions::builder); + roleNames.stream() + .map(roleName -> Role.ROLE_AGGREGATE_LABEL_PREFIX + roleName) + .forEach( + label -> listOptionsBuilder.labelSelector().eq(label, Boolean.TRUE.toString()) + ); + return client.listAll(Role.class, listOptionsBuilder.build(), ExtensionUtil.defaultSort()); } Predicate getRoleBindingPredicate(Subject targetSubject) { @@ -175,11 +223,21 @@ private static boolean matchSubject(Subject targetSubject, Subject subject) { @Override public Flux list(Set roleNames) { + return list(roleNames, false); + } + + @Override + public Flux list(Set roleNames, boolean excludeHidden) { if (CollectionUtils.isEmpty(roleNames)) { return Flux.empty(); } - return Flux.fromIterable(roleNames) - .flatMap(roleName -> extensionClient.fetch(Role.class, roleName)); + var builder = ListOptions.builder() + .andQuery(notDeleting()) + .andQuery(QueryFactory.in("metadata.name", roleNames)); + if (excludeHidden) { + builder.labelSelector().notEq(Role.HIDDEN_LABEL_NAME, Boolean.TRUE.toString()); + } + return client.listAll(Role.class, builder.build(), defaultSort()); } @NonNull diff --git a/application/src/main/java/run/halo/app/core/extension/service/RoleService.java b/application/src/main/java/run/halo/app/core/extension/service/RoleService.java index e52917dcd4..d22beff912 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/RoleService.java +++ b/application/src/main/java/run/halo/app/core/extension/service/RoleService.java @@ -1,11 +1,12 @@ package run.halo.app.core.extension.service; import java.util.Collection; +import java.util.Map; import java.util.Set; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding.RoleRef; +import run.halo.app.core.extension.RoleBinding; import run.halo.app.core.extension.RoleBinding.Subject; /** @@ -14,7 +15,11 @@ */ public interface RoleService { - Flux listRoleRefs(Subject subject); + Flux listRoleBindings(Subject subject); + + Flux getRolesByUsername(String username); + + Mono>> getRolesByUsernames(Collection usernames); Mono contains(Collection source, Collection candidates); @@ -29,5 +34,20 @@ public interface RoleService { Flux listDependenciesFlux(Set names); + /** + * List roles by role names. + * + * @param roleNames role names + * @return roles + */ Flux list(Set roleNames); + + /** + * List roles by role names. + * + * @param roleNames role names + * @param excludeHidden should exclude hidden roles + * @return roles + */ + Flux list(Set roleNames, boolean excludeHidden); } diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserService.java b/application/src/main/java/run/halo/app/core/extension/service/UserService.java index f7d8250006..f252d15360 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserService.java +++ b/application/src/main/java/run/halo/app/core/extension/service/UserService.java @@ -3,7 +3,6 @@ import java.util.Set; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import run.halo.app.core.extension.Role; import run.halo.app.core.extension.User; public interface UserService { @@ -16,8 +15,6 @@ public interface UserService { Mono updateWithRawPassword(String username, String rawPassword); - Flux listRoles(String username); - Mono grantRoles(String username, Set roles); Mono signUp(User user, String password); diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java b/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java index f81cbbf750..1924b37b21 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java @@ -2,15 +2,19 @@ import static org.springframework.data.domain.Sort.Order.asc; import static org.springframework.data.domain.Sort.Order.desc; -import static run.halo.app.core.extension.RoleBinding.containsUser; import static run.halo.app.extension.index.query.QueryFactory.equal; +import java.time.Clock; +import java.time.Duration; +import java.util.HashMap; import java.util.HashSet; import java.util.Objects; +import java.util.Optional; import java.util.Set; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.BooleanUtils; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.domain.Sort; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -21,6 +25,7 @@ import org.springframework.web.server.ServerWebInputException; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.RoleBinding; import run.halo.app.core.extension.User; @@ -48,11 +53,18 @@ public class UserServiceImpl implements UserService { private final ApplicationEventPublisher eventPublisher; + private final RoleService roleService; + + private Clock clock = Clock.systemUTC(); + + void setClock(Clock clock) { + this.clock = clock; + } + @Override public Mono getUser(String username) { return client.get(User.class, username) - .onErrorMap(ExtensionNotFoundException.class, - e -> new UserNotFoundException(username)); + .onErrorMap(ExtensionNotFoundException.class, e -> new UserNotFoundException(username)); } @Override @@ -91,22 +103,17 @@ public Mono updateWithRawPassword(String username, String rawPassword) { } @Override - public Flux listRoles(String name) { - return client.list(RoleBinding.class, containsUser(name), null) - .filter(roleBinding -> Role.KIND.equals(roleBinding.getRoleRef().getKind())) - .map(roleBinding -> roleBinding.getRoleRef().getName()) - .flatMap(roleName -> client.fetch(Role.class, roleName)); - } - - @Override - @Transactional public Mono grantRoles(String username, Set roles) { return client.get(User.class, username) .flatMap(user -> { var bindingsToUpdate = new HashSet(); var bindingsToDelete = new HashSet(); var existingRoles = new HashSet(); - return client.list(RoleBinding.class, RoleBinding.containsUser(username), null) + var subject = new RoleBinding.Subject(); + subject.setKind(User.KIND); + subject.setApiGroup(User.GROUP); + subject.setName(username); + return roleService.listRoleBindings(subject) .doOnNext(binding -> { var roleName = binding.getRoleRef().getName(); if (roles.contains(roleName)) { @@ -129,7 +136,13 @@ public Mono grantRoles(String username, Set roles) { return mutableRoles.stream() .map(roleName -> RoleBinding.create(username, roleName)); }).flatMap(client::create)) - .then(Mono.just(user)); + .then(Mono.defer(() -> { + var annotations = Optional.ofNullable(user.getMetadata().getAnnotations()) + .orElseGet(HashMap::new); + user.getMetadata().setAnnotations(annotations); + annotations.put(User.REQUEST_TO_UPDATE, clock.instant().toString()); + return client.update(user); + })); }); } @@ -184,7 +197,12 @@ public Mono createUser(User user, Set roleNames) { .then(); }) .then(Mono.defer(() -> client.create(user) - .flatMap(newUser -> grantRoles(user.getMetadata().getName(), roleNames))) + .flatMap(newUser -> grantRoles(user.getMetadata().getName(), roleNames) + .retryWhen( + Retry.backoff(5, Duration.ofMillis(100)) + .filter(OptimisticLockingFailureException.class::isInstance) + ) + )) ); } diff --git a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java index fbe4f77d0e..898627bff0 100644 --- a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java +++ b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java @@ -7,7 +7,9 @@ import static run.halo.app.extension.index.IndexAttributeFactory.simpleAttribute; import com.fasterxml.jackson.core.type.TypeReference; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -31,6 +33,7 @@ import run.halo.app.core.extension.Theme; import run.halo.app.core.extension.User; import run.halo.app.core.extension.UserConnection; +import run.halo.app.core.extension.UserConnection.UserConnectionSpec; import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.attachment.Group; import run.halo.app.core.extension.attachment.Policy; @@ -51,6 +54,7 @@ import run.halo.app.extension.ConfigMap; import run.halo.app.extension.DefaultSchemeManager; import run.halo.app.extension.DefaultSchemeWatcherManager; +import run.halo.app.extension.MetadataOperator; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.Secret; import run.halo.app.extension.index.IndexSpec; @@ -89,7 +93,22 @@ public void onApplicationEvent(@NonNull ApplicationContextInitializedEvent event )); }); - schemeManager.register(RoleBinding.class); + schemeManager.register(RoleBinding.class, is -> { + is.add(new IndexSpec() + .setName("roleRef.name") + .setIndexFunc(simpleAttribute(RoleBinding.class, + roleBinding -> roleBinding.getRoleRef().getName()) + ) + ); + is.add(new IndexSpec() + .setName("subjects") + .setIndexFunc(multiValueAttribute(RoleBinding.class, + roleBinding -> roleBinding.getSubjects().stream() + .map(RoleBinding.Subject::toString) + .collect(Collectors.toSet())) + ) + ); + }); schemeManager.register(User.class, indexSpecs -> { indexSpecs.add(new IndexSpec() .setName("spec.displayName") @@ -103,16 +122,16 @@ public void onApplicationEvent(@NonNull ApplicationContextInitializedEvent event }))); indexSpecs.add(new IndexSpec() .setName(User.USER_RELATED_ROLES_INDEX) - .setIndexFunc(multiValueAttribute(User.class, user -> { - var roleNamesAnno = MetadataUtil.nullSafeAnnotations(user) - .get(User.ROLE_NAMES_ANNO); - if (StringUtils.isBlank(roleNamesAnno)) { - return Set.of(); - } - return JsonUtils.jsonToObject(roleNamesAnno, - new TypeReference<>() { - }); - }))); + .setIndexFunc(multiValueAttribute(User.class, user -> + Optional.ofNullable(user.getMetadata()) + .map(MetadataOperator::getAnnotations) + .map(annotations -> annotations.get(User.ROLE_NAMES_ANNO)) + .filter(StringUtils::isNotBlank) + .map(rolesJson -> JsonUtils.jsonToObject(rolesJson, + new TypeReference>() { + }) + ) + .orElseGet(Set::of)))); }); schemeManager.register(ReverseProxy.class); schemeManager.register(Setting.class); @@ -453,7 +472,15 @@ public void onApplicationEvent(@NonNull ApplicationContextInitializedEvent event schemeManager.register(Counter.class); // auth.halo.run schemeManager.register(AuthProvider.class); - schemeManager.register(UserConnection.class); + schemeManager.register(UserConnection.class, is -> { + is.add(new IndexSpec() + .setName("spec.username") + .setIndexFunc(simpleAttribute(UserConnection.class, + connection -> Optional.ofNullable(connection.getSpec()) + .map(UserConnectionSpec::getUsername) + .orElse(null) + ))); + }); // security.halo.run schemeManager.register(PersonalAccessToken.class); diff --git a/application/src/main/java/run/halo/app/security/DefaultUserDetailService.java b/application/src/main/java/run/halo/app/security/DefaultUserDetailService.java index 9d9a63e9bb..b1bf1e5648 100644 --- a/application/src/main/java/run/halo/app/security/DefaultUserDetailService.java +++ b/application/src/main/java/run/halo/app/security/DefaultUserDetailService.java @@ -1,8 +1,6 @@ package run.halo.app.security; import static java.util.Objects.requireNonNullElse; -import static run.halo.app.core.extension.User.GROUP; -import static run.halo.app.core.extension.User.KIND; import static run.halo.app.security.authorization.AuthorityUtils.ANONYMOUS_ROLE_NAME; import static run.halo.app.security.authorization.AuthorityUtils.AUTHENTICATED_ROLE_NAME; import static run.halo.app.security.authorization.AuthorityUtils.ROLE_PREFIX; @@ -15,12 +13,8 @@ import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import reactor.core.publisher.Mono; -import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding.RoleRef; -import run.halo.app.core.extension.RoleBinding.Subject; import run.halo.app.core.extension.service.RoleService; import run.halo.app.core.extension.service.UserService; -import run.halo.app.extension.GroupKind; import run.halo.app.infra.exception.UserNotFoundException; import run.halo.app.security.authentication.login.HaloUser; import run.halo.app.security.authentication.twofactor.TwoFactorUtils; @@ -56,13 +50,10 @@ public Mono findByUsername(String username) { e -> new BadCredentialsException("Invalid Credentials")) .flatMap(user -> { var name = user.getMetadata().getName(); - var subject = new Subject(KIND, name, GROUP); var userBuilder = User.withUsername(name) .password(user.getSpec().getPassword()) .disabled(requireNonNullElse(user.getSpec().getDisabled(), false)); - var setAuthorities = roleService.listRoleRefs(subject) - .filter(this::isRoleRef) - .map(RoleRef::getName) + var setAuthorities = roleService.getRolesByUsername(name) // every authenticated user should have authenticated and anonymous roles. .concatWithValues(AUTHENTICATED_ROLE_NAME, ANONYMOUS_ROLE_NAME) .map(roleName -> new SimpleGrantedAuthority(ROLE_PREFIX + roleName)) @@ -82,12 +73,6 @@ public Mono findByUsername(String username) { }); } - private boolean isRoleRef(RoleRef roleRef) { - var roleGvk = new Role().groupVersionKind(); - var gk = new GroupKind(roleRef.getApiGroup(), roleRef.getKind()); - return gk.equals(roleGvk.groupKind()); - } - private UserDetails withNewPassword(UserDetails userDetails, String newPassword) { return User.withUserDetails(userDetails) .password(newPassword) diff --git a/application/src/main/java/run/halo/app/security/authorization/AuthorityUtils.java b/application/src/main/java/run/halo/app/security/authorization/AuthorityUtils.java index b4424be336..64460ea9c2 100644 --- a/application/src/main/java/run/halo/app/security/authorization/AuthorityUtils.java +++ b/application/src/main/java/run/halo/app/security/authorization/AuthorityUtils.java @@ -39,8 +39,11 @@ public static Set authoritiesToRoles( Collection authorities) { return authorities.stream() .map(GrantedAuthority::getAuthority) - .filter(authority -> StringUtils.startsWith(authority, ROLE_PREFIX)) - .map(authority -> StringUtils.removeStart(authority, ROLE_PREFIX)) + .map(authority -> { + authority = StringUtils.removeStart(authority, SCOPE_PREFIX); + authority = StringUtils.removeStart(authority, ROLE_PREFIX); + return authority; + }) .collect(Collectors.toSet()); } diff --git a/application/src/main/java/run/halo/app/security/authorization/DefaultRuleResolver.java b/application/src/main/java/run/halo/app/security/authorization/DefaultRuleResolver.java index 0ff51ae863..00cfdc14a2 100644 --- a/application/src/main/java/run/halo/app/security/authorization/DefaultRuleResolver.java +++ b/application/src/main/java/run/halo/app/security/authorization/DefaultRuleResolver.java @@ -1,14 +1,10 @@ package run.halo.app.security.authorization; -import java.util.Collection; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; import org.springframework.util.CollectionUtils; import reactor.core.publisher.Mono; import run.halo.app.core.extension.service.RoleService; @@ -30,7 +26,7 @@ public DefaultRuleResolver(RoleService roleService) { @Override public Mono visitRules(Authentication authentication, RequestInfo requestInfo) { - var roleNames = listBoundRoleNames(authentication.getAuthorities()); + var roleNames = AuthorityUtils.authoritiesToRoles(authentication.getAuthorities()); var record = new AttributesRecord(authentication, requestInfo); var visitor = new AuthorizingVisitor(record); @@ -75,15 +71,4 @@ String roleBindingDescriber(String roleName, String subject) { return String.format("Binding role [%s] to [%s]", roleName, subject); } - private static Set listBoundRoleNames( - Collection authorities) { - return authorities.stream() - .map(GrantedAuthority::getAuthority) - .map(authority -> { - authority = StringUtils.removeStart(authority, AuthorityUtils.SCOPE_PREFIX); - authority = StringUtils.removeStart(authority, AuthorityUtils.ROLE_PREFIX); - return authority; - }) - .collect(Collectors.toSet()); - } } diff --git a/application/src/test/java/run/halo/app/core/extension/RoleBindingTest.java b/application/src/test/java/run/halo/app/core/extension/RoleBindingTest.java index 1eca224629..cacf7ba2ed 100644 --- a/application/src/test/java/run/halo/app/core/extension/RoleBindingTest.java +++ b/application/src/test/java/run/halo/app/core/extension/RoleBindingTest.java @@ -1,5 +1,6 @@ package run.halo.app.core.extension; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -40,4 +41,20 @@ void shouldNotContainUserWhenBindingIsDeleted() { assertFalse(RoleBinding.containsUser("non-exist-fake-name").test(binding)); } + @Test + void subjectToStringTest() { + assertEquals("User/fake-name", createSubject("fake-name", "", "User").toString()); + assertEquals( + "fake.group/User/fake-name", + createSubject("fake-name", "fake.group", "User").toString() + ); + } + + RoleBinding.Subject createSubject(String name, String apiGroup, String kind) { + var subject = new RoleBinding.Subject(); + subject.setName(name); + subject.setApiGroup(apiGroup); + subject.setKind(kind); + return subject; + } } \ No newline at end of file diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java b/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java index 2535800900..b83f2f6db1 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java +++ b/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java @@ -6,6 +6,8 @@ import java.time.Instant; import java.util.List; +import java.util.Map; +import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -17,6 +19,7 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.User; import run.halo.app.core.extension.service.RoleService; @@ -46,7 +49,7 @@ void setUp() { .build(); var role = new Role(); role.setMetadata(new Metadata()); - role.getMetadata().setName("super-role"); + role.getMetadata().setName("fake-super-role"); role.setRules(List.of(rule)); when(roleService.listDependenciesFlux(anySet())).thenReturn(Flux.just(role)); webClient = webClient.mutateWith(csrf()); @@ -68,6 +71,9 @@ void shouldFilterUsersWhenDisplayNameKeywordProvided() { client.create(unexpectedUser2).block(); when(roleService.list(anySet())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsernames( + List.of("fake-user-2") + )).thenReturn(Mono.just(Map.of("fake-user-2", Set.of("fake-super-role")))); webClient.get().uri("/apis/api.console.halo.run/v1alpha1/users?keyword=Expected") .exchange() @@ -92,6 +98,8 @@ void shouldFilterUsersWhenUserNameKeywordProvided() { client.create(unexpectedUser2).block(); when(roleService.list(anySet())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsernames(List.of("fake-user"))) + .thenReturn(Mono.just(Map.of("fake-user", Set.of("fake-super-role")))); webClient.get().uri("/apis/api.console.halo.run/v1alpha1/users?keyword=fake-user") .exchange() diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java b/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java index 0b05a51a1b..9396cfe668 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java @@ -88,6 +88,8 @@ class UserListTest { @Test void shouldListEmptyUsersWhenNoUsers() { + when(roleService.getRolesByUsernames(any())).thenReturn(Mono.just(Map.of())); + when(roleService.list(any())).thenReturn(Flux.empty()); when(client.listBy(same(User.class), any(), any(PageRequest.class))) .thenReturn(Mono.just(ListResult.emptyResult())); @@ -109,6 +111,7 @@ void shouldListUsersWhenUserPresent() { createUser("fake-user-3") ); var expectResult = new ListResult<>(users); + when(roleService.getRolesByUsernames(any())).thenReturn(Mono.just(Map.of())); when(roleService.list(anySet())).thenReturn(Flux.empty()); when(client.listBy(same(User.class), any(), any(PageRequest.class))) .thenReturn(Mono.just(expectResult)); @@ -144,6 +147,7 @@ void shouldFilterUsersWhenRoleProvided() { var expectResult = new ListResult<>(users); when(client.listBy(same(User.class), any(), any(PageRequest.class))) .thenReturn(Mono.just(expectResult)); + when(roleService.getRolesByUsernames(any())).thenReturn(Mono.just(Map.of())); when(roleService.list(anySet())).thenReturn(Flux.empty()); bindToRouterFunction(endpoint.endpoint()) @@ -160,6 +164,7 @@ void shouldSortUsersWhenCreationTimestampSet() { var expectResult = new ListResult<>(List.of(expectUser)); when(client.listBy(same(User.class), any(), any(PageRequest.class))) .thenReturn(Mono.just(expectResult)); + when(roleService.getRolesByUsernames(any())).thenReturn(Mono.just(Map.of())); when(roleService.list(anySet())).thenReturn(Flux.empty()); bindToRouterFunction(endpoint.endpoint()) @@ -219,22 +224,19 @@ void shouldGetCurrentUserDetail() { metadata.setName("fake-user"); var user = new User(); user.setMetadata(metadata); - Map annotations = - Map.of(User.ROLE_NAMES_ANNO, JsonUtils.objectToJson(Set.of("role-A"))); - user.getMetadata().setAnnotations(annotations); when(userService.getUser("fake-user")).thenReturn(Mono.just(user)); Role role = new Role(); role.setMetadata(new Metadata()); - role.getMetadata().setName("role-A"); + role.getMetadata().setName("fake-super-role"); role.setRules(List.of()); - when(roleService.list(anySet())).thenReturn(Flux.just(role)); + when(roleService.list(Set.of("fake-super-role"), true)).thenReturn(Flux.just(role)); webClient.get().uri("/users/-") .exchange() .expectStatus().isOk() .expectHeader().contentType(MediaType.APPLICATION_JSON) .expectBody(UserEndpoint.DetailedUser.class) .isEqualTo(new UserEndpoint.DetailedUser(user, List.of(role))); - verify(roleService).list(eq(Set.of("role-A"))); + // verify(roleService).list(eq(Set.of("role-A"))); } } @@ -385,16 +387,17 @@ void shouldGetPermission() { "metadata": { "name": "test-A", "annotations": { - "rbac.authorization.halo.run/ui-permissions": "[\\"permission-A\\"]" + "rbac.authorization.halo.run/ui-permissions": \ + "[\\"permission-A\\", \\"permission-A\\"]" } }, "rules": [] } """, Role.class); when(roleService.listPermissions(eq(Set.of("test-A")))).thenReturn(Flux.just(roleA)); - when(userService.listRoles(eq("fake-user"))).thenReturn( - Flux.fromIterable(List.of(roleA))); when(roleService.listDependenciesFlux(anySet())).thenReturn(Flux.just(roleA)); + when(roleService.getRolesByUsername("fake-user")).thenReturn(Flux.just("test-A")); + when(roleService.list(Set.of("test-A"), true)).thenReturn(Flux.just(roleA)); webClient.get().uri("/users/fake-user/permissions") .exchange() @@ -402,12 +405,10 @@ void shouldGetPermission() { .isOk() .expectBody(UserEndpoint.UserPermission.class) .value(userPermission -> { - assertEquals(Set.of(roleA), userPermission.getRoles()); + assertEquals(List.of(roleA), userPermission.getRoles()); assertEquals(List.of(roleA), userPermission.getPermissions()); - assertEquals(Set.of("permission-A"), userPermission.getUiPermissions()); + assertEquals(List.of("permission-A"), userPermission.getUiPermissions()); }); - - verify(userService, times(1)).listRoles(eq("fake-user")); } } diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/RoleBindingReconcilerTest.java b/application/src/test/java/run/halo/app/core/extension/reconciler/RoleBindingReconcilerTest.java deleted file mode 100644 index 6608509475..0000000000 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/RoleBindingReconcilerTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package run.halo.app.core.extension.reconciler; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.same; -import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static run.halo.app.core.extension.User.ROLE_NAMES_ANNO; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import run.halo.app.core.extension.RoleBinding; -import run.halo.app.core.extension.RoleBinding.RoleRef; -import run.halo.app.core.extension.RoleBinding.Subject; -import run.halo.app.core.extension.User; -import run.halo.app.extension.ExtensionClient; -import run.halo.app.extension.Metadata; -import run.halo.app.extension.controller.Reconciler; -import run.halo.app.extension.controller.Reconciler.Result; - -@ExtendWith(MockitoExtension.class) -class RoleBindingReconcilerTest { - - @Mock - ExtensionClient client; - - @InjectMocks - RoleBindingReconciler reconciler; - - final Result doNotReEnQueue = new Result(false, null); - - @Test - void shouldDoNothingIfRequestNotFound() { - var bindingName = "fake-binding-name"; - when(client.fetch(RoleBinding.class, bindingName)) - .thenReturn(Optional.empty()); - - var result = reconciler.reconcile(new Reconciler.Request(bindingName)); - assertEquals(doNotReEnQueue, result); - - verify(client, times(1)).fetch(same(RoleBinding.class), anyString()); - verify(client, never()).list(same(RoleBinding.class), any(), any()); - verify(client, never()).fetch(same(User.class), anyString()); - verify(client, never()).update(isA(User.class)); - } - - @Test - void shouldDoNothingIfNotContainAnyUserSubject() { - var bindingName = "fake-binding-name"; - var binding = mock(RoleBinding.class); - - when(client.fetch(RoleBinding.class, bindingName)) - .thenReturn(Optional.of(binding)); - when(binding.getSubjects()).thenReturn(List.of()); - - var result = reconciler.reconcile(new Reconciler.Request(bindingName)); - assertEquals(doNotReEnQueue, result); - - verify(client, times(1)).fetch(same(RoleBinding.class), anyString()); - verify(client, never()).list(same(RoleBinding.class), any(), any()); - verify(client, never()).fetch(same(User.class), anyString()); - verify(client, never()).update(isA(User.class)); - } - - @Test - void shouldDoNothingIfUserNotFound() { - var bindingName = "fake-binding-name"; - var userName = "fake-user-name"; - var binding = mock(RoleBinding.class); - var subject = mock(Subject.class); - - when(client.fetch(RoleBinding.class, bindingName)) - .thenReturn(Optional.of(binding)); - when(binding.getSubjects()).thenReturn(List.of(subject)); - when(subject.getKind()).thenReturn("User"); - when(subject.getName()).thenReturn(userName); - when(client.fetch(User.class, userName)).thenReturn(Optional.empty()); - - var result = reconciler.reconcile(new Reconciler.Request(bindingName)); - assertEquals(doNotReEnQueue, result); - - verify(client, times(1)).fetch(same(RoleBinding.class), anyString()); - verify(client, times(1)).list(same(RoleBinding.class), any(), any()); - verify(client, times(1)).fetch(same(User.class), eq(userName)); - - verify(client, never()).update(isA(User.class)); - } - - @Test - void shouldUpdateRoleNamesIfNoBindingRelatedTheUser() { - var bindingName = "fake-binding-name"; - var userName = "fake-user-name"; - var subject = mock(Subject.class); - var binding = createRoleBinding("Role", "fake-role", false, subject); - var user = mock(User.class); - var userMetadata = mock(Metadata.class); - - when(client.fetch(RoleBinding.class, bindingName)) - .thenReturn(Optional.of(binding)); - when(binding.getSubjects()).thenReturn(List.of(subject)); - when(subject.getKind()).thenReturn("User"); - when(subject.getName()).thenReturn(userName); - when(client.fetch(User.class, userName)).thenReturn(Optional.of(user)); - when(user.getMetadata()).thenReturn(userMetadata); - when(client.list(same(RoleBinding.class), any(), any())).thenReturn(List.of()); - - var result = reconciler.reconcile(new Reconciler.Request(bindingName)); - assertEquals(doNotReEnQueue, result); - - verify(client, times(1)).fetch(same(RoleBinding.class), anyString()); - verify(client, times(1)).list(same(RoleBinding.class), any(), any()); - verify(client, times(1)).fetch(same(User.class), anyString()); - verify(client, times(1)).update(isA(User.class)); - - verify(userMetadata).setAnnotations(argThat(annotation -> { - String roleNames = annotation.get(ROLE_NAMES_ANNO); - return roleNames != null && roleNames.equals("[]"); - })); - } - - @Test - void shouldUpdateRoleNames() { - var bindingName = "fake-binding-name"; - var userName = "fake-user-name"; - var subject = mock(Subject.class); - when(subject.getKind()).thenReturn("User"); - when(subject.getName()).thenReturn(userName); - when(subject.getApiGroup()).thenReturn(""); - - var user = mock(User.class); - var userMetadata = mock(Metadata.class); - var binding = createRoleBinding("Role", "fake-role", false, subject); - - when(client.fetch(RoleBinding.class, bindingName)) - .thenReturn(Optional.of(binding)); - when(binding.getSubjects()).thenReturn(List.of(subject)); - - when(client.fetch(User.class, userName)).thenReturn(Optional.of(user)); - when(user.getMetadata()).thenReturn(userMetadata); - var bindings = List.of( - createRoleBinding("Role", "fake-role-01", false, subject), - createRoleBinding("Role", "fake-role-03", false, subject), - createRoleBinding("Role", "fake-role-02", false, subject), - createRoleBinding("NotRole", "fake-role-04", false, subject), - createRoleBinding("Role", "fake-role-05", true, subject) - ); - when(client.list(same(RoleBinding.class), any(), any())).thenReturn(bindings); - - var result = reconciler.reconcile(new Reconciler.Request(bindingName)); - assertEquals(doNotReEnQueue, result); - - verify(client, times(1)).fetch(same(RoleBinding.class), anyString()); - verify(client, times(1)).list(same(RoleBinding.class), any(), any()); - verify(client, times(1)).fetch(same(User.class), anyString()); - verify(client, times(1)).update(isA(User.class)); - - verify(userMetadata).setAnnotations(argThat(annotation -> { - var roleNames = annotation.get(ROLE_NAMES_ANNO); - return roleNames != null && roleNames.equals(""" - ["fake-role-01","fake-role-02","fake-role-03"]"""); - })); - } - - RoleBinding createRoleBinding(String roleRefKind, - String roleRefName, - boolean deleting, - Subject subject) { - var binding = mock(RoleBinding.class); - var roleRef = mock(RoleRef.class); - var metadata = mock(Metadata.class); - lenient().when(roleRef.getKind()).thenReturn(roleRefKind); - lenient().when(roleRef.getName()).thenReturn(roleRefName); - lenient().when(roleRef.getApiGroup()).thenReturn(""); - lenient().when(metadata.getDeletionTimestamp()).thenReturn(deleting ? Instant.now() : null); - lenient().when(binding.getRoleRef()).thenReturn(roleRef); - lenient().when(binding.getMetadata()).thenReturn(metadata); - lenient().when(binding.getSubjects()).thenReturn(List.of(subject)); - return binding; - } - -} diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java b/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java index 4782dced77..f54997d698 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java @@ -1,14 +1,12 @@ package run.halo.app.core.extension.reconciler; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.assertArg; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static run.halo.app.core.extension.User.GROUP; -import static run.halo.app.core.extension.User.KIND; import java.net.URI; import java.net.URISyntaxException; @@ -17,14 +15,11 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding; import run.halo.app.core.extension.User; import run.halo.app.core.extension.service.RoleService; import run.halo.app.extension.ExtensionClient; @@ -60,58 +55,51 @@ class UserReconcilerTest { @BeforeEach void setUp() { lenient().when(notificationCenter.unsubscribe(any(), any())).thenReturn(Mono.empty()); - lenient().when(roleService.listRoleRefs(any())).thenReturn(Flux.empty()); } @Test void permalinkForFakeUser() throws URISyntaxException { when(externalUrlSupplier.get()).thenReturn(new URI("http://localhost:8090")); + when(roleService.getRolesByUsername("fake-user")) + .thenReturn(Flux.empty()); + when(client.fetch(eq(User.class), eq("fake-user"))) .thenReturn(Optional.of(user("fake-user"))); userReconciler.reconcile(new Reconciler.Request("fake-user")); - verify(client, times(4)).update(any(User.class)); - ArgumentCaptor captor = ArgumentCaptor.forClass(User.class); - verify(client, times(4)).update(captor.capture()); - assertThat(captor.getValue().getStatus().getPermalink()) - .isEqualTo("http://localhost:8090/authors/fake-user"); + verify(client).update(assertArg(user -> + assertEquals( + "http://localhost:8090/authors/fake-user", + user.getStatus().getPermalink() + ) + )); } @Test void permalinkForAnonymousUser() { when(client.fetch(eq(User.class), eq(AnonymousUserConst.PRINCIPAL))) .thenReturn(Optional.of(user(AnonymousUserConst.PRINCIPAL))); + when(roleService.getRolesByUsername(AnonymousUserConst.PRINCIPAL)).thenReturn(Flux.empty()); userReconciler.reconcile(new Reconciler.Request(AnonymousUserConst.PRINCIPAL)); - verify(client, times(3)).update(any(User.class)); + verify(client).update(any(User.class)); } @Test void ensureRoleNamesAnno() { - RoleBinding.RoleRef roleRef = new RoleBinding.RoleRef(); - roleRef.setName("fake-role"); - roleRef.setKind(Role.KIND); - - roleRef.setApiGroup(Role.GROUP); - RoleBinding.RoleRef notworkRef = new RoleBinding.RoleRef(); - notworkRef.setName("super-role"); - notworkRef.setKind("Fake"); - notworkRef.setApiGroup("fake.halo.run"); - - RoleBinding.Subject subject = new RoleBinding.Subject(KIND, "fake-user", GROUP); - when(roleService.listRoleRefs(eq(subject))).thenReturn(Flux.just(roleRef, notworkRef)); - + when(roleService.getRolesByUsername("fake-user")).thenReturn(Flux.just("fake-role")); when(client.fetch(eq(User.class), eq("fake-user"))) .thenReturn(Optional.of(user("fake-user"))); - when(externalUrlSupplier.get()).thenReturn(URI.create("/")); userReconciler.reconcile(new Reconciler.Request("fake-user")); - ArgumentCaptor captor = ArgumentCaptor.forClass(User.class); - verify(client, times(4)).update(captor.capture()); - User user = captor.getAllValues().get(1); - assertThat(user.getMetadata().getAnnotations().get(User.ROLE_NAMES_ANNO)) - .isEqualTo("[\"fake-role\"]"); + + verify(client).update(assertArg(user -> { + assertEquals(""" + ["fake-role"]\ + """, + user.getMetadata().getAnnotations().get(User.ROLE_NAMES_ANNO)); + })); } User user(String name) { diff --git a/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java b/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java index 33d0997859..b2ca0f179e 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java +++ b/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java @@ -1,7 +1,6 @@ package run.halo.app.core.extension.service; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; @@ -22,10 +21,12 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Sort; import reactor.core.publisher.Flux; import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.RoleBinding; +import run.halo.app.extension.ListOptions; import run.halo.app.extension.Metadata; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.utils.JsonUtils; @@ -39,7 +40,7 @@ @ExtendWith(MockitoExtension.class) class DefaultRoleServiceTest { @Mock - private ReactiveExtensionClient extensionClient; + private ReactiveExtensionClient client; @InjectMocks private DefaultRoleService roleService; @@ -56,7 +57,7 @@ void listDependencies() { var roleNames = Set.of("role1"); - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role1)) .thenReturn(Flux.just(role2)) .thenReturn(Flux.just(role3)) @@ -73,7 +74,11 @@ void listDependencies() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(4)).list(same(Role.class), any(), any()); + verify(client, times(4)).listAll( + same(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test @@ -86,7 +91,7 @@ void listDependenciesWithCycle() { var roleNames = Set.of("role1"); // setup mocks - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role1)) .thenReturn(Flux.just(role2)) .thenReturn(Flux.just(role3)) @@ -103,7 +108,11 @@ void listDependenciesWithCycle() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(4)).list(same(Role.class), any(), any()); + verify(client, times(4)).listAll( + same(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test @@ -118,13 +127,12 @@ void listDependenciesWithMiddleCycle() { var roleNames = Set.of("role1"); - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role1)) .thenReturn(Flux.just(role2)) .thenReturn(Flux.just(role3)) .thenReturn(Flux.just(role4)) - .thenReturn(Flux.empty()) - ; + .thenReturn(Flux.empty()); // call the method under test var result = roleService.listDependenciesFlux(roleNames); @@ -138,7 +146,11 @@ void listDependenciesWithMiddleCycle() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(5)).list(same(Role.class), any(), any()); + verify(client, times(5)).listAll( + same(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test @@ -153,7 +165,7 @@ void listDependenciesWithCycleAndSequence() { Set roleNames = Set.of("role1"); - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role1)) .thenReturn(Flux.just(role4, role2)) .thenReturn(Flux.just(role3)) @@ -171,7 +183,7 @@ void listDependenciesWithCycleAndSequence() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(4)).list(same(Role.class), any(), any()); + verify(client, times(4)).listAll(same(Role.class), any(), any()); } @Test @@ -186,7 +198,7 @@ void listDependenciesAfterCycle() { Set roleNames = Set.of("role2"); - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role2)) .thenReturn(Flux.just(role3)) .thenReturn(Flux.empty()); @@ -201,17 +213,17 @@ void listDependenciesAfterCycle() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(3)).list(same(Role.class), any(), any()); + verify(client, times(3)).listAll( + same(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test void listDependenciesWithNullParam() { var result = roleService.listDependenciesFlux(null); - when(extensionClient.list(same(Role.class), any(), any())) - .thenReturn(Flux.empty()) - .thenReturn(Flux.empty()); - // verify the result StepVerifier.create(result) .verifyComplete(); @@ -221,7 +233,11 @@ void listDependenciesWithNullParam() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, never()).fetch(eq(Role.class), anyString()); + verify(client, never()).listAll( + eq(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test @@ -232,7 +248,7 @@ void listDependenciesAndSomeOneNotFound() { var roleNames = Set.of("role1"); - when(extensionClient.list(same(Role.class), any(), any())) + when(client.listAll(same(Role.class), any(ListOptions.class), any(Sort.class))) .thenReturn(Flux.just(role1)) .thenReturn(Flux.just(role2)) .thenReturn(Flux.just(role4)) @@ -248,7 +264,11 @@ void listDependenciesAndSomeOneNotFound() { .verifyComplete(); // verify the mock invocations - verify(extensionClient, times(4)).list(same(Role.class), any(), any()); + verify(client, times(4)).listAll( + same(Role.class), + any(ListOptions.class), + any(Sort.class) + ); } @Test diff --git a/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java b/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java index d1de208a4e..8b63e0435c 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java @@ -8,9 +8,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -19,7 +17,6 @@ import static org.mockito.Mockito.when; import static run.halo.app.extension.GroupVersionKind.fromExtension; -import java.util.List; import java.util.Set; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -35,6 +32,7 @@ import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.RoleBinding; +import run.halo.app.core.extension.RoleBinding.Subject; import run.halo.app.core.extension.User; import run.halo.app.event.user.PasswordChangedEvent; import run.halo.app.extension.Metadata; @@ -45,7 +43,6 @@ import run.halo.app.infra.exception.AccessDeniedException; import run.halo.app.infra.exception.DuplicateNameException; import run.halo.app.infra.exception.UserNotFoundException; -import run.halo.app.infra.utils.JsonUtils; @ExtendWith(MockitoExtension.class) class UserServiceImplTest { @@ -62,6 +59,9 @@ class UserServiceImplTest { @Mock ApplicationEventPublisher eventPublisher; + @Mock + RoleService roleService; + @InjectMocks UserServiceImpl userService; @@ -108,119 +108,6 @@ void shouldUpdatePasswordIfUserFoundInExtension() { verify(eventPublisher).publishEvent(any(PasswordChangedEvent.class)); } - @Test - void shouldListRolesIfUserFoundInExtension() { - User fakeUser = new User(); - Metadata metadata = new Metadata(); - metadata.setName("faker"); - fakeUser.setMetadata(metadata); - fakeUser.setSpec(new User.UserSpec()); - - when(client.list(eq(RoleBinding.class), any(), any())).thenReturn( - Flux.fromIterable(getRoleBindings())); - Role roleA = new Role(); - Metadata metadataA = new Metadata(); - metadataA.setName("test-A"); - roleA.setMetadata(metadataA); - - Role roleB = new Role(); - Metadata metadataB = new Metadata(); - metadataB.setName("test-B"); - roleB.setMetadata(metadataB); - - Role roleC = new Role(); - Metadata metadataC = new Metadata(); - metadataC.setName("ddd"); - roleC.setMetadata(metadataC); - - when(client.fetch(eq(Role.class), eq("test-A"))).thenReturn(Mono.just(roleA)); - when(client.fetch(eq(Role.class), eq("test-B"))).thenReturn(Mono.just(roleB)); - lenient().when(client.fetch(eq(Role.class), eq("ddd"))).thenReturn(Mono.just(roleC)); - - StepVerifier.create(userService.listRoles("faker")) - .expectNext(roleA) - .expectNext(roleB) - .verifyComplete(); - - verify(client, times(1)).list(eq(RoleBinding.class), any(), any()); - - verify(client, times(1)).fetch(eq(Role.class), eq("test-A")); - verify(client, times(1)).fetch(eq(Role.class), eq("test-B")); - verify(client, times(0)).fetch(eq(Role.class), eq("ddd")); - } - - List getRoleBindings() { - String bindA = """ - { - - "apiVersion": "v1alpha1", - "kind": "RoleBinding", - "metadata": { - "name": "bind-A" - }, - "subjects": [{ - "kind": "User", - "name": "faker", - "apiGroup": "" - }], - "roleRef": { - "kind": "Role", - "name": "test-A", - "apiGroup": "" - } - } - """; - - String bindB = """ - { - - "apiVersion": "v1alpha1", - "kind": "RoleBinding", - "metadata": { - "name": "bind-B" - }, - "subjects": [{ - "kind": "User", - "name": "faker", - "apiGroup": "" - }, - { - "kind": "User", - "name": "zhangsan", - "apiGroup": "" - }], - "roleRef": { - "kind": "Role", - "name": "test-B", - "apiGroup": "" - } - } - """; - - String bindC = """ - { - "apiVersion": "v1alpha1", - "kind": "RoleBinding", - "metadata": { - "name": "bind-C" - }, - "subjects": [{ - "kind": "User", - "name": "faker", - "apiGroup": "" - }], - "roleRef": { - "kind": "Fake", - "name": "ddd", - "apiGroup": "" - } - } - """; - return List.of(JsonUtils.jsonToObject(bindA, RoleBinding.class), - JsonUtils.jsonToObject(bindB, RoleBinding.class), - JsonUtils.jsonToObject(bindC, RoleBinding.class)); - } - @Nested @DisplayName("UpdateWithRawPassword") class UpdateWithRawPasswordTest { @@ -312,6 +199,9 @@ void shouldThrowExceptionIfUserNotFound() { User createUser(String password) { var user = new User(); + Metadata metadata = new Metadata(); + metadata.setName("fake-user"); + user.setMetadata(metadata); user.setSpec(new User.UserSpec()); user.getSpec().setPassword(password); return user; @@ -336,46 +226,47 @@ void shouldGetNotFoundIfUserNotFound() { @Test void shouldCreateRoleBindingIfNotExist() { + var user = createUser("fake-password"); when(client.get(User.class, "fake-user")) - .thenReturn(Mono.just(createUser("fake-password"))); - when(client.list(same(RoleBinding.class), any(), any())).thenReturn(Flux.empty()); + .thenReturn(Mono.just(user)); + when(roleService.listRoleBindings(any(Subject.class))).thenReturn(Flux.empty()); when(client.create(isA(RoleBinding.class))).thenReturn( Mono.just(mock(RoleBinding.class))); + when(client.update(user)).thenReturn(Mono.just(user)); var grantRolesMono = userService.grantRoles("fake-user", Set.of("fake-role")); StepVerifier.create(grantRolesMono) .expectNextCount(1) .verifyComplete(); - verify(client).get(User.class, "fake-user"); - verify(client).list(same(RoleBinding.class), any(), any()); verify(client).create(isA(RoleBinding.class)); } @Test void shouldDeleteRoleBindingIfNotProvided() { - when(client.get(User.class, "fake-user")).thenReturn(Mono.just(mock(User.class))); + var user = createUser("fake-password"); + when(client.get(User.class, "fake-user")).thenReturn(Mono.just(user)); var notProvidedRoleBinding = RoleBinding.create("fake-user", "non-provided-fake-role"); var existingRoleBinding = RoleBinding.create("fake-user", "fake-role"); - when(client.list(same(RoleBinding.class), any(), any())).thenReturn( - Flux.fromIterable(List.of(notProvidedRoleBinding, existingRoleBinding))); + when(roleService.listRoleBindings(any(Subject.class))) + .thenReturn(Flux.just(notProvidedRoleBinding, existingRoleBinding)); when(client.delete(isA(RoleBinding.class))) .thenReturn(Mono.just(mock(RoleBinding.class))); + when(client.update(user)).thenReturn(Mono.just(user)); StepVerifier.create(userService.grantRoles("fake-user", Set.of("fake-role"))) .expectNextCount(1) .verifyComplete(); - verify(client).get(User.class, "fake-user"); - verify(client).list(same(RoleBinding.class), any(), any()); verify(client).delete(notProvidedRoleBinding); } @Test void shouldUpdateRoleBindingIfExists() { - when(client.get(User.class, "fake-user")).thenReturn(Mono.just(mock(User.class))); + var user = createUser("fake-password"); + when(client.get(User.class, "fake-user")).thenReturn(Mono.just(user)); // add another subject - var anotherSubject = new RoleBinding.Subject(); + var anotherSubject = new Subject(); anotherSubject.setName("another-fake-user"); anotherSubject.setKind(User.KIND); anotherSubject.setApiGroup(User.GROUP); @@ -384,17 +275,16 @@ void shouldUpdateRoleBindingIfExists() { var existingRoleBinding = RoleBinding.create("fake-user", "fake-role"); - when(client.list(same(RoleBinding.class), any(), any())).thenReturn( - Flux.fromIterable(List.of(notProvidedRoleBinding, existingRoleBinding))); + when(roleService.listRoleBindings(any(Subject.class))) + .thenReturn(Flux.just(notProvidedRoleBinding, existingRoleBinding)); when(client.update(isA(RoleBinding.class))) .thenReturn(Mono.just(mock(RoleBinding.class))); + when(client.update(user)).thenReturn(Mono.just(user)); StepVerifier.create(userService.grantRoles("fake-user", Set.of("fake-role"))) .expectNextCount(1) .verifyComplete(); - verify(client).get(User.class, "fake-user"); - verify(client).list(same(RoleBinding.class), any(), any()); verify(client).update(notProvidedRoleBinding); } } diff --git a/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java b/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java index 58aa4fea11..123f4362b6 100644 --- a/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java +++ b/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -24,8 +23,6 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.RoleBinding.RoleRef; -import run.halo.app.core.extension.RoleBinding.Subject; import run.halo.app.core.extension.service.RoleService; import run.halo.app.core.extension.service.UserService; import run.halo.app.extension.Metadata; @@ -85,17 +82,8 @@ void shouldReturnErrorWhenFailedToUpdatePassword() { void shouldFindUserDetailsByExistingUsername() { var foundUser = createFakeUser(); - var roleGvk = new Role().groupVersionKind(); - var roleRef = new RoleRef(); - roleRef.setKind(roleGvk.kind()); - roleRef.setApiGroup(roleGvk.group()); - roleRef.setName("fake-role"); - - var userGvk = foundUser.groupVersionKind(); - var subject = new Subject(userGvk.kind(), "faker", userGvk.group()); - when(userService.getUser("faker")).thenReturn(Mono.just(foundUser)); - when(roleService.listRoleRefs(subject)).thenReturn(Flux.just(roleRef)); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.just("fake-role")); var userDetailsMono = userDetailService.findByUsername("faker"); @@ -115,7 +103,7 @@ void shouldFindUserDetailsByExistingUsername() { void shouldFindHaloUserDetailsWith2faDisabledWhen2faNotEnabled() { var fakeUser = createFakeUser(); when(userService.getUser("faker")).thenReturn(Mono.just(fakeUser)); - when(roleService.listRoleRefs(any())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.empty()); userDetailService.findByUsername("faker") .as(StepVerifier::create) .assertNext(userDetails -> { @@ -130,7 +118,7 @@ void shouldFindHaloUserDetailsWith2faDisabledWhen2faEnabledButNoTotpConfigured() var fakeUser = createFakeUser(); fakeUser.getSpec().setTwoFactorAuthEnabled(true); when(userService.getUser("faker")).thenReturn(Mono.just(fakeUser)); - when(roleService.listRoleRefs(any())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.empty()); userDetailService.findByUsername("faker") .as(StepVerifier::create) .assertNext(userDetails -> { @@ -146,7 +134,7 @@ void shouldFindHaloUserDetailsWith2faEnabledWhen2faEnabledAndTotpConfigured() { fakeUser.getSpec().setTwoFactorAuthEnabled(true); fakeUser.getSpec().setTotpEncryptedSecret("fake-totp-encrypted-secret"); when(userService.getUser("faker")).thenReturn(Mono.just(fakeUser)); - when(roleService.listRoleRefs(any())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.empty()); userDetailService.findByUsername("faker") .as(StepVerifier::create) .assertNext(userDetails -> { @@ -163,7 +151,7 @@ void shouldFindHaloUserDetailsWith2faDisabledWhen2faDisabledGlobally() { fakeUser.getSpec().setTwoFactorAuthEnabled(true); fakeUser.getSpec().setTotpEncryptedSecret("fake-totp-encrypted-secret"); when(userService.getUser("faker")).thenReturn(Mono.just(fakeUser)); - when(roleService.listRoleRefs(any())).thenReturn(Flux.empty()); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.empty()); userDetailService.findByUsername("faker") .as(StepVerifier::create) .assertNext(userDetails -> { @@ -173,50 +161,14 @@ void shouldFindHaloUserDetailsWith2faDisabledWhen2faDisabledGlobally() { .verifyComplete(); } - @Test - void shouldFindUserDetailsByExistingUsernameButKindOfRoleRefIsNotRole() { - var foundUser = createFakeUser(); - - var roleRef = new RoleRef(); - roleRef.setKind("FakeRole"); - roleRef.setApiGroup("fake.halo.run"); - roleRef.setName("fake-role"); - - var userGvk = foundUser.groupVersionKind(); - var subject = new Subject(userGvk.kind(), "faker", userGvk.group()); - - when(userService.getUser("faker")).thenReturn(Mono.just(foundUser)); - when(roleService.listRoleRefs(subject)).thenReturn(Flux.just(roleRef)); - - var userDetailsMono = userDetailService.findByUsername("faker"); - - StepVerifier.create(userDetailsMono) - .expectSubscription() - .assertNext(gotUser -> { - assertEquals(foundUser.getMetadata().getName(), gotUser.getUsername()); - assertEquals(foundUser.getSpec().getPassword(), gotUser.getPassword()); - assertEquals(2, gotUser.getAuthorities().size()); - assertEquals( - Set.of("ROLE_anonymous", "ROLE_authenticated"), - authorityListToSet(gotUser.getAuthorities()) - ); - }) - .verifyComplete(); - } - @Test void shouldFindUserDetailsByExistingUsernameButWithoutAnyRoles() { var foundUser = createFakeUser(); - var userGvk = foundUser.groupVersionKind(); - var subject = new Subject(userGvk.kind(), "faker", userGvk.group()); - when(userService.getUser("faker")).thenReturn(Mono.just(foundUser)); - when(roleService.listRoleRefs(subject)).thenReturn(Flux.empty()); - - var userDetailsMono = userDetailService.findByUsername("faker"); + when(roleService.getRolesByUsername("faker")).thenReturn(Flux.empty()); - StepVerifier.create(userDetailsMono) + StepVerifier.create(userDetailService.findByUsername("faker")) .expectSubscription() .assertNext(gotUser -> { assertEquals(foundUser.getMetadata().getName(), gotUser.getUsername()); @@ -240,6 +192,13 @@ void shouldNotFindUserDetailsByNonExistingUsername() { .verify(); } + Role createRole(String roleName) { + var role = new Role(); + role.setMetadata(new Metadata()); + role.getMetadata().setName(roleName); + return role; + } + UserDetails createFakeUserDetails() { return User.builder() .username("faker") diff --git a/application/src/test/java/run/halo/app/security/authorization/AuthorityUtilsTest.java b/application/src/test/java/run/halo/app/security/authorization/AuthorityUtilsTest.java index 4ac5082d3d..f9266434b0 100644 --- a/application/src/test/java/run/halo/app/security/authorization/AuthorityUtilsTest.java +++ b/application/src/test/java/run/halo/app/security/authorization/AuthorityUtilsTest.java @@ -29,7 +29,7 @@ void authoritiesToRolesTest() { var roles = authoritiesToRoles(authorities); - assertEquals(Set.of("admin", "owner", "manager"), roles); + assertEquals(Set.of("admin", "owner", "manager", "faker", "system:read"), roles); } @Test From 3460d4c94bea4b92a8fc21628b026de5f2df5d0f Mon Sep 17 00:00:00 2001 From: JohnNiang Date: Wed, 21 Aug 2024 11:45:49 +0800 Subject: [PATCH 5/6] Add support for restoring from backup root Signed-off-by: JohnNiang --- api-docs/openapi/v3_0/aggregated.json | 142 ++++++++++++------ .../v3_0/apis_console.api_v1alpha1.json | 110 ++++++++++++++ .../run/halo/app/migration/BackupFile.java | 34 +++++ .../halo/app/migration/MigrationEndpoint.java | 81 +++++++--- .../halo/app/migration/MigrationService.java | 16 ++ .../migration/impl/MigrationServiceImpl.java | 55 ++++++- .../extensions/role-template-migration.yaml | 18 ++- .../impl/MigrationServiceImplTest.java | 62 ++++++++ 8 files changed, 444 insertions(+), 74 deletions(-) create mode 100644 application/src/main/java/run/halo/app/migration/BackupFile.java diff --git a/api-docs/openapi/v3_0/aggregated.json b/api-docs/openapi/v3_0/aggregated.json index b2ef456a47..ec15fbc3df 100644 --- a/api-docs/openapi/v3_0/aggregated.json +++ b/api-docs/openapi/v3_0/aggregated.json @@ -5239,55 +5239,6 @@ ] } }, - "/apis/api.console.migration.halo.run/v1alpha1/backups/{name}/files/{filename}": { - "get": { - "operationId": "DownloadBackups", - "parameters": [ - { - "description": "Backup name.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Backup filename.", - "in": "path", - "name": "filename", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": {}, - "tags": [ - "MigrationV1alpha1Console" - ] - } - }, - "/apis/api.console.migration.halo.run/v1alpha1/restorations": { - "post": { - "description": "Restore backup by uploading file or providing download link or backup name.", - "operationId": "RestoreBackup", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/RestoreRequest" - } - } - }, - "required": true - }, - "responses": {}, - "tags": [ - "MigrationV1alpha1Console" - ] - } - }, "/apis/api.content.halo.run/v1alpha1/categories": { "get": { "description": "Lists categories.", @@ -7411,6 +7362,79 @@ ] } }, + "/apis/console.api.migration.halo.run/v1alpha1/backup-files": { + "get": { + "description": "Get backup files from backup root.", + "operationId": "getBackupFiles", + "responses": { + "default": { + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BackupFile" + } + } + } + }, + "description": "default response" + } + }, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, + "/apis/console.api.migration.halo.run/v1alpha1/backups/{name}/files/{filename}": { + "get": { + "operationId": "DownloadBackups", + "parameters": [ + { + "description": "Backup name.", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Backup filename.", + "in": "path", + "name": "filename", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, + "/apis/console.api.migration.halo.run/v1alpha1/restorations": { + "post": { + "description": "Restore backup by uploading file or providing download link or backup name.", + "operationId": "RestoreBackup", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/RestoreRequest" + } + } + }, + "required": true + }, + "responses": {}, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, "/apis/console.api.notification.halo.run/v1alpha1/notifiers/default-email-notifier/verify-connection": { "post": { "description": "Verify email sender config.", @@ -15300,6 +15324,22 @@ } } }, + "BackupFile": { + "type": "object", + "properties": { + "filename": { + "type": "string" + }, + "lastModifiedTime": { + "type": "string", + "format": "date-time" + }, + "size": { + "type": "integer", + "format": "int64" + } + } + }, "BackupList": { "required": [ "first", @@ -20684,6 +20724,10 @@ "file": { "type": "string", "format": "binary" + }, + "filename": { + "type": "string", + "description": "Filename of backup file in backups root." } } }, diff --git a/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json b/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json index 595b83bd13..b91a91f734 100644 --- a/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json +++ b/api-docs/openapi/v3_0/apis_console.api_v1alpha1.json @@ -3106,6 +3106,79 @@ ] } }, + "/apis/console.api.migration.halo.run/v1alpha1/backup-files": { + "get": { + "description": "Get backup files from backup root.", + "operationId": "getBackupFiles", + "responses": { + "default": { + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BackupFile" + } + } + } + }, + "description": "default response" + } + }, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, + "/apis/console.api.migration.halo.run/v1alpha1/backups/{name}/files/{filename}": { + "get": { + "operationId": "DownloadBackups", + "parameters": [ + { + "description": "Backup name.", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Backup filename.", + "in": "path", + "name": "filename", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, + "/apis/console.api.migration.halo.run/v1alpha1/restorations": { + "post": { + "description": "Restore backup by uploading file or providing download link or backup name.", + "operationId": "RestoreBackup", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/RestoreRequest" + } + } + }, + "required": true + }, + "responses": {}, + "tags": [ + "MigrationV1alpha1Console" + ] + } + }, "/apis/console.api.notification.halo.run/v1alpha1/notifiers/default-email-notifier/verify-connection": { "post": { "description": "Verify email sender config.", @@ -3376,6 +3449,22 @@ } } }, + "BackupFile": { + "type": "object", + "properties": { + "filename": { + "type": "string" + }, + "lastModifiedTime": { + "type": "string", + "format": "date-time" + }, + "size": { + "type": "integer", + "format": "int64" + } + } + }, "Category": { "required": [ "apiVersion", @@ -5405,6 +5494,27 @@ } } }, + "RestoreRequest": { + "type": "object", + "properties": { + "backupName": { + "type": "string", + "description": "Backup metadata name." + }, + "downloadUrl": { + "type": "string", + "description": "Remote backup HTTP URL." + }, + "file": { + "type": "string", + "format": "binary" + }, + "filename": { + "type": "string", + "description": "Filename of backup file in backups root." + } + } + }, "RevertSnapshotForPostParam": { "required": [ "snapshotName" diff --git a/application/src/main/java/run/halo/app/migration/BackupFile.java b/application/src/main/java/run/halo/app/migration/BackupFile.java new file mode 100644 index 0000000000..83fdda72cd --- /dev/null +++ b/application/src/main/java/run/halo/app/migration/BackupFile.java @@ -0,0 +1,34 @@ +package run.halo.app.migration; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.nio.file.Path; +import java.time.Instant; +import lombok.Data; + +/** + * Backup file. + * + * @author johnniang + */ +@Data +public class BackupFile { + + @JsonIgnore + private Path path; + + /** + * Filename of backup file. + */ + private String filename; + + /** + * Size of backup file. + */ + private long size; + + /** + * Last modified time of backup file. + */ + private Instant lastModifiedTime; + +} diff --git a/application/src/main/java/run/halo/app/migration/MigrationEndpoint.java b/application/src/main/java/run/halo/app/migration/MigrationEndpoint.java index 83b6d339a9..10abf9851e 100644 --- a/application/src/main/java/run/halo/app/migration/MigrationEndpoint.java +++ b/application/src/main/java/run/halo/app/migration/MigrationEndpoint.java @@ -1,6 +1,7 @@ package run.halo.app.migration; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; +import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder; @@ -12,10 +13,12 @@ import java.net.URISyntaxException; import java.net.URL; import java.util.Optional; +import java.util.function.Supplier; import org.springdoc.webflux.core.fn.SpringdocRouteBuilder; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.data.util.Optionals; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.codec.multipart.FilePart; @@ -24,7 +27,9 @@ import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.util.StreamUtils; +import org.springframework.util.StringUtils; import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.ServerWebInputException; import reactor.core.publisher.Flux; @@ -55,6 +60,15 @@ public MigrationEndpoint(MigrationService migrationService, public RouterFunction endpoint() { var tag = "MigrationV1alpha1Console"; return SpringdocRouteBuilder.route() + .GET("/backup-files", + this::getBackups, + builder -> builder.operationId("getBackupFiles") + .tag(tag) + .description("Get backup files from backup root.") + .response(responseBuilder() + .implementationArray(BackupFile.class) + ) + ) .GET("/backups/{name}/files/{filename}", request -> { var name = request.pathVariable("name"); @@ -86,7 +100,7 @@ public RouterFunction endpoint() { var content = getContent(restoreRequest) .switchIfEmpty(Mono.error(() -> new ServerWebInputException( "Please upload a file " - + "or provide a download link or backup name."))); + + "or provide a download link or backup name."))); return migrationService.restore(content); }) .then(Mono.defer( @@ -95,7 +109,7 @@ public RouterFunction endpoint() { builder -> builder .tag(tag) .description("Restore backup by uploading file " - + "or providing download link or backup name.") + + "or providing download link or backup name.") .operationId("RestoreBackup") .requestBody(requestBodyBuilder() .required(true) @@ -108,8 +122,22 @@ public RouterFunction endpoint() { .build(); } + private Mono getBackups(ServerRequest request) { + var backupFiles = migrationService.getBackupFiles(); + return ServerResponse.ok().body(backupFiles, BackupFile.class); + } + private Flux getContent(RestoreRequest request) { - var downloadContent = request.getDownloadUrl() + Supplier>> contentFromFilename = () -> + request.getFilename().map(filename -> migrationService.getBackupFile(filename) + .map(BackupFile::getPath) + .flatMapMany( + path -> DataBufferUtils.read( + path, + DefaultDataBufferFactory.sharedInstance, + StreamUtils.BUFFER_SIZE))); + + Supplier>> contentFromDownloadUrl = () -> request.getDownloadUrl() .map(downloadURL -> { try { var url = new URL(downloadURL); @@ -121,23 +149,27 @@ private Flux getContent(RestoreRequest request) { // Should never happen return Flux.error(e); } - }) - .orElseGet(Flux::empty); + }); - var uploadContent = request.getFile() - .map(Part::content) - .orElseGet(Flux::empty); + Supplier>> contentFromUpload = () -> request.getFile() + .map(Part::content); - var backupFileContent = request.getBackupName() + Supplier>> contentFromBackupName = () -> request.getBackupName() .map(backupName -> client.get(Backup.class, backupName) .flatMap(migrationService::download) .flatMapMany(resource -> DataBufferUtils.read(resource, DefaultDataBufferFactory.sharedInstance, - StreamUtils.BUFFER_SIZE))) - .orElseGet(Flux::empty); - return uploadContent - .switchIfEmpty(downloadContent) - .switchIfEmpty(backupFileContent); + StreamUtils.BUFFER_SIZE))); + + return Optionals.firstNonEmpty( + contentFromUpload, + contentFromDownloadUrl, + contentFromBackupName, + contentFromFilename + ) + .orElseGet(() -> Flux.error(new ServerWebInputException(""" + Please upload a file or provide a download link or backup name or backup filename.\ + """))); } @Schema(types = "object") @@ -157,13 +189,26 @@ public Optional getFile() { return Optional.empty(); } + @Schema(requiredMode = NOT_REQUIRED, name = "filename", description = """ + Filename of backup file in backups root.\ + """) + public Optional getFilename() { + var part = multipart.getFirst("filename"); + if (part instanceof FormFieldPart filenamePart) { + return Optional.of(filenamePart.value()) + .filter(StringUtils::hasText); + } + return Optional.empty(); + } + @Schema(requiredMode = NOT_REQUIRED, name = "downloadUrl", description = "Remote backup HTTP URL.") public Optional getDownloadUrl() { var part = multipart.getFirst("downloadUrl"); if (part instanceof FormFieldPart downloadUrlPart) { - return Optional.of(downloadUrlPart.value()); + return Optional.of(downloadUrlPart.value()) + .filter(StringUtils::hasText); } return Optional.empty(); } @@ -174,16 +219,16 @@ public Optional getDownloadUrl() { public Optional getBackupName() { var part = multipart.getFirst("backupName"); if (part instanceof FormFieldPart backupNamePart) { - return Optional.of(backupNamePart.value()); + return Optional.of(backupNamePart.value()) + .filter(StringUtils::hasText); } return Optional.empty(); } } - @Override public GroupVersion groupVersion() { return GroupVersion.parseAPIVersion( - "api.console." + Constant.GROUP + "/" + Constant.VERSION); + "console.api." + Constant.GROUP + "/" + Constant.VERSION); } } diff --git a/application/src/main/java/run/halo/app/migration/MigrationService.java b/application/src/main/java/run/halo/app/migration/MigrationService.java index 5a87cb8326..4639e31be7 100644 --- a/application/src/main/java/run/halo/app/migration/MigrationService.java +++ b/application/src/main/java/run/halo/app/migration/MigrationService.java @@ -3,6 +3,7 @@ import org.reactivestreams.Publisher; import org.springframework.core.io.Resource; import org.springframework.core.io.buffer.DataBuffer; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public interface MigrationService { @@ -21,4 +22,19 @@ public interface MigrationService { */ Mono cleanup(Backup backup); + /** + * Gets backup files. + * + * @return backup files, sorted by last modified time. + */ + Flux getBackupFiles(); + + /** + * Get backup file by filename. + * + * @param filename filename of backup file + * @return backup file or empty if file is not found + */ + Mono getBackupFile(String filename); + } diff --git a/application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java b/application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java index 9e3a668bab..6d21b50bad 100644 --- a/application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java +++ b/application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java @@ -1,6 +1,8 @@ package run.halo.app.migration.impl; import static java.nio.file.Files.deleteIfExists; +import static java.util.Comparator.comparing; +import static org.apache.commons.io.FilenameUtils.isExtension; import static org.springframework.util.FileSystemUtils.copyRecursively; import static run.halo.app.infra.utils.FileUtils.checkDirectoryTraversal; import static run.halo.app.infra.utils.FileUtils.copyRecursively; @@ -19,8 +21,10 @@ import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.Set; +import java.util.stream.BaseStream; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; +import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.core.io.buffer.DataBuffer; @@ -40,11 +44,12 @@ import run.halo.app.infra.properties.HaloProperties; import run.halo.app.infra.utils.FileUtils; import run.halo.app.migration.Backup; +import run.halo.app.migration.BackupFile; import run.halo.app.migration.MigrationService; @Slf4j @Service -public class MigrationServiceImpl implements MigrationService { +public class MigrationServiceImpl implements MigrationService, InitializingBean { private final ExtensionStoreRepository repository; @@ -163,6 +168,49 @@ public Mono cleanup(Backup backup) { }).subscribeOn(scheduler); } + @Override + public Flux getBackupFiles() { + return Flux.using( + () -> Files.list(getBackupsRoot()), + Flux::fromStream, + BaseStream::close + ) + .filter(Files::isRegularFile) + .filter(Files::isReadable) + .filter(path -> isExtension(path.getFileName().toString(), "zip")) + .map(this::toBackupFile) + .sort(comparing(BackupFile::getLastModifiedTime).reversed() + .thenComparing(BackupFile::getFilename) + ) + .subscribeOn(this.scheduler); + } + + @Override + public Mono getBackupFile(String filename) { + return Mono.fromCallable(() -> { + var backupsRoot = getBackupsRoot(); + var backupFilePath = backupsRoot.resolve(filename); + checkDirectoryTraversal(backupsRoot, backupFilePath); + if (Files.notExists(backupFilePath)) { + return null; + } + return toBackupFile(backupFilePath); + }).subscribeOn(this.scheduler); + } + + private BackupFile toBackupFile(Path path) { + var backupFile = new BackupFile(); + backupFile.setPath(path); + backupFile.setFilename(path.getFileName().toString()); + try { + backupFile.setSize(Files.size(path)); + backupFile.setLastModifiedTime(Files.getLastModifiedTime(path).toInstant()); + return backupFile; + } catch (IOException e) { + throw Exceptions.propagate(e); + } + } + private Mono restoreWorkdir(Path backupRoot) { return Mono.create(sink -> { try { @@ -264,4 +312,9 @@ private Mono backupExtensions(Path baseDir) { FileUtils::closeQuietly)) .subscribeOn(scheduler); } + + @Override + public void afterPropertiesSet() throws Exception { + Files.createDirectories(getBackupsRoot()); + } } diff --git a/application/src/main/resources/extensions/role-template-migration.yaml b/application/src/main/resources/extensions/role-template-migration.yaml index 860081223f..6edc1c8ffc 100644 --- a/application/src/main/resources/extensions/role-template-migration.yaml +++ b/application/src/main/resources/extensions/role-template-migration.yaml @@ -10,9 +10,15 @@ metadata: rbac.authorization.halo.run/ui-permissions: | ["system:migrations:manage"] rules: - - apiGroups: ["api.console.migration.halo.run"] - resources: ["restorations"] - verbs: ["create"] - - apiGroups: ["migration.halo.run"] - resources: ["backups"] - verbs: ["list", "get", "create", "update", "delete"] + - apiGroups: [ "console.api.migration.halo.run" ] + resources: [ "restorations" ] + verbs: [ "create" ] + - apiGroups: [ "console.api.migration.halo.run" ] + resources: [ "backup-files" ] + verbs: [ "list" ] + - apiGroups: [ "console.api.migration.halo.run" ] + resources: [ "backups/files" ] + verbs: [ "get" ] + - apiGroups: [ "migration.halo.run" ] + resources: [ "backups" ] + verbs: [ "list", "get", "create", "update", "delete", "patch" ] diff --git a/application/src/test/java/run/halo/app/migration/impl/MigrationServiceImplTest.java b/application/src/test/java/run/halo/app/migration/impl/MigrationServiceImplTest.java index 808ae0c656..e515e02c65 100644 --- a/application/src/test/java/run/halo/app/migration/impl/MigrationServiceImplTest.java +++ b/application/src/test/java/run/halo/app/migration/impl/MigrationServiceImplTest.java @@ -14,6 +14,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.FileTime; +import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.zip.ZipInputStream; @@ -198,6 +200,66 @@ void downloadBackupWhichDoesNotExist() { verify(backupRoot).get(); } + @Test + void getBackupFilesTest() throws Exception { + var now = Instant.now(); + var backup1 = tempDir.resolve("backup1.zip"); + Files.writeString(backup1, "fake-content"); + Files.setLastModifiedTime(backup1, FileTime.from(now)); + + var backup2 = tempDir.resolve("backup2.zip"); + Files.writeString(backup2, "fake--content"); + Files.setLastModifiedTime( + backup2, + FileTime.from(now.plus(Duration.ofSeconds(1))) + ); + + var backup3 = tempDir.resolve("backup3.not-a-zip"); + Files.writeString(backup3, "fake-content"); + Files.setLastModifiedTime( + backup3, + FileTime.from(now.plus(Duration.ofSeconds(2))) + ); + when(backupRoot.get()).thenReturn(tempDir); + + migrationService.afterPropertiesSet(); + migrationService.getBackupFiles() + .as(StepVerifier::create) + .assertNext(backupFile -> { + assertEquals("backup2.zip", backupFile.getFilename()); + assertEquals(13, backupFile.getSize()); + assertEquals(now.plus(Duration.ofSeconds(1)), backupFile.getLastModifiedTime()); + }) + .assertNext(backupFile -> { + assertEquals("backup1.zip", backupFile.getFilename()); + assertEquals(12, backupFile.getSize()); + assertEquals(now, backupFile.getLastModifiedTime()); + }) + .verifyComplete(); + } + + @Test + void getBackupFileTest() throws Exception { + var now = Instant.now(); + Files.writeString(tempDir.resolve("backup.zip"), "fake-content"); + Files.setLastModifiedTime(tempDir.resolve("backup.zip"), FileTime.from(now)); + when(backupRoot.get()).thenReturn(tempDir); + + migrationService.afterPropertiesSet(); + migrationService.getBackupFile("backup.zip") + .as(StepVerifier::create) + .assertNext(backupFile -> { + assertEquals("backup.zip", backupFile.getFilename()); + assertEquals(12, backupFile.getSize()); + assertEquals(now, backupFile.getLastModifiedTime()); + }) + .verifyComplete(); + + migrationService.getBackupFile("backup-not-exist.zip") + .as(StepVerifier::create) + .verifyComplete(); + } + Backup createSucceededBackup(String name, String filename) { var metadata = new Metadata(); metadata.setName(name); From 6cd8dc85550c41f5ffd539f2b984e31c4ea72a91 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Wed, 21 Aug 2024 11:46:30 +0800 Subject: [PATCH 6/6] Adapt console for restoring from backup root Signed-off-by: JohnNiang --- .../modules/system/backup/tabs/Restore.vue | 60 ++++++++---- .../api-client/src/.openapi-generator/FILES | 1 + .../src/api/migration-v1alpha1-console-api.ts | 95 +++++++++++++++++-- .../api-client/src/models/backup-file.ts | 42 ++++++++ ui/packages/api-client/src/models/index.ts | 1 + ui/src/locales/en.yaml | 15 ++- ui/src/locales/zh-CN.yaml | 5 +- ui/src/locales/zh-TW.yaml | 5 +- 8 files changed, 189 insertions(+), 35 deletions(-) create mode 100644 ui/packages/api-client/src/models/backup-file.ts diff --git a/ui/console-src/modules/system/backup/tabs/Restore.vue b/ui/console-src/modules/system/backup/tabs/Restore.vue index e671172fa4..ba8a580fc8 100644 --- a/ui/console-src/modules/system/backup/tabs/Restore.vue +++ b/ui/console-src/modules/system/backup/tabs/Restore.vue @@ -1,11 +1,13 @@