From c6dfd3494ed0846a21b47e1c161064ec8204fb77 Mon Sep 17 00:00:00 2001 From: VK <112831093+vkozio@users.noreply.github.com> Date: Fri, 9 Aug 2024 19:15:04 +0300 Subject: [PATCH] fix(core): 18520 auth fixes and refactors (#819) * implemented end session flow via endpoint * automatic logout only on 401 from dedicated request to token endpoint * refresh token during authClient init, all requests will use fresh token from app start * extracted token management from apiClient to OidcSimpleClient, * authClientInstance is OidcSimpleClient now, AuthClient and irrelevant code removed, necessary methods are used directly * adjusted naming in auth-related code to align more with standarts and existing solutions * move ~core/auth/types to ~core/app/types as it has app-related types * simplify and streamline init flow, remove unecessary atoms dependencies, reduce early activation issues * reduce reactive usage of featureFlags * add Suspense with preloader in view hierarchy to keep sidebar visible during loading, fixes (19141) * map adapter: removed heavy react-dom/server dependency (~50kb in bundle) and unused or irrelevant code * drop date-fns in favor of native function --- .eslintrc.json | 4 +- package.json | 55 +- pnpm-lock.yaml | 2368 ++++++++--------- src/boot.ts | 34 +- .../ConnectedMap/map-libre-adapter/index.tsx | 136 +- src/core/api/features.ts | 2 +- src/core/apiClientInstance.ts | 14 +- src/core/api_client/apiClient.ts | 331 +-- .../api_client/tests/_clientTestsContext.ts | 26 +- .../api_client/tests/authorization.test.ts | 4 +- src/core/api_client/types.ts | 10 +- src/core/api_client/utils.ts | 21 + src/core/app/authHooks.ts | 4 - src/core/app/postAppInit.ts | 8 +- src/core/{auth => app}/types.ts | 10 - src/core/{auth/atoms => app}/userWasLanded.ts | 3 +- src/core/auth/OidcSimpleClient.ts | 299 +++ src/core/auth/client/AuthClient.ts | 87 - src/core/auth/index.ts | 2 - src/core/authClientInstance.ts | 7 +- src/core/config/index.ts | 5 +- src/core/config/loaders/stageConfigLoader.ts | 2 +- src/core/config/types.ts | 5 +- .../draw_tools/atoms/temporaryGeometryAtom.ts | 8 +- src/core/metrics/app-metrics.ts | 2 +- src/core/metrics/constants.ts | 3 +- src/core/metrics/types.ts | 2 +- src/core/pages/index.tsx | 63 +- src/core/postInit.ts | 9 - src/core/router/components/Router.tsx | 10 +- src/core/router/routes.tsx | 2 +- src/core/router/types.ts | 2 +- src/core/shared_state/featureFlags.ts | 15 +- src/core/store/store.ts | 8 +- src/core/url_store/readInitialUrl.ts | 3 - .../atoms/analyticsResource.ts | 2 +- .../atoms/currentEventGeometry.ts | 2 +- .../events_list/atoms/eventListResource.ts | 2 +- .../components/EventCard/EventCard.tsx | 3 +- .../components/EventsPanel/EventsPanel.tsx | 2 +- .../atoms/llmAnalyticsResource.ts | 2 +- src/types/entry.ts | 10 +- .../getRequirements.ts | 3 +- src/views/About/About.tsx | 1 + src/views/CommonView.tsx | 3 +- src/views/Map/Layouts/Desktop/Desktop.tsx | 11 +- src/views/Map/Layouts/Laptop/Laptop.tsx | 9 +- src/views/Map/Layouts/Layout.tsx | 19 +- src/views/Map/Layouts/Mobile/Mobile.tsx | 9 +- src/views/Map/Map.tsx | 25 +- src/views/Map/SmartColumn/SmartColumn.tsx | 4 +- src/vite-env.d.ts | 18 + 52 files changed, 1664 insertions(+), 2025 deletions(-) create mode 100644 src/core/api_client/utils.ts rename src/core/{auth => app}/types.ts (87%) rename src/core/{auth/atoms => app}/userWasLanded.ts (79%) create mode 100644 src/core/auth/OidcSimpleClient.ts delete mode 100644 src/core/auth/client/AuthClient.ts delete mode 100644 src/core/auth/index.ts delete mode 100644 src/core/postInit.ts diff --git a/.eslintrc.json b/.eslintrc.json index 35ca470be..d77f3cfff 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -41,7 +41,9 @@ "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/ban-ts-comment": "warn", "react/react-in-jsx-scope": "off", - "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "warn", + "no-unused-expressions": "off", + "@typescript-eslint/no-unused-expressions": "warn", "@typescript-eslint/explicit-module-boundary-types": "off", "react/jsx-filename-extension": [ "warn", diff --git a/package.json b/package.json index 40dfce95c..1269fbdb6 100644 --- a/package.json +++ b/package.json @@ -94,15 +94,16 @@ "@nebula.gl/layers": "1.1.0-alpha.5", "@paypal/react-paypal-js": "^8.5.0", "@reatom/async": "^3.15.2", - "@reatom/core": "^3.8.3", + "@reatom/core": "^3.9.0", "@reatom/core-v2": "^3.1.4", "@reatom/hooks": "^3.5.5", "@reatom/logger": "^3.8.4", "@reatom/npm-react": "^3.8.10", "@reatom/react-v2": "^3.1.2", - "@sentry/react": "^7.113.0", - "@slack/web-api": "^7.0.4", - "@testing-library/react": "^14.2.1", + "@sentry/react": "^8.18.0", + "@slack/web-api": "^7.3.1", + "@testing-library/dom": "^10.3.2", + "@testing-library/react": "^16.0.0", "@turf/area": "6.5.0", "@turf/bbox": "^6.5.0", "@turf/centroid": "^6.5.0", @@ -115,7 +116,7 @@ "@types/d3-interpolate": "^3.0.4", "@types/file-saver": "^2.0.7", "@types/geojson": "^7946.0.14", - "@types/node": "^20.14.9", + "@types/node": "^20.14.11", "@types/papaparse": "^5.3.14", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.22", @@ -124,19 +125,18 @@ "@types/react-transition-group": "^4.4.10", "@types/sinon": "^17.0.3", "@types/w3c-generic-sensor": "^1.0.9", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "@typescript-eslint/parser": "^6.20.0", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", "@uiw/react-github-corners": "1.5.16", "@vitejs/plugin-react": "^4.3.1", - "@vitest/coverage-v8": "^1.6.0", - "ajv": "^8.16.0", - "autoprefixer": "^10.4.19", + "@vitest/coverage-v8": "^2.0.5", + "ajv": "^8.17.1", + "autoprefixer": "^10.4.20", "bundle-size-diff": "github:konturio/bundle-size-diff#v1.0.7", "clsx": "^1.2.1", "cpr": "^3.0.1", "d3-color": "^3.1.0", "d3-interpolate": "^3.0.1", - "date-fns": "^2.30.0", "dependency-cruiser": "^15.5.0", "dnd-core": "^16.0.1", "emoji-regex": "^10.3.0", @@ -145,22 +145,23 @@ "eslint-plugin-i18n-checker": "^1.4.0", "eslint-plugin-i18n-json": "^4.0.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "file-saver": "^2.0.5", "geojson-polygon-self-intersections": "^1.2.1", "gettext-parser": "^8.0.0", - "happy-dom": "^12.10.3", + "happy-dom": "^14.12.3", "hash-wasm": "^4.11.0", "history": "^5.3.0", "hsluv": "^1.0.1", "i18next": "^22.5.1", "i18next-browser-languagedetector": "^7.2.0", "i18next-conv": "14.0.0", - "i18next-scanner": "^4.4.0", + "i18next-scanner": "^4.5.0", "jwt-decode": "^4.0.0", - "lint-staged": "^15.2.7", + "lint-staged": "^15.2.8", "maplibre-gl": "^3.6.2", + "markdown-to-jsx": "^7.4.7", "mdast": "^3.0.0", "mdast-util-from-markdown": "^2.0.1", "minimist": "^1.2.8", @@ -170,7 +171,7 @@ "papaparse": "^5.4.1", "patch-package": "^8.0.0", "postcss-custom-media": "^8.0.2", - "postcss-nested": "^6.0.1", + "postcss-nested": "^6.2.0", "postcss-normalize": "^10.0.1", "prettier": "^3.2.5", "react": "^18.2.0", @@ -184,29 +185,27 @@ "react-lazily": "^0.9.2", "react-markdown": "^8.0.7", "react-promise-suspense": "^0.3.4", - "react-router": "^6.24.1", - "react-router-dom": "^6.24.1", + "react-router": "^6.25.1", + "react-router-dom": "^6.25.1", "react-transition-group": "^4.4.5", - "react-virtuoso": "^4.7.11", - "remark-gfm": "^3.0.1", + "react-virtuoso": "^4.9.0", "rollup-plugin-visualizer": "^5.12.0", - "sinon": "^17.0.1", + "sinon": "^18.0.0", "stylelint": "^16.2.1", "stylelint-config-recommended": "^14.0.1", - "superstruct": "^1.0.4", "surge": "^0.23.1", "ts-json-schema-generator": "^2.3.0", - "tsx": "^4.15.7", - "typescript": "5.4.5", + "tsx": "^4.17.0", + "typescript": "5.5.3", "typescript-plugin-css-modules": "^5.1.0", "uhtml": "^4.5.9", "utility-types": "^3.11.0", "vi-fetch": "^0.8.0", - "vite": "~5.3.3", + "vite": "~5.4.0", "vite-plugin-html": "^3.2.2", "vite-plugin-mkcert": "^1.17.5", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.6.0", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.0.5", "wretch": "^2.9.0" }, "devDependencies": { @@ -219,7 +218,7 @@ "open-cli": "^7.2.0", "playwright-slack-report": "^1.1.81", "prompts": "^2.4.2", - "semver": "^7.6.0" + "semver": "^7.6.3" }, "pnpm": { "patchedDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03b44601a..40ac85d5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,7 +66,7 @@ importers: version: 1.1.0-alpha.5 '@nebula.gl/layers': specifier: 1.1.0-alpha.5 - version: 1.1.0-alpha.5(@deck.gl/core@8.9.33)(@deck.gl/extensions@8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3))(@deck.gl/geo-layers@8.9.33(@deck.gl/core@8.9.33)(@deck.gl/extensions@8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3))(@deck.gl/layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/core@3.4.14)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.14)(@loaders.gl/gltf@3.4.14)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/core@3.4.14)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) + version: 1.1.0-alpha.5(fe5wxxh3m5buw4hujpm5qvmhei) '@paypal/react-paypal-js': specifier: ^8.5.0 version: 8.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -74,8 +74,8 @@ importers: specifier: ^3.15.2 version: 3.15.2 '@reatom/core': - specifier: ^3.8.3 - version: 3.8.3 + specifier: ^3.9.0 + version: 3.9.0 '@reatom/core-v2': specifier: ^3.1.4 version: 3.1.4 @@ -92,14 +92,17 @@ importers: specifier: ^3.1.2 version: 3.1.2(@reatom/core-v2@3.1.4)(react@18.2.0) '@sentry/react': - specifier: ^7.113.0 - version: 7.113.0(react@18.2.0) + specifier: ^8.18.0 + version: 8.18.0(react@18.2.0) '@slack/web-api': - specifier: ^7.0.4 - version: 7.2.0 + specifier: ^7.3.1 + version: 7.3.1 + '@testing-library/dom': + specifier: ^10.3.2 + version: 10.3.2 '@testing-library/react': - specifier: ^14.2.1 - version: 14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^16.0.0 + version: 16.0.0(@testing-library/dom@10.3.2)(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@turf/area': specifier: 6.5.0 version: 6.5.0 @@ -137,8 +140,8 @@ importers: specifier: ^7946.0.14 version: 7946.0.14 '@types/node': - specifier: ^20.14.9 - version: 20.14.9 + specifier: ^20.14.11 + version: 20.14.11 '@types/papaparse': specifier: ^5.3.14 version: 5.3.14 @@ -164,26 +167,26 @@ importers: specifier: ^1.0.9 version: 1.0.9 '@typescript-eslint/eslint-plugin': - specifier: ^6.20.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + specifier: ^8.0.1 + version: 8.0.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': - specifier: ^6.20.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^8.0.1 + version: 8.0.1(eslint@8.57.0)(typescript@5.5.3) '@uiw/react-github-corners': specifier: 1.5.16 version: 1.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) + version: 4.3.1(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) '@vitest/coverage-v8': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.14.9)(happy-dom@12.10.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@20.14.11)(happy-dom@14.12.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) ajv: - specifier: ^8.16.0 - version: 8.16.0 + specifier: ^8.17.1 + version: 8.17.1 autoprefixer: - specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.35) + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.35) bundle-size-diff: specifier: github:konturio/bundle-size-diff#v1.0.7 version: https://codeload.github.com/konturio/bundle-size-diff/tar.gz/ebf38b6154eedbab942eb1f234ac918840e9938b(encoding@0.1.13) @@ -199,9 +202,6 @@ importers: d3-interpolate: specifier: ^3.0.1 version: 3.0.1 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 dependency-cruiser: specifier: ^15.5.0 version: 15.5.0 @@ -216,7 +216,7 @@ importers: version: 8.57.0 eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-i18n-checker: specifier: ^1.4.0 version: 1.4.0(eslint@8.57.0) @@ -225,10 +225,10 @@ importers: version: 4.0.0(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-react: - specifier: ^7.34.3 - version: 7.34.3(eslint@8.57.0) + specifier: ^7.35.0 + version: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: specifier: ^4.6.2 version: 4.6.2(eslint@8.57.0) @@ -242,8 +242,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 happy-dom: - specifier: ^12.10.3 - version: 12.10.3 + specifier: ^14.12.3 + version: 14.12.3 hash-wasm: specifier: ^4.11.0 version: 4.11.0 @@ -263,17 +263,20 @@ importers: specifier: 14.0.0 version: 14.0.0 i18next-scanner: - specifier: ^4.4.0 - version: 4.4.0 + specifier: ^4.5.0 + version: 4.5.0 jwt-decode: specifier: ^4.0.0 version: 4.0.0 lint-staged: - specifier: ^15.2.7 - version: 15.2.7 + specifier: ^15.2.8 + version: 15.2.8 maplibre-gl: specifier: ^3.6.2 version: 3.6.2 + markdown-to-jsx: + specifier: ^7.4.7 + version: 7.4.7(react@18.2.0) mdast: specifier: ^3.0.0 version: 3.0.0 @@ -302,11 +305,11 @@ importers: specifier: ^8.0.2 version: 8.0.2(postcss@8.4.35) postcss-nested: - specifier: ^6.0.1 - version: 6.0.1(postcss@8.4.35) + specifier: ^6.2.0 + version: 6.2.0(postcss@8.4.35) postcss-normalize: specifier: ^10.0.1 - version: 10.0.1(browserslist@4.23.0)(postcss@8.4.35) + version: 10.0.1(browserslist@4.23.3)(postcss@8.4.35) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -321,7 +324,7 @@ importers: version: 5.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(webpack@5.91.0) react-dnd: specifier: ^16.0.1 - version: 16.0.1(@types/node@20.14.9)(@types/react@18.2.65)(react@18.2.0) + version: 16.0.1(@types/node@20.14.11)(@types/react@18.2.65)(react@18.2.0) react-dnd-html5-backend: specifier: ^16.0.1 version: 16.0.1 @@ -344,35 +347,29 @@ importers: specifier: ^0.3.4 version: 0.3.4 react-router: - specifier: ^6.24.1 - version: 6.24.1(react@18.2.0) + specifier: ^6.25.1 + version: 6.25.1(react@18.2.0) react-router-dom: - specifier: ^6.24.1 - version: 6.24.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^6.25.1 + version: 6.25.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-transition-group: specifier: ^4.4.5 version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-virtuoso: - specifier: ^4.7.11 - version: 4.7.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^4.9.0 + version: 4.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rollup-plugin-visualizer: specifier: ^5.12.0 version: 5.12.0(rollup@4.17.2) sinon: - specifier: ^17.0.1 - version: 17.0.1 + specifier: ^18.0.0 + version: 18.0.0 stylelint: specifier: ^16.2.1 - version: 16.2.1(typescript@5.4.5) + version: 16.2.1(typescript@5.5.3) stylelint-config-recommended: specifier: ^14.0.1 - version: 14.0.1(stylelint@16.2.1(typescript@5.4.5)) - superstruct: - specifier: ^1.0.4 - version: 1.0.4 + version: 14.0.1(stylelint@16.2.1(typescript@5.5.3)) surge: specifier: ^0.23.1 version: 0.23.1 @@ -380,14 +377,14 @@ importers: specifier: ^2.3.0 version: 2.3.0 tsx: - specifier: ^4.15.7 - version: 4.15.7 + specifier: ^4.17.0 + version: 4.17.0 typescript: - specifier: 5.4.5 - version: 5.4.5 + specifier: 5.5.3 + version: 5.5.3 typescript-plugin-css-modules: specifier: ^5.1.0 - version: 5.1.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.4.5))(typescript@5.4.5) + version: 5.1.0(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))(typescript@5.5.3) uhtml: specifier: ^4.5.9 version: 4.5.9 @@ -398,20 +395,20 @@ importers: specifier: ^0.8.0 version: 0.8.0 vite: - specifier: ~5.3.3 - version: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + specifier: ~5.4.0 + version: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) + version: 3.2.2(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) vite-plugin-mkcert: specifier: ^1.17.5 - version: 1.17.5(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) + version: 1.17.5(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) + specifier: ^5.0.1 + version: 5.0.1(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.9)(happy-dom@12.10.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + specifier: ^2.0.5 + version: 2.0.5(@types/node@20.14.11)(happy-dom@14.12.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) wretch: specifier: ^2.9.0 version: 2.9.0 @@ -439,13 +436,13 @@ importers: version: 7.2.0 playwright-slack-report: specifier: ^1.1.81 - version: 1.1.81(@types/node@20.14.9)(typescript@5.4.5) + version: 1.1.81(@types/node@20.14.11)(typescript@5.5.3) prompts: specifier: ^2.4.2 version: 2.4.2 semver: - specifier: ^7.6.0 - version: 7.6.0 + specifier: ^7.6.3 + version: 7.6.3 packages: @@ -469,6 +466,10 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -527,10 +528,6 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.7': resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} @@ -559,11 +556,6 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.6': - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.24.7': resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} @@ -601,10 +593,6 @@ packages: resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.6': - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.24.7': resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} @@ -696,6 +684,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -708,6 +702,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -720,6 +720,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -732,6 +738,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -744,6 +756,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -756,6 +774,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -768,6 +792,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -780,6 +810,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -792,6 +828,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -804,6 +846,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -816,6 +864,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -828,6 +882,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -840,6 +900,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -852,6 +918,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -864,6 +936,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -876,6 +954,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -888,6 +972,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -900,6 +990,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -912,6 +1014,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -924,6 +1032,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -936,6 +1050,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -948,6 +1068,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -960,6 +1086,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -970,6 +1102,10 @@ packages: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1033,13 +1169,15 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1049,30 +1187,14 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - 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.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - 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'} @@ -1086,9 +1208,6 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -1425,8 +1544,8 @@ packages: '@reatom/core-v2@3.1.4': resolution: {integrity: sha512-BCzyyTt2mm1PlwOyezYBzF4To3x4WzDTIDzNes2BJ8bWmvZfXT1FHIFjBR0uMSPQQ3bFienNK4ntHQy2CXcowA==} - '@reatom/core@3.8.3': - resolution: {integrity: sha512-o+vKp5kEBrd99TFQPExy2nWUTokQ8c7vVNuCO8dNKOG38YMKF5mGzDw+E+3lC+/H2oJN2gWG+WZu4/0HnW//bQ==} + '@reatom/core@3.9.0': + resolution: {integrity: sha512-ExlVfQ0rAkxnwWgbxWeNG4S5eNeTFpNlbFZMQHJ5MI+It7aYkqOie3Eh0ssk6AuvEPxzWM8+glsaZFQ6fPmTow==} '@reatom/effects@3.7.3': resolution: {integrity: sha512-9DrUsGSRXtt0TMYtzNRc2xtkZ+35OcvjILppcvwYlgMWoA7s1TJUCLEtHOngzVqQYrJMW+Dzw1t1xLlLVXMQUg==} @@ -1457,8 +1576,8 @@ packages: '@reatom/utils@3.9.0': resolution: {integrity: sha512-TaRjNhqdM9DtuqCAG4K9ncAQJbRWfITEGp7gvcnR+TnNaLlFHeJ7PjkfWrJQHENXTN3vo47tAe7HhF8nb1XxGA==} - '@remix-run/router@1.17.1': - resolution: {integrity: sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==} + '@remix-run/router@1.18.0': + resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} engines: {node: '>=14.0.0'} '@rollup/pluginutils@4.2.1': @@ -1545,59 +1664,49 @@ packages: cpu: [x64] os: [win32] - '@sentry-internal/feedback@7.113.0': - resolution: {integrity: sha512-eEmL8QXauUnM3FXGv0GT29RpL0Jo0pkn/uMu3aqjhQo7JKNqUGVYIUxJxiGWbVMbDXqPQ7L66bjjMS3FR1GM2g==} - engines: {node: '>=12'} + '@sentry-internal/browser-utils@8.18.0': + resolution: {integrity: sha512-1R7QXp7Gu6ovJGWvGjbgHcDcvDstsQba3miHtUCyDSH9kXtnAVLCAItDkseetFh+JLsjBXf3QFi2H3HPY4hRCw==} + engines: {node: '>=14.18'} - '@sentry-internal/replay-canvas@7.113.0': - resolution: {integrity: sha512-K8uA42aobNF/BAXf14el15iSAi9fonLBUrjZi6nPDq7zaA8rPvfcTL797hwCbqkETz2zDf52Jz7I3WFCshDoUw==} - engines: {node: '>=12'} + '@sentry-internal/feedback@8.18.0': + resolution: {integrity: sha512-on6+4ZRkfdnsNgXecGQ6ME8aO26VTzkuM6y/kNN+bG2hSdxsmuU957B4x1Z5wEXiOWswuf3rhqGepg8JIdPkMQ==} + engines: {node: '>=14.18'} - '@sentry-internal/tracing@7.113.0': - resolution: {integrity: sha512-8MDnYENRMnEfQjvN4gkFYFaaBSiMFSU/6SQZfY9pLI3V105z6JQ4D0PGMAUVowXilwNZVpKNYohE7XByuhEC7Q==} - engines: {node: '>=8'} + '@sentry-internal/replay-canvas@8.18.0': + resolution: {integrity: sha512-fcuLJBrhw3Ql8sU8veUgDCRYo6toQldFU807cpYphQ0uEw2oVZwNNPDQSu1651Ykvp0P/x+9hk/jjJxMohrO9g==} + engines: {node: '>=14.18'} - '@sentry/browser@7.113.0': - resolution: {integrity: sha512-PdyVHPOprwoxGfKGsP2dXDWO0MBDW1eyP7EZlfZvM1A4hjk6ZRNfCv30g+TrqX4hiZDKzyqN3+AdP7N/J2IX0Q==} - engines: {node: '>=8'} + '@sentry-internal/replay@8.18.0': + resolution: {integrity: sha512-cCLib/HjD8UR0fB2F5hV6KsFBD6yTOEsi67RBllm5gT5vJt87VYoPliF6O7mmMNw8TWkQ0uc5laKld3q9ph+ug==} + engines: {node: '>=14.18'} - '@sentry/core@7.113.0': - resolution: {integrity: sha512-pg75y3C5PG2+ur27A0Re37YTCEnX0liiEU7EOxWDGutH17x3ySwlYqLQmZsFZTSnvzv7t3MGsNZ8nT5O0746YA==} - engines: {node: '>=8'} + '@sentry/browser@8.18.0': + resolution: {integrity: sha512-E2w9u76JcjxcmgvroJrB7bcbG5oBCYI/pME1CtprBgZSS9mMYDsyBe6JKqGHdw2wvT3xNxNtkm7hf1O6+3NWUQ==} + engines: {node: '>=14.18'} - '@sentry/integrations@7.113.0': - resolution: {integrity: sha512-w0sspGBQ+6+V/9bgCkpuM3CGwTYoQEVeTW6iNebFKbtN7MrM3XsGAM9I2cW1jVxFZROqCBPFtd2cs5n0j14aAg==} - engines: {node: '>=8'} + '@sentry/core@8.18.0': + resolution: {integrity: sha512-8moEMC3gp4W6mH9w5amb/zrYk6bNW8WGgcLRMCs5rguxny8YP5i8ISOJ0T0LP9x/RxSK/6xix5D2bzI/5ECzlw==} + engines: {node: '>=14.18'} - '@sentry/react@7.113.0': - resolution: {integrity: sha512-+zVPz+h5Wydq4ntekw3/dXq5jeHIpZoQ2iqhB96PA9Y94JIq178i/xIP204S1h6rN7cmWAqtR93vnPKdxnlUbQ==} - engines: {node: '>=8'} + '@sentry/react@8.18.0': + resolution: {integrity: sha512-ckCKdxmeFdfR6moE/Aiq+cJyQuCUKoUqU/++xZwqVbgecuImsk4s7CzzpX9T6JoYK7jqru2SvuRSiwcdtLN6AQ==} + engines: {node: '>=14.18'} peerDependencies: - react: 15.x || 16.x || 17.x || 18.x - - '@sentry/replay@7.113.0': - resolution: {integrity: sha512-UD2IaphOWKFdeGR+ZiaNAQ+wFsnwbJK6PNwcW6cHmWKv9COlKufpFt06lviaqFZ8jmNrM4H+r+R8YVTrqCuxgg==} - engines: {node: '>=12'} + react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/types@7.113.0': - resolution: {integrity: sha512-PJbTbvkcPu/LuRwwXB1He8m+GjDDLKBtu3lWg5xOZaF5IRdXQU2xwtdXXsjge4PZR00tF7MO7X8ZynTgWbYaew==} - engines: {node: '>=8'} - - '@sentry/utils@7.113.0': - resolution: {integrity: sha512-nzKsErwmze1mmEsbW2AwL2oB+I5v6cDEJY4sdfLekA4qZbYZ8pV5iWza6IRl4XfzGTE1qpkZmEjPU9eyo0yvYw==} - engines: {node: '>=8'} + '@sentry/types@8.18.0': + resolution: {integrity: sha512-5J+uOqptnmAnW3Rk31AHIqW36Wzvlo3UOM+p2wjSYGrC/PgcE47Klzr+w4UcOhN6AZqefalGd3vaUXz9NaFdRg==} + engines: {node: '>=14.18'} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sentry/utils@8.18.0': + resolution: {integrity: sha512-7wq7cgaeSIGJncl9/2VMu81ZN5ep4lp4H1/+O8+xUxOmnPb/05ZZcbn9/VxVQvIoqZSZdwCLPeBz6PEVukvokA==} + engines: {node: '>=14.18'} '@sinonjs/commons@2.0.0': resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - '@sinonjs/commons@3.0.0': - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@11.2.2': resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} @@ -1630,24 +1739,32 @@ packages: resolution: {integrity: sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - '@slack/web-api@7.2.0': - resolution: {integrity: sha512-Dicpm9h/M9gZXHVlsDurUxQOzhh5QDZ6jahnsYRl9ZLAD58SPfgZdlS5a6Rz3zs82RnYWhNVjMW+pMLysetgRw==} + '@slack/web-api@7.3.1': + resolution: {integrity: sha512-n2KfnlqjaPJ5y98nU5Nn0UwTIxafLwQSQIOLpsQXKGYDF24S/ap5Ebv+ifVMtY+vIJBqj1q2+l3W9bpFHeiJ2A==} engines: {node: '>= 18', npm: '>= 8.6.0'} '@slack/webhook@7.0.2': resolution: {integrity: sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==} engines: {node: '>= 18', npm: '>= 8.6.0'} - '@testing-library/dom@9.3.3': - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} + '@testing-library/dom@10.3.2': + resolution: {integrity: sha512-0bxIdP9mmPiOJ6wHLj8bdJRq+51oddObeCGdEf6PNEhYd93ZYAN+lPRnEOVFtheVwDM7+p+tza3LAQgp0PTudg==} + engines: {node: '>=18'} - '@testing-library/react@14.2.1': - resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} - engines: {node: '>=14'} + '@testing-library/react@16.0.0': + resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} + engines: {node: '>=18'} peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 react: ^18.0.0 react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1883,8 +2000,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + '@types/node@20.14.11': + resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1931,9 +2048,6 @@ packages: '@types/scheduler@0.16.8': resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - '@types/semver@7.5.6': - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - '@types/sinon@17.0.3': resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} @@ -1952,63 +2066,62 @@ packages: '@types/w3c-generic-sensor@1.0.9': resolution: {integrity: sha512-1nj7Pja/MJI2iqWchqLLn+ItbHh3cOV/DmGydlUm6or0AbbY2Jx9bnsh34WOFG7wfEbJ/WLa4NBBOPA///VObg==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.0.1': + resolution: {integrity: sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser@8.0.1': + resolution: {integrity: sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.0.1': + resolution: {integrity: sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/type-utils@8.0.1': + resolution: {integrity: sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.0.1': + resolution: {integrity: sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@8.0.1': + resolution: {integrity: sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/utils@8.0.1': + resolution: {integrity: sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.0.1': + resolution: {integrity: sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@uiw/github-corners@1.5.16': resolution: {integrity: sha512-XelD5IePslpUBvT0S9jsIGKnnxSkqs6peZH2+rh42x+N1cQ0eQMbTfeWPbJtl4TiZEawywZclXlt55+Ur4CFVA==} @@ -2028,25 +2141,28 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: - vitest: 1.6.0 + vitest: 2.0.5 - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -2167,10 +2283,6 @@ packages: resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} - acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} - engines: {node: '>=0.4.0'} - acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -2185,6 +2297,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + after@0.8.2: resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} @@ -2203,16 +2320,16 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-escapes@3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} - ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} @@ -2268,8 +2385,8 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} @@ -2317,9 +2434,6 @@ packages: resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} engines: {node: '>= 0.4'} - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} @@ -2350,8 +2464,9 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} @@ -2374,8 +2489,8 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2465,10 +2580,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2478,6 +2589,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + 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 + buf-compare@1.0.1: resolution: {integrity: sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==} engines: {node: '>=0.10.0'} @@ -2540,15 +2656,15 @@ packages: caniuse-lite@1.0.30001629: resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2571,8 +2687,9 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} @@ -2594,9 +2711,9 @@ packages: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} @@ -2796,9 +2913,6 @@ packages: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2846,10 +2960,6 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -2892,6 +3002,24 @@ packages: supports-color: optional: true + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -2911,14 +3039,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2981,10 +3105,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} @@ -2997,6 +3117,10 @@ packages: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3089,6 +3213,9 @@ packages: electron-to-chromium@1.4.693: resolution: {integrity: sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==} + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -3136,6 +3263,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + eol@0.9.1: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} @@ -3169,9 +3300,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.0.19: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} @@ -3208,10 +3336,19 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -3223,10 +3360,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -3286,11 +3419,11 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.34.3: - resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==} + eslint-plugin-react@7.35.0: + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -3419,6 +3552,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-xml-parser@4.3.2: resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true @@ -3460,10 +3596,6 @@ packages: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} engines: {node: '>= 0.4.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3694,11 +3826,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.4.1: resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} @@ -3764,8 +3891,9 @@ packages: resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} engines: {node: '>=0.8.0'} - happy-dom@12.10.3: - resolution: {integrity: sha512-JzUXOh0wdNGY54oKng5hliuBkq/+aT1V3YpTM+lrN/GoLQTANZsMaIvmHiHe612rauHvPJnDZkZ+5GZR++1Abg==} + happy-dom@14.12.3: + resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==} + engines: {node: '>=16.0.0'} har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -3931,8 +4059,8 @@ packages: engines: {node: '>= 16.0'} hasBin: true - i18next-scanner@4.4.0: - resolution: {integrity: sha512-bgnVEfoFHLVxfXNQtsFFzexB/5kwgDZZkZ6+AnCmyaFKEQQbtMkgPgLHlMZ0deIIEG6KN/tYAus5ZJzng2Ac9g==} + i18next-scanner@4.5.0: + resolution: {integrity: sha512-5QMRUkQA6zvsOjwVzBCm7HRyzgrFJH1QsbuSMZCk0GDLRCJG6IL4i/5aYyzH695toXUkJ/rx4PCK/yvBw2i8Vw==} engines: {node: '>=12'} hasBin: true @@ -3960,6 +4088,10 @@ packages: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -3970,9 +4102,6 @@ packages: engines: {node: '>=6.9.0'} hasBin: true - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immutable@4.3.4: resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} @@ -4035,10 +4164,6 @@ packages: resolution: {integrity: sha512-kniTIJmaZYiwa17eTtWIfm0K342seyugl6vuC8DiiyiRAJWAVlLkqGCI0Im0neo0TkXw+pRcKaBPRdcKHnQJ6Q==} engines: {node: '>=0.10.0'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -4273,9 +4398,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -4303,21 +4425,17 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.0: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} @@ -4340,9 +4458,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -4395,9 +4510,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -4412,8 +4524,8 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} @@ -4465,9 +4577,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -4479,13 +4588,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.2.7: - resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} + lint-staged@15.2.8: + resolution: {integrity: sha512-PUWFf2zQzsd9EFU+kM1d7UP+AZDbKFKuj+9JNVTBkhUFhbg4MAt6WfyMMwBfM4lYqd4D2Jwac5iuTu9rVj4zCQ==} engines: {node: '>=18.12.0'} hasBin: true - listr2@8.2.1: - resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} engines: {node: '>=18.0.0'} load-json-file@4.0.0: @@ -4496,13 +4605,6 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - - localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -4546,8 +4648,8 @@ packages: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} - log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} long@3.2.0: @@ -4557,23 +4659,16 @@ packages: long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} @@ -4593,12 +4688,11 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -4627,8 +4721,11 @@ packages: resolution: {integrity: sha512-krg2KFIdOpLPngONDhP6ixCoWl5kbdMINP0moMSJFVX7wX1Clm2M9hlNKXS8vBGlVWwR5R3ZfI6IPrYz7c+aCQ==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-to-jsx@7.4.7: + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' math.gl@3.6.3: resolution: {integrity: sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==} @@ -4642,42 +4739,15 @@ packages: mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} @@ -4735,27 +4805,6 @@ packages: micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} @@ -4913,6 +4962,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} @@ -4927,10 +4980,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4945,10 +4994,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4961,9 +5006,6 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true - mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -5031,8 +5073,8 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - nise@5.1.5: - resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} + nise@6.0.0: + resolution: {integrity: sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -5055,6 +5097,9 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -5107,10 +5152,6 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -5138,10 +5179,6 @@ packages: object.groupby@1.0.1: resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} @@ -5169,6 +5206,10 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open-cli@7.2.0: resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} engines: {node: '>=14.16'} @@ -5218,10 +5259,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -5324,10 +5361,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -5335,8 +5368,8 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -5349,11 +5382,12 @@ packages: pathe@0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} - pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pbf@3.2.1: resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} @@ -5402,9 +5436,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -5477,8 +5508,8 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 @@ -5499,14 +5530,14 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@6.0.14: - resolution: {integrity: sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==} - engines: {node: '>=4'} - postcss-selector-parser@6.0.15: resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'} + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -5522,8 +5553,8 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} potpack@2.0.0: @@ -5545,10 +5576,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5760,15 +5787,15 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-router-dom@6.24.1: - resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==} + react-router-dom@6.25.1: + resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.24.1: - resolution: {integrity: sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==} + react-router@6.25.1: + resolution: {integrity: sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -5779,8 +5806,8 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react-virtuoso@4.7.11: - resolution: {integrity: sha512-Kdn9qEtQI2ulEuBMzW2BTkDsfijB05QUd6lpZ1K36oyA3k65Cz4lG4EKrh2pCfUafX4C2uMSZOwzMOhbrMOTFA==} + react-virtuoso@4.9.0: + resolution: {integrity: sha512-MiiSGKqvYPfAK3FUe852n2L3M5IXMKP0pUgYQ/UTk90A/l2UNQOvaEUvAZp+0ytL0kOCNk8i8/J8FMKvIq7kqg==} engines: {node: '>=10'} peerDependencies: react: '>=16 || >=17 || >= 18' @@ -5858,9 +5885,6 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} @@ -5923,9 +5947,9 @@ packages: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -5935,8 +5959,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -6059,8 +6083,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -6079,10 +6103,6 @@ packages: resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} @@ -6117,9 +6137,6 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -6134,8 +6151,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sinon@17.0.1: - resolution: {integrity: sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==} + sinon@18.0.0: + resolution: {integrity: sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -6254,10 +6271,6 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-composer@1.0.2: resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} @@ -6300,6 +6313,9 @@ packages: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} @@ -6363,9 +6379,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} - strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -6394,10 +6407,6 @@ packages: supercluster@8.0.1: resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} - superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} - engines: {node: '>=14.0.0'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6492,6 +6501,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -6508,22 +6521,26 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} tinyqueue@2.0.3: resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + tinyspy@1.1.1: resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} engines: {node: '>=14.0.0'} - tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} titleize@3.0.0: @@ -6574,9 +6591,9 @@ packages: trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - ts-api-utils@1.0.3: - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -6626,8 +6643,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.15.7: - resolution: {integrity: sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==} + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} engines: {node: '>=18.0.0'} hasBin: true @@ -6717,8 +6734,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true @@ -6731,9 +6748,6 @@ packages: udomdiff@1.1.0: resolution: {integrity: sha512-aqjTs5x/wsShZBkVagdafJkP8S3UMGhkHKszsu1cszjjZ7iOp86+Qb3QOFYh01oWjPMy5ZTuxD6hw5uTKxd+VA==} - ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - uhtml@4.5.9: resolution: {integrity: sha512-WAfIK/E3ZJpaFl0MSzGSB54r7I8Vc8ZyUlOsN8GnLnEaxuioOUyKAS6q/N/xQ5GD9vFFBnx6q+3N3Eq9KNCvTQ==} @@ -6800,6 +6814,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6918,8 +6938,8 @@ packages: '@egjs/hammerjs': ^2.0.0 component-emitter: ^1.3.0 || ^2.0.0 - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6934,16 +6954,16 @@ packages: peerDependencies: vite: '>=3' - vite-tsconfig-paths@4.3.2: - resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} peerDependencies: vite: '*' peerDependenciesMeta: vite: optional: true - vite@5.3.3: - resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==} + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6951,6 +6971,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -6963,6 +6984,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -6970,15 +6993,15 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7038,10 +7061,6 @@ packages: webpack-cli: optional: true - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -7080,8 +7099,8 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -7150,8 +7169,8 @@ packages: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} hasBin: true @@ -7189,9 +7208,6 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -7219,7 +7235,12 @@ snapshots: '@ampproject/remapping@2.2.1': dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 '@babel/code-frame@7.23.5': @@ -7230,7 +7251,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.0 + picocolors: 1.0.1 '@babel/compat-data@7.24.7': {} @@ -7247,7 +7268,7 @@ snapshots: '@babel/traverse': 7.24.7 '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7313,8 +7334,6 @@ snapshots: dependencies: '@babel/types': 7.24.7 - '@babel/helper-string-parser@7.23.4': {} - '@babel/helper-string-parser@7.24.7': {} '@babel/helper-validator-identifier@7.22.20': {} @@ -7339,11 +7358,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 - - '@babel/parser@7.23.6': - dependencies: - '@babel/types': 7.23.6 + picocolors: 1.0.1 '@babel/parser@7.24.7': dependencies: @@ -7387,17 +7402,11 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.4 + debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.6': - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - '@babel/types@7.24.7': dependencies: '@babel/helper-string-parser': 7.24.7 @@ -7534,138 +7543,210 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.23.0': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.23.0': + optional: true + '@esbuild/android-arm@0.17.19': optional: true '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.23.0': + optional: true + '@esbuild/android-x64@0.17.19': optional: true '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.23.0': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.23.0': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.23.0': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.23.0': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.23.0': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.23.0': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.23.0': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.23.0': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.23.0': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.23.0': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.23.0': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.23.0': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.23.0': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.23.0': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.23.0': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.23.0': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.23.0': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.23.0': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.23.0': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -7673,13 +7754,15 @@ snapshots: '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -7748,15 +7831,15 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/object-schema@2.0.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -7769,34 +7852,20 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 - '@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.1': {} - '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} - '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/source-map@0.3.6': dependencies: @@ -7805,11 +7874,6 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.22': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -8145,8 +8209,8 @@ snapshots: lodash.throttle: 4.1.1 viewport-mercator-project: 7.0.4 - ? '@nebula.gl/layers@1.1.0-alpha.5(@deck.gl/core@8.9.33)(@deck.gl/extensions@8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3))(@deck.gl/geo-layers@8.9.33(@deck.gl/core@8.9.33)(@deck.gl/extensions@8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3))(@deck.gl/layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/core@3.4.14)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.14)(@loaders.gl/gltf@3.4.14)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/core@3.4.14)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)' - : dependencies: + '@nebula.gl/layers@1.1.0-alpha.5(fe5wxxh3m5buw4hujpm5qvmhei)': + dependencies: '@deck.gl/core': 8.9.33 '@deck.gl/extensions': 8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3) '@deck.gl/geo-layers': 8.9.33(@deck.gl/core@8.9.33)(@deck.gl/extensions@8.9.33(@deck.gl/core@8.9.33)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)(@math.gl/web-mercator@3.6.3)(gl-matrix@3.4.3))(@deck.gl/layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/core@3.4.14)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.9.33(@deck.gl/core@8.9.33)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.14)(@loaders.gl/gltf@3.4.14)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) @@ -8381,7 +8445,7 @@ snapshots: '@reatom/async@3.15.2': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/effects': 3.7.3 '@reatom/hooks': 3.5.5 '@reatom/primitives': 3.7.2 @@ -8389,36 +8453,36 @@ snapshots: '@reatom/core-v2@3.1.4': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 - '@reatom/core@3.8.3': {} + '@reatom/core@3.9.0': {} '@reatom/effects@3.7.3': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/utils': 3.9.0 '@reatom/hooks@3.5.5': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/effects': 3.7.3 '@reatom/utils': 3.9.0 '@reatom/lens@3.9.1': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/effects': 3.7.3 '@reatom/hooks': 3.5.5 '@reatom/utils': 3.9.0 '@reatom/logger@3.8.4': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/utils': 3.9.0 '@reatom/npm-react@3.8.10(react@18.2.0)': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/effects': 3.7.3 '@reatom/lens': 3.9.1 '@reatom/utils': 3.9.0 @@ -8427,7 +8491,7 @@ snapshots: '@reatom/primitives@3.7.2': dependencies: - '@reatom/core': 3.8.3 + '@reatom/core': 3.9.0 '@reatom/utils': 3.9.0 '@reatom/react-v2@3.1.2(@reatom/core-v2@3.1.4)(react@18.2.0)': @@ -8437,7 +8501,7 @@ snapshots: '@reatom/utils@3.9.0': {} - '@remix-run/router@1.17.1': {} + '@remix-run/router@1.18.0': {} '@rollup/pluginutils@4.2.1': dependencies: @@ -8492,87 +8556,73 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@sentry-internal/feedback@7.113.0': + '@sentry-internal/browser-utils@8.18.0': dependencies: - '@sentry/core': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry-internal/replay-canvas@7.113.0': + '@sentry-internal/feedback@8.18.0': dependencies: - '@sentry/core': 7.113.0 - '@sentry/replay': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry-internal/tracing@7.113.0': + '@sentry-internal/replay-canvas@8.18.0': dependencies: - '@sentry/core': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry-internal/replay': 8.18.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry/browser@7.113.0': + '@sentry-internal/replay@8.18.0': dependencies: - '@sentry-internal/feedback': 7.113.0 - '@sentry-internal/replay-canvas': 7.113.0 - '@sentry-internal/tracing': 7.113.0 - '@sentry/core': 7.113.0 - '@sentry/integrations': 7.113.0 - '@sentry/replay': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry-internal/browser-utils': 8.18.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry/core@7.113.0': + '@sentry/browser@8.18.0': dependencies: - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry-internal/browser-utils': 8.18.0 + '@sentry-internal/feedback': 8.18.0 + '@sentry-internal/replay': 8.18.0 + '@sentry-internal/replay-canvas': 8.18.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry/integrations@7.113.0': + '@sentry/core@8.18.0': dependencies: - '@sentry/core': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 - localforage: 1.10.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 - '@sentry/react@7.113.0(react@18.2.0)': + '@sentry/react@8.18.0(react@18.2.0)': dependencies: - '@sentry/browser': 7.113.0 - '@sentry/core': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 + '@sentry/browser': 8.18.0 + '@sentry/core': 8.18.0 + '@sentry/types': 8.18.0 + '@sentry/utils': 8.18.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 - '@sentry/replay@7.113.0': - dependencies: - '@sentry-internal/tracing': 7.113.0 - '@sentry/core': 7.113.0 - '@sentry/types': 7.113.0 - '@sentry/utils': 7.113.0 - - '@sentry/types@7.113.0': {} + '@sentry/types@8.18.0': {} - '@sentry/utils@7.113.0': + '@sentry/utils@8.18.0': dependencies: - '@sentry/types': 7.113.0 - - '@sinclair/typebox@0.27.8': {} + '@sentry/types': 8.18.0 '@sinonjs/commons@2.0.0': dependencies: type-detect: 4.0.8 - '@sinonjs/commons@3.0.0': + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.0 - '@sinonjs/fake-timers@11.2.2': dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 '@sinonjs/samsam@8.0.0': dependencies: @@ -8596,11 +8646,11 @@ snapshots: '@slack/logger@3.0.0': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@slack/logger@4.0.0': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@slack/types@2.12.0': {} @@ -8609,7 +8659,7 @@ snapshots: '@slack/logger': 3.0.0 '@slack/types': 2.12.0 '@types/is-stream': 1.1.0 - '@types/node': 20.14.9 + '@types/node': 20.14.11 axios: 1.6.8(debug@4.3.4) eventemitter3: 3.1.2 form-data: 2.5.1 @@ -8620,11 +8670,11 @@ snapshots: transitivePeerDependencies: - debug - '@slack/web-api@7.2.0': + '@slack/web-api@7.3.1': dependencies: '@slack/logger': 4.0.0 '@slack/types': 2.12.0 - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/retry': 0.12.0 axios: 1.6.8(debug@4.3.4) eventemitter3: 5.0.1 @@ -8640,29 +8690,31 @@ snapshots: '@slack/webhook@7.0.2': dependencies: '@slack/types': 2.12.0 - '@types/node': 20.14.9 + '@types/node': 20.14.11 axios: 1.6.8(debug@4.3.4) transitivePeerDependencies: - debug - '@testing-library/dom@9.3.3': + '@testing-library/dom@10.3.2': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.8 + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.24.5 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.0.0(@testing-library/dom@10.3.2)(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.8 - '@testing-library/dom': 9.3.3 - '@types/react-dom': 18.2.22 + '@babel/runtime': 7.24.5 + '@testing-library/dom': 10.3.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.65 + '@types/react-dom': 18.2.22 '@tokenizer/token@0.3.0': {} @@ -8982,7 +9034,7 @@ snapshots: '@types/gettext-parser@4.0.4': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/readable-stream': 4.0.14 '@types/hammerjs@2.0.45': {} @@ -8995,11 +9047,11 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/is-stream@1.1.0': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9031,7 +9083,7 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@20.14.9': + '@types/node@20.14.11': dependencies: undici-types: 5.26.5 @@ -9041,7 +9093,7 @@ snapshots: '@types/papaparse@5.3.14': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/pbf@3.0.5': {} @@ -9082,15 +9134,13 @@ snapshots: '@types/readable-stream@4.0.14': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 safe-buffer: 5.1.2 '@types/retry@0.12.0': {} '@types/scheduler@0.16.8': {} - '@types/semver@7.5.6': {} - '@types/sinon@17.0.3': dependencies: '@types/sinonjs__fake-timers': 8.1.5 @@ -9109,90 +9159,85 @@ snapshots: dependencies: typescript: 2.9.2 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.0.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + '@typescript-eslint/parser': 8.0.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/type-utils': 8.0.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 8.0.1 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 8.0.1 + debug: 4.3.5 eslint: 8.57.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.21.0': + '@typescript-eslint/scope-manager@8.0.1': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@8.0.1(eslint@8.57.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.1(eslint@8.57.0)(typescript@5.5.3) + debug: 4.3.5 + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@8.0.1': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.0.1(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.4.5) + minimatch: 9.0.4 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@8.0.1(eslint@8.57.0)(typescript@5.5.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.3) eslint: 8.57.0 - semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@6.21.0': + '@typescript-eslint/visitor-keys@8.0.1': dependencies: - '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/types': 8.0.1 eslint-visitor-keys: 3.4.3 '@uiw/github-corners@1.5.16': {} @@ -9205,64 +9250,67 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0))': + '@vitejs/plugin-react@4.3.1(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.9)(happy-dom@12.10.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0))': + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.14.11)(happy-dom@14.12.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0))': dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.6 - magic-string: 0.30.5 - magicast: 0.3.3 - picocolors: 1.0.0 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.10 + magicast: 0.3.4 std-env: 3.7.0 - strip-literal: 2.0.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.14.9)(happy-dom@12.10.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@20.14.11)(happy-dom@14.12.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.3.10 + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/runner@2.0.5': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.1 + '@vitest/utils': 2.0.5 + pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.5': dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 - pretty-format: 29.7.0 + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.10 + pathe: 1.1.2 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.5': dependencies: - tinyspy: 2.2.0 + tinyspy: 3.0.0 - '@vitest/utils@1.6.0': + '@vitest/utils@2.0.5': dependencies: - diff-sequences: 29.6.3 + '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 '@webassemblyjs/ast@1.12.1': dependencies: @@ -9362,14 +9410,14 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-class-fields@0.3.7(acorn@8.11.2): + acorn-class-fields@0.3.7(acorn@8.11.3): dependencies: - acorn: 8.11.2 - acorn-private-class-elements: 0.2.7(acorn@8.11.2) + acorn: 8.11.3 + acorn-private-class-elements: 0.2.7(acorn@8.11.3) - 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-walk@2.0.0: {} @@ -9381,46 +9429,50 @@ snapshots: dependencies: acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + acorn-loose@8.4.0: dependencies: acorn: 8.11.3 - acorn-private-class-elements@0.2.7(acorn@8.11.2): + acorn-private-class-elements@0.2.7(acorn@8.11.3): dependencies: - acorn: 8.11.2 + acorn: 8.11.3 - acorn-private-methods@0.3.3(acorn@8.11.2): + acorn-private-methods@0.3.3(acorn@8.11.3): dependencies: - acorn: 8.11.2 - acorn-private-class-elements: 0.2.7(acorn@8.11.2) + acorn: 8.11.3 + acorn-private-class-elements: 0.2.7(acorn@8.11.3) - acorn-stage3@4.0.0(acorn@8.11.2): + acorn-stage3@4.0.0(acorn@8.11.3): dependencies: - acorn: 8.11.2 - acorn-class-fields: 0.3.7(acorn@8.11.2) - acorn-private-methods: 0.3.3(acorn@8.11.2) - acorn-static-class-features: 0.2.4(acorn@8.11.2) + acorn: 8.11.3 + acorn-class-fields: 0.3.7(acorn@8.11.3) + acorn-private-methods: 0.3.3(acorn@8.11.3) + acorn-static-class-features: 0.2.4(acorn@8.11.3) - acorn-static-class-features@0.2.4(acorn@8.11.2): + acorn-static-class-features@0.2.4(acorn@8.11.3): dependencies: - acorn: 8.11.2 - acorn-private-class-elements: 0.2.7(acorn@8.11.2) + acorn: 8.11.3 + acorn-private-class-elements: 0.2.7(acorn@8.11.3) acorn-walk@8.3.0: {} - acorn-walk@8.3.1: {} - acorn-walk@8.3.2: {} acorn@8.11.2: {} acorn@8.11.3: {} + acorn@8.12.1: {} + after@0.8.2: {} agent-base@7.1.1: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -9442,18 +9494,18 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ajv@8.16.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ansi-escapes@3.2.0: {} - ansi-escapes@6.2.0: + ansi-escapes@7.0.0: dependencies: - type-fest: 3.13.1 + environment: 1.1.0 ansi-html-community@0.0.8: {} @@ -9494,9 +9546,9 @@ snapshots: dependencies: tslib: 2.6.2 - aria-query@5.1.3: + aria-query@5.3.0: dependencies: - deep-equal: 2.2.3 + dequal: 2.0.3 arr-union@3.1.0: {} @@ -9559,24 +9611,17 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.reduce@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - array.prototype.toreversed@1.1.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 @@ -9590,7 +9635,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 @@ -9600,7 +9645,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -9618,7 +9663,7 @@ snapshots: assert-plus@1.0.0: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} assign-symbols@1.0.0: {} @@ -9632,13 +9677,13 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.4.19(postcss@8.4.35): + autoprefixer@10.4.20(postcss@8.4.35): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001629 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -9732,10 +9777,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -9747,6 +9788,13 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + buf-compare@1.0.1: {} buffer-from@1.1.2: {} @@ -9788,7 +9836,7 @@ snapshots: foreground-child: 2.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 rimraf: 3.0.2 test-exclude: 6.0.0 v8-to-istanbul: 9.2.0 @@ -9825,19 +9873,17 @@ snapshots: caniuse-lite@1.0.30001629: {} - caseless@0.12.0: {} + caniuse-lite@1.0.30001651: {} - ccount@2.0.1: {} + caseless@0.12.0: {} - chai@4.3.10: + chai@5.1.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -9858,14 +9904,12 @@ snapshots: charenc@0.0.2: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chokidar@3.5.3: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -9886,9 +9930,9 @@ snapshots: dependencies: restore-cursor: 2.0.0 - cli-cursor@4.0.0: + cli-cursor@5.0.0: dependencies: - restore-cursor: 4.0.0 + restore-cursor: 5.1.0 cli-table3@0.5.1: dependencies: @@ -10011,14 +10055,14 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.4.5): + cosmiconfig@9.0.0(typescript@5.5.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 cpr@3.0.1: dependencies: @@ -10066,8 +10110,6 @@ snapshots: css-what@6.1.0: {} - css.escape@1.5.1: {} - cssesc@3.0.0: {} cssfilter@0.0.10: {} @@ -10112,10 +10154,6 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.23.6 - debug@2.6.9: dependencies: ms: 2.0.0 @@ -10136,6 +10174,14 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.5: + dependencies: + ms: 2.1.2 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -10151,30 +10197,7 @@ snapshots: decode-uri-component@0.2.2: {} - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -10238,7 +10261,7 @@ snapshots: prompts: 2.4.2 rechoir: 0.8.0 safe-regex: 2.1.1 - semver: 7.6.0 + semver: 7.6.3 semver-try-require: 6.2.3 teamcity-service-messages: 0.1.14 tsconfig-paths-webpack-plugin: 4.1.0 @@ -10255,14 +10278,14 @@ snapshots: dependencies: dequal: 2.0.3 - diff-sequences@29.6.3: {} - diff@3.5.0: {} diff@4.0.2: {} diff@5.1.0: {} + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -10365,6 +10388,8 @@ snapshots: electron-to-chromium@1.4.693: {} + electron-to-chromium@1.5.5: {} + emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} @@ -10434,6 +10459,8 @@ snapshots: env-paths@2.2.1: {} + environment@1.1.0: {} + eol@0.9.1: {} errno@0.1.8: @@ -10461,7 +10488,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.2 is-callable: 1.2.7 @@ -10505,7 +10532,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 @@ -10588,18 +10615,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 @@ -10627,11 +10642,11 @@ snapshots: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -10692,16 +10707,43 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + escalade@3.1.1: {} + escalade@3.1.2: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -10710,13 +10752,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -10727,14 +10769,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 8.0.1(eslint@8.57.0)(typescript@5.5.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -10759,7 +10801,7 @@ snapshots: plur: 2.1.2 pretty-format: 22.4.3 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -10769,7 +10811,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.0.1(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -10780,7 +10822,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 8.0.1(eslint@8.57.0)(typescript@5.5.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -10790,27 +10832,27 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react@7.34.3(eslint@8.57.0): + eslint-plugin-react@7.35.0(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 eslint: 8.57.0 estraverse: 5.3.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 eslint-scope@5.1.1: dependencies: @@ -10827,7 +10869,7 @@ snapshots: eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -10837,7 +10879,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -10851,7 +10893,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -10869,8 +10911,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 esprima-next@5.8.4: {} @@ -11010,12 +11052,14 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.1: {} + fast-xml-parser@4.3.2: dependencies: strnum: 1.0.5 @@ -11056,10 +11100,6 @@ snapshots: filesize@6.4.0: {} - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -11094,7 +11134,7 @@ snapshots: find-yarn-workspace-root@2.0.0: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.7 flat-cache@3.2.0: dependencies: @@ -11201,7 +11241,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -11240,7 +11280,7 @@ snapshots: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 get-stdin@9.0.0: {} @@ -11316,14 +11356,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.1 - glob@10.4.1: dependencies: foreground-child: 3.1.1 @@ -11399,13 +11431,10 @@ snapshots: hammerjs@2.0.8: {} - happy-dom@12.10.3: + happy-dom@14.12.3: dependencies: - css.escape: 1.5.1 entities: 4.5.0 - iconv-lite: 0.6.3 webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 har-schema@2.0.0: {} @@ -11524,7 +11553,7 @@ snapshots: http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.5 + micromatch: 4.0.7 transitivePeerDependencies: - debug @@ -11571,12 +11600,12 @@ snapshots: node-gettext: 3.0.0 p-from-callback: 1.0.1 - i18next-scanner@4.4.0: + i18next-scanner@4.5.0: dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - acorn-stage3: 4.0.0(acorn@8.11.2) - acorn-walk: 8.3.1 + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + acorn-stage3: 4.0.0(acorn@8.11.3) + acorn-walk: 8.3.2 chalk: 4.1.2 clone-deep: 4.0.1 commander: 9.5.0 @@ -11613,13 +11642,13 @@ snapshots: ignore@5.3.0: {} + ignore@5.3.1: {} + image-size@0.5.5: optional: true image-size@0.7.5: {} - immediate@3.0.6: {} - immutable@4.3.4: {} import-fresh@3.3.0: @@ -11671,8 +11700,8 @@ snapshots: internal-slot@1.0.7: dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.4 + hasown: 2.0.2 + side-channel: 1.0.6 interpret@3.1.1: {} @@ -11680,11 +11709,6 @@ snapshots: irregular-plurals@1.4.0: {} - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.2: dependencies: call-bind: 1.0.7 @@ -11872,8 +11896,6 @@ snapshots: dependencies: is-docker: 2.2.1 - isarray@0.0.1: {} - isarray@1.0.0: {} isarray@2.0.1: {} @@ -11894,15 +11916,15 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -11915,12 +11937,6 @@ snapshots: reflect.getprototypeof: 1.0.4 set-function-name: 2.0.2 - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -11945,14 +11961,12 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 merge-stream: 2.0.0 supports-color: 8.1.1 js-tokens@4.0.0: {} - js-tokens@8.0.3: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -11992,8 +12006,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.0: {} - jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -12016,7 +12028,7 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - just-extend@4.2.1: {} + just-extend@6.2.0: {} jwt-decode@4.0.0: {} @@ -12065,38 +12077,34 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.1.1: - dependencies: - immediate: 3.0.6 - lilconfig@2.1.0: {} lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} - lint-staged@15.2.7: + lint-staged@15.2.8: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4 + debug: 4.3.6 execa: 8.0.1 lilconfig: 3.1.2 - listr2: 8.2.1 + listr2: 8.2.4 micromatch: 4.0.7 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.5 + yaml: 2.5.0 transitivePeerDependencies: - supports-color - listr2@8.2.1: + listr2@8.2.4: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.1 + log-update: 6.1.0 + rfdc: 1.4.1 wrap-ansi: 9.0.0 load-json-file@4.0.0: @@ -12108,15 +12116,6 @@ snapshots: loader-runner@4.3.0: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 - - localforage@1.10.0: - dependencies: - lie: 3.1.1 - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -12152,10 +12151,10 @@ snapshots: dependencies: chalk: 2.4.2 - log-update@6.0.0: + log-update@6.1.0: dependencies: - ansi-escapes: 6.2.0 - cli-cursor: 4.0.0 + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 @@ -12164,13 +12163,11 @@ snapshots: long@5.2.3: {} - longest-streak@3.1.0: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -12178,8 +12175,6 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@10.1.0: {} - lru-cache@10.2.2: {} lru-cache@5.1.1: @@ -12194,14 +12189,14 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.5: + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magicast@0.3.3: + magicast@0.3.4: dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 source-map-js: 1.2.0 make-dir@2.1.0: @@ -12212,7 +12207,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.3 make-error@1.3.6: {} @@ -12252,7 +12247,9 @@ snapshots: tinyqueue: 2.0.3 vt-pbf: 3.1.3 - markdown-table@3.0.3: {} + markdown-to-jsx@7.4.7(react@18.2.0): + dependencies: + react: 18.2.0 math.gl@3.6.3: dependencies: @@ -12272,13 +12269,6 @@ snapshots: '@types/unist': 2.0.10 unist-util-visit: 4.1.2 - mdast-util-find-and-replace@2.2.2: - dependencies: - '@types/mdast': 3.0.15 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - mdast-util-from-markdown@1.3.1: dependencies: '@types/mdast': 3.0.15 @@ -12313,55 +12303,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@1.0.3: - dependencies: - '@types/mdast': 3.0.15 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 - - mdast-util-gfm-footnote@1.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - - mdast-util-gfm-strikethrough@1.0.3: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - - mdast-util-gfm-table@1.0.7: - dependencies: - '@types/mdast': 3.0.15 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@1.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - - mdast-util-gfm@2.0.2: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 - mdast-util-to-hast@12.3.0: dependencies: '@types/hast': 2.3.10 @@ -12373,17 +12314,6 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - mdast-util-to-markdown@1.5.0: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - mdast-util-to-string@3.2.0: dependencies: '@types/mdast': 3.0.15 @@ -12472,64 +12402,6 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-autolink-literal@1.0.5: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-extension-gfm-footnote@1.1.2: - dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-strikethrough@1.0.7: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-table@1.0.7: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-tagfilter@1.0.2: - dependencies: - micromark-util-types: 1.1.0 - - micromark-extension-gfm-task-list-item@1.0.5: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm@2.0.3: - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - micromark-factory-destination@1.1.0: dependencies: micromark-util-character: 1.2.0 @@ -12717,7 +12589,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.5 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -12739,7 +12611,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.5 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -12760,7 +12632,7 @@ snapshots: micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 micromatch@4.0.7: @@ -12784,6 +12656,8 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + min-document@2.19.0: dependencies: dom-walk: 0.1.2 @@ -12798,10 +12672,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -12816,8 +12686,6 @@ snapshots: minimist@1.2.8: {} - minipass@7.0.4: {} - minipass@7.1.2: {} mjolnir.js@2.7.1: @@ -12829,13 +12697,6 @@ snapshots: dependencies: minimist: 1.2.8 - mlly@1.4.2: - dependencies: - acorn: 8.11.3 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - moment@2.30.1: {} moniker@0.1.2: {} @@ -12878,13 +12739,13 @@ snapshots: nice-try@1.0.5: {} - nise@5.1.5: + nise@6.0.0: dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 + just-extend: 6.2.0 + path-to-regexp: 6.2.2 no-case@3.0.4: dependencies: @@ -12908,6 +12769,8 @@ snapshots: node-releases@2.0.14: {} + node-releases@2.0.18: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -12919,14 +12782,14 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-package-data@4.0.1: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -12969,11 +12832,6 @@ snapshots: object-inspect@1.13.1: {} - object-is@1.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.5: @@ -13007,8 +12865,8 @@ snapshots: array.prototype.reduce: 1.0.6 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - safe-array-concat: 1.1.0 + es-abstract: 1.23.3 + safe-array-concat: 1.1.2 object.groupby@1.0.1: dependencies: @@ -13017,12 +12875,6 @@ snapshots: es-abstract: 1.22.3 get-intrinsic: 1.2.4 - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - object.values@1.1.7: dependencies: call-bind: 1.0.7 @@ -13055,6 +12907,10 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open-cli@7.2.0: dependencies: file-type: 18.7.0 @@ -13110,10 +12966,6 @@ snapshots: dependencies: yocto-queue: 1.0.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -13197,7 +13049,7 @@ snapshots: minimist: 1.2.8 open: 7.4.2 rimraf: 2.7.1 - semver: 7.6.0 + semver: 7.6.3 slash: 2.0.0 tmp: 0.0.33 yaml: 2.3.4 @@ -13218,11 +13070,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 @@ -13230,9 +13077,7 @@ snapshots: path-to-regexp@0.1.7: {} - path-to-regexp@1.8.0: - dependencies: - isarray: 0.0.1 + path-to-regexp@6.2.2: {} path-type@3.0.0: dependencies: @@ -13242,9 +13087,9 @@ snapshots: pathe@0.2.0: {} - pathe@1.1.1: {} + pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} pbf@3.2.1: dependencies: @@ -13279,25 +13124,19 @@ snapshots: pify@4.0.1: optional: true - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - pkg-up@3.1.0: dependencies: find-up: 3.0.0 playwright-core@1.42.1: {} - playwright-slack-report@1.1.81(@types/node@20.14.9)(typescript@5.4.5): + playwright-slack-report@1.1.81(@types/node@20.14.11)(typescript@5.5.3): dependencies: '@slack/web-api': 6.12.0 '@slack/webhook': 7.0.2 commander: 11.1.0 https-proxy-agent: 7.0.4 - ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3) zod: 3.23.8 transitivePeerDependencies: - '@swc/core' @@ -13324,9 +13163,9 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-browser-comments@4.0.0(browserslist@4.23.0)(postcss@8.4.35): + postcss-browser-comments@4.0.0(browserslist@4.23.3)(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 postcss: 8.4.35 postcss-custom-media@8.0.2(postcss@8.4.35): @@ -13334,13 +13173,13 @@ snapshots: postcss: 8.4.35 postcss-value-parser: 4.2.0 - postcss-load-config@3.1.4(postcss@8.4.35)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.4.5)): + postcss-load-config@3.1.4(postcss@8.4.35)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3) postcss-modules-extract-imports@3.0.0(postcss@8.4.35): dependencies: @@ -13358,17 +13197,17 @@ snapshots: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - postcss-nested@6.0.1(postcss@8.4.35): + postcss-nested@6.2.0(postcss@8.4.35): dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.1.1 - postcss-normalize@10.0.1(browserslist@4.23.0)(postcss@8.4.35): + postcss-normalize@10.0.1(browserslist@4.23.3)(postcss@8.4.35): dependencies: '@csstools/normalize.css': 12.0.0 - browserslist: 4.23.0 + browserslist: 4.23.3 postcss: 8.4.35 - postcss-browser-comments: 4.0.0(browserslist@4.23.0)(postcss@8.4.35) + postcss-browser-comments: 4.0.0(browserslist@4.23.3)(postcss@8.4.35) sanitize.css: 13.0.0 postcss-resolve-nested-selector@0.1.1: {} @@ -13377,12 +13216,12 @@ snapshots: dependencies: postcss: 8.4.33 - postcss-selector-parser@6.0.14: + postcss-selector-parser@6.0.15: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@6.0.15: + postcss-selector-parser@6.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -13392,22 +13231,22 @@ snapshots: postcss@8.4.33: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 postcss@8.4.35: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.39: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -13430,12 +13269,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -13479,7 +13312,7 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 qs@6.5.3: {} @@ -13535,7 +13368,7 @@ snapshots: dependencies: react: 18.2.0 react-dom: 18.0.0(react@18.2.0) - react-router-dom: 6.24.1(react-dom@18.0.0(react@18.2.0))(react@18.2.0) + react-router-dom: 6.25.1(react-dom@18.0.0(react@18.2.0))(react@18.2.0) react-cosmos-playground2@5.7.2: {} @@ -13597,7 +13430,7 @@ snapshots: dependencies: dnd-core: 16.0.1 - react-dnd@16.0.1(@types/node@20.14.9)(@types/react@18.2.65)(react@18.2.0): + react-dnd@16.0.1(@types/node@20.14.11)(@types/react@18.2.65)(react@18.2.0): dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -13606,7 +13439,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.2.0 optionalDependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 '@types/react': 18.2.65 react-dom@18.0.0(react@18.2.0): @@ -13682,23 +13515,23 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.24.1(react-dom@18.0.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.25.1(react-dom@18.0.0(react@18.2.0))(react@18.2.0): dependencies: - '@remix-run/router': 1.17.1 + '@remix-run/router': 1.18.0 react: 18.2.0 react-dom: 18.0.0(react@18.2.0) - react-router: 6.24.1(react@18.2.0) + react-router: 6.25.1(react@18.2.0) - react-router-dom@6.24.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.25.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@remix-run/router': 1.17.1 + '@remix-run/router': 1.18.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.24.1(react@18.2.0) + react-router: 6.25.1(react@18.2.0) - react-router@6.24.1(react@18.2.0): + react-router@6.25.1(react@18.2.0): dependencies: - '@remix-run/router': 1.17.1 + '@remix-run/router': 1.18.0 react: 18.2.0 react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -13710,7 +13543,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-virtuoso@4.7.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-virtuoso@4.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -13785,7 +13618,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.24.5 reflect.getprototypeof@1.0.4: dependencies: @@ -13807,19 +13640,10 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 + set-function-name: 2.0.2 relateurl@0.2.7: {} - remark-gfm@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - remark-parse@10.0.2: dependencies: '@types/mdast': 3.0.15 @@ -13901,16 +13725,16 @@ snapshots: onetime: 2.0.1 signal-exit: 3.0.7 - restore-cursor@4.0.0: + restore-cursor@5.1.0: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + onetime: 7.0.0 + signal-exit: 4.1.0 retry@0.13.1: {} reusify@1.0.4: {} - rfdc@1.3.1: {} + rfdc@1.4.1: {} rimraf@2.7.1: dependencies: @@ -13922,7 +13746,7 @@ snapshots: rimraf@5.0.5: dependencies: - glob: 10.3.10 + glob: 10.4.1 robust-predicates@3.0.2: {} @@ -14048,15 +13872,13 @@ snapshots: semver-try-require@6.2.3: dependencies: - semver: 7.6.0 + semver: 7.6.3 semver@5.7.2: {} semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.3: {} send@0.18.0: dependencies: @@ -14098,12 +13920,6 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.1: - dependencies: - define-data-property: 1.1.4 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 @@ -14138,12 +13954,6 @@ snapshots: shell-quote@1.8.1: {} - side-channel@1.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -14157,13 +13967,13 @@ snapshots: signal-exit@4.1.0: {} - sinon@17.0.1: + sinon@18.0.0: dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 11.2.2 '@sinonjs/samsam': 8.0.0 - diff: 5.1.0 - nise: 5.1.5 + diff: 5.2.0 + nise: 6.0.0 supports-color: 7.2.0 sisteransi@1.0.5: {} @@ -14308,10 +14118,6 @@ snapshots: std-env@3.7.0: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stream-composer@1.0.2: dependencies: streamx: 2.15.6 @@ -14371,11 +14177,16 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.3 + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 string.prototype.trim@1.2.9: dependencies: @@ -14388,7 +14199,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 string.prototype.trimend@1.0.8: dependencies: @@ -14400,7 +14211,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 string.prototype.trimstart@1.0.8: dependencies: @@ -14444,10 +14255,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.0.0: - dependencies: - js-tokens: 8.0.3 - strnum@1.0.5: {} strtok3@7.0.0: @@ -14459,11 +14266,11 @@ snapshots: dependencies: inline-style-parser: 0.1.1 - stylelint-config-recommended@14.0.1(stylelint@16.2.1(typescript@5.4.5)): + stylelint-config-recommended@14.0.1(stylelint@16.2.1(typescript@5.5.3)): dependencies: - stylelint: 16.2.1(typescript@5.4.5) + stylelint: 16.2.1(typescript@5.5.3) - stylelint@16.2.1(typescript@5.4.5): + stylelint@16.2.1(typescript@5.5.3): dependencies: '@csstools/css-parser-algorithms': 2.5.0(@csstools/css-tokenizer@2.2.3) '@csstools/css-tokenizer': 2.2.3 @@ -14471,7 +14278,7 @@ snapshots: '@csstools/selector-specificity': 3.0.1(postcss-selector-parser@6.0.15) balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.4.5) + cosmiconfig: 9.0.0(typescript@5.5.3) css-functions-list: 3.2.1 css-tree: 2.3.1 debug: 4.3.4 @@ -14510,7 +14317,7 @@ snapshots: stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.2 - debug: 4.3.4 + debug: 4.3.5 glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 @@ -14521,8 +14328,6 @@ snapshots: dependencies: kdbush: 4.0.2 - superstruct@1.0.4: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -14576,7 +14381,7 @@ snapshots: table@6.8.1: dependencies: - ajv: 8.16.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -14624,7 +14429,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 @@ -14634,6 +14439,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.1 + minimatch: 9.0.4 + text-table@0.2.0: {} texture-compressor@1.0.2: @@ -14652,15 +14463,17 @@ snapshots: through@2.3.8: {} - tinybench@2.5.1: {} + tinybench@2.8.0: {} - tinypool@0.8.4: {} + tinypool@1.0.0: {} tinyqueue@2.0.3: {} + tinyrainbow@1.2.0: {} + tinyspy@1.1.1: {} - tinyspy@2.2.0: {} + tinyspy@3.0.0: {} titleize@3.0.0: {} @@ -14700,9 +14513,9 @@ snapshots: trough@2.1.0: {} - ts-api-utils@1.0.3(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.5.3): dependencies: - typescript: 5.4.5 + typescript: 5.5.3 ts-json-schema-generator@2.3.0: dependencies: @@ -14713,29 +14526,29 @@ snapshots: normalize-path: 3.0.0 safe-stable-stringify: 2.4.3 tslib: 2.6.2 - typescript: 5.4.5 + typescript: 5.5.3 - ts-node@10.9.2(@types/node@20.14.9)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.9 + '@types/node': 20.14.11 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.5.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfck@3.0.3(typescript@5.4.5): + tsconfck@3.0.3(typescript@5.5.3): optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.3 tsconfig-paths-webpack-plugin@4.1.0: dependencies: @@ -14760,9 +14573,9 @@ snapshots: tslib@2.6.2: {} - tsx@4.15.7: + tsx@4.17.0: dependencies: - esbuild: 0.21.5 + esbuild: 0.23.0 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -14864,7 +14677,7 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-plugin-css-modules@5.1.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.4.5))(typescript@5.4.5): + typescript-plugin-css-modules@5.1.0(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))(typescript@5.5.3): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 '@types/postcss-modules-scope': 3.0.4 @@ -14873,7 +14686,7 @@ snapshots: less: 4.2.0 lodash.camelcase: 4.3.0 postcss: 8.4.35 - postcss-load-config: 3.1.4(postcss@8.4.35)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.4.5)) + postcss-load-config: 3.1.4(postcss@8.4.35)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) postcss-modules-scope: 3.1.1(postcss@8.4.35) @@ -14882,14 +14695,14 @@ snapshots: source-map-js: 1.0.2 stylus: 0.62.0 tsconfig-paths: 4.2.0 - typescript: 5.4.5 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - ts-node typescript@2.9.2: {} - typescript@5.4.5: {} + typescript@5.5.3: {} typewise-core@1.2.0: {} @@ -14899,8 +14712,6 @@ snapshots: udomdiff@1.1.0: {} - ufo@1.3.2: {} - uhtml@4.5.9: dependencies: '@webreflection/uparser': 0.3.3 @@ -14989,7 +14800,13 @@ snapshots: dependencies: browserslist: 4.23.0 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.0.1 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 uri-js@4.4.1: dependencies: @@ -15037,7 +14854,7 @@ snapshots: v8-to-istanbul@9.2.0: dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -15138,24 +14955,25 @@ snapshots: '@egjs/hammerjs': 2.0.17 component-emitter: 1.3.1 - vite-node@1.6.0(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): + vite-node@2.0.5(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + debug: 4.3.5 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-plugin-html@3.2.2(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): + vite-plugin-html@3.2.2(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -15169,71 +14987,71 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) - vite-plugin-mkcert@1.17.5(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): + vite-plugin-mkcert@1.17.5(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): dependencies: '@octokit/rest': 20.0.2 axios: 1.6.8(debug@4.3.4) debug: 4.3.4 picocolors: 1.0.0 - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): + vite-tsconfig-paths@5.0.1(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0)): dependencies: - debug: 4.3.4 + debug: 4.3.5 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.4.5) + tsconfck: 3.0.3(typescript@5.5.3) optionalDependencies: - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) transitivePeerDependencies: - supports-color - typescript - vite@5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): + vite@5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 + postcss: 8.4.41 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.11 fsevents: 2.3.3 less: 4.2.0 sass: 1.71.1 stylus: 0.62.0 terser: 5.31.0 - vitest@1.6.0(@types/node@20.14.9)(happy-dom@12.10.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): - dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.3.10 - debug: 4.3.4 + vitest@2.0.5(@types/node@20.14.11)(happy-dom@14.12.3)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.5 execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.5 - pathe: 1.1.1 - picocolors: 1.0.0 + magic-string: 0.30.10 + pathe: 1.1.2 std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.5.1 - tinypool: 0.8.4 - vite: 5.3.3(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) - vite-node: 1.6.0(@types/node@20.14.9)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) - why-is-node-running: 2.2.2 + tinybench: 2.8.0 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.4.0(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + vite-node: 2.0.5(@types/node@20.14.11)(less@4.2.0)(sass@1.71.1)(stylus@0.62.0)(terser@5.31.0) + why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.9 - happy-dom: 12.10.3 + '@types/node': 20.14.11 + happy-dom: 14.12.3 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -15277,9 +15095,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.2 @@ -15301,10 +15119,6 @@ snapshots: - esbuild - uglify-js - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} whatwg-url@5.0.0: @@ -15374,7 +15188,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -15429,7 +15243,7 @@ snapshots: yaml@2.3.4: {} - yaml@2.4.5: {} + yaml@2.5.0: {} yargs-parser@20.2.9: {} @@ -15464,5 +15278,3 @@ snapshots: yocto-queue@1.0.0: {} zod@3.23.8: {} - - zwitch@2.0.4: {} diff --git a/src/boot.ts b/src/boot.ts index bb9ed3a36..c4e35d497 100644 --- a/src/boot.ts +++ b/src/boot.ts @@ -1,4 +1,5 @@ import { apiClient, reportsClient } from '~core/apiClientInstance'; +import { authClientInstance } from '~core/authClientInstance'; import { getStageConfig } from '~core/config/loaders/stageConfigLoader'; import { getAppConfig, getLayerSourceUrl } from '~core/config/loaders/appConfigLoader'; import { readInitialUrl } from '~core/url_store/readInitialUrl'; @@ -19,28 +20,25 @@ export async function setupApplicationEnv() { // Shared config - comes from url const sharedConfig = readInitialUrl(); - // TODO - initialUrl from config repository - localStorage.setItem('initialUrl', location.href); // keep initial url before overwriting by router - // Stage config - depends from appconfig.json in CI repo // (/configs/config.local.json for localhost) const stageConfig = await getStageConfig(); + authClientInstance.init( + `${stageConfig.keycloakUrl}/realms/${stageConfig.keycloakRealm}`, + stageConfig.keycloakClientId, + ); + + apiClient.authService = authClientInstance; // Prepare clients for fetch additional configs from apis - apiClient.setup({ + apiClient.init({ baseUrl: stageConfig.apiGateway, - keycloakClientId: stageConfig.keycloakClientId, - keycloakRealm: stageConfig.keycloakRealm, - keycloakUrl: stageConfig.keycloakUrl, }); - reportsClient.setup({ + reportsClient.init({ baseUrl: stageConfig.reportsApiGateway, - disableAuth: true, }); - apiClient.checkLocalAuthToken(); - /* -- Now you can use client -- */ // App related configs @@ -49,14 +47,7 @@ export async function setupApplicationEnv() { setupAppIcons(appConfig); setupWebManifest(appConfig); - // WTF moment: Sometimes user comes with app settings... - // Just because backend probably know user from token in request - // User added to this response. - // TODO - fix that, do not mixing things - // If not - we use public - // publicUser takes settings from stage configuration - // TODO - get user settings by token - + // use user data from app config endpoint or local defaults for anonymous session const initialUser = appConfig.user ?? createPublicUser({ @@ -67,7 +58,9 @@ export async function setupApplicationEnv() { osmEditor: stageConfig.osmEditors[0].id, defaultFeed: stageConfig.defaultFeed, }); + setAppLanguage(initialUser.language); + const defaultLayers = await getDefaultLayers(appConfig.id, initialUser.language); // Resolve initially enabled layers list @@ -86,7 +79,8 @@ export async function setupApplicationEnv() { configRepo.set({ baseUrl, - initialUrl: sharedConfig, + initialUrlData: sharedConfig, + initialUrl: location.href, // keep initial url before overwriting by router activeLayers, stageConfig, appConfig, diff --git a/src/components/ConnectedMap/map-libre-adapter/index.tsx b/src/components/ConnectedMap/map-libre-adapter/index.tsx index b96b70ef5..46ca059ae 100644 --- a/src/components/ConnectedMap/map-libre-adapter/index.tsx +++ b/src/components/ConnectedMap/map-libre-adapter/index.tsx @@ -1,65 +1,27 @@ import React, { useEffect, useRef, useState, forwardRef } from 'react'; -import ReactDOMServer from 'react-dom/server'; import mapLibre from 'maplibre-gl'; import 'maplibre-gl/dist/maplibre-gl.css'; import { configRepo } from '~core/config'; import { currentMapPositionAtom } from '~core/shared_state'; import { EVENT_MAP_IDLE } from '~core/metrics/constants'; import { dispatchMetricsEvent } from '~core/metrics/dispatch'; -import { useMarkers } from './useMarkers'; import { useArrayDiff } from './useArrayDiff'; -import type { Marker } from './types'; import type { - CustomLayerInterface, - MapMouseEvent, MapOptions, - Event, Map, LayerSpecification, - LngLatBoundsLike, - GeoJSONFeature, GeoJSONSource, GeoJSONSourceOptions, StyleSpecification, } from 'maplibre-gl'; -interface FeatureState { - source: string; // source id - sourceLayer?: string; // for vector - id: string; // feature id - state: Record; -} - -interface Popup { - layout: string | React.ReactChild; - options: { closeOnClick: boolean; offset: number }; - coordinates: [number, number]; -} - -/* Omg mapbox types ... */ -type MapStyle = Omit & - Partial> & { - layers?: (LayerSpecification | CustomLayerInterface)[]; - }; - export interface MapBoxMapProps { style: string; mapStyle?: StyleSpecification; className?: string; options?: Partial; - setMap?: any; onLoad?: (loaded: boolean) => void; - onClick?: (ev: MapMouseEvent & Event) => void | undefined; - /* Call `callback` on every `eventType` with `properties` */ - activeFeature?: { - callback: (features: unknown[]) => void; - properties: string[]; - eventType: string; - }; - popup?: Popup; - featuresState?: FeatureState[]; - bounds?: LngLatBoundsLike; - markers?: Marker[]; + isochroneStyle?: any; layersOnTop?: string[]; } @@ -89,11 +51,6 @@ function MapboxMap( options, className, onLoad, - onClick, - activeFeature, - featuresState, - popup, - markers, isochroneStyle, layersOnTop, }: MapBoxMapProps, @@ -201,74 +158,6 @@ function MapboxMap( }; }, [map, onLoad]); - /* Set markers effect */ - const mapBoxMarkers = useMarkers(markers); - const { added: addedMarkers, deleted: deletedMarkers } = useArrayDiff(mapBoxMarkers); - - useEffect(() => { - if (!map) return; - addedMarkers.forEach((marker) => marker.addTo(map)); - }, [map, addedMarkers]); - - useEffect(() => { - if (!map) return; - deletedMarkers.forEach((marker) => marker.remove()); - }, [map, deletedMarkers]); - - /* On onClick effect */ - useEffect(() => { - if (!map) return; - if (!onClick) return; - if (!mapLoaded) return; - - map.on('click', onClick); - return (): void => { - map.off('click', onClick); - }; - }, [map, onClick, mapLoaded]); - - /* On activeFeature effect */ - useEffect(() => { - if (!map) return; - if (!mapLoaded) return; - if (!activeFeature) return; - const clickHandler = (e): void => { - const features = map.queryRenderedFeatures(e.point); - const extractProperties = - (props: string[]) => - (feature: GeoJSONFeature): unknown => - props.reduce((filtered, prop) => { - filtered[prop] = feature[prop]; - return filtered; - }, {}); - const filteredFeatures = features.map(extractProperties(activeFeature.properties)); - activeFeature.callback(filteredFeatures); - }; - map.on(activeFeature.eventType, clickHandler); - return (): void => { - map.off(activeFeature.eventType, clickHandler); - }; - }, [mapLoaded, activeFeature, map]); - - /* Feature state effect */ - const { added: addedStates, deleted: deletedStates } = useArrayDiff(featuresState); - - useEffect(() => { - if (!map) return; - if (!mapLoaded) return; - addedStates.forEach(({ source, id, sourceLayer, state }) => { - map.setFeatureState({ source, id, sourceLayer }, state); - }); - }, [mapLoaded, addedStates, map]); - - useEffect(() => { - if (!map) return; - if (!mapLoaded) return; - deletedStates.forEach(({ source, id, sourceLayer }) => { - map.removeFeatureState({ source, id, sourceLayer }); - }); - }, [mapLoaded, deletedStates, map]); - /* Style sources effect */ useEffect(() => { if (!map) return; @@ -327,29 +216,6 @@ function MapboxMap( }); }, [addedLayers, layersOnTop, map, mapLoaded]); - /* Popup effect */ - useEffect(() => { - if (!map) return; - if (!mapLoaded) return; - if (!popup) return; - - const renderString = - typeof popup.layout === 'string' - ? popup.layout - : typeof popup.layout === 'number' - ? String(popup.layout) - : ReactDOMServer.renderToStaticMarkup(popup.layout); - - const popupInstance = new mapLibre.Popup(popup.options) - .setLngLat(popup.coordinates) - .setHTML(renderString) - .addTo(map); - - return (): void => { - popupInstance.remove(); - }; - }, [popup]); - /* Clean up */ useEffect(() => { if (!map) return; diff --git a/src/core/api/features.ts b/src/core/api/features.ts index ec2f917d8..52dde3af2 100644 --- a/src/core/api/features.ts +++ b/src/core/api/features.ts @@ -1,6 +1,6 @@ import { apiClient } from '~core/apiClientInstance'; import { i18n } from '~core/localization'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { configRepo } from '~core/config'; import type { CustomRequestConfig } from '~core/api_client/types'; import type { GeometryWithHash } from '~core/focused_geometry/types'; diff --git a/src/core/apiClientInstance.ts b/src/core/apiClientInstance.ts index 768e7d784..edb9d6420 100644 --- a/src/core/apiClientInstance.ts +++ b/src/core/apiClientInstance.ts @@ -1,20 +1,10 @@ -import { withSetupCheck } from '~utils/common/withSetupCheck'; import { ApiClient } from './api_client'; import { notificationServiceInstance } from './notificationServiceInstance'; -export const apiClient = withSetupCheck(ApiClient, { +export const apiClient = new ApiClient({ on: { error: (error) => { switch (error.problem.kind) { - case 'unauthorized': - case 'forbidden': - alert('Access denied or your session expired.'); - import('~core/router/goTo').then(({ goTo }) => { - goTo('/profile'); - location.reload(); - }); - break; - default: notificationServiceInstance.error({ title: 'Error', @@ -25,7 +15,7 @@ export const apiClient = withSetupCheck(ApiClient, { }, }); -export const reportsClient = withSetupCheck(ApiClient, { +export const reportsClient = new ApiClient({ on: { error: (error) => { switch (error.problem.kind) { diff --git a/src/core/api_client/apiClient.ts b/src/core/api_client/apiClient.ts index 92205dab2..bf0319172 100644 --- a/src/core/api_client/apiClient.ts +++ b/src/core/api_client/apiClient.ts @@ -1,76 +1,41 @@ import wretch from 'wretch'; import QueryStringAddon from 'wretch/addons/queryString'; -import FormUrlAddon from 'wretch/addons/formUrl'; -import { jwtDecode } from 'jwt-decode'; import { replaceUrlWithProxy } from '~utils/axios/replaceUrlWithProxy'; import { KONTUR_DEBUG } from '~utils/debug'; -import { localStorage } from '~utils/storage'; -import { typedObjectEntries } from 'types/entry'; -import { wait } from '~utils/test'; -import { ApiClientError } from './apiClientError'; +import { wait } from '~utils/test/wait'; +import { typedObjectEntries } from '../../types/entry'; import { createApiError } from './errors'; import { ApiMethodTypes } from './types'; -import type { WretchResponse } from 'wretch'; +import { autoParseBody } from './utils'; +import type { ApiClientError } from './apiClientError'; import type { ApiClientConfig, - ApiResponse, ApiMethod, CustomRequestConfig, - JWTData, - KeycloakAuthResponse, RequestParams, } from './types'; +import type { OidcSimpleClient } from '~core/auth/OidcSimpleClient'; -export const LOCALSTORAGE_AUTH_KEY = 'auth_token'; -const TIME_TO_REFRESH_MS = 1000 * 60 * 3; export class ApiClient { private listeners = new Map([['error', new Set<(e: ApiClientError) => void>()]]); - private loginApiPath!: string; - private refreshTokenApiPath!: string; - private disableAuth!: boolean; - private readonly storage: WindowLocalStorage['localStorage']; - private token = ''; - private refreshToken = ''; - private tokenExpirationDate: Date | undefined; - private refreshTokenExpirationDate: Date | undefined; - private tokenRefreshFlowPromise: Promise | undefined; - private keycloakClientId!: string; private baseURL!: string; - timeToRefresh: number = TIME_TO_REFRESH_MS; // Should be less then Access Token Lifespan + + authService!: OidcSimpleClient; /** * The Singleton's constructor should always be private to prevent direct * construction calls with the `new` operator. */ - constructor({ - storage = localStorage, - on, - }: { - storage?: WindowLocalStorage['localStorage']; - on?: { error: (c: ApiClientError) => void }; - }) { + constructor({ on }: { on?: { error: (c: ApiClientError) => void } }) { if (on) { typedObjectEntries(on).forEach(([event, cb]) => this.on(event, cb)); } - this.storage = storage; } - public setup(cfg: ApiClientConfig) { - if (!cfg.disableAuth) { - this.disableAuth = false; - this.loginApiPath = `${cfg.keycloakUrl}/realms/${cfg.keycloakRealm}/protocol/openid-connect/token`; - this.refreshTokenApiPath = `${cfg.keycloakUrl}/realms/${cfg.keycloakRealm}/protocol/openid-connect/token`; - this.keycloakClientId = cfg.keycloakClientId; - if (import.meta.env?.DEV) { - this.loginApiPath = replaceUrlWithProxy(this.loginApiPath); - } - } else { - this.disableAuth = true; - } - + public init(cfg: ApiClientConfig) { // Will deleted by terser let baseURL = cfg.baseUrl; - if (import.meta.env?.DEV) { + if (import.meta.env.DEV) { baseURL = replaceUrlWithProxy(baseURL ?? ''); } this.baseURL = baseURL; @@ -80,206 +45,15 @@ export class ApiClient { this.listeners.get(event)?.add(cb); return () => this.listeners.get(event)?.delete(cb); } - - /** - * Authentication - * @throws {ApiClientError} - */ - private storeTokens(token: string, refreshToken: string): boolean { - let errorMessage = ''; - try { - const decodedToken: JWTData = jwtDecode(token); - const decodedRefreshToken: JWTData = jwtDecode(refreshToken); - if (KONTUR_DEBUG) { - console.debug({ - decodedToken, - at_ttl: decodedToken.exp - decodedToken.iat, - decodedRefreshToken, - rt_ttl: decodedRefreshToken.exp - decodedRefreshToken.iat, - now: Date.now(), - }); - } - if (decodedToken?.exp && decodedRefreshToken?.exp) { - const expiringDate = new Date(decodedToken.exp * 1000); - const expiringRefreshDate = new Date(decodedRefreshToken.exp * 1000); - if (expiringDate > new Date()) { - this.setAuth(token, refreshToken, expiringDate, expiringRefreshDate); - this.storage.setItem( - LOCALSTORAGE_AUTH_KEY, - JSON.stringify({ token, refreshToken }), - ); - return true; - } else { - errorMessage = 'Token is expired right after receiving, clock is out of sync'; - } - } - } catch (e) { - errorMessage = e?.['message']; - } - throw new ApiClientError(errorMessage || 'Token error', { kind: 'bad-data' }); - } - - /** - * check and use local token, reset auth if token is absent or invalid - * @returns true on success - */ - checkLocalAuthToken(): boolean { - if (this.token && this.refreshToken) { - return true; - } - try { - const storedTokensJson = this.storage.getItem(LOCALSTORAGE_AUTH_KEY); - if (storedTokensJson) { - const { token, refreshToken } = JSON.parse(storedTokensJson); - if (token && refreshToken) { - const decodedToken: JWTData = jwtDecode(token); - const tokenLifetime = decodedToken.exp - decodedToken.iat; - // ensure timeToRefresh is shorter than tokenLifetime - this.timeToRefresh = Math.min( - Math.trunc((tokenLifetime * 1000) / 5), - TIME_TO_REFRESH_MS, - ); - const decodedRefreshToken: JWTData = jwtDecode(refreshToken); - const expiringDate = new Date(decodedToken.exp * 1000); - const expiringRefreshDate = new Date(decodedRefreshToken.exp * 1000); - this.setAuth(token, refreshToken, expiringDate, expiringRefreshDate); - return true; - } - } - } catch (e) { - console.debug('checkLocalAuthToken:', e); - } - this.resetAuth(); - return false; - } - - private resetAuth() { - this.token = ''; - this.refreshToken = ''; - this.tokenExpirationDate = undefined; - this.refreshTokenExpirationDate = undefined; - this.storage.removeItem(LOCALSTORAGE_AUTH_KEY); - } - - private setAuth( - token: string, - refreshToken: string, - expiringDate: Date | undefined, - expiringRefreshDate?: Date | undefined, - ) { - this.token = token; - this.refreshToken = refreshToken; - this.tokenExpirationDate = expiringDate; - this.refreshTokenExpirationDate = expiringRefreshDate; - } - - private async _tokenRefreshFlow() { - if (!this.tokenExpirationDate) { - return false; - } - const diffTime = this.tokenExpirationDate.getTime() - new Date().getTime(); - if (diffTime < this.timeToRefresh) { - // token expires soon, refresh it - try { - await this.refreshAuthToken(); - } catch (error) { - return false; - } - } - return true; - } - - /** - * @throws {ApiClientError} - */ - private async isTokenOk(): Promise { - if (!this.tokenRefreshFlowPromise) { - this.tokenRefreshFlowPromise = this._tokenRefreshFlow(); - } - const tokenCheck = await this.tokenRefreshFlowPromise; - this.tokenRefreshFlowPromise = undefined; - return tokenCheck; - } - - /** - * @throws {ApiClientError} - */ - public async login(username: string, password: string): Promise { - const params = { - username: username, - password: password, - client_id: this.keycloakClientId, - grant_type: 'password', - }; - return await this.requestTokenOrThrow(this.loginApiPath, params); - } - - /** - * @throws {ApiClientError} - */ - public async refreshAuthToken(): Promise { - const params = { - client_id: this.keycloakClientId, - refresh_token: this.refreshToken, - grant_type: 'refresh_token', - }; - - // if refresh token is expired, logout - if ( - !this.refreshTokenExpirationDate || - this.refreshTokenExpirationDate < new Date() - ) { - await this.logout(); - throw new ApiClientError('Refresh token expired', { - kind: 'unauthorized', - data: 'Refresh token not found or expired', - }); - } - - try { - return await this.requestTokenOrThrow(this.refreshTokenApiPath, params); - } catch (error) { - // logout on refresh token error - await this.logout(); - throw error; - } - } - - /** - * @throws {ApiClientError} - */ - private async requestTokenOrThrow(url: string, params: object): Promise { - try { - const response = (await wretch(url) - .addon(FormUrlAddon) - .formUrl(params) - .errorType('json') - .post() - .res(autoParseBody)) as ApiResponse; - if (response?.data?.access_token) { - return this.storeTokens(response.data.access_token, response.data.refresh_token); - } - throw new ApiClientError('Token error', { kind: 'bad-data' }); - } catch (err) { - // unable to login or refresh token - const error = createApiError(err); - throw error; - } - } - private _emit(type: 'error', payload: ApiClientError) { this.listeners.get(type)?.forEach((l) => l(payload)); } - logout() { - this.resetAuth(); - } - private async call( method: ApiMethod, path: string, requestParams?: unknown, - useAuth = !this.disableAuth, + useAuth = false, requestConfig: CustomRequestConfig = {}, ): Promise { const RequestsWithBody = ['post', 'put', 'patch']; @@ -302,23 +76,24 @@ export class ApiClient { req = req.headers(requestConfig.headers); } - if (!this.disableAuth && useAuth && this.token) { - const tokenOk = await this.isTokenOk(); - if (tokenOk) { - req = req - .auth(`Bearer ${this.token}`) - .catcher(401, async (_, originalRequest) => { - await this.refreshAuthToken(); - // replay original request with new token - return originalRequest - .auth(`Bearer ${this.token}`) - .fetch() - .unauthorized((err) => { - // Redefine unauthorized hook to prevent infinite loops with multiple 401 errors - throw err; - }) - .res(autoParseBody); - }); + let isAuthenticatedRequest = false; + + if (useAuth) { + const token = await this.authService.getAccessToken(); + if (token) { + isAuthenticatedRequest = true; + req = req.auth(`Bearer ${token}`).catcher(401, async (_, originalRequest) => { + const token = await this.authService.getAccessToken(); + // replay original request with new token + return originalRequest + .auth(`Bearer ${token}`) + .fetch() + .unauthorized((err) => { + // Redefine unauthorized hook to prevent infinite loops with multiple 401 errors + throw err; + }) + .res(autoParseBody); + }); } } @@ -333,13 +108,23 @@ export class ApiClient { return response.data as T; } catch (err) { const apiError = createApiError(err); + if (apiError.problem.kind === 'canceled') { throw apiError; } - if (apiError.problem.kind === 'unauthorized') { - // TODO: call redirection callback if user not authorized, route to login page - this.resetAuth(); - this._emit('error', apiError); + + if (isAuthenticatedRequest && apiError.problem.kind === 'unauthorized') { + try { + // sometimes infrastructure returns 401 + // try refreshing token to ensure it's auth problem and not infrastructure error + const token = await this.authService.getAccessToken(); + } catch (error) { + // logout is handled in authService for this case + import('~core/router/goTo').then(({ goTo }) => { + goTo('/profile'); + }); + } + throw apiError; } // Retry after timeout error @@ -382,7 +167,7 @@ export class ApiClient { public async get( path: string, requestParams?: RequestParams, - useAuth = !this.disableAuth, + useAuth = false, requestConfig?: CustomRequestConfig, ): Promise { return this.call(ApiMethodTypes.GET, path, requestParams, useAuth, requestConfig); @@ -391,7 +176,7 @@ export class ApiClient { public async post( path: string, requestParams?: unknown, - useAuth = !this.disableAuth, + useAuth = false, requestConfig?: CustomRequestConfig, ): Promise { return this.call(ApiMethodTypes.POST, path, requestParams, useAuth, requestConfig); @@ -400,7 +185,7 @@ export class ApiClient { public async put( path: string, requestParams?: RequestParams, - useAuth = !this.disableAuth, + useAuth = false, requestConfig?: CustomRequestConfig, ): Promise { return this.call(ApiMethodTypes.PUT, path, requestParams, useAuth, requestConfig); @@ -409,7 +194,7 @@ export class ApiClient { public async patch( path: string, requestParams?: RequestParams, - useAuth = !this.disableAuth, + useAuth = false, requestConfig?: CustomRequestConfig, ): Promise { return this.call(ApiMethodTypes.PATCH, path, requestParams, useAuth, requestConfig); @@ -417,29 +202,9 @@ export class ApiClient { public async delete( path: string, - useAuth = !this.disableAuth, + useAuth = false, requestConfig?: CustomRequestConfig, ): Promise { return this.call(ApiMethodTypes.DELETE, path, undefined, useAuth, requestConfig); } } - -async function autoParseBody(res: WretchResponse) { - if (res.status === 204) { - res.data = null; - return res; - } - - if (res.ok) { - const contentType = res.headers.get('content-type') ?? ''; - if (contentType.includes('application/json')) { - res.data = await res.json(); - } else { - res.data = await res.text(); - } - } else { - console.debug('autoParseBody', res); - } - - return res; -} diff --git a/src/core/api_client/tests/_clientTestsContext.ts b/src/core/api_client/tests/_clientTestsContext.ts index 6b01020e5..562a80b2e 100644 --- a/src/core/api_client/tests/_clientTestsContext.ts +++ b/src/core/api_client/tests/_clientTestsContext.ts @@ -1,5 +1,6 @@ import 'vi-fetch/setup'; import { mockFetch, mockGet, mockPost } from 'vi-fetch'; +import { OidcSimpleClient } from '~core/auth/OidcSimpleClient'; import { ApiClient } from '../apiClient'; import { base64UrlDecode, base64UrlEncode } from './_tokenUtils'; @@ -45,30 +46,27 @@ export const createContext = () => { const localStorageMock = createLocalStorageMock(); - const apiClient = new ApiClient({ - storage: localStorageMock, - }); + const apiClient = new ApiClient({}); + apiClient.init({ baseUrl }); + const authClient = new OidcSimpleClient(localStorageMock); + apiClient.authService = authClient; const keycloakRealm = 'keycloak_mock_realm'; - apiClient.setup({ - baseUrl, - keycloakClientId: 'keycloak_mock_id', - keycloakRealm, - keycloakUrl: baseUrl, - }); + authClient.init(`${baseUrl}/realms/${keycloakRealm}`, 'keycloak_mock_id'); - (apiClient as any).token = token; - (apiClient as any).tokenExpirationDate = new Date( + (authClient as any).token = token; + (authClient as any).tokenExpirationDate = new Date( new Date().getTime() + 1000 * 60 * 30, ); - (apiClient as any).refreshToken = refreshToken; - (apiClient as any).refreshTokenExpirationDate = new Date( + (authClient as any).refreshToken = refreshToken; + (authClient as any).refreshTokenExpirationDate = new Date( new Date().getTime() + 1000 * 60 * 60 * 24 * 30, ); return { apiClient, - loginFunc: async () => await apiClient.login(username, password), + authClient, + loginFunc: async () => await authClient.login(username, password), token: actualToken, expiredToken: expiredToken, refreshToken: refreshToken, diff --git a/src/core/api_client/tests/authorization.test.ts b/src/core/api_client/tests/authorization.test.ts index 4d3d23a79..bf8cf096b 100644 --- a/src/core/api_client/tests/authorization.test.ts +++ b/src/core/api_client/tests/authorization.test.ts @@ -22,7 +22,7 @@ test('can login with username and password', async ({ ctx }) => { sinon.replace(ctx.localStorageMock, 'setItem', setItemFake); // Login - const res: any = await ctx.apiClient.login(ctx.username, ctx.password); + const res: any = await ctx.authClient.login(ctx.username, ctx.password); // Assertions expect(setItemFake.getCall(0).args[1], 'token saved in storage').toBe( @@ -203,7 +203,7 @@ test('Not add authorization header to api without authorization', async ({ ctx } const apiWithoutAuthorizationMock = ctx.mockAdapter.onPost('/test').willResolve(); // Api calls - await ctx.apiClient.login(ctx.username, ctx.password); + await ctx.authClient.login(ctx.username, ctx.password); await ctx.apiClient.post('/test', { param1: 'test' }, false); // Assertions diff --git a/src/core/api_client/types.ts b/src/core/api_client/types.ts index f8fced47b..10e760461 100644 --- a/src/core/api_client/types.ts +++ b/src/core/api_client/types.ts @@ -19,15 +19,7 @@ export const ApiMethodTypes = { export type ApiMethod = (typeof ApiMethodTypes)[keyof typeof ApiMethodTypes]; -export type ApiClientConfig = - | { baseUrl: string; disableAuth: true } - | { - baseUrl: string; - keycloakUrl: string; - keycloakRealm: string; - keycloakClientId: string; - disableAuth?: false; - }; +export type ApiClientConfig = { baseUrl: string }; export interface KeycloakAuthResponse { access_token: string; diff --git a/src/core/api_client/utils.ts b/src/core/api_client/utils.ts new file mode 100644 index 000000000..a78ab6108 --- /dev/null +++ b/src/core/api_client/utils.ts @@ -0,0 +1,21 @@ +import type { WretchResponse } from 'wretch/types'; + +export async function autoParseBody(res: WretchResponse) { + if (res.status === 204) { + res.data = null; + return res; + } + + if (res.ok) { + const contentType = res.headers.get('content-type') ?? ''; + if (contentType.includes('application/json')) { + res.data = await res.json(); + } else { + res.data = await res.text(); + } + } else { + console.debug('autoParseBody', res); + } + + return res; +} diff --git a/src/core/app/authHooks.ts b/src/core/app/authHooks.ts index a06e6b6b7..0ca503ddb 100644 --- a/src/core/app/authHooks.ts +++ b/src/core/app/authHooks.ts @@ -1,6 +1,4 @@ import { configRepo } from '~core/config'; -import { currentUserAtom } from '~core/shared_state/currentUser'; -import { featureFlagsAtom } from '~core/shared_state/featureFlags'; import { yandexMetrics } from '~core/metrics'; import type { UserDto } from './user'; @@ -8,9 +6,7 @@ export async function onLogin() { const config = configRepo.get(); if (config.user) { externalLoginTasks(config.user); - currentUserAtom.setUser.dispatch({ ...config.user }); } - featureFlagsAtom.set.dispatch(config.features); } function externalLoginTasks(user: UserDto) { diff --git a/src/core/app/postAppInit.ts b/src/core/app/postAppInit.ts index fb171d466..a05660ec3 100644 --- a/src/core/app/postAppInit.ts +++ b/src/core/app/postAppInit.ts @@ -1,16 +1,12 @@ -import { authClientInstance } from '~core/authClientInstance'; import { urlStoreAtom } from '~core/url_store'; import { onLogin } from './authHooks'; import { runAtom } from './index'; import type { Config } from '~core/config/types'; export async function postAppInit(config: Config) { - authClientInstance.loginHook = onLogin.bind(authClientInstance); - const isAuthenticated = authClientInstance.checkAuth(); - // It's required to refresh auth tokens to get the fresh roles data from keycloak - if (isAuthenticated) await authClientInstance.refreshAuth(); + onLogin(); urlStoreAtom.init.dispatch({ - ...config.initialUrl, + ...config.initialUrlData, layers: config.activeLayers, }); runAtom(urlStoreAtom); diff --git a/src/core/auth/types.ts b/src/core/app/types.ts similarity index 87% rename from src/core/auth/types.ts rename to src/core/app/types.ts index 7aa8bea84..262cc23f1 100644 --- a/src/core/auth/types.ts +++ b/src/core/app/types.ts @@ -1,13 +1,3 @@ -export const UserStateStatus = { - AUTHORIZED: 'authorized', - UNAUTHORIZED: 'unauthorized', - LOGGING_IN: 'logging_in', - SIGNING_UP: 'signing_up', - PASSWORD_RESET: 'password_reset', -} as const; - -export type UserStateType = (typeof UserStateStatus)[keyof typeof UserStateStatus]; - export const AppFeature = { ABOUT_PAGE: 'about_page', APP_LOGIN: 'app_login', diff --git a/src/core/auth/atoms/userWasLanded.ts b/src/core/app/userWasLanded.ts similarity index 79% rename from src/core/auth/atoms/userWasLanded.ts rename to src/core/app/userWasLanded.ts index e589b7429..53e8ef675 100644 --- a/src/core/auth/atoms/userWasLanded.ts +++ b/src/core/app/userWasLanded.ts @@ -4,8 +4,7 @@ import { localStorage } from '~utils/storage'; export function userWasLanded() { if (localStorage.getItem('landed') !== null) return true; - // TODO: move this detection to earlier stage in init and avoid using localStorage for initialUrl - const initialUrl = localStorage.getItem('initialUrl'); + const initialUrl = configRepo.get().initialUrl; if (initialUrl === null) return true; const initialUrlObj = new URL(initialUrl); // check that user visits homepage and not came via link to disaster etc (should be no params in url) diff --git a/src/core/auth/OidcSimpleClient.ts b/src/core/auth/OidcSimpleClient.ts new file mode 100644 index 000000000..2b74aef8c --- /dev/null +++ b/src/core/auth/OidcSimpleClient.ts @@ -0,0 +1,299 @@ +import wretch from 'wretch'; +import FormUrlAddon from 'wretch/addons/formUrl'; +import { jwtDecode } from 'jwt-decode'; +import { ApiClientError } from '~core/api_client/apiClientError'; +import { createApiError } from '~core/api_client/errors'; +import { replaceUrlWithProxy } from '~utils/axios/replaceUrlWithProxy'; +import { KONTUR_DEBUG } from '~utils/debug'; +import { localStorage } from '~utils/storage'; +import { autoParseBody } from '~core/api_client/utils'; +import type { ApiResponse, KeycloakAuthResponse } from '~core/api_client/types'; + +export const LOCALSTORAGE_AUTH_KEY = 'auth_token'; +const TIME_TO_REFRESH_MS = 1000 * 60 * 3; + +export class OidcSimpleClient { + private issuerUri!: string; + private clientId!: string; + private tokenEndpoint!: string; + private endSessionEndpoint!: string; + private token = ''; + private refreshToken = ''; + private tokenExpirationDate: Date | undefined; + private refreshTokenExpirationDate: Date | undefined; + private tokenRefreshFlowPromise: Promise | undefined; + + timeToRefresh: number = TIME_TO_REFRESH_MS; // Must be less then Access Token Lifespan + isUserLoggedIn = false; + + constructor( + private readonly storage: WindowLocalStorage['localStorage'] = localStorage, + ) {} + + public async init(issuerUri: string, clientId: string) { + this.issuerUri = issuerUri; + this.clientId = clientId; + + // endpoints, can be found in ${this.issuerUri}/.well-known/openid-configuration + this.tokenEndpoint = `${this.issuerUri}/protocol/openid-connect/token`; + + // end_session_endpoint /protocol/openid-connect/logout + this.endSessionEndpoint = `${this.issuerUri}/protocol/openid-connect/logout`; + + if (import.meta.env?.DEV) { + this.tokenEndpoint = replaceUrlWithProxy(this.tokenEndpoint); + } + + if (this.checkLocalAuthToken()) { + this.isUserLoggedIn = true; + // It's required to refresh auth tokens to get the fresh roles data from keycloak + await this.refreshAuthToken(); + } + } + + /** + * Authentication + * @throws {ApiClientError} + */ + private storeTokens(token: string, refreshToken: string): boolean { + let errorMessage = ''; + try { + const decodedToken = parseToken(token); + const decodedRefreshToken = parseToken(refreshToken); + if (!decodedToken.isExpired) { + this.setAuth( + token, + refreshToken, + decodedToken.expiringDate, + decodedRefreshToken.expiringDate, + ); + this.storage.setItem( + LOCALSTORAGE_AUTH_KEY, + JSON.stringify({ token, refreshToken }), + ); + return true; + } else { + errorMessage = 'Token is expired right after receiving, clock is out of sync'; + } + } catch (e) { + errorMessage = e?.['message']; + } + throw new ApiClientError(errorMessage || 'Token error', { kind: 'bad-data' }); + } + + /** + * check and use local token, reset auth if token is absent or invalid + * @returns true on success + */ + checkLocalAuthToken(): boolean { + if (this.token && this.refreshToken) { + return true; + } + try { + const storedTokensJson = this.storage.getItem(LOCALSTORAGE_AUTH_KEY); + if (storedTokensJson) { + const { token, refreshToken } = JSON.parse(storedTokensJson); + if (token && refreshToken) { + const decodedToken = parseToken(token); + // ensure timeToRefresh is shorter than tokenLifetime + this.timeToRefresh = Math.min( + Math.trunc((decodedToken.tokenLifetime * 1000) / 5), + TIME_TO_REFRESH_MS, + ); + const decodedRefreshToken = parseToken(refreshToken); + this.setAuth( + token, + refreshToken, + decodedToken.expiringDate, + decodedRefreshToken.expiringDate, + ); + return true; + } + } + } catch (e) { + console.debug('checkLocalAuthToken:', e); + } + this.resetAuth(); + return false; + } + + private resetAuth() { + this.token = ''; + this.refreshToken = ''; + this.tokenExpirationDate = undefined; + this.refreshTokenExpirationDate = undefined; + this.storage.removeItem(LOCALSTORAGE_AUTH_KEY); + } + + private setAuth( + token: string, + refreshToken: string, + expiringDate: Date | undefined, + expiringRefreshDate?: Date | undefined, + ) { + this.token = token; + this.refreshToken = refreshToken; + this.tokenExpirationDate = expiringDate; + this.refreshTokenExpirationDate = expiringRefreshDate; + } + + private async _tokenRefreshFlow() { + if (!this.tokenExpirationDate) { + return false; + } + const diffTime = this.tokenExpirationDate.getTime() - Date.now(); + if (diffTime < this.timeToRefresh) { + // token expires soon, refresh it + try { + await this.refreshAuthToken(); + } catch (error) { + return false; + } + } + return true; + } + + /** + * return AT or throw error + * automatically refreshes expired or expiring soon AT + * @throws {ApiClientError} + */ + async getAccessToken() { + if (!this.tokenRefreshFlowPromise) { + this.tokenRefreshFlowPromise = this._tokenRefreshFlow(); + } + const tokenCheck = await this.tokenRefreshFlowPromise; + this.tokenRefreshFlowPromise = undefined; + return this.token; + } + + isRefreshTokenExpired() { + return ( + !this.refreshTokenExpirationDate || this.refreshTokenExpirationDate < new Date() + ); + } + + /** + * @throws {ApiClientError} + */ + private async refreshAuthToken(): Promise { + // if refresh token is expired, logout + if (this.isRefreshTokenExpired()) { + await this.logout(); + throw new ApiClientError('Refresh token expired', { + kind: 'unauthorized', + data: 'Refresh token not found or expired', + }); + } + + const params = { + client_id: this.clientId, + refresh_token: this.refreshToken, + grant_type: 'refresh_token', + }; + + try { + return await this.requestTokenOrThrow(this.tokenEndpoint, params); + } catch (error) { + // logout on refresh token error + await this.logout(); + throw error; + } + } + + /** + * @throws {ApiClientError} + */ + private async requestTokenOrThrow(url: string, params: object): Promise { + try { + const response = (await wretch(url) + .addon(FormUrlAddon) + .formUrl(params) + .errorType('json') + .post() + .res(autoParseBody)) as ApiResponse; + if (response?.data?.access_token) { + return this.storeTokens(response.data.access_token, response.data.refresh_token); + } + throw new ApiClientError('Token error', { kind: 'bad-data' }); + } catch (err) { + // unable to login or refresh token + throw createApiError(err); + } + } + + /** + * Direct username/password authentication + * Warning: legacy grant type, removed in OAuth 2.1 + * @throws {ApiClientError} + */ + public async login(username: string, password: string): Promise { + const params = { + username: username, + password: password, + client_id: this.clientId, + grant_type: 'password', + }; + return await this.requestTokenOrThrow(this.tokenEndpoint, params); + } + + /** + * @returns true or error message + */ + public async authenticate(user: string, password: string) { + try { + const loginOk = await this.login(user, password); + if (loginOk) { + // reload to init with authenticated config and profile + location.reload(); + } + return true; + } catch (e: any) { + return e?.message || 'Login error'; + } + } + + async endSession() { + const params = { + client_id: this.clientId, + refresh_token: this.refreshToken, + }; + this.resetAuth(); + try { + wretch(this.endSessionEndpoint) + .addon(FormUrlAddon) + .formUrl(params) + .post() + .res() + .then(); + } catch (e) { + // typically response is 204, but if endpoint fails, ignore it + } + } + + /** + * reset auth, end session and reload + * @param doReload + */ + logout(doReload = true) { + this.endSession().then((_) => { + // reload to init with public config and profile + doReload && location.reload(); + }); + } +} + +function parseToken(token: string) { + const now = Date.now(); + const decodedToken = jwtDecode(token); + if (decodedToken.exp && decodedToken.iat) { + const expiringDate = new Date(decodedToken.exp * 1000); + const tokenLifetime = decodedToken.exp - decodedToken.iat; + const expiresIn = +expiringDate - now; + const isExpired = 0 >= expiresIn; + + return { decodedToken, expiringDate, expiresIn, isExpired, tokenLifetime }; + } + // invalid token? + throw new Error('Invalid token. Missing exp, iat in payload'); +} diff --git a/src/core/auth/client/AuthClient.ts b/src/core/auth/client/AuthClient.ts deleted file mode 100644 index a06252a6b..000000000 --- a/src/core/auth/client/AuthClient.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { noop } from '@reatom/core-v2'; -import type { ApiClient } from '~core/api_client'; - -interface AuthClientConfig { - apiClient: ApiClient; -} -export type AuthLoginHook = () => Promise; - -export type AuthLogoutHook = (...args: unknown[]) => unknown; - -export class AuthClient { - private static instance: AuthClient; - - private readonly _apiClient: ApiClient; - - loginHook: AuthLoginHook = noop; - private constructor({ apiClient }: AuthClientConfig) { - this._apiClient = apiClient; - } - - public static getInstance(): AuthClient { - if (!AuthClient.instance) { - throw new Error('You have to initialize auth client first!'); - } else { - return AuthClient.instance; - } - } - - public static init(config: AuthClientConfig): AuthClient { - if (AuthClient.instance) { - throw new Error(`Auth client instance with had been already initialized`); - } - - AuthClient.instance = new AuthClient(config); - return AuthClient.instance; - } - - public logout() { - this._apiClient.logout(); - // reload to init with public config and profile - location.reload(); - } - private startAuthenticated() { - this.loginHook(); - } - - /** - * refreshAuth - * @returns void - * - * @throws {ApiClientError} - */ - public async refreshAuth() { - await this._apiClient.refreshAuthToken(); - } - - /** - * @returns true or error message - */ - public async authenticate(user: string, password: string) { - try { - const loginOk = await this._apiClient.login(user, password); - if (loginOk) { - // reload to init with authenticated config and profile - location.reload(); - } - return true; - } catch (e: any) { - return e?.message || 'Login error'; - } - } - - public checkAuth() { - if (this._apiClient.checkLocalAuthToken()) { - // auth init flow - this.startAuthenticated(); - return true; - } - // anon init flow - this.startAnonymosly(); - return false; - } - - startAnonymosly() { - this.loginHook(); - } -} diff --git a/src/core/auth/index.ts b/src/core/auth/index.ts deleted file mode 100644 index 2f1ebc208..000000000 --- a/src/core/auth/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AuthClient } from './client/AuthClient'; -export { landUser } from './atoms/userWasLanded'; diff --git a/src/core/authClientInstance.ts b/src/core/authClientInstance.ts index ed7214963..0cdd05f9b 100644 --- a/src/core/authClientInstance.ts +++ b/src/core/authClientInstance.ts @@ -1,5 +1,2 @@ -import { AuthClient } from './auth/client/AuthClient'; -import { apiClient } from './apiClientInstance'; - -AuthClient.init({ apiClient }); -export const authClientInstance = AuthClient.getInstance(); +import { OidcSimpleClient } from './auth/OidcSimpleClient'; +export const authClientInstance = new OidcSimpleClient(); diff --git a/src/core/config/index.ts b/src/core/config/index.ts index fce46f009..d2cd0c92d 100644 --- a/src/core/config/index.ts +++ b/src/core/config/index.ts @@ -9,6 +9,7 @@ class ConfigRepository { set({ baseUrl, initialUrl, + initialUrlData, stageConfig, appConfig, baseMapUrl, @@ -17,7 +18,8 @@ class ConfigRepository { activeLayers, }: { baseUrl: string; - initialUrl: UrlData; + initialUrl: string; + initialUrlData: UrlData; stageConfig: StageConfig; appConfig: AppConfig; baseMapUrl: string; @@ -28,6 +30,7 @@ class ConfigRepository { this.#config = { baseUrl, initialUrl, + initialUrlData, ...stageConfig, ...appConfig, mapBaseStyle: baseMapUrl, diff --git a/src/core/config/loaders/stageConfigLoader.ts b/src/core/config/loaders/stageConfigLoader.ts index 46d537252..6195ee695 100644 --- a/src/core/config/loaders/stageConfigLoader.ts +++ b/src/core/config/loaders/stageConfigLoader.ts @@ -1,5 +1,5 @@ import { getFeaturesFromStageConfig } from './featuresConfigLoader'; -import type { AppFeatureType } from '~core/auth/types'; +import type { AppFeatureType } from '~core/app/types'; import type { AppConfig, OsmEditorConfig, StageConfig } from '../types'; export interface StageConfigLegacy { diff --git a/src/core/config/types.ts b/src/core/config/types.ts index 86c6a741e..a2666dfad 100644 --- a/src/core/config/types.ts +++ b/src/core/config/types.ts @@ -1,11 +1,12 @@ import type { UserDto } from '~core/app/user'; -import type { AppFeatureType } from '~core/auth/types'; +import type { AppFeatureType } from '~core/app/types'; import type { LayerDetailsDto } from '~core/logical_layers/types/source'; import type { UrlData } from '~core/url_store'; export type Config = { baseUrl: string; - initialUrl: UrlData; + initialUrl: string; + initialUrlData: UrlData; initialUser: UserDto; defaultLayers: LayerDetailsDto[]; activeLayers: string[]; // Computed in boot stage diff --git a/src/core/draw_tools/atoms/temporaryGeometryAtom.ts b/src/core/draw_tools/atoms/temporaryGeometryAtom.ts index 8a93143cd..9730f84c4 100644 --- a/src/core/draw_tools/atoms/temporaryGeometryAtom.ts +++ b/src/core/draw_tools/atoms/temporaryGeometryAtom.ts @@ -17,10 +17,10 @@ export const temporaryGeometryAtom = createAtom( onAction('setFeatures', ({ features, indexes }) => { const tempFeatures: Feature[] = features.map((feature, index) => { if (!indexes.includes(index)) return feature; - const copy = { ...feature }; - copy.properties - ? (copy.properties.temporary = true) - : (copy.properties = { temporary: true }); + const copy = { + ...feature, + properties: { ...feature.properties, temporary: true }, + }; return copy; }); state = { ...state, features: tempFeatures }; diff --git a/src/core/metrics/app-metrics.ts b/src/core/metrics/app-metrics.ts index 39649058c..928455dfd 100644 --- a/src/core/metrics/app-metrics.ts +++ b/src/core/metrics/app-metrics.ts @@ -1,6 +1,6 @@ import { apiClient } from '~core/apiClientInstance'; import { KONTUR_METRICS_DEBUG } from '~utils/debug'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { METRICS_EVENT, METRICS_REPORT_TEMPLATE, diff --git a/src/core/metrics/constants.ts b/src/core/metrics/constants.ts index 5dcdf6672..91499ad14 100644 --- a/src/core/metrics/constants.ts +++ b/src/core/metrics/constants.ts @@ -1,6 +1,5 @@ -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { configRepo } from '~core/config'; -import type { AppFeatureType } from '~core/auth/types'; import type { MetricsReportTemplate } from './types'; export const METRICS_EVENT = 'METRICS'; diff --git a/src/core/metrics/types.ts b/src/core/metrics/types.ts index b1c80cd05..598efa969 100644 --- a/src/core/metrics/types.ts +++ b/src/core/metrics/types.ts @@ -1,4 +1,4 @@ -import type { AppFeatureType } from '~core/auth/types'; +import type { AppFeatureType } from '~core/app/types'; export interface MetricsReportTemplate { name: string; // metric name, e.g. full-load-time, map-load-time, disasters-panel-load-time, etc. diff --git a/src/core/pages/index.tsx b/src/core/pages/index.tsx index 73533020c..0aaafc17b 100644 --- a/src/core/pages/index.tsx +++ b/src/core/pages/index.tsx @@ -1,5 +1,4 @@ -import ReactMarkdown from 'react-markdown'; -import gfm from 'remark-gfm'; +import Markdown from 'markdown-to-jsx'; import usePromise from 'react-promise-suspense'; import { goTo } from '~core/router/goTo'; import { getAsset } from '~core/api/assets'; @@ -66,33 +65,45 @@ function CssElement({ data }: PagesDocumentElementProps) { function MarkdownElement({ data }: PagesDocumentElementProps) { return ( - ; - } - // internal link - use router - return ( - { - goTo(href); - e.preventDefault(); - }} - className="internal" - /> - ); + {data} - + + ); +} + +function CustomLink({ children, ...props }) { + const { + // className, + href, + title, + } = props; + const isExternalLink = href.startsWith('http://') || href.startsWith('https://'); + if (isExternalLink) { + // open external links in new window + return ( + + {children} + + ); + } + // internal link - use router + return ( + { + goTo(href); + e.preventDefault(); + }} + className="internal" + > + {children} + ); } diff --git a/src/core/postInit.ts b/src/core/postInit.ts deleted file mode 100644 index 61222b9f0..000000000 --- a/src/core/postInit.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { configRepo } from '~core/config'; -import { initMetricsOnce } from '~core/metrics'; - -// Temporary solution till we refactor init and move it to proper place -// current goal is to isolate all that init tasks in one place -export function postInit(routeId: string) { - initMetricsOnce(configRepo.get().id, routeId); - return null; -} diff --git a/src/core/router/components/Router.tsx b/src/core/router/components/Router.tsx index 0167abcd8..92d9cca05 100644 --- a/src/core/router/components/Router.tsx +++ b/src/core/router/components/Router.tsx @@ -6,11 +6,10 @@ import { } from 'react-router-dom'; import { KeepAliveProvider } from 'react-component-keepalive-ts'; import { Suspense } from 'react'; -import { postInit } from '~core/postInit'; import { CommonView } from '~views/CommonView'; import { configRepo } from '~core/config'; import { FullScreenLoader } from '~components/LoadingSpinner/LoadingSpinner'; -import { landUser, userWasLanded } from '~core/auth/atoms/userWasLanded'; +import { landUser, userWasLanded } from '~core/app/userWasLanded'; import { availableRoutesAtom, getAvailableRoutes } from '../atoms/availableRoutes'; import { currentRouteAtom } from '../atoms/currentRoute'; import { getAbsoluteRoute } from '../getAbsoluteRoute'; @@ -50,7 +49,7 @@ function Layout() { ); } -export function initRouter() { +function initRouter() { const availableRoutes = getAvailableRoutes(); const { defaultRoute } = availableRoutes; const routes: RouteObject[] = availableRoutes.routes.map((r) => ({ @@ -82,6 +81,7 @@ export function initRouter() { // show landing page if (configRepo.get().features['about_page'] && !userWasLanded()) { + // TODO: put initialRedirect in feature config, remove showForNewUsers and routes scan const landingPageRoute = availableRoutes.routes.find((r) => r.showForNewUsers); // redirect to landing page if user is new and feature is enabled @@ -94,7 +94,9 @@ export function initRouter() { } // Run last parts of app init requiring router - postInit(router?.state?.matches?.at(1)?.route.id ?? ''); + import('~core/metrics').then(({ initMetricsOnce }) => { + initMetricsOnce(configRepo.get().id, router?.state?.matches?.at(1)?.route.id ?? ''); + }); return router; } diff --git a/src/core/router/routes.tsx b/src/core/router/routes.tsx index d25be5ed8..72bfd5d8a 100644 --- a/src/core/router/routes.tsx +++ b/src/core/router/routes.tsx @@ -9,7 +9,7 @@ import { Diamond24, } from '@konturio/default-icons'; import { i18n } from '~core/localization'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { configRepo } from '~core/config'; import { PagesDocument } from '~core/pages'; import { goTo } from './goTo'; diff --git a/src/core/router/types.ts b/src/core/router/types.ts index e53ac568c..21e62fb89 100644 --- a/src/core/router/types.ts +++ b/src/core/router/types.ts @@ -1,4 +1,4 @@ -import type { AppFeatureType } from '~core/auth/types'; +import type { AppFeatureType } from '~core/app/types'; export interface AppRoute { id: string; diff --git a/src/core/shared_state/featureFlags.ts b/src/core/shared_state/featureFlags.ts index 47308ad45..2c2071122 100644 --- a/src/core/shared_state/featureFlags.ts +++ b/src/core/shared_state/featureFlags.ts @@ -1,21 +1,12 @@ import { configRepo } from '~core/config'; import { createAtom } from '~utils/atoms'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; export const FeatureFlag = AppFeature; export const featureFlagsAtom = createAtom( - { set: (state = { ...configRepo.get().features }) => state }, - ({ onAction }, state = {}) => { - onAction('set', (effectiveFeatures) => { - if (effectiveFeatures) { - state = effectiveFeatures; - } else { - // reset to defaults - state = { ...configRepo.get().features }; - } - }); - + {}, + (_, state = { ...configRepo.get().features }) => { // check features override from .env and .env.local files. // use it to enable/disable specific features for development if (import.meta.env.VITE_FEATURES_CONFIG) { diff --git a/src/core/store/store.ts b/src/core/store/store.ts index 5116ad4d0..bce75b92c 100644 --- a/src/core/store/store.ts +++ b/src/core/store/store.ts @@ -5,15 +5,13 @@ import { KONTUR_TRACE_PATCH, KONTUR_TRACE_TYPE, KONTUR_WARN, - patchTracer, } from '~utils/debug'; import type { AtomCache, Logs } from '@reatom/core'; -function configureStore() { - return createStore({}); -} +export const store = createStore({}); -export const store = configureStore(); +// TODO: refactor, see #19346 +const loggingEnabled = KONTUR_TRACE_PATCH || KONTUR_TRACE_TYPE || KONTUR_WARN; if (import.meta.env.DEV && import.meta.env.MODE !== 'test') { store.v3ctx.subscribe(logger); diff --git a/src/core/url_store/readInitialUrl.ts b/src/core/url_store/readInitialUrl.ts index ba0134ea1..f3da7d95a 100644 --- a/src/core/url_store/readInitialUrl.ts +++ b/src/core/url_store/readInitialUrl.ts @@ -4,8 +4,5 @@ import type { UrlData } from './types'; export function readInitialUrl() { const url = urlEncoder.decode(document.location.search.slice(1)); - // HACK: Remove KLA__ prefix from layers ids coming from url - url.layers = (url.layers ?? []).map((l) => l.replace(/^KLA__/, '')); - return url; } diff --git a/src/features/analytics_panel/atoms/analyticsResource.ts b/src/features/analytics_panel/atoms/analyticsResource.ts index 8966c6b7c..f582c3bb2 100644 --- a/src/features/analytics_panel/atoms/analyticsResource.ts +++ b/src/features/analytics_panel/atoms/analyticsResource.ts @@ -2,7 +2,7 @@ import { createAsyncAtom } from '~utils/atoms/createAsyncAtom'; import { focusedGeometryAtom } from '~core/focused_geometry/model'; import { i18n } from '~core/localization'; import { dispatchMetricsEventOnce } from '~core/metrics/dispatch'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { getPolygonDetails } from '~core/api/insights'; import { isGeoJSONEmpty } from '~utils/geoJSON/helpers'; import type { AnalyticsData } from '~core/types'; diff --git a/src/features/current_event/atoms/currentEventGeometry.ts b/src/features/current_event/atoms/currentEventGeometry.ts index e2c870c7f..4a4a1aadf 100644 --- a/src/features/current_event/atoms/currentEventGeometry.ts +++ b/src/features/current_event/atoms/currentEventGeometry.ts @@ -1,7 +1,7 @@ import { createAtom } from '~utils/atoms'; import { focusedGeometryAtom } from '~core/focused_geometry/model'; import { dispatchMetricsEventOnce } from '~core/metrics/dispatch'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { currentEventResourceAtom } from '~core/shared_state/currentEventResource'; import type { EventWithGeometry } from '~core/types'; diff --git a/src/features/events_list/atoms/eventListResource.ts b/src/features/events_list/atoms/eventListResource.ts index 0ac02dc8a..169e288fb 100644 --- a/src/features/events_list/atoms/eventListResource.ts +++ b/src/features/events_list/atoms/eventListResource.ts @@ -4,7 +4,7 @@ import { createAsyncAtom } from '~utils/atoms/createAsyncAtom'; import { apiClient } from '~core/apiClientInstance'; import { autoRefreshService } from '~core/autoRefreshServiceInstance'; import { dispatchMetricsEventOnce } from '~core/metrics/dispatch'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { currentEventFeedAtom } from '~core/shared_state/currentEventFeed'; import { currentEventAtom } from '~core/shared_state/currentEvent'; import { eventListFilters } from './eventListFilters'; diff --git a/src/features/events_list/components/EventCard/EventCard.tsx b/src/features/events_list/components/EventCard/EventCard.tsx index 37720f46f..ea2bc7e8b 100644 --- a/src/features/events_list/components/EventCard/EventCard.tsx +++ b/src/features/events_list/components/EventCard/EventCard.tsx @@ -1,6 +1,5 @@ import { useMemo } from 'react'; import cn from 'clsx'; -import { parseISO } from 'date-fns'; import { Heading, Text } from '@konturio/ui-kit'; import ReactMarkdown from 'react-markdown'; import { nanoid } from 'nanoid'; @@ -40,7 +39,7 @@ export function EventCard({ showDescription?: boolean; }) { const formattedTime = useMemo( - () => formatTime(parseISO(event.updatedAt)), + () => formatTime(new Date(event.updatedAt)), [event.updatedAt], ); return ( diff --git a/src/features/events_list/components/EventsPanel/EventsPanel.tsx b/src/features/events_list/components/EventsPanel/EventsPanel.tsx index 831a07f0c..46699c49d 100644 --- a/src/features/events_list/components/EventsPanel/EventsPanel.tsx +++ b/src/features/events_list/components/EventsPanel/EventsPanel.tsx @@ -56,7 +56,7 @@ export function EventsPanel({ full: , short: ( diff --git a/src/features/llm_analytics/atoms/llmAnalyticsResource.ts b/src/features/llm_analytics/atoms/llmAnalyticsResource.ts index f36d3c533..357b224f5 100644 --- a/src/features/llm_analytics/atoms/llmAnalyticsResource.ts +++ b/src/features/llm_analytics/atoms/llmAnalyticsResource.ts @@ -3,7 +3,7 @@ import { atom } from '@reatom/core'; import { focusedGeometryAtom } from '~core/focused_geometry/model'; import { i18n } from '~core/localization'; import { dispatchMetricsEventOnce } from '~core/metrics/dispatch'; -import { AppFeature } from '~core/auth/types'; +import { AppFeature } from '~core/app/types'; import { isGeoJSONEmpty } from '~utils/geoJSON/helpers'; import { getLlmAnalysis } from '~core/api/insights'; import { referenceAreaAtom } from '~core/shared_state/referenceArea'; diff --git a/src/types/entry.ts b/src/types/entry.ts index 01d100a37..90e930f21 100644 --- a/src/types/entry.ts +++ b/src/types/entry.ts @@ -6,7 +6,7 @@ type TupleEntry< ? TupleEntry : R; -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type type ObjectEntry = T extends object ? { [K in keyof T]: [K, Required[K]] }[keyof T] extends infer E ? E extends [infer K, infer V] @@ -16,14 +16,14 @@ type ObjectEntry = T extends object : never : never : never; -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Entry = T extends readonly [unknown, ...unknown[]] ? TupleEntry : T extends ReadonlyArray - ? [`${number}`, U] - : ObjectEntry; + ? [`${number}`, U] + : ObjectEntry; -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export function typedObjectEntries(obj: T) { return Object.entries(obj) as Array>; } diff --git a/src/utils/map/mapCSSToMapBoxPropertiesConverter/getRequirements.ts b/src/utils/map/mapCSSToMapBoxPropertiesConverter/getRequirements.ts index 560604100..66d776e41 100644 --- a/src/utils/map/mapCSSToMapBoxPropertiesConverter/getRequirements.ts +++ b/src/utils/map/mapCSSToMapBoxPropertiesConverter/getRequirements.ts @@ -1,4 +1,5 @@ -const DEBUG_MAPCSS = !!globalThis.localStorage?.getItem('DEBUG_MAPCSS'); +import { localStorage } from '~utils/storage'; +const DEBUG_MAPCSS = !!localStorage?.getItem('DEBUG_MAPCSS'); export function getRequirements(config, mapCSS) { const initialCSS = { diff --git a/src/views/About/About.tsx b/src/views/About/About.tsx index 45d67fa93..abb5b6f07 100644 --- a/src/views/About/About.tsx +++ b/src/views/About/About.tsx @@ -13,6 +13,7 @@ export function AboutPage() { const [featureFlags] = useAtom(featureFlagsAtom); const doc = + // @ts-expect-error ts too picky, most likely this will be refactored featureFlags[FeatureFlag.ABOUT_PAGE]?.configuration?.document ?? defaultDocument; return ; diff --git a/src/views/CommonView.tsx b/src/views/CommonView.tsx index 829d4fdbb..b004fd17e 100644 --- a/src/views/CommonView.tsx +++ b/src/views/CommonView.tsx @@ -6,6 +6,7 @@ import { OriginalLogo } from '~components/KonturLogo/KonturLogo'; import { CookieConsentBanner } from '~features/cookie_consent_banner'; import { useTabNameUpdate } from '~utils/hooks/useTabNameUpdate'; import { featureFlagsAtom, FeatureFlag } from '~core/shared_state'; +import { FullScreenLoader } from '~components/LoadingSpinner/LoadingSpinner'; import s from './CommonView.module.css'; import type { AppRoute, AvailableRoutesAtom, CurrentRouteAtom } from '~core/router'; import type { PropsWithChildren } from 'react'; @@ -48,7 +49,7 @@ export function CommonView({ /> )} - {children} + }>{children} diff --git a/src/views/Map/Layouts/Desktop/Desktop.tsx b/src/views/Map/Layouts/Desktop/Desktop.tsx index 6883ab42e..34eba64ba 100644 --- a/src/views/Map/Layouts/Desktop/Desktop.tsx +++ b/src/views/Map/Layouts/Desktop/Desktop.tsx @@ -1,6 +1,7 @@ import { configRepo } from '~core/config'; import { SmartColumn } from '../../SmartColumn/SmartColumn'; import s from './Desktop.module.css'; +import type { ReactNode } from 'react'; export function DesktopLayout({ analyticsColumn, @@ -9,11 +10,11 @@ export function DesktopLayout({ mapColumnBottom, footer, }: { - analyticsColumn: JSX.Element; - layersColumn: JSX.Element; - mapColumnTop: JSX.Element; - mapColumnBottom: JSX.Element; - footer: JSX.Element; + analyticsColumn: ReactNode; + layersColumn: ReactNode; + mapColumnTop: ReactNode; + mapColumnBottom: ReactNode; + footer: ReactNode; }) { return (
diff --git a/src/views/Map/Layouts/Laptop/Laptop.tsx b/src/views/Map/Layouts/Laptop/Laptop.tsx index 099ac4b44..8b0f8b2cb 100644 --- a/src/views/Map/Layouts/Laptop/Laptop.tsx +++ b/src/views/Map/Layouts/Laptop/Laptop.tsx @@ -1,6 +1,7 @@ import { configRepo } from '~core/config'; import { SmartColumn } from '../../SmartColumn/SmartColumn'; import s from './Laptop.module.css'; +import type { ReactNode } from 'react'; export function LaptopLayout({ firstColumn, @@ -8,10 +9,10 @@ export function LaptopLayout({ mapColumnBottom, footer, }: { - firstColumn: JSX.Element; - mapColumnTop: JSX.Element; - mapColumnBottom: JSX.Element; - footer: JSX.Element; + firstColumn: ReactNode; + mapColumnTop: ReactNode; + mapColumnBottom: ReactNode; + footer: ReactNode; }) { return (
diff --git a/src/views/Map/Layouts/Layout.tsx b/src/views/Map/Layouts/Layout.tsx index f3d9f4dbb..a954932fc 100644 --- a/src/views/Map/Layouts/Layout.tsx +++ b/src/views/Map/Layouts/Layout.tsx @@ -6,6 +6,7 @@ import { import { DesktopLayout } from './Desktop/Desktop'; import { LaptopLayout } from './Laptop/Laptop'; import { MobileLayout } from './Mobile/Mobile'; +import type { ReactNode } from 'react'; export function Layout({ disasters, @@ -18,15 +19,15 @@ export function Layout({ editPanel, layerFeaturesPanel, }: { - disasters: JSX.Element; - analytics: JSX.Element; - toolbar: JSX.Element; - timeline: JSX.Element; - layersAndLegends: JSX.Element; - matrix: JSX.Element; - footer: JSX.Element; - editPanel: JSX.Element; - layerFeaturesPanel: JSX.Element; + disasters: ReactNode; + analytics: ReactNode; + toolbar: ReactNode; + timeline: ReactNode; + layersAndLegends: ReactNode; + matrix: ReactNode; + footer: ReactNode; + editPanel: ReactNode; + layerFeaturesPanel: ReactNode; }) { const isLaptop = useMediaQuery(IS_LAPTOP_QUERY); const isMobile = useMediaQuery(IS_MOBILE_QUERY); diff --git a/src/views/Map/Layouts/Mobile/Mobile.tsx b/src/views/Map/Layouts/Mobile/Mobile.tsx index e578bd789..937e09090 100644 --- a/src/views/Map/Layouts/Mobile/Mobile.tsx +++ b/src/views/Map/Layouts/Mobile/Mobile.tsx @@ -1,6 +1,7 @@ import cn from 'clsx'; import { configRepo } from '~core/config'; import s from './Mobile.module.css'; +import type { ReactNode } from 'react'; export function MobileLayout({ firstColumn, @@ -8,10 +9,10 @@ export function MobileLayout({ mapColumnBottom, footer, }: { - firstColumn: JSX.Element; - topColumn: JSX.Element; - mapColumnBottom: JSX.Element; - footer: JSX.Element; + firstColumn: ReactNode; + topColumn: ReactNode; + mapColumnBottom: ReactNode; + footer: ReactNode; }) { return (
diff --git a/src/views/Map/Map.tsx b/src/views/Map/Map.tsx index d2c6d3c3f..debed9733 100644 --- a/src/views/Map/Map.tsx +++ b/src/views/Map/Map.tsx @@ -1,9 +1,8 @@ import { Suspense, useEffect } from 'react'; -import { useAtom } from '@reatom/react-v2'; import { lazily } from 'react-lazily'; import { withKeepAlive } from 'react-component-keepalive-ts'; import clsx from 'clsx'; -import { featureFlagsAtom, FeatureFlag } from '~core/shared_state'; +import { FeatureFlag } from '~core/shared_state'; import { legendPanel } from '~features/legend_panel'; import { layersPanel } from '~features/layers_panel'; import { LayerFeaturesPanel } from '~features/layer_features_panel'; @@ -20,6 +19,8 @@ import { configRepo } from '~core/config'; import { Layout } from './Layouts/Layout'; import s from './Map.module.css'; +const featureFlags = configRepo.get().features; + const EditPanel = () => { const { EditFeaturesOrLayerPanel } = lazily( () => @@ -41,8 +42,6 @@ const { EventEpisodes } = lazily(() => import('~features/event_episodes')); export const MapPage = withKeepAlive(_MapPage, { cacheId: 'map' }); function _MapPage() { - const [featureFlags] = useAtom(featureFlagsAtom); - useEffect(() => { import('~core/draw_tools').then(({ drawTools }) => drawTools.init()); @@ -129,10 +128,10 @@ function _MapPage() {
{Object.keys(featureFlags).length > 0 && ( } + analytics={} // if EVENTS_LIST is enabled, we always have default feed disasters={featureFlags[FeatureFlag.EVENTS_LIST] && } - layersAndLegends={} + layersAndLegends={} matrix={<>} timeline={featureFlags[FeatureFlag.EPISODES_TIMELINE] && } toolbar={featureFlags[FeatureFlag.TOOLBAR] && } @@ -175,10 +174,10 @@ const Toolbar = () => { ); }; -const Analytics = ({ featureFlags }: { featureFlags: Record }) => { - const isAnalyticsOn = featureFlags[FeatureFlag.ANALYTICS_PANEL]; - const isAdvancedAnalyticsPanelOn = featureFlags[FeatureFlag.ADVANCED_ANALYTICS_PANEL]; - const isLLMAnalyticsOn = featureFlags[FeatureFlag.LLM_ANALYTICS]; +const Analytics = () => { + const isAnalyticsOn = !!featureFlags[FeatureFlag.ANALYTICS_PANEL]; + const isAdvancedAnalyticsPanelOn = !!featureFlags[FeatureFlag.ADVANCED_ANALYTICS_PANEL]; + const isLLMAnalyticsOn = !!featureFlags[FeatureFlag.LLM_ANALYTICS]; const analyticsPanelState = isAnalyticsOn || isLLMAnalyticsOn ? analyticsPanel(isAnalyticsOn, isLLMAnalyticsOn) @@ -202,11 +201,7 @@ const Analytics = ({ featureFlags }: { featureFlags: Record }) ); }; -const LayersAndLegends = ({ - featureFlags, -}: { - featureFlags: Record; -}) => { +const LayersAndLegends = () => { const [fullState, shortState] = [ featureFlags[FeatureFlag.MAP_LAYERS_PANEL] ? layersPanel() : null, featureFlags[FeatureFlag.LEGEND_PANEL] ? legendPanel() : null, diff --git a/src/views/Map/SmartColumn/SmartColumn.tsx b/src/views/Map/SmartColumn/SmartColumn.tsx index 34aa84503..7785d12b7 100644 --- a/src/views/Map/SmartColumn/SmartColumn.tsx +++ b/src/views/Map/SmartColumn/SmartColumn.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import { useRef, useLayoutEffect, useState } from 'react'; +import { useRef, useLayoutEffect, useState, type ReactNode } from 'react'; import { ColumnContext, Resizer } from '~core/store/columnContext'; import s from './SmartColumn.module.css'; @@ -8,7 +8,7 @@ export function SmartColumn({ className, }: { className?: string; - children: JSX.Element; + children: ReactNode; }) { const columnRef = useRef(null); const limiterRef = useRef(null); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 11f02fe2a..8fa69a915 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1 +1,19 @@ /// + +interface ImportMetaEnv { + readonly VITE_APP_TITLE: string; + readonly VITE_REDUX_DEV_TOOLS: string; + readonly VITE_SPACING_JS: string; + readonly VITE_ANALYZE_BUNDLE: string; + readonly VITE_BASE_PATH: string; + readonly VITE_STATIC_PATH: string; + readonly VITE_DEBUG_HMR: string; + readonly VITE_DEBUG_RENDER_TRACKER: string; + readonly VITE_DEBUG_DISABLE_REACTSTRICTMODE: string; + readonly VITE_HTTPS: string; + readonly VITE_FEATURES_CONFIG: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +}