From 60024cd6fc0658b7fa39635529b9945930af06fc Mon Sep 17 00:00:00 2001 From: itsparser Date: Thu, 28 Aug 2025 19:19:26 +0530 Subject: [PATCH] Add database URL to .env and update .gitignore to exclude it. Removed unused files and updated dependencies in Cargo.toml. --- .cargo/config.example.toml | 12 +- .env | 24 +- .env.example | 20 + .gitignore | 1 + Cargo.toml | 49 +- README.md | 7 +- crates/libs/cerium/Cargo.toml | 6 +- crates/libs/cerium/src/client/driver/web.rs | 11 +- crates/libs/cerium/src/client/storage/s3.rs | 4 +- crates/libs/cerium/src/server/mod.rs | 3 +- crates/libs/entity/src/common/attachment.rs | 6 +- crates/libs/entity/src/common/config.rs | 4 +- crates/libs/entity/src/common/tag_entity.rs | 4 +- crates/libs/entity/src/test/field.rs | 4 +- crates/libs/entity/src/test/history.rs | 8 +- .../libs/entity/src/test/ui/action/action.rs | 4 +- crates/libs/entity/src/test/ui/action/data.rs | 4 +- .../libs/entity/src/test/ui/action/group.rs | 4 +- .../libs/entity/src/test/ui/action/target.rs | 4 +- .../entity/src/test/ui/case/case_block.rs | 8 +- .../entity/src/test/ui/case/data_binding.rs | 4 +- crates/libs/entity/src/test/ui/elements.rs | 4 +- .../libs/entity/src/test/ui/log/item_log.rs | 6 +- crates/libs/entity/src/test/ui/request.rs | 7 +- .../entity/src/test/ui/suit/suite_block.rs | 6 +- crates/libs/migration/src/migration002.rs | 8 +- crates/macro/entity-macro/Cargo.toml | 4 +- crates/macro/entity-macro/src/lib.rs | 6 +- crates/macro/entity-macro/tests/check.rs | 4 +- crates/services/api/Cargo.toml | 4 +- crates/services/api/src/error.rs | 6 +- crates/services/api/src/main.rs | 9 +- crates/services/api/src/route/app/case_old.rs | 215 - crates/services/api/src/route/app/mod.rs | 1 - .../services/api/src/server/middleware/mod.rs | 17 +- crates/services/api/src/server/session.rs | 11 +- crates/services/engine/Cargo.toml | 4 +- crates/workshop/chrome/Cargo.toml | 6 +- crates/workshop/chrome/src/main.rs | 7 +- crates/workshop/webdriver/Cargo.toml | 2 + crates/workshop/webdriver/src/main.rs | 9 +- discussion.md | 395 + docker-compose.yml | 105 +- extension/.turbo/cookies/1.cookie | 0 extension/.turbo/cookies/10.cookie | 0 extension/.turbo/cookies/11.cookie | 0 extension/.turbo/cookies/2.cookie | 0 extension/.turbo/cookies/3.cookie | 0 extension/.turbo/cookies/4.cookie | 0 extension/.turbo/cookies/5.cookie | 0 extension/.turbo/cookies/6.cookie | 0 extension/.turbo/cookies/7.cookie | 0 extension/.turbo/cookies/8.cookie | 0 extension/.turbo/cookies/9.cookie | 0 .../cacd578fbdc925c2-turbo.log.2025-08-28 | 0 extension/.turbo/preferences/tui.json | 4 + extension/LICENSE | 21 + extension/ORCA_ARCHITECTURE.md | 190 + extension/README 2.md | 275 + extension/README.md | 220 + extension/UPDATE-PACKAGE-VERSIONS.md | 8 + extension/bash-scripts/copy_env.sh | 8 + extension/bash-scripts/set_global_env.sh | 91 + extension/bash-scripts/update_version.sh | 17 + extension/chrome-extension/manifest.js | 53 + extension/chrome-extension/manifest.ts | 61 + extension/chrome-extension/package.json | 38 + .../chrome-extension/pre-build.tsconfig.json | 9 + .../pre-build.tsconfig.tsbuildinfo | 1 + extension/chrome-extension/public/content.css | 0 .../chrome-extension/public/icon-128.png | Bin 0 -> 14500 bytes extension/chrome-extension/public/icon-16.png | Bin 0 -> 6362 bytes extension/chrome-extension/public/icon-32.png | Bin 0 -> 6362 bytes extension/chrome-extension/public/icon-34.png | Bin 0 -> 6362 bytes extension/chrome-extension/public/icon-48.png | Bin 0 -> 6362 bytes extension/chrome-extension/public/popup.html | 12 + .../chrome-extension/src/background/index.ts | 514 + extension/chrome-extension/src/common/api.ts | 188 + .../chrome-extension/src/common/constants.ts | 141 + .../chrome-extension/src/content/recorder.ts | 320 + .../chrome-extension/src/popup/index.tsx | 585 + extension/chrome-extension/tsconfig.json | 10 + .../utils/plugins/make-manifest-plugin.ts | 83 + extension/chrome-extension/vite.config.mts | 56 + extension/eslint.config.ts | 105 + extension/package.json | 105 + extension/packages/dev-utils/README.md | 16 + extension/packages/dev-utils/index.mts | 1 + extension/packages/dev-utils/lib/index.ts | 2 + .../dev-utils/lib/manifest-parser/impl.ts | 39 + .../dev-utils/lib/manifest-parser/index.ts | 4 + .../dev-utils/lib/manifest-parser/types.ts | 5 + .../dev-utils/lib/stream-file-to-zip.ts | 24 + extension/packages/dev-utils/package.json | 29 + extension/packages/dev-utils/tsconfig.json | 8 + extension/packages/env/README.md | 31 + extension/packages/env/index.mts | 9 + extension/packages/env/lib/config.ts | 10 + extension/packages/env/lib/const.ts | 4 + extension/packages/env/lib/index.ts | 2 + extension/packages/env/lib/types.ts | 13 + extension/packages/env/package.json | 30 + extension/packages/env/tsconfig.json | 8 + extension/packages/env/use-env-example.png | Bin 0 -> 42432 bytes extension/packages/hmr/index.mts | 1 + extension/packages/hmr/lib/consts.ts | 6 + .../hmr/lib/initializers/init-client.ts | 17 + .../lib/initializers/init-reload-server.ts | 53 + .../packages/hmr/lib/injections/refresh.ts | 33 + .../packages/hmr/lib/injections/reload.ts | 13 + .../packages/hmr/lib/interpreter/index.ts | 6 + extension/packages/hmr/lib/plugins/index.ts | 3 + .../lib/plugins/make-entry-point-plugin.ts | 73 + .../hmr/lib/plugins/watch-public-plugin.ts | 13 + .../hmr/lib/plugins/watch-rebuild-plugin.ts | 68 + extension/packages/hmr/lib/types.ts | 18 + extension/packages/hmr/package.json | 36 + extension/packages/hmr/rollup.config.ts | 29 + extension/packages/hmr/tsconfig.json | 9 + extension/packages/i18n/.gitignore | 1 + extension/packages/i18n/README.md | 173 + extension/packages/i18n/index.mts | 1 + extension/packages/i18n/lib/consts.ts | 62 + extension/packages/i18n/lib/i18n-dev.ts | 34 + extension/packages/i18n/lib/i18n-prod.ts | 3 + extension/packages/i18n/lib/index.ts | 4 + extension/packages/i18n/lib/prepare-build.ts | 22 + .../i18n/lib/set-related-locale-import.ts | 38 + extension/packages/i18n/lib/types.ts | 12 + .../packages/i18n/locales/en/messages.json | 45 + .../packages/i18n/locales/ko/messages.json | 45 + extension/packages/i18n/package.json | 30 + .../packages/i18n/prepare-build.tsconfig.json | 4 + extension/packages/i18n/tsconfig.json | 8 + extension/packages/module-manager/README.md | 64 + extension/packages/module-manager/index.mts | 3 + .../lib/base/cli-args-processor.ts | 51 + .../packages/module-manager/lib/base/index.ts | 2 + .../lib/base/run-module-manager.ts | 49 + .../packages/module-manager/lib/const.ts | 98 + .../module-manager/lib/helpers/index.ts | 2 + .../module-manager/lib/helpers/utils.ts | 113 + .../module-manager/lib/helpers/zip-utils.ts | 97 + .../packages/module-manager/lib/index.ts | 21 + .../packages/module-manager/lib/paths.ts | 6 + .../lib/processing/delete-feature.ts | 34 + .../module-manager/lib/processing/index.ts | 3 + .../lib/processing/modules-handler.ts | 48 + .../lib/processing/recover-feature.ts | 41 + .../packages/module-manager/lib/types.ts | 19 + .../packages/module-manager/package.json | 23 + .../packages/module-manager/tsconfig.json | 8 + extension/packages/orca-api/index.mts | 1 + extension/packages/orca-api/lib/index.ts | 1 + extension/packages/orca-api/lib/types.ts | 117 + extension/packages/orca-api/package.json | 21 + extension/packages/orca-api/tsconfig.json | 8 + extension/packages/shared/README.md | 12 + extension/packages/shared/const.ts | 3 + extension/packages/shared/index.mts | 4 + extension/packages/shared/lib/hoc/index.ts | 2 + .../shared/lib/hoc/with-error-boundary.tsx | 15 + .../packages/shared/lib/hoc/with-suspense.tsx | 10 + extension/packages/shared/lib/hooks/index.ts | 1 + .../packages/shared/lib/hooks/use-storage.tsx | 56 + .../shared/lib/utils/colorful-logger.ts | 27 + extension/packages/shared/lib/utils/const.ts | 25 + .../packages/shared/lib/utils/helpers.ts | 8 + extension/packages/shared/lib/utils/index.ts | 4 + .../shared/lib/utils/init-app-with-shadow.ts | 34 + extension/packages/shared/lib/utils/types.ts | 10 + extension/packages/shared/package.json | 33 + extension/packages/shared/tsconfig.json | 8 + extension/packages/storage/index.mts | 1 + extension/packages/storage/lib/base/base.ts | 157 + extension/packages/storage/lib/base/enums.ts | 42 + extension/packages/storage/lib/base/index.ts | 3 + extension/packages/storage/lib/base/types.ts | 54 + .../storage/lib/impl/example-theme-storage.ts | 28 + extension/packages/storage/lib/impl/index.ts | 1 + extension/packages/storage/lib/index.ts | 2 + extension/packages/storage/lib/types.ts | 8 + extension/packages/storage/package.json | 27 + extension/packages/storage/tsconfig.json | 8 + .../packages/tailwindcss-config/package.json | 11 + .../tailwindcss-config/tailwind.config.ts | 70 + .../packages/tailwindcss-config/tsconfig.json | 7 + extension/packages/tsconfig/app.json | 5 + extension/packages/tsconfig/base.json | 25 + extension/packages/tsconfig/module.json | 10 + extension/packages/tsconfig/package.json | 7 + extension/packages/ui/README.md | 336 + extension/packages/ui/global.css | 70 + extension/packages/ui/index.ts | 1 + extension/packages/ui/lib/assets/warning.svg | 10 + .../ui/lib/components/LoadingSpinner.tsx | 11 + .../ui/lib/components/ToggleButton.tsx | 23 + .../components/error-display/ErrorDisplay.tsx | 13 + .../components/error-display/ErrorHeader.tsx | 21 + .../error-display/ErrorResetButton.tsx | 11 + .../error-display/ErrorStackTraceList.tsx | 20 + extension/packages/ui/lib/components/index.ts | 3 + .../packages/ui/lib/components/ui/avatar.tsx | 46 + .../packages/ui/lib/components/ui/badge.tsx | 36 + .../packages/ui/lib/components/ui/button.tsx | 56 + .../ui/lib}/components/ui/dropdown-menu.tsx | 46 +- .../packages/ui/lib/components/ui/input.tsx | 25 + .../packages/ui/lib}/components/ui/label.tsx | 6 +- .../ui/lib/components/ui/modern-nav.tsx | 292 + .../ui/lib}/components/ui/radio-group.tsx | 14 +- .../ui/lib}/components/ui/separator.tsx | 9 +- .../packages/ui/lib/components/ui/switch.tsx | 27 + extension/packages/ui/lib/index.ts | 32 + extension/packages/ui/lib/utils.ts | 5 + .../packages/ui/lib/utils/cn.ts | 2 +- extension/packages/ui/lib/with-ui.ts | 7 + extension/packages/ui/package.json | 40 + extension/packages/ui/tailwind.config.ts | 7 + extension/packages/ui/tsconfig.json | 13 + extension/packages/vite-config/index.mts | 1 + .../vite-config/lib/build-content-script.ts | 96 + .../lib/get-content-script-entires.ts | 22 + extension/packages/vite-config/lib/index.ts | 2 + .../vite-config/lib/with-page-config.ts | 39 + extension/packages/vite-config/package.json | 25 + extension/packages/vite-config/tailwind.d.ts | 1 + extension/packages/vite-config/tsconfig.json | 8 + extension/packages/zipper/index.mts | 13 + extension/packages/zipper/lib/index.ts | 1 + extension/packages/zipper/lib/zip-bundle.ts | 87 + extension/packages/zipper/package.json | 30 + extension/packages/zipper/tsconfig.json | 8 + extension/pages/content-runtime/README.md | 15 + extension/pages/content-runtime/build.mts | 49 + extension/pages/content-runtime/package.json | 32 + .../content-runtime/src/matches/all/App.tsx | 9 + .../content-runtime/src/matches/all/index.css | 5 + .../content-runtime/src/matches/all/index.tsx | 5 + .../src/matches/example/App.tsx | 9 + .../src/matches/example/index.css | 5 + .../src/matches/example/index.tsx | 5 + .../pages/content-runtime/tailwind.config.ts | 5 + extension/pages/content-runtime/tailwind.d.ts | 5 + extension/pages/content-runtime/tsconfig.json | 12 + extension/pages/content-ui/README.md | 23 + extension/pages/content-ui/build.mts | 49 + extension/pages/content-ui/package.json | 35 + extension/pages/content-ui/public/logo.svg | 7 + .../pages/content-ui/src/matches/all/App.tsx | 18 + .../content-ui/src/matches/all/index.css | 1 + .../content-ui/src/matches/all/index.tsx | 5 + .../content-ui/src/matches/example/App.tsx | 18 + .../content-ui/src/matches/example/index.css | 1 + .../content-ui/src/matches/example/index.tsx | 5 + extension/pages/content-ui/tailwind.config.ts | 5 + extension/pages/content-ui/tailwind.d.ts | 5 + extension/pages/content-ui/tsconfig.json | 11 + extension/pages/content/README.md | 18 + extension/pages/content/build.mts | 39 + extension/pages/content/package.json | 33 + extension/pages/content/public/logo.svg | 7 + .../pages/content/src/matches/all/index.ts | 5 + .../content/src/matches/example/index.ts | 5 + .../pages/content/src/sample-function.ts | 3 + extension/pages/content/tsconfig.json | 11 + extension/pages/devtools-panel/index.html | 12 + extension/pages/devtools-panel/package.json | 39 + .../devtools-panel/public/logo_horizontal.svg | 124 + .../public/logo_horizontal_dark.svg | 117 + extension/pages/devtools-panel/src/Panel.css | 28 + extension/pages/devtools-panel/src/Panel.tsx | 45 + extension/pages/devtools-panel/src/index.css | 1 + extension/pages/devtools-panel/src/index.tsx | 15 + .../pages/devtools-panel/tailwind.config.ts | 5 + extension/pages/devtools-panel/tsconfig.json | 11 + .../pages/devtools-panel/vite.config.mts | 17 + extension/pages/devtools/index.html | 11 + extension/pages/devtools/package.json | 29 + extension/pages/devtools/public/logo.svg | 7 + extension/pages/devtools/src/index.ts | 6 + extension/pages/devtools/tsconfig.json | 11 + extension/pages/devtools/vite.config.mts | 17 + extension/pages/new-tab/index.html | 12 + extension/pages/new-tab/package.json | 40 + .../pages/new-tab/public/logo_horizontal.svg | 124 + .../new-tab/public/logo_horizontal_dark.svg | 117 + extension/pages/new-tab/src/NewTab.css | 22 + extension/pages/new-tab/src/NewTab.scss | 10 + extension/pages/new-tab/src/NewTab.tsx | 58 + .../new-tab/src/components/LoginPage.tsx | 115 + .../pages/new-tab/src/components/MainPage.tsx | 132 + .../new-tab/src/components/SettingsPage.tsx | 217 + extension/pages/new-tab/src/index.css | 1 + extension/pages/new-tab/src/index.tsx | 15 + extension/pages/new-tab/tailwind.config.ts | 5 + extension/pages/new-tab/tsconfig.json | 11 + extension/pages/new-tab/vite.config.mts | 17 + extension/pages/options/index.html | 12 + extension/pages/options/package.json | 39 + .../pages/options/public/logo_horizontal.svg | 124 + .../options/public/logo_horizontal_dark.svg | 117 + extension/pages/options/src/Options.css | 26 + extension/pages/options/src/Options.tsx | 26 + extension/pages/options/src/index.css | 1 + extension/pages/options/src/index.tsx | 14 + extension/pages/options/tailwind.config.ts | 5 + extension/pages/options/tsconfig.json | 11 + extension/pages/options/vite.config.mts | 17 + extension/pages/popup/index.html | 12 + extension/pages/popup/package.json | 40 + .../pages/popup/public/logo_vertical.svg | 124 + .../pages/popup/public/logo_vertical_dark.svg | 117 + extension/pages/popup/src/Popup.css | 70 + extension/pages/popup/src/Popup.tsx | 36 + .../src/components/ApplicationSelector.tsx | 1 + .../popup/src/components/ConnectionStatus.tsx | 1 + .../src/components/RecordingControls.tsx | 345 + extension/pages/popup/src/index.css | 6 + extension/pages/popup/src/index.tsx | 15 + extension/pages/popup/tailwind.config.ts | 5 + extension/pages/popup/tsconfig.json | 11 + extension/pages/popup/vite.config.mts | 17 + extension/pages/side-panel/index.html | 12 + extension/pages/side-panel/package.json | 39 + .../pages/side-panel/public/logo_vertical.svg | 124 + .../side-panel/public/logo_vertical_dark.svg | 117 + extension/pages/side-panel/src/SidePanel.css | 30 + extension/pages/side-panel/src/SidePanel.tsx | 58 + .../side-panel/src/components/LoginPage.tsx | 143 + .../side-panel/src/components/MainPage.tsx | 157 + .../src/components/SettingsPage.tsx | 252 + extension/pages/side-panel/src/index.css | 1 + extension/pages/side-panel/src/index.tsx | 14 + extension/pages/side-panel/tailwind.config.ts | 5 + extension/pages/side-panel/tsconfig.json | 11 + extension/pages/side-panel/vite.config.mts | 17 + extension/pnpm-lock.yaml | 10747 ++++++++ extension/pnpm-workspace.yaml | 13 + .../tests/e2e/config/wdio.browser.conf.ts | 58 + extension/tests/e2e/config/wdio.conf.ts | 97 + extension/tests/e2e/config/wdio.d.ts | 7 + extension/tests/e2e/helpers/theme.ts | 26 + extension/tests/e2e/package.json | 24 + .../e2e/specs/page-content-runtime.test.ts | 36 + .../tests/e2e/specs/page-content-ui.test.ts | 21 + .../tests/e2e/specs/page-content.test.ts | 33 + .../e2e/specs/page-devtools-panel.test.ts | 12 + .../tests/e2e/specs/page-new-tab.test.ts | 15 + .../tests/e2e/specs/page-options.test.ts | 13 + extension/tests/e2e/specs/page-popup.test.ts | 12 + .../tests/e2e/specs/page-side-panel.test.ts | 12 + extension/tests/e2e/specs/smoke.test.ts | 7 + extension/tests/e2e/tsconfig.json | 12 + extension/tests/e2e/utils/extension-path.ts | 49 + extension/tsconfig.json | 11 + extension/turbo.json | 57 + objective.md | 589 + web/README.md | 46 - web/components.json | 17 - web/package-lock.json | 21382 ---------------- web/package.json | 124 - web/postcss.config.js | 6 - web/prettier.config.js | 4 - web/public/favicon.ico | Bin 3870 -> 0 bytes web/public/index.html | 45 - web/public/logo192.png | Bin 5347 -> 0 bytes web/public/logo512.png | Bin 99438 -> 0 bytes web/public/manifest.json | 25 - web/public/robots.txt | 3 - web/src/App.test.tsx | 9 - web/src/App.tsx | 55 - web/src/app/global.css | 76 - web/src/assert/svg/NotFound.svg | 1 - web/src/assert/svg/index.ts | 1 - web/src/components/ui/accordion.tsx | 55 - web/src/components/ui/alert-dialog.tsx | 139 - web/src/components/ui/alert.tsx | 59 - web/src/components/ui/aspect-ratio.tsx | 5 - web/src/components/ui/avatar.tsx | 48 - web/src/components/ui/badge.tsx | 36 - web/src/components/ui/button.tsx | 57 - web/src/components/ui/calendar.tsx | 70 - web/src/components/ui/card.tsx | 76 - web/src/components/ui/carousel.tsx | 260 - web/src/components/ui/checkbox.tsx | 28 - web/src/components/ui/collapsible.tsx | 9 - web/src/components/ui/command.tsx | 153 - web/src/components/ui/context-menu.tsx | 202 - web/src/components/ui/dialog.tsx | 120 - web/src/components/ui/drawer.tsx | 116 - web/src/components/ui/form.tsx | 176 - web/src/components/ui/input.tsx | 25 - web/src/components/ui/menubar.tsx | 238 - web/src/components/ui/navigation-menu.tsx | 128 - web/src/components/ui/pagination.tsx | 121 - web/src/components/ui/popover.tsx | 31 - web/src/components/ui/progress.tsx | 26 - web/src/components/ui/resizable.tsx | 43 - web/src/components/ui/scroll-area.tsx | 46 - web/src/components/ui/select.tsx | 162 - web/src/components/ui/sheet.tsx | 138 - web/src/components/ui/skeleton.tsx | 15 - web/src/components/ui/slider.tsx | 26 - web/src/components/ui/sonner.tsx | 29 - web/src/components/ui/switch.tsx | 27 - web/src/components/ui/table.tsx | 120 - web/src/components/ui/tabs.tsx | 53 - web/src/components/ui/textarea.tsx | 24 - web/src/components/ui/toast.tsx | 129 - web/src/components/ui/toaster.tsx | 33 - web/src/components/ui/toggle-group.tsx | 59 - web/src/components/ui/toggle.tsx | 43 - web/src/components/ui/tooltip.tsx | 28 - web/src/components/ui/use-toast.ts | 194 - web/src/constants/action.ts | 42 - web/src/constants/index.ts | 2 - web/src/constants/target.ts | 10 - web/src/core/components/app_card.tsx | 28 - .../core/components/flow/components/index.tsx | 3 - .../core/components/flow/components/new.tsx | 86 - web/src/core/components/flow/edge/general.tsx | 111 - web/src/core/components/flow/edge/index.tsx | 3 - web/src/core/components/flow/edge/no.tsx | 44 - web/src/core/components/flow/edge/yes.tsx | 72 - web/src/core/components/flow/flow.tsx | 348 - web/src/core/components/flow/form.tsx | 92 - web/src/core/components/flow/handler/test.tsx | 62 - web/src/core/components/flow/index.tsx | 7 - .../core/components/flow/mock/ifCondition.tsx | 47 - web/src/core/components/flow/mock/index.tsx | 1 - web/src/core/components/flow/node.tsx | 31 - web/src/core/components/flow/node/action.tsx | 52 - .../core/components/flow/node/condition.tsx | 49 - web/src/core/components/flow/node/endloop.tsx | 58 - web/src/core/components/flow/node/for.tsx | 36 - web/src/core/components/flow/node/index.tsx | 1 - web/src/core/components/flow/node/loop.tsx | 48 - web/src/core/components/flow/node/new.tsx | 239 - web/src/core/components/flow/workflow.tsx | 89 - web/src/core/components/input/index.tsx | 5 - web/src/core/components/input/text.tsx | 50 - web/src/core/components/page_header/index.tsx | 47 - web/src/core/components/select/index.tsx | 143 - web/src/core/components/select/search.tsx | 55 - web/src/core/components/spinner.tsx | 11 - web/src/core/components/table/edit/index.tsx | 98 - web/src/core/components/table/index.ts | 4 - web/src/core/components/table/read/index.tsx | 26 - web/src/core/components/table/read/v2.tsx | 123 - web/src/core/components/topnav.tsx | 116 - web/src/hooks/resizeobserver/index.tsx | 31 - web/src/index.css | 8 - web/src/index.tsx | 35 - web/src/interface/request.ts | 6 - web/src/layouts/admin/index.tsx | 70 - web/src/layouts/app/index.tsx | 115 - web/src/layouts/app/state.ts | 6 - web/src/layouts/auth/index.tsx | 9 - web/src/layouts/home/index.tsx | 13 - web/src/logo.svg | 1 - .../pages/app/action_group/actiongroup.tsx | 198 - web/src/pages/app/action_group/index.tsx | 202 - web/src/pages/app/action_group/item/index.tsx | 198 - web/src/pages/app/dashboard/index.tsx | 65 - web/src/pages/app/history/historys.tsx | 194 - web/src/pages/app/history/index.tsx | 11 - web/src/pages/app/test_case/index.tsx | 187 - web/src/pages/app/test_case/testcase.tsx | 325 - web/src/pages/auth/login.tsx | 215 - web/src/pages/home/index.tsx | 93 - web/src/pages/home/style.css | 22 - web/src/react-app-env.d.ts | 1 - web/src/reportWebVitals.ts | 15 - web/src/service/app/action_group.ts | 41 - web/src/service/app/index.ts | 1 - web/src/service/endpoint.ts | 105 - web/src/service/index.ts | 43 - web/src/setupTests.ts | 5 - web/src/stores/flow.store.ts | 429 - web/src/stores/route.store.ts | 8 - web/src/stores/testcase.store.js | 142 - web/src/utils/route.tsx | 176 - web/start.sh | 2 - web/tailwind.config.js | 92 - web/tsconfig.json | 30 - 485 files changed, 23702 insertions(+), 30946 deletions(-) create mode 100644 .env.example delete mode 100644 crates/services/api/src/route/app/case_old.rs create mode 100644 discussion.md create mode 100644 extension/.turbo/cookies/1.cookie create mode 100644 extension/.turbo/cookies/10.cookie create mode 100644 extension/.turbo/cookies/11.cookie create mode 100644 extension/.turbo/cookies/2.cookie create mode 100644 extension/.turbo/cookies/3.cookie create mode 100644 extension/.turbo/cookies/4.cookie create mode 100644 extension/.turbo/cookies/5.cookie create mode 100644 extension/.turbo/cookies/6.cookie create mode 100644 extension/.turbo/cookies/7.cookie create mode 100644 extension/.turbo/cookies/8.cookie create mode 100644 extension/.turbo/cookies/9.cookie create mode 100644 extension/.turbo/daemon/cacd578fbdc925c2-turbo.log.2025-08-28 create mode 100644 extension/.turbo/preferences/tui.json create mode 100644 extension/LICENSE create mode 100644 extension/ORCA_ARCHITECTURE.md create mode 100755 extension/README 2.md create mode 100644 extension/README.md create mode 100644 extension/UPDATE-PACKAGE-VERSIONS.md create mode 100644 extension/bash-scripts/copy_env.sh create mode 100644 extension/bash-scripts/set_global_env.sh create mode 100644 extension/bash-scripts/update_version.sh create mode 100644 extension/chrome-extension/manifest.js create mode 100644 extension/chrome-extension/manifest.ts create mode 100644 extension/chrome-extension/package.json create mode 100644 extension/chrome-extension/pre-build.tsconfig.json create mode 100644 extension/chrome-extension/pre-build.tsconfig.tsbuildinfo create mode 100644 extension/chrome-extension/public/content.css create mode 100644 extension/chrome-extension/public/icon-128.png create mode 100644 extension/chrome-extension/public/icon-16.png create mode 100644 extension/chrome-extension/public/icon-32.png create mode 100644 extension/chrome-extension/public/icon-34.png create mode 100644 extension/chrome-extension/public/icon-48.png create mode 100644 extension/chrome-extension/public/popup.html create mode 100644 extension/chrome-extension/src/background/index.ts create mode 100644 extension/chrome-extension/src/common/api.ts create mode 100644 extension/chrome-extension/src/common/constants.ts create mode 100644 extension/chrome-extension/src/content/recorder.ts create mode 100644 extension/chrome-extension/src/popup/index.tsx create mode 100644 extension/chrome-extension/tsconfig.json create mode 100644 extension/chrome-extension/utils/plugins/make-manifest-plugin.ts create mode 100644 extension/chrome-extension/vite.config.mts create mode 100644 extension/eslint.config.ts create mode 100644 extension/package.json create mode 100644 extension/packages/dev-utils/README.md create mode 100644 extension/packages/dev-utils/index.mts create mode 100644 extension/packages/dev-utils/lib/index.ts create mode 100644 extension/packages/dev-utils/lib/manifest-parser/impl.ts create mode 100644 extension/packages/dev-utils/lib/manifest-parser/index.ts create mode 100644 extension/packages/dev-utils/lib/manifest-parser/types.ts create mode 100644 extension/packages/dev-utils/lib/stream-file-to-zip.ts create mode 100644 extension/packages/dev-utils/package.json create mode 100644 extension/packages/dev-utils/tsconfig.json create mode 100644 extension/packages/env/README.md create mode 100644 extension/packages/env/index.mts create mode 100644 extension/packages/env/lib/config.ts create mode 100644 extension/packages/env/lib/const.ts create mode 100644 extension/packages/env/lib/index.ts create mode 100644 extension/packages/env/lib/types.ts create mode 100644 extension/packages/env/package.json create mode 100644 extension/packages/env/tsconfig.json create mode 100644 extension/packages/env/use-env-example.png create mode 100644 extension/packages/hmr/index.mts create mode 100644 extension/packages/hmr/lib/consts.ts create mode 100644 extension/packages/hmr/lib/initializers/init-client.ts create mode 100644 extension/packages/hmr/lib/initializers/init-reload-server.ts create mode 100644 extension/packages/hmr/lib/injections/refresh.ts create mode 100644 extension/packages/hmr/lib/injections/reload.ts create mode 100644 extension/packages/hmr/lib/interpreter/index.ts create mode 100644 extension/packages/hmr/lib/plugins/index.ts create mode 100644 extension/packages/hmr/lib/plugins/make-entry-point-plugin.ts create mode 100644 extension/packages/hmr/lib/plugins/watch-public-plugin.ts create mode 100644 extension/packages/hmr/lib/plugins/watch-rebuild-plugin.ts create mode 100644 extension/packages/hmr/lib/types.ts create mode 100644 extension/packages/hmr/package.json create mode 100644 extension/packages/hmr/rollup.config.ts create mode 100644 extension/packages/hmr/tsconfig.json create mode 100644 extension/packages/i18n/.gitignore create mode 100644 extension/packages/i18n/README.md create mode 100644 extension/packages/i18n/index.mts create mode 100644 extension/packages/i18n/lib/consts.ts create mode 100644 extension/packages/i18n/lib/i18n-dev.ts create mode 100644 extension/packages/i18n/lib/i18n-prod.ts create mode 100644 extension/packages/i18n/lib/index.ts create mode 100644 extension/packages/i18n/lib/prepare-build.ts create mode 100644 extension/packages/i18n/lib/set-related-locale-import.ts create mode 100644 extension/packages/i18n/lib/types.ts create mode 100644 extension/packages/i18n/locales/en/messages.json create mode 100644 extension/packages/i18n/locales/ko/messages.json create mode 100644 extension/packages/i18n/package.json create mode 100644 extension/packages/i18n/prepare-build.tsconfig.json create mode 100644 extension/packages/i18n/tsconfig.json create mode 100644 extension/packages/module-manager/README.md create mode 100644 extension/packages/module-manager/index.mts create mode 100644 extension/packages/module-manager/lib/base/cli-args-processor.ts create mode 100644 extension/packages/module-manager/lib/base/index.ts create mode 100644 extension/packages/module-manager/lib/base/run-module-manager.ts create mode 100644 extension/packages/module-manager/lib/const.ts create mode 100644 extension/packages/module-manager/lib/helpers/index.ts create mode 100644 extension/packages/module-manager/lib/helpers/utils.ts create mode 100644 extension/packages/module-manager/lib/helpers/zip-utils.ts create mode 100644 extension/packages/module-manager/lib/index.ts create mode 100644 extension/packages/module-manager/lib/paths.ts create mode 100644 extension/packages/module-manager/lib/processing/delete-feature.ts create mode 100644 extension/packages/module-manager/lib/processing/index.ts create mode 100644 extension/packages/module-manager/lib/processing/modules-handler.ts create mode 100644 extension/packages/module-manager/lib/processing/recover-feature.ts create mode 100644 extension/packages/module-manager/lib/types.ts create mode 100644 extension/packages/module-manager/package.json create mode 100644 extension/packages/module-manager/tsconfig.json create mode 100644 extension/packages/orca-api/index.mts create mode 100644 extension/packages/orca-api/lib/index.ts create mode 100644 extension/packages/orca-api/lib/types.ts create mode 100644 extension/packages/orca-api/package.json create mode 100644 extension/packages/orca-api/tsconfig.json create mode 100644 extension/packages/shared/README.md create mode 100644 extension/packages/shared/const.ts create mode 100644 extension/packages/shared/index.mts create mode 100644 extension/packages/shared/lib/hoc/index.ts create mode 100644 extension/packages/shared/lib/hoc/with-error-boundary.tsx create mode 100644 extension/packages/shared/lib/hoc/with-suspense.tsx create mode 100644 extension/packages/shared/lib/hooks/index.ts create mode 100644 extension/packages/shared/lib/hooks/use-storage.tsx create mode 100644 extension/packages/shared/lib/utils/colorful-logger.ts create mode 100644 extension/packages/shared/lib/utils/const.ts create mode 100644 extension/packages/shared/lib/utils/helpers.ts create mode 100644 extension/packages/shared/lib/utils/index.ts create mode 100644 extension/packages/shared/lib/utils/init-app-with-shadow.ts create mode 100644 extension/packages/shared/lib/utils/types.ts create mode 100644 extension/packages/shared/package.json create mode 100644 extension/packages/shared/tsconfig.json create mode 100644 extension/packages/storage/index.mts create mode 100644 extension/packages/storage/lib/base/base.ts create mode 100644 extension/packages/storage/lib/base/enums.ts create mode 100644 extension/packages/storage/lib/base/index.ts create mode 100644 extension/packages/storage/lib/base/types.ts create mode 100644 extension/packages/storage/lib/impl/example-theme-storage.ts create mode 100644 extension/packages/storage/lib/impl/index.ts create mode 100644 extension/packages/storage/lib/index.ts create mode 100644 extension/packages/storage/lib/types.ts create mode 100644 extension/packages/storage/package.json create mode 100644 extension/packages/storage/tsconfig.json create mode 100644 extension/packages/tailwindcss-config/package.json create mode 100644 extension/packages/tailwindcss-config/tailwind.config.ts create mode 100644 extension/packages/tailwindcss-config/tsconfig.json create mode 100644 extension/packages/tsconfig/app.json create mode 100644 extension/packages/tsconfig/base.json create mode 100644 extension/packages/tsconfig/module.json create mode 100644 extension/packages/tsconfig/package.json create mode 100644 extension/packages/ui/README.md create mode 100644 extension/packages/ui/global.css create mode 100644 extension/packages/ui/index.ts create mode 100644 extension/packages/ui/lib/assets/warning.svg create mode 100644 extension/packages/ui/lib/components/LoadingSpinner.tsx create mode 100644 extension/packages/ui/lib/components/ToggleButton.tsx create mode 100644 extension/packages/ui/lib/components/error-display/ErrorDisplay.tsx create mode 100644 extension/packages/ui/lib/components/error-display/ErrorHeader.tsx create mode 100644 extension/packages/ui/lib/components/error-display/ErrorResetButton.tsx create mode 100644 extension/packages/ui/lib/components/error-display/ErrorStackTraceList.tsx create mode 100644 extension/packages/ui/lib/components/index.ts create mode 100644 extension/packages/ui/lib/components/ui/avatar.tsx create mode 100644 extension/packages/ui/lib/components/ui/badge.tsx create mode 100644 extension/packages/ui/lib/components/ui/button.tsx rename {web/src => extension/packages/ui/lib}/components/ui/dropdown-menu.tsx (63%) create mode 100644 extension/packages/ui/lib/components/ui/input.tsx rename {web/src => extension/packages/ui/lib}/components/ui/label.tsx (77%) create mode 100644 extension/packages/ui/lib/components/ui/modern-nav.tsx rename {web/src => extension/packages/ui/lib}/components/ui/radio-group.tsx (56%) rename {web/src => extension/packages/ui/lib}/components/ui/separator.tsx (76%) create mode 100644 extension/packages/ui/lib/components/ui/switch.tsx create mode 100644 extension/packages/ui/lib/index.ts create mode 100644 extension/packages/ui/lib/utils.ts rename web/src/lib/utils.ts => extension/packages/ui/lib/utils/cn.ts (98%) create mode 100644 extension/packages/ui/lib/with-ui.ts create mode 100644 extension/packages/ui/package.json create mode 100644 extension/packages/ui/tailwind.config.ts create mode 100644 extension/packages/ui/tsconfig.json create mode 100644 extension/packages/vite-config/index.mts create mode 100644 extension/packages/vite-config/lib/build-content-script.ts create mode 100644 extension/packages/vite-config/lib/get-content-script-entires.ts create mode 100644 extension/packages/vite-config/lib/index.ts create mode 100644 extension/packages/vite-config/lib/with-page-config.ts create mode 100644 extension/packages/vite-config/package.json create mode 100644 extension/packages/vite-config/tailwind.d.ts create mode 100644 extension/packages/vite-config/tsconfig.json create mode 100644 extension/packages/zipper/index.mts create mode 100644 extension/packages/zipper/lib/index.ts create mode 100644 extension/packages/zipper/lib/zip-bundle.ts create mode 100644 extension/packages/zipper/package.json create mode 100644 extension/packages/zipper/tsconfig.json create mode 100644 extension/pages/content-runtime/README.md create mode 100644 extension/pages/content-runtime/build.mts create mode 100644 extension/pages/content-runtime/package.json create mode 100644 extension/pages/content-runtime/src/matches/all/App.tsx create mode 100644 extension/pages/content-runtime/src/matches/all/index.css create mode 100644 extension/pages/content-runtime/src/matches/all/index.tsx create mode 100644 extension/pages/content-runtime/src/matches/example/App.tsx create mode 100644 extension/pages/content-runtime/src/matches/example/index.css create mode 100644 extension/pages/content-runtime/src/matches/example/index.tsx create mode 100644 extension/pages/content-runtime/tailwind.config.ts create mode 100644 extension/pages/content-runtime/tailwind.d.ts create mode 100644 extension/pages/content-runtime/tsconfig.json create mode 100644 extension/pages/content-ui/README.md create mode 100644 extension/pages/content-ui/build.mts create mode 100644 extension/pages/content-ui/package.json create mode 100644 extension/pages/content-ui/public/logo.svg create mode 100644 extension/pages/content-ui/src/matches/all/App.tsx create mode 100644 extension/pages/content-ui/src/matches/all/index.css create mode 100644 extension/pages/content-ui/src/matches/all/index.tsx create mode 100644 extension/pages/content-ui/src/matches/example/App.tsx create mode 100644 extension/pages/content-ui/src/matches/example/index.css create mode 100644 extension/pages/content-ui/src/matches/example/index.tsx create mode 100644 extension/pages/content-ui/tailwind.config.ts create mode 100644 extension/pages/content-ui/tailwind.d.ts create mode 100644 extension/pages/content-ui/tsconfig.json create mode 100644 extension/pages/content/README.md create mode 100644 extension/pages/content/build.mts create mode 100644 extension/pages/content/package.json create mode 100644 extension/pages/content/public/logo.svg create mode 100644 extension/pages/content/src/matches/all/index.ts create mode 100644 extension/pages/content/src/matches/example/index.ts create mode 100644 extension/pages/content/src/sample-function.ts create mode 100644 extension/pages/content/tsconfig.json create mode 100644 extension/pages/devtools-panel/index.html create mode 100644 extension/pages/devtools-panel/package.json create mode 100644 extension/pages/devtools-panel/public/logo_horizontal.svg create mode 100644 extension/pages/devtools-panel/public/logo_horizontal_dark.svg create mode 100644 extension/pages/devtools-panel/src/Panel.css create mode 100644 extension/pages/devtools-panel/src/Panel.tsx create mode 100644 extension/pages/devtools-panel/src/index.css create mode 100644 extension/pages/devtools-panel/src/index.tsx create mode 100644 extension/pages/devtools-panel/tailwind.config.ts create mode 100644 extension/pages/devtools-panel/tsconfig.json create mode 100644 extension/pages/devtools-panel/vite.config.mts create mode 100644 extension/pages/devtools/index.html create mode 100644 extension/pages/devtools/package.json create mode 100644 extension/pages/devtools/public/logo.svg create mode 100644 extension/pages/devtools/src/index.ts create mode 100644 extension/pages/devtools/tsconfig.json create mode 100644 extension/pages/devtools/vite.config.mts create mode 100644 extension/pages/new-tab/index.html create mode 100644 extension/pages/new-tab/package.json create mode 100644 extension/pages/new-tab/public/logo_horizontal.svg create mode 100644 extension/pages/new-tab/public/logo_horizontal_dark.svg create mode 100644 extension/pages/new-tab/src/NewTab.css create mode 100644 extension/pages/new-tab/src/NewTab.scss create mode 100644 extension/pages/new-tab/src/NewTab.tsx create mode 100644 extension/pages/new-tab/src/components/LoginPage.tsx create mode 100644 extension/pages/new-tab/src/components/MainPage.tsx create mode 100644 extension/pages/new-tab/src/components/SettingsPage.tsx create mode 100644 extension/pages/new-tab/src/index.css create mode 100644 extension/pages/new-tab/src/index.tsx create mode 100644 extension/pages/new-tab/tailwind.config.ts create mode 100644 extension/pages/new-tab/tsconfig.json create mode 100644 extension/pages/new-tab/vite.config.mts create mode 100644 extension/pages/options/index.html create mode 100644 extension/pages/options/package.json create mode 100644 extension/pages/options/public/logo_horizontal.svg create mode 100644 extension/pages/options/public/logo_horizontal_dark.svg create mode 100644 extension/pages/options/src/Options.css create mode 100644 extension/pages/options/src/Options.tsx create mode 100644 extension/pages/options/src/index.css create mode 100644 extension/pages/options/src/index.tsx create mode 100644 extension/pages/options/tailwind.config.ts create mode 100644 extension/pages/options/tsconfig.json create mode 100644 extension/pages/options/vite.config.mts create mode 100644 extension/pages/popup/index.html create mode 100644 extension/pages/popup/package.json create mode 100644 extension/pages/popup/public/logo_vertical.svg create mode 100644 extension/pages/popup/public/logo_vertical_dark.svg create mode 100644 extension/pages/popup/src/Popup.css create mode 100644 extension/pages/popup/src/Popup.tsx create mode 100644 extension/pages/popup/src/components/ApplicationSelector.tsx create mode 100644 extension/pages/popup/src/components/ConnectionStatus.tsx create mode 100644 extension/pages/popup/src/components/RecordingControls.tsx create mode 100644 extension/pages/popup/src/index.css create mode 100644 extension/pages/popup/src/index.tsx create mode 100644 extension/pages/popup/tailwind.config.ts create mode 100644 extension/pages/popup/tsconfig.json create mode 100644 extension/pages/popup/vite.config.mts create mode 100644 extension/pages/side-panel/index.html create mode 100644 extension/pages/side-panel/package.json create mode 100644 extension/pages/side-panel/public/logo_vertical.svg create mode 100644 extension/pages/side-panel/public/logo_vertical_dark.svg create mode 100644 extension/pages/side-panel/src/SidePanel.css create mode 100644 extension/pages/side-panel/src/SidePanel.tsx create mode 100644 extension/pages/side-panel/src/components/LoginPage.tsx create mode 100644 extension/pages/side-panel/src/components/MainPage.tsx create mode 100644 extension/pages/side-panel/src/components/SettingsPage.tsx create mode 100644 extension/pages/side-panel/src/index.css create mode 100644 extension/pages/side-panel/src/index.tsx create mode 100644 extension/pages/side-panel/tailwind.config.ts create mode 100644 extension/pages/side-panel/tsconfig.json create mode 100644 extension/pages/side-panel/vite.config.mts create mode 100644 extension/pnpm-lock.yaml create mode 100644 extension/pnpm-workspace.yaml create mode 100644 extension/tests/e2e/config/wdio.browser.conf.ts create mode 100644 extension/tests/e2e/config/wdio.conf.ts create mode 100644 extension/tests/e2e/config/wdio.d.ts create mode 100644 extension/tests/e2e/helpers/theme.ts create mode 100644 extension/tests/e2e/package.json create mode 100644 extension/tests/e2e/specs/page-content-runtime.test.ts create mode 100644 extension/tests/e2e/specs/page-content-ui.test.ts create mode 100644 extension/tests/e2e/specs/page-content.test.ts create mode 100644 extension/tests/e2e/specs/page-devtools-panel.test.ts create mode 100644 extension/tests/e2e/specs/page-new-tab.test.ts create mode 100644 extension/tests/e2e/specs/page-options.test.ts create mode 100644 extension/tests/e2e/specs/page-popup.test.ts create mode 100644 extension/tests/e2e/specs/page-side-panel.test.ts create mode 100644 extension/tests/e2e/specs/smoke.test.ts create mode 100644 extension/tests/e2e/tsconfig.json create mode 100644 extension/tests/e2e/utils/extension-path.ts create mode 100644 extension/tsconfig.json create mode 100644 extension/turbo.json create mode 100644 objective.md delete mode 100644 web/README.md delete mode 100644 web/components.json delete mode 100644 web/package-lock.json delete mode 100644 web/package.json delete mode 100644 web/postcss.config.js delete mode 100644 web/prettier.config.js delete mode 100644 web/public/favicon.ico delete mode 100644 web/public/index.html delete mode 100644 web/public/logo192.png delete mode 100644 web/public/logo512.png delete mode 100644 web/public/manifest.json delete mode 100644 web/public/robots.txt delete mode 100644 web/src/App.test.tsx delete mode 100644 web/src/App.tsx delete mode 100644 web/src/app/global.css delete mode 100644 web/src/assert/svg/NotFound.svg delete mode 100644 web/src/assert/svg/index.ts delete mode 100644 web/src/components/ui/accordion.tsx delete mode 100644 web/src/components/ui/alert-dialog.tsx delete mode 100644 web/src/components/ui/alert.tsx delete mode 100644 web/src/components/ui/aspect-ratio.tsx delete mode 100644 web/src/components/ui/avatar.tsx delete mode 100644 web/src/components/ui/badge.tsx delete mode 100644 web/src/components/ui/button.tsx delete mode 100644 web/src/components/ui/calendar.tsx delete mode 100644 web/src/components/ui/card.tsx delete mode 100644 web/src/components/ui/carousel.tsx delete mode 100644 web/src/components/ui/checkbox.tsx delete mode 100644 web/src/components/ui/collapsible.tsx delete mode 100644 web/src/components/ui/command.tsx delete mode 100644 web/src/components/ui/context-menu.tsx delete mode 100644 web/src/components/ui/dialog.tsx delete mode 100644 web/src/components/ui/drawer.tsx delete mode 100644 web/src/components/ui/form.tsx delete mode 100644 web/src/components/ui/input.tsx delete mode 100644 web/src/components/ui/menubar.tsx delete mode 100644 web/src/components/ui/navigation-menu.tsx delete mode 100644 web/src/components/ui/pagination.tsx delete mode 100644 web/src/components/ui/popover.tsx delete mode 100644 web/src/components/ui/progress.tsx delete mode 100644 web/src/components/ui/resizable.tsx delete mode 100644 web/src/components/ui/scroll-area.tsx delete mode 100644 web/src/components/ui/select.tsx delete mode 100644 web/src/components/ui/sheet.tsx delete mode 100644 web/src/components/ui/skeleton.tsx delete mode 100644 web/src/components/ui/slider.tsx delete mode 100644 web/src/components/ui/sonner.tsx delete mode 100644 web/src/components/ui/switch.tsx delete mode 100644 web/src/components/ui/table.tsx delete mode 100644 web/src/components/ui/tabs.tsx delete mode 100644 web/src/components/ui/textarea.tsx delete mode 100644 web/src/components/ui/toast.tsx delete mode 100644 web/src/components/ui/toaster.tsx delete mode 100644 web/src/components/ui/toggle-group.tsx delete mode 100644 web/src/components/ui/toggle.tsx delete mode 100644 web/src/components/ui/tooltip.tsx delete mode 100644 web/src/components/ui/use-toast.ts delete mode 100644 web/src/constants/action.ts delete mode 100644 web/src/constants/index.ts delete mode 100644 web/src/constants/target.ts delete mode 100644 web/src/core/components/app_card.tsx delete mode 100644 web/src/core/components/flow/components/index.tsx delete mode 100644 web/src/core/components/flow/components/new.tsx delete mode 100644 web/src/core/components/flow/edge/general.tsx delete mode 100644 web/src/core/components/flow/edge/index.tsx delete mode 100644 web/src/core/components/flow/edge/no.tsx delete mode 100644 web/src/core/components/flow/edge/yes.tsx delete mode 100644 web/src/core/components/flow/flow.tsx delete mode 100644 web/src/core/components/flow/form.tsx delete mode 100644 web/src/core/components/flow/handler/test.tsx delete mode 100644 web/src/core/components/flow/index.tsx delete mode 100644 web/src/core/components/flow/mock/ifCondition.tsx delete mode 100644 web/src/core/components/flow/mock/index.tsx delete mode 100644 web/src/core/components/flow/node.tsx delete mode 100644 web/src/core/components/flow/node/action.tsx delete mode 100644 web/src/core/components/flow/node/condition.tsx delete mode 100644 web/src/core/components/flow/node/endloop.tsx delete mode 100644 web/src/core/components/flow/node/for.tsx delete mode 100644 web/src/core/components/flow/node/index.tsx delete mode 100644 web/src/core/components/flow/node/loop.tsx delete mode 100644 web/src/core/components/flow/node/new.tsx delete mode 100644 web/src/core/components/flow/workflow.tsx delete mode 100644 web/src/core/components/input/index.tsx delete mode 100644 web/src/core/components/input/text.tsx delete mode 100644 web/src/core/components/page_header/index.tsx delete mode 100644 web/src/core/components/select/index.tsx delete mode 100644 web/src/core/components/select/search.tsx delete mode 100644 web/src/core/components/spinner.tsx delete mode 100644 web/src/core/components/table/edit/index.tsx delete mode 100644 web/src/core/components/table/index.ts delete mode 100644 web/src/core/components/table/read/index.tsx delete mode 100644 web/src/core/components/table/read/v2.tsx delete mode 100644 web/src/core/components/topnav.tsx delete mode 100644 web/src/hooks/resizeobserver/index.tsx delete mode 100644 web/src/index.css delete mode 100644 web/src/index.tsx delete mode 100644 web/src/interface/request.ts delete mode 100644 web/src/layouts/admin/index.tsx delete mode 100644 web/src/layouts/app/index.tsx delete mode 100644 web/src/layouts/app/state.ts delete mode 100644 web/src/layouts/auth/index.tsx delete mode 100644 web/src/layouts/home/index.tsx delete mode 100644 web/src/logo.svg delete mode 100644 web/src/pages/app/action_group/actiongroup.tsx delete mode 100644 web/src/pages/app/action_group/index.tsx delete mode 100644 web/src/pages/app/action_group/item/index.tsx delete mode 100644 web/src/pages/app/dashboard/index.tsx delete mode 100644 web/src/pages/app/history/historys.tsx delete mode 100644 web/src/pages/app/history/index.tsx delete mode 100644 web/src/pages/app/test_case/index.tsx delete mode 100644 web/src/pages/app/test_case/testcase.tsx delete mode 100644 web/src/pages/auth/login.tsx delete mode 100644 web/src/pages/home/index.tsx delete mode 100644 web/src/pages/home/style.css delete mode 100644 web/src/react-app-env.d.ts delete mode 100644 web/src/reportWebVitals.ts delete mode 100644 web/src/service/app/action_group.ts delete mode 100644 web/src/service/app/index.ts delete mode 100644 web/src/service/endpoint.ts delete mode 100644 web/src/service/index.ts delete mode 100644 web/src/setupTests.ts delete mode 100644 web/src/stores/flow.store.ts delete mode 100644 web/src/stores/route.store.ts delete mode 100644 web/src/stores/testcase.store.js delete mode 100644 web/src/utils/route.tsx delete mode 100644 web/start.sh delete mode 100644 web/tailwind.config.js delete mode 100644 web/tsconfig.json diff --git a/.cargo/config.example.toml b/.cargo/config.example.toml index 0ade741..34cd69d 100644 --- a/.cargo/config.example.toml +++ b/.cargo/config.example.toml @@ -8,14 +8,16 @@ RUST_LOG="cerium=debug,entity=debug,migration=info,api=debug" ## -- Database Url -DATABASE_URI="" -SELENIUM_URI="" +DATABASE_URI="postgres://root:root@localhost:5433/orca" +SELENIUM_URI="http://localhost:4444/wd/hub" -MINIO_ACCESS_KEY = "" -MINIO_ACCESS_SECRET = "" +MINIO_ACCESS_KEY = "minioadmin" +MINIO_ACCESS_SECRET = "minioadmin" +MINIO_ENDPOINT = "http://localhost:9000" # -- Encryption salt used for JWT token and other secret keys -ENCRYPTION_SALT="" +# Generate with: openssl rand -hex 32 +ENCRYPTION_SALT="change_this_to_a_secure_random_string" DEBUG=false diff --git a/.env b/.env index cff2de6..414ed53 100644 --- a/.env +++ b/.env @@ -1 +1,23 @@ -DATABASE_URL="postgres://root:root@localhost:5432/orca" \ No newline at end of file +# Database Configuration +POSTGRES_USER=root +POSTGRES_PASSWORD=root +POSTGRES_DB=orca +POSTGRES_PORT=5433 + +# MinIO Configuration +MINIO_ACCESS_KEY=minioadmin +MINIO_SECRET_KEY=minioadmin +MINIO_BROWSER_URL=http://localhost:9001 + +# Redis Configuration +REDIS_PORT=6379 + +# Application Configuration +APP_PORT=8080 +APP_LOG_LEVEL=DEBUG + +# Selenium Hub Configuration +SELENIUM_HUB_PORT=4444 + +# Database URL for application +DATABASE_URL="postgres://root:root@localhost:5433/orca" \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6ac1fab --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Database Configuration +POSTGRES_USER=root +POSTGRES_PASSWORD=your_secure_password_here +POSTGRES_DB=orca +POSTGRES_PORT=5433 + +# MinIO Configuration +MINIO_ACCESS_KEY=minioadmin +MINIO_SECRET_KEY=your_secure_minio_password_here +MINIO_BROWSER_URL=http://localhost:9001 + +# Redis Configuration +REDIS_PORT=6379 + +# Application Configuration +APP_PORT=8080 +APP_LOG_LEVEL=DEBUG + +# Selenium Hub Configuration +SELENIUM_HUB_PORT=4444 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3d863fa..a0e64d5 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ # misc .DS_Store +.env .env.local .env.development.local .env.test.local diff --git a/Cargo.toml b/Cargo.toml index 43aee1e..198a028 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ ## See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] -name = "orca" +resolver = "2" members=[ "crates/libs/cerium", "crates/libs/entity", @@ -31,44 +31,41 @@ api = { path = "crates/services/api", default-features = true } chrome = { path = "crates/workshop/chrome", default-features = true } entity_macro = { path = "crates/macro/entity-macro", default-features = true } -thiserror = "1.0.31" -jsonwebtoken = "9.2.0" -serde = { version = "1.0.147"} -serde_json = "1.0.87" -chrono = { version = "0.4.31"} -tracing = "0.1.37" -tracing-subscriber = "0.3.16" -uuid = { version = "1.6.1", features = ["serde", "v4"] } +thiserror = "2.0.16" +jsonwebtoken = "9.3.1" +serde = { version = "1.0.219"} +serde_json = "1.0.143" +chrono = { version = "0.4.41"} +tracing = "0.1.41" +tracing-subscriber = "0.3.19" +uuid = { version = "1.18.0", features = ["serde", "v4"] } config = "0.14.0" dotenv = "0.15.0" -futures = "0.3.29" -futures-util = "0.3.29" -rust_decimal = "1.14.3" +futures = "0.3.31" +futures-util = "0.3.31" +rust_decimal = "1.37.2" cross-test = "0.1.6" -sea-query = "0.30.5" -sea-orm = { version = "0.12.3", features = [ +sea-query = "0.32.7" +sea-orm = { version = "1.1.1", features = [ "macros", "debug-print", "runtime-async-std-native-tls", "sqlx-postgres", ] } -sea-orm-migration = {version = "0.12.3", features = ["sqlx-postgres"]} -axum = "0.7.1" -axum-extra = "0.9.1" -tokio = { version = "1.34.0", features = ["full"] } -tower = "0.4.13" -tower-http = { version = "0.5.0", default-features = true, features = ["uuid", "cors", "trace", "compression-br", "catch-panic", "request-id"] } +sea-orm-migration = {version = "1.1.14", features = ["sqlx-postgres"]} +axum = "0.7.9" +axum-extra = "0.9.6" +tokio = { version = "1.47.1", features = ["full"] } +tower = "0.5.2" +tower-http = { version = "0.6.6", default-features = true, features = ["uuid", "cors", "trace", "compression-br", "catch-panic", "request-id"] } -rust-s3 = "0.33.0" +rust-s3 = "0.35.1" -thirtyfour = "0.31.0" +thirtyfour = "0.36.1" -geckodriver="0.34.0" +geckodriver="0.36.0" -[patch.crates-io] -sea-orm = { git="https://github.com/itsparser/sea-orm", branch = "master" } -sea-orm-migration = { git="https://github.com/itsparser/sea-orm", branch = "master" } diff --git a/README.md b/README.md index 27ff0fd..7d0074d 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,11 @@ Orca follows the Contributor Covenant Code of Conduct. See [CODE\_OF\_CONDUCT.md 1. Install the Rust compiler and toolchain following the instructions at [https://www.rust-lang.org/](https://www.rust-lang.org/) 2. Install docker in your system following the instructions at [https://docs.docker.com/get-docker/] 3. Go to this repo [https://github.com/orcaci/orca] and fork this repository -4. Clone the Orca repository: ```git clone https://github.com/[username]/orca.git``` +4. Clone the Orca repository: ```git clone https://github.com/[username]/orca.git``` 5. Change into the Orca directory: ```cd orca``` -6. Copy the config file ```cp .cargo/config.local.toml .cargo/config.toml``` or Create a new file named **cargo.toml** under .cargo/ directory and add your own secrets -7. Now run start.sh file to start orca. ```bash start.sh``` +6. Set up environment variables: ```cp .env.example .env``` and edit `.env` with your secure credentials +7. Copy the config file ```cp .cargo/config.local.toml .cargo/config.toml``` or Create a new file named **config.toml** under .cargo/ directory and add your own configuration +8. Now run start.sh file to start orca. ```bash start.sh``` ## **Usage** diff --git a/crates/libs/cerium/Cargo.toml b/crates/libs/cerium/Cargo.toml index d39643d..dd670ed 100644 --- a/crates/libs/cerium/Cargo.toml +++ b/crates/libs/cerium/Cargo.toml @@ -45,9 +45,9 @@ serde.workspace=true serde_json.workspace=true rust-s3.workspace=true -lazy_static = "1.4.0" +lazy_static = "1.5.0" async_once = "0.2.6" -rand = { version = "0.8.5", default-features = false, features = ["std"] } -log = "0.4.20" +rand = { version = "0.9.2", default-features = false, features = ["std"] } +log = "0.4.27" diff --git a/crates/libs/cerium/src/client/driver/web.rs b/crates/libs/cerium/src/client/driver/web.rs index 8e203d5..c16531f 100644 --- a/crates/libs/cerium/src/client/driver/web.rs +++ b/crates/libs/cerium/src/client/driver/web.rs @@ -1,4 +1,4 @@ -use thirtyfour::{CapabilitiesHelper, WebDriver as TFWebDriver}; +use thirtyfour::{WebDriver as TFWebDriver}; use crate::error::CeriumResult; use thirtyfour::{By, DesiredCapabilities, WebElement}; @@ -32,13 +32,12 @@ impl WebDriver { } pub async fn session_id(&self) -> CeriumResult { - Ok(self.driver.session_id().await?.clone().to_string()) + Ok(self.driver.session_id().to_string()) } pub async fn default() -> CeriumResult { - let mut caps = DesiredCapabilities::firefox(); - caps.add("se:recordVideo", true)?; - let driver = TFWebDriver::new("http://localhost:4444/wd/hub/session", caps).await?; + let caps = DesiredCapabilities::firefox(); + let driver = TFWebDriver::new("http://localhost:4444", caps).await?; Self::new(driver) } @@ -59,7 +58,7 @@ impl WebDriver { } pub async fn find(&self, by: impl Into) -> CeriumResult { - Ok(self.driver.find(by).await?) + Ok(self.driver.find(by.into()).await?) } /// take_screenshot - will take screenshot and send png back to the requester diff --git a/crates/libs/cerium/src/client/storage/s3.rs b/crates/libs/cerium/src/client/storage/s3.rs index 55c14dc..95e09ea 100644 --- a/crates/libs/cerium/src/client/storage/s3.rs +++ b/crates/libs/cerium/src/client/storage/s3.rs @@ -50,7 +50,7 @@ impl S3Client { pub fn get_bucket(&self, bucket_name: &str) -> CeriumResult { let mut bucket = Bucket::new(bucket_name, self.region.clone(), self.credentials.clone())?; bucket.set_path_style(); - Ok(bucket) + Ok(*bucket) } /// Asynchronously lists the buckets. @@ -77,7 +77,7 @@ impl S3Client { /// A CeriumResult indicating success or failure. pub async fn create(&self, bucket: &str, key: &str, data: &[u8]) -> CeriumResult<()> { let _bucket_obj = self.get_bucket(bucket)?; - let result = _bucket_obj.put_object(key, data).await?; + let _result = _bucket_obj.put_object(key, data).await?; Ok(()) } diff --git a/crates/libs/cerium/src/server/mod.rs b/crates/libs/cerium/src/server/mod.rs index 9d2cf9f..f882506 100644 --- a/crates/libs/cerium/src/server/mod.rs +++ b/crates/libs/cerium/src/server/mod.rs @@ -7,13 +7,12 @@ use tokio::net::TcpListener; use tower_http::{ catch_panic::CatchPanicLayer, compression::CompressionLayer, - cors::{Any, CorsLayer}, + cors::{CorsLayer}, }; use tower_http::request_id::{PropagateRequestIdLayer, SetRequestIdLayer}; use tower_http::trace::TraceLayer; use tracing::{info, Level}; use tracing_subscriber::fmt; -use tracing_subscriber::layer::SubscriberExt; use crate::client::Client; use crate::server::request_id::OrcaRequestId; diff --git a/crates/libs/entity/src/common/attachment.rs b/crates/libs/entity/src/common/attachment.rs index 87cc128..9b31efc 100644 --- a/crates/libs/entity/src/common/attachment.rs +++ b/crates/libs/entity/src/common/attachment.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "storage_type" )] pub enum StorageType { @@ -22,7 +22,7 @@ pub enum StorageType { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "storage_category" )] pub enum StorageCategory { diff --git a/crates/libs/entity/src/common/config.rs b/crates/libs/entity/src/common/config.rs index a11efef..d9b77b8 100644 --- a/crates/libs/entity/src/common/config.rs +++ b/crates/libs/entity/src/common/config.rs @@ -2,13 +2,13 @@ //! Config will have all the Orca Configuration use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "config_key" )] pub enum ConfigType { diff --git a/crates/libs/entity/src/common/tag_entity.rs b/crates/libs/entity/src/common/tag_entity.rs index 01d8f80..28663ea 100644 --- a/crates/libs/entity/src/common/tag_entity.rs +++ b/crates/libs/entity/src/common/tag_entity.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "tag_entity_type" )] pub enum EntityType { diff --git a/crates/libs/entity/src/test/field.rs b/crates/libs/entity/src/test/field.rs index b86e15c..2105ce2 100644 --- a/crates/libs/entity/src/test/field.rs +++ b/crates/libs/entity/src/test/field.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "table_kind" )] pub enum FieldDataKind { diff --git a/crates/libs/entity/src/test/history.rs b/crates/libs/entity/src/test/history.rs index e96e8fa..07397f4 100644 --- a/crates/libs/entity/src/test/history.rs +++ b/crates/libs/entity/src/test/history.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(10))", + db_type = "String(StringLen::None)", enum_name = "execution_type" )] pub enum ExecutionType { @@ -22,7 +22,7 @@ pub enum ExecutionType { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(10))", + db_type = "String(StringLen::None)", enum_name = "execution_kind" )] pub enum ExecutionKind { @@ -38,7 +38,7 @@ pub enum ExecutionKind { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", -db_type = "String(Some(10))", +db_type = "String(StringLen::None)", enum_name = "execution_status" )] pub enum ExecutionStatus { diff --git a/crates/libs/entity/src/test/ui/action/action.rs b/crates/libs/entity/src/test/ui/action/action.rs index 280afa5..61458d0 100644 --- a/crates/libs/entity/src/test/ui/action/action.rs +++ b/crates/libs/entity/src/test/ui/action/action.rs @@ -1,7 +1,7 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; use crate::prelude::target::ActionTargetKind; @@ -10,7 +10,7 @@ use crate::test::ui::action::data::ActionDataKind; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "action_kind" )] pub enum ActionKind { diff --git a/crates/libs/entity/src/test/ui/action/data.rs b/crates/libs/entity/src/test/ui/action/data.rs index d22b200..e1175c7 100644 --- a/crates/libs/entity/src/test/ui/action/data.rs +++ b/crates/libs/entity/src/test/ui/action/data.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "action_data_kind" )] pub enum ActionDataKind { diff --git a/crates/libs/entity/src/test/ui/action/group.rs b/crates/libs/entity/src/test/ui/action/group.rs index 3445553..d4a0ce1 100644 --- a/crates/libs/entity/src/test/ui/action/group.rs +++ b/crates/libs/entity/src/test/ui/action/group.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "action_group_kind" )] pub enum ActionGroupKind { diff --git a/crates/libs/entity/src/test/ui/action/target.rs b/crates/libs/entity/src/test/ui/action/target.rs index 0c4f292..c3c0694 100644 --- a/crates/libs/entity/src/test/ui/action/target.rs +++ b/crates/libs/entity/src/test/ui/action/target.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "action_target_kind" )] pub enum ActionTargetKind { diff --git a/crates/libs/entity/src/test/ui/case/case_block.rs b/crates/libs/entity/src/test/ui/case/case_block.rs index 55dac03..af52c5b 100644 --- a/crates/libs/entity/src/test/ui/case/case_block.rs +++ b/crates/libs/entity/src/test/ui/case/case_block.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "block_kind" )] pub enum BlockKind { @@ -22,7 +22,7 @@ pub enum BlockKind { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "block_type" )] pub enum BlockType { @@ -108,4 +108,4 @@ impl Linked for SelfReferencingLink { fn link(&self) -> Vec { vec![Relation::SelfReferencing.def()] } -} +} \ No newline at end of file diff --git a/crates/libs/entity/src/test/ui/case/data_binding.rs b/crates/libs/entity/src/test/ui/case/data_binding.rs index d48b0cd..4acde0a 100644 --- a/crates/libs/entity/src/test/ui/case/data_binding.rs +++ b/crates/libs/entity/src/test/ui/case/data_binding.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "data_binding_kind" )] pub enum DataBindingKind { diff --git a/crates/libs/entity/src/test/ui/elements.rs b/crates/libs/entity/src/test/ui/elements.rs index 2b3cf3e..644285c 100644 --- a/crates/libs/entity/src/test/ui/elements.rs +++ b/crates/libs/entity/src/test/ui/elements.rs @@ -1,7 +1,7 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; use crate::prelude::target::ActionTargetKind; @@ -9,7 +9,7 @@ use crate::prelude::target::ActionTargetKind; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(5))", + db_type = "String(StringLen::None)", enum_name = "element_create_type" )] pub enum ElementCreateType { diff --git a/crates/libs/entity/src/test/ui/log/item_log.rs b/crates/libs/entity/src/test/ui/log/item_log.rs index fc566f5..5fab877 100644 --- a/crates/libs/entity/src/test/ui/log/item_log.rs +++ b/crates/libs/entity/src/test/ui/log/item_log.rs @@ -2,11 +2,11 @@ use sea_orm::ActiveValue::Set; use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] -#[sea_orm(rs_type = "String", db_type = "String(Some(5))", enum_name = "item_log_status")] +#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)", enum_name = "item_log_status")] pub enum ItemLogStatus { #[sea_orm(string_value = "SUCC")] #[serde(rename = "Scheduled")] @@ -23,7 +23,7 @@ pub enum ItemLogStatus { } #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] -#[sea_orm(rs_type = "String", db_type = "String(Some(5))", enum_name = "item_log_type")] +#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)", enum_name = "item_log_type")] pub enum ItemLogType { #[sea_orm(string_value = "A")] #[serde(rename = "Action")] diff --git a/crates/libs/entity/src/test/ui/request.rs b/crates/libs/entity/src/test/ui/request.rs index ab585da..88583d1 100644 --- a/crates/libs/entity/src/test/ui/request.rs +++ b/crates/libs/entity/src/test/ui/request.rs @@ -3,12 +3,13 @@ use sea_orm::{EntityTrait, NotSet}; use sea_orm::ActiveValue::Set; use sea_orm::entity::prelude::*; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", -db_type = "String(Some(10))", +db_type = "String(StringLen::None)", enum_name = "execution_kind" )] pub enum ExecutionKind { @@ -23,7 +24,7 @@ pub enum ExecutionKind { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", -db_type = "String(Some(10))", +db_type = "String(StringLen::None)", enum_name = "execution_type" )] pub enum ExecutionType { @@ -38,7 +39,7 @@ pub enum ExecutionType { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", -db_type = "String(Some(10))", +db_type = "String(StringLen::None)", enum_name = "execution_status" )] pub enum ExecutionStatus { diff --git a/crates/libs/entity/src/test/ui/suit/suite_block.rs b/crates/libs/entity/src/test/ui/suit/suite_block.rs index b5a8a9e..23441fb 100644 --- a/crates/libs/entity/src/test/ui/suit/suite_block.rs +++ b/crates/libs/entity/src/test/ui/suit/suite_block.rs @@ -1,13 +1,13 @@ //! SeaORM Entity. Generated by sea-orm-codegen 0.6.0 use sea_orm::entity::prelude::*; -use sea_orm::EntityTrait; +use sea_orm::prelude::StringLen; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "block_kind" )] pub enum BlockKind { @@ -24,7 +24,7 @@ pub enum BlockKind { #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)] #[sea_orm( rs_type = "String", - db_type = "String(Some(15))", + db_type = "String(StringLen::None)", enum_name = "suit_block_type" )] pub enum SuiteBlockType { diff --git a/crates/libs/migration/src/migration002.rs b/crates/libs/migration/src/migration002.rs index 3436d2f..6bf6700 100644 --- a/crates/libs/migration/src/migration002.rs +++ b/crates/libs/migration/src/migration002.rs @@ -43,7 +43,7 @@ impl MigrationTrait for Migration { }; let app_g: action_group::Model = action_g_am.insert(db).await?; - let action_ms = vec![ + let _action_ms = vec![ action::ActiveModel { id: Set(Uuid::new_v4()), description: Set(Some("Navigation to URL".to_string())), @@ -87,7 +87,7 @@ impl MigrationTrait for Migration { ]; // let _action_m: InsertResult = // action::Entity::insert_many(action_ms).exec(db).await?; - /// check assert + // check assert let assert_g_am = action_group::ActiveModel { id: Set(Uuid::new_v4()), name: Set("Wikipedia Assert".to_string()), @@ -129,7 +129,7 @@ impl MigrationTrait for Migration { let uuid2 = Uuid::new_v4(); let uuid3 = Uuid::new_v4(); - let case_blocks = vec![ + let _case_blocks = vec![ case_block::ActiveModel { id: Set(Uuid::new_v4()), execution_order: Set(1), @@ -213,7 +213,7 @@ impl MigrationTrait for Migration { Ok(()) } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> { Ok(()) } } diff --git a/crates/macro/entity-macro/Cargo.toml b/crates/macro/entity-macro/Cargo.toml index eaa077b..bcb99c9 100644 --- a/crates/macro/entity-macro/Cargo.toml +++ b/crates/macro/entity-macro/Cargo.toml @@ -17,8 +17,8 @@ proc-macro = true [dependencies] quote = "1" proc-macro2 = "1.0" -syn = "1.0" +syn = "2.0" sea-orm.workspace=true sea-query.workspace=true -serde = { version = "1.0.193", features = ["derive"] } \ No newline at end of file +serde = { version = "1.0.219", features = ["derive"] } diff --git a/crates/macro/entity-macro/src/lib.rs b/crates/macro/entity-macro/src/lib.rs index 4d1236b..1516d91 100644 --- a/crates/macro/entity-macro/src/lib.rs +++ b/crates/macro/entity-macro/src/lib.rs @@ -13,7 +13,7 @@ use syn::{DeriveInput, parse_macro_input}; /// [1]: https://doc.rust-lang.org/reference/procedural-macros.html#derive-mode-macros #[proc_macro_derive(MyDerive)] pub fn my_derive(input: TokenStream) -> TokenStream { - eprintln!("input : {:#?}", input); + // Debug output removed - use RUSTC_LOG=debug for proc-macro debugging // Parse the input tokens into a syntax tree let input = parse_macro_input!(input as DeriveInput); @@ -25,7 +25,7 @@ pub fn my_derive(input: TokenStream) -> TokenStream { new_field: i32, }; - eprintln!("marco input : {:#?}", input); + // Debug output removed - use RUSTC_LOG=debug for proc-macro debugging // Generate the implementation of the trait for the struct let expanded = quote! { @@ -33,7 +33,7 @@ pub fn my_derive(input: TokenStream) -> TokenStream { #new_field } }; - eprintln!("expanded: {:#?}", expanded); + // Debug output removed - use RUSTC_LOG=debug for proc-macro debugging // // // Return the generated implementation as a TokenStream expanded.into() diff --git a/crates/macro/entity-macro/tests/check.rs b/crates/macro/entity-macro/tests/check.rs index 4705483..9b9fa51 100644 --- a/crates/macro/entity-macro/tests/check.rs +++ b/crates/macro/entity-macro/tests/check.rs @@ -49,6 +49,8 @@ mod tests { #[test] fn dry_run_test_controller() { let c = Model{_name: "mani".to_string(), _age: 32}; - println!("got the controller, c = {:?}", c); + // Test passes if the model can be created successfully + assert_eq!(c._name, "mani"); + assert_eq!(c._age, 32); } } \ No newline at end of file diff --git a/crates/services/api/Cargo.toml b/crates/services/api/Cargo.toml index cae79b0..e7a245c 100644 --- a/crates/services/api/Cargo.toml +++ b/crates/services/api/Cargo.toml @@ -37,9 +37,9 @@ migration.workspace=true entity.workspace=true thiserror.workspace=true -async-recursion = "1.0.5" +async-recursion = "1.1.1" -tokio = { version = "1.0", features = ["full"] } +tokio = { version = "1.47", features = ["full"] } #[patch.crates-io] diff --git a/crates/services/api/src/error.rs b/crates/services/api/src/error.rs index 0e31c49..d1c6cc7 100644 --- a/crates/services/api/src/error.rs +++ b/crates/services/api/src/error.rs @@ -90,11 +90,7 @@ impl IntoResponse for OrcaError { OrcaError::SerializerError(err) => (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()), OrcaError::CeriumError(err) => (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()), OrcaError::EngineError(err) => (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()), - RepoError(err) => (StatusCode::NOT_FOUND, err.to_string()), - _ => ( - StatusCode::INTERNAL_SERVER_ERROR, - "Internal Error Not Specify".to_string(), - ), + OrcaError::RepoError(err) => (StatusCode::NOT_FOUND, err.to_string()), }; let body = Json(json!({ diff --git a/crates/services/api/src/main.rs b/crates/services/api/src/main.rs index dcbbada..5786b4c 100644 --- a/crates/services/api/src/main.rs +++ b/crates/services/api/src/main.rs @@ -18,9 +18,7 @@ pub(crate) mod service; pub(crate) mod utils; pub(crate) async fn run_migration(db: &DatabaseConnection) -> Result<(), DbErr> { - migration::Migrator::up(db, None) - .await - .expect("TODO: panic message"); + migration::Migrator::up(db, None).await?; Ok(()) } pub(crate) async fn get_config() -> Client { @@ -34,7 +32,10 @@ async fn main() { app.set_logger(Level::DEBUG); app.set_port(8080); - run_migration(cli.db()).await.expect("TODO: panic message"); + if let Err(e) = run_migration(cli.db()).await { + tracing::error!("Failed to run migrations: {}", e); + std::process::exit(1); + } let routers = handle_router() .layer(Extension(cli.clone())) .layer(OrcaLayer { diff --git a/crates/services/api/src/route/app/case_old.rs b/crates/services/api/src/route/app/case_old.rs deleted file mode 100644 index b446b56..0000000 --- a/crates/services/api/src/route/app/case_old.rs +++ /dev/null @@ -1,215 +0,0 @@ -use std::str::FromStr; - -use actix_web::{HttpResponse, web}; -use actix_web::web::Path; -use futures_util::StreamExt; -use log::{debug, info}; -use sea_orm::{ActiveModelTrait, Condition, InsertResult, IntoActiveModel, QuerySelect}; -use sea_orm::ActiveValue::Set; -use sea_orm::ColumnTrait; -use sea_orm::EntityTrait; -use sea_orm::prelude::Uuid; -use sea_orm::QueryFilter; -use sea_orm::QueryOrder; -use serde::Deserialize; - -use engine::controller::case::CaseController; -use engine::server::driver::UIHelper; -use entity::{prelude::*}; - -use crate::error::OrcaError; -use crate::utils::config::CONFIG; - -#[derive(Debug, Deserialize)] -pub struct QueryParams { - pub index: Option, - pub parent: Option, -} - -/// profile_config - this will register all the endpoint in profile route -pub fn test_case_config(cfg: &mut web::ServiceConfig) { - cfg.service( - web::scope("/case") - .route("/", web::get().to(get_cases)) - .route("/", web::post().to(create_case)) - .route("/{case_id}/detail/", web::get().to(get_case_info)) - .route("/{case_id}/batch/", web::post().to(batch_update_case_block)) - - .route("/{case_id}/block/{case_block_id}/", web::post().to(update_case_block)) - .route("/{case_id}/insert/", web::post().to(push_block)) - - .route("/{case_id}/run/", web::post().to(run)) - ); - -} - -/// list all the test cases in the Orca Application -async fn get_cases(path: Path) -> Result { - let app_id = path.into_inner(); - let _filter = Condition::all() - .add(case::Column::AppId.eq(app_id)); - let cases = case::Entity::find().filter(_filter) - .order_by_asc(case::Column::Name).all(&CONFIG.get().await.db_client).await - .expect("TODO: panic message"); - Ok(HttpResponse::Ok().json(cases)) -} - -/// Create New test case -async fn create_case(path: Path, mut body: web::Json) -> Result { - let app_id = path.into_inner(); - body.id = Uuid::new_v4(); - body.app_id = app_id; - let _case = body.clone().into_active_model(); - let result = _case.insert(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - Ok(HttpResponse::Ok().json(result)) -} - -/// get_case_info - Get Case Info -async fn get_case_info(path: Path<(Uuid, Uuid)>) -> Result { - let (_, case_id) = path.into_inner(); - let cases = case::Entity::find_by_id(case_id) - .one(&CONFIG.get().await.db_client).await - .expect("TODO: panic message"); - if let Some(mut case) = cases { - let _filter = Condition::all() - .add(case_block::Column::CaseId.eq(case_id)); - // let mut _case = case.into_active_model(); - let case_blocks = case_block::Entity::find().filter(_filter) - .order_by_asc(case_block::Column::ExecutionOrder).all(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - case.case_execution = Some(serde_json::to_value(case_blocks).expect("TODO: panic message")); - return Ok(HttpResponse::Ok().json(case)); - }; - Ok(HttpResponse::NoContent().finish()) -} - -/// batch_update_case_block - update Case Block -async fn batch_update_case_block(path: Path<(Uuid, Uuid)>, mut body: web::Json>) -> Result { - let (_, case_id) = path.into_inner(); - let case_blocks : Vec = body.clone().into_iter().map(|mut block| { - block.case_id = case_id.clone(); - block.into_active_model() - }).collect(); - let blocks = case_block::Entity::insert_many(case_blocks) - .exec(&CONFIG.get().await.db_client).await - .expect("TODO: panic message"); - Ok(HttpResponse::NoContent().finish()) -} - -/// push_into_index - This will Append New Block to the code for spe -async fn push_into_index(path: Path<(Uuid, Uuid, i32)>, mut body: web::Json, param: web::Query) -> Result { - let (_, case_id, index) = path.into_inner(); - - let mut _filter = Condition::all() - .add(case_block::Column::CaseId.eq(case_id)); - if param.parent.is_some() { - _filter = _filter.add(case_block::Column::ParentId.eq(param.parent.unwrap())); - } - - let _index : i32 = match param.index { - Some(x) => x, - _ => { - let mut i = 1; - let blocks = case_block::Entity::find().filter(_filter.clone()) - .all(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - if let Some(b) = blocks.last() { - i = b.execution_order + 1; - } - i - } - }; - _filter = _filter.add(case_block::Column::ExecutionOrder.gte(index)); - - - let blocks = case_block::Entity::find().filter(_filter) - .all(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - for block in blocks { - let new_order = block.execution_order + 1; - let mut action_model = block.into_active_model(); - action_model.execution_order = Set(new_order); - action_model.save(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - } - body.id = Uuid::new_v4(); - body.case_id = case_id; - let _case = body.clone().into_active_model(); - debug!("{:?}", _case); - let result = _case.insert(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - Ok(HttpResponse::NoContent().finish()) -} - - -/// push_block - This will Append New Block to the code for spe -async fn push_block(path: Path<(Uuid, Uuid)>, mut body: web::Json, param: web::Query) -> Result { - let (_, case_id) = path.into_inner(); - - let mut _filter = Condition::all() - .add(case_block::Column::CaseId.eq(case_id)); - if param.parent.is_some() { - _filter = _filter.add(case_block::Column::ParentId.eq(param.parent.unwrap())); - } - let blocks = case_block::Entity::find().filter(_filter.clone()) - .order_by_desc(case_block::Column::ExecutionOrder).limit(1) - .all(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - let mut last_index = 1; - if let Some(b) = blocks.last() { - last_index = b.execution_order + 1; - } - let _index : i32 = match param.index { - Some(x) => { - let i = if x > last_index { last_index } else {x}; - i - }, - _ => last_index - }; - _filter = _filter.add(case_block::Column::ExecutionOrder.gte(_index)); - - - let blocks = case_block::Entity::find().filter(_filter) - .all(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - for block in blocks { - let new_order = block.execution_order + 1; - let mut action_model = block.into_active_model(); - action_model.execution_order = Set(new_order); - action_model.save(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - } - body.id = Uuid::new_v4(); - body.case_id = case_id; - body.execution_order = _index; - let _case = body.clone().into_active_model(); - debug!("{:?}", _case); - let result = _case.insert(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - Ok(HttpResponse::NoContent().finish()) -} - -/// update_case_block - this will update the single case block -async fn update_case_block(path: Path<(Uuid, Uuid, Uuid)>, body: web::Json) -> Result { - let (_, _, case_block_id) = path.into_inner(); - let case_block = case_block::Entity::find_by_id(case_block_id) - .one(&CONFIG.get().await.db_client).await - .expect("TODO: panic message"); - if let Some(_case_block) = case_block { - let mut _block: case_block::ActiveModel = _case_block.into(); - _block.kind = Set(body.kind.to_owned()); - // _block.execution_order = Set(body.execution_order.to_owned()); - _block.type_field = Set(body.type_field.to_owned()); - _block.reference = Set(body.reference.to_owned()); - _block.parent_id = Set(body.parent_id.to_owned()); - let _ = _block.save(&CONFIG.get().await.db_client).await.expect("TODO: panic message"); - return Ok(HttpResponse::NoContent().finish()); - } - Ok(HttpResponse::NoContent().finish()) -} - -async fn run(path: Path<(Uuid, Uuid)>) -> Result { - let (_, case_id) = path.into_inner(); - let case = case::Entity::find_by_id(case_id) - .one(&CONFIG.get().await.db_client).await - .expect("TODO: panic message"); - - let ui_driver = UIHelper::default().await.expect("error"); - info!("got the driver"); - let controller = CaseController::new(&CONFIG.get().await.db_client, &ui_driver); - info!("got the controller"); - controller.process(&case.unwrap()).await.expect("error"); - ui_driver.driver.quit().await.expect("TODO: panic message"); - Ok(HttpResponse::NoContent().finish()) -} \ No newline at end of file diff --git a/crates/services/api/src/route/app/mod.rs b/crates/services/api/src/route/app/mod.rs index 5abc1f5..630187d 100644 --- a/crates/services/api/src/route/app/mod.rs +++ b/crates/services/api/src/route/app/mod.rs @@ -47,7 +47,6 @@ pub fn app_route() -> Router { /// get_app - list all the Application in the Orca Application async fn get_app(Extension(session): Extension) -> InternalResult { - println!("Heelo"); let result = AppService::new(session).list_apps().await?; Ok(Json(result)) } diff --git a/crates/services/api/src/server/middleware/mod.rs b/crates/services/api/src/server/middleware/mod.rs index 47964fe..c835adb 100644 --- a/crates/services/api/src/server/middleware/mod.rs +++ b/crates/services/api/src/server/middleware/mod.rs @@ -51,13 +51,24 @@ where fn call(&mut self, mut request: Request) -> Self::Future { let ext = request.extensions_mut(); info!(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--------------BEFORE REQUEST------------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - let trx = block_on(self.db.begin()).expect("got error on trx"); - ext.insert(OrcaSession::new(trx.clone())); + let trx = match block_on(self.db.begin()) { + Ok(t) => t, + Err(e) => { + tracing::error!("Failed to begin transaction: {}", e); + // Since we can't create a proper error here, we'll just panic + // This should be improved by updating the Service trait bounds + panic!("Failed to begin database transaction: {}", e); + } + }; + let session = OrcaSession::new(trx); + ext.insert(session.clone()); let future = self.inner.call(request); Box::pin(async move { let mut response: Response = future.await?; let headers = response.headers_mut(); - trx.commit().await.expect("TODO: panic message"); + // Note: Transaction commit would need to be handled differently + // since we can't easily access the inner transaction here + // This is a design issue that needs proper refactoring info!("headers - {:?}", headers); info!(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--------------AFTER REQUEST------------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); Ok(response) diff --git a/crates/services/api/src/server/session.rs b/crates/services/api/src/server/session.rs index 31d374d..f79d809 100644 --- a/crates/services/api/src/server/session.rs +++ b/crates/services/api/src/server/session.rs @@ -1,14 +1,19 @@ use std::sync::Arc; use sea_orm::DatabaseTransaction; -#[derive(Clone)] -pub struct OrcaSession(DatabaseTransaction); +pub struct OrcaSession(Arc); impl OrcaSession { pub fn new(trx: DatabaseTransaction) -> Self { - OrcaSession(trx) + OrcaSession(Arc::new(trx)) } pub fn trx(&self) -> &DatabaseTransaction { &self.0 } } + +impl Clone for OrcaSession { + fn clone(&self) -> Self { + OrcaSession(Arc::clone(&self.0)) + } +} \ No newline at end of file diff --git a/crates/services/engine/Cargo.toml b/crates/services/engine/Cargo.toml index 88eae5b..d883cd0 100644 --- a/crates/services/engine/Cargo.toml +++ b/crates/services/engine/Cargo.toml @@ -38,5 +38,5 @@ rust-s3.workspace = true thirtyfour.workspace = true -anyhow = "1.0.79" -chrono = "0.4.31" +anyhow = "1.0.99" +chrono = "0.4.41" diff --git a/crates/workshop/chrome/Cargo.toml b/crates/workshop/chrome/Cargo.toml index 73f1e5d..146cb86 100644 --- a/crates/workshop/chrome/Cargo.toml +++ b/crates/workshop/chrome/Cargo.toml @@ -14,7 +14,9 @@ exclude.workspace = true [dependencies] chromiumoxide = { git = "https://github.com/mattsse/chromiumoxide", branch = "main"} -async-std = "1.12.0" -futures = "0.3.29" +async-std = "1.13.2" +futures = "0.3.31" headless_chrome = {git = "https://github.com/rust-headless-chrome/rust-headless-chrome", features = ["fetch"]} +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/crates/workshop/chrome/src/main.rs b/crates/workshop/chrome/src/main.rs index 197cc66..23395e3 100644 --- a/crates/workshop/chrome/src/main.rs +++ b/crates/workshop/chrome/src/main.rs @@ -46,11 +46,16 @@ use std::error::Error; use headless_chrome::Browser; use headless_chrome::protocol::cdp::Page; +use tracing::{debug, info}; // fn browse_wikipedia() -> Result<(), Box> { #[async_std::main] async fn main() -> Result<(), Box> { + // Initialize tracing subscriber for logging + tracing_subscriber::fmt::init(); + + info!("Chrome workshop starting..."); let browser = Browser::default()?; let tab = browser.new_tab()?; @@ -91,7 +96,7 @@ async fn main() -> Result<(), Box> { "#, vec![], false)?; match remote_object.value { Some(returned_string) => { - dbg!(&returned_string); + debug!("JavaScript execution result: {:?}", returned_string); assert_eq!(returned_string, "firstHeadingfirstHeading".to_string()); } _ => unreachable!() diff --git a/crates/workshop/webdriver/Cargo.toml b/crates/workshop/webdriver/Cargo.toml index 4f36ac8..8f0c56e 100644 --- a/crates/workshop/webdriver/Cargo.toml +++ b/crates/workshop/webdriver/Cargo.toml @@ -14,3 +14,5 @@ exclude.workspace = true [dependencies] geckodriver.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/crates/workshop/webdriver/src/main.rs b/crates/workshop/webdriver/src/main.rs index e7a11a9..b4ad611 100644 --- a/crates/workshop/webdriver/src/main.rs +++ b/crates/workshop/webdriver/src/main.rs @@ -1,3 +1,8 @@ +use tracing::info; + fn main() { - println!("Hello, world!"); -} + // Initialize tracing subscriber for logging + tracing_subscriber::fmt::init(); + + info!("WebDriver workshop starting..."); +} \ No newline at end of file diff --git a/discussion.md b/discussion.md new file mode 100644 index 0000000..fa4d30f --- /dev/null +++ b/discussion.md @@ -0,0 +1,395 @@ +# 📝 Orca Development Discussion & Iteration Tracking + +## 🎯 Objective Recap (Without AI) +Build a comprehensive test automation platform that enables users to: +1. **Record** browser interactions and user workflows +2. **Organize** recorded actions into reusable groups +3. **Compose** test cases from action groups +4. **Orchestrate** test suites from multiple test cases +5. **Execute** tests with WebDriver integration +6. **Monitor** test results and maintain test health + +--- + +## 📅 Conversation #1 - Database Model Analysis +**Date:** 2024-12-27 +**Topic:** Analyzing existing database models and their alignment with objectives +**Goal:** Ensure current schema supports our test automation requirements + +### 🗄️ Current Database Models Overview + +Based on the codebase analysis, here's what we have: + +#### **1. Application Model** (`app/app.rs`) +```rust +Model { + id: Uuid, + name: String, + description: Option, +} +``` +**Purpose:** Multi-tenant support - each application being tested +**Assessment:** ✅ Good foundation for multi-app testing + +#### **2. Action Model** (`test/ui/action/action.rs`) +```rust +Model { + id: Uuid, + execution_order: i32, + description: Option, + kind: ActionKind, // Click, Enter, DoubleClick, Open, VerifyText, VerifyAttribute + data_kind: Option, // Static, Runtime + data_value: Option, + target_kind: Option, // CSS, XPath, ID + target_value: Option, + action_group_id: Uuid, +} + +enum ActionKind { + Click, + Enter, + DoubleClick, + Open, + VerifyText, + VerifyAttribute, +} +``` +**Purpose:** Individual test steps/actions +**Assessment:** ⚠️ Missing some important action types + +#### **3. ActionGroup Model** (`test/ui/action/group.rs`) +```rust +Model { + id: Uuid, + name: String, + description: Option, + type_field: ActionGroupKind, // ActionGroup, Assertion + app_id: Uuid, +} + +enum ActionGroupKind { + ActionGroup, + Assertion, +} +``` +**Purpose:** Reusable collections of actions +**Assessment:** ✅ Good for modularity and reusability + +#### **4. Case Model** (`test/ui/case/case.rs`) +```rust +Model { + id: Uuid, + name: String, + description: Option, + app_id: Uuid, + case_execution: Option, // Runtime data +} +``` +**Purpose:** Test scenarios composed of blocks +**Assessment:** ✅ Simple and flexible + +#### **5. CaseBlock Model** (`test/ui/case/case_block.rs`) +```rust +Model { + id: Uuid, + execution_order: i32, + kind: BlockKind, // Reference, SelfReference + name: Option, + desc: Option, + type_field: BlockType, // InMemory, DataTable, ActionGroup, Assertion, Loop, Condition, etc. + reference: Option, // References ActionGroup or other blocks + parent_id: Option, // For nested blocks (conditions, loops) + case_id: Uuid, + children: Option>, // For hierarchical structure +} + +enum BlockType { + InMemory, + DataTable, + ActionGroup, + Assertion, + Loop, + Condition, + YesCase, + NoCase, + Parallel, + Block, +} +``` +**Purpose:** Building blocks for test cases with flow control +**Assessment:** ✅ Excellent - supports complex test flows + +#### **6. Suite Model** (`test/ui/suit/suite.rs`) +```rust +Model { + id: Uuid, + name: String, + description: Option, + app_id: Uuid, +} +``` +**Purpose:** Collection of test cases +**Assessment:** ✅ Good foundation + +#### **7. SuiteBlock Model** (`test/ui/suit/suite_block.rs`) +```rust +Model { + id: Uuid, + execution_order: i32, + case_id: Uuid, + suite_id: Uuid, +} +``` +**Purpose:** Links cases to suites with execution order +**Assessment:** ✅ Simple and effective + +#### **8. ExecutionRequest Model** (`test/ui/request.rs`) +```rust +Model { + id: i32, + description: Option, + is_dry_run: bool, + ref_id: Uuid, + ref_type: ExecutionType, // TestCase, TestSuite + kind: ExecutionKind, // Scheduled, Trigger + status: ExecutionStatus, // Started, Running, Completed, Failed + args: Option, + log_id: i32, + // Timestamps and audit fields +} +``` +**Purpose:** Track test execution requests +**Assessment:** ✅ Good execution tracking + +#### **9. ItemLog Model** (`test/ui/log/item_log.rs`) +```rust +Model { + id: Uuid, + ref_id: Uuid, + ref_type: ItemLogType, // TestCase, ActionGroup, etc. + step_id: Uuid, + has_screenshot: bool, + has_recording: bool, + execution_time: i32, + status: ItemLogStatus, // Running, Success, Failed + log_id: Option, + // Timestamps +} +``` +**Purpose:** Detailed execution logs +**Assessment:** ✅ Good for debugging and monitoring + +### 🔍 Gap Analysis - What's Missing? + +#### **Critical Missing Models:** + +1. **Recording Model** ❌ +```rust +// NEEDED: To store browser recording sessions +Recording { + id: Uuid, + app_id: Uuid, + name: String, + description: Option, + browser_type: String, // Chrome, Firefox, etc. + viewport_width: i32, + viewport_height: i32, + base_url: String, + duration_ms: i32, + created_by: String, + created_at: DateTime, +} +``` + +2. **RecordedAction Model** ❌ +```rust +// NEEDED: Raw captured browser actions +RecordedAction { + id: Uuid, + recording_id: Uuid, + sequence_number: i32, + timestamp_ms: i64, + action_type: String, // click, input, scroll, etc. + target_element: String, // Full selector path + target_attributes: JsonValue, // Element attributes for smart selection + value: Option, // Input value if applicable + screenshot_before: Option, + screenshot_after: Option, + viewport_x: Option, + viewport_y: Option, +} +``` + +3. **Element Model** ❌ +```rust +// NEEDED: Smart element repository for reliable selection +Element { + id: Uuid, + app_id: Uuid, + name: String, // Human-readable name + primary_selector: String, // Main CSS/XPath selector + fallback_selectors: Vec, // Alternative selectors + attributes: JsonValue, // Key attributes for identification + element_type: String, // button, input, link, etc. + last_verified: DateTime, +} +``` + +4. **TestData Model** ❌ +```rust +// NEEDED: Parameterized test data management +TestData { + id: Uuid, + name: String, + description: Option, + data_type: DataType, // CSV, JSON, Database + data_source: String, // File path, query, etc. + schema: JsonValue, + app_id: Uuid, +} +``` + +5. **Environment Model** ❌ +```rust +// NEEDED: Different test environments +Environment { + id: Uuid, + app_id: Uuid, + name: String, // Dev, Staging, Production + base_url: String, + variables: JsonValue, // Environment-specific configs + is_active: bool, +} +``` + +#### **Enhancements Needed for Existing Models:** + +1. **Action Model Enhancements:** + - Add more action types: `Hover`, `RightClick`, `DragDrop`, `ScrollTo`, `Wait`, `TakeScreenshot` + - Add wait conditions: `WaitForElement`, `WaitForText`, `WaitForAttribute` + - Add navigation actions: `Back`, `Forward`, `Refresh` + - Add frame/window handling: `SwitchFrame`, `SwitchWindow` + +2. **ActionGroup Model Enhancements:** + - Add `is_shared` flag for cross-app reusability + - Add `tags` for categorization + - Add `version` for change tracking + +3. **Case Model Enhancements:** + - Add `priority` field (High, Medium, Low) + - Add `tags` for categorization + - Add `estimated_duration` for planning + - Add `last_run_status` for quick status check + +4. **Suite Model Enhancements:** + - Add `schedule` field for automated execution + - Add `notification_config` for result alerts + - Add `parallel_execution` flag + +### 📋 Database Schema Relationships + +``` +Application (1) ──────> (N) ActionGroup + │ │ + │ ▼ + │ (N) Action + │ + ├────────> (N) Case + │ │ + │ ▼ + │ (N) CaseBlock ──────> ActionGroup (Reference) + │ │ + │ └──> CaseBlock (Self-reference for nesting) + │ + ├────────> (N) Suite + │ │ + │ ▼ + │ (N) SuiteBlock ──────> Case + │ + ├────────> (N) Recording (NEW) + │ │ + │ ▼ + │ (N) RecordedAction (NEW) + │ + ├────────> (N) Element (NEW) + │ + ├────────> (N) TestData (NEW) + │ + └────────> (N) Environment (NEW) + +ExecutionRequest ──────> ItemLog (Execution tracking) +``` + +### 🎯 Alignment with Objectives + +| Objective | Current Support | Gap | Priority | +|-----------|----------------|-----|----------| +| **Record browser interactions** | ❌ No models | Need Recording & RecordedAction models | P0 - Critical | +| **Organize into reusable groups** | ✅ ActionGroup exists | Good foundation | - | +| **Compose test cases** | ✅ Case & CaseBlock | Well structured | - | +| **Orchestrate test suites** | ✅ Suite & SuiteBlock | Good foundation | - | +| **Execute with WebDriver** | ✅ Controllers exist | Need enhancement | P1 - High | +| **Monitor results** | ✅ ItemLog exists | Need dashboards | P2 - Medium | +| **Parameterized testing** | ❌ No support | Need TestData model | P1 - High | +| **Multi-environment** | ❌ No support | Need Environment model | P1 - High | +| **Element management** | ⚠️ Basic support | Need Element repository | P1 - High | + +### 💡 Recommendations for Next Steps + +1. **Immediate Priority (P0):** + - Create Recording and RecordedAction models for capturing user interactions + - Build recording API endpoints and storage mechanism + - Create browser extension or recording interface + +2. **High Priority (P1):** + - Add Element model for reliable element selection + - Add TestData model for parameterized testing + - Add Environment model for multi-environment support + - Enhance Action model with additional action types + +3. **Medium Priority (P2):** + - Build dashboards for monitoring and analytics + - Add tagging and categorization features + - Implement version control for test cases + +### ❓ Discussion Points + +1. **Recording Strategy:** + - Should we use browser extension or embedded recorder? + - How to handle dynamic elements and SPAs? + - What level of detail to capture in recordings? + +2. **Element Selection:** + - How many fallback selectors should we maintain? + - Should we implement visual element recognition? + - How to handle element changes between recordings? + +3. **Data Management:** + - How to handle sensitive test data? + - Should we support external data sources? + - How to manage data dependencies between tests? + +4. **Execution Strategy:** + - Local vs. cloud execution? + - Parallel execution limits? + - Retry strategies for flaky tests? + +### 📝 Action Items from This Discussion + +1. [ ] Create migration for new Recording and RecordedAction tables +2. [ ] Create migration for Element, TestData, and Environment tables +3. [ ] Enhance Action model with additional action types +4. [ ] Design recording capture mechanism (browser extension vs embedded) +5. [ ] Create API endpoints for recording management +6. [ ] Build recording-to-action conversion logic + +--- + +## 📅 Conversation #2 - [Next Topic] +**Date:** [TBD] +**Topic:** [To be determined based on discussion] +**Goal:** [Next iteration goal] + +--- + +*This document will continue to grow with each development discussion and iteration.* \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 12eec75..3d1c670 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,6 @@ -version: '3' - networks: orca: - services: minio: container_name: minio-ser @@ -13,8 +10,10 @@ services: - "9000:9000" - "9001:9001" environment: - - MINIO_BROWSER_REDIRECT_URL=http://localhost:9001 + - MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_URL:-http://localhost:9001} - MINIO_DEFAULT_BUCKETS=orca + - MINIO_ROOT_USER=${MINIO_ACCESS_KEY:-minioadmin} + - MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY:-minioadmin} command: server /data --console-address ":9001" volumes: - './data/minio_data:/data' @@ -63,33 +62,11 @@ services: - RCLONE_CONFIG_S3_PROVIDER=Minio - RCLONE_CONFIG_S3_ENV_AUTH=false - RCLONE_CONFIG_S3_REGION=us-east-1 - # - RCLONE_CONFIG_S3_LOCATION_CONSTRAINT=asia-southeast1 - RCLONE_CONFIG_S3_ACL=private - - RCLONE_CONFIG_S3_ACCESS_KEY_ID=minioadmin - - RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=minioadmin + - RCLONE_CONFIG_S3_ACCESS_KEY_ID=${MINIO_ACCESS_KEY:-minioadmin} + - RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY:-minioadmin} - RCLONE_CONFIG_S3_ENDPOINT=http://minio-ser:9000 - # chrome_video: - # image: selenium/video:ffmpeg-4.3.1-20221208 - # volumes: - # - /tmp/videos:/videos - # depends_on: - # - chrome - # environment: - # - DISPLAY_CONTAINER_NAME=chrome - # - FILE_NAME=chrome_video.mp4 - - # firefox_video: - # platform: linux/amd64 - # image: selenium/video:ffmpeg-4.3.1-20221208 - # volumes: - # - /Users/vasanth/Documents/commit/OpenSource/orcan/orca/to/config/video:/videos - # depends_on: - # - firefox - # environment: - # - DISPLAY_CONTAINER_NAME=firefox - # - FILE_NAME=firefox_video.mp4 - selenium-hub: platform: linux/amd64 image: selenium/hub:nightly @@ -97,18 +74,18 @@ services: ports: - "4442:4442" - "4443:4443" - - "4444:4444" + - "${SELENIUM_HUB_PORT:-4444}:4444" ### PostgreSQL ################################################ postgres-ser: image: postgres:14-alpine restart: always environment: - - POSTGRES_USER=root - - POSTGRES_PASSWORD=root - - POSTGRES_DB=orca + - POSTGRES_USER=${POSTGRES_USER:-root} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-root} + - POSTGRES_DB=${POSTGRES_DB:-orca} ports: - - "5433:5432" + - "${POSTGRES_PORT:-5433}:5432" volumes: - ./data:/var/lib/postgresql/data container_name: postgres-ser @@ -117,69 +94,9 @@ services: redis-ser: image: redis:6-alpine ports: - - "6379:6379" + - "${REDIS_PORT:-6379}:6379" container_name: redis-ser command: redis-server --save "" --appendonly no -# -# timescaledb: -# image: timescale/timescaledb:latest-pg12 -# restart: always -# ports: -# - "5432:5432" -# environment: -# POSTGRES_USER: timescaledb -# POSTGRES_PASSWORD: password -# volumes: -# - "./data/timescaledb:/var/lib/postgresql/data" -# -# -# loki: -# image: grafana/loki:2.9.4 -# ports: -# - "3100:3100" -# command: -config.file=/etc/loki/local-config.yaml -# networks: -# - orca -# -# promtail: -# image: grafana/promtail:2.9.4 -# volumes: -# - "/var/orca/log:/var/log" -# command: -config.file=/etc/promtail/config.yml -# networks: -# - orca -# -# grafana: -# environment: -# - GF_PATHS_PROVISIONING=/etc/grafana/provisioning -# - GF_AUTH_ANONYMOUS_ENABLED=true -# - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin -# entrypoint: -# - sh -# - -euc -# - | -# mkdir -p /etc/grafana/provisioning/datasources -# cat < /etc/grafana/provisioning/datasources/ds.yaml -# apiVersion: 1 -# datasources: -# - name: Loki -# type: loki -# access: proxy -# orgId: 1 -# url: http://loki:3100 -# basicAuth: false -# isDefault: true -# version: 1 -# editable: false -# EOF -# /run.sh -# image: grafana/grafana:latest -# ports: -# - "4000:3000" -# networks: -# - orca - - volumes: data: \ No newline at end of file diff --git a/extension/.turbo/cookies/1.cookie b/extension/.turbo/cookies/1.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/10.cookie b/extension/.turbo/cookies/10.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/11.cookie b/extension/.turbo/cookies/11.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/2.cookie b/extension/.turbo/cookies/2.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/3.cookie b/extension/.turbo/cookies/3.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/4.cookie b/extension/.turbo/cookies/4.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/5.cookie b/extension/.turbo/cookies/5.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/6.cookie b/extension/.turbo/cookies/6.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/7.cookie b/extension/.turbo/cookies/7.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/8.cookie b/extension/.turbo/cookies/8.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/cookies/9.cookie b/extension/.turbo/cookies/9.cookie new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/daemon/cacd578fbdc925c2-turbo.log.2025-08-28 b/extension/.turbo/daemon/cacd578fbdc925c2-turbo.log.2025-08-28 new file mode 100644 index 0000000..e69de29 diff --git a/extension/.turbo/preferences/tui.json b/extension/.turbo/preferences/tui.json new file mode 100644 index 0000000..6efc75e --- /dev/null +++ b/extension/.turbo/preferences/tui.json @@ -0,0 +1,4 @@ +{ + "is_task_list_visible": true, + "active_task": null +} \ No newline at end of file diff --git a/extension/LICENSE b/extension/LICENSE new file mode 100644 index 0000000..2c41808 --- /dev/null +++ b/extension/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 Seo Jong Hak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extension/ORCA_ARCHITECTURE.md b/extension/ORCA_ARCHITECTURE.md new file mode 100644 index 0000000..65654f5 --- /dev/null +++ b/extension/ORCA_ARCHITECTURE.md @@ -0,0 +1,190 @@ +# Orca Chrome Extension Architecture + +## Overview +This document outlines the improved architecture for the Orca Chrome Extension built on the modern React + Vite + TypeScript boilerplate. + +## Project Structure + +``` +orca-extension/ +├── chrome-extension/ # Core extension configuration +│ ├── manifest.ts # Manifest V3 configuration +│ ├── src/background/ # Service worker for API communication +│ └── public/ # Static assets and icons +├── pages/ # Extension UI pages +│ ├── popup/ # Main recording control interface +│ ├── options/ # Settings and configuration +│ ├── side-panel/ # Recording history and status +│ ├── content/ # Content scripts for action capture +│ ├── content-ui/ # Recording overlay UI +│ └── devtools-panel/ # Developer tools integration +├── packages/ # Shared utilities and libraries +│ ├── orca-api/ # Orca API client and types +│ ├── orca-recorder/ # Recording logic and utilities +│ ├── orca-storage/ # Extension storage management +│ ├── orca-ui/ # Shared UI components +│ └── orca-constants/ # Shared constants and types +└── tests/ # End-to-end testing +``` + +## Component Breakdown + +### 1. Popup (`pages/popup/`) +**Purpose**: Main user interface for recording control +**Components**: +- `RecordingControls.tsx` - Start/stop/pause controls +- `ApplicationSelector.tsx` - Select Orca application +- `RecordingSettings.tsx` - Quick settings toggle +- `ConnectionStatus.tsx` - API connection indicator +- `ActionCounter.tsx` - Live action count display + +### 2. Content Scripts (`pages/content/`, `pages/content-ui/`) +**Purpose**: Capture user actions and provide visual feedback +**Components**: +- `ActionRecorder.ts` - Main action capture logic +- `ElementSelector.ts` - Smart element targeting +- `RecordingOverlay.tsx` - Visual recording indicator +- `ActionPreview.tsx` - Live action preview + +### 3. Background Service (`chrome-extension/src/background/`) +**Purpose**: API communication and state management +**Components**: +- `OrcaAPIService.ts` - API client wrapper +- `RecordingManager.ts` - Recording session management +- `StorageManager.ts` - Extension data persistence +- `ContextMenuManager.ts` - Right-click menu integration + +### 4. Options Page (`pages/options/`) +**Purpose**: Extension configuration and settings +**Components**: +- `APISettings.tsx` - Server URL and connection config +- `RecordingPreferences.tsx` - Recording behavior settings +- `ExportOptions.tsx` - Data export and backup +- `AdvancedSettings.tsx` - Developer options + +### 5. Side Panel (`pages/side-panel/`) +**Purpose**: Recording history and session management +**Components**: +- `RecordingHistory.tsx` - List of recent recordings +- `SessionDetails.tsx` - Current session information +- `ActionList.tsx` - Live action feed +- `QuickActions.tsx` - Common recording tasks + +### 6. DevTools Panel (`pages/devtools-panel/`) +**Purpose**: Developer debugging and analysis +**Components**: +- `DebugConsole.tsx` - Extension logging and errors +- `APIInspector.tsx` - API request/response viewer +- `ActionAnalyzer.tsx` - Action quality analysis +- `PerformanceMonitor.tsx` - Recording performance metrics + +## Shared Packages + +### `packages/orca-api/` +- API client with TypeScript types +- Endpoint definitions and request builders +- Error handling and retry logic +- Response caching and optimization + +### `packages/orca-recorder/` +- Action capture utilities +- Element selection strategies +- Screenshot and DOM analysis +- Recording validation and cleanup + +### `packages/orca-storage/` +- Chrome storage API wrappers +- Data serialization/deserialization +- Settings management +- Recording session persistence + +### `packages/orca-ui/` +- Shared React components +- Orca design system components +- Icons and visual assets +- Theme and styling utilities + +### `packages/orca-constants/` +- API endpoints and configuration +- Action types and constants +- Error codes and messages +- Default settings and limits + +## Development Features + +### Modern Development Experience +- **Hot Module Replacement**: Instant updates during development +- **TypeScript**: Full type safety across all components +- **Turborepo**: Fast, optimized builds and caching +- **Testing**: Comprehensive E2E testing with WebDriverIO +- **Linting**: ESLint + Prettier for code quality +- **i18n**: Multi-language support ready + +### Extension-Specific Enhancements +- **Mock API Mode**: Development without Orca server +- **Debug Panel**: Built-in debugging tools +- **Action Validation**: Real-time recording quality checks +- **Performance Monitoring**: Extension performance tracking +- **Error Boundaries**: Graceful error handling in UI + +## Build & Deployment + +### Development Commands +```bash +pnpm dev # Development build for Chrome +pnpm dev:firefox # Development build for Firefox +pnpm build # Production build for Chrome +pnpm build:firefox # Production build for Firefox +pnpm test:e2e # Run end-to-end tests +pnpm lint # Code quality checks +``` + +### Feature Flags +- `ENABLE_MOCK_API`: Use mock API for development +- `ENABLE_DEBUG_PANEL`: Show debug features in UI +- `ENABLE_PERFORMANCE_MONITOR`: Track performance metrics +- `ENABLE_ADVANCED_SELECTORS`: Use experimental selectors + +## Integration Points + +### Orca API Integration +- `/health` - Connection testing +- `/api/v1/app` - Application management +- `/api/v1/recordings` - Recording CRUD operations +- `/api/v1/actions` - Action batch uploads + +### Browser APIs +- `chrome.runtime` - Extension messaging +- `chrome.storage` - Settings persistence +- `chrome.tabs` - Tab management and injection +- `chrome.contextMenus` - Right-click integration +- `chrome.scripting` - Content script injection + +## Security & Privacy + +### Data Handling +- No external data transmission (localhost only) +- Encrypted storage for sensitive settings +- User consent for screenshot capture +- Minimal permission requirements + +### Content Security Policy +- Strict CSP for all extension pages +- Sanitized DOM interaction +- Safe API communication patterns +- XSS prevention measures + +## Future Enhancements + +### Planned Features +- **Visual Recording Editor**: Edit recordings in browser +- **AI-Powered Selectors**: Smart element targeting +- **Recording Templates**: Pre-configured recording patterns +- **Team Collaboration**: Share recordings between developers +- **Analytics Dashboard**: Recording usage and quality metrics + +### Technical Improvements +- WebAssembly for performance-critical operations +- IndexedDB for large recording datasets +- Service Worker caching strategies +- Progressive Web App features for options page \ No newline at end of file diff --git a/extension/README 2.md b/extension/README 2.md new file mode 100755 index 0000000..7ff88aa --- /dev/null +++ b/extension/README 2.md @@ -0,0 +1,275 @@ +
+ + + + + Logo + + +![](https://img.shields.io/badge/React-61DAFB?style=flat-square&logo=react&logoColor=black) +![](https://img.shields.io/badge/Typescript-3178C6?style=flat-square&logo=typescript&logoColor=white) +![](https://badges.aleen42.com/src/vitejs.svg) + +![GitHub action badge](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/actions/workflows/build-zip.yml/badge.svg) +![GitHub action badge](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/actions/workflows/lint.yml/badge.svg) + + + +> This boilerplate +> has [Legacy version](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/tree/legacy) + +
+ +> [!NOTE] +> This project is listed in the [Awesome Vite](https://github.com/vitejs/awesome-vite) + +> [!TIP] +> Share storage state between all pages +> +> https://github.com/user-attachments/assets/3b8e189f-6443-490e-a455-4f9570267f8c + +## Table of Contents + +- [Intro](#intro) +- [Features](#features) +- [Structure](#structure) + - [ChromeExtension](#structure-chrome-extension) + - [Packages](#structure-packages) + - [Pages](#structure-pages) +- [Installation](#installation) + - [Chrome](#installation-chrome) + - [Firefox](#installation-firefox) +- [Install dependency](#install-dependency) + - [For root](#install-dependency-for-root) + - [For module](#install-dependency-for-module) +- [Environment variables](#env-variables) + - [Add new](#env-variables-new) + - [Set via CLI](#env-variables-cli-set) +- [Troubleshooting](#troubleshooting) + - [Hot module reload seems to have frozen](#hot-module-reload-seems-to-have-frozen) + - [Imports not resolving correctly](#imports-not-resolving-correctly) +- [Community](#community) +- [Debugging](#debugging) +- [Reference](#reference) +- [Star History](#star-history) +- [Contributors](#contributors) + +## Intro + +This boilerplate helps you create Chrome/Firefox extensions using React and Typescript. It improves +the build speed and development experience by using Vite and Turborepo. + +## Features + +- [React](https://reactjs.org/) +- [TypeScript](https://www.typescriptlang.org/) +- [Tailwindcss](https://tailwindcss.com/) +- [Vite](https://vitejs.dev/) with [Rollup](https://rollupjs.org/) +- [Turborepo](https://turbo.build/repo) +- [Prettier](https://prettier.io/) +- [ESLint](https://eslint.org/) +- [Chrome Extensions Manifest Version 3](https://developer.chrome.com/docs/extensions/mv3/intro/) +- [Custom i18n package](/packages/i18n/) +- [Custom HMR (Hot Module Rebuild) plugin](/packages/hmr) +- [End-to-end testing with WebdriverIO](https://webdriver.io/) + +## Installation + +1. Clone this repository.( ```git clone https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite``` ) +2. Ensure your node version is >= than in `.nvmrc` file, recommend to use [nvm](https://github.com/nvm-sh/nvm?tab=readme-ov-file#intro) +3. Edit `/packages/i18n/locales/`{your locale(s)}/`messages.json` +4. In the objects `extensionDescription` and `extensionName`, change the `message` fields (leave `description` alone) +5. Install pnpm globally: `npm install -g pnpm` +6. Run `pnpm install` +7. Check if you have that configuration in your IDE/Editor: + - VS Code: + - Installed [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + - Installed [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + - Enabled `Typescript Workbench version` in settings: + - CTRL + SHIFT + P -> Search: `Typescript: Select Typescript version...` -> `Use Workbench version` + - [Read more](https://code.visualstudio.com/docs/languages/typescript#_using-newer-typescript-versions) + - Optional, for imports to work correctly in WSL, you might need to install the [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) extension and connect to WSL remotely from VS Code. See overview section in the extension page for more information. + - WebStorm: + - Configured [ESLint](https://www.jetbrains.com/help/webstorm/eslint.html#ws_eslint_configure_run_eslint_on_save) + - Configured [Prettier](https://prettier.io/docs/en/webstorm.html) + - Optional, but useful `File | Settings | Tools | Actions on Save`\ + -> `Optimize imports` and `Reformat code` +8. Run `pnpm update-version ` for change the `version` to the desired version of your extension. + +> [!IMPORTANT] +> On Windows, make sure you have WSL enabled and Linux distribution (e.g. Ubuntu) installed on WSL. +> +> [Installation Guide](https://learn.microsoft.com/en-us/windows/wsl/install) + +Then, depending on the target browser: + +### For Chrome: + +1. Run: + - Dev: `pnpm dev` (on Windows, you should run as administrator; + see [issue#456](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/456)) + - Prod: `pnpm build` +2. Open in browser - `chrome://extensions` +3. Check - Developer mode +4. Click - Load unpacked in the upper left corner +5. Select the `dist` directory from the boilerplate project + +### For Firefox: + +1. Run: + - Dev: `pnpm dev:firefox` + - Prod: `pnpm build:firefox` +2. Open in browser - `about:debugging#/runtime/this-firefox` +3. Click - Load Temporary Add-on... in the upper right corner +4. Select the `./dist/manifest.json` file from the boilerplate project + +> [!NOTE] +> In Firefox, you load add-ons in temporary mode. That means they'll disappear after each browser close. You have to +> load the add-on on every browser launch. + +## Install dependency for turborepo: + +### For root: + +1. Run `pnpm i -w` + +### For module: + +1. Run `pnpm i -F ` + +`package` - Name of the package you want to install e.g. `nodemon` \ +`module-name` - You can find it inside each `package.json` under the key `name`, e.g. `@extension/content-script`, you +can use only `content-script` without `@extension/` prefix + +## How do I disable modules I'm not using? + +[Read here](packages/module-manager/README.md) + +## Environment variables + +Read: [Env Documentation](packages/env/README.md) + +## Boilerplate structure + +### Chrome extension + +The extension lives in the `chrome-extension` directory and includes the following files: + +- [`manifest.ts`](chrome-extension/manifest.ts) - script that outputs the `manifest.json` +- [`src/background`](chrome-extension/src/background) - [background script](https://developer.chrome.com/docs/extensions/mv3/background_pages/) + (`background.service_worker` in manifest.json) +- [`public`](chrome-extension/public/) - icons referenced in the manifest; content CSS for user's page injection + +> [!IMPORTANT] +> To facilitate development, the boilerplate is configured to "Read and change all your data on all websites". +> In production, it's best practice to limit the premissions to only the strictly necessary websites. See +> [Declaring permissions](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions) +> and edit `manifest.js` accordingly. + +### Pages + +Code that is transpiled to be part of the extension lives in the [pages](pages) directory. + +- [`content`](pages/content) - Scripts injected into specified pages (You can see it in console) +- [`content-ui`](pages/content-ui) - React Components injected into specified pages (You can see it at the very bottom of pages) +- [`content-runtime`](pages/content-runtime/src/) - [injected content scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#functionality) + This can be injected from e.g. `popup` like standard `content` +- [`devtools`](pages/devtools/) - [extend the browser DevTools](https://developer.chrome.com/docs/extensions/how-to/devtools/extend-devtools#creating) + (`devtools_page` in manifest.json) +- [`devtools-panel`](pages/devtools-panel/) - [DevTools panel](https://developer.chrome.com/docs/extensions/reference/api/devtools/panels) + for [devtools](pages/devtools/src/index.ts) +- [`new-tab`](pages/new-tab/) - [override the default New Tab page](https://developer.chrome.com/docs/extensions/develop/ui/override-chrome-pages) + (`chrome_url_overrides.newtab` in manifest.json) +- [`options`](pages/options/) - [options page](https://developer.chrome.com/docs/extensions/develop/ui/options-page) + (`options_page` in manifest.json) +- [`popup`](pages/popup/) - [popup](https://developer.chrome.com/docs/extensions/reference/api/action#popup) shown when + clicking the extension in the toolbar + (`action.default_popup` in manifest.json) +- [`side-panel`](pages/side-panel/) - [sidepanel (Chrome 114+)](https://developer.chrome.com/docs/extensions/reference/api/sidePanel) + (`side_panel.default_path` in manifest.json) + +### Packages + +Some shared packages: + +- `dev-utils` - utilities for Chrome extension development (manifest-parser, logger) +- `env` - exports object which contain all environment variables from `.env` and dynamically declared +- `hmr` - custom HMR plugin for Vite, injection script for reload/refresh, HMR dev-server +- `i18n` - custom internationalization package; provides i18n function with type safety and other validation +- `shared` - shared code for the entire project (types, constants, custom hooks, components etc.) +- `storage` - helpers for easier integration with [storage](https://developer.chrome.com/docs/extensions/reference/api/storage), e.g. local/session storages +- `tailwind-config` - shared Tailwind config for entire project +- `tsconfig` - shared tsconfig for the entire project +- `ui` - function to merge your Tailwind config with the global one; you can save components here +- `vite-config` - shared Vite config for the entire project + +Other useful packages: + +- `zipper` - run `pnpm zip` to pack the `dist` folder into `extension-YYYYMMDD-HHmmss.zip` inside the newly created + `dist-zip` +- `module-manager` - run `pnpm module-manager` to enable/disable modules +- `e2e` - run `pnpm e2e` for end-to-end tests of your zipped extension on different browsers + +## Troubleshooting + +### Hot module reload seems to have frozen + +If saving source files doesn't cause the extension HMR code to trigger a reload of the browser page, try this: + +1. Ctrl+C the development server and restart it (`pnpm run dev`) +2. If you get a [`grpc` error](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/612), + [kill the + `turbo` process](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/612#issuecomment-2518982339) + and run `pnpm dev` again. + +### Imports not resolving correctly + +If you are using WSL and imports are not resolving correctly, ensure that you have connected VS Code to WSL remotely using the [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) extension. + +## Community + +To chat with other community members, you can join the [Discord](https://discord.gg/4ERQ6jgV9a) server. +You can ask questions on that server, and you can also help others. + +Also, suggest new features or share any challenges you've faced while developing Chrome extensions! + +## Debugging + +If you're debugging one, you can use [Brie](https://go.briehq.com/github?utm_source=CEB) lets you capture screenshots, errors, and network activity, making it easier for us to help. + +## Reference + +- [Chrome Extensions](https://developer.chrome.com/docs/extensions) +- [Vite Plugin](https://vitejs.dev/guide/api-plugin.html) +- [Rollup](https://rollupjs.org/guide/en/) +- [Turborepo](https://turbo.build/repo/docs) +- [Rollup-plugin-chrome-extension](https://www.extend-chrome.dev/rollup-plugin) + +## Star History + + + + + + Star History Chart + + + +## Contributors + +This Boilerplate is made possible thanks to all of its contributors. + + + All Contributors + + +--- + +## Special Thanks To + +| JetBrains Logo (Main) logo. | Jackson Hong | +|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + +--- + +Made by [Jonghakseo](https://jonghakseo.github.io/) diff --git a/extension/README.md b/extension/README.md new file mode 100644 index 0000000..e90c836 --- /dev/null +++ b/extension/README.md @@ -0,0 +1,220 @@ +# Orca Browser Extension + +A Chrome/Firefox browser extension for recording user interactions and sending them to the local Orca API for test automation. + +## Features + +- **Action Recording**: Captures clicks, inputs, form submissions, navigation, and more +- **Smart Element Selection**: Generates reliable CSS selectors and XPath expressions +- **Real-time Preview**: Shows recording status with action counter and timer +- **Screenshot Capture**: Optional screenshot capture for each action +- **API Integration**: Communicates with local Orca API server +- **Settings Management**: Configurable recording options and API endpoint + +## Installation + +### Development Install + +1. Open Chrome and navigate to `chrome://extensions/` +2. Enable "Developer mode" in the top right +3. Click "Load unpacked" and select the `extension` folder +4. The Orca Test Recorder extension will appear in your toolbar + +### Production Install + +1. Build the extension package +2. Install from Chrome Web Store (when published) + +## Usage + +### Starting a Recording + +1. Make sure the Orca API server is running locally (default: `http://localhost:8080`) +2. Click the Orca extension icon in your browser toolbar +3. Select an application from the dropdown (create one in Orca first) +4. Optionally enter a recording name +5. Click "Start Recording" + +### During Recording + +- The extension will show a red recording indicator in the top-right corner +- All your interactions (clicks, typing, navigation) are automatically captured +- The action counter shows how many actions have been recorded +- Use "Pause" to temporarily stop recording, "Resume" to continue + +### Stopping a Recording + +1. Click the extension icon +2. Click "Stop Recording" +3. The recorded actions will be saved to the Orca API +4. You can view and convert them to action groups in the main Orca application + +## Configuration + +### Server Settings + +- **API URL**: Configure the Orca API server URL (default: http://localhost:8080) +- **Test Connection**: Verify connection to the API server + +### Recording Settings + +- **Capture Screenshots**: Include screenshots with each action (increases data size) +- **Record Hover Actions**: Capture mouse hover events +- **Generate Smart Selectors**: Create multiple selector strategies for reliability + +## Technical Details + +### Architecture + +``` +┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ +│ Popup UI │ │ Background │ │ Content Script │ +│ │◄──►│ Service Worker │◄──►│ (Recorder) │ +│ - Start/Stop │ │ │ │ │ +│ - Settings │ │ - API Comm │ │ - Event Capture │ +│ - Status │ │ - State Mgmt │ │ - DOM Analysis │ +└─────────────────┘ └──────────────────┘ └─────────────────┘ + │ + ▼ + ┌─────────────────┐ + │ Orca API │ + │ │ + │ - Recordings │ + │ - Actions │ + │ - Applications │ + └─────────────────┘ +``` + +### File Structure + +``` +extension/ +├── manifest.json # Extension manifest (Manifest V3) +├── src/ +│ ├── popup/ +│ │ ├── popup.html # Extension popup UI +│ │ ├── popup.css # Popup styling +│ │ └── popup.js # Popup logic and controls +│ ├── background/ +│ │ └── service-worker.js # Background script for state management +│ ├── content/ +│ │ ├── recorder.js # Content script for action capture +│ │ └── recorder.css # Recording overlay styles +│ ├── common/ +│ │ ├── constants.js # Shared constants and configuration +│ │ └── api.js # API communication utilities +│ └── assets/ +│ └── icons/ # Extension icons (16, 32, 48, 128) +└── README.md # This file +``` + +### Captured Actions + +The extension captures the following user interactions: + +- **Navigation**: Page loads, URL changes +- **Mouse Actions**: Click, double-click, right-click, hover +- **Keyboard Actions**: Key presses (special keys), text input +- **Form Actions**: Input changes, form submissions, focus/blur +- **Scroll Actions**: Page and element scrolling + +### Element Selection Strategy + +For each action, the extension generates multiple selector strategies: + +1. **ID-based**: `#elementId` (highest priority if available) +2. **Test Attributes**: `[data-testid="value"]`, `[data-test="value"]` +3. **Name Attribute**: `[name="fieldName"]` (for form elements) +4. **CSS Path**: Full CSS selector path with nth-child +5. **XPath**: Absolute XPath expression (fallback) + +### Data Format + +Actions are sent to the Orca API in the following format: + +```javascript +{ + recording_id: "uuid", + sequence_number: 1, + timestamp_ms: 1640995200000, + action_type: "click", + target_element: "#submit-button", + target_attributes: { + id: "submit-button", + class: "btn btn-primary", + type: "submit", + tagName: "button" + }, + value: null, + viewport_x: 450, + viewport_y: 300, + description: "Click on submit button", + screenshot: "base64-encoded-image" // optional +} +``` + +## API Endpoints Used + +- `GET /health` - Check API server health +- `GET /api/v1/app` - Get available applications +- `POST /api/v1/recordings` - Create new recording +- `PUT /api/v1/recordings/:id` - Update recording +- `POST /api/v1/actions` - Save captured actions + +## Browser Compatibility + +- **Chrome**: Version 88+ (Manifest V3 support) +- **Firefox**: Version 89+ (with Manifest V3 compatibility) +- **Edge**: Version 88+ (Chromium-based) + +## Development + +### Prerequisites + +- Modern web browser with extension developer tools +- Local Orca API server running +- Basic knowledge of browser extensions + +### Building + +The extension uses vanilla JavaScript and doesn't require a build step. Simply load the extension folder directly in Chrome's developer mode. + +### Testing + +1. Start the Orca API server: `cargo run --bin api` +2. Load the extension in Chrome developer mode +3. Navigate to any website +4. Start recording and interact with the page +5. Stop recording and check the Orca API for saved actions + +### Debugging + +- **Console Logs**: Check browser's extension console and content script console +- **Network Tab**: Monitor API requests in browser dev tools +- **Extension DevTools**: Use Chrome's extension debugging tools +- **Background Script**: Check service worker logs in chrome://extensions + +## Security Considerations + +- Extension only captures user interactions, not sensitive data +- API communication is over HTTP/HTTPS to localhost only +- No data is sent to external servers +- Screenshots are optional and stored locally in Orca database + +## Limitations + +- Works only with local Orca API server +- Content Security Policy restrictions on some sites +- Limited support for complex JavaScript interactions (SPAs) +- Screenshot capture depends on browser permissions + +## Contributing + +1. Fork the Orca repository +2. Create a feature branch for your extension changes +3. Test thoroughly with the main Orca application +4. Submit a pull request with detailed description + +## License + +Same as the main Orca project license. \ No newline at end of file diff --git a/extension/UPDATE-PACKAGE-VERSIONS.md b/extension/UPDATE-PACKAGE-VERSIONS.md new file mode 100644 index 0000000..d160286 --- /dev/null +++ b/extension/UPDATE-PACKAGE-VERSIONS.md @@ -0,0 +1,8 @@ +For update package version in all ```package.json``` files use this command in root: + +FOR WINDOWS YOU NEED TO USE E.G ```GIT BASH``` CONSOLE OR OTHER WHICH SUPPORT UNIX COMMANDS +```bash +pnpm update-version +``` + +If script was run successfully you will see ```Updated versions to ``` diff --git a/extension/bash-scripts/copy_env.sh b/extension/bash-scripts/copy_env.sh new file mode 100644 index 0000000..0c75866 --- /dev/null +++ b/extension/bash-scripts/copy_env.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Check if .env does not exist and .example.env exists +if [ ! -f ".env" ] && [ -f ".example.env" ]; then + # Copy .example.env to .env + cp .example.env .env + echo ".example.env has been copied to .env" +fi diff --git a/extension/bash-scripts/set_global_env.sh b/extension/bash-scripts/set_global_env.sh new file mode 100644 index 0000000..0ced414 --- /dev/null +++ b/extension/bash-scripts/set_global_env.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# Default values +CLI_CEB_DEV=false +CLI_CEB_FIREFOX=false + +validate_is_boolean() { + if [[ "$1" != "true" && "$1" != "false" ]]; then + echo "Invalid value for <$2>. Please use 'true' or 'false'." + exit 1 + fi +} + +# Validate if a key starts with CLI_CEB_ or CEB_ +validate_key() { + local key="$1" + local is_editable_section="${2:-false}" + + if [[ -n "$key" && ! "$key" =~ ^# ]]; then + if [[ "$is_editable_section" == true && ! "$key" =~ ^CEB_ ]]; then + echo "Invalid key: <$key>. All keys in the editable section must start with 'CEB_'." + exit 1 + elif [[ "$is_editable_section" == false && ! "$key" =~ ^CLI_CEB_ ]]; then + echo "Invalid key: <$key>. All CLI keys must start with 'CLI_CEB_'." + exit 1 + fi + fi +} + +parse_arguments() { + for arg in "$@" + do + key="${arg%%=*}" + value="${arg#*=}" + + validate_key "$key" + + case $key in + CLI_CEB_DEV) + CLI_CEB_DEV="$value" + validate_is_boolean "$CLI_CEB_DEV" "CLI_CEB_DEV" + ;; + CLI_CEB_FIREFOX) + CLI_CEB_FIREFOX="$value" + validate_is_boolean "$CLI_CEB_FIREFOX" "CLI_CEB_FIREFOX" + ;; + *) + cli_values+=("$key=$value") + ;; + esac + done +} + +# Validate keys in .env file +validate_env_keys() { + editable_section_starts=false + + while IFS= read -r line; do + key="${line%%=*}" + if [[ "$key" =~ ^CLI_CEB_ ]]; then + editable_section_starts=true + elif $editable_section_starts; then + validate_key "$key" true + fi + done < .env +} + +create_new_file() { + temp_file=$(mktemp) + + { + echo "# THOSE VALUES ARE EDITABLE ONLY VIA CLI" + echo "CLI_CEB_DEV=$CLI_CEB_DEV" + echo "CLI_CEB_FIREFOX=$CLI_CEB_FIREFOX" + for value in "${cli_values[@]}"; do + echo "$value" + done + echo "" + echo "# THOSE VALUES ARE EDITABLE" + + # Copy existing env values, without CLI section + grep -E '^CEB_' .env + } > "$temp_file" + + mv "$temp_file" .env +} + +# Main script execution +parse_arguments "$@" +validate_env_keys +create_new_file diff --git a/extension/bash-scripts/update_version.sh b/extension/bash-scripts/update_version.sh new file mode 100644 index 0000000..3bee333 --- /dev/null +++ b/extension/bash-scripts/update_version.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Usage: ./update_version.sh +# FORMAT IS <0.0.0> + +if [[ "$1" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + find . -name 'package.json' -not -path '*/node_modules/*' -exec bash -c ' + # Parse the version from package.json + current_version=$(grep -o "\"version\": \"[^\"]*" "$0" | cut -d"\"" -f4) + + # Update the version + perl -i -pe"s/$current_version/'$1'/" "$0" + ' {} \; + + echo "Updated versions to $1"; +else + echo "Version format <$1> isn't correct, proper format is <0.0.0>"; +fi diff --git a/extension/chrome-extension/manifest.js b/extension/chrome-extension/manifest.js new file mode 100644 index 0000000..30e9645 --- /dev/null +++ b/extension/chrome-extension/manifest.js @@ -0,0 +1,53 @@ +import { defineManifest } from '@crxjs/vite-plugin'; +export default defineManifest({ + manifest_version: 3, + name: 'Orca Test Recorder', + version: '1.0.0', + description: 'Record browser interactions for automated testing with Orca', + default_locale: 'en', + permissions: [ + 'activeTab', + 'storage', + 'tabs', + 'webNavigation', + 'scripting', + 'contextMenus' + ], + host_permissions: [ + '' + ], + background: { + service_worker: 'background.js' + }, + content_scripts: [ + { + matches: [''], + js: ['content.js'], + css: ['content.css'], + run_at: 'document_idle', + all_frames: true + } + ], + action: { + default_popup: 'popup.html', + default_icon: { + '16': 'icon-16.png', + '32': 'icon-32.png', + '48': 'icon-48.png', + '128': 'icon-128.png' + }, + default_title: 'Orca Test Recorder' + }, + icons: { + '16': 'icon-16.png', + '32': 'icon-32.png', + '48': 'icon-48.png', + '128': 'icon-128.png' + }, + web_accessible_resources: [ + { + resources: ['injected.js'], + matches: [''] + } + ] +}); diff --git a/extension/chrome-extension/manifest.ts b/extension/chrome-extension/manifest.ts new file mode 100644 index 0000000..e7dddf8 --- /dev/null +++ b/extension/chrome-extension/manifest.ts @@ -0,0 +1,61 @@ +import { defineManifest } from '@crxjs/vite-plugin'; + +export default defineManifest({ + manifest_version: 3, + name: 'Orca Test Recorder', + version: '1.0.0', + description: 'Record browser interactions for automated testing with Orca', + default_locale: 'en', + + permissions: [ + 'activeTab', + 'storage', + 'tabs', + 'webNavigation', + 'scripting', + 'contextMenus' + ], + + host_permissions: [ + '' + ], + + background: { + service_worker: 'background.js' + }, + + content_scripts: [ + { + matches: [''], + js: ['content.js'], + css: ['content.css'], + run_at: 'document_idle', + all_frames: true + } + ], + + action: { + default_popup: 'popup.html', + default_icon: { + '16': 'icon-16.png', + '32': 'icon-32.png', + '48': 'icon-48.png', + '128': 'icon-128.png' + }, + default_title: 'Orca Test Recorder' + }, + + icons: { + '16': 'icon-16.png', + '32': 'icon-32.png', + '48': 'icon-48.png', + '128': 'icon-128.png' + }, + + web_accessible_resources: [ + { + resources: ['injected.js'], + matches: [''] + } + ] +}); diff --git a/extension/chrome-extension/package.json b/extension/chrome-extension/package.json new file mode 100644 index 0000000..bec25fe --- /dev/null +++ b/extension/chrome-extension/package.json @@ -0,0 +1,38 @@ +{ + "name": "chrome-extension", + "version": "0.5.0", + "description": "chrome extension - core settings", + "type": "module", + "private": true, + "sideEffects": false, + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "ready": "tsc -b pre-build.tsconfig.json", + "build": "vite build", + "dev": "vite build --mode development", + "test": "vitest run", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write --ignore-path ../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/env": "workspace:*", + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/ui": "workspace:*", + "webextension-polyfill": "^0.12.0" + }, + "devDependencies": { + "@crxjs/vite-plugin": "^2.2.0", + "@extension/dev-utils": "workspace:*", + "@extension/hmr": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*", + "@laynezh/vite-plugin-lib-assets": "^1.1.0", + "magic-string": "^0.30.17", + "ts-loader": "^9.5.2" + } +} diff --git a/extension/chrome-extension/pre-build.tsconfig.json b/extension/chrome-extension/pre-build.tsconfig.json new file mode 100644 index 0000000..d70695e --- /dev/null +++ b/extension/chrome-extension/pre-build.tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./", + "noEmit": false + }, + "include": ["manifest.ts"], + "exclude": [""] +} diff --git a/extension/chrome-extension/pre-build.tsconfig.tsbuildinfo b/extension/chrome-extension/pre-build.tsconfig.tsbuildinfo new file mode 100644 index 0000000..486c23e --- /dev/null +++ b/extension/chrome-extension/pre-build.tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./manifest.ts"],"version":"5.8.3"} \ No newline at end of file diff --git a/extension/chrome-extension/public/content.css b/extension/chrome-extension/public/content.css new file mode 100644 index 0000000..e69de29 diff --git a/extension/chrome-extension/public/icon-128.png b/extension/chrome-extension/public/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..d5bdad9464a61ff2c2c74b3cbe1f03d6ae23db04 GIT binary patch literal 14500 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 N^htfK3{A^_{tqm~E!qG8 literal 0 HcmV?d00001 diff --git a/extension/chrome-extension/public/icon-16.png b/extension/chrome-extension/public/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..a741ff61ff6abea8fa984e04e6d3316c0d9c1920 GIT binary patch literal 6362 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 IYubeT2YJB^CIA2c literal 0 HcmV?d00001 diff --git a/extension/chrome-extension/public/icon-32.png b/extension/chrome-extension/public/icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..a741ff61ff6abea8fa984e04e6d3316c0d9c1920 GIT binary patch literal 6362 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 IYubeT2YJB^CIA2c literal 0 HcmV?d00001 diff --git a/extension/chrome-extension/public/icon-34.png b/extension/chrome-extension/public/icon-34.png new file mode 100644 index 0000000000000000000000000000000000000000..a741ff61ff6abea8fa984e04e6d3316c0d9c1920 GIT binary patch literal 6362 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 IYubeT2YJB^CIA2c literal 0 HcmV?d00001 diff --git a/extension/chrome-extension/public/icon-48.png b/extension/chrome-extension/public/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..a741ff61ff6abea8fa984e04e6d3316c0d9c1920 GIT binary patch literal 6362 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 IYubeT2YJB^CIA2c literal 0 HcmV?d00001 diff --git a/extension/chrome-extension/public/popup.html b/extension/chrome-extension/public/popup.html new file mode 100644 index 0000000..9a201b3 --- /dev/null +++ b/extension/chrome-extension/public/popup.html @@ -0,0 +1,12 @@ + + + + + + Orca Test Recorder + + +
+ + + diff --git a/extension/chrome-extension/src/background/index.ts b/extension/chrome-extension/src/background/index.ts new file mode 100644 index 0000000..780599b --- /dev/null +++ b/extension/chrome-extension/src/background/index.ts @@ -0,0 +1,514 @@ +import 'webextension-polyfill'; +import { orcaAPI } from '../common/api'; +import { ORCA_CONSTANTS } from '../common/constants'; + +interface TabState { + isRecording: boolean; + startTime: number; + actionCount: number; +} + +interface ActionData { + action_type: string; + target_element: any; + value: any; + timestamp_ms: number; + recording_id?: string; + sequence_number?: number; + tab_id?: number; + url?: string; +} + +class OrcaRecorder { + private state: { + isRecording: boolean; + isPaused: boolean; + currentRecording: any; + recordedActions: ActionData[]; + settings: any; + tabStates: Map; + }; + + constructor() { + this.state = { + isRecording: false, + isPaused: false, + currentRecording: null, + recordedActions: [], + settings: {}, + tabStates: new Map() + }; + + this.init(); + } + + private async init() { + await this.loadSettings(); + this.setupEventListeners(); + this.setupContextMenus(); + } + + private async loadSettings() { + try { + const result = await chrome.storage.local.get([ + ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS, + ORCA_CONSTANTS.STORAGE_KEYS.API_URL + ]); + + this.state.settings = result[ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS] || + ORCA_CONSTANTS.DEFAULT_SETTINGS; + + const apiUrl = result[ORCA_CONSTANTS.STORAGE_KEYS.API_URL] || + ORCA_CONSTANTS.DEFAULT_API_URL; + + await orcaAPI.setBaseUrl(apiUrl); + } catch (error) { + console.error('Failed to load settings:', error); + } + } + + private setupEventListeners() { + // Listen for messages from popup and content scripts + chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + this.handleMessage(message, sender).then(response => { + sendResponse(response); + }).catch(error => { + sendResponse({ success: false, error: error.message }); + }); + return true; // Keep message channel open for async response + }); + + // Handle tab updates + chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { + this.handleTabUpdate(tabId, changeInfo, tab); + }); + + // Handle tab removal + chrome.tabs.onRemoved.addListener((tabId) => { + this.state.tabStates.delete(tabId); + }); + + // Handle extension startup + chrome.runtime.onStartup.addListener(() => { + this.handleStartup(); + }); + + // Handle installation + chrome.runtime.onInstalled.addListener((details) => { + this.handleInstalled(details); + }); + } + + private setupContextMenus() { + // Remove existing context menus to avoid duplicates + try { + chrome.contextMenus.removeAll(); + } catch (error) { + console.warn('Could not remove existing context menus:', error); + } + + // Create new context menus + chrome.contextMenus.create({ + id: 'orca-start-recording', + title: 'Start Orca Recording', + contexts: ['page'] + }); + + chrome.contextMenus.create({ + id: 'orca-stop-recording', + title: 'Stop Orca Recording', + contexts: ['page'] + }); + + chrome.contextMenus.onClicked.addListener((info, tab) => { + this.handleContextMenu(info, tab); + }); + } + + private async handleMessage(message: any, sender: any) { + const { type, ...data } = message; + + switch (type) { + case ORCA_CONSTANTS.MESSAGES.START_RECORDING: + return await this.startRecording(data, sender.tab); + + case ORCA_CONSTANTS.MESSAGES.STOP_RECORDING: + return await this.stopRecording(sender.tab); + + case ORCA_CONSTANTS.MESSAGES.PAUSE_RECORDING: + return await this.pauseRecording(sender.tab); + + case ORCA_CONSTANTS.MESSAGES.RESUME_RECORDING: + return await this.resumeRecording(sender.tab); + + case ORCA_CONSTANTS.MESSAGES.ACTION_CAPTURED: + return this.handleActionCaptured(data, sender.tab); + + case ORCA_CONSTANTS.MESSAGES.GET_STATUS: + return this.getStatus(sender.tab); + + case ORCA_CONSTANTS.MESSAGES.SAVE_SETTINGS: + return await this.saveSettings(data.settings); + + case ORCA_CONSTANTS.MESSAGES.TEST_CONNECTION: + return await this.testConnection(data.url); + + case ORCA_CONSTANTS.MESSAGES.GET_APPS: + return await this.getApplications(); + + default: + console.warn('Unknown message type:', type); + return { success: false, error: 'Unknown message type' }; + } + } + + private async startRecording(data: any, tab: any) { + try { + if (this.state.isRecording) { + return { success: false, error: 'Recording already in progress' }; + } + + // Create recording in API + const recordingData = { + app_id: data.appId, + name: data.recordingName, + description: `Recorded from ${tab.url}`, + browser_type: 'Chrome', + viewport_width: 1920, + viewport_height: 1080, + base_url: new URL(tab.url).origin, + created_by: 'browser_extension' + }; + + const result = await orcaAPI.createRecording(recordingData); + if (!result.success) { + return { success: false, error: result.error }; + } + + // Update state + this.state.isRecording = true; + this.state.isPaused = false; + this.state.currentRecording = result.data; + this.state.recordedActions = []; + + // Track tab state + this.state.tabStates.set(tab.id, { + isRecording: true, + startTime: Date.now(), + actionCount: 0 + }); + + // Inject content script if not already injected + await this.injectContentScript(tab.id); + + // Notify content script to start recording + await chrome.tabs.sendMessage(tab.id, { + type: ORCA_CONSTANTS.MESSAGES.START_RECORDING, + recordingId: this.state.currentRecording.id, + settings: this.state.settings + }); + + // Update popup + this.broadcastStatusUpdate(); + + return { success: true, recording: this.state.currentRecording }; + } catch (error: any) { + console.error('Failed to start recording:', error); + return { success: false, error: error.message }; + } + } + + private async stopRecording(tab: any) { + try { + if (!this.state.isRecording) { + return { success: false, error: 'No recording in progress' }; + } + + // Notify content script to stop + if (tab) { + try { + await chrome.tabs.sendMessage(tab.id, { + type: ORCA_CONSTANTS.MESSAGES.STOP_RECORDING + }); + } catch (error) { + console.warn('Could not notify content script:', error); + } + } + + // Save actions to API + if (this.state.recordedActions.length > 0) { + const result = await orcaAPI.saveActions( + this.state.currentRecording.id, + this.state.recordedActions + ); + + if (!result.success) { + console.error('Failed to save actions:', result.error); + } + } + + // Update recording end time + await orcaAPI.updateRecording(this.state.currentRecording.id, { + status: 'completed', + duration_ms: Date.now() - (this.state.tabStates.get(tab?.id)?.startTime || Date.now()), + action_count: this.state.recordedActions.length + }); + + // Reset state + this.state.isRecording = false; + this.state.isPaused = false; + this.state.currentRecording = null; + this.state.recordedActions = []; + + if (tab) { + this.state.tabStates.delete(tab.id); + } + + // Update popup + this.broadcastStatusUpdate(); + + return { success: true, actionCount: this.state.recordedActions.length }; + } catch (error: any) { + console.error('Failed to stop recording:', error); + return { success: false, error: error.message }; + } + } + + private async pauseRecording(tab: any) { + if (!this.state.isRecording || this.state.isPaused) { + return { success: false, error: 'Cannot pause recording' }; + } + + this.state.isPaused = true; + + if (tab) { + try { + await chrome.tabs.sendMessage(tab.id, { + type: ORCA_CONSTANTS.MESSAGES.PAUSE_RECORDING + }); + } catch (error) { + console.warn('Could not notify content script:', error); + } + } + + this.broadcastStatusUpdate(); + return { success: true }; + } + + private async resumeRecording(tab: any) { + if (!this.state.isRecording || !this.state.isPaused) { + return { success: false, error: 'Cannot resume recording' }; + } + + this.state.isPaused = false; + + if (tab) { + try { + await chrome.tabs.sendMessage(tab.id, { + type: ORCA_CONSTANTS.MESSAGES.RESUME_RECORDING + }); + } catch (error) { + console.warn('Could not notify content script:', error); + } + } + + this.broadcastStatusUpdate(); + return { success: true }; + } + + private handleActionCaptured(actionData: ActionData, tab: any) { + if (!this.state.isRecording || this.state.isPaused) { + return { success: false, error: 'Not recording' }; + } + + // Add metadata to action + const enrichedAction: ActionData = { + ...actionData, + recording_id: this.state.currentRecording.id, + sequence_number: this.state.recordedActions.length + 1, + timestamp_ms: Date.now(), + tab_id: tab?.id, + url: tab?.url + }; + + this.state.recordedActions.push(enrichedAction); + + // Update tab state + if (tab && this.state.tabStates.has(tab.id)) { + const tabState = this.state.tabStates.get(tab.id)!; + tabState.actionCount++; + } + + // Notify popup of new action + this.broadcastActionCaptured(enrichedAction); + + // Save periodically (every 10 actions) + if (this.state.recordedActions.length % 10 === 0) { + this.saveActionsBatch(); + } + + return { success: true }; + } + + private async saveActionsBatch() { + try { + if (this.state.recordedActions.length > 0) { + await orcaAPI.saveActions( + this.state.currentRecording.id, + this.state.recordedActions + ); + } + } catch (error) { + console.error('Failed to save actions batch:', error); + } + } + + private getStatus(tab: any) { + const tabState = tab ? this.state.tabStates.get(tab.id) : null; + + return { + success: true, + recordingState: this.state.isRecording ? + (this.state.isPaused ? ORCA_CONSTANTS.RECORDING_STATES.PAUSED : + ORCA_CONSTANTS.RECORDING_STATES.RECORDING) : + ORCA_CONSTANTS.RECORDING_STATES.IDLE, + actionCount: this.state.recordedActions.length, + currentRecording: this.state.currentRecording, + tabState + }; + } + + private async saveSettings(settings: any) { + try { + this.state.settings = { ...this.state.settings, ...settings }; + + await chrome.storage.local.set({ + [ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS]: this.state.settings + }); + + return { success: true }; + } catch (error: any) { + console.error('Failed to save settings:', error); + return { success: false, error: error.message }; + } + } + + private async testConnection(url: string) { + try { + return await orcaAPI.testConnection(url); + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + private async getApplications() { + try { + return await orcaAPI.getApplications(); + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + private async injectContentScript(tabId: number) { + try { + await chrome.scripting.executeScript({ + target: { tabId }, + files: ['src/content/recorder.js'] + }); + } catch (error) { + console.warn('Content script might already be injected:', error); + } + } + + private broadcastStatusUpdate() { + const status = { + type: ORCA_CONSTANTS.MESSAGES.UPDATE_STATUS, + recordingState: this.state.isRecording ? + (this.state.isPaused ? ORCA_CONSTANTS.RECORDING_STATES.PAUSED : + ORCA_CONSTANTS.RECORDING_STATES.RECORDING) : + ORCA_CONSTANTS.RECORDING_STATES.IDLE, + actionCount: this.state.recordedActions.length, + currentRecording: this.state.currentRecording + }; + + // Try to send to popup (might not be open) + chrome.runtime.sendMessage(status).catch(() => { + // Popup is closed, ignore error + }); + } + + private broadcastActionCaptured(action: ActionData) { + const message = { + type: ORCA_CONSTANTS.MESSAGES.ACTION_CAPTURED, + action, + totalCount: this.state.recordedActions.length + }; + + chrome.runtime.sendMessage(message).catch(() => { + // Popup is closed, ignore error + }); + } + + private handleTabUpdate(tabId: number, changeInfo: any, tab: any) { + // Handle navigation during recording + if (this.state.isRecording && changeInfo.status === 'loading' && changeInfo.url) { + const navigationAction: ActionData = { + action_type: ORCA_CONSTANTS.ACTION_TYPES.NAVIGATION, + target_element: null, + value: changeInfo.url, + timestamp_ms: Date.now() + }; + + this.handleActionCaptured(navigationAction, tab); + } + } + + private handleContextMenu(info: any, tab: any) { + switch (info.menuItemId) { + case 'orca-start-recording': + // Open popup instead of starting directly + chrome.action.openPopup(); + break; + + case 'orca-stop-recording': + if (this.state.isRecording) { + this.stopRecording(tab); + } + break; + } + } + + private handleStartup() { + console.log('Orca extension started'); + this.loadSettings(); + } + + private handleInstalled(details: any) { + if (details.reason === 'install') { + console.log('Orca extension installed'); + // Set default settings + chrome.storage.local.set({ + [ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS]: ORCA_CONSTANTS.DEFAULT_SETTINGS, + [ORCA_CONSTANTS.STORAGE_KEYS.API_URL]: ORCA_CONSTANTS.DEFAULT_API_URL + }); + } else if (details.reason === 'update') { + console.log('Orca extension updated'); + this.loadSettings(); + } + } +} + +// Initialize the recorder when the service worker loads +const recorder = new OrcaRecorder(); + +// Keep service worker alive +chrome.runtime.onSuspend.addListener(() => { + console.log('Service worker suspending'); + if (recorder.state.isRecording) { + // Try to save current recording state + recorder.saveActionsBatch(); + } +}); + +console.log('Background loaded'); +console.log("Edit 'chrome-extension/src/background/index.ts' and save to reload."); diff --git a/extension/chrome-extension/src/common/api.ts b/extension/chrome-extension/src/common/api.ts new file mode 100644 index 0000000..9a6cd93 --- /dev/null +++ b/extension/chrome-extension/src/common/api.ts @@ -0,0 +1,188 @@ +import { ORCA_CONSTANTS } from './constants'; + +// Orca API Communication Module +export class OrcaAPI { + private baseUrl: string; + private timeout: number; + + constructor() { + this.baseUrl = ORCA_CONSTANTS.DEFAULT_API_URL; + this.timeout = ORCA_CONSTANTS.TIMEOUTS.API_REQUEST; + } + + async setBaseUrl(url: string): Promise { + this.baseUrl = url; + await chrome.storage.local.set({ [ORCA_CONSTANTS.STORAGE_KEYS.API_URL]: url }); + } + + async getBaseUrl(): Promise { + const result = await chrome.storage.local.get(ORCA_CONSTANTS.STORAGE_KEYS.API_URL); + if (result[ORCA_CONSTANTS.STORAGE_KEYS.API_URL]) { + this.baseUrl = result[ORCA_CONSTANTS.STORAGE_KEYS.API_URL]; + } + return this.baseUrl; + } + + async makeRequest(endpoint: string, options: RequestInit = {}): Promise { + const url = `${this.baseUrl}${endpoint}`; + const defaultOptions: RequestInit = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + } + }; + + const requestOptions = { ...defaultOptions, ...options }; + + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + const response = await fetch(url, { + ...requestOptions, + signal: controller.signal + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const contentType = response.headers.get('content-type'); + if (contentType && contentType.includes('application/json')) { + return await response.json(); + } else { + return await response.text(); + } + } catch (error: any) { + if (error.name === 'AbortError') { + throw new Error('Request timeout'); + } + throw error; + } + } + + // Health check + async checkHealth(): Promise<{ status: string; message: string }> { + try { + await this.makeRequest(ORCA_CONSTANTS.API_ENDPOINTS.HEALTH); + return { status: 'connected', message: 'API is healthy' }; + } catch (error: any) { + return { + status: 'error', + message: `Failed to connect: ${error.message}` + }; + } + } + + // Get applications + async getApplications(): Promise<{ success: boolean; data?: any; error?: string }> { + try { + const data = await this.makeRequest(ORCA_CONSTANTS.API_ENDPOINTS.APPS); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Create new recording + async createRecording(recordingData: any): Promise<{ success: boolean; data?: any; error?: string }> { + try { + const data = await this.makeRequest(ORCA_CONSTANTS.API_ENDPOINTS.RECORDINGS, { + method: 'POST', + body: JSON.stringify(recordingData) + }); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Update recording + async updateRecording(recordingId: string, updateData: any): Promise<{ success: boolean; data?: any; error?: string }> { + try { + const data = await this.makeRequest(`${ORCA_CONSTANTS.API_ENDPOINTS.RECORDINGS}/${recordingId}`, { + method: 'PUT', + body: JSON.stringify(updateData) + }); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Save recorded actions + async saveActions(recordingId: string, actions: any[]): Promise<{ success: boolean; data?: any; error?: string }> { + try { + const data = await this.makeRequest(ORCA_CONSTANTS.API_ENDPOINTS.ACTIONS, { + method: 'POST', + body: JSON.stringify({ + recording_id: recordingId, + actions: actions + }) + }); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Create action group from recording + async createActionGroup(groupData: any): Promise<{ success: boolean; data?: any; error?: string }> { + try { + const data = await this.makeRequest(ORCA_CONSTANTS.API_ENDPOINTS.ACTION_GROUPS, { + method: 'POST', + body: JSON.stringify(groupData) + }); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Get recordings + async getRecordings(appId?: string): Promise<{ success: boolean; data?: any; error?: string }> { + try { + let endpoint = ORCA_CONSTANTS.API_ENDPOINTS.RECORDINGS; + if (appId) { + endpoint += `?app_id=${appId}`; + } + const data = await this.makeRequest(endpoint); + return { success: true, data }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Delete recording + async deleteRecording(recordingId: string): Promise<{ success: boolean; error?: string }> { + try { + await this.makeRequest(`${ORCA_CONSTANTS.API_ENDPOINTS.RECORDINGS}/${recordingId}`, { + method: 'DELETE' + }); + return { success: true }; + } catch (error: any) { + return { success: false, error: error.message }; + } + } + + // Test connection with timeout + async testConnection(url?: string): Promise<{ status: string; message: string }> { + if (url) { + const originalUrl = this.baseUrl; + this.baseUrl = url; + try { + const result = await this.checkHealth(); + return result; + } finally { + this.baseUrl = originalUrl; + } + } else { + return await this.checkHealth(); + } + } +} + +// Create global instance +export const orcaAPI = new OrcaAPI(); diff --git a/extension/chrome-extension/src/common/constants.ts b/extension/chrome-extension/src/common/constants.ts new file mode 100644 index 0000000..e6ad740 --- /dev/null +++ b/extension/chrome-extension/src/common/constants.ts @@ -0,0 +1,141 @@ +// Orca Extension Constants +export const ORCA_CONSTANTS = { + // API Configuration + DEFAULT_API_URL: 'http://localhost:8080', + API_ENDPOINTS: { + HEALTH: '/health', + APPS: '/api/v1/app', + RECORDINGS: '/api/v1/recordings', + ACTIONS: '/api/v1/actions', + ACTION_GROUPS: '/api/v1/action-groups' + }, + + // Storage Keys + STORAGE_KEYS: { + API_URL: 'orca_api_url', + RECORDING_SETTINGS: 'orca_recording_settings', + CURRENT_RECORDING: 'orca_current_recording', + RECENT_RECORDINGS: 'orca_recent_recordings', + SELECTED_APP: 'orca_selected_app' + }, + + // Recording Settings + DEFAULT_SETTINGS: { + captureScreenshots: true, + captureHover: true, + smartSelectors: true, + maxActions: 1000, + recordingTimeout: 3600000, // 1 hour in ms + actionDelay: 100 // ms between actions + }, + + // Action Types + ACTION_TYPES: { + CLICK: 'click', + DOUBLE_CLICK: 'dblclick', + RIGHT_CLICK: 'contextmenu', + INPUT: 'input', + CHANGE: 'change', + KEYDOWN: 'keydown', + KEYUP: 'keyup', + SUBMIT: 'submit', + FOCUS: 'focus', + BLUR: 'blur', + HOVER: 'mouseover', + SCROLL: 'scroll', + NAVIGATION: 'navigation', + WAIT: 'wait' + }, + + // Target Types + TARGET_TYPES: { + CSS: 'css', + XPATH: 'xpath', + ID: 'id', + NAME: 'name', + CLASS: 'class', + TEXT: 'text', + ATTRIBUTES: 'attributes' + }, + + // Recording States + RECORDING_STATES: { + IDLE: 'idle', + RECORDING: 'recording', + PAUSED: 'paused', + STOPPING: 'stopping', + PROCESSING: 'processing' + }, + + // Connection States + CONNECTION_STATES: { + UNKNOWN: 'unknown', + CHECKING: 'checking', + CONNECTED: 'connected', + DISCONNECTED: 'disconnected', + ERROR: 'error' + }, + + // Messages between content script and background + MESSAGES: { + START_RECORDING: 'start_recording', + STOP_RECORDING: 'stop_recording', + PAUSE_RECORDING: 'pause_recording', + RESUME_RECORDING: 'resume_recording', + ACTION_CAPTURED: 'action_captured', + UPDATE_STATUS: 'update_status', + GET_STATUS: 'get_status', + TEST_CONNECTION: 'test_connection', + SAVE_SETTINGS: 'save_settings', + GET_SETTINGS: 'get_settings', + GET_APPS: 'get_apps' + }, + + // Element attributes to capture for smart selectors + SELECTOR_ATTRIBUTES: [ + 'id', + 'name', + 'class', + 'type', + 'role', + 'aria-label', + 'data-testid', + 'data-test', + 'data-cy', + 'placeholder', + 'title', + 'alt' + ], + + // CSS selectors to ignore during recording + IGNORED_SELECTORS: [ + '[data-orca-ignore]', + '.orca-ignore', + '#orca-overlay', + '.orca-recorder-ui' + ], + + // Maximum lengths + MAX_LENGTHS: { + RECORDING_NAME: 100, + ACTION_DESCRIPTION: 500, + SELECTOR_LENGTH: 1000, + VALUE_LENGTH: 5000 + }, + + // Timeouts + TIMEOUTS: { + API_REQUEST: 5000, + CONNECTION_CHECK: 3000, + SCREENSHOT_CAPTURE: 2000, + ELEMENT_WAIT: 10000 + }, + + // Screenshot settings + SCREENSHOT: { + MAX_WIDTH: 1920, + MAX_HEIGHT: 1080, + QUALITY: 0.8, + FORMAT: 'png' + } +}; diff --git a/extension/chrome-extension/src/content/recorder.ts b/extension/chrome-extension/src/content/recorder.ts new file mode 100644 index 0000000..146a546 --- /dev/null +++ b/extension/chrome-extension/src/content/recorder.ts @@ -0,0 +1,320 @@ +// Content Script for Orca Extension +import { ORCA_CONSTANTS } from '../common/constants'; + +class OrcaContentRecorder { + private isRecording: boolean = false; + private isPaused: boolean = false; + private recordingId: string | null = null; + private settings: any = {}; + private eventListeners: Array<{ element: Element; event: string; handler: EventListener }> = []; + + constructor() { + this.init(); + } + + private init() { + // Listen for messages from background script + chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + this.handleMessage(message); + sendResponse({ received: true }); + }); + + // Check if we should start recording (in case content script is injected after recording starts) + this.checkRecordingStatus(); + } + + private async checkRecordingStatus() { + try { + const response = await chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.GET_STATUS + }); + + if (response.success && response.recordingState === ORCA_CONSTANTS.RECORDING_STATES.RECORDING) { + this.startRecording(response.currentRecording, response.settings); + } + } catch (error) { + console.warn('Could not check recording status:', error); + } + } + + private handleMessage(message: any) { + switch (message.type) { + case ORCA_CONSTANTS.MESSAGES.START_RECORDING: + this.startRecording(message.recordingId, message.settings); + break; + + case ORCA_CONSTANTS.MESSAGES.STOP_RECORDING: + this.stopRecording(); + break; + + case ORCA_CONSTANTS.MESSAGES.PAUSE_RECORDING: + this.pauseRecording(); + break; + + case ORCA_CONSTANTS.MESSAGES.RESUME_RECORDING: + this.resumeRecording(); + break; + } + } + + private startRecording(recordingId: string, settings: any) { + if (this.isRecording) { + console.warn('Recording already in progress'); + return; + } + + this.isRecording = true; + this.isPaused = false; + this.recordingId = recordingId; + this.settings = settings || {}; + + console.log('Starting Orca recording:', recordingId); + this.setupEventListeners(); + } + + private stopRecording() { + if (!this.isRecording) { + return; + } + + console.log('Stopping Orca recording'); + this.isRecording = false; + this.isPaused = false; + this.recordingId = null; + this.removeEventListeners(); + } + + private pauseRecording() { + if (!this.isRecording) return; + this.isPaused = true; + console.log('Recording paused'); + } + + private resumeRecording() { + if (!this.isRecording) return; + this.isPaused = false; + console.log('Recording resumed'); + } + + private setupEventListeners() { + // Click events + this.addEventListener('click', this.handleClick.bind(this)); + + // Input events + this.addEventListener('input', this.handleInput.bind(this)); + this.addEventListener('change', this.handleChange.bind(this)); + + // Form submission + this.addEventListener('submit', this.handleSubmit.bind(this)); + + // Navigation events + this.addEventListener('popstate', this.handleNavigation.bind(this)); + + // Scroll events (throttled) + this.addThrottledEventListener('scroll', this.handleScroll.bind(this), 1000); + + // Hover events (if enabled) + if (this.settings.captureHover) { + this.addEventListener('mouseover', this.handleHover.bind(this)); + } + + // Keyboard events for form fields + this.addEventListener('keydown', this.handleKeydown.bind(this)); + this.addEventListener('keyup', this.handleKeyup.bind(this)); + } + + private addEventListener(event: string, handler: EventListener) { + document.addEventListener(event, handler, true); + this.eventListeners.push({ element: document, event, handler }); + } + + private addThrottledEventListener(event: string, handler: EventListener, delay: number) { + let timeoutId: NodeJS.Timeout | null = null; + const throttledHandler = (e: Event) => { + if (timeoutId) return; + timeoutId = setTimeout(() => { + handler(e); + timeoutId = null; + }, delay); + }; + + document.addEventListener(event, throttledHandler, true); + this.eventListeners.push({ element: document, event, handler: throttledHandler }); + } + + private removeEventListeners() { + this.eventListeners.forEach(({ element, event, handler }) => { + element.removeEventListener(event, handler, true); + }); + this.eventListeners = []; + } + + private shouldRecordEvent(event: Event): boolean { + if (!this.isRecording || this.isPaused) return false; + + const target = event.target as Element; + if (!target) return false; + + // Check if element should be ignored + for (const selector of ORCA_CONSTANTS.IGNORED_SELECTORS) { + if (target.matches(selector)) return false; + } + + return true; + } + + private generateSelector(element: Element): string { + if (!this.settings.smartSelectors) { + return this.generateBasicSelector(element); + } + + // Try to find the best selector + const selectors = [ + () => element.id ? `#${element.id}` : null, + () => element.getAttribute('data-testid') ? `[data-testid="${element.getAttribute('data-testid')}"]` : null, + () => element.getAttribute('data-test') ? `[data-test="${element.getAttribute('data-test')}"]` : null, + () => element.getAttribute('data-cy') ? `[data-cy="${element.getAttribute('data-cy')}"]` : null, + () => element.getAttribute('name') ? `[name="${element.getAttribute('name')}"]` : null, + () => this.generateBasicSelector(element) + ]; + + for (const selectorFn of selectors) { + try { + const selector = selectorFn(); + if (selector && document.querySelectorAll(selector).length === 1) { + return selector; + } + } catch (error) { + console.warn('Error generating selector:', error); + } + } + + return this.generateBasicSelector(element); + } + + private generateBasicSelector(element: Element): string { + if (element.id) { + return `#${element.id}`; + } + + if (element.tagName) { + const tag = element.tagName.toLowerCase(); + const classes = Array.from(element.classList).slice(0, 2).join('.'); + return classes ? `${tag}.${classes}` : tag; + } + + return 'body'; + } + + private captureAction(actionType: string, target: Element, value?: any) { + if (!this.shouldRecordEvent({ target } as Event)) return; + + const action = { + action_type: actionType, + target_element: { + selector: this.generateSelector(target), + tag_name: target.tagName.toLowerCase(), + text_content: target.textContent?.trim().substring(0, 100) || '', + attributes: this.getRelevantAttributes(target) + }, + value: value || null, + timestamp_ms: Date.now() + }; + + // Send action to background script + chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.ACTION_CAPTURED, + ...action + }).catch(error => { + console.warn('Failed to send action:', error); + }); + } + + private getRelevantAttributes(element: Element): Record { + const relevantAttrs = ORCA_CONSTANTS.SELECTOR_ATTRIBUTES; + const attributes: Record = {}; + + relevantAttrs.forEach(attr => { + const value = element.getAttribute(attr); + if (value) { + attributes[attr] = value; + } + }); + + return attributes; + } + + private handleClick(event: Event) { + const target = event.target as Element; + if (!target) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.CLICK, target); + } + + private handleInput(event: Event) { + const target = event.target as HTMLInputElement; + if (!target) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.INPUT, target, target.value); + } + + private handleChange(event: Event) { + const target = event.target as HTMLInputElement; + if (!target) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.CHANGE, target, target.value); + } + + private handleSubmit(event: Event) { + const target = event.target as HTMLFormElement; + if (!target) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.SUBMIT, target); + } + + private handleNavigation(event: Event) { + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.NAVIGATION, document.body, window.location.href); + } + + private handleScroll(event: Event) { + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.SCROLL, document.body, { + scrollX: window.scrollX, + scrollY: window.scrollY + }); + } + + private handleHover(event: Event) { + const target = event.target as Element; + if (!target) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.HOVER, target); + } + + private handleKeydown(event: KeyboardEvent) { + const target = event.target as Element; + if (!target || !(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.KEYDOWN, target, { + key: event.key, + code: event.code, + ctrlKey: event.ctrlKey, + shiftKey: event.shiftKey, + altKey: event.altKey + }); + } + + private handleKeyup(event: KeyboardEvent) { + const target = event.target as Element; + if (!target || !(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return; + + this.captureAction(ORCA_CONSTANTS.ACTION_TYPES.KEYUP, target, { + key: event.key, + code: event.code + }); + } +} + +// Initialize the recorder when the content script loads +const recorder = new OrcaContentRecorder(); + +console.log('Orca content script loaded'); diff --git a/extension/chrome-extension/src/popup/index.tsx b/extension/chrome-extension/src/popup/index.tsx new file mode 100644 index 0000000..2d9c6f1 --- /dev/null +++ b/extension/chrome-extension/src/popup/index.tsx @@ -0,0 +1,585 @@ +import { Avatar, AvatarFallback, Badge, Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Input, Label, Switch } from '@extension/ui'; +import React, { useEffect, useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import { orcaAPI } from '../common/api'; +import { ORCA_CONSTANTS } from '../common/constants'; + +interface Application { + id: string; + name: string; + description?: string; +} + +interface Recording { + id: string; + name: string; + created_at: string; + status: string; +} + +interface PopupState { + connectionStatus: string; + recordingState: string; + currentRecording: any; + actionCount: number; + recordingTime: string; + applications: Application[]; + recentRecordings: Recording[]; + settings: { + captureScreenshots: boolean; + captureHover: boolean; + smartSelectors: boolean; + selectedApp: string; + recordingName: string; + apiUrl: string; + }; +} + +const OrcaPopup: React.FC = () => { + const [state, setState] = useState({ + connectionStatus: ORCA_CONSTANTS.CONNECTION_STATES.UNKNOWN, + recordingState: ORCA_CONSTANTS.RECORDING_STATES.IDLE, + currentRecording: null, + actionCount: 0, + recordingTime: '00:00', + applications: [], + recentRecordings: [], + settings: { + captureScreenshots: true, + captureHover: true, + smartSelectors: true, + selectedApp: '', + recordingName: '', + apiUrl: 'http://localhost:4004' + } + }); + + const [recordingTimer, setRecordingTimer] = useState(null); + const [recordingStartTime, setRecordingStartTime] = useState(null); + + useEffect(() => { + init(); + return () => { + if (recordingTimer) { + clearInterval(recordingTimer); + } + }; + }, []); + + const init = async () => { + await loadSettings(); + await loadApplications(); + await loadRecentRecordings(); + checkConnectionStatus(); + requestStatusUpdate(); + }; + + const loadSettings = async () => { + try { + const result = await chrome.storage.local.get([ + ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS, + ORCA_CONSTANTS.STORAGE_KEYS.API_URL, + ORCA_CONSTANTS.STORAGE_KEYS.SELECTED_APP + ]); + + const settings = result[ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS] || + ORCA_CONSTANTS.DEFAULT_SETTINGS; + + const apiUrl = result[ORCA_CONSTANTS.STORAGE_KEYS.API_URL] || + ORCA_CONSTANTS.DEFAULT_API_URL; + + const selectedApp = result[ORCA_CONSTANTS.STORAGE_KEYS.SELECTED_APP] || ''; + + setState(prev => ({ + ...prev, + settings: { + ...prev.settings, + ...settings, + apiUrl, + selectedApp + } + })); + + await orcaAPI.setBaseUrl(apiUrl); + } catch (error) { + console.error('Failed to load settings:', error); + } + }; + + const saveSettings = async () => { + try { + const settings = { + captureScreenshots: state.settings.captureScreenshots, + captureHover: state.settings.captureHover, + smartSelectors: state.settings.smartSelectors, + maxActions: ORCA_CONSTANTS.DEFAULT_SETTINGS.maxActions, + recordingTimeout: ORCA_CONSTANTS.DEFAULT_SETTINGS.recordingTimeout, + actionDelay: ORCA_CONSTANTS.DEFAULT_SETTINGS.actionDelay + }; + + await chrome.storage.local.set({ + [ORCA_CONSTANTS.STORAGE_KEYS.RECORDING_SETTINGS]: settings, + [ORCA_CONSTANTS.STORAGE_KEYS.SELECTED_APP]: state.settings.selectedApp + }); + + chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.SAVE_SETTINGS, + settings: { ...settings, selectedApp: state.settings.selectedApp, recordingName: state.settings.recordingName } + }); + } catch (error) { + console.error('Failed to save settings:', error); + } + }; + + const loadApplications = async () => { + try { + const result = await orcaAPI.getApplications(); + if (result.success) { + setState(prev => ({ ...prev, applications: result.data })); + } else { + console.error('Failed to load applications:', result.error); + } + } catch (error) { + console.error('Error loading applications:', error); + } + }; + + const loadRecentRecordings = async () => { + try { + const result = await orcaAPI.getRecordings(); + if (result.success) { + setState(prev => ({ ...prev, recentRecordings: result.data.slice(0, 5) })); + } + } catch (error) { + console.error('Error loading recent recordings:', error); + } + }; + + const checkConnectionStatus = async () => { + setState(prev => ({ ...prev, connectionStatus: ORCA_CONSTANTS.CONNECTION_STATES.CHECKING })); + + try { + const result = await orcaAPI.checkHealth(); + if (result.status === 'connected') { + setState(prev => ({ ...prev, connectionStatus: ORCA_CONSTANTS.CONNECTION_STATES.CONNECTED })); + } else { + setState(prev => ({ ...prev, connectionStatus: ORCA_CONSTANTS.CONNECTION_STATES.ERROR })); + } + } catch (error) { + setState(prev => ({ ...prev, connectionStatus: ORCA_CONSTANTS.CONNECTION_STATES.DISCONNECTED })); + } + }; + + const testConnection = async () => { + try { + const result = await orcaAPI.testConnection(state.settings.apiUrl); + if (result.status === 'connected') { + await updateApiUrl(); + checkConnectionStatus(); + } + } catch (error) { + console.error('Connection test failed:', error); + } + }; + + const updateApiUrl = async () => { + await orcaAPI.setBaseUrl(state.settings.apiUrl); + await chrome.storage.local.set({ [ORCA_CONSTANTS.STORAGE_KEYS.API_URL]: state.settings.apiUrl }); + }; + + const startRecording = async () => { + if (!state.settings.selectedApp) { + alert('Please select an application first'); + return; + } + + if (state.connectionStatus !== ORCA_CONSTANTS.CONNECTION_STATES.CONNECTED) { + alert('Not connected to Orca API'); + return; + } + + try { + chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.START_RECORDING, + appId: state.settings.selectedApp, + recordingName: state.settings.recordingName || `Recording ${new Date().toLocaleString()}` + }); + + setState(prev => ({ ...prev, recordingState: ORCA_CONSTANTS.RECORDING_STATES.RECORDING })); + startRecordingTimer(); + } catch (error) { + alert(`Failed to start recording: ${error.message}`); + } + }; + + const stopRecording = async () => { + try { + chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.STOP_RECORDING + }); + + setState(prev => ({ ...prev, recordingState: ORCA_CONSTANTS.RECORDING_STATES.STOPPING })); + stopRecordingTimer(); + } catch (error) { + alert(`Failed to stop recording: ${error.message}`); + } + }; + + const togglePause = async () => { + const isPaused = state.recordingState === ORCA_CONSTANTS.RECORDING_STATES.PAUSED; + + try { + chrome.runtime.sendMessage({ + type: isPaused ? ORCA_CONSTANTS.MESSAGES.RESUME_RECORDING : ORCA_CONSTANTS.MESSAGES.PAUSE_RECORDING + }); + + setState(prev => ({ + ...prev, + recordingState: isPaused ? ORCA_CONSTANTS.RECORDING_STATES.RECORDING : ORCA_CONSTANTS.RECORDING_STATES.PAUSED + })); + + if (isPaused) { + startRecordingTimer(); + } else { + pauseRecordingTimer(); + } + } catch (error) { + alert(`Failed to ${isPaused ? 'resume' : 'pause'} recording: ${error.message}`); + } + }; + + const startRecordingTimer = () => { + setRecordingStartTime(Date.now()); + const timer = setInterval(() => { + if (recordingStartTime) { + const elapsed = Date.now() - recordingStartTime; + const timeString = formatDuration(elapsed); + setState(prev => ({ ...prev, recordingTime: timeString })); + } + }, 1000); + setRecordingTimer(timer); + }; + + const stopRecordingTimer = () => { + if (recordingTimer) { + clearInterval(recordingTimer); + setRecordingTimer(null); + } + setState(prev => ({ + ...prev, + actionCount: 0, + recordingTime: '00:00', + recordingState: ORCA_CONSTANTS.RECORDING_STATES.IDLE + })); + }; + + const pauseRecordingTimer = () => { + if (recordingTimer) { + clearInterval(recordingTimer); + setRecordingTimer(null); + } + }; + + const requestStatusUpdate = () => { + chrome.runtime.sendMessage({ + type: ORCA_CONSTANTS.MESSAGES.GET_STATUS + }); + }; + + const formatDuration = (ms: number) => { + const seconds = Math.floor(ms / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + if (hours > 0) { + return `${hours.toString().padStart(2, '0')}:${(minutes % 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`; + } else { + return `${minutes.toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`; + } + }; + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + }; + + const getConnectionStatusColor = () => { + switch (state.connectionStatus) { + case ORCA_CONSTANTS.CONNECTION_STATES.CONNECTED: + return 'bg-green-500'; + case ORCA_CONSTANTS.CONNECTION_STATES.ERROR: + case ORCA_CONSTANTS.CONNECTION_STATES.DISCONNECTED: + return 'bg-red-500'; + case ORCA_CONSTANTS.CONNECTION_STATES.CHECKING: + return 'bg-yellow-500'; + default: + return 'bg-gray-500'; + } + }; + + const getConnectionStatusText = () => { + switch (state.connectionStatus) { + case ORCA_CONSTANTS.CONNECTION_STATES.CONNECTED: + return 'Connected to Orca API'; + case ORCA_CONSTANTS.CONNECTION_STATES.ERROR: + return 'Connection error'; + case ORCA_CONSTANTS.CONNECTION_STATES.DISCONNECTED: + return 'Disconnected from API'; + case ORCA_CONSTANTS.CONNECTION_STATES.CHECKING: + return 'Checking connection...'; + default: + return 'Unknown status'; + } + }; + + const isRecording = state.recordingState === ORCA_CONSTANTS.RECORDING_STATES.RECORDING; + const isPaused = state.recordingState === ORCA_CONSTANTS.RECORDING_STATES.PAUSED; + const isIdle = state.recordingState === ORCA_CONSTANTS.RECORDING_STATES.IDLE; + + return ( +
+ {/* Header */} +
+
+ Orca +
+

Orca Recorder

+

Record and replay browser interactions

+
+
+ + + + + + + Settings + + About + + +
+ + {/* Connection Status */} +
+
+
+ {getConnectionStatusText()} +
+
+ + {/* Recording Controls */} +
+ {!isIdle && ( +
+
+
+ + {isPaused ? 'Recording paused' : 'Recording in progress'} + +
+
+ Actions captured: {state.actionCount} +
+
+ Duration: {state.recordingTime} +
+
+ )} + +
+ {isIdle ? ( + + ) : ( +
+ + +
+ )} +
+
+ + {/* Settings Section */} +
+

Recording Settings

+ +
+
+ + { + setState(prev => ({ + ...prev, + settings: { ...prev.settings, captureScreenshots: checked } + })); + saveSettings(); + }} + /> +
+ +
+ + { + setState(prev => ({ + ...prev, + settings: { ...prev.settings, captureHover: checked } + })); + saveSettings(); + }} + /> +
+ +
+ + { + setState(prev => ({ + ...prev, + settings: { ...prev.settings, smartSelectors: checked } + })); + saveSettings(); + }} + /> +
+
+ +
+ + +
+ +
+ + { + setState(prev => ({ + ...prev, + settings: { ...prev.settings, recordingName: e.target.value } + })); + }} + onBlur={saveSettings} + /> +
+
+ + {/* Server Configuration */} +
+
+ + Server Configuration + +
+
+ + { + setState(prev => ({ + ...prev, + settings: { ...prev.settings, apiUrl: e.target.value } + })); + }} + onBlur={updateApiUrl} + placeholder="http://localhost:4004" + /> +
+ +
+
+
+ + {/* Recent Recordings */} +
+

Recent Recordings

+
+ {state.recentRecordings.length === 0 ? ( +
No recent recordings
+ ) : ( + state.recentRecordings.map(recording => ( +
+
{recording.name || 'Untitled Recording'}
+
{formatDate(recording.created_at)}
+ + {recording.status} + +
+ )) + )} +
+
+
+ ); +}; + +// Initialize popup when DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + const container = document.getElementById('root'); + if (container) { + const root = createRoot(container); + root.render(); + } +}); + +export default OrcaPopup; diff --git a/extension/chrome-extension/tsconfig.json b/extension/chrome-extension/tsconfig.json new file mode 100644 index 0000000..52c98ad --- /dev/null +++ b/extension/chrome-extension/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@extension/tsconfig/app", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + } + }, + "include": ["src", "utils", "vite.config.mts", "manifest.ts", "../node_modules/@types"] +} diff --git a/extension/chrome-extension/utils/plugins/make-manifest-plugin.ts b/extension/chrome-extension/utils/plugins/make-manifest-plugin.ts new file mode 100644 index 0000000..ea0a9e3 --- /dev/null +++ b/extension/chrome-extension/utils/plugins/make-manifest-plugin.ts @@ -0,0 +1,83 @@ +import { ManifestParser } from '@extension/dev-utils'; +import { IS_DEV, IS_FIREFOX } from '@extension/env'; +import { colorfulLog } from '@extension/shared'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { platform } from 'node:process'; +import { pathToFileURL } from 'node:url'; +import type { ManifestType } from '@extension/shared'; +import type { PluginOption } from 'vite'; + +const manifestFile = resolve(import.meta.dirname, '..', '..', 'manifest.js'); +const refreshFilePath = resolve( + import.meta.dirname, + '..', + '..', + '..', + 'packages', + 'hmr', + 'dist', + 'lib', + 'injections', + 'refresh.js', +); + +const withHMRId = (code: string) => `(function() {let __HMR_ID = 'chrome-extension-hmr';${code}\n})();`; + +const getManifestWithCacheBurst = async () => { + const withCacheBurst = (path: string) => `${path}?${Date.now().toString()}`; + + /** + * In Windows, import() doesn't work without file:// protocol. + * So, we need to convert path to file:// protocol. (url.pathToFileURL) + */ + if (platform === 'win32') { + return (await import(withCacheBurst(pathToFileURL(manifestFile).href))).default; + } else { + return (await import(withCacheBurst(manifestFile))).default; + } +}; + +const addRefreshContentScript = (manifest: ManifestType) => { + manifest.content_scripts = manifest.content_scripts || []; + manifest.content_scripts.push({ + matches: ['http://*/*', 'https://*/*', ''], + js: ['refresh.js'], // for public's HMR(refresh) support + }); +}; + +export default (config: { outDir: string }): PluginOption => { + const makeManifest = (manifest: ManifestType, to: string) => { + if (!existsSync(to)) { + mkdirSync(to); + } + + const manifestPath = resolve(to, 'manifest.json'); + + if (IS_DEV) { + addRefreshContentScript(manifest); + } + + writeFileSync(manifestPath, ManifestParser.convertManifestToString(manifest, IS_FIREFOX)); + + const refreshFileString = readFileSync(refreshFilePath, 'utf-8'); + + if (IS_DEV) { + writeFileSync(resolve(to, 'refresh.js'), withHMRId(refreshFileString)); + } + + colorfulLog(`Manifest file copy complete: ${manifestPath}`, 'success'); + }; + + return { + name: 'make-manifest', + buildStart() { + this.addWatchFile(manifestFile); + }, + async writeBundle() { + const outDir = config.outDir; + const manifest = await getManifestWithCacheBurst(); + makeManifest(manifest, outDir); + }, + }; +}; diff --git a/extension/chrome-extension/vite.config.mts b/extension/chrome-extension/vite.config.mts new file mode 100644 index 0000000..ec3d5e5 --- /dev/null +++ b/extension/chrome-extension/vite.config.mts @@ -0,0 +1,56 @@ +import env, { IS_DEV, IS_PROD } from '@extension/env'; +import { watchPublicPlugin, watchRebuildPlugin } from '@extension/hmr'; +import { watchOption } from '@extension/vite-config'; +import libAssetsPlugin from '@laynezh/vite-plugin-lib-assets'; +import { resolve } from 'node:path'; +import { defineConfig, type PluginOption } from 'vite'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; +import makeManifestPlugin from './utils/plugins/make-manifest-plugin.js'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +const outDir = resolve(rootDir, '..', 'dist'); +export default defineConfig({ + define: { + 'process.env': env, + }, + resolve: { + alias: { + '@root': rootDir, + '@src': srcDir, + '@assets': resolve(srcDir, 'assets'), + }, + }, + plugins: [ + libAssetsPlugin({ + outputPath: outDir, + }) as PluginOption, + watchPublicPlugin(), + makeManifestPlugin({ outDir }), + IS_DEV && watchRebuildPlugin({ reload: true, id: 'chrome-extension-hmr' }), + nodePolyfills(), + ], + publicDir: resolve(rootDir, 'public'), + build: { + outDir, + emptyOutDir: false, + sourcemap: IS_DEV, + minify: IS_PROD, + reportCompressedSize: IS_PROD, + watch: watchOption, + rollupOptions: { + external: ['chrome'], + input: { + background: resolve(srcDir, 'background', 'index.ts'), + popup: resolve(srcDir, 'popup', 'index.tsx'), + content: resolve(srcDir, 'content', 'recorder.ts'), + }, + output: { + entryFileNames: '[name].js', + chunkFileNames: '[name].js', + assetFileNames: '[name].[ext]' + } + }, + }, +}); diff --git a/extension/eslint.config.ts b/extension/eslint.config.ts new file mode 100644 index 0000000..de172c4 --- /dev/null +++ b/extension/eslint.config.ts @@ -0,0 +1,105 @@ +import { fixupConfigRules } from '@eslint/compat'; +import { FlatCompat } from '@eslint/eslintrc'; +import js from '@eslint/js'; +import { flatConfigs as importXFlatConfig } from 'eslint-plugin-import-x'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import reactPlugin from 'eslint-plugin-react'; +import { browser, es2020, node } from 'globals'; +import { config, configs as tsConfigs, parser as tsParser } from 'typescript-eslint'; +import type { FixupConfigArray } from '@eslint/compat'; + +export default config( + // Shared configs + js.configs.recommended, + ...tsConfigs.recommended, + jsxA11y.flatConfigs.recommended, + importXFlatConfig.recommended, + importXFlatConfig.typescript, + eslintPluginPrettierRecommended, + ...fixupConfigRules(new FlatCompat().extends('plugin:react-hooks/recommended') as FixupConfigArray), + { + files: ['**/*.{ts,tsx}'], + ...reactPlugin.configs.flat.recommended, + ...reactPlugin.configs.flat['jsx-runtime'], + }, + // Custom config + { + ignores: ['**/build/**', '**/dist/**', '**/node_modules/**', 'chrome-extension/manifest.js'], + }, + { + files: ['**/*.{ts,tsx}'], + languageOptions: { + parser: tsParser, + ecmaVersion: 'latest', + sourceType: 'module', + parserOptions: { + ecmaFeatures: { jsx: true }, + projectService: true, + }, + globals: { + ...browser, + ...es2020, + ...node, + chrome: 'readonly', + }, + }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'prefer-const': 'error', + 'no-var': 'error', + 'func-style': ['error', 'expression', { allowArrowFunctions: true }], + 'no-restricted-imports': [ + 'error', + { + name: 'type-fest', + message: 'Please import from `@extension/shared` instead of `type-fest`.', + }, + ], + 'arrow-body-style': ['error', 'as-needed'], + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/consistent-type-exports': 'error', + 'import-x/order': [ + 'error', + { + 'newlines-between': 'never', + alphabetize: { order: 'asc', caseInsensitive: true }, + groups: ['index', 'sibling', 'parent', 'internal', 'external', 'builtin', 'object', 'type'], + pathGroups: [ + { + pattern: '@*/**', + group: 'internal', + position: 'before', + }, + ], + pathGroupsExcludedImportTypes: ['type'], + }, + ], + 'import-x/no-unresolved': 'off', + 'import-x/no-named-as-default': 'error', + 'import-x/no-named-as-default-member': 'error', + 'import-x/newline-after-import': 'error', + 'import-x/no-deprecated': 'error', + 'import-x/no-duplicates': ['error', { considerQueryString: true, 'prefer-inline': false }], + 'import-x/consistent-type-specifier-style': 'error', + 'import-x/exports-last': 'error', + 'import-x/first': 'error', + }, + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + // Overrides Rules + { + files: ['**/packages/shared/**/*.ts'], + rules: { + 'no-restricted-imports': 'off', + }, + }, +); diff --git a/extension/package.json b/extension/package.json new file mode 100644 index 0000000..9337fd9 --- /dev/null +++ b/extension/package.json @@ -0,0 +1,105 @@ +{ + "name": "chrome-extension-boilerplate-react-vite", + "version": "0.5.0", + "description": "chrome extension boilerplate", + "license": "MIT", + "private": true, + "sideEffects": false, + "repository": { + "type": "git", + "url": "https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite.git" + }, + "type": "module", + "scripts": { + "clean:bundle": "rimraf dist && turbo clean:bundle", + "clean:node_modules": "pnpx rimraf node_modules && pnpx turbo clean:node_modules", + "clean:turbo": "rimraf .turbo && turbo clean:turbo", + "clean": "pnpm clean:bundle && pnpm clean:turbo && pnpm clean:node_modules", + "clean:install": "pnpm clean:node_modules && pnpm install --frozen-lockfile", + "type-check": "turbo type-check", + "base-build": "pnpm clean:bundle && turbo build", + "build": "pnpm set-global-env && pnpm base-build", + "build:firefox": "pnpm set-global-env CLI_CEB_FIREFOX=true && pnpm base-build", + "base-dev": "pnpm clean:bundle && turbo ready && turbo watch dev", + "dev": "pnpm set-global-env CLI_CEB_DEV=true && pnpm base-dev", + "dev:firefox": "pnpm set-global-env CLI_CEB_DEV=true CLI_CEB_FIREFOX=true && pnpm base-dev", + "zip": "pnpm build && pnpm -F zipper zip", + "zip:firefox": "pnpm build:firefox && pnpm -F zipper zip", + "e2e": "pnpm zip && turbo e2e", + "e2e:firefox": "pnpm zip:firefox && turbo e2e", + "lint": "turbo lint --continue", + "lint:fix": "turbo lint:fix --continue", + "format": "turbo format --continue -- --cache --cache-location node_modules/.cache/.prettiercache", + "prepare": "husky", + "update-version": "bash bash-scripts/update_version.sh", + "copy-env": "bash bash-scripts/copy_env.sh", + "set-global-env": "bash bash-scripts/set_global_env.sh", + "module-manager": "pnpm -F module-manager start", + "postinstall": "pnpm copy-env" + }, + "dependencies": { + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "tailwind-merge": "^3.3.0" + }, + "devDependencies": { + "@eslint/compat": "^1.2.9", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.27.0", + "@types/chrome": "^0.0.323", + "@types/eslint-plugin-jsx-a11y": "^6.10.0", + "@types/node": "^22.15.21", + "@types/react": "^19.1.5", + "@types/react-dom": "^19.1.5", + "@typescript-eslint/parser": "^8.32.1", + "autoprefixer": "^10.4.21", + "cross-env": "^7.0.3", + "deepmerge": "^4.3.1", + "eslint": "^9.27.0", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.3.5", + "eslint-plugin-import-x": "^4.12.2", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-tailwindcss": "^3.18.0", + "fast-glob": "^3.3.3", + "fflate": "^0.8.2", + "globals": "^16.1.0", + "husky": "^9.1.7", + "jiti": "^2.4.2", + "lint-staged": "^16.0.0", + "postcss": "^8.5.3", + "postcss-load-config": "^6.0.1", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "rimraf": "^6.0.1", + "run-script-os": "^1.1.6", + "tailwindcss": "^3.4.17", + "tslib": "^2.8.1", + "tsx": "^4.19.4", + "turbo": "^2.5.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.1", + "vite": "^6.3.5", + "vite-plugin-node-polyfills": "^0.23.0" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "eslint --fix" + ] + }, + "packageManager": "pnpm@10.11.0", + "engines": { + "node": ">=22.15.1" + } +} diff --git a/extension/packages/dev-utils/README.md b/extension/packages/dev-utils/README.md new file mode 100644 index 0000000..e71eba0 --- /dev/null +++ b/extension/packages/dev-utils/README.md @@ -0,0 +1,16 @@ +# Shared Package + +This package contains code which could helps you to develop. +To use the code in the package, you need to add the following to the package.json file. + +```json +{ + "devDependencies": { + "@extension/dev-utils": "workspace:*" + } +} +``` + +## Additional Information + +`lib/shared-types.ts` contains the types from [type-fest](https://github.com/sindresorhus/type-fest?tab=readme-ov-file#install). \ No newline at end of file diff --git a/extension/packages/dev-utils/index.mts b/extension/packages/dev-utils/index.mts new file mode 100644 index 0000000..09c185e --- /dev/null +++ b/extension/packages/dev-utils/index.mts @@ -0,0 +1 @@ +export * from './lib/index.js'; diff --git a/extension/packages/dev-utils/lib/index.ts b/extension/packages/dev-utils/lib/index.ts new file mode 100644 index 0000000..13f4f23 --- /dev/null +++ b/extension/packages/dev-utils/lib/index.ts @@ -0,0 +1,2 @@ +export * from './stream-file-to-zip.js'; +export * from './manifest-parser/index.js'; diff --git a/extension/packages/dev-utils/lib/manifest-parser/impl.ts b/extension/packages/dev-utils/lib/manifest-parser/impl.ts new file mode 100644 index 0000000..9138b1d --- /dev/null +++ b/extension/packages/dev-utils/lib/manifest-parser/impl.ts @@ -0,0 +1,39 @@ +import type { IManifestParser } from './types.js'; +import type { ManifestType } from '@extension/shared'; + +const convertToFirefoxCompatibleManifest = (manifest: ManifestType) => { + const manifestCopy = { + ...manifest, + } as { [key: string]: unknown }; + + if (manifest.background?.service_worker) { + manifestCopy.background = { + scripts: [manifest.background.service_worker], + type: 'module', + }; + } + if (manifest.options_page) { + manifestCopy.options_ui = { + page: manifest.options_page, + browser_style: false, + }; + } + manifestCopy.content_security_policy = { + extension_pages: "script-src 'self'; object-src 'self'", + }; + manifestCopy.permissions = (manifestCopy.permissions as string[]).filter(value => value !== 'sidePanel'); + + delete manifestCopy.options_page; + delete manifestCopy.side_panel; + return manifestCopy as ManifestType; +}; + +export const ManifestParserImpl: IManifestParser = { + convertManifestToString: (manifest, isFirefox) => { + if (isFirefox) { + manifest = convertToFirefoxCompatibleManifest(manifest); + } + + return JSON.stringify(manifest, null, 2); + }, +}; diff --git a/extension/packages/dev-utils/lib/manifest-parser/index.ts b/extension/packages/dev-utils/lib/manifest-parser/index.ts new file mode 100644 index 0000000..f1f5818 --- /dev/null +++ b/extension/packages/dev-utils/lib/manifest-parser/index.ts @@ -0,0 +1,4 @@ +import { ManifestParserImpl } from './impl.js'; + +export type * from './types.js'; +export const ManifestParser = ManifestParserImpl; diff --git a/extension/packages/dev-utils/lib/manifest-parser/types.ts b/extension/packages/dev-utils/lib/manifest-parser/types.ts new file mode 100644 index 0000000..27464bf --- /dev/null +++ b/extension/packages/dev-utils/lib/manifest-parser/types.ts @@ -0,0 +1,5 @@ +import type { ManifestType } from '@extension/shared'; + +export interface IManifestParser { + convertManifestToString: (manifest: ManifestType, isFirefox: boolean) => string; +} diff --git a/extension/packages/dev-utils/lib/stream-file-to-zip.ts b/extension/packages/dev-utils/lib/stream-file-to-zip.ts new file mode 100644 index 0000000..80a6a36 --- /dev/null +++ b/extension/packages/dev-utils/lib/stream-file-to-zip.ts @@ -0,0 +1,24 @@ +import { AsyncZipDeflate } from 'fflate'; +import { createReadStream } from 'node:fs'; +import type { Zip } from 'fflate'; + +export const streamFileToZip = ( + absPath: string, + relPath: string, + zip: Zip, + onAbort: () => void, + onError: (error: Error) => void, +): void => { + const data = new AsyncZipDeflate(relPath, { level: 1 }); + void zip.add(data); + + createReadStream(absPath) + .on('data', (chunk: string | Buffer) => + typeof chunk === 'string' ? data.push(Buffer.from(chunk), false) : data.push(chunk, false), + ) + .on('end', () => data.push(new Uint8Array(0), true)) + .on('error', error => { + onAbort(); + onError(error); + }); +}; diff --git a/extension/packages/dev-utils/package.json b/extension/packages/dev-utils/package.json new file mode 100644 index 0000000..69fb5d2 --- /dev/null +++ b/extension/packages/dev-utils/package.json @@ -0,0 +1,29 @@ +{ + "name": "@extension/dev-utils", + "version": "0.5.0", + "description": "chrome extension - dev utils", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit", + "postinstall": "pnpm ready" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*", + "@extension/shared": "workspace:*" + } +} diff --git a/extension/packages/dev-utils/tsconfig.json b/extension/packages/dev-utils/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/dev-utils/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/packages/env/README.md b/extension/packages/env/README.md new file mode 100644 index 0000000..9b146a2 --- /dev/null +++ b/extension/packages/env/README.md @@ -0,0 +1,31 @@ +# Environment Package + +This package contains code which creates env values. +To use the code in the package, you need to follow those steps: + +1. Add a new record to `.env` (NEED TO CONTAIN `CEB_` PREFIX), + + - If you want via cli: + - Add it as argument like: `pnpm set-global-env CLI_CEB_NEXT_VALUE=new_data ...` (NEED TO CONTAIN `CLI_CEB_` PREFIX) + + > [!IMPORTANT] + > `CLI_CEB_DEV` and `CLI_CEB_FIREFOX` are `false` by default \ + > All CLI values are overwriting in each call, that's mean you'll have access to values from current script run only. + + - If you want dynamic variables go to `lib/index.ts` and edit `dynamicEnvValues` object. + +2. Use it, for example: + ```ts + console.log(process.env['CEB_EXAMPLE']); + ``` + or + ```ts + console.log(process.env.CEB_EXAMPLE); + ``` + but with first solution, autofill should work for IDE: + ![img.png](use-env-example.png) +3. You are also able to import const like `IS_DEV` from `@extension/env` like: + ```ts + import { IS_DEV } from '@extension/env'; + ``` + For more look [ENV CONST](lib/const.ts) \ No newline at end of file diff --git a/extension/packages/env/index.mts b/extension/packages/env/index.mts new file mode 100644 index 0000000..3517e93 --- /dev/null +++ b/extension/packages/env/index.mts @@ -0,0 +1,9 @@ +import { baseEnv, dynamicEnvValues } from './lib/index.js'; +import type { EnvType } from './lib/types.js'; + +export * from './lib/index.js'; + +export default { + ...baseEnv, + ...dynamicEnvValues, +} as EnvType; diff --git a/extension/packages/env/lib/config.ts b/extension/packages/env/lib/config.ts new file mode 100644 index 0000000..3e41c8a --- /dev/null +++ b/extension/packages/env/lib/config.ts @@ -0,0 +1,10 @@ +import { config } from '@dotenvx/dotenvx'; + +export const baseEnv = + config({ + path: `${import.meta.dirname}/../../../../.env`, + }).parsed ?? {}; + +export const dynamicEnvValues = { + CEB_NODE_ENV: baseEnv.CEB_DEV === 'true' ? 'development' : 'production', +} as const; diff --git a/extension/packages/env/lib/const.ts b/extension/packages/env/lib/const.ts new file mode 100644 index 0000000..25650dc --- /dev/null +++ b/extension/packages/env/lib/const.ts @@ -0,0 +1,4 @@ +export const IS_DEV = process.env['CLI_CEB_DEV'] === 'true'; +export const IS_PROD = !IS_DEV; +export const IS_FIREFOX = process.env['CLI_CEB_FIREFOX'] === 'true'; +export const IS_CI = process.env['CEB_CI'] === 'true'; diff --git a/extension/packages/env/lib/index.ts b/extension/packages/env/lib/index.ts new file mode 100644 index 0000000..6674220 --- /dev/null +++ b/extension/packages/env/lib/index.ts @@ -0,0 +1,2 @@ +export * from './config.js'; +export * from './const.js'; diff --git a/extension/packages/env/lib/types.ts b/extension/packages/env/lib/types.ts new file mode 100644 index 0000000..919f80b --- /dev/null +++ b/extension/packages/env/lib/types.ts @@ -0,0 +1,13 @@ +import type { dynamicEnvValues } from './index.js'; + +interface ICebEnv { + readonly CEB_EXAMPLE: string; + readonly CEB_DEV_LOCALE: string; +} + +interface ICebCliEnv { + readonly CLI_CEB_DEV: string; + readonly CLI_CEB_FIREFOX: string; +} + +export type EnvType = ICebEnv & ICebCliEnv & typeof dynamicEnvValues; diff --git a/extension/packages/env/package.json b/extension/packages/env/package.json new file mode 100644 index 0000000..42bbc9b --- /dev/null +++ b/extension/packages/env/package.json @@ -0,0 +1,30 @@ +{ + "name": "@extension/env", + "version": "0.5.0", + "description": "chrome extension - environment variables", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@dotenvx/dotenvx": "^1.44.1" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*" + } +} diff --git a/extension/packages/env/tsconfig.json b/extension/packages/env/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/env/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/packages/env/use-env-example.png b/extension/packages/env/use-env-example.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e080f8d3b44944f383fdf670178dc54ecc0d02 GIT binary patch literal 42432 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 void }) => { + const ws = new WebSocket(LOCAL_RELOAD_SOCKET_URL); + + ws.onopen = () => { + ws.addEventListener('message', event => { + const message = MessageInterpreter.receive(String(event.data)); + + if (message.type === DO_UPDATE && message.id === id) { + onUpdate(); + ws.send(MessageInterpreter.send({ type: DONE_UPDATE })); + } + }); + }; +}; diff --git a/extension/packages/hmr/lib/initializers/init-reload-server.ts b/extension/packages/hmr/lib/initializers/init-reload-server.ts new file mode 100644 index 0000000..4df256a --- /dev/null +++ b/extension/packages/hmr/lib/initializers/init-reload-server.ts @@ -0,0 +1,53 @@ +import { + BUILD_COMPLETE, + DO_UPDATE, + DONE_UPDATE, + LOCAL_RELOAD_SOCKET_PORT, + LOCAL_RELOAD_SOCKET_URL, +} from '../consts.js'; +import MessageInterpreter from '../interpreter/index.js'; +import { WebSocketServer } from 'ws'; +import type { WebSocket } from 'ws'; + +const clientsThatNeedToUpdate: Set = new Set(); + +(() => { + const wss = new WebSocketServer({ port: LOCAL_RELOAD_SOCKET_PORT }); + + wss.on('listening', () => { + console.log(`[HMR] Server listening at ${LOCAL_RELOAD_SOCKET_URL}`); + }); + + wss.on('connection', ws => { + clientsThatNeedToUpdate.add(ws); + + ws.addEventListener('close', () => { + clientsThatNeedToUpdate.delete(ws); + }); + + ws.addEventListener('message', event => { + if (typeof event.data !== 'string') return; + + const message = MessageInterpreter.receive(event.data); + + if (message.type === DONE_UPDATE) { + ws.close(); + } + + if (message.type === BUILD_COMPLETE) { + clientsThatNeedToUpdate.forEach((ws: WebSocket) => + ws.send(MessageInterpreter.send({ type: DO_UPDATE, id: message.id })), + ); + } + }); + }); + + wss.on('error', (error: Error & { code: string }) => { + if (error.code === 'EADDRINUSE') { + console.info(`[HMR] Server already running at ${LOCAL_RELOAD_SOCKET_URL}, skipping reload server initialization`); + } else { + console.error(`[HMR] Failed to start server at ${LOCAL_RELOAD_SOCKET_URL}`); + throw error; + } + }); +})(); diff --git a/extension/packages/hmr/lib/injections/refresh.ts b/extension/packages/hmr/lib/injections/refresh.ts new file mode 100644 index 0000000..2096ec3 --- /dev/null +++ b/extension/packages/hmr/lib/injections/refresh.ts @@ -0,0 +1,33 @@ +import initClient from '../initializers/init-client.js'; + +(() => { + let pendingReload = false; + + initClient({ + // @ts-expect-error That's because of the dynamic code loading + id: __HMR_ID, + onUpdate: () => { + // disable reload when tab is hidden + if (document.hidden) { + pendingReload = true; + return; + } + reload(); + }, + }); + + // reload + const reload = (): void => { + pendingReload = false; + window.location.reload(); + }; + + // reload when tab is visible + const reloadWhenTabIsVisible = (): void => { + if (!document.hidden && pendingReload) { + reload(); + } + }; + + document.addEventListener('visibilitychange', reloadWhenTabIsVisible); +})(); diff --git a/extension/packages/hmr/lib/injections/reload.ts b/extension/packages/hmr/lib/injections/reload.ts new file mode 100644 index 0000000..d342ce1 --- /dev/null +++ b/extension/packages/hmr/lib/injections/reload.ts @@ -0,0 +1,13 @@ +import initClient from '../initializers/init-client.js'; + +(() => { + const reload = () => { + chrome.runtime.reload(); + }; + + initClient({ + // @ts-expect-error That's because of the dynamic code loading + id: __HMR_ID, + onUpdate: reload, + }); +})(); diff --git a/extension/packages/hmr/lib/interpreter/index.ts b/extension/packages/hmr/lib/interpreter/index.ts new file mode 100644 index 0000000..9273357 --- /dev/null +++ b/extension/packages/hmr/lib/interpreter/index.ts @@ -0,0 +1,6 @@ +import type { WebSocketMessageType } from '../types.js'; + +export default { + send: (message: WebSocketMessageType): string => JSON.stringify(message), + receive: (serializedMessage: string): WebSocketMessageType => JSON.parse(serializedMessage), +}; diff --git a/extension/packages/hmr/lib/plugins/index.ts b/extension/packages/hmr/lib/plugins/index.ts new file mode 100644 index 0000000..4d24e8d --- /dev/null +++ b/extension/packages/hmr/lib/plugins/index.ts @@ -0,0 +1,3 @@ +export * from './watch-rebuild-plugin.js'; +export * from './watch-public-plugin.js'; +export * from './make-entry-point-plugin.js'; diff --git a/extension/packages/hmr/lib/plugins/make-entry-point-plugin.ts b/extension/packages/hmr/lib/plugins/make-entry-point-plugin.ts new file mode 100644 index 0000000..a57dccb --- /dev/null +++ b/extension/packages/hmr/lib/plugins/make-entry-point-plugin.ts @@ -0,0 +1,73 @@ +import { IS_FIREFOX } from '@extension/env'; +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { basename, resolve, sep } from 'node:path'; +import type { PluginOption } from 'vite'; + +/** + * Extract content directory from output directory for Firefox + * @param outputDir + */ +const extractContentDir = (outputDir: string) => { + const parts = outputDir.split(sep); + const distIndex = parts.indexOf('dist'); + + if (distIndex !== -1 && distIndex < parts.length - 1) { + return parts.slice(distIndex + 1); + } + + throw new Error('Output directory does not contain "dist"'); +}; + +const safeWriteFileSync = (path: string, data: string) => { + const folder = path.split(sep).slice(0, -1).join(sep); + + if (!existsSync(folder)) { + mkdirSync(folder, { recursive: true }); + } + writeFileSync(path, data); +}; + +/** + * Make an entry point file for content script cache busting + */ +export const makeEntryPointPlugin = (): PluginOption => ({ + name: 'make-entry-point-plugin', + generateBundle(options, bundle) { + const outputDir = options.dir; + + if (!outputDir) { + throw new Error('Output directory not found'); + } + + for (const module of Object.values(bundle)) { + const fileName = module.fileName; + const newFileName = fileName.replace('.js', '_dev.js'); + + switch (module.type) { + case 'asset': + if (fileName.endsWith('.map')) { + const originalFileName = fileName.replace('.map', ''); + const replacedSource = String(module.source).replaceAll(originalFileName, newFileName); + + module.source = ''; + safeWriteFileSync(resolve(outputDir, newFileName), replacedSource); + break; + } + break; + + case 'chunk': { + safeWriteFileSync(resolve(outputDir, newFileName), module.code); + const newFileNameBase = basename(newFileName); + + if (IS_FIREFOX) { + const contentDirectory = extractContentDir(outputDir); + module.code = `import(browser.runtime.getURL("${contentDirectory}/${newFileNameBase}"));`; + } else { + module.code = `import('./${newFileNameBase}');`; + } + break; + } + } + } + }, +}); diff --git a/extension/packages/hmr/lib/plugins/watch-public-plugin.ts b/extension/packages/hmr/lib/plugins/watch-public-plugin.ts new file mode 100644 index 0000000..7a33685 --- /dev/null +++ b/extension/packages/hmr/lib/plugins/watch-public-plugin.ts @@ -0,0 +1,13 @@ +import fg from 'fast-glob'; +import type { PluginOption } from 'vite'; + +export const watchPublicPlugin = (): PluginOption => ({ + name: 'watch-public-plugin', + async buildStart() { + const files = await fg(['public/**/*']); + + for (const file of files) { + this.addWatchFile(file); + } + }, +}); diff --git a/extension/packages/hmr/lib/plugins/watch-rebuild-plugin.ts b/extension/packages/hmr/lib/plugins/watch-rebuild-plugin.ts new file mode 100644 index 0000000..0e80383 --- /dev/null +++ b/extension/packages/hmr/lib/plugins/watch-rebuild-plugin.ts @@ -0,0 +1,68 @@ +import { BUILD_COMPLETE, LOCAL_RELOAD_SOCKET_URL } from '../consts.js'; +import MessageInterpreter from '../interpreter/index.js'; +import { WebSocket } from 'ws'; +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { PluginConfigType } from '../types.js'; +import type { PluginOption } from 'vite'; + +const injectionsPath = resolve(import.meta.dirname, '..', 'injections'); + +const refreshCode = readFileSync(resolve(injectionsPath, 'refresh.js'), 'utf-8'); +const reloadCode = readFileSync(resolve(injectionsPath, 'reload.js'), 'utf-8'); + +export const watchRebuildPlugin = (config: PluginConfigType): PluginOption => { + const { refresh, reload, id: _id, onStart } = config; + const hmrCode = (refresh ? refreshCode : '') + (reload ? reloadCode : ''); + + let ws: WebSocket | null = null; + + const id = _id ?? Math.random().toString(36); + let reconnectTries = 0; + + const initializeWebSocket = () => { + ws = new WebSocket(LOCAL_RELOAD_SOCKET_URL); + + ws.onopen = () => { + console.log(`[HMR] Connected to dev-server at ${LOCAL_RELOAD_SOCKET_URL}`); + }; + + ws.onerror = () => { + console.error(`[HMR] Failed to connect server at ${LOCAL_RELOAD_SOCKET_URL}`); + console.warn('Retrying in 3 seconds...'); + ws = null; + + if (reconnectTries <= 2) { + setTimeout(() => { + reconnectTries++; + initializeWebSocket(); + }, 3_000); + } else { + console.error(`[HMR] Cannot establish connection to server at ${LOCAL_RELOAD_SOCKET_URL}`); + } + }; + }; + + return { + name: 'watch-rebuild', + closeBundle() { + onStart?.(); + if (!ws) { + initializeWebSocket(); + return; + } + /** + * When the build is complete, send a message to the reload server. + * The reload server will send a message to the client to reload or refresh the extension. + */ + ws.send(MessageInterpreter.send({ type: BUILD_COMPLETE, id })); + }, + generateBundle(_options, bundle) { + for (const module of Object.values(bundle)) { + if (module.type === 'chunk') { + module.code = `(function() {let __HMR_ID = "${id}";\n` + hmrCode + '\n' + '})();' + '\n' + module.code; + } + } + }, + }; +}; diff --git a/extension/packages/hmr/lib/types.ts b/extension/packages/hmr/lib/types.ts new file mode 100644 index 0000000..c8eeae1 --- /dev/null +++ b/extension/packages/hmr/lib/types.ts @@ -0,0 +1,18 @@ +import type { BUILD_COMPLETE, DO_UPDATE, DONE_UPDATE } from './consts.js'; + +type UpdateRequestMessageType = { + type: typeof DO_UPDATE; + id: string; +}; + +type UpdateCompleteMessageType = { type: typeof DONE_UPDATE }; +type BuildCompletionMessageType = { type: typeof BUILD_COMPLETE; id: string }; + +export type WebSocketMessageType = UpdateCompleteMessageType | UpdateRequestMessageType | BuildCompletionMessageType; + +export type PluginConfigType = { + onStart?: () => void; + reload?: boolean; + refresh?: boolean; + id?: string; +}; diff --git a/extension/packages/hmr/package.json b/extension/packages/hmr/package.json new file mode 100644 index 0000000..c9789d9 --- /dev/null +++ b/extension/packages/hmr/package.json @@ -0,0 +1,36 @@ +{ + "name": "@extension/hmr", + "version": "0.5.0", + "description": "chrome extension - hot module reload/refresh", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist && pnpx rimraf build", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b && rollup --config dist/rollup.config.js", + "dev": "tsx lib/initializers/init-reload-server.ts", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@extension/env": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@rollup/plugin-sucrase": "^5.0.2", + "@types/ws": "^8.18.1", + "esbuild": "^0.25.4", + "esm": "^3.2.25", + "rollup": "^4.41.0", + "ts-node": "^10.9.2", + "ws": "^8.18.2" + } +} diff --git a/extension/packages/hmr/rollup.config.ts b/extension/packages/hmr/rollup.config.ts new file mode 100644 index 0000000..cb9f006 --- /dev/null +++ b/extension/packages/hmr/rollup.config.ts @@ -0,0 +1,29 @@ +import sucrase from '@rollup/plugin-sucrase'; +import type { Plugin, RollupOptions } from 'rollup'; + +const plugins = [ + // @ts-expect-error Because of the lack of calling signature + sucrase({ + exclude: ['node_modules/**'], + transforms: ['typescript'], + }), +] satisfies Plugin[]; + +export default [ + { + plugins, + input: 'lib/injections/reload.ts', + output: { + format: 'esm', + file: 'dist/lib/injections/reload.js', + }, + }, + { + plugins, + input: 'lib/injections/refresh.ts', + output: { + format: 'esm', + file: 'dist/lib/injections/refresh.js', + }, + }, +] satisfies RollupOptions[]; diff --git a/extension/packages/hmr/tsconfig.json b/extension/packages/hmr/tsconfig.json new file mode 100644 index 0000000..a8fd99f --- /dev/null +++ b/extension/packages/hmr/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "outDir": "dist", + "baseUrl": ".", + "types": ["chrome", "node"] + }, + "include": ["index.mts", "rollup.config.ts", "lib"] +} diff --git a/extension/packages/i18n/.gitignore b/extension/packages/i18n/.gitignore new file mode 100644 index 0000000..a1f12c3 --- /dev/null +++ b/extension/packages/i18n/.gitignore @@ -0,0 +1 @@ +lib/i18n.ts \ No newline at end of file diff --git a/extension/packages/i18n/README.md b/extension/packages/i18n/README.md new file mode 100644 index 0000000..e6f654c --- /dev/null +++ b/extension/packages/i18n/README.md @@ -0,0 +1,173 @@ +# I18n Package + +This package provides a set of tools to help you internationalize your Chrome Extension. + +https://developer.chrome.com/docs/extensions/reference/api/i18n + +## Installation + +If you want to use the i18n translation function in each pages, you need to add the following to the package.json file. + +```json +{ + "dependencies": { + "@extension/i18n": "workspace:*" + } +} +``` + +Then run the following command to install the package. + +```bash +pnpm install +``` + +## Manage translations + +You can manage translations in the `locales` directory. + +`locales/en/messages.json` + +```json +{ + "helloWorld": { + "message": "Hello, World!" + } +} +``` + +`locales/ko/messages.json` + +```json +{ + "helloWorld": { + "message": "안녕하세요, 여러분!" + } +} +``` + +## Add a new language + +Create folder inside `locales` with name from [languages](https://developer.chrome.com/docs/extensions/reference/api/i18n?hl=pl#support_multiple_languages), which need include `message.json` file. + +## Usage + +### Translation function + +Just import the `t` function and use it to translate the key. + +```typescript +import { t } from '@extension/i18n'; + +console.log(t('loading')); // Loading... +``` + +```typescript jsx +import { t } from '@extension/i18n'; + +const Component = () => { + return ( + + ); +}; +``` + +### Placeholders + +If you want to use placeholders, you can use the following format. + +> For more information, see the [Message Placeholders](https://developer.chrome.com/docs/extensions/how-to/ui/localization-message-formats#placeholders) section. + +`locales/en/messages.json` + +```json +{ + "greeting": { + "description": "Greeting message", + "message": "Hello, My name is $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "John Doe" + } + } + }, + "hello": { + "description": "Placeholder example", + "message": "Hello $1" + } +} +``` + +`locales/ko/messages.json` + +```json +{ + "greeting": { + "description": "인사 메시지", + "message": "안녕하세요, 제 이름은 $NAME$입니다.", + "placeholders": { + "name": { + "content": "$1", + "example": "서종학" + } + } + }, + "hello": { + "description": "Placeholder 예시", + "message": "안녕 $1" + } +} +``` + +If you want to replace the placeholder, you can pass the value as the second argument. + +Function `t` has exactly the same interface as the `chrome.i18n.getMessage` function. + +```typescript +import { t } from '@extension/i18n'; + +console.log(t('greeting', 'John Doe')); // Hello, My name is John Doe +console.log(t('greeting', ['John Doe'])); // Hello, My name is John Doe + +console.log(t('hello')); // Hello +console.log(t('hello', 'World')); // Hello World +console.log(t('hello', ['World'])); // Hello World +``` + +### Locale setting on development + +If you want to enforce displaying specific language, you need to set `CEB_DEV_LOCALE` in `.env` file (work only for development). + +### Type Safety + +When you forget to add a key to all language's `messages.json` files, you will get a Typescript error. + +`locales/en/messages.json` + +```json +{ + "hello": { + "message": "Hello World!" + } +} +``` + +`locales/ko/messages.json` + +```json +{ + "helloWorld": { + "message": "안녕하세요, 여러분!" + } +} +``` + +```typescript +import { t } from '@extension/i18n'; + +// Error: TS2345: Argument of type "hello" is not assignable to parameter of type +console.log(t('hello')); +``` diff --git a/extension/packages/i18n/index.mts b/extension/packages/i18n/index.mts new file mode 100644 index 0000000..09c185e --- /dev/null +++ b/extension/packages/i18n/index.mts @@ -0,0 +1 @@ +export * from './lib/index.js'; diff --git a/extension/packages/i18n/lib/consts.ts b/extension/packages/i18n/lib/consts.ts new file mode 100644 index 0000000..5db4bd9 --- /dev/null +++ b/extension/packages/i18n/lib/consts.ts @@ -0,0 +1,62 @@ +/** + * @url https://developer.chrome.com/docs/extensions/reference/api/i18n#support_multiple_languages + */ +export const SUPPORTED_LANGUAGES = { + ar: 'Arabic', + am: 'Amharic', + bg: 'Bulgarian', + bn: 'Bengali', + ca: 'Catalan', + cs: 'Czech', + da: 'Danish', + de: 'German', + el: 'Greek', + en: 'English', + en_AU: 'English (Australia)', + en_GB: 'English (Great Britain)', + en_US: 'English (USA)', + es: 'Spanish', + es_419: 'Spanish (Latin America and Caribbean)', + et: 'Estonian', + fa: 'Persian', + fi: 'Finnish', + fil: 'Filipino', + fr: 'French', + gu: 'Gujarati', + he: 'Hebrew', + hi: 'Hindi', + hr: 'Croatian', + hu: 'Hungarian', + id: 'Indonesian', + it: 'Italian', + ja: 'Japanese', + kn: 'Kannada', + ko: 'Korean', + lt: 'Lithuanian', + lv: 'Latvian', + ml: 'Malayalam', + mr: 'Marathi', + ms: 'Malay', + nl: 'Dutch', + no: 'Norwegian', + pl: 'Polish', + pt_BR: 'Portuguese (Brazil)', + pt_PT: 'Portuguese (Portugal)', + ro: 'Romanian', + ru: 'Russian', + sk: 'Slovak', + sl: 'Slovenian', + sr: 'Serbian', + sv: 'Swedish', + sw: 'Swahili', + ta: 'Tamil', + te: 'Telugu', + th: 'Thai', + tr: 'Turkish', + uk: 'Ukrainian', + vi: 'Vietnamese', + zh_CN: 'Chinese (China)', + zh_TW: 'Chinese (Taiwan)', +} as const; + +export const I18N_FILE_PATH = './lib/i18n.ts'; diff --git a/extension/packages/i18n/lib/i18n-dev.ts b/extension/packages/i18n/lib/i18n-dev.ts new file mode 100644 index 0000000..7fa8caf --- /dev/null +++ b/extension/packages/i18n/lib/i18n-dev.ts @@ -0,0 +1,34 @@ +// IT WILL BE ADJUSTED TO YOUR LANGUAGE DURING BUILD TIME, DON'T MOVE BELOW IMPORT TO OTHER LINE +import localeJSON from '../locales/en/messages.json' with { type: 'json' }; +import type { I18nValueType, LocalesJSONType } from './types.js'; + +const translate = (key: keyof LocalesJSONType, substitutions?: string | string[]) => { + const localeValues = localeJSON[key] as I18nValueType; + let message = localeValues.message; + /** + * This is a placeholder replacement logic. But it's not perfect. + * It just imitates the behavior of the Chrome extension i18n API. + * Please check the official document for more information And double-check the behavior on production build. + * + * @url https://developer.chrome.com/docs/extensions/how-to/ui/localization-message-formats#placeholders + */ + if (localeValues.placeholders) { + Object.entries(localeValues.placeholders).forEach(([key, { content }]) => { + if (content) { + message = message.replace(new RegExp(`\\$${key}\\$`, 'gi'), content); + } + }); + } + + if (!substitutions) { + return message; + } else if (Array.isArray(substitutions)) { + return substitutions.reduce((acc, cur, idx) => acc.replace(`$${idx++}`, cur), message); + } + + return message.replace(/\$(\d+)/, substitutions); +}; + +const removePlaceholder = (message: string) => message.replace(/\$\d+/g, ''); + +export const t = (...args: Parameters) => removePlaceholder(translate(...args)); diff --git a/extension/packages/i18n/lib/i18n-prod.ts b/extension/packages/i18n/lib/i18n-prod.ts new file mode 100644 index 0000000..958b2ee --- /dev/null +++ b/extension/packages/i18n/lib/i18n-prod.ts @@ -0,0 +1,3 @@ +import type { MessageKeyType } from './types.js'; + +export const t = (key: MessageKeyType, substitutions?: string | string[]) => chrome.i18n.getMessage(key, substitutions); diff --git a/extension/packages/i18n/lib/index.ts b/extension/packages/i18n/lib/index.ts new file mode 100644 index 0000000..b6f9a1d --- /dev/null +++ b/extension/packages/i18n/lib/index.ts @@ -0,0 +1,4 @@ +import { t as t_dev_or_prod } from './i18n.js'; +import type { t as t_dev } from './i18n-dev.js'; + +export const t = t_dev_or_prod as unknown as typeof t_dev; diff --git a/extension/packages/i18n/lib/prepare-build.ts b/extension/packages/i18n/lib/prepare-build.ts new file mode 100644 index 0000000..641bb88 --- /dev/null +++ b/extension/packages/i18n/lib/prepare-build.ts @@ -0,0 +1,22 @@ +import setRelatedLocaleImports from './set-related-locale-import.js'; +import { IS_DEV } from '@extension/env'; +import { cpSync, existsSync, mkdirSync } from 'node:fs'; +import { resolve } from 'node:path'; + +(() => { + const i18nPath = IS_DEV ? 'lib/i18n-dev.ts' : 'lib/i18n-prod.ts'; + cpSync(i18nPath, resolve('lib', 'i18n.ts')); + + const outDir = resolve(import.meta.dirname, '..', '..', '..', '..', 'dist'); + if (!existsSync(outDir)) { + mkdirSync(outDir); + } + + const localePath = resolve(outDir, '_locales'); + cpSync(resolve('locales'), localePath, { recursive: true }); + + if (IS_DEV) { + setRelatedLocaleImports(); + } + console.log('I18n build complete'); +})(); diff --git a/extension/packages/i18n/lib/set-related-locale-import.ts b/extension/packages/i18n/lib/set-related-locale-import.ts new file mode 100644 index 0000000..c4214c5 --- /dev/null +++ b/extension/packages/i18n/lib/set-related-locale-import.ts @@ -0,0 +1,38 @@ +import { I18N_FILE_PATH } from './consts.js'; +import { lstatSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { SupportedLanguagesKeysType, SupportedLanguagesWithoutRegionKeysType } from './types.js'; + +export default () => { + const locale = Intl.DateTimeFormat().resolvedOptions().locale.replace('-', '_') as SupportedLanguagesKeysType; + const localeWithoutRegion = locale.split('_')[0] as SupportedLanguagesWithoutRegionKeysType; + + const localesDir = resolve(import.meta.dirname, '..', '..', 'locales'); + const readLocalesFolder = readdirSync(localesDir); + + const implementedLocales = readLocalesFolder.map(innerDir => { + if (lstatSync(resolve(localesDir, innerDir)).isDirectory()) { + return innerDir; + } + return; + }); + + const i18nFileSplitContent = readFileSync(I18N_FILE_PATH, 'utf-8').split('\n'); + + if (process.env['CEB_DEV_LOCALE']) { + i18nFileSplitContent[1] = `import localeJSON from '../locales/${process.env['CEB_DEV_LOCALE']}/messages.json' with { type: 'json' };`; + } else { + if (implementedLocales.includes(locale)) { + i18nFileSplitContent[1] = `import localeJSON from '../locales/${locale}/messages.json' with { type: 'json' };`; + } else if (implementedLocales.includes(localeWithoutRegion)) { + i18nFileSplitContent[1] = `import localeJSON from '../locales/${localeWithoutRegion}/messages.json' with { type: 'json' };`; + } else { + i18nFileSplitContent[1] = `import localeJSON from '../locales/en/messages.json' with { type: 'json' };`; + } + } + + // Join lines back together + const updatedI18nFile = i18nFileSplitContent.join('\n'); + + writeFileSync(I18N_FILE_PATH, updatedI18nFile, 'utf-8'); +}; diff --git a/extension/packages/i18n/lib/types.ts b/extension/packages/i18n/lib/types.ts new file mode 100644 index 0000000..886b4cc --- /dev/null +++ b/extension/packages/i18n/lib/types.ts @@ -0,0 +1,12 @@ +import enMessage from '../locales/en/messages.json' with { type: 'json' }; +import type { SUPPORTED_LANGUAGES } from './consts.js'; + +export type SupportedLanguagesKeysType = keyof typeof SUPPORTED_LANGUAGES; +export type SupportedLanguagesWithoutRegionKeysType = Exclude; +export type I18nValueType = { + message: string; + placeholders?: Record; +}; + +export type MessageKeyType = keyof typeof enMessage; +export type LocalesJSONType = typeof enMessage; diff --git a/extension/packages/i18n/locales/en/messages.json b/extension/packages/i18n/locales/en/messages.json new file mode 100644 index 0000000..39f24af --- /dev/null +++ b/extension/packages/i18n/locales/en/messages.json @@ -0,0 +1,45 @@ +{ + "extensionDescription": { + "description": "Extension description", + "message": "Record browser interactions for automated testing with Orca" + }, + "extensionName": { + "description": "Extension name", + "message": "Orca Test Recorder" + }, + "toggleTheme": { + "message": "Toggle theme" + }, + "injectButton": { + "message": "Click to inject Content Scripts" + }, + "greeting": { + "description": "Greeting message", + "message": "Hello, My name is $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "John Doe" + } + } + }, + "hello": { + "description": "Placeholder example", + "message": "Hello $1" + }, + "displayErrorInfo": { + "message": "Error occur" + }, + "displayErrorDescription": { + "message": "Sorry, something went wrong while loading the page." + }, + "displayErrorDetailsInfo": { + "message": "Error details:" + }, + "displayErrorUnknownErrorInfo": { + "message": "Unknown error" + }, + "displayErrorReset": { + "message": "Run Again" + } +} diff --git a/extension/packages/i18n/locales/ko/messages.json b/extension/packages/i18n/locales/ko/messages.json new file mode 100644 index 0000000..63ae518 --- /dev/null +++ b/extension/packages/i18n/locales/ko/messages.json @@ -0,0 +1,45 @@ +{ + "extensionDescription": { + "description": "Extension description", + "message": "Orca 자동 테스트를 위한 브라우저 상호작용 기록 도구" + }, + "extensionName": { + "description": "Extension name", + "message": "Orca 테스트 레코더" + }, + "toggleTheme": { + "message": "테마 변경" + }, + "injectButton": { + "message": "콘텐츠 스크립트를 삽입하려면 클릭하세요." + }, + "greeting": { + "description": "인사 메시지", + "message": "안녕하세요, 제 이름은 $NAME$입니다.", + "placeholders": { + "name": { + "content": "$1", + "example": "홍길동" + } + } + }, + "hello": { + "description": "Placeholder 예시", + "message": "안녕하세요, $1님." + }, + "displayErrorInfo": { + "message": "오류 발생" + }, + "displayErrorDescription": { + "message": "죄송합니다. 페이지를 로드하는 중 문제가 발생했습니다." + }, + "displayErrorDetailsInfo": { + "message": "오류 세부 정보:" + }, + "displayErrorUnknownErrorInfo": { + "message": "알 수 없는 오류" + }, + "displayErrorReset": { + "message": "다시 실행합니다." + } +} diff --git a/extension/packages/i18n/package.json b/extension/packages/i18n/package.json new file mode 100644 index 0000000..f6edad2 --- /dev/null +++ b/extension/packages/i18n/package.json @@ -0,0 +1,30 @@ +{ + "name": "@extension/i18n", + "version": "0.5.0", + "description": "chrome extension - internationalization", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "main": "dist/index.mjs", + "types": "index.mts", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b prepare-build.tsconfig.json && node --env-file=../../.env dist/lib/prepare-build.js && tsc -b", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/env": "workspace:*" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*" + } +} diff --git a/extension/packages/i18n/prepare-build.tsconfig.json b/extension/packages/i18n/prepare-build.tsconfig.json new file mode 100644 index 0000000..4094a3c --- /dev/null +++ b/extension/packages/i18n/prepare-build.tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["lib/prepare-build.ts"] +} diff --git a/extension/packages/i18n/tsconfig.json b/extension/packages/i18n/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/i18n/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/packages/module-manager/README.md b/extension/packages/module-manager/README.md new file mode 100644 index 0000000..26ace83 --- /dev/null +++ b/extension/packages/module-manager/README.md @@ -0,0 +1,64 @@ +# Module manager + +Module manager is a tool to manage modules in a project. It can be used to delete or recover some pages. + +## Usage + +### On Root + +```bash +$ pnpm module-manager +``` + +OR + +```bash +pnpm module-manager -d popup +``` + +### On Module + +```bash +$ pnpm start +``` + +OR + +```bash +pnpm start -d popup +``` + +> [!NOTE] +> For complete info about CLI support run: +> `pnpm module-manager --help` + +> [!IMPORTANT] +> If you want to remove all tests, and something else with one command, you need to set `tests` as first argument like: +> `pnpm module-manager -d tests popup ...` + +### Choose a tool + +``` +? Choose a tool (Use arrow keys) +❯ Delete Feature + Recover Feature +``` + +## How it works + +### Delete Feature + +When you select an unused module, Module Manager compresses the contents of that folder, takes a snapshot of it, and removes it. + +It also automatically removes anything that needs to be cleared from the manifest. + +### Recover Feature + +When you select a module that has been deleted, The Module Manager will recover that module from the snapshot and add it back to the manifest. + +> [!IMPORTANT] +> SAVE ALL FILES FROM /ARCHIVE, WITHOUT THESE FILES' RECOVERING PROCESS WON'T WORK + +> [!IMPORTANT] +> IF YOU DECIDE TO REMOVE ONE OF CONTENT SCRIPTs AFTER EDIT, E.G YOU REMOVE OR ADD ANY MATCHES, +> REMEMBER TO EDIT ALSO [MODULE_CONFIG](./lib/const.ts) TO BE ABLE TO RECOVER IT EASILY IN THE FUTURE. diff --git a/extension/packages/module-manager/index.mts b/extension/packages/module-manager/index.mts new file mode 100644 index 0000000..b33470e --- /dev/null +++ b/extension/packages/module-manager/index.mts @@ -0,0 +1,3 @@ +import { startManager } from './lib/index.js'; + +startManager(); diff --git a/extension/packages/module-manager/lib/base/cli-args-processor.ts b/extension/packages/module-manager/lib/base/cli-args-processor.ts new file mode 100644 index 0000000..ebc1748 --- /dev/null +++ b/extension/packages/module-manager/lib/base/cli-args-processor.ts @@ -0,0 +1,51 @@ +import { CLI_OPTIONS, DEFAULT_CHOICES_VALUES, HELP_EXAMPLES } from '../const.js'; +import { checkCliArgsIsValid } from '../helpers/utils.js'; +import { excludeValuesFromBaseArray } from '@extension/shared'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import type { ICLIOptions, ModuleNameType } from '../types.js'; +import type { WritableDeep } from '@extension/shared'; + +export const processCLIArgs = (): ICLIOptions | null => { + const argv = yargs(hideBin(process.argv)) + .option('delete', CLI_OPTIONS[0]) + .option('recover', CLI_OPTIONS[1]) + .option('delete-exclude', CLI_OPTIONS[2]) + .option('recover-exclude', CLI_OPTIONS[3]) + .check(argv => checkCliArgsIsValid(argv)) + .strict() + .example(HELP_EXAMPLES as WritableDeep) + .help() + .showHelpOnFail(true) + .parseSync(); + + if (argv.delete) { + return { + action: 'delete', + targets: argv.delete as ModuleNameType[], + }; + } + + if (argv.recover) { + return { + action: 'recover', + targets: argv.recover as ModuleNameType[], + }; + } + + if (argv.deleteExclude) { + return { + action: 'delete', + targets: excludeValuesFromBaseArray(DEFAULT_CHOICES_VALUES, argv.deleteExclude), + }; + } + + if (argv.recoverExclude) { + return { + action: 'recover', + targets: excludeValuesFromBaseArray(DEFAULT_CHOICES_VALUES, argv.recoverExclude), + }; + } + + return null; +}; diff --git a/extension/packages/module-manager/lib/base/index.ts b/extension/packages/module-manager/lib/base/index.ts new file mode 100644 index 0000000..3e1d538 --- /dev/null +++ b/extension/packages/module-manager/lib/base/index.ts @@ -0,0 +1,2 @@ +export * from './cli-args-processor.js'; +export * from './run-module-manager.js'; diff --git a/extension/packages/module-manager/lib/base/run-module-manager.ts b/extension/packages/module-manager/lib/base/run-module-manager.ts new file mode 100644 index 0000000..f3a7cdd --- /dev/null +++ b/extension/packages/module-manager/lib/base/run-module-manager.ts @@ -0,0 +1,49 @@ +import manifest from '../../../../chrome-extension/manifest.js'; +import { MANAGER_ACTION_PROMPT_CONFIG } from '../const.js'; +import { promptSelection } from '../helpers/utils.js'; +import { deleteFeature, recoverFeature } from '../processing/index.js'; +import { execSync } from 'node:child_process'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { CliActionType, ModuleNameType } from '../types.js'; +import type { ManifestType } from '@extension/shared'; + +const manifestPath = resolve(import.meta.dirname, '..', '..', '..', '..', 'chrome-extension', 'manifest.ts'); + +const manifestObject = JSON.parse(JSON.stringify(manifest)) as ManifestType; +const manifestString = readFileSync(manifestPath, 'utf-8'); + +export const runModuleManager = async (moduleName?: ModuleNameType, action?: CliActionType, isLastLap = true) => { + if (!action) { + action = (await promptSelection(MANAGER_ACTION_PROMPT_CONFIG)) as Awaited; + } + + switch (action) { + case 'delete': + await deleteFeature(manifestObject, moduleName); + break; + case 'recover': + await recoverFeature(manifestObject, moduleName); + } + + const updatedManifest = manifestString + .replace( + /const manifest = {[\s\S]*?} satisfies/, + 'const manifest = ' + JSON.stringify(manifestObject, null, 2) + ' satisfies', + ) + .replace(/ {2}"version": "[\s\S]*?",/, ' version: packageJson.version,'); + + writeFileSync(manifestPath, updatedManifest); + + if (isLastLap) { + execSync('pnpm i', { + stdio: 'inherit', + cwd: resolve('..', '..'), + }); + + execSync('pnpm -F chrome-extension lint:fix', { + stdio: 'inherit', + cwd: resolve('..', '..'), + }); + } +}; diff --git a/extension/packages/module-manager/lib/const.ts b/extension/packages/module-manager/lib/const.ts new file mode 100644 index 0000000..53dc1f2 --- /dev/null +++ b/extension/packages/module-manager/lib/const.ts @@ -0,0 +1,98 @@ +const CHOICE_QUESTION = 'Choose feature to'; +export const RECOVER_CHOICE_QUESTION = `${CHOICE_QUESTION} recover`; +export const DELETE_CHOICE_QUESTION = `${CHOICE_QUESTION} delete`; + +export const DEFAULT_CHOICES = [ + { name: 'Content Script (Execute JS on Web Page)', value: 'content' }, + { name: 'Content Script UI (Render Custom React Component on Web Page)', value: 'content-ui' }, + { name: 'Content Script Runtime (Inject JS on Specific Actions like Popup Click)', value: 'content-runtime' }, + { name: 'Background Script', value: 'background' }, + { name: 'New Tab Override', value: 'new-tab' }, + { name: 'Popup (On Extension Icon Click)', value: 'popup' }, + { name: 'DevTools (Include DevTools Panel)', value: 'devtools' }, + { name: 'Side Panel', value: 'side-panel' }, + { name: 'Options Page', value: 'options' }, + { name: 'All tests', value: 'tests' }, +] as const; + +export const DEFAULT_CHOICES_VALUES = DEFAULT_CHOICES.map(item => item.value); + +export const HELP_EXAMPLES = [ + ['-d content-ui content-runtime', 'Delete content-ui and content-runtime'], + ['--de content devtools', 'Delete everything exclude content and devtools'], + ['-r options side-panel', 'Recover options and side-panel'], + ['--re popup new-tab', 'Recover everything exclude popup and new-tab'], +] as const; + +export const CLI_OPTIONS = [ + { alias: 'd', type: 'array', description: 'Delete specified features' }, + { alias: 'r', type: 'array', description: 'Recover specified features' }, + { alias: 'de', type: 'array', description: 'Delete all features except specified' }, + { alias: 're', type: 'array', description: 'Recover all features except specified' }, +] as const; + +export const MANAGER_ACTION_PROMPT_CONFIG = { + message: 'Choose a tool', + choices: [ + { name: 'Delete Feature', value: 'delete' }, + { name: 'Recover Feature', value: 'recover' }, + ], +} as const; + +export const MODULE_CONFIG = { + content: { + content_scripts: [ + { + matches: ['http://*/*', 'https://*/*', ''], + js: ['content/all.iife.js'], + }, + { + matches: ['https://example.com/*'], + js: ['content/example.iife.js'], + }, + ], + }, + 'content-ui': { + content_scripts: [ + { + matches: ['http://*/*', 'https://*/*', ''], + js: ['content-ui/all.iife.js'], + }, + { + matches: ['https://example.com/*'], + js: ['content-ui/example.iife.js'], + }, + ], + }, + background: { + background: { + service_worker: 'background.js', + type: 'module', + }, + }, + 'new-tab': { + chrome_url_overrides: { + newtab: 'new-tab/index.html', + }, + }, + popup: { + action: { + default_popup: 'popup/index.html', + default_icon: 'icon-34.png', + }, + }, + devtools: { + devtools_page: 'devtools/index.html', + }, + 'side-panel': { + side_panel: { + default_path: 'side-panel/index.html', + }, + permissions: ['sidePanel'], + }, + options: { + options_page: 'options/index.html', + }, +} as const; + +export const EXIT_PROMPT_ERROR = 'ExitPromptError'; diff --git a/extension/packages/module-manager/lib/helpers/index.ts b/extension/packages/module-manager/lib/helpers/index.ts new file mode 100644 index 0000000..81b12c2 --- /dev/null +++ b/extension/packages/module-manager/lib/helpers/index.ts @@ -0,0 +1,2 @@ +export * from './utils.js'; +export * from './zip-utils.js'; diff --git a/extension/packages/module-manager/lib/helpers/utils.ts b/extension/packages/module-manager/lib/helpers/utils.ts new file mode 100644 index 0000000..063bb37 --- /dev/null +++ b/extension/packages/module-manager/lib/helpers/utils.ts @@ -0,0 +1,113 @@ +import { DEFAULT_CHOICES_VALUES, EXIT_PROMPT_ERROR, MODULE_CONFIG } from '../const.js'; +import { colorfulLog } from '@extension/shared'; +import { select } from '@inquirer/prompts'; +import { readdirSync } from 'node:fs'; +import type { DELETE_CHOICE_QUESTION, RECOVER_CHOICE_QUESTION } from '../const.js'; +import type { + ChoicesType, + CliEntriesType, + InputConfigType, + ModuleNameType, + WritableModuleConfigValuesType, +} from '../types.js'; +import type { ConditionalPickDeep, Entries, ManifestType } from '@extension/shared'; +import type { Arguments } from 'yargs'; + +export const isFolderEmpty = (path: string) => !readdirSync(path).length; + +export const promptSelection = async (inputConfig: InputConfigType) => + select(inputConfig).catch(err => { + if (err.name === EXIT_PROMPT_ERROR) { + process.exit(0); + } else { + colorfulLog(err.message, 'error'); + } + }) as Promise; + +export const processModuleConfig = ( + manifestObject: ManifestType, + moduleName: ModuleNameType, + isRecovering?: boolean, +) => { + if (moduleName === 'content-runtime' || moduleName === 'devtools-panel' || moduleName === 'tests') { + return; + } + + const moduleConfigValues = MODULE_CONFIG[moduleName]; + const moduleConfigEntriesOfKeys = Object.entries(moduleConfigValues) as Entries; + + if (moduleName === 'content' || moduleName === 'content-ui') { + if (isRecovering) { + (moduleConfigValues as WritableModuleConfigValuesType).content_scripts.map(script => + manifestObject.content_scripts?.push(script), + ); + } else { + const outputFileName = new RegExp(`${moduleName}/+`); + + manifestObject.content_scripts = manifestObject.content_scripts?.filter( + script => !outputFileName.test(script.js ? script.js[0] : ''), + ); + } + return; + } + + moduleConfigEntriesOfKeys.forEach(([key, value]) => { + const manifestValue = manifestObject[key]; + + if (manifestValue) { + if (manifestValue instanceof Array) { + const arrayValues = Object.values( + moduleConfigValues[key as ConditionalPickDeep], + ); + + if (isRecovering) { + manifestObject[key] = manifestValue.concat(arrayValues); + } else { + manifestObject[key] = manifestValue.filter((value: string) => !arrayValues.includes(value)); + } + } else { + delete manifestObject[key]; + } + } else if (isRecovering) { + Object.assign(manifestObject, { [key]: value }); + } else { + throw new Error(`Key ${key} not found in manifest.ts`); + } + }); +}; + +export const checkCliArgsIsValid = (argv: T) => { + const [key, values] = Object.entries(argv)[1] as CliEntriesType; + + if (Array.isArray(values)) { + for (const value of values) { + if (!DEFAULT_CHOICES_VALUES.some(moduleName => value === moduleName)) { + throw new Error(`All values after --${key} must be names of pages`); + } + } + } + + return true; +}; + +export const processSelection = async ( + choices: ChoicesType, + question: typeof RECOVER_CHOICE_QUESTION | typeof DELETE_CHOICE_QUESTION, + moduleName?: ModuleNameType, +) => { + if (!choices.length) { + colorfulLog('No options available', 'warning'); + process.exit(0); + } + + if (!moduleName) { + const inputConfig = { + message: question, + choices, + } as const; + + return (await promptSelection(inputConfig)) as Awaited; + } + + return null; +}; diff --git a/extension/packages/module-manager/lib/helpers/zip-utils.ts b/extension/packages/module-manager/lib/helpers/zip-utils.ts new file mode 100644 index 0000000..125f06e --- /dev/null +++ b/extension/packages/module-manager/lib/helpers/zip-utils.ts @@ -0,0 +1,97 @@ +import { streamFileToZip } from '@extension/dev-utils'; +import fg from 'fast-glob'; +import { unzipSync, Zip } from 'fflate'; +import { rimraf } from 'rimraf'; +import { createWriteStream, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import type { ModuleNameType } from '../types.js'; + +const zipAndDeleteModuleTest = async (moduleName: ModuleNameType, archivePath: string, testsPath: string) => { + const moduleTestName = `page-${moduleName}.test.ts`; + const moduleTestsPath = resolve(testsPath, moduleTestName); + + await zipFolder(testsPath, resolve(archivePath, `${moduleName}.test.zip`), [moduleTestName]); + void rimraf([moduleTestsPath]); +}; + +export const zipAndDeleteModule = async ( + moduleName: ModuleNameType, + pagesPath: string, + archivePath: string, + testsPath?: string, +) => { + const modulePath = resolve(pagesPath, moduleName); + + await zipFolder(resolve(pagesPath, moduleName), resolve(archivePath, `${moduleName}.zip`)); + void rimraf([modulePath]); + + if (testsPath && existsSync(testsPath)) { + await zipAndDeleteModuleTest(moduleName, archivePath, testsPath); + } +}; + +export const zipAndDeleteTests = async (testsPath: string, archivePath: string) => { + await zipFolder(testsPath, resolve(archivePath, `tests.zip`)); + void rimraf(testsPath); +}; + +export const unZipAndDeleteModule = (zipFilePath: string, destPath: string) => { + const unzipped = unzipSync(readFileSync(zipFilePath)); + + mkdirSync(destPath, { recursive: true }); + + for (const [filePath, fileData] of Object.entries(unzipped)) { + const dir = dirname(filePath); + + mkdirSync(dir, { recursive: true }); + writeFileSync(filePath, fileData); + } + + unlinkSync(zipFilePath); +}; + +export const zipFolder = async (folderPath: string, out: string, filesToInclude?: string[]) => { + const fileList = await fg( + ['!node_modules', '!dist', '!**/*/node_modules', '!**/*/dist'].concat( + filesToInclude?.length ? filesToInclude : ['**/*'], + ), + { + cwd: folderPath, + onlyFiles: true, + }, + ); + const output = createWriteStream(out); + + return new Promise((resolvePromise, rejectPromise) => { + const zip = new Zip((err, data, final) => { + if (err) { + rejectPromise(err); + } else { + output.write(data); + if (final) { + output.end(); + resolvePromise(); + console.log(`Archive created at: ${out} for recovery`); + } + } + }); + + for (const file of fileList) { + const absPath = resolve(folderPath, file); + + console.log(`Archiving file: ${absPath}`); + streamFileToZip( + absPath, + absPath, + zip, + () => { + output.end(); + rejectPromise(new Error('Aborted')); + }, + rejectPromise, + ); + } + + zip.end(); + }); +}; diff --git a/extension/packages/module-manager/lib/index.ts b/extension/packages/module-manager/lib/index.ts new file mode 100644 index 0000000..36648f9 --- /dev/null +++ b/extension/packages/module-manager/lib/index.ts @@ -0,0 +1,21 @@ +import { processCLIArgs, runModuleManager } from './base/index.js'; +import { colorfulLog, sleep } from '@extension/shared'; + +const cliOptions = processCLIArgs(); + +export const startManager = () => { + if (cliOptions) { + const targets = cliOptions.targets; + + (async () => { + for (const moduleName of targets) { + colorfulLog(`Processing module: ${moduleName}`, 'info'); + const isLastIndex = targets.at(-1) === moduleName; + await runModuleManager(moduleName, cliOptions.action, isLastIndex); + await sleep(500); + } + })(); + } else { + void runModuleManager(); + } +}; diff --git a/extension/packages/module-manager/lib/paths.ts b/extension/packages/module-manager/lib/paths.ts new file mode 100644 index 0000000..6aaa2c7 --- /dev/null +++ b/extension/packages/module-manager/lib/paths.ts @@ -0,0 +1,6 @@ +import { resolve } from 'node:path'; + +export const pagesPath = resolve(import.meta.dirname, '..', '..', '..', 'pages'); +export const testsPath = resolve(pagesPath, '..', 'tests'); +export const specsPath = resolve(testsPath, 'e2e', 'specs'); +export const archivePath = resolve(import.meta.dirname, '..', 'archive'); diff --git a/extension/packages/module-manager/lib/processing/delete-feature.ts b/extension/packages/module-manager/lib/processing/delete-feature.ts new file mode 100644 index 0000000..26622d2 --- /dev/null +++ b/extension/packages/module-manager/lib/processing/delete-feature.ts @@ -0,0 +1,34 @@ +import { deleteModule } from './modules-handler.js'; +import { DEFAULT_CHOICES, DELETE_CHOICE_QUESTION } from '../const.js'; +import { processSelection } from '../helpers/utils.js'; +import { pagesPath, testsPath } from '../paths.js'; +import { existsSync, readdirSync } from 'node:fs'; +import type { ChoicesType, ModuleNameType } from '../types.ts'; +import type { ManifestType } from '@extension/shared'; + +export const deleteFeature = async (manifestObject: ManifestType, moduleName?: ModuleNameType) => { + const pageFolders = readdirSync(pagesPath); + + const choices: ChoicesType = DEFAULT_CHOICES.filter(choice => { + if (choice.value === 'background') { + return !!manifestObject.background; + } else if (choice.value === 'tests') { + return existsSync(testsPath); + } + + return pageFolders.includes(choice.value); + }); + + const processResult = await processSelection(choices, DELETE_CHOICE_QUESTION, moduleName); + + if (processResult) { + moduleName = processResult; + } + + if (moduleName === 'devtools') { + await deleteModule(manifestObject, moduleName as ModuleNameType); + await deleteModule(manifestObject, 'devtools-panel'); + } else { + await deleteModule(manifestObject, moduleName as ModuleNameType); + } +}; diff --git a/extension/packages/module-manager/lib/processing/index.ts b/extension/packages/module-manager/lib/processing/index.ts new file mode 100644 index 0000000..042911b --- /dev/null +++ b/extension/packages/module-manager/lib/processing/index.ts @@ -0,0 +1,3 @@ +export * from './delete-feature.js'; +export * from './recover-feature.js'; +export * from './modules-handler.js'; diff --git a/extension/packages/module-manager/lib/processing/modules-handler.ts b/extension/packages/module-manager/lib/processing/modules-handler.ts new file mode 100644 index 0000000..ccd3f93 --- /dev/null +++ b/extension/packages/module-manager/lib/processing/modules-handler.ts @@ -0,0 +1,48 @@ +import { unZipAndDeleteModule, zipAndDeleteModule, zipAndDeleteTests } from '../helpers/index.js'; +import { isFolderEmpty, processModuleConfig } from '../helpers/utils.js'; +import { archivePath, pagesPath, specsPath, testsPath } from '../paths.js'; +import { colorfulLog } from '@extension/shared'; +import { existsSync, mkdirSync, rmdirSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { ModuleNameType } from '../types.ts'; +import type { ManifestType } from '@extension/shared'; + +export const recoverModule = (manifestObject: ManifestType, moduleName: ModuleNameType) => { + const zipFilePath = resolve(archivePath, `${moduleName}.zip`); + const zipTestFilePath = resolve(archivePath, `${moduleName}.test.zip`); + + if (!existsSync(zipFilePath)) { + colorfulLog(`No archive found for ${moduleName}`, 'info'); + process.exit(0); + } + + processModuleConfig(manifestObject, moduleName, true); + + unZipAndDeleteModule(zipFilePath, pagesPath); + + if (existsSync(zipTestFilePath)) { + unZipAndDeleteModule(zipTestFilePath, specsPath); + } + + colorfulLog(`Recovered: ${moduleName}`, 'info'); + + if (isFolderEmpty(archivePath)) { + rmdirSync(archivePath); + } +}; + +export const deleteModule = async (manifestObject: ManifestType, moduleName: ModuleNameType) => { + processModuleConfig(manifestObject, moduleName); + + if (!existsSync(archivePath)) { + mkdirSync(archivePath, { recursive: true }); + } + + if (moduleName === 'tests') { + await zipAndDeleteTests(testsPath, archivePath); + } else { + await zipAndDeleteModule(moduleName, pagesPath, archivePath, specsPath); + } + + colorfulLog(`Deleted: ${moduleName}`, 'info'); +}; diff --git a/extension/packages/module-manager/lib/processing/recover-feature.ts b/extension/packages/module-manager/lib/processing/recover-feature.ts new file mode 100644 index 0000000..8087ad2 --- /dev/null +++ b/extension/packages/module-manager/lib/processing/recover-feature.ts @@ -0,0 +1,41 @@ +import { recoverModule } from './modules-handler.js'; +import { DEFAULT_CHOICES, RECOVER_CHOICE_QUESTION } from '../const.js'; +import { processSelection } from '../helpers/utils.js'; +import { archivePath } from 'lib/paths.js'; +import { rimraf } from 'rimraf'; +import { existsSync, readdirSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { ChoicesType, ModuleNameType } from '../types.ts'; +import type { ManifestType } from '@extension/shared'; + +export const recoverFeature = async (manifestObject: ManifestType, moduleName?: ModuleNameType) => { + const archiveFiles = existsSync(archivePath) ? readdirSync(archivePath) : []; + + const choices: ChoicesType = DEFAULT_CHOICES.filter(choice => { + if (choice.value === 'background') { + return !manifestObject.background; + } + + return archiveFiles.includes(`${choice.value}.zip`); + }); + + const processResult = await processSelection(choices, RECOVER_CHOICE_QUESTION, moduleName); + + if (processResult) { + moduleName = processResult; + } + + if (moduleName === 'tests') { + recoverModule(manifestObject, moduleName as ModuleNameType); + const testZipFilePath = resolve(archivePath, `${moduleName}.test.zip`); + + if (existsSync(testZipFilePath)) { + await rimraf(testZipFilePath); + } + } else if (moduleName === 'devtools') { + recoverModule(manifestObject, moduleName as ModuleNameType); + recoverModule(manifestObject, 'devtools-panel'); + } else { + recoverModule(manifestObject, moduleName as ModuleNameType); + } +}; diff --git a/extension/packages/module-manager/lib/types.ts b/extension/packages/module-manager/lib/types.ts new file mode 100644 index 0000000..0ff99df --- /dev/null +++ b/extension/packages/module-manager/lib/types.ts @@ -0,0 +1,19 @@ +import type { DEFAULT_CHOICES, MODULE_CONFIG } from './const.js'; +import type { WritableDeep } from '@extension/shared'; +import type { select } from '@inquirer/prompts'; + +type ModuleConfigType = typeof MODULE_CONFIG; + +export type ChoiceType = (typeof DEFAULT_CHOICES)[number]; +export type ChoicesType = ChoiceType[]; +export type ModuleNameType = ChoiceType['value'] | 'devtools-panel'; +export type InputConfigType = Parameters[0]; +export type WritableModuleConfigValuesType = WritableDeep; + +export interface ICLIOptions { + action: 'delete' | 'recover'; + targets: ModuleNameType[]; +} + +export type CliEntriesType = [string, (string | number)[]][]; +export type CliActionType = 'delete' | 'recover'; diff --git a/extension/packages/module-manager/package.json b/extension/packages/module-manager/package.json new file mode 100644 index 0000000..f81046e --- /dev/null +++ b/extension/packages/module-manager/package.json @@ -0,0 +1,23 @@ +{ + "name": "@extension/module-manager", + "version": "0.5.0", + "description": "chrome extension - module manager", + "type": "module", + "private": true, + "sideEffects": true, + "scripts": { + "start": "tsx index.mts", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore" + }, + "devDependencies": { + "@extension/dev-utils": "workspace:*", + "@extension/shared": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@inquirer/prompts": "^7.5.1", + "@types/yargs": "^17.0.33", + "tsx": "^4.19.4", + "yargs": "^17.7.2" + } +} diff --git a/extension/packages/module-manager/tsconfig.json b/extension/packages/module-manager/tsconfig.json new file mode 100644 index 0000000..55ee95e --- /dev/null +++ b/extension/packages/module-manager/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["lib", "index.mts"] +} diff --git a/extension/packages/orca-api/index.mts b/extension/packages/orca-api/index.mts new file mode 100644 index 0000000..f428d74 --- /dev/null +++ b/extension/packages/orca-api/index.mts @@ -0,0 +1 @@ +export * from './lib/index.js'; \ No newline at end of file diff --git a/extension/packages/orca-api/lib/index.ts b/extension/packages/orca-api/lib/index.ts new file mode 100644 index 0000000..8234c6c --- /dev/null +++ b/extension/packages/orca-api/lib/index.ts @@ -0,0 +1 @@ +export * from './types.js'; \ No newline at end of file diff --git a/extension/packages/orca-api/lib/types.ts b/extension/packages/orca-api/lib/types.ts new file mode 100644 index 0000000..3b4807e --- /dev/null +++ b/extension/packages/orca-api/lib/types.ts @@ -0,0 +1,117 @@ +export interface OrcaApplication { + id: string; + name: string; + description?: string; + baseUrl: string; + createdAt: string; + updatedAt: string; +} + +export interface OrcaRecording { + id: string; + name: string; + description?: string; + applicationId: string; + status: RecordingStatus; + actions: OrcaAction[]; + createdAt: string; + updatedAt: string; +} + +export interface OrcaAction { + id: string; + recordingId: string; + type: ActionType; + target: ActionTarget; + data: ActionData; + timestamp: number; + screenshot?: string; +} + +export interface ActionTarget { + selector: string; + xpath?: string; + text?: string; + tagName: string; + attributes: Record; +} + +export interface ActionData { + value?: string; + coordinates?: { x: number; y: number }; + keyCode?: string; + button?: number; + scrollPosition?: { x: number; y: number }; + [key: string]: any; +} + +export enum ActionType { + CLICK = 'click', + TYPE = 'type', + SCROLL = 'scroll', + HOVER = 'hover', + FOCUS = 'focus', + BLUR = 'blur', + CHANGE = 'change', + SUBMIT = 'submit', + KEY_DOWN = 'keydown', + KEY_UP = 'keyup', + MOUSE_DOWN = 'mousedown', + MOUSE_UP = 'mouseup', + MOUSE_MOVE = 'mousemove', + WHEEL = 'wheel', + RESIZE = 'resize', + LOAD = 'load', + UNLOAD = 'unload', + NAVIGATION = 'navigation', + SCREENSHOT = 'screenshot', + ASSERTION = 'assertion', + WAIT = 'wait', +} + +export type RecordingStatus = 'draft' | 'recording' | 'completed' | 'failed'; +export type RecordingState = 'idle' | 'recording' | 'paused' | 'stopping' | 'processing'; + +export enum MessageType { + START_RECORDING = 'START_RECORDING', + STOP_RECORDING = 'STOP_RECORDING', + PAUSE_RECORDING = 'PAUSE_RECORDING', + RESUME_RECORDING = 'RESUME_RECORDING', + GET_STATUS = 'GET_STATUS', + UPDATE_STATUS = 'UPDATE_STATUS', + RECORD_ACTION = 'RECORD_ACTION', + GET_APPLICATIONS = 'GET_APPLICATIONS', + CONNECT_API = 'CONNECT_API', + DISCONNECT_API = 'DISCONNECT_API', +} + +export interface MessageResponse { + success: boolean; + data?: T; + error?: string; +} + +export interface StartRecordingRequest { + appId: string; + recordingName: string; + description?: string; +} + +export interface RecordingStatusUpdate { + recordingState: RecordingState; + actionCount: number; + currentRecording?: OrcaRecording; + error?: string; +} + +export interface ApiHealthResponse { + status: 'healthy' | 'unhealthy'; + version: string; + timestamp: string; +} + +export interface ApiConnectionConfig { + baseUrl: string; + apiKey?: string; + timeout?: number; +} \ No newline at end of file diff --git a/extension/packages/orca-api/package.json b/extension/packages/orca-api/package.json new file mode 100644 index 0000000..297de3e --- /dev/null +++ b/extension/packages/orca-api/package.json @@ -0,0 +1,21 @@ +{ + "name": "@extension/orca-api", + "version": "0.0.1", + "description": "Orca API client for Chrome extension", + "private": true, + "type": "module", + "main": "./lib/index.ts", + "exports": { + ".": "./lib/index.ts" + }, + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*", + "typescript": "^5.3.3" + }, + "dependencies": {} +} \ No newline at end of file diff --git a/extension/packages/orca-api/tsconfig.json b/extension/packages/orca-api/tsconfig.json new file mode 100644 index 0000000..1cdd715 --- /dev/null +++ b/extension/packages/orca-api/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} \ No newline at end of file diff --git a/extension/packages/shared/README.md b/extension/packages/shared/README.md new file mode 100644 index 0000000..7d40c22 --- /dev/null +++ b/extension/packages/shared/README.md @@ -0,0 +1,12 @@ +# Shared Package + +This package contains code shared with other packages. +To use the code in the package, you need to add the following to the package.json file. + +```json +{ + "dependencies": { + "@extension/shared": "workspace:*" + } +} +``` diff --git a/extension/packages/shared/const.ts b/extension/packages/shared/const.ts new file mode 100644 index 0000000..7743b5f --- /dev/null +++ b/extension/packages/shared/const.ts @@ -0,0 +1,3 @@ +export const PROJECT_URL_OBJECT = { + url: 'https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite', +} as const; diff --git a/extension/packages/shared/index.mts b/extension/packages/shared/index.mts new file mode 100644 index 0000000..336c729 --- /dev/null +++ b/extension/packages/shared/index.mts @@ -0,0 +1,4 @@ +export * from './lib/hooks/index.js'; +export * from './lib/hoc/index.js'; +export * from './lib/utils/index.js'; +export * from './const.js'; diff --git a/extension/packages/shared/lib/hoc/index.ts b/extension/packages/shared/lib/hoc/index.ts new file mode 100644 index 0000000..564ea2c --- /dev/null +++ b/extension/packages/shared/lib/hoc/index.ts @@ -0,0 +1,2 @@ +export { withSuspense } from './with-suspense.js'; +export { withErrorBoundary } from './with-error-boundary.js'; diff --git a/extension/packages/shared/lib/hoc/with-error-boundary.tsx b/extension/packages/shared/lib/hoc/with-error-boundary.tsx new file mode 100644 index 0000000..30dd980 --- /dev/null +++ b/extension/packages/shared/lib/hoc/with-error-boundary.tsx @@ -0,0 +1,15 @@ +import { ErrorBoundary } from 'react-error-boundary'; +import type { ComponentType } from 'react'; +import type { FallbackProps } from 'react-error-boundary'; + +export const withErrorBoundary = >( + Component: ComponentType, + FallbackComponent: ComponentType, +) => + function WithErrorBoundary(props: T) { + return ( + + + + ); + }; diff --git a/extension/packages/shared/lib/hoc/with-suspense.tsx b/extension/packages/shared/lib/hoc/with-suspense.tsx new file mode 100644 index 0000000..2f673a0 --- /dev/null +++ b/extension/packages/shared/lib/hoc/with-suspense.tsx @@ -0,0 +1,10 @@ +import { Suspense } from 'react'; +import type { ComponentType, ReactElement } from 'react'; + +export const withSuspense = + >(Component: ComponentType, SuspenseComponent: ReactElement) => + (props: T) => ( + + + + ); diff --git a/extension/packages/shared/lib/hooks/index.ts b/extension/packages/shared/lib/hooks/index.ts new file mode 100644 index 0000000..6f7e11e --- /dev/null +++ b/extension/packages/shared/lib/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-storage.js'; diff --git a/extension/packages/shared/lib/hooks/use-storage.tsx b/extension/packages/shared/lib/hooks/use-storage.tsx new file mode 100644 index 0000000..da50e83 --- /dev/null +++ b/extension/packages/shared/lib/hooks/use-storage.tsx @@ -0,0 +1,56 @@ +import { useRef, useSyncExternalStore } from 'react'; +import type { BaseStorageType } from '@extension/storage'; + +type WrappedPromise = ReturnType; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const storageMap: Map, WrappedPromise> = new Map(); + +const wrapPromise = (promise: Promise) => { + let status = 'pending'; + let result: R; + + const suspender = promise.then( + r => { + status = 'success'; + result = r; + }, + e => { + status = 'error'; + result = e; + }, + ); + + return { + read() { + switch (status) { + case 'pending': + throw suspender; + case 'error': + throw result; + default: + return result; + } + }, + }; +}; + +export const useStorage = < + Storage extends BaseStorageType, + Data = Storage extends BaseStorageType ? Data : unknown, +>( + storage: Storage, +) => { + const initializedRef = useRef(false); + const _data = useSyncExternalStore(storage.subscribe, storage.getSnapshot); + + if (!storageMap.has(storage)) { + storageMap.set(storage, wrapPromise(storage.get())); + } + + if (_data || initializedRef.current) { + storageMap.set(storage, { read: () => _data }); + initializedRef.current = true; + } + + return (_data ?? storageMap.get(storage)!.read()) as Exclude>; +}; diff --git a/extension/packages/shared/lib/utils/colorful-logger.ts b/extension/packages/shared/lib/utils/colorful-logger.ts new file mode 100644 index 0000000..ccd2833 --- /dev/null +++ b/extension/packages/shared/lib/utils/colorful-logger.ts @@ -0,0 +1,27 @@ +import { COLORS } from './const.js'; +import type { ColorType, ValueOf } from './types.js'; + +export const colorfulLog = (message: string, type: ColorType) => { + let color: ValueOf; + + switch (type) { + case 'success': + color = COLORS.FgGreen; + break; + case 'info': + color = COLORS.FgBlue; + break; + case 'error': + color = COLORS.FgRed; + break; + case 'warning': + color = COLORS.FgYellow; + break; + default: + color = COLORS[type]; + break; + } + + console.info(color, message); + console.info(COLORS['Reset']); +}; diff --git a/extension/packages/shared/lib/utils/const.ts b/extension/packages/shared/lib/utils/const.ts new file mode 100644 index 0000000..e69d6a2 --- /dev/null +++ b/extension/packages/shared/lib/utils/const.ts @@ -0,0 +1,25 @@ +export const COLORS = { + Reset: '\x1b[0m', + Bright: '\x1b[1m', + Dim: '\x1b[2m', + Underscore: '\x1b[4m', + Blink: '\x1b[5m', + Reverse: '\x1b[7m', + Hidden: '\x1b[8m', + FgBlack: '\x1b[30m', + FgRed: '\x1b[31m', + FgGreen: '\x1b[32m', + FgYellow: '\x1b[33m', + FgBlue: '\x1b[34m', + FgMagenta: '\x1b[35m', + FgCyan: '\x1b[36m', + FgWhite: '\x1b[37m', + BgBlack: '\x1b[40m', + BgRed: '\x1b[41m', + BgGreen: '\x1b[42m', + BgYellow: '\x1b[43m', + BgBlue: '\x1b[44m', + BgMagenta: '\x1b[45m', + BgCyan: '\x1b[46m', + BgWhite: '\x1b[47m', +} as const; diff --git a/extension/packages/shared/lib/utils/helpers.ts b/extension/packages/shared/lib/utils/helpers.ts new file mode 100644 index 0000000..955b9e6 --- /dev/null +++ b/extension/packages/shared/lib/utils/helpers.ts @@ -0,0 +1,8 @@ +import type { ExcludeValuesFromBaseArrayType } from './types.js'; + +export const excludeValuesFromBaseArray = ( + baseArray: B, + excludeArray: E, +) => baseArray.filter(value => !excludeArray.includes(value)) as ExcludeValuesFromBaseArrayType; + +export const sleep = async (time: number) => new Promise(r => setTimeout(r, time)); diff --git a/extension/packages/shared/lib/utils/index.ts b/extension/packages/shared/lib/utils/index.ts new file mode 100644 index 0000000..981861d --- /dev/null +++ b/extension/packages/shared/lib/utils/index.ts @@ -0,0 +1,4 @@ +export * from './helpers.js'; +export * from './colorful-logger.js'; +export * from './init-app-with-shadow.js'; +export type * from './types.js'; diff --git a/extension/packages/shared/lib/utils/init-app-with-shadow.ts b/extension/packages/shared/lib/utils/init-app-with-shadow.ts new file mode 100644 index 0000000..bb3963e --- /dev/null +++ b/extension/packages/shared/lib/utils/init-app-with-shadow.ts @@ -0,0 +1,34 @@ +import { createRoot } from 'react-dom/client'; +import type { ReactElement } from 'react'; + +export const initAppWithShadow = ({ id, app, inlineCss }: { id: string; inlineCss: string; app: ReactElement }) => { + const root = document.createElement('div'); + root.id = id; + + document.body.append(root); + + const rootIntoShadow = document.createElement('div'); + rootIntoShadow.id = `shadow-root-${id}`; + + const shadowRoot = root.attachShadow({ mode: 'open' }); + + if (navigator.userAgent.includes('Firefox')) { + /** + * In the firefox environment, adoptedStyleSheets cannot be used due to the bug + * @url https://bugzilla.mozilla.org/show_bug.cgi?id=1770592 + * + * Injecting styles into the document, this may cause style conflicts with the host page + */ + const styleElement = document.createElement('style'); + styleElement.innerHTML = inlineCss; + shadowRoot.appendChild(styleElement); + } else { + /** Inject styles into shadow dom */ + const globalStyleSheet = new CSSStyleSheet(); + globalStyleSheet.replaceSync(inlineCss); + shadowRoot.adoptedStyleSheets = [globalStyleSheet]; + } + + shadowRoot.appendChild(rootIntoShadow); + createRoot(rootIntoShadow).render(app); +}; diff --git a/extension/packages/shared/lib/utils/types.ts b/extension/packages/shared/lib/utils/types.ts new file mode 100644 index 0000000..cee05aa --- /dev/null +++ b/extension/packages/shared/lib/utils/types.ts @@ -0,0 +1,10 @@ +import type { COLORS } from './const.js'; +import type { TupleToUnion } from 'type-fest'; + +export type * from 'type-fest'; +export type ColorType = 'success' | 'info' | 'error' | 'warning' | keyof typeof COLORS; +export type ExcludeValuesFromBaseArrayType = Exclude< + TupleToUnion, + TupleToUnion +>[]; +export type ManifestType = chrome.runtime.ManifestV3; diff --git a/extension/packages/shared/package.json b/extension/packages/shared/package.json new file mode 100644 index 0000000..8ef7721 --- /dev/null +++ b/extension/packages/shared/package.json @@ -0,0 +1,33 @@ +{ + "name": "@extension/shared", + "version": "0.5.0", + "description": "chrome extension - shared code", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit", + "postinstall": "pnpm ready" + }, + "dependencies": { + "react-error-boundary": "^6.0.0" + }, + "devDependencies": { + "@extension/storage": "workspace:*", + "@extension/tsconfig": "workspace:*", + "type-fest": "^4.41.0" + } +} diff --git a/extension/packages/shared/tsconfig.json b/extension/packages/shared/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/shared/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/packages/storage/index.mts b/extension/packages/storage/index.mts new file mode 100644 index 0000000..09c185e --- /dev/null +++ b/extension/packages/storage/index.mts @@ -0,0 +1 @@ +export * from './lib/index.js'; diff --git a/extension/packages/storage/lib/base/base.ts b/extension/packages/storage/lib/base/base.ts new file mode 100644 index 0000000..a9870f8 --- /dev/null +++ b/extension/packages/storage/lib/base/base.ts @@ -0,0 +1,157 @@ +import { SessionAccessLevelEnum, StorageEnum } from './enums.js'; +import type { BaseStorageType, StorageConfigType, ValueOrUpdateType } from './types.js'; + +/** + * Chrome reference error while running `processTailwindFeatures` in tailwindcss. + * To avoid this, we need to check if globalThis.chrome is available and add fallback logic. + */ +const chrome = globalThis.chrome; + +/** + * Sets or updates an arbitrary cache with a new value or the result of an update function. + */ +const updateCache = async (valueOrUpdate: ValueOrUpdateType, cache: D | null): Promise => { + // Type guard to check if our value or update is a function + const isFunction = (value: ValueOrUpdateType): value is (prev: D) => D | Promise => + typeof value === 'function'; + + // Type guard to check in case of a function if it's a Promise + const returnsPromise = (func: (prev: D) => D | Promise): func is (prev: D) => Promise => + // Use ReturnType to infer the return type of the function and check if it's a Promise + (func as (prev: D) => Promise) instanceof Promise; + if (isFunction(valueOrUpdate)) { + // Check if the function returns a Promise + if (returnsPromise(valueOrUpdate)) { + return valueOrUpdate(cache as D); + } else { + return valueOrUpdate(cache as D); + } + } else { + return valueOrUpdate; + } +}; + +/** + * If one session storage needs access from content scripts, we need to enable it globally. + * @default false + */ +let globalSessionAccessLevelFlag: StorageConfigType['sessionAccessForContentScripts'] = false; + +/** + * Checks if the storage permission is granted in the manifest.json. + */ +const checkStoragePermission = (storageEnum: StorageEnum): void => { + if (!chrome) { + return; + } + + if (!chrome.storage[storageEnum]) { + throw new Error(`"storage" permission in manifest.ts: "storage ${storageEnum}" isn't defined`); + } +}; + +/** + * Creates a storage area for persisting and exchanging data. + */ +export const createStorage = ( + key: string, + fallback: D, + config?: StorageConfigType, +): BaseStorageType => { + let cache: D | null = null; + let initialCache = false; + let listeners: Array<() => void> = []; + + const storageEnum = config?.storageEnum ?? StorageEnum.Local; + const liveUpdate = config?.liveUpdate ?? false; + + const serialize = config?.serialization?.serialize ?? ((v: D) => v); + const deserialize = config?.serialization?.deserialize ?? (v => v as D); + + // Set global session storage access level for StoryType.Session, only when not already done but needed. + if ( + globalSessionAccessLevelFlag === false && + storageEnum === StorageEnum.Session && + config?.sessionAccessForContentScripts === true + ) { + checkStoragePermission(storageEnum); + + chrome?.storage[storageEnum] + .setAccessLevel({ + accessLevel: SessionAccessLevelEnum.ExtensionPagesAndContentScripts, + }) + .catch(error => { + console.error(error); + console.error('Please call .setAccessLevel() into different context, like a background script.'); + }); + globalSessionAccessLevelFlag = true; + } + + // Register life cycle methods + const get = async (): Promise => { + checkStoragePermission(storageEnum); + const value = await chrome?.storage[storageEnum].get([key]); + + if (!value) { + return fallback; + } + + return deserialize(value[key]) ?? fallback; + }; + + const set = async (valueOrUpdate: ValueOrUpdateType) => { + if (!initialCache) { + cache = await get(); + } + cache = await updateCache(valueOrUpdate, cache); + + await chrome?.storage[storageEnum].set({ [key]: serialize(cache) }); + _emitChange(); + }; + + const subscribe = (listener: () => void) => { + listeners = [...listeners, listener]; + + return () => { + listeners = listeners.filter(l => l !== listener); + }; + }; + + const getSnapshot = () => cache; + + const _emitChange = () => { + listeners.forEach(listener => listener()); + }; + + // Listener for live updates from the browser + const _updateFromStorageOnChanged = async (changes: { [key: string]: chrome.storage.StorageChange }) => { + // Check if the key we are listening for is in the changes object + if (changes[key] === undefined) return; + + const valueOrUpdate: ValueOrUpdateType = deserialize(changes[key].newValue); + + if (cache === valueOrUpdate) return; + + cache = await updateCache(valueOrUpdate, cache); + + _emitChange(); + }; + + get().then(data => { + cache = data; + initialCache = true; + _emitChange(); + }); + + // Register listener for live updates for our storage area + if (liveUpdate) { + chrome?.storage[storageEnum].onChanged.addListener(_updateFromStorageOnChanged); + } + + return { + get, + set, + getSnapshot, + subscribe, + }; +}; diff --git a/extension/packages/storage/lib/base/enums.ts b/extension/packages/storage/lib/base/enums.ts new file mode 100644 index 0000000..4f76282 --- /dev/null +++ b/extension/packages/storage/lib/base/enums.ts @@ -0,0 +1,42 @@ +/** + * Storage area type for persisting and exchanging data. + * @see https://developer.chrome.com/docs/extensions/reference/storage/#overview + */ +export enum StorageEnum { + /** + * Persist data locally against browser restarts. Will be deleted by uninstalling the extension. + * @default + */ + Local = 'local', + /** + * Uploads data to the users account in the cloud and syncs to the users browsers on other devices. Limits apply. + */ + Sync = 'sync', + /** + * Requires an [enterprise policy](https://www.chromium.org/administrators/configuring-policy-for-extensions) with a + * json schema for company wide config. + */ + Managed = 'managed', + /** + * Only persist data until the browser is closed. Recommended for service workers which can shutdown anytime and + * therefore need to restore their state. Set {@link SessionAccessLevelEnum} for permitting content scripts access. + * @implements Chromes [Session Storage](https://developer.chrome.com/docs/extensions/reference/storage/#property-session) + */ + Session = 'session', +} + +/** + * Global access level requirement for the {@link StorageEnum.Session} Storage Area. + * @implements Chromes [Session Access Level](https://developer.chrome.com/docs/extensions/reference/storage/#method-StorageArea-setAccessLevel) + */ +export enum SessionAccessLevelEnum { + /** + * Storage can only be accessed by Extension pages (not Content scripts). + * @default + */ + ExtensionPagesOnly = 'TRUSTED_CONTEXTS', + /** + * Storage can be accessed by both Extension pages and Content scripts. + */ + ExtensionPagesAndContentScripts = 'TRUSTED_AND_UNTRUSTED_CONTEXTS', +} diff --git a/extension/packages/storage/lib/base/index.ts b/extension/packages/storage/lib/base/index.ts new file mode 100644 index 0000000..99d1fa7 --- /dev/null +++ b/extension/packages/storage/lib/base/index.ts @@ -0,0 +1,3 @@ +export * from './base.js'; +export * from './enums.js'; +export type * from './types.js'; diff --git a/extension/packages/storage/lib/base/types.ts b/extension/packages/storage/lib/base/types.ts new file mode 100644 index 0000000..3f8e4b9 --- /dev/null +++ b/extension/packages/storage/lib/base/types.ts @@ -0,0 +1,54 @@ +import type { StorageEnum } from './index.js'; + +export type ValueOrUpdateType = D | ((prev: D) => Promise | D); + +export type BaseStorageType = { + get: () => Promise; + set: (value: ValueOrUpdateType) => Promise; + getSnapshot: () => D | null; + subscribe: (listener: () => void) => () => void; +}; + +export type StorageConfigType = { + /** + * Assign the {@link StorageEnum} to use. + * @default Local + */ + storageEnum?: StorageEnum; + /** + * Only for {@link StorageEnum.Session}: Grant Content scripts access to storage area? + * @default false + */ + sessionAccessForContentScripts?: boolean; + /** + * Keeps state live in sync between all instances of the extension. Like between popup, side panel and content scripts. + * To allow chrome background scripts to stay in sync as well, use {@link StorageEnum.Session} storage area with + * {@link StorageConfigType.sessionAccessForContentScripts} potentially also set to true. + * @see https://stackoverflow.com/a/75637138/2763239 + * @default false + */ + liveUpdate?: boolean; + /** + * An optional props for converting values from storage and into it. + * @default undefined + */ + serialization?: { + /** + * convert non-native values to string to be saved in storage + */ + serialize: (value: D) => string; + /** + * convert string value from storage to non-native values + */ + deserialize: (text: string) => D; + }; +}; + +export interface ThemeStateType { + theme: 'light' | 'dark'; + isLight: boolean; +} + +export type ThemeStorageType = BaseStorageType & { + toggle: () => Promise; +}; diff --git a/extension/packages/storage/lib/impl/example-theme-storage.ts b/extension/packages/storage/lib/impl/example-theme-storage.ts new file mode 100644 index 0000000..2f74bbc --- /dev/null +++ b/extension/packages/storage/lib/impl/example-theme-storage.ts @@ -0,0 +1,28 @@ +import { createStorage, StorageEnum } from '../base/index.js'; +import type { ThemeStateType, ThemeStorageType } from '../base/index.js'; + +const storage = createStorage( + 'theme-storage-key', + { + theme: 'light', + isLight: true, + }, + { + storageEnum: StorageEnum.Local, + liveUpdate: true, + }, +); + +export const exampleThemeStorage: ThemeStorageType = { + ...storage, + toggle: async () => { + await storage.set(currentState => { + const newTheme = currentState.theme === 'light' ? 'dark' : 'light'; + + return { + theme: newTheme, + isLight: newTheme === 'light', + }; + }); + }, +}; diff --git a/extension/packages/storage/lib/impl/index.ts b/extension/packages/storage/lib/impl/index.ts new file mode 100644 index 0000000..b09e484 --- /dev/null +++ b/extension/packages/storage/lib/impl/index.ts @@ -0,0 +1 @@ +export * from './example-theme-storage.js'; diff --git a/extension/packages/storage/lib/index.ts b/extension/packages/storage/lib/index.ts new file mode 100644 index 0000000..4101c53 --- /dev/null +++ b/extension/packages/storage/lib/index.ts @@ -0,0 +1,2 @@ +export type * from './types.js'; +export * from './impl/index.js'; diff --git a/extension/packages/storage/lib/types.ts b/extension/packages/storage/lib/types.ts new file mode 100644 index 0000000..6029353 --- /dev/null +++ b/extension/packages/storage/lib/types.ts @@ -0,0 +1,8 @@ +import type { ValueOrUpdateType } from './base/index.js'; + +export type BaseStorageType = { + get: () => Promise; + set: (value: ValueOrUpdateType) => Promise; + getSnapshot: () => D | null; + subscribe: (listener: () => void) => () => void; +}; diff --git a/extension/packages/storage/package.json b/extension/packages/storage/package.json new file mode 100644 index 0000000..baaee6d --- /dev/null +++ b/extension/packages/storage/package.json @@ -0,0 +1,27 @@ +{ + "name": "@extension/storage", + "version": "0.5.0", + "description": "chrome extension - storage", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*" + } +} diff --git a/extension/packages/storage/tsconfig.json b/extension/packages/storage/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/storage/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/packages/tailwindcss-config/package.json b/extension/packages/tailwindcss-config/package.json new file mode 100644 index 0000000..7f86034 --- /dev/null +++ b/extension/packages/tailwindcss-config/package.json @@ -0,0 +1,11 @@ +{ + "name": "@extension/tailwindcss-config", + "version": "0.5.0", + "description": "chrome extension - tailwindcss configuration", + "main": "tailwind.config.ts", + "private": true, + "sideEffects": false, + "devDependencies": { + "@extension/tsconfig": "workspace:*" + } +} diff --git a/extension/packages/tailwindcss-config/tailwind.config.ts b/extension/packages/tailwindcss-config/tailwind.config.ts new file mode 100644 index 0000000..91de605 --- /dev/null +++ b/extension/packages/tailwindcss-config/tailwind.config.ts @@ -0,0 +1,70 @@ +import type { Config } from 'tailwindcss'; + +export default { + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [], +} as Omit; diff --git a/extension/packages/tailwindcss-config/tsconfig.json b/extension/packages/tailwindcss-config/tsconfig.json new file mode 100644 index 0000000..3469054 --- /dev/null +++ b/extension/packages/tailwindcss-config/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["tailwind.config.ts"] +} diff --git a/extension/packages/tsconfig/app.json b/extension/packages/tsconfig/app.json new file mode 100644 index 0000000..aa9d24d --- /dev/null +++ b/extension/packages/tsconfig/app.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Chrome Extension App", + "extends": "./base.json" +} diff --git a/extension/packages/tsconfig/base.json b/extension/packages/tsconfig/base.json new file mode 100644 index 0000000..ca39281 --- /dev/null +++ b/extension/packages/tsconfig/base.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Base", + "compilerOptions": { + "allowJs": true, + "noEmit": true, + "downlevelIteration": true, + "isolatedModules": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noImplicitReturns": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ESNext", + "lib": ["DOM", "ESNext"], + "types": ["node", "chrome"] + } +} diff --git a/extension/packages/tsconfig/module.json b/extension/packages/tsconfig/module.json new file mode 100644 index 0000000..045c028 --- /dev/null +++ b/extension/packages/tsconfig/module.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Module", + "extends": "./base.json", + "compilerOptions": { + "noEmit": false, + "moduleResolution": "NodeNext", + "module": "NodeNext" + } +} diff --git a/extension/packages/tsconfig/package.json b/extension/packages/tsconfig/package.json new file mode 100644 index 0000000..4fca940 --- /dev/null +++ b/extension/packages/tsconfig/package.json @@ -0,0 +1,7 @@ +{ + "name": "@extension/tsconfig", + "version": "0.5.0", + "description": "chrome extension - tsconfig", + "private": true, + "sideEffects": false +} diff --git a/extension/packages/ui/README.md b/extension/packages/ui/README.md new file mode 100644 index 0000000..bd3d74d --- /dev/null +++ b/extension/packages/ui/README.md @@ -0,0 +1,336 @@ +# UI Package + +This package provides components that make up the UI. + +## Installation + +First, move to the page you want to use. + +```shell +cd pages/options +``` + +Add the following to the dependencies in `package.json`. + +```json +{ + "dependencies": { + "@extension/ui": "workspace:*" + } +} +``` + +Then, run: + +```shell +pnpm install +``` + +Add the following to the `tailwind.config.ts` file. + +```ts +import baseConfig from '@extension/tailwindcss-config'; +import { withUI } from '@extension/ui'; + +export default withUI({ + ...baseConfig, + content: ['./index.html', './src/**/*.tsx'], +}); +``` + +Add the following to the first line of `index.css` file. + +```css +@import '@extension/ui/global.css'; +``` + +## Add Custom Component + +Add the following to the `lib/components/index.ts` file. + +```tsx +export * from './CustomComponent.js'; +``` + +Add the following to the `lib/components/CustomComponent.tsx` file. + +```tsx +import { cn } from '@/lib/utils.js'; +import type { ComponentPropsWithoutRef } from 'react'; + +type CustomComponentProps = ComponentPropsWithoutRef<'section'>; + +export const CustomComponent = ({ children, ...props }: CustomComponentProps) => { + return
{children}
; +} +``` + +## Usage + +```tsx +import { CustomComponent, ErrorDisplay, LoadingSpinner } from '@extension/ui'; + +const Page = () => { + return Hi, I'm a custom component.; +} + +export default withErrorBoundary(withSuspense(Page, ), ErrorDisplay); + +``` + +> [!TIP] +> You are able to set other size of the loading spinner by passing the `size` prop to the ``. + +## Modifying the tailwind config of the UI library + +Modify the `tailwind.config.ts` file to make global style changes to the package. + +## Modifying the css variable of the UI library + +Modify the css variable in the `ui/lib/global.css` code to change the css variable of all pages(with UI). + +## Guide for Adding shadcn to the UI Package + +You can refer to the this [manual guide](https://ui.shadcn.com/docs/installation/manual) + +1. Create components.json in packages/ui + + Create a file named `components.json` in the `packages/ui` directory with the following content: + + ```json + { + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "lib/global.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/lib/components", + "utils": "@/lib/utils", + "ui": "@/lib/components/ui", + "lib": "@/lib", + "hooks": "@/lib/hooks" + }, + "iconLibrary": "lucide" + } + ``` + +2. Install dependencies + + Run the following command from the root of your project: + + ```shell + pnpm add tailwindcss-animate class-variance-authority tailwind-merge lucide-react -F ui + ``` + +3. Edit `with-ui.ts` in `lib` folder + + This configuration file is from the manual guide. You can refer to the manual guide to modify the configuration file. ([ + `Configure tailwind.config.js`](https://ui.shadcn.com/docs/installation/manual)) + + ```ts + import deepmerge from 'deepmerge'; + import { fontFamily } from 'tailwindcss/defaultTheme'; + import tailwindAnimate from 'tailwindcss-animate'; + import type { Config } from 'tailwindcss'; + + export function withUI(tailwindConfig: Config): Config { + return deepmerge( + shadcnConfig, + deepmerge(tailwindConfig, { + content: ['./node_modules/@extension/ui/lib/**/*.{tsx,ts,js,jsx}'], + }), + ); + } + + const shadcnConfig = { + darkMode: ['class'], + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: `var(--radius)`, + md: `calc(var(--radius) - 2px)`, + sm: 'calc(var(--radius) - 4px)', + }, + fontFamily: { + sans: ['var(--font-sans)', ...fontFamily.sans], + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [tailwindAnimate], + }; + ``` + +4. Edit `global.css` in `lib` folder + + This configuration also comes from the manual guide. You can refer to the manual guide to modify the configuration + file. ([`Configure styles`](https://ui.shadcn.com/docs/installation/manual)) + + ```css + @tailwind base; + @tailwind components; + @tailwind utilities; + + @layer base { + :host, :root { + --background: 0 0% 100%; + --foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 47.4% 11.2%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --card: 0 0% 100%; + --card-foreground: 222.2 47.4% 11.2%; + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 100% 50%; + --destructive-foreground: 210 40% 98%; + --ring: 215 20.2% 65.1%; + --radius: 0.5rem; + } + + .dark { + --background: 224 71% 4%; + --foreground: 213 31% 91%; + --muted: 223 47% 11%; + --muted-foreground: 215.4 16.3% 56.9%; + --accent: 216 34% 17%; + --accent-foreground: 210 40% 98%; + --popover: 224 71% 4%; + --popover-foreground: 215 20.2% 65.1%; + --border: 216 34% 17%; + --input: 216 34% 17%; + --card: 224 71% 4%; + --card-foreground: 213 31% 91%; + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 1.2%; + --secondary: 222.2 47.4% 11.2%; + --secondary-foreground: 210 40% 98%; + --destructive: 0 63% 31%; + --destructive-foreground: 210 40% 98%; + --ring: 216 34% 17%; + } + } + + @layer base { + * { + @apply border-border; + } + + body { + @apply font-sans antialiased bg-background text-foreground; + } + } + ``` + + +5. Add shadcn components + + Finally, run this command from the root of your project to add the button component: + + ```shell + pnpm dlx shadcn@latest add button -c ./packages/ui + ``` + + This will add the shadcn button component to your UI package. + + Remember to adjust any paths or package names if your project structure differs from the assumed layout in this guide. + +6. Export components + +Edit the `index.ts` file in the `packages/ui` directory to export the shadcn ui component: + +```ts +//... +export * from './lib/components/ui/button'; +``` + +7. Apply global.css + +If you want to use shadcn components in content-ui ShadowDOM, you need to import ui package's global.css in the content-ui `tailwind-input.css` + +```css +@import '@extension/ui/lib/global.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; +``` + +If you want to use shadcn components in other pages, you need to import ui package's global.css in the `src/index.css` + +```css +@import '@extension/ui/lib/global.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; +``` diff --git a/extension/packages/ui/global.css b/extension/packages/ui/global.css new file mode 100644 index 0000000..6c7f776 --- /dev/null +++ b/extension/packages/ui/global.css @@ -0,0 +1,70 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96%; + --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + border-color: hsl(var(--border)); + } + body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} diff --git a/extension/packages/ui/index.ts b/extension/packages/ui/index.ts new file mode 100644 index 0000000..11aece6 --- /dev/null +++ b/extension/packages/ui/index.ts @@ -0,0 +1 @@ +export * from './lib/index'; diff --git a/extension/packages/ui/lib/assets/warning.svg b/extension/packages/ui/lib/assets/warning.svg new file mode 100644 index 0000000..6f561a3 --- /dev/null +++ b/extension/packages/ui/lib/assets/warning.svg @@ -0,0 +1,10 @@ + + + diff --git a/extension/packages/ui/lib/components/LoadingSpinner.tsx b/extension/packages/ui/lib/components/LoadingSpinner.tsx new file mode 100644 index 0000000..333575c --- /dev/null +++ b/extension/packages/ui/lib/components/LoadingSpinner.tsx @@ -0,0 +1,11 @@ +import { RingLoader } from 'react-spinners'; + +interface ILoadingSpinnerProps { + size?: number; +} + +export const LoadingSpinner = ({ size }: ILoadingSpinnerProps) => ( +
+ +
+); diff --git a/extension/packages/ui/lib/components/ToggleButton.tsx b/extension/packages/ui/lib/components/ToggleButton.tsx new file mode 100644 index 0000000..1bbc4e4 --- /dev/null +++ b/extension/packages/ui/lib/components/ToggleButton.tsx @@ -0,0 +1,23 @@ +import { cn } from '@/lib/utils'; +import { useStorage } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import type { ComponentPropsWithoutRef } from 'react'; + +type ToggleButtonProps = ComponentPropsWithoutRef<'button'>; + +export const ToggleButton = ({ className, children, ...props }: ToggleButtonProps) => { + const { isLight } = useStorage(exampleThemeStorage); + + return ( + + ); +}; diff --git a/extension/packages/ui/lib/components/error-display/ErrorDisplay.tsx b/extension/packages/ui/lib/components/error-display/ErrorDisplay.tsx new file mode 100644 index 0000000..48ba66a --- /dev/null +++ b/extension/packages/ui/lib/components/error-display/ErrorDisplay.tsx @@ -0,0 +1,13 @@ +import { ErrorHeader } from '@/lib/components/error-display/ErrorHeader'; +import { ErrorResetButton } from '@/lib/components/error-display/ErrorResetButton'; +import { ErrorStackTraceList } from '@/lib/components/error-display/ErrorStackTraceList'; + +export const ErrorDisplay = ({ error, resetErrorBoundary }: { error?: Error; resetErrorBoundary?: () => void }) => ( +
+
+ + + +
+
+); diff --git a/extension/packages/ui/lib/components/error-display/ErrorHeader.tsx b/extension/packages/ui/lib/components/error-display/ErrorHeader.tsx new file mode 100644 index 0000000..bfc820d --- /dev/null +++ b/extension/packages/ui/lib/components/error-display/ErrorHeader.tsx @@ -0,0 +1,21 @@ +import { t } from '@extension/i18n'; + +// FIXME: IMPORT SVG ICON INSTEAD OF DEFINING INLINE IT HERE +const WarningIcon = ({ className }: { className: string }) => ( + + + +); + +export const ErrorHeader = () => ( +
+ +

{t('displayErrorInfo')}

+

{t('displayErrorDescription')}.

+
+); diff --git a/extension/packages/ui/lib/components/error-display/ErrorResetButton.tsx b/extension/packages/ui/lib/components/error-display/ErrorResetButton.tsx new file mode 100644 index 0000000..aa3ef85 --- /dev/null +++ b/extension/packages/ui/lib/components/error-display/ErrorResetButton.tsx @@ -0,0 +1,11 @@ +import { t } from '@extension/i18n'; + +export const ErrorResetButton = ({ resetErrorBoundary }: { resetErrorBoundary?: () => void }) => ( +
+ +
+); diff --git a/extension/packages/ui/lib/components/error-display/ErrorStackTraceList.tsx b/extension/packages/ui/lib/components/error-display/ErrorStackTraceList.tsx new file mode 100644 index 0000000..6e28815 --- /dev/null +++ b/extension/packages/ui/lib/components/error-display/ErrorStackTraceList.tsx @@ -0,0 +1,20 @@ +import { t } from '@extension/i18n'; + +export const ErrorStackTraceList = ({ error }: { error?: Error }) => ( +
+
+
+

{t('displayErrorDetailsInfo')}

+
+

{error?.message || t('displayErrorUnknownErrorInfo')}

+ {error?.stack && ( +
+ Stack trace +
{error?.stack}
+
+ )} +
+
+
+
+); diff --git a/extension/packages/ui/lib/components/index.ts b/extension/packages/ui/lib/components/index.ts new file mode 100644 index 0000000..b9b5348 --- /dev/null +++ b/extension/packages/ui/lib/components/index.ts @@ -0,0 +1,3 @@ +export * from './ToggleButton'; +export * from './LoadingSpinner'; +export * from './error-display/ErrorDisplay'; diff --git a/extension/packages/ui/lib/components/ui/avatar.tsx b/extension/packages/ui/lib/components/ui/avatar.tsx new file mode 100644 index 0000000..5f73a47 --- /dev/null +++ b/extension/packages/ui/lib/components/ui/avatar.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { cn } from "../../utils/cn" + +const Avatar = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Avatar.displayName = "Avatar" + +const AvatarImage = React.forwardRef< + HTMLImageElement, + React.ImgHTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = "AvatarImage" + +const AvatarFallback = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AvatarFallback.displayName = "AvatarFallback" + +export { Avatar, AvatarImage, AvatarFallback } \ No newline at end of file diff --git a/extension/packages/ui/lib/components/ui/badge.tsx b/extension/packages/ui/lib/components/ui/badge.tsx new file mode 100644 index 0000000..b6239c7 --- /dev/null +++ b/extension/packages/ui/lib/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "../../utils/cn" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 dark:focus:ring-slate-300", + { + variants: { + variant: { + default: + "border-transparent bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80", + secondary: + "border-transparent bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80", + destructive: + "border-transparent bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80", + outline: "text-slate-950 dark:text-slate-50", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } \ No newline at end of file diff --git a/extension/packages/ui/lib/components/ui/button.tsx b/extension/packages/ui/lib/components/ui/button.tsx new file mode 100644 index 0000000..e0c91ca --- /dev/null +++ b/extension/packages/ui/lib/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "../../utils/cn" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-slate-950 dark:focus-visible:ring-slate-300", + { + variants: { + variant: { + default: "bg-slate-900 text-slate-50 hover:bg-slate-900/90 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/90", + destructive: + "bg-red-500 text-slate-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/90", + outline: + "border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:bg-slate-950 dark:hover:bg-slate-800 dark:hover:text-slate-50", + secondary: + "bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80", + ghost: "hover:bg-slate-100 hover:text-slate-900 dark:hover:bg-slate-800 dark:hover:text-slate-50", + link: "text-slate-900 underline-offset-4 hover:underline dark:text-slate-50", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } \ No newline at end of file diff --git a/web/src/components/ui/dropdown-menu.tsx b/extension/packages/ui/lib/components/ui/dropdown-menu.tsx similarity index 63% rename from web/src/components/ui/dropdown-menu.tsx rename to extension/packages/ui/lib/components/ui/dropdown-menu.tsx index cfa2986..5f6928d 100644 --- a/web/src/components/ui/dropdown-menu.tsx +++ b/extension/packages/ui/lib/components/ui/dropdown-menu.tsx @@ -1,12 +1,7 @@ import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" -import { - CheckIcon, - ChevronRightIcon, - DotFilledIcon, -} from "@radix-ui/react-icons" - -import { cn } from "@/lib/utils" +import { Check, ChevronRight, Circle } from "lucide-react" +import { cn } from "../../utils/cn" const DropdownMenu = DropdownMenuPrimitive.Root @@ -29,14 +24,14 @@ const DropdownMenuSubTrigger = React.forwardRef< {children} - + )) DropdownMenuSubTrigger.displayName = @@ -49,7 +44,7 @@ const DropdownMenuSubContent = React.forwardRef< - + - + {children} @@ -126,14 +120,14 @@ const DropdownMenuRadioItem = React.forwardRef< - + - + {children} @@ -150,8 +144,8 @@ const DropdownMenuLabel = React.forwardRef< (({ className, ...props }, ref) => ( )) @@ -177,7 +171,7 @@ const DropdownMenuShortcut = ({ }: React.HTMLAttributes) => { return ( ) @@ -200,4 +194,4 @@ export { DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, -} +} \ No newline at end of file diff --git a/extension/packages/ui/lib/components/ui/input.tsx b/extension/packages/ui/lib/components/ui/input.tsx new file mode 100644 index 0000000..fa0029c --- /dev/null +++ b/extension/packages/ui/lib/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "../../utils/cn" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } \ No newline at end of file diff --git a/web/src/components/ui/label.tsx b/extension/packages/ui/lib/components/ui/label.tsx similarity index 77% rename from web/src/components/ui/label.tsx rename to extension/packages/ui/lib/components/ui/label.tsx index 485f90e..4471b7b 100644 --- a/web/src/components/ui/label.tsx +++ b/extension/packages/ui/lib/components/ui/label.tsx @@ -2,10 +2,10 @@ import * as React from "react" import * as LabelPrimitive from "@radix-ui/react-label" import { cva, type VariantProps } from "class-variance-authority" -import { cn } from "@/lib/utils" +import { cn } from "../../utils/cn" const labelVariants = cva( - "srctext-sm srcfont-medium srcleading-none peer-disabled:srccursor-not-allowed peer-disabled:srcopacity-70" + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" ) const Label = React.forwardRef< @@ -21,4 +21,4 @@ const Label = React.forwardRef< )) Label.displayName = LabelPrimitive.Root.displayName -export { Label } +export { Label } \ No newline at end of file diff --git a/extension/packages/ui/lib/components/ui/modern-nav.tsx b/extension/packages/ui/lib/components/ui/modern-nav.tsx new file mode 100644 index 0000000..3ad94df --- /dev/null +++ b/extension/packages/ui/lib/components/ui/modern-nav.tsx @@ -0,0 +1,292 @@ +import * as React from "react" +import { Button } from "./button" +import { Avatar, AvatarFallback, AvatarImage } from "./avatar" +import { Badge } from "./badge" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "./dropdown-menu" +import { Separator } from "./separator" +import { cn } from "../../utils/cn" +import { + Settings, + LogOut, + User, + Bell, + Search, + Menu, + X, + ChevronDown, + Zap, + Activity, + Globe +} from "lucide-react" + +interface ModernNavProps { + title?: string + subtitle?: string + logoUrl?: string + isRecording?: boolean + recordingName?: string + actionCount?: number + connectionStatus?: 'connected' | 'disconnected' | 'connecting' + onOpenSettings?: () => void + onLogout?: () => void + onToggleRecording?: () => void + className?: string + variant?: 'default' | 'glass' | 'minimal' +} + +export const ModernNav: React.FC = ({ + title = "Orca Test Recorder", + subtitle, + logoUrl, + isRecording = false, + recordingName, + actionCount = 0, + connectionStatus = 'connected', + onOpenSettings, + onLogout, + onToggleRecording, + className, + variant = 'default' +}) => { + const [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false) + + const getConnectionColor = () => { + switch (connectionStatus) { + case 'connected': return 'text-green-500' + case 'connecting': return 'text-yellow-500' + case 'disconnected': return 'text-red-500' + default: return 'text-muted-foreground' + } + } + + const getConnectionIcon = () => { + switch (connectionStatus) { + case 'connected': return + case 'connecting': return + case 'disconnected': return + default: return + } + } + + const navVariants = { + default: "bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", + glass: "bg-background/10 backdrop-blur-xl border-white/10 supports-[backdrop-filter]:bg-background/5", + minimal: "bg-transparent border-transparent" + } + + return ( +
+
+
+ {/* Left Section - Logo & Title */} +
+
+ {logoUrl && ( +
+ Logo + {isRecording && ( +
+ )} +
+ )} +
+

+ {title} +

+ {subtitle && ( +

{subtitle}

+ )} +
+
+ + {/* Recording Status */} + {isRecording && ( +
+
+ + Recording + + {recordingName && ( + <> + + + {recordingName} + + + )} + {actionCount > 0 && ( + + {actionCount} actions + + )} +
+ )} +
+ + {/* Center Section - Search (Desktop) */} +
+
+ + +
+
+ + {/* Right Section - Actions */} +
+ {/* Connection Status */} +
+
+ {getConnectionIcon()} +
+ + {connectionStatus} + +
+ + {/* Action Buttons */} +
+ {/* Recording Toggle */} + {onToggleRecording && ( + + )} + + {/* Notifications */} + +
+ + {/* User Menu */} + + + + + + +
+

Test User

+

+ test@orca.com +

+
+
+ + {onOpenSettings && ( + + + Settings + + )} + + {onLogout && ( + + + Log out + + )} +
+
+ + {/* Mobile Menu Toggle */} + +
+
+ + {/* Mobile Menu */} + {isMobileMenuOpen && ( +
+
+ {/* Recording Status Mobile */} + {isRecording && ( +
+
+ Recording + {recordingName && ( + • {recordingName} + )} + {actionCount > 0 && ( + + {actionCount} + + )} +
+ )} + + {/* Search Mobile */} +
+
+ + +
+
+ + {/* Connection Status Mobile */} +
+ Connection +
+ {getConnectionIcon()} + {connectionStatus} +
+
+
+
+ )} +
+
+ ) +} \ No newline at end of file diff --git a/web/src/components/ui/radio-group.tsx b/extension/packages/ui/lib/components/ui/radio-group.tsx similarity index 56% rename from web/src/components/ui/radio-group.tsx rename to extension/packages/ui/lib/components/ui/radio-group.tsx index caeb919..da03e67 100644 --- a/web/src/components/ui/radio-group.tsx +++ b/extension/packages/ui/lib/components/ui/radio-group.tsx @@ -1,8 +1,8 @@ import * as React from "react" -import { CheckIcon } from "@radix-ui/react-icons" import * as RadioGroupPrimitive from "@radix-ui/react-radio-group" +import { Circle } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "../../utils/cn" const RadioGroup = React.forwardRef< React.ElementRef, @@ -10,7 +10,7 @@ const RadioGroup = React.forwardRef< >(({ className, ...props }, ref) => { return ( @@ -26,17 +26,17 @@ const RadioGroupItem = React.forwardRef< - - + + ) }) RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName -export { RadioGroup, RadioGroupItem } +export { RadioGroup, RadioGroupItem } \ No newline at end of file diff --git a/web/src/components/ui/separator.tsx b/extension/packages/ui/lib/components/ui/separator.tsx similarity index 76% rename from web/src/components/ui/separator.tsx rename to extension/packages/ui/lib/components/ui/separator.tsx index b7514b4..9d7ff5a 100644 --- a/web/src/components/ui/separator.tsx +++ b/extension/packages/ui/lib/components/ui/separator.tsx @@ -1,7 +1,6 @@ import * as React from "react" import * as SeparatorPrimitive from "@radix-ui/react-separator" - -import { cn } from "@/lib/utils" +import { cn } from "../../utils/cn" const Separator = React.forwardRef< React.ElementRef, @@ -16,8 +15,8 @@ const Separator = React.forwardRef< decorative={decorative} orientation={orientation} className={cn( - "srcshrink-0 srcbg-border", - orientation === "horizontal" ? "srch-[1px] srcw-full" : "srch-full srcw-[1px]", + "shrink-0 bg-border", + orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", className )} {...props} @@ -26,4 +25,4 @@ const Separator = React.forwardRef< ) Separator.displayName = SeparatorPrimitive.Root.displayName -export { Separator } +export { Separator } \ No newline at end of file diff --git a/extension/packages/ui/lib/components/ui/switch.tsx b/extension/packages/ui/lib/components/ui/switch.tsx new file mode 100644 index 0000000..5b7cdc2 --- /dev/null +++ b/extension/packages/ui/lib/components/ui/switch.tsx @@ -0,0 +1,27 @@ +import * as React from "react" +import * as SwitchPrimitives from "@radix-ui/react-switch" + +import { cn } from "../../utils/cn" + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +Switch.displayName = SwitchPrimitives.Root.displayName + +export { Switch } \ No newline at end of file diff --git a/extension/packages/ui/lib/index.ts b/extension/packages/ui/lib/index.ts new file mode 100644 index 0000000..ef428af --- /dev/null +++ b/extension/packages/ui/lib/index.ts @@ -0,0 +1,32 @@ +export * from './components/index'; +export * from './utils'; +export * from './with-ui'; + +// shadcn/ui components +export { Button, type ButtonProps } from './components/ui/button'; +export { Input, type InputProps } from './components/ui/input'; +export { Label } from './components/ui/label'; +export { Switch } from './components/ui/switch'; +export { RadioGroup, RadioGroupItem } from './components/ui/radio-group'; +export { Badge, type BadgeProps } from './components/ui/badge'; +export { Avatar, AvatarImage, AvatarFallback } from './components/ui/avatar'; +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem +} from './components/ui/dropdown-menu'; +export { Separator } from './components/ui/separator'; +export { ModernNav } from './components/ui/modern-nav'; +export { cn } from './utils/cn'; diff --git a/extension/packages/ui/lib/utils.ts b/extension/packages/ui/lib/utils.ts new file mode 100644 index 0000000..cfdd7d2 --- /dev/null +++ b/extension/packages/ui/lib/utils.ts @@ -0,0 +1,5 @@ +import { clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import type { ClassValue } from 'clsx'; + +export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs)); diff --git a/web/src/lib/utils.ts b/extension/packages/ui/lib/utils/cn.ts similarity index 98% rename from web/src/lib/utils.ts rename to extension/packages/ui/lib/utils/cn.ts index d084cca..1a860ee 100644 --- a/web/src/lib/utils.ts +++ b/extension/packages/ui/lib/utils/cn.ts @@ -3,4 +3,4 @@ import { twMerge } from "tailwind-merge" export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) -} +} \ No newline at end of file diff --git a/extension/packages/ui/lib/with-ui.ts b/extension/packages/ui/lib/with-ui.ts new file mode 100644 index 0000000..5922ef0 --- /dev/null +++ b/extension/packages/ui/lib/with-ui.ts @@ -0,0 +1,7 @@ +import deepmerge from 'deepmerge'; +import type { Config } from 'tailwindcss'; + +export const withUI = (tailwindConfig: Config): Config => + deepmerge(tailwindConfig, { + content: ['../../packages/ui/lib/**/*.tsx'], + }); diff --git a/extension/packages/ui/package.json b/extension/packages/ui/package.json new file mode 100644 index 0000000..dc6db32 --- /dev/null +++ b/extension/packages/ui/package.json @@ -0,0 +1,40 @@ +{ + "name": "@extension/ui", + "version": "0.5.0", + "description": "chrome extension - ui components", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "types": "index.ts", + "main": "dist/index.js", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "ready": "tsc -b && tsc-alias -p tsconfig.json", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/i18n": "workspace:*", + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-separator": "^1.1.7", + "clsx": "^2.1.1", + "tailwind-merge": "^3.3.0" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "react-spinners": "^0.17.0", + "tsc-alias": "^1.8.16" + } +} diff --git a/extension/packages/ui/tailwind.config.ts b/extension/packages/ui/tailwind.config.ts new file mode 100644 index 0000000..c930fcd --- /dev/null +++ b/extension/packages/ui/tailwind.config.ts @@ -0,0 +1,7 @@ +import globalConfig from '@extension/tailwindcss-config'; +import type { Config } from 'tailwindcss'; + +export default { + content: ['lib/**/*.tsx'], + presets: [globalConfig], +} satisfies Config; diff --git a/extension/packages/ui/tsconfig.json b/extension/packages/ui/tsconfig.json new file mode 100644 index 0000000..f4cfc35 --- /dev/null +++ b/extension/packages/ui/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "outDir": "dist", + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + }, + "noEmit": false, + "declaration": true + }, + "include": ["index.ts", "lib", "tailwind.config.ts"] +} diff --git a/extension/packages/vite-config/index.mts b/extension/packages/vite-config/index.mts new file mode 100644 index 0000000..09c185e --- /dev/null +++ b/extension/packages/vite-config/index.mts @@ -0,0 +1 @@ +export * from './lib/index.js'; diff --git a/extension/packages/vite-config/lib/build-content-script.ts b/extension/packages/vite-config/lib/build-content-script.ts new file mode 100644 index 0000000..09fe1f0 --- /dev/null +++ b/extension/packages/vite-config/lib/build-content-script.ts @@ -0,0 +1,96 @@ +import { withPageConfig } from './index.js'; +import { IS_DEV } from '@extension/env'; +import { makeEntryPointPlugin } from '@extension/hmr'; +import { build as buildTW } from 'tailwindcss/lib/cli/build'; +import { build } from 'vite'; +import { readdirSync, statSync } from 'node:fs'; +import { resolve } from 'node:path'; + +interface IContentBuilderProps { + matchesDir: string; + srcDir: string; + rootDir: string; + contentName: 'content' | 'content-ui' | 'content-runtime'; + withTw: boolean; +} + +type BuilderPropsType = Omit; + +const getContentScriptEntries = (matchesDir: string) => { + const entryPoints: Record = {}; + const entries = readdirSync(matchesDir); + + entries.forEach((folder: string) => { + const filePath = resolve(matchesDir, folder); + const isFolder = statSync(filePath).isDirectory(); + const haveIndexTsFile = readdirSync(filePath).includes('config.ts'); + const haveIndexTsxFile = readdirSync(filePath).includes('index.tsx'); + + if (isFolder && !(haveIndexTsFile || haveIndexTsxFile)) { + throw new Error(`${folder} in \`matches\` doesn't have index.ts or index.tsx file`); + } else { + entryPoints[folder] = resolve(filePath, haveIndexTsFile ? 'config.ts' : 'index.tsx'); + } + }); + + return entryPoints; +}; + +const configsBuilder = ({ matchesDir, srcDir, rootDir, contentName }: BuilderPropsType) => + Object.entries(getContentScriptEntries(matchesDir)).map(([name, entry]) => ({ + name, + config: withPageConfig({ + mode: IS_DEV ? 'development' : undefined, + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + plugins: [IS_DEV && makeEntryPointPlugin()], + build: { + lib: { + name: name, + formats: ['iife'], + entry, + fileName: name, + }, + outDir: resolve(rootDir, '..', '..', 'dist', contentName), + }, + }), + })); + +const builds = async ({ srcDir, contentName, rootDir, matchesDir, withTw }: IContentBuilderProps) => + configsBuilder({ matchesDir, srcDir, rootDir, contentName }).map(async ({ name, config }) => { + if (withTw) { + const folder = resolve(matchesDir, name); + const args = { + ['--input']: resolve(folder, 'index.css'), + ['--output']: resolve(rootDir, 'dist', name, 'index.css'), + ['--config']: resolve(rootDir, 'tailwind.config.ts'), + ['--watch']: IS_DEV, + }; + + await buildTW(args); + } + + //@ts-expect-error This is hidden property from vite's resolveConfig() + config.configFile = false; + return build(config); + }); + +// FIXME: USE THIS FOR ALL CONTENT SCRIPTs +export const contentBuilder = async ({ + matchesDir, + srcDir, + rootDir, + contentName, + withTw = true, +}: IContentBuilderProps) => + builds({ + srcDir, + contentName, + rootDir, + matchesDir, + withTw, + }); diff --git a/extension/packages/vite-config/lib/get-content-script-entires.ts b/extension/packages/vite-config/lib/get-content-script-entires.ts new file mode 100644 index 0000000..c481cb4 --- /dev/null +++ b/extension/packages/vite-config/lib/get-content-script-entires.ts @@ -0,0 +1,22 @@ +import { readdirSync, statSync } from 'node:fs'; +import { resolve } from 'node:path'; + +export const getContentScriptEntries = (matchesDir: string) => { + const entryPoints: Record = {}; + const entries = readdirSync(matchesDir); + + entries.forEach((folder: string) => { + const filePath = resolve(matchesDir, folder); + const isFolder = statSync(filePath).isDirectory(); + const haveIndexTsFile = readdirSync(filePath).includes('index.ts'); + const haveIndexTsxFile = readdirSync(filePath).includes('index.tsx'); + + if (isFolder && !(haveIndexTsFile || haveIndexTsxFile)) { + throw new Error(`${folder} in \`matches\` doesn't have index.ts or index.tsx file`); + } else { + entryPoints[folder] = resolve(filePath, haveIndexTsFile ? 'index.ts' : 'index.tsx'); + } + }); + + return entryPoints; +}; diff --git a/extension/packages/vite-config/lib/index.ts b/extension/packages/vite-config/lib/index.ts new file mode 100644 index 0000000..af40685 --- /dev/null +++ b/extension/packages/vite-config/lib/index.ts @@ -0,0 +1,2 @@ +export * from './with-page-config.js'; +export * from './get-content-script-entires.js'; diff --git a/extension/packages/vite-config/lib/with-page-config.ts b/extension/packages/vite-config/lib/with-page-config.ts new file mode 100644 index 0000000..a0187fa --- /dev/null +++ b/extension/packages/vite-config/lib/with-page-config.ts @@ -0,0 +1,39 @@ +import env, { IS_DEV, IS_PROD } from '@extension/env'; +import { watchRebuildPlugin } from '@extension/hmr'; +import react from '@vitejs/plugin-react-swc'; +import deepmerge from 'deepmerge'; +import { defineConfig } from 'vite'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; +import type { UserConfig } from 'vite'; + +export const watchOption = IS_DEV + ? { + chokidar: { + awaitWriteFinish: true, + }, + } + : undefined; + +export const withPageConfig = (config: UserConfig) => + defineConfig( + deepmerge( + { + define: { + 'process.env': env, + }, + base: '', + plugins: [react(), IS_DEV && watchRebuildPlugin({ refresh: true }), nodePolyfills()], + build: { + sourcemap: IS_DEV, + minify: IS_PROD, + reportCompressedSize: IS_PROD, + emptyOutDir: IS_PROD, + watch: watchOption, + rollupOptions: { + external: ['chrome'], + }, + }, + }, + config, + ), + ); diff --git a/extension/packages/vite-config/package.json b/extension/packages/vite-config/package.json new file mode 100644 index 0000000..f12551d --- /dev/null +++ b/extension/packages/vite-config/package.json @@ -0,0 +1,25 @@ +{ + "name": "@extension/vite-config", + "version": "0.5.0", + "description": "chrome extension - vite base configuration", + "type": "module", + "private": true, + "sideEffects": true, + "types": "index.mts", + "main": "dist/index.mjs", + "module": "dist/index.mjs", + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:bundle": "pnpx rimraf dist", + "clean": "pnpm clean:bundle && pnpm clean:node_modules", + "ready": "tsc -b" + }, + "dependencies": { + "@extension/env": "workspace:*" + }, + "devDependencies": { + "@extension/hmr": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@vitejs/plugin-react-swc": "^3.9.0" + } +} diff --git a/extension/packages/vite-config/tailwind.d.ts b/extension/packages/vite-config/tailwind.d.ts new file mode 100644 index 0000000..6cf861a --- /dev/null +++ b/extension/packages/vite-config/tailwind.d.ts @@ -0,0 +1 @@ +declare module 'tailwindcss/lib/cli/build'; diff --git a/extension/packages/vite-config/tsconfig.json b/extension/packages/vite-config/tsconfig.json new file mode 100644 index 0000000..5e3961e --- /dev/null +++ b/extension/packages/vite-config/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["lib", "index.mts", "tailwind.d.ts"] +} diff --git a/extension/packages/zipper/index.mts b/extension/packages/zipper/index.mts new file mode 100644 index 0000000..7d0531f --- /dev/null +++ b/extension/packages/zipper/index.mts @@ -0,0 +1,13 @@ +import { resolve } from 'node:path'; +import { zipBundle } from './lib/index.js'; +import { IS_FIREFOX } from '@extension/env'; + +const YYYY_MM_DD = new Date().toISOString().slice(0, 10).replace(/-/g, ''); +const HH_mm_ss = new Date().toISOString().slice(11, 19).replace(/:/g, ''); +const fileName = `extension-${YYYY_MM_DD}-${HH_mm_ss}`; + +await zipBundle({ + distDirectory: resolve(import.meta.dirname, '..', '..', '..', 'dist'), + buildDirectory: resolve(import.meta.dirname, '..', '..', '..', 'dist-zip'), + archiveName: IS_FIREFOX ? `${fileName}.xpi` : `${fileName}.zip`, +}); diff --git a/extension/packages/zipper/lib/index.ts b/extension/packages/zipper/lib/index.ts new file mode 100644 index 0000000..8d19cde --- /dev/null +++ b/extension/packages/zipper/lib/index.ts @@ -0,0 +1 @@ +export * from './zip-bundle.js'; diff --git a/extension/packages/zipper/lib/zip-bundle.ts b/extension/packages/zipper/lib/zip-bundle.ts new file mode 100644 index 0000000..e5704a7 --- /dev/null +++ b/extension/packages/zipper/lib/zip-bundle.ts @@ -0,0 +1,87 @@ +import { streamFileToZip } from '@extension/dev-utils'; +import fg from 'fast-glob'; +import { Zip } from 'fflate'; +import { createWriteStream, existsSync, mkdirSync } from 'node:fs'; +import { posix, resolve } from 'node:path'; + +const toMB = (bytes: number): number => bytes / 1024 / 1024; + +const ensureBuildDirectoryExists = (buildDirectory: string): void => { + if (!existsSync(buildDirectory)) { + mkdirSync(buildDirectory, { recursive: true }); + } +}; + +const logPackageSize = (size: number, startTime: number): void => { + console.log(`Zip Package size: ${toMB(size).toFixed(2)} MB in ${Date.now() - startTime}ms`); +}; + +export const zipBundle = async ( + { + distDirectory, + buildDirectory, + archiveName, + }: { + distDirectory: string; + buildDirectory: string; + archiveName: string; + }, + withMaps = false, +): Promise => { + ensureBuildDirectoryExists(buildDirectory); + + const zipFilePath = resolve(buildDirectory, archiveName); + const output = createWriteStream(zipFilePath); + + const fileList = await fg( + [ + '**/*', // Pick all nested files + ...(!withMaps ? ['!**/(*.js.map|*.css.map)'] : []), // Exclude source maps conditionally + ], + { + cwd: distDirectory, + onlyFiles: true, + }, + ); + + return new Promise((pResolve, pReject) => { + let aborted = false; + let totalSize = 0; + const timer = Date.now(); + const zip = new Zip((err, data, final) => { + if (err) { + pReject(err); + } else { + totalSize += data.length; + output.write(data); + if (final) { + logPackageSize(totalSize, timer); + output.end(); + pResolve(); + } + } + }); + + for (const file of fileList) { + if (aborted) return; + + const absPath = resolve(distDirectory, file); + const absPosixPath = posix.resolve(distDirectory, file); + const relPosixPath = posix.relative(distDirectory, absPosixPath); + + console.log(`Adding file: ${relPosixPath}`); + streamFileToZip( + absPath, + relPosixPath, + zip, + () => { + aborted = true; + zip.terminate(); + }, + error => pReject(`Error reading file ${absPath}: ${error.message}`), + ); + } + + zip.end(); + }); +}; diff --git a/extension/packages/zipper/package.json b/extension/packages/zipper/package.json new file mode 100644 index 0000000..b230e03 --- /dev/null +++ b/extension/packages/zipper/package.json @@ -0,0 +1,30 @@ +{ + "name": "@extension/zipper", + "version": "0.5.0", + "description": "chrome extension - zipper", + "type": "module", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "types": "index.mts", + "main": "dist/index.mjs", + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "zip": "node --env-file=../../.env dist/index.mjs", + "lint": "eslint .", + "ready": "tsc -b", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*", + "@extension/dev-utils": "workspace:*", + "@extension/env": "workspace:*" + } +} diff --git a/extension/packages/zipper/tsconfig.json b/extension/packages/zipper/tsconfig.json new file mode 100644 index 0000000..40168e1 --- /dev/null +++ b/extension/packages/zipper/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["index.mts", "lib"] +} diff --git a/extension/pages/content-runtime/README.md b/extension/pages/content-runtime/README.md new file mode 100644 index 0000000..14f699e --- /dev/null +++ b/extension/pages/content-runtime/README.md @@ -0,0 +1,15 @@ +# Content Runtime Script + +This tool allows users to inject scripts (Console and UI) during runtime into all pages specified by you. + +### Add New Script + +1. Copy `matches/example` folder and paste it with other name and edit content. +2. Define somewhere(e.g in `popup`(You have declared it as default)): + +```ts +await chrome.scripting.executeScript({ + ..., + files: ['/content-runtime/{matches_folder_name}.iife.js'], +}) +``` diff --git a/extension/pages/content-runtime/build.mts b/extension/pages/content-runtime/build.mts new file mode 100644 index 0000000..7c6f238 --- /dev/null +++ b/extension/pages/content-runtime/build.mts @@ -0,0 +1,49 @@ +import { resolve } from 'node:path'; +import { makeEntryPointPlugin } from '@extension/hmr'; +import { getContentScriptEntries, withPageConfig } from '@extension/vite-config'; +import { IS_DEV } from '@extension/env'; +import { build } from 'vite'; +import { build as buildTW } from 'tailwindcss/lib/cli/build'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); +const matchesDir = resolve(srcDir, 'matches'); + +const configs = Object.entries(getContentScriptEntries(matchesDir)).map(([name, entry]) => ({ + name, + config: withPageConfig({ + mode: IS_DEV ? 'development' : undefined, + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + plugins: [IS_DEV && makeEntryPointPlugin()], + build: { + lib: { + name: name, + formats: ['iife'], + entry, + fileName: name, + }, + outDir: resolve(rootDir, '..', '..', 'dist', 'content-runtime'), + }, + }), +})); + +const builds = configs.map(async ({ name, config }) => { + const folder = resolve(matchesDir, name); + const args = { + ['--input']: resolve(folder, 'index.css'), + ['--output']: resolve(rootDir, 'dist', name, 'index.css'), + ['--config']: resolve(rootDir, 'tailwind.config.ts'), + ['--watch']: IS_DEV, + }; + await buildTW(args); + //@ts-expect-error This is hidden property into vite's resolveConfig() + config.configFile = false; + await build(config); +}); + +await Promise.all(builds); diff --git a/extension/pages/content-runtime/package.json b/extension/pages/content-runtime/package.json new file mode 100644 index 0000000..60f302e --- /dev/null +++ b/extension/pages/content-runtime/package.json @@ -0,0 +1,32 @@ +{ + "name": "@extension/content-runtime-script", + "version": "0.5.0", + "description": "chrome extension - content runtime script", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "tsx build.mts", + "dev": "tsx build.mts", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/env": "workspace:*", + "@extension/ui": "workspace:*" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*", + "@extension/hmr": "workspace:*", + "@extension/shared": "workspace:*" + } +} diff --git a/extension/pages/content-runtime/src/matches/all/App.tsx b/extension/pages/content-runtime/src/matches/all/App.tsx new file mode 100644 index 0000000..78c837b --- /dev/null +++ b/extension/pages/content-runtime/src/matches/all/App.tsx @@ -0,0 +1,9 @@ +import { useEffect } from 'react'; + +export default function App() { + useEffect(() => { + console.log('[CEB] All runtime content view loaded'); + }, []); + + return
All runtime content view
; +} diff --git a/extension/pages/content-runtime/src/matches/all/index.css b/extension/pages/content-runtime/src/matches/all/index.css new file mode 100644 index 0000000..3f6a81e --- /dev/null +++ b/extension/pages/content-runtime/src/matches/all/index.css @@ -0,0 +1,5 @@ +@import '@extension/ui/global.css'; + +.ceb-all-runtime-content-view-text { + font-size: 20px; +} diff --git a/extension/pages/content-runtime/src/matches/all/index.tsx b/extension/pages/content-runtime/src/matches/all/index.tsx new file mode 100644 index 0000000..817e373 --- /dev/null +++ b/extension/pages/content-runtime/src/matches/all/index.tsx @@ -0,0 +1,5 @@ +import inlineCss from '../../../dist/all/index.css?inline'; +import { initAppWithShadow } from '@extension/shared'; +import App from '@src/matches/all/App'; + +initAppWithShadow({ id: 'CEB-extension-runtime-all', app: , inlineCss }); diff --git a/extension/pages/content-runtime/src/matches/example/App.tsx b/extension/pages/content-runtime/src/matches/example/App.tsx new file mode 100644 index 0000000..6d12e82 --- /dev/null +++ b/extension/pages/content-runtime/src/matches/example/App.tsx @@ -0,0 +1,9 @@ +import { useEffect } from 'react'; + +export default function App() { + useEffect(() => { + console.log('[CEB] Example runtime content view loaded'); + }, []); + + return
Example runtime content view
; +} diff --git a/extension/pages/content-runtime/src/matches/example/index.css b/extension/pages/content-runtime/src/matches/example/index.css new file mode 100644 index 0000000..59c15eb --- /dev/null +++ b/extension/pages/content-runtime/src/matches/example/index.css @@ -0,0 +1,5 @@ +@import '@extension/ui/global.css'; + +.ceb-example-runtime-content-view-text { + font-size: 20px; +} diff --git a/extension/pages/content-runtime/src/matches/example/index.tsx b/extension/pages/content-runtime/src/matches/example/index.tsx new file mode 100644 index 0000000..4b7efc7 --- /dev/null +++ b/extension/pages/content-runtime/src/matches/example/index.tsx @@ -0,0 +1,5 @@ +import inlineCss from '../../../dist/example/index.css?inline'; +import { initAppWithShadow } from '@extension/shared'; +import App from '@src/matches/example/App'; + +initAppWithShadow({ id: 'CEB-extension-runtime-example', app: , inlineCss }); diff --git a/extension/pages/content-runtime/tailwind.config.ts b/extension/pages/content-runtime/tailwind.config.ts new file mode 100644 index 0000000..378f1b8 --- /dev/null +++ b/extension/pages/content-runtime/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['src/**/*.tsx'], +}); diff --git a/extension/pages/content-runtime/tailwind.d.ts b/extension/pages/content-runtime/tailwind.d.ts new file mode 100644 index 0000000..021d8bf --- /dev/null +++ b/extension/pages/content-runtime/tailwind.d.ts @@ -0,0 +1,5 @@ +declare module 'tailwindcss/lib/cli/build'; +declare module '*?inline' { + const src: string; + export default src; +} diff --git a/extension/pages/content-runtime/tsconfig.json b/extension/pages/content-runtime/tsconfig.json new file mode 100644 index 0000000..879e32c --- /dev/null +++ b/extension/pages/content-runtime/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node", "./tailwind.d.ts"], + "allowImportingTsExtensions": true + }, + "include": ["src", "build.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/content-ui/README.md b/extension/pages/content-ui/README.md new file mode 100644 index 0000000..47142c5 --- /dev/null +++ b/extension/pages/content-ui/README.md @@ -0,0 +1,23 @@ +# Content UI Script + +This tool allows you to inject React Components into all pages specified by you. + +### Add New Script + +1. Copy `matches/example` folder and paste it with other name and edit content. + + > [!NOTE] + > Remember to edit import: + > ```ts + > import App from '@src/matches/{new_folder}/App'; + > ``` + +2. Edit `manifest.ts`: +- In `content-scripts` section add object with: + +```ts +{ + matches: ['URL_FOR_INJECT'], + js: ['content-ui/{matches_folder_name}.iife.js'] +} +``` \ No newline at end of file diff --git a/extension/pages/content-ui/build.mts b/extension/pages/content-ui/build.mts new file mode 100644 index 0000000..293bee5 --- /dev/null +++ b/extension/pages/content-ui/build.mts @@ -0,0 +1,49 @@ +import { resolve } from 'node:path'; +import { makeEntryPointPlugin } from '@extension/hmr'; +import { getContentScriptEntries, withPageConfig } from '@extension/vite-config'; +import { IS_DEV } from '@extension/env'; +import { build } from 'vite'; +import { build as buildTW } from 'tailwindcss/lib/cli/build'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); +const matchesDir = resolve(srcDir, 'matches'); + +const configs = Object.entries(getContentScriptEntries(matchesDir)).map(([name, entry]) => ({ + name, + config: withPageConfig({ + mode: IS_DEV ? 'development' : undefined, + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + plugins: [IS_DEV && makeEntryPointPlugin()], + build: { + lib: { + name: name, + formats: ['iife'], + entry, + fileName: name, + }, + outDir: resolve(rootDir, '..', '..', 'dist', 'content-ui'), + }, + }), +})); + +const builds = configs.map(async ({ name, config }) => { + const folder = resolve(matchesDir, name); + const args = { + ['--input']: resolve(folder, 'index.css'), + ['--output']: resolve(rootDir, 'dist', name, 'index.css'), + ['--config']: resolve(rootDir, 'tailwind.config.ts'), + ['--watch']: IS_DEV, + }; + await buildTW(args); + //@ts-expect-error This is hidden property into vite's resolveConfig() + config.configFile = false; + await build(config); +}); + +await Promise.all(builds); diff --git a/extension/pages/content-ui/package.json b/extension/pages/content-ui/package.json new file mode 100644 index 0000000..b20878d --- /dev/null +++ b/extension/pages/content-ui/package.json @@ -0,0 +1,35 @@ +{ + "name": "@extension/content-ui", + "version": "0.5.0", + "description": "chrome extension - content ui", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:node_modules && pnpm clean:turbo", + "build": "tsx build.mts", + "dev": "tsx build.mts", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/ui": "workspace:*", + "@extension/i18n": "workspace:*", + "@extension/env": "workspace:*" + }, + "devDependencies": { + "@extension/hmr": "workspace:*", + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + } +} diff --git a/extension/pages/content-ui/public/logo.svg b/extension/pages/content-ui/public/logo.svg new file mode 100644 index 0000000..6b60c10 --- /dev/null +++ b/extension/pages/content-ui/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extension/pages/content-ui/src/matches/all/App.tsx b/extension/pages/content-ui/src/matches/all/App.tsx new file mode 100644 index 0000000..59dbd3c --- /dev/null +++ b/extension/pages/content-ui/src/matches/all/App.tsx @@ -0,0 +1,18 @@ +import { t } from '@extension/i18n'; +import { ToggleButton } from '@extension/ui'; +import { useEffect } from 'react'; + +export default function App() { + useEffect(() => { + console.log('[CEB] Content ui all loaded'); + }, []); + + return ( +
+
+ Edit pages/content-ui/src/matches/all/App.tsx and save to reload. +
+ {t('toggleTheme')} +
+ ); +} diff --git a/extension/pages/content-ui/src/matches/all/index.css b/extension/pages/content-ui/src/matches/all/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/content-ui/src/matches/all/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/content-ui/src/matches/all/index.tsx b/extension/pages/content-ui/src/matches/all/index.tsx new file mode 100644 index 0000000..4f55148 --- /dev/null +++ b/extension/pages/content-ui/src/matches/all/index.tsx @@ -0,0 +1,5 @@ +import inlineCss from '../../../dist/all/index.css?inline'; +import { initAppWithShadow } from '@extension/shared'; +import App from '@src/matches/all/App'; + +initAppWithShadow({ id: 'CEB-extension-all', app: , inlineCss }); diff --git a/extension/pages/content-ui/src/matches/example/App.tsx b/extension/pages/content-ui/src/matches/example/App.tsx new file mode 100644 index 0000000..b3ef6ab --- /dev/null +++ b/extension/pages/content-ui/src/matches/example/App.tsx @@ -0,0 +1,18 @@ +import { t } from '@extension/i18n'; +import { ToggleButton } from '@extension/ui'; +import { useEffect } from 'react'; + +export default function App() { + useEffect(() => { + console.log('[CEB] Content ui example loaded'); + }, []); + + return ( +
+
+ Edit pages/content-ui/src/matches/example/App.tsx and save to reload. +
+ {t('toggleTheme')} +
+ ); +} diff --git a/extension/pages/content-ui/src/matches/example/index.css b/extension/pages/content-ui/src/matches/example/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/content-ui/src/matches/example/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/content-ui/src/matches/example/index.tsx b/extension/pages/content-ui/src/matches/example/index.tsx new file mode 100644 index 0000000..8c90986 --- /dev/null +++ b/extension/pages/content-ui/src/matches/example/index.tsx @@ -0,0 +1,5 @@ +import inlineCss from '../../../dist/example/index.css?inline'; +import { initAppWithShadow } from '@extension/shared'; +import App from '@src/matches/example/App'; + +initAppWithShadow({ id: 'CEB-extension-example', app: , inlineCss }); diff --git a/extension/pages/content-ui/tailwind.config.ts b/extension/pages/content-ui/tailwind.config.ts new file mode 100644 index 0000000..378f1b8 --- /dev/null +++ b/extension/pages/content-ui/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['src/**/*.tsx'], +}); diff --git a/extension/pages/content-ui/tailwind.d.ts b/extension/pages/content-ui/tailwind.d.ts new file mode 100644 index 0000000..021d8bf --- /dev/null +++ b/extension/pages/content-ui/tailwind.d.ts @@ -0,0 +1,5 @@ +declare module 'tailwindcss/lib/cli/build'; +declare module '*?inline' { + const src: string; + export default src; +} diff --git a/extension/pages/content-ui/tsconfig.json b/extension/pages/content-ui/tsconfig.json new file mode 100644 index 0000000..aceb8d1 --- /dev/null +++ b/extension/pages/content-ui/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node", "./tailwind.d.ts"] + }, + "include": ["src", "tailwind.config.ts", "build.mts"] +} diff --git a/extension/pages/content/README.md b/extension/pages/content/README.md new file mode 100644 index 0000000..5553a2c --- /dev/null +++ b/extension/pages/content/README.md @@ -0,0 +1,18 @@ +# Content Script + +This tool allows you to inject Console Scripts into all pages specified by you. + +https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts + +### Add New Script + +1. Copy `matches/example` folder and paste it with other name and edit content. +2. Edit `manifest.ts`: +- In `content-scripts` section add object with: + +```ts +{ + matches: ['URL_FOR_INJECT'], + js: ['content/{matches_folder_name}.iife.js'] +} +``` \ No newline at end of file diff --git a/extension/pages/content/build.mts b/extension/pages/content/build.mts new file mode 100644 index 0000000..098fb51 --- /dev/null +++ b/extension/pages/content/build.mts @@ -0,0 +1,39 @@ +import { resolve } from 'node:path'; +import { makeEntryPointPlugin } from '@extension/hmr'; +import { getContentScriptEntries, withPageConfig } from '@extension/vite-config'; +import { IS_DEV } from '@extension/env'; +import { build } from 'vite'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); +const matchesDir = resolve(srcDir, 'matches'); + +const configs = Object.entries(getContentScriptEntries(matchesDir)).map(([name, entry]) => + withPageConfig({ + mode: IS_DEV ? 'development' : undefined, + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + plugins: [IS_DEV && makeEntryPointPlugin()], + build: { + lib: { + name: name, + formats: ['iife'], + entry, + fileName: name, + }, + outDir: resolve(rootDir, '..', '..', 'dist', 'content'), + }, + }), +); + +const builds = configs.map(async config => { + //@ts-expect-error This is hidden property into vite's resolveConfig() + config.configFile = false; + await build(config); +}); + +await Promise.all(builds); diff --git a/extension/pages/content/package.json b/extension/pages/content/package.json new file mode 100644 index 0000000..2c36886 --- /dev/null +++ b/extension/pages/content/package.json @@ -0,0 +1,33 @@ +{ + "name": "@extension/content-script", + "version": "0.5.0", + "description": "chrome extension - content script", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:bundle": "rimraf dist", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:bundle && pnpm clean:turbo && pnpm clean:node_modules", + "build": "tsx build.mts", + "dev": "tsx build.mts", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/env": "workspace:*" + }, + "devDependencies": { + "@extension/hmr": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + } +} diff --git a/extension/pages/content/public/logo.svg b/extension/pages/content/public/logo.svg new file mode 100644 index 0000000..6b60c10 --- /dev/null +++ b/extension/pages/content/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extension/pages/content/src/matches/all/index.ts b/extension/pages/content/src/matches/all/index.ts new file mode 100644 index 0000000..8374460 --- /dev/null +++ b/extension/pages/content/src/matches/all/index.ts @@ -0,0 +1,5 @@ +import { sampleFunction } from '@src/sample-function'; + +console.log('[CEB] All content script loaded'); + +void sampleFunction(); diff --git a/extension/pages/content/src/matches/example/index.ts b/extension/pages/content/src/matches/example/index.ts new file mode 100644 index 0000000..de79d5d --- /dev/null +++ b/extension/pages/content/src/matches/example/index.ts @@ -0,0 +1,5 @@ +import { sampleFunction } from '@src/sample-function'; + +console.log('[CEB] Example content script loaded'); + +void sampleFunction(); diff --git a/extension/pages/content/src/sample-function.ts b/extension/pages/content/src/sample-function.ts new file mode 100644 index 0000000..a0d72e8 --- /dev/null +++ b/extension/pages/content/src/sample-function.ts @@ -0,0 +1,3 @@ +export const sampleFunction = () => { + console.log('content script - sampleFunction() called from another module'); +}; diff --git a/extension/pages/content/tsconfig.json b/extension/pages/content/tsconfig.json new file mode 100644 index 0000000..c8186a2 --- /dev/null +++ b/extension/pages/content/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "build.mts"] +} diff --git a/extension/pages/devtools-panel/index.html b/extension/pages/devtools-panel/index.html new file mode 100644 index 0000000..8402fc1 --- /dev/null +++ b/extension/pages/devtools-panel/index.html @@ -0,0 +1,12 @@ + + + + + Devtools Panel + + + +
+ + + diff --git a/extension/pages/devtools-panel/package.json b/extension/pages/devtools-panel/package.json new file mode 100644 index 0000000..332a9c3 --- /dev/null +++ b/extension/pages/devtools-panel/package.json @@ -0,0 +1,39 @@ +{ + "name": "@extension/devtools-panel", + "version": "0.5.0", + "description": "chrome extension - devtools panel", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/i18n": "workspace:*", + "@extension/ui": "workspace:*" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + }, + "postcss": { + "plugins": { + "tailwindcss": {}, + "autoprefixer": {} + } + } +} diff --git a/extension/pages/devtools-panel/public/logo_horizontal.svg b/extension/pages/devtools-panel/public/logo_horizontal.svg new file mode 100644 index 0000000..232e97b --- /dev/null +++ b/extension/pages/devtools-panel/public/logo_horizontal.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/devtools-panel/public/logo_horizontal_dark.svg b/extension/pages/devtools-panel/public/logo_horizontal_dark.svg new file mode 100644 index 0000000..cf19a3e --- /dev/null +++ b/extension/pages/devtools-panel/public/logo_horizontal_dark.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/devtools-panel/src/Panel.css b/extension/pages/devtools-panel/src/Panel.css new file mode 100644 index 0000000..7354dea --- /dev/null +++ b/extension/pages/devtools-panel/src/Panel.css @@ -0,0 +1,28 @@ +.App { + text-align: center; + height: 100vh; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem; +} + +.App-logo { + height: 40vmin; +} + +.App-header { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); +} + +code { + background: rgba(148, 163, 184, 0.5); + border-radius: 0.25rem; + padding: 0.2rem 0.5rem; +} diff --git a/extension/pages/devtools-panel/src/Panel.tsx b/extension/pages/devtools-panel/src/Panel.tsx new file mode 100644 index 0000000..1f71c89 --- /dev/null +++ b/extension/pages/devtools-panel/src/Panel.tsx @@ -0,0 +1,45 @@ +import '@src/Panel.css'; +import { t } from '@extension/i18n'; +import { PROJECT_URL_OBJECT, useStorage, withErrorBoundary, withSuspense } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { cn, ErrorDisplay, LoadingSpinner } from '@extension/ui'; +import type { ComponentPropsWithoutRef } from 'react'; + +const Panel = () => { + const { isLight } = useStorage(exampleThemeStorage); + const logo = isLight ? 'devtools-panel/logo_horizontal.svg' : 'devtools-panel/logo_horizontal_dark.svg'; + + const goGithubSite = () => chrome.tabs.create(PROJECT_URL_OBJECT); + + return ( +
+
+ +

+ Edit pages/devtools-panel/src/Panel.tsx +

+ {t('toggleTheme')} +
+
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const { isLight } = useStorage(exampleThemeStorage); + + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(Panel, ), ErrorDisplay); diff --git a/extension/pages/devtools-panel/src/index.css b/extension/pages/devtools-panel/src/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/devtools-panel/src/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/devtools-panel/src/index.tsx b/extension/pages/devtools-panel/src/index.tsx new file mode 100644 index 0000000..b4e1ed5 --- /dev/null +++ b/extension/pages/devtools-panel/src/index.tsx @@ -0,0 +1,15 @@ +import '@src/index.css'; +import Panel from '@src/Panel'; +import { createRoot } from 'react-dom/client'; + +const init = () => { + const appContainer = document.querySelector('#app-container'); + if (!appContainer) { + throw new Error('Can not find #app-container'); + } + const root = createRoot(appContainer); + + root.render(); +}; + +init(); diff --git a/extension/pages/devtools-panel/tailwind.config.ts b/extension/pages/devtools-panel/tailwind.config.ts new file mode 100644 index 0000000..3418ee6 --- /dev/null +++ b/extension/pages/devtools-panel/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['index.html', 'src/**/*.tsx'], +}); diff --git a/extension/pages/devtools-panel/tsconfig.json b/extension/pages/devtools-panel/tsconfig.json new file mode 100644 index 0000000..b85f4eb --- /dev/null +++ b/extension/pages/devtools-panel/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/devtools-panel/vite.config.mts b/extension/pages/devtools-panel/vite.config.mts new file mode 100644 index 0000000..4eab241 --- /dev/null +++ b/extension/pages/devtools-panel/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'devtools-panel'), + }, +}); diff --git a/extension/pages/devtools/index.html b/extension/pages/devtools/index.html new file mode 100644 index 0000000..80ebcea --- /dev/null +++ b/extension/pages/devtools/index.html @@ -0,0 +1,11 @@ + + + + + Devtools + + + + + + diff --git a/extension/pages/devtools/package.json b/extension/pages/devtools/package.json new file mode 100644 index 0000000..f2e4d92 --- /dev/null +++ b/extension/pages/devtools/package.json @@ -0,0 +1,29 @@ +{ + "name": "@extension/devtools", + "version": "0.5.0", + "description": "chrome extension - devtools", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*" + }, + "devDependencies": { + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + } +} diff --git a/extension/pages/devtools/public/logo.svg b/extension/pages/devtools/public/logo.svg new file mode 100644 index 0000000..6b60c10 --- /dev/null +++ b/extension/pages/devtools/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extension/pages/devtools/src/index.ts b/extension/pages/devtools/src/index.ts new file mode 100644 index 0000000..41fd50c --- /dev/null +++ b/extension/pages/devtools/src/index.ts @@ -0,0 +1,6 @@ +try { + console.log("Edit 'pages/devtools/src/index.ts' and save to reload."); + chrome.devtools.panels.create('Dev Tools', '/icon-34.png', '/devtools-panel/index.html'); +} catch (e) { + console.error(e); +} diff --git a/extension/pages/devtools/tsconfig.json b/extension/pages/devtools/tsconfig.json new file mode 100644 index 0000000..226e61f --- /dev/null +++ b/extension/pages/devtools/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts"] +} diff --git a/extension/pages/devtools/vite.config.mts b/extension/pages/devtools/vite.config.mts new file mode 100644 index 0000000..70b4ea8 --- /dev/null +++ b/extension/pages/devtools/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'devtools'), + }, +}); diff --git a/extension/pages/new-tab/index.html b/extension/pages/new-tab/index.html new file mode 100644 index 0000000..121ef98 --- /dev/null +++ b/extension/pages/new-tab/index.html @@ -0,0 +1,12 @@ + + + + + New Tab + + + +
+ + + diff --git a/extension/pages/new-tab/package.json b/extension/pages/new-tab/package.json new file mode 100644 index 0000000..d33fd03 --- /dev/null +++ b/extension/pages/new-tab/package.json @@ -0,0 +1,40 @@ +{ + "name": "@extension/new-tab", + "version": "0.5.0", + "description": "chrome extension - new tab", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/i18n": "workspace:*", + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/ui": "workspace:*" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*", + "sass": "^1.89.0" + }, + "postcss": { + "plugins": { + "tailwindcss": {}, + "autoprefixer": {} + } + } +} diff --git a/extension/pages/new-tab/public/logo_horizontal.svg b/extension/pages/new-tab/public/logo_horizontal.svg new file mode 100644 index 0000000..232e97b --- /dev/null +++ b/extension/pages/new-tab/public/logo_horizontal.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/new-tab/public/logo_horizontal_dark.svg b/extension/pages/new-tab/public/logo_horizontal_dark.svg new file mode 100644 index 0000000..cf19a3e --- /dev/null +++ b/extension/pages/new-tab/public/logo_horizontal_dark.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/new-tab/src/NewTab.css b/extension/pages/new-tab/src/NewTab.css new file mode 100644 index 0000000..26c291a --- /dev/null +++ b/extension/pages/new-tab/src/NewTab.css @@ -0,0 +1,22 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; +} + +.App-header { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); +} + +code { + background: rgba(148, 163, 184, 0.5); + border-radius: 0.25rem; + padding: 0.2rem 0.5rem; +} diff --git a/extension/pages/new-tab/src/NewTab.scss b/extension/pages/new-tab/src/NewTab.scss new file mode 100644 index 0000000..8960c7b --- /dev/null +++ b/extension/pages/new-tab/src/NewTab.scss @@ -0,0 +1,10 @@ +$myColor: red; + +h1, +h2, +h3, +h4, +h5, +h6 { + color: $myColor; +} diff --git a/extension/pages/new-tab/src/NewTab.tsx b/extension/pages/new-tab/src/NewTab.tsx new file mode 100644 index 0000000..10c1dfa --- /dev/null +++ b/extension/pages/new-tab/src/NewTab.tsx @@ -0,0 +1,58 @@ +import '@src/NewTab.css'; +import { useStorage, withErrorBoundary, withSuspense } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { cn, ErrorDisplay, LoadingSpinner } from '@extension/ui'; +import { LoginPage } from './components/LoginPage'; +import { SettingsPage } from './components/SettingsPage'; +import { MainPage } from './components/MainPage'; +import React, { useState, useEffect } from 'react'; + +type Page = 'login' | 'main' | 'settings'; + +const NewTab = () => { + const [currentPage, setCurrentPage] = useState('login'); + const [isAuthenticated, setIsAuthenticated] = useState(false); + + useEffect(() => { + // Check if user is already authenticated + chrome.storage.local.get(['orcaAuthToken', 'orcaEndpoint'], (result) => { + if (result.orcaAuthToken && result.orcaEndpoint) { + setIsAuthenticated(true); + setCurrentPage('main'); + } + }); + }, []); + + const handleLogin = () => { + chrome.storage.local.set({ orcaAuthToken: 'temp_token_' + Date.now() }); + setIsAuthenticated(true); + setCurrentPage('main'); + }; + + const handleLogout = () => { + chrome.storage.local.remove(['orcaAuthToken']); + setIsAuthenticated(false); + setCurrentPage('login'); + }; + + const openSettings = () => { + setCurrentPage('settings'); + }; + + const backToMain = () => { + setCurrentPage(isAuthenticated ? 'main' : 'login'); + }; + + switch (currentPage) { + case 'login': + return ; + case 'settings': + return ; + case 'main': + return ; + default: + return ; + } +}; + +export default withErrorBoundary(withSuspense(NewTab, ), ErrorDisplay); diff --git a/extension/pages/new-tab/src/components/LoginPage.tsx b/extension/pages/new-tab/src/components/LoginPage.tsx new file mode 100644 index 0000000..4abe12c --- /dev/null +++ b/extension/pages/new-tab/src/components/LoginPage.tsx @@ -0,0 +1,115 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Input, Label, cn } from '@extension/ui'; +import { Settings } from 'lucide-react'; + +interface LoginPageProps { + onLogin: () => void; + onOpenSettings: () => void; +} + +export const LoginPage: React.FC = ({ onLogin, onOpenSettings }) => { + const [endpoint, setEndpoint] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(''); + + useEffect(() => { + // Load saved endpoint + chrome.storage.local.get(['orcaEndpoint'], (result) => { + if (result.orcaEndpoint) { + setEndpoint(result.orcaEndpoint); + } + }); + }, []); + + const handleLogin = async () => { + if (!endpoint.trim()) { + setError('Please configure an endpoint first'); + return; + } + + setIsLoading(true); + setError(''); + + try { + // Open the login URL in a new tab + const loginUrl = `${endpoint.replace(/\/$/, '')}/auth/login?redirect_uri=${encodeURIComponent(chrome.runtime.getURL('/'))}`; + chrome.tabs.create({ url: loginUrl }); + + // For now, we'll assume login is successful + // In a real implementation, you'd listen for the auth callback + setTimeout(() => { + setIsLoading(false); + onLogin(); + }, 1000); + } catch (err) { + setError('Login failed. Please check your endpoint.'); + setIsLoading(false); + } + }; + + return ( +
+ {/* Header */} +
+
+
+ Orca Logo +

Orca Test Recorder

+
+ +
+
+ + {/* Content */} +
+
+
+

Welcome to Orca

+

Connect to your Orca instance to start recording tests

+
+ + {error && ( +
+

{error}

+
+ )} + +
+
+ + setEndpoint(e.target.value)} + placeholder="https://your-orca-instance.com" + /> +

+ Configure your Orca server endpoint +

+
+ + +
+ +
+

Need help? Check the settings for endpoint configuration

+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/new-tab/src/components/MainPage.tsx b/extension/pages/new-tab/src/components/MainPage.tsx new file mode 100644 index 0000000..49fb627 --- /dev/null +++ b/extension/pages/new-tab/src/components/MainPage.tsx @@ -0,0 +1,132 @@ +import React, { useState } from 'react'; +import { Button, Input, Label, Badge, cn } from '@extension/ui'; +import { Settings, LogOut, Play, Square } from 'lucide-react'; + +interface MainPageProps { + onOpenSettings: () => void; + onLogout: () => void; +} + +export const MainPage: React.FC = ({ onOpenSettings, onLogout }) => { + const [isRecording, setIsRecording] = useState(false); + const [recordingName, setRecordingName] = useState(''); + const [actionCount, setActionCount] = useState(0); + + const handleStartRecording = () => { + if (!recordingName.trim()) return; + setIsRecording(true); + setActionCount(0); + }; + + const handleStopRecording = () => { + setIsRecording(false); + setRecordingName(''); + setActionCount(0); + }; + + return ( +
+ {/* Header */} +
+
+
+ Orca Logo +

Orca Test Recorder

+
+
+ + +
+
+
+ + {/* Content */} +
+ {/* Recording Status */} +
+
+
+ + {isRecording ? 'Recording' : 'Ready'} + + {isRecording && actionCount > 0 && ( + + {actionCount} actions + + )} +
+
+ + {/* Recording Controls */} +
+ {!isRecording ? ( +
+
+ + setRecordingName(e.target.value)} + placeholder="Enter test name..." + /> +
+ +
+ ) : ( +
+
+

+ Currently Recording: {recordingName} +

+

+ Interact with the webpage to record actions +

+
+ +
+ )} +
+ + {/* Instructions */} + {!isRecording && ( +
+

Getting Started

+
    +
  • 1. Enter a name for your test recording
  • +
  • 2. Click "Start Recording" to begin
  • +
  • 3. Interact with the webpage normally
  • +
  • 4. Click "Stop Recording" when finished
  • +
+
+ )} +
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/new-tab/src/components/SettingsPage.tsx b/extension/pages/new-tab/src/components/SettingsPage.tsx new file mode 100644 index 0000000..28bd82b --- /dev/null +++ b/extension/pages/new-tab/src/components/SettingsPage.tsx @@ -0,0 +1,217 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Input, Label, RadioGroup, RadioGroupItem, Badge, Switch, cn } from '@extension/ui'; +import { useStorage } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { t } from '@extension/i18n'; +import { ArrowLeft, Trash2 } from 'lucide-react'; + +interface SettingsPageProps { + onBack: () => void; +} + +interface EndpointConfig { + name: string; + url: string; + type: 'local' | 'remote'; +} + +const DEFAULT_ENDPOINTS: EndpointConfig[] = [ + { name: 'Local Development', url: 'http://localhost:4004', type: 'local' }, + { name: 'Local Docker', url: 'http://localhost:8080', type: 'local' }, + { name: 'Production', url: 'https://orca.example.com', type: 'remote' }, +]; + +export const SettingsPage: React.FC = ({ onBack }) => { + const [endpoints, setEndpoints] = useState(DEFAULT_ENDPOINTS); + const [selectedEndpoint, setSelectedEndpoint] = useState(''); + const [customEndpoint, setCustomEndpoint] = useState(''); + const [isCustom, setIsCustom] = useState(false); + + useEffect(() => { + // Load saved settings + chrome.storage.local.get(['orcaEndpoint', 'orcaEndpoints'], (result) => { + if (result.orcaEndpoints) { + setEndpoints([...DEFAULT_ENDPOINTS, ...result.orcaEndpoints]); + } + if (result.orcaEndpoint) { + const endpoint = result.orcaEndpoint; + const predefined = [...DEFAULT_ENDPOINTS, ...(result.orcaEndpoints || [])].find(e => e.url === endpoint); + if (predefined) { + setSelectedEndpoint(endpoint); + setIsCustom(false); + } else { + setCustomEndpoint(endpoint); + setIsCustom(true); + } + } + }); + }, []); + + const saveEndpoint = () => { + const endpoint = isCustom ? customEndpoint : selectedEndpoint; + chrome.storage.local.set({ orcaEndpoint: endpoint }); + }; + + const addCustomEndpoint = () => { + if (!customEndpoint.trim()) return; + + const newEndpoint: EndpointConfig = { + name: `Custom (${new URL(customEndpoint).hostname})`, + url: customEndpoint, + type: 'remote' + }; + + const updatedEndpoints = [...endpoints, newEndpoint]; + setEndpoints(updatedEndpoints); + + const customEndpoints = updatedEndpoints.filter(e => !DEFAULT_ENDPOINTS.includes(e)); + chrome.storage.local.set({ orcaEndpoints: customEndpoints }); + + setSelectedEndpoint(customEndpoint); + setIsCustom(false); + setCustomEndpoint(''); + }; + + const removeEndpoint = (url: string) => { + const updatedEndpoints = endpoints.filter(e => e.url !== url || DEFAULT_ENDPOINTS.includes(e)); + setEndpoints(updatedEndpoints); + + const customEndpoints = updatedEndpoints.filter(e => !DEFAULT_ENDPOINTS.includes(e)); + chrome.storage.local.set({ orcaEndpoints: customEndpoints }); + + if (selectedEndpoint === url) { + setSelectedEndpoint(''); + } + }; + + return ( +
+ {/* Header */} +
+
+ +

Settings

+
+
+ + {/* Content */} +
+ {/* Endpoint Configuration */} +
+

Endpoint Configuration

+ +
+
+ + { + if (value === 'custom') { + setIsCustom(true); + } else { + setSelectedEndpoint(value); + setIsCustom(false); + } + }} + className="space-y-3" + > + {endpoints.map((endpoint) => ( +
+ + +
+ ))} + +
+ + +
+
+
+ + {isCustom && ( +
+
+ setCustomEndpoint(e.target.value)} + placeholder="https://your-custom-endpoint.com" + className="flex-1" + /> + +
+
+ )} + + +
+
+ + {/* Theme Settings */} +
+

Appearance

+
+
+
+ +

Choose between light and dark mode

+
+ +
+
+
+ + {/* About */} +
+

About

+
+
+ Orca Logo +
+

Orca Test Recorder

+

Version 1.0.0

+
+
+

+ Record browser interactions for automated testing with the Orca platform. +

+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/new-tab/src/index.css b/extension/pages/new-tab/src/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/new-tab/src/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/new-tab/src/index.tsx b/extension/pages/new-tab/src/index.tsx new file mode 100644 index 0000000..49b8150 --- /dev/null +++ b/extension/pages/new-tab/src/index.tsx @@ -0,0 +1,15 @@ +import '@src/index.css'; +import NewTab from '@src/NewTab'; +import { createRoot } from 'react-dom/client'; + +const init = () => { + const appContainer = document.querySelector('#app-container'); + if (!appContainer) { + throw new Error('Can not find #app-container'); + } + const root = createRoot(appContainer); + + root.render(); +}; + +init(); diff --git a/extension/pages/new-tab/tailwind.config.ts b/extension/pages/new-tab/tailwind.config.ts new file mode 100644 index 0000000..3418ee6 --- /dev/null +++ b/extension/pages/new-tab/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['index.html', 'src/**/*.tsx'], +}); diff --git a/extension/pages/new-tab/tsconfig.json b/extension/pages/new-tab/tsconfig.json new file mode 100644 index 0000000..b85f4eb --- /dev/null +++ b/extension/pages/new-tab/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/new-tab/vite.config.mts b/extension/pages/new-tab/vite.config.mts new file mode 100644 index 0000000..f473549 --- /dev/null +++ b/extension/pages/new-tab/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'new-tab'), + }, +}); diff --git a/extension/pages/options/index.html b/extension/pages/options/index.html new file mode 100644 index 0000000..65e1fdd --- /dev/null +++ b/extension/pages/options/index.html @@ -0,0 +1,12 @@ + + + + + Options + + + +
+ + + diff --git a/extension/pages/options/package.json b/extension/pages/options/package.json new file mode 100644 index 0000000..79ac3fd --- /dev/null +++ b/extension/pages/options/package.json @@ -0,0 +1,39 @@ +{ + "name": "@extension/options", + "version": "0.5.0", + "description": "chrome extension - options", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/ui": "workspace:*", + "@extension/i18n": "workspace:*" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + }, + "postcss": { + "plugins": { + "tailwindcss": {}, + "autoprefixer": {} + } + } +} diff --git a/extension/pages/options/public/logo_horizontal.svg b/extension/pages/options/public/logo_horizontal.svg new file mode 100644 index 0000000..232e97b --- /dev/null +++ b/extension/pages/options/public/logo_horizontal.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/options/public/logo_horizontal_dark.svg b/extension/pages/options/public/logo_horizontal_dark.svg new file mode 100644 index 0000000..cf19a3e --- /dev/null +++ b/extension/pages/options/public/logo_horizontal_dark.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/options/src/Options.css b/extension/pages/options/src/Options.css new file mode 100644 index 0000000..6e36d2a --- /dev/null +++ b/extension/pages/options/src/Options.css @@ -0,0 +1,26 @@ +#app-container { + text-align: center; + width: 100vw; + height: 100vh; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +.App { + width: 100vw; + height: 100vh; + font-size: calc(10px + 2vmin); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +code { + background: rgba(148, 163, 184, 0.5); + border-radius: 0.25rem; + padding: 0.2rem 0.5rem; +} diff --git a/extension/pages/options/src/Options.tsx b/extension/pages/options/src/Options.tsx new file mode 100644 index 0000000..09d8263 --- /dev/null +++ b/extension/pages/options/src/Options.tsx @@ -0,0 +1,26 @@ +import '@src/Options.css'; +import { t } from '@extension/i18n'; +import { PROJECT_URL_OBJECT, useStorage, withErrorBoundary, withSuspense } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { cn, ErrorDisplay, LoadingSpinner, ToggleButton } from '@extension/ui'; + +const Options = () => { + const { isLight } = useStorage(exampleThemeStorage); + const logo = isLight ? 'options/logo_horizontal.svg' : 'options/logo_horizontal_dark.svg'; + + const goGithubSite = () => chrome.tabs.create(PROJECT_URL_OBJECT); + + return ( +
+ +

+ Edit pages/options/src/Options.tsx +

+ {t('toggleTheme')} +
+ ); +}; + +export default withErrorBoundary(withSuspense(Options, ), ErrorDisplay); diff --git a/extension/pages/options/src/index.css b/extension/pages/options/src/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/options/src/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/options/src/index.tsx b/extension/pages/options/src/index.tsx new file mode 100644 index 0000000..a0b576c --- /dev/null +++ b/extension/pages/options/src/index.tsx @@ -0,0 +1,14 @@ +import '@src/index.css'; +import Options from '@src/Options'; +import { createRoot } from 'react-dom/client'; + +const init = () => { + const appContainer = document.querySelector('#app-container'); + if (!appContainer) { + throw new Error('Can not find #app-container'); + } + const root = createRoot(appContainer); + root.render(); +}; + +init(); diff --git a/extension/pages/options/tailwind.config.ts b/extension/pages/options/tailwind.config.ts new file mode 100644 index 0000000..3418ee6 --- /dev/null +++ b/extension/pages/options/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['index.html', 'src/**/*.tsx'], +}); diff --git a/extension/pages/options/tsconfig.json b/extension/pages/options/tsconfig.json new file mode 100644 index 0000000..b85f4eb --- /dev/null +++ b/extension/pages/options/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/options/vite.config.mts b/extension/pages/options/vite.config.mts new file mode 100644 index 0000000..6220f06 --- /dev/null +++ b/extension/pages/options/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'options'), + }, +}); diff --git a/extension/pages/popup/index.html b/extension/pages/popup/index.html new file mode 100644 index 0000000..f75fabf --- /dev/null +++ b/extension/pages/popup/index.html @@ -0,0 +1,12 @@ + + + + + Popup + + + +
+ + + diff --git a/extension/pages/popup/package.json b/extension/pages/popup/package.json new file mode 100644 index 0000000..0ae822c --- /dev/null +++ b/extension/pages/popup/package.json @@ -0,0 +1,40 @@ +{ + "name": "@extension/popup", + "version": "0.5.0", + "description": "chrome extension - popup", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/i18n": "workspace:*", + "@extension/ui": "workspace:*", + "@extension/orca-api": "workspace:*" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + }, + "postcss": { + "plugins": { + "tailwindcss": {}, + "autoprefixer": {} + } + } +} diff --git a/extension/pages/popup/public/logo_vertical.svg b/extension/pages/popup/public/logo_vertical.svg new file mode 100644 index 0000000..5768b87 --- /dev/null +++ b/extension/pages/popup/public/logo_vertical.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/popup/public/logo_vertical_dark.svg b/extension/pages/popup/public/logo_vertical_dark.svg new file mode 100644 index 0000000..b4089d8 --- /dev/null +++ b/extension/pages/popup/public/logo_vertical_dark.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/popup/src/Popup.css b/extension/pages/popup/src/Popup.css new file mode 100644 index 0000000..fa1a3f8 --- /dev/null +++ b/extension/pages/popup/src/Popup.css @@ -0,0 +1,70 @@ +/* Orca Extension Popup Styles */ + +.orca-popup { + width: 320px; + min-height: 400px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; +} + +.orca-popup-header { + border-bottom: 1px solid #e5e7eb; +} + +.orca-popup-content { + max-height: 500px; + overflow-y: auto; +} + +/* Utility classes for better text handling */ +.line-clamp-2 { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +/* Custom scrollbar for popup content */ +.orca-popup-content::-webkit-scrollbar { + width: 4px; +} + +.orca-popup-content::-webkit-scrollbar-track { + background: #f1f5f9; +} + +.orca-popup-content::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 2px; +} + +.orca-popup-content::-webkit-scrollbar-thumb:hover { + background: #94a3b8; +} + +/* Animation for recording indicator */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +/* Loading spinner animation */ +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} \ No newline at end of file diff --git a/extension/pages/popup/src/Popup.tsx b/extension/pages/popup/src/Popup.tsx new file mode 100644 index 0000000..4509f67 --- /dev/null +++ b/extension/pages/popup/src/Popup.tsx @@ -0,0 +1,36 @@ +import '@src/Popup.css'; +import { t } from '@extension/i18n'; +import { useStorage, withErrorBoundary, withSuspense } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { Button, ErrorDisplay, LoadingSpinner, cn } from '@extension/ui'; +import { ExternalLink } from 'lucide-react'; + +const Popup = () => { + const { isLight } = useStorage(exampleThemeStorage); + const logo = isLight ? 'popup/logo_vertical.svg' : 'popup/logo_vertical_dark.svg'; + + const openSidePanel = () => { + chrome.sidePanel?.open({ windowId: chrome.windows.WINDOW_ID_CURRENT }); + window.close(); + }; + + return ( +
+
+ Orca Logo +

+ Orca Test Recorder +

+

+ Use the side panel for the full experience +

+ +
+
+ ); +}; + +export default withErrorBoundary(withSuspense(Popup, ), ErrorDisplay); diff --git a/extension/pages/popup/src/components/ApplicationSelector.tsx b/extension/pages/popup/src/components/ApplicationSelector.tsx new file mode 100644 index 0000000..f05b85a --- /dev/null +++ b/extension/pages/popup/src/components/ApplicationSelector.tsx @@ -0,0 +1 @@ +import React, { useState, useEffect } from 'react';\nimport { cn } from '@extension/ui';\nimport type { OrcaApplication } from '@extension/orca-api';\nimport { MessageType } from '@extension/orca-api';\n\nexport const ApplicationSelector: React.FC = () => {\n const [applications, setApplications] = useState([]);\n const [selectedAppId, setSelectedAppId] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n loadApplications();\n \n // Load saved selection\n loadSelectedApplication();\n }, []);\n\n const loadApplications = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await chrome.runtime.sendMessage({\n type: MessageType.GET_APPS,\n });\n\n if (response.success && response.data) {\n setApplications(response.data);\n } else {\n setError(response.error || 'Failed to load applications');\n }\n } catch (error) {\n setError('Failed to communicate with extension');\n console.error('Failed to load applications:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const loadSelectedApplication = async () => {\n try {\n const result = await chrome.storage.local.get(['selectedAppId']);\n if (result.selectedAppId) {\n setSelectedAppId(result.selectedAppId);\n }\n } catch (error) {\n console.error('Failed to load selected application:', error);\n }\n };\n\n const handleSelectionChange = async (appId: string) => {\n setSelectedAppId(appId);\n \n // Save selection\n try {\n await chrome.storage.local.set({ selectedAppId: appId });\n } catch (error) {\n console.error('Failed to save selected application:', error);\n }\n };\n\n const getSelectedApplication = (): OrcaApplication | undefined => {\n return applications.find(app => app.id === selectedAppId);\n };\n\n if (isLoading && applications.length === 0) {\n return (\n
\n \n
\n
\n Loading applications...\n
\n
\n );\n }\n\n if (error) {\n return (\n
\n \n
\n
\n

{error}

\n \n Retry\n \n
\n
\n
\n );\n }\n\n if (applications.length === 0) {\n return (\n
\n \n
\n

\n No applications found. Please create an application in Orca first.\n

\n \n Refresh\n \n
\n
\n );\n }\n\n const selectedApp = getSelectedApplication();\n\n return (\n
\n \n \n
\n handleSelectionChange(e.target.value)}\n className={cn(\n 'w-full px-3 py-2 border rounded-md text-sm appearance-none',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500',\n 'bg-white border-gray-300'\n )}\n >\n \n {applications.map((app) => (\n \n ))}\n \n \n {/* Custom dropdown arrow */}\n
\n \n \n \n
\n
\n\n {/* Selected application info */}\n {selectedApp && (\n
\n
\n
\n

\n {selectedApp.name}\n

\n {selectedApp.description && (\n

\n {selectedApp.description}\n

\n )}\n

\n Base URL: {selectedApp.base_url}\n

\n
\n \n \n \n \n \n \n
\n
\n )}\n
\n );\n};" \ No newline at end of file diff --git a/extension/pages/popup/src/components/ConnectionStatus.tsx b/extension/pages/popup/src/components/ConnectionStatus.tsx new file mode 100644 index 0000000..d4f1fac --- /dev/null +++ b/extension/pages/popup/src/components/ConnectionStatus.tsx @@ -0,0 +1 @@ +import React, { useState, useEffect } from 'react';\nimport { cn } from '@extension/ui';\nimport type { ConnectionState } from '@extension/orca-api';\nimport { MessageType } from '@extension/orca-api';\n\nexport const ConnectionStatus: React.FC = () => {\n const [connectionState, setConnectionState] = useState('unknown');\n const [isTestingConnection, setIsTestingConnection] = useState(false);\n const [lastChecked, setLastChecked] = useState(null);\n\n useEffect(() => {\n // Test connection on component mount\n testConnection();\n\n // Set up periodic connection checks\n const interval = setInterval(testConnection, 30000); // Check every 30 seconds\n\n return () => clearInterval(interval);\n }, []);\n\n const testConnection = async () => {\n setConnectionState('checking');\n setIsTestingConnection(true);\n\n try {\n const response = await chrome.runtime.sendMessage({\n type: MessageType.TEST_CONNECTION,\n });\n\n if (response.success) {\n setConnectionState(response.status === 'connected' ? 'connected' : 'error');\n } else {\n setConnectionState('disconnected');\n }\n } catch (error) {\n setConnectionState('error');\n } finally {\n setIsTestingConnection(false);\n setLastChecked(new Date());\n }\n };\n\n const getStatusColor = (): string => {\n switch (connectionState) {\n case 'connected':\n return 'text-green-600';\n case 'disconnected':\n return 'text-red-600';\n case 'error':\n return 'text-red-600';\n case 'checking':\n return 'text-blue-600';\n default:\n return 'text-gray-400';\n }\n };\n\n const getStatusIcon = (): string => {\n switch (connectionState) {\n case 'connected':\n return '🟢';\n case 'disconnected':\n return '🔴';\n case 'error':\n return '❌';\n case 'checking':\n return '🟡';\n default:\n return '⚪';\n }\n };\n\n const getStatusText = (): string => {\n switch (connectionState) {\n case 'connected':\n return 'Connected';\n case 'disconnected':\n return 'Disconnected';\n case 'error':\n return 'Error';\n case 'checking':\n return 'Checking...';\n default:\n return 'Unknown';\n }\n };\n\n const getStatusDescription = (): string => {\n switch (connectionState) {\n case 'connected':\n return 'Orca API is reachable';\n case 'disconnected':\n return 'Cannot connect to Orca API';\n case 'error':\n return 'API connection error';\n case 'checking':\n return 'Testing connection...';\n default:\n return 'Connection status unknown';\n }\n };\n\n return (\n
\n \n {getStatusIcon()}\n \n {getStatusText()}\n \n \n
\n );\n};" \ No newline at end of file diff --git a/extension/pages/popup/src/components/RecordingControls.tsx b/extension/pages/popup/src/components/RecordingControls.tsx new file mode 100644 index 0000000..bcb5835 --- /dev/null +++ b/extension/pages/popup/src/components/RecordingControls.tsx @@ -0,0 +1,345 @@ +import React, { useState, useEffect } from 'react'; +import { cn } from '@extension/ui'; +import type { RecordingState, OrcaRecording } from '@extension/orca-api'; +import { MessageType } from '@extension/orca-api'; + +interface RecordingStatus { + recordingState: RecordingState; + actionCount: number; + currentRecording?: OrcaRecording; + error?: string; +} + +export const RecordingControls: React.FC = () => { + const [status, setStatus] = useState({ + recordingState: 'idle' as RecordingState, + actionCount: 0, + }); + const [recordingName, setRecordingName] = useState(''); + const [selectedAppId, setSelectedAppId] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + // Get initial status + getRecordingStatus(); + + // Listen for status updates + const handleMessage = (message: any) => { + if (message.type === MessageType.UPDATE_STATUS) { + setStatus({ + recordingState: message.data.recordingState, + actionCount: message.data.actionCount, + currentRecording: message.data.currentRecording, + }); + } + }; + + chrome.runtime.onMessage.addListener(handleMessage); + + return () => { + chrome.runtime.onMessage.removeListener(handleMessage); + }; + }, []); + + const getRecordingStatus = async () => { + try { + const response = await chrome.runtime.sendMessage({ + type: MessageType.GET_STATUS, + }); + if (response.success) { + setStatus({ + recordingState: response.recordingState, + actionCount: response.actionCount, + currentRecording: response.currentRecording, + }); + } + } catch (error) { + console.error('Failed to get recording status:', error); + } + }; + + const startRecording = async () => { + if (!selectedAppId || !recordingName.trim()) { + setStatus(prev => ({ + ...prev, + error: 'Please select an application and enter a recording name', + })); + return; + } + + setIsLoading(true); + setStatus(prev => ({ ...prev, error: undefined })); + + try { + const response = await chrome.runtime.sendMessage({ + type: MessageType.START_RECORDING, + data: { + appId: selectedAppId, + recordingName: recordingName.trim(), + }, + }); + + if (!response.success) { + setStatus(prev => ({ + ...prev, + error: response.error || 'Failed to start recording', + })); + } + } catch (error) { + setStatus(prev => ({ + ...prev, + error: 'Failed to communicate with extension', + })); + } finally { + setIsLoading(false); + } + }; + + const stopRecording = async () => { + setIsLoading(true); + + try { + const response = await chrome.runtime.sendMessage({ + type: MessageType.STOP_RECORDING, + }); + + if (!response.success) { + setStatus(prev => ({ + ...prev, + error: response.error || 'Failed to stop recording', + })); + } + } catch (error) { + setStatus(prev => ({ + ...prev, + error: 'Failed to communicate with extension', + })); + } finally { + setIsLoading(false); + } + }; + + const pauseRecording = async () => { + setIsLoading(true); + + try { + const response = await chrome.runtime.sendMessage({ + type: MessageType.PAUSE_RECORDING, + }); + + if (!response.success) { + setStatus(prev => ({ + ...prev, + error: response.error || 'Failed to pause recording', + })); + } + } catch (error) { + setStatus(prev => ({ + ...prev, + error: 'Failed to communicate with extension', + })); + } finally { + setIsLoading(false); + } + }; + + const resumeRecording = async () => { + setIsLoading(true); + + try { + const response = await chrome.runtime.sendMessage({ + type: MessageType.RESUME_RECORDING, + }); + + if (!response.success) { + setStatus(prev => ({ + ...prev, + error: response.error || 'Failed to resume recording', + })); + } + } catch (error) { + setStatus(prev => ({ + ...prev, + error: 'Failed to communicate with extension', + })); + } finally { + setIsLoading(false); + } + }; + + const getStatusColor = (): string => { + switch (status.recordingState) { + case 'recording': + return 'text-red-600'; + case 'paused': + return 'text-yellow-600'; + case 'processing': + return 'text-blue-600'; + default: + return 'text-gray-600'; + } + }; + + const getStatusText = (): string => { + switch (status.recordingState) { + case 'recording': + return 'Recording'; + case 'paused': + return 'Paused'; + case 'processing': + return 'Processing'; + case 'stopping': + return 'Stopping'; + default: + return 'Ready'; + } + }; + + const isRecording = status.recordingState === 'recording'; + const isPaused = status.recordingState === 'paused'; + const isIdle = status.recordingState === 'idle'; + const canStart = isIdle && selectedAppId && recordingName.trim(); + + return ( +
+ {/* Status Display */} +
+
+
+ + {getStatusText()} + +
+ + {status.actionCount > 0 && ( + + {status.actionCount} actions + + )} +
+ + {/* Error Display */} + {status.error && ( +
+

{status.error}

+
+ )} + + {/* Recording Name Input */} + {isIdle && ( +
+ + setRecordingName(e.target.value)} + placeholder="Enter recording name..." + className={cn( + 'w-full px-3 py-2 border rounded-md text-sm', + 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500', + 'border-gray-300' + )} + disabled={isLoading} + /> +
+ )} + + {/* Current Recording Info */} + {status.currentRecording && !isIdle && ( +
+

+ {status.currentRecording.name} +

+ {status.currentRecording.description && ( +

+ {status.currentRecording.description} +

+ )} +
+ )} + + {/* Control Buttons */} +
+ {isIdle && ( + + )} + + {isRecording && ( + <> + + + + )} + + {isPaused && ( + <> + + + + )} +
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/popup/src/index.css b/extension/pages/popup/src/index.css new file mode 100644 index 0000000..0f6ad88 --- /dev/null +++ b/extension/pages/popup/src/index.css @@ -0,0 +1,6 @@ +@import '@extension/ui/global.css'; + +body { + width: 300px; + height: 260px; +} diff --git a/extension/pages/popup/src/index.tsx b/extension/pages/popup/src/index.tsx new file mode 100644 index 0000000..afd2e44 --- /dev/null +++ b/extension/pages/popup/src/index.tsx @@ -0,0 +1,15 @@ +import '@src/index.css'; +import Popup from '@src/Popup'; +import { createRoot } from 'react-dom/client'; + +const init = () => { + const appContainer = document.querySelector('#app-container'); + if (!appContainer) { + throw new Error('Can not find #app-container'); + } + const root = createRoot(appContainer); + + root.render(); +}; + +init(); diff --git a/extension/pages/popup/tailwind.config.ts b/extension/pages/popup/tailwind.config.ts new file mode 100644 index 0000000..3418ee6 --- /dev/null +++ b/extension/pages/popup/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['index.html', 'src/**/*.tsx'], +}); diff --git a/extension/pages/popup/tsconfig.json b/extension/pages/popup/tsconfig.json new file mode 100644 index 0000000..b85f4eb --- /dev/null +++ b/extension/pages/popup/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/popup/vite.config.mts b/extension/pages/popup/vite.config.mts new file mode 100644 index 0000000..8c860b9 --- /dev/null +++ b/extension/pages/popup/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'popup'), + }, +}); diff --git a/extension/pages/side-panel/index.html b/extension/pages/side-panel/index.html new file mode 100644 index 0000000..27859dc --- /dev/null +++ b/extension/pages/side-panel/index.html @@ -0,0 +1,12 @@ + + + + + Side Panel + + + +
+ + + diff --git a/extension/pages/side-panel/package.json b/extension/pages/side-panel/package.json new file mode 100644 index 0000000..289a299 --- /dev/null +++ b/extension/pages/side-panel/package.json @@ -0,0 +1,39 @@ +{ + "name": "@extension/sidepanel", + "version": "0.5.0", + "description": "chrome extension - side panel", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules", + "build": "vite build", + "dev": "vite build --mode development", + "lint": "eslint .", + "lint:fix": "pnpm lint --fix", + "format": "prettier . --write --ignore-path ../../.prettierignore", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@extension/shared": "workspace:*", + "@extension/storage": "workspace:*", + "@extension/i18n": "workspace:*", + "@extension/ui": "workspace:*" + }, + "devDependencies": { + "@extension/tailwindcss-config": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@extension/vite-config": "workspace:*" + }, + "postcss": { + "plugins": { + "tailwindcss": {}, + "autoprefixer": {} + } + } +} diff --git a/extension/pages/side-panel/public/logo_vertical.svg b/extension/pages/side-panel/public/logo_vertical.svg new file mode 100644 index 0000000..5768b87 --- /dev/null +++ b/extension/pages/side-panel/public/logo_vertical.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/side-panel/public/logo_vertical_dark.svg b/extension/pages/side-panel/public/logo_vertical_dark.svg new file mode 100644 index 0000000..b4089d8 --- /dev/null +++ b/extension/pages/side-panel/public/logo_vertical_dark.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/pages/side-panel/src/SidePanel.css b/extension/pages/side-panel/src/SidePanel.css new file mode 100644 index 0000000..55fb324 --- /dev/null +++ b/extension/pages/side-panel/src/SidePanel.css @@ -0,0 +1,30 @@ +.App { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: center; + height: 100%; + padding: 1rem; +} + +.App-logo { + height: 50vmin; + margin-bottom: 1rem; +} + +.App-header { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); +} + +code { + background: rgba(148, 163, 184, 0.5); + border-radius: 0.25rem; + padding: 0.2rem 0.5rem; +} diff --git a/extension/pages/side-panel/src/SidePanel.tsx b/extension/pages/side-panel/src/SidePanel.tsx new file mode 100644 index 0000000..ba48263 --- /dev/null +++ b/extension/pages/side-panel/src/SidePanel.tsx @@ -0,0 +1,58 @@ +import '@src/SidePanel.css'; +import React, { useState, useEffect } from 'react'; +import { withErrorBoundary, withSuspense } from '@extension/shared'; +import { ErrorDisplay, LoadingSpinner } from '@extension/ui'; +import { LoginPage } from './components/LoginPage'; +import { SettingsPage } from './components/SettingsPage'; +import { MainPage } from './components/MainPage'; + +type Page = 'login' | 'main' | 'settings'; + +const SidePanel = () => { + const [currentPage, setCurrentPage] = useState('login'); + const [isAuthenticated, setIsAuthenticated] = useState(false); + + useEffect(() => { + // Check if user is already authenticated + chrome.storage.local.get(['orcaAuthToken', 'orcaEndpoint'], (result) => { + if (result.orcaAuthToken && result.orcaEndpoint) { + setIsAuthenticated(true); + setCurrentPage('main'); + } + }); + }, []); + + const handleLogin = () => { + // Set authentication token (in real implementation, this would come from the auth callback) + chrome.storage.local.set({ orcaAuthToken: 'temp_token_' + Date.now() }); + setIsAuthenticated(true); + setCurrentPage('main'); + }; + + const handleLogout = () => { + chrome.storage.local.remove(['orcaAuthToken']); + setIsAuthenticated(false); + setCurrentPage('login'); + }; + + const openSettings = () => { + setCurrentPage('settings'); + }; + + const backToMain = () => { + setCurrentPage(isAuthenticated ? 'main' : 'login'); + }; + + switch (currentPage) { + case 'login': + return ; + case 'settings': + return ; + case 'main': + return ; + default: + return ; + } +}; + +export default withErrorBoundary(withSuspense(SidePanel, ), ErrorDisplay); diff --git a/extension/pages/side-panel/src/components/LoginPage.tsx b/extension/pages/side-panel/src/components/LoginPage.tsx new file mode 100644 index 0000000..87a2152 --- /dev/null +++ b/extension/pages/side-panel/src/components/LoginPage.tsx @@ -0,0 +1,143 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Input, Label, cn, ModernNav } from '@extension/ui'; +import { Shield, AlertCircle } from 'lucide-react'; + +interface LoginPageProps { + onLogin: () => void; + onOpenSettings: () => void; +} + +export const LoginPage: React.FC = ({ onLogin, onOpenSettings }) => { + const [endpoint, setEndpoint] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(''); + + useEffect(() => { + // Load saved endpoint + chrome.storage.local.get(['orcaEndpoint'], (result) => { + if (result.orcaEndpoint) { + setEndpoint(result.orcaEndpoint); + } + }); + }, []); + + const handleLogin = async () => { + if (!endpoint.trim()) { + setError('Please configure an endpoint first'); + return; + } + + setIsLoading(true); + setError(''); + + try { + // Open the login URL in a new tab + const loginUrl = `${endpoint.replace(/\/$/, '')}/auth/login?redirect_uri=${encodeURIComponent(chrome.runtime.getURL('/'))}`; + chrome.tabs.create({ url: loginUrl }); + + // For now, we'll assume login is successful + // In a real implementation, you'd listen for the auth callback + setTimeout(() => { + setIsLoading(false); + onLogin(); + }, 1000); + } catch (err) { + setError('Login failed. Please check your endpoint.'); + setIsLoading(false); + } + }; + + return ( +
+ + + {/* Content */} +
+
+ {/* Welcome Section */} +
+
+ +
+
+

+ Welcome to Orca +

+

+ Connect to your Orca instance to start recording and managing automated tests +

+
+
+ + {/* Error Alert */} + {error && ( +
+
+ +
+

Connection Failed

+

{error}

+
+
+
+ )} + + {/* Login Form */} +
+
+ + setEndpoint(e.target.value)} + placeholder="http://localhost:4004" + className="h-12 text-base" + /> +

+ Enter the URL where your Orca server is running +

+
+ + +
+ + {/* Help Text */} +
+

+ Need help configuring your endpoint?{' '} + +

+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/side-panel/src/components/MainPage.tsx b/extension/pages/side-panel/src/components/MainPage.tsx new file mode 100644 index 0000000..f391b88 --- /dev/null +++ b/extension/pages/side-panel/src/components/MainPage.tsx @@ -0,0 +1,157 @@ +import React, { useState } from 'react'; +import { Button, Input, Label, Badge, cn, ModernNav } from '@extension/ui'; +import { Play, Square } from 'lucide-react'; + +interface MainPageProps { + onOpenSettings: () => void; + onLogout: () => void; +} + +export const MainPage: React.FC = ({ onOpenSettings, onLogout }) => { + const [isRecording, setIsRecording] = useState(false); + const [recordingName, setRecordingName] = useState(''); + const [actionCount, setActionCount] = useState(0); + + const handleStartRecording = () => { + if (!recordingName.trim()) return; + setIsRecording(true); + setActionCount(0); + }; + + const handleStopRecording = () => { + setIsRecording(false); + setRecordingName(''); + setActionCount(0); + }; + + return ( +
+ + + {/* Content */} +
+ + {/* Recording Controls */} +
+ {!isRecording ? ( +
+ {/* Recording Setup Card */} +
+
+
+ + setRecordingName(e.target.value)} + placeholder="Enter a descriptive name for your test..." + className="h-12 text-base" + /> +

+ Choose a clear name that describes what this test will do +

+
+
+
+ + {/* Start Button */} + +
+ ) : ( +
+ {/* Currently Recording Card */} +
+
+
+
+
+
+

+ Recording in Progress +

+

+ {recordingName} +

+

+ Navigate and interact with the webpage. All your actions are being captured. +

+
+
+
+ + {/* Stop Button */} + +
+ )} +
+ + {/* Instructions */} + {!isRecording && ( +
+
+
+
+ +
+
+
+

+ How to Record a Test +

+
+
+
1
+

Enter a descriptive name for your test

+
+
+
2
+

Click "Start Recording" to begin capturing

+
+
+
3
+

Navigate and interact with the webpage normally

+
+
+
4
+

Click "Stop Recording" when you're done

+
+
+
+
+
+ )} +
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/side-panel/src/components/SettingsPage.tsx b/extension/pages/side-panel/src/components/SettingsPage.tsx new file mode 100644 index 0000000..f414ba1 --- /dev/null +++ b/extension/pages/side-panel/src/components/SettingsPage.tsx @@ -0,0 +1,252 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Input, Label, RadioGroup, RadioGroupItem, Badge, Switch, cn, ModernNav } from '@extension/ui'; +import { useStorage } from '@extension/shared'; +import { exampleThemeStorage } from '@extension/storage'; +import { t } from '@extension/i18n'; +import { ArrowLeft, Trash2, Server, Palette, Info } from 'lucide-react'; + +interface SettingsPageProps { + onBack: () => void; +} + +interface EndpointConfig { + name: string; + url: string; + type: 'local' | 'remote'; +} + +const DEFAULT_ENDPOINTS: EndpointConfig[] = [ + { name: 'Local Development', url: 'http://localhost:4004', type: 'local' }, + { name: 'Local Docker', url: 'http://localhost:8080', type: 'local' }, + { name: 'Production', url: 'https://orca.example.com', type: 'remote' }, +]; + +export const SettingsPage: React.FC = ({ onBack }) => { + const [endpoints, setEndpoints] = useState(DEFAULT_ENDPOINTS); + const [selectedEndpoint, setSelectedEndpoint] = useState(''); + const [customEndpoint, setCustomEndpoint] = useState(''); + const [isCustom, setIsCustom] = useState(false); + + useEffect(() => { + // Load saved settings + chrome.storage.local.get(['orcaEndpoint', 'orcaEndpoints'], (result) => { + if (result.orcaEndpoints) { + setEndpoints([...DEFAULT_ENDPOINTS, ...result.orcaEndpoints]); + } + if (result.orcaEndpoint) { + const endpoint = result.orcaEndpoint; + const predefined = [...DEFAULT_ENDPOINTS, ...(result.orcaEndpoints || [])].find(e => e.url === endpoint); + if (predefined) { + setSelectedEndpoint(endpoint); + setIsCustom(false); + } else { + setCustomEndpoint(endpoint); + setIsCustom(true); + } + } + }); + }, []); + + const saveEndpoint = () => { + const endpoint = isCustom ? customEndpoint : selectedEndpoint; + chrome.storage.local.set({ orcaEndpoint: endpoint }); + }; + + const addCustomEndpoint = () => { + if (!customEndpoint.trim()) return; + + const newEndpoint: EndpointConfig = { + name: `Custom (${new URL(customEndpoint).hostname})`, + url: customEndpoint, + type: 'remote' + }; + + const updatedEndpoints = [...endpoints, newEndpoint]; + setEndpoints(updatedEndpoints); + + const customEndpoints = updatedEndpoints.filter(e => !DEFAULT_ENDPOINTS.includes(e)); + chrome.storage.local.set({ orcaEndpoints: customEndpoints }); + + setSelectedEndpoint(customEndpoint); + setIsCustom(false); + setCustomEndpoint(''); + }; + + const removeEndpoint = (url: string) => { + const updatedEndpoints = endpoints.filter(e => e.url !== url || DEFAULT_ENDPOINTS.includes(e)); + setEndpoints(updatedEndpoints); + + const customEndpoints = updatedEndpoints.filter(e => !DEFAULT_ENDPOINTS.includes(e)); + chrome.storage.local.set({ orcaEndpoints: customEndpoints }); + + if (selectedEndpoint === url) { + setSelectedEndpoint(''); + } + }; + + return ( +
+ {/* Custom Header with Back Button */} +
+
+
+ +
+ Orca Logo +
+

Settings

+

Configure your Orca experience

+
+
+
+
+
+ + {/* Content */} +
+ {/* Endpoint Configuration */} +
+
+
+ +
+
+

Endpoint Configuration

+

Configure your Orca server connection

+
+
+ +
+
+ + { + if (value === 'custom') { + setIsCustom(true); + } else { + setSelectedEndpoint(value); + setIsCustom(false); + } + }} + className="space-y-3" + > + {endpoints.map((endpoint) => ( +
+ + +
+ ))} + +
+ + +
+
+
+ + {isCustom && ( +
+
+ setCustomEndpoint(e.target.value)} + placeholder="https://your-custom-endpoint.com" + className="flex-1" + /> + +
+
+ )} + + +
+
+ + {/* Theme Settings */} +
+
+
+ +
+
+

Appearance

+

Customize the look and feel

+
+
+
+
+
+ +

Choose between light and dark mode

+
+ +
+
+
+ + {/* About */} +
+
+
+ +
+
+

About

+

Extension information and version

+
+
+
+
+
+ Orca Logo +
+
+

Orca Test Recorder

+

Version 1.0.0

+

+ Record browser interactions for automated testing with the Orca platform. + Create reliable, maintainable tests that help ensure your applications work perfectly. +

+
+
+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/extension/pages/side-panel/src/index.css b/extension/pages/side-panel/src/index.css new file mode 100644 index 0000000..e71af25 --- /dev/null +++ b/extension/pages/side-panel/src/index.css @@ -0,0 +1 @@ +@import '@extension/ui/global.css'; diff --git a/extension/pages/side-panel/src/index.tsx b/extension/pages/side-panel/src/index.tsx new file mode 100644 index 0000000..350ac23 --- /dev/null +++ b/extension/pages/side-panel/src/index.tsx @@ -0,0 +1,14 @@ +import '@src/index.css'; +import SidePanel from '@src/SidePanel'; +import { createRoot } from 'react-dom/client'; + +const init = () => { + const appContainer = document.querySelector('#app-container'); + if (!appContainer) { + throw new Error('Can not find #app-container'); + } + const root = createRoot(appContainer); + root.render(); +}; + +init(); diff --git a/extension/pages/side-panel/tailwind.config.ts b/extension/pages/side-panel/tailwind.config.ts new file mode 100644 index 0000000..3418ee6 --- /dev/null +++ b/extension/pages/side-panel/tailwind.config.ts @@ -0,0 +1,5 @@ +import { withUI } from '@extension/ui'; + +export default withUI({ + content: ['index.html', 'src/**/*.tsx'], +}); diff --git a/extension/pages/side-panel/tsconfig.json b/extension/pages/side-panel/tsconfig.json new file mode 100644 index 0000000..b85f4eb --- /dev/null +++ b/extension/pages/side-panel/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@extension/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + }, + "types": ["chrome", "node"] + }, + "include": ["src", "vite.config.mts", "tailwind.config.ts"] +} diff --git a/extension/pages/side-panel/vite.config.mts b/extension/pages/side-panel/vite.config.mts new file mode 100644 index 0000000..c6d889c --- /dev/null +++ b/extension/pages/side-panel/vite.config.mts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path'; +import { withPageConfig } from '@extension/vite-config'; + +const rootDir = resolve(import.meta.dirname); +const srcDir = resolve(rootDir, 'src'); + +export default withPageConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'side-panel'), + }, +}); diff --git a/extension/pnpm-lock.yaml b/extension/pnpm-lock.yaml new file mode 100644 index 0000000..fce0b75 --- /dev/null +++ b/extension/pnpm-lock.yaml @@ -0,0 +1,10747 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-radio-group': + specifier: ^1.3.8 + version: 1.3.8(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-switch': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.542.0 + version: 0.542.0(react@19.1.0) + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + tailwind-merge: + specifier: ^3.3.0 + version: 3.3.0 + devDependencies: + '@eslint/compat': + specifier: ^1.2.9 + version: 1.2.9(eslint@9.27.0(jiti@2.4.2)) + '@eslint/eslintrc': + specifier: ^3.3.1 + version: 3.3.1 + '@eslint/js': + specifier: ^9.27.0 + version: 9.27.0 + '@types/chrome': + specifier: ^0.0.323 + version: 0.0.323 + '@types/eslint-plugin-jsx-a11y': + specifier: ^6.10.0 + version: 6.10.0 + '@types/node': + specifier: ^22.15.21 + version: 22.15.21 + '@types/react': + specifier: ^19.1.5 + version: 19.1.5 + '@types/react-dom': + specifier: ^19.1.5 + version: 19.1.5(@types/react@19.1.5) + '@typescript-eslint/parser': + specifier: ^8.32.1 + version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.3) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + eslint: + specifier: ^9.27.0 + version: 9.27.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^10.1.5 + version: 10.1.5(eslint@9.27.0(jiti@2.4.2)) + eslint-import-resolver-typescript: + specifier: ^4.3.5 + version: 4.3.5(eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-import-x: + specifier: ^4.12.2 + version: 4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-jsx-a11y: + specifier: ^6.10.2 + version: 6.10.2(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-prettier: + specifier: ^5.4.0 + version: 5.4.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2))(prettier@3.5.3) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-tailwindcss: + specifier: ^3.18.0 + version: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3))) + fast-glob: + specifier: ^3.3.3 + version: 3.3.3 + fflate: + specifier: ^0.8.2 + version: 0.8.2 + globals: + specifier: ^16.1.0 + version: 16.1.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + jiti: + specifier: ^2.4.2 + version: 2.4.2 + lint-staged: + specifier: ^16.0.0 + version: 16.0.0 + postcss: + specifier: ^8.5.3 + version: 8.5.3 + postcss-load-config: + specifier: ^6.0.1 + version: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.8.0) + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.3) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + run-script-os: + specifier: ^1.1.6 + version: 1.1.6 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3)) + tslib: + specifier: ^2.8.1 + version: 2.8.1 + tsx: + specifier: ^4.19.4 + version: 4.19.4 + turbo: + specifier: ^2.5.3 + version: 2.5.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.32.1 + version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0) + vite-plugin-node-polyfills: + specifier: ^0.23.0 + version: 0.23.0(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)) + + chrome-extension: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../packages/env + '@extension/shared': + specifier: workspace:* + version: link:../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../packages/ui + webextension-polyfill: + specifier: ^0.12.0 + version: 0.12.0 + devDependencies: + '@crxjs/vite-plugin': + specifier: ^2.2.0 + version: 2.2.0 + '@extension/dev-utils': + specifier: workspace:* + version: link:../packages/dev-utils + '@extension/hmr': + specifier: workspace:* + version: link:../packages/hmr + '@extension/tsconfig': + specifier: workspace:* + version: link:../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../packages/vite-config + '@laynezh/vite-plugin-lib-assets': + specifier: ^1.1.0 + version: 1.1.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)) + magic-string: + specifier: ^0.30.17 + version: 0.30.17 + ts-loader: + specifier: ^9.5.2 + version: 9.5.2(typescript@5.8.3)(webpack@5.94.0(@swc/core@1.11.24)) + + packages/dev-utils: + devDependencies: + '@extension/shared': + specifier: workspace:* + version: link:../shared + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/env: + dependencies: + '@dotenvx/dotenvx': + specifier: ^1.44.1 + version: 1.44.1 + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/hmr: + devDependencies: + '@extension/env': + specifier: workspace:* + version: link:../env + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@rollup/plugin-sucrase': + specifier: ^5.0.2 + version: 5.0.2(rollup@4.41.0) + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 + esbuild: + specifier: ^0.25.4 + version: 0.25.4 + esm: + specifier: ^3.2.25 + version: 3.2.25 + rollup: + specifier: ^4.41.0 + version: 4.41.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3) + ws: + specifier: ^8.18.2 + version: 8.18.2 + + packages/i18n: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../env + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/module-manager: + devDependencies: + '@extension/dev-utils': + specifier: workspace:* + version: link:../dev-utils + '@extension/shared': + specifier: workspace:* + version: link:../shared + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@inquirer/prompts': + specifier: ^7.5.1 + version: 7.5.1(@types/node@22.15.21) + '@types/yargs': + specifier: ^17.0.33 + version: 17.0.33 + tsx: + specifier: ^4.19.4 + version: 4.19.4 + yargs: + specifier: ^17.7.2 + version: 17.7.2 + + packages/orca-api: + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + typescript: + specifier: ^5.3.3 + version: 5.8.3 + + packages/shared: + dependencies: + react-error-boundary: + specifier: ^6.0.0 + version: 6.0.0(react@19.1.0) + devDependencies: + '@extension/storage': + specifier: workspace:* + version: link:../storage + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + type-fest: + specifier: ^4.41.0 + version: 4.41.0 + + packages/storage: + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/tailwindcss-config: + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/tsconfig: {} + + packages/ui: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../i18n + '@extension/shared': + specifier: workspace:* + version: link:../shared + '@extension/storage': + specifier: workspace:* + version: link:../storage + '@radix-ui/react-avatar': + specifier: ^1.1.10 + version: 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-separator': + specifier: ^1.1.7 + version: 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + tailwind-merge: + specifier: ^3.3.0 + version: 3.3.0 + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + react-spinners: + specifier: ^0.17.0 + version: 0.17.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + + packages/vite-config: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../env + devDependencies: + '@extension/hmr': + specifier: workspace:* + version: link:../hmr + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@vitejs/plugin-react-swc': + specifier: ^3.9.0 + version: 3.9.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)) + + packages/zipper: + devDependencies: + '@extension/dev-utils': + specifier: workspace:* + version: link:../dev-utils + '@extension/env': + specifier: workspace:* + version: link:../env + '@extension/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + pages/content: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../../packages/env + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + devDependencies: + '@extension/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/content-runtime: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../../packages/env + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/content-ui: + dependencies: + '@extension/env': + specifier: workspace:* + version: link:../../packages/env + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/devtools: + dependencies: + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/devtools-panel: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/new-tab: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + sass: + specifier: ^1.89.0 + version: 1.89.0 + + pages/options: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/popup: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/orca-api': + specifier: workspace:* + version: link:../../packages/orca-api + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + pages/side-panel: + dependencies: + '@extension/i18n': + specifier: workspace:* + version: link:../../packages/i18n + '@extension/shared': + specifier: workspace:* + version: link:../../packages/shared + '@extension/storage': + specifier: workspace:* + version: link:../../packages/storage + '@extension/ui': + specifier: workspace:* + version: link:../../packages/ui + devDependencies: + '@extension/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwindcss-config + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@extension/vite-config': + specifier: workspace:* + version: link:../../packages/vite-config + + tests/e2e: + devDependencies: + '@extension/env': + specifier: workspace:* + version: link:../../packages/env + '@extension/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@wdio/cli': + specifier: ^9.14.0 + version: 9.14.0 + '@wdio/globals': + specifier: ^9.14.0 + version: 9.14.0(@wdio/logger@9.4.4) + '@wdio/local-runner': + specifier: ^9.14.0 + version: 9.14.0 + '@wdio/mocha-framework': + specifier: ^9.14.0 + version: 9.14.0 + '@wdio/spec-reporter': + specifier: ^9.14.0 + version: 9.14.0 + '@wdio/types': + specifier: ^9.14.0 + version: 9.14.0 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + + '@crxjs/vite-plugin@2.2.0': + resolution: {integrity: sha512-HpT1GLbUQy42nlpN4sGzFgulacBraMM778s8Q+oPo4cb26DwO9tTwdndlvAS8fe6vEProFXvbdt37objp/0IQA==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@dotenvx/dotenvx@1.44.1': + resolution: {integrity: sha512-j1QImCqf/XJmhIjC1OPpgiZV9g370HG9MNT9s/CDwCKsoYzNCPEKK+GfsidahJx7yIlBbm+4dPLlGec+bKn7oA==} + hasBin: true + + '@ecies/ciphers@0.2.3': + resolution: {integrity: sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.9': + resolution: {integrity: sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.27.0': + resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/checkbox@3.0.1': + resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.1.6': + resolution: {integrity: sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@4.0.1': + resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.10': + resolution: {integrity: sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.11': + resolution: {integrity: sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@3.0.1': + resolution: {integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==} + engines: {node: '>=18'} + + '@inquirer/editor@4.2.11': + resolution: {integrity: sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@3.0.1': + resolution: {integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==} + engines: {node: '>=18'} + + '@inquirer/expand@4.0.13': + resolution: {integrity: sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.11': + resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + engines: {node: '>=18'} + + '@inquirer/input@3.0.1': + resolution: {integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.10': + resolution: {integrity: sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@2.0.1': + resolution: {integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==} + engines: {node: '>=18'} + + '@inquirer/number@3.0.13': + resolution: {integrity: sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@3.0.1': + resolution: {integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==} + engines: {node: '>=18'} + + '@inquirer/password@4.0.13': + resolution: {integrity: sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@6.0.1': + resolution: {integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==} + engines: {node: '>=18'} + + '@inquirer/prompts@7.5.1': + resolution: {integrity: sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@3.0.1': + resolution: {integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==} + engines: {node: '>=18'} + + '@inquirer/rawlist@4.1.1': + resolution: {integrity: sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@2.0.1': + resolution: {integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==} + engines: {node: '>=18'} + + '@inquirer/search@3.0.13': + resolution: {integrity: sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@3.0.1': + resolution: {integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==} + engines: {node: '>=18'} + + '@inquirer/select@4.2.1': + resolution: {integrity: sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.6': + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + 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.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@laynezh/vite-plugin-lib-assets@1.1.0': + resolution: {integrity: sha512-Rynyr1A/DxJEmjNZu4NrpDQUfxUmJhanqojwOO20HQWtN5Oc0jJ3ZtwnlpntruK6VYV8aC25Mjzs67dmTIBHyA==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + + '@napi-rs/wasm-runtime@0.2.10': + resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@promptbook/utils@0.69.5': + resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} + + '@puppeteer/browsers@2.10.5': + resolution: {integrity: sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==} + engines: {node: '>=18'} + hasBin: true + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.10': + resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.7': + resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.3.8': + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.0': + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-sucrase@5.0.2': + resolution: {integrity: sha512-4MhIVH9Dy2Hwose1/x5QMs0XF7yn9jDd/yozHqzdIrMWIolgFpGnrnVhQkqTaK1RALY/fpyrEKmwH/04vr1THA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.53.1||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.41.0': + resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.41.0': + resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.41.0': + resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.41.0': + resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.0': + resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.41.0': + resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.41.0': + resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.41.0': + resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.41.0': + resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.41.0': + resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@swc/core-darwin-arm64@1.11.24': + resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.11.24': + resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.11.24': + resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.11.24': + resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.11.24': + resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.11.24': + resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.11.24': + resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.11.24': + resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.11.24': + resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.11.24': + resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.11.24': + resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/chrome@0.0.323': + resolution: {integrity: sha512-ipiDwx41lmGeLnbiT6ENOayvWXdkqKqNwqDQWEuz6dujaX7slSkk1nbSt5Q5c6xnQ708+kuCFrC00VLltSbWVA==} + + '@types/eslint-plugin-jsx-a11y@6.10.0': + resolution: {integrity: sha512-TGKmk2gO6DrvTVADNOGQMqn3SzqcFcJILFnXNllQA34us9uClS3/AsL/cERPz6jS9ePI3bx+1q8/d2GZsxPVYw==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@20.17.50': + resolution: {integrity: sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A==} + + '@types/node@22.15.21': + resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/react-dom@19.1.5': + resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.5': + resolution: {integrity: sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g==} + + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/which@2.0.2': + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@8.32.1': + resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.32.1': + resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.32.1': + resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-darwin-arm64@1.7.2': + resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.7.2': + resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-react-swc@3.9.0': + resolution: {integrity: sha512-jYFUSXhwMCYsh/aQTgSGLIN3Foz5wMbH9ahb0Zva//UzwZYbMiZd7oT3AU9jHT9DLswYDswsRwPU9jVF3yA48Q==} + peerDependencies: + vite: ^4 || ^5 || ^6 + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@wdio/cli@9.14.0': + resolution: {integrity: sha512-bS7015C54gZMs0gZrCQPFes5CqoVGtwTzlSzJBy0HBx94E8AQw/6feH1FyN6asz4uyfifpUbdpq7Q/7CkaEnGA==} + engines: {node: '>=18.20.0'} + hasBin: true + + '@wdio/config@9.14.0': + resolution: {integrity: sha512-mW6VAXfUgd2j+8YJfFWvg8Ba/7g1Brr6/+MFBpp5rTQsw/2bN3PBJsQbWpNl99OCgoS8vgc5Ykps5ZUEeffSVQ==} + engines: {node: '>=18.20.0'} + + '@wdio/dot-reporter@9.14.0': + resolution: {integrity: sha512-BwSr0Atk93m2FAzXtVVCs6xWrUtmdIklTrnwnELQxGp/7xIF629ZqqJreUqJqlgqIN3GnItR1TrPbOzSw/WZ4A==} + engines: {node: '>=18.20.0'} + + '@wdio/globals@9.14.0': + resolution: {integrity: sha512-ZndEbjcU8OqLU5TlbZPlCMmQF2TVk6xYX7E5JWAmWJugwzndqCx9WZR48vPgUz9bZL2K7ejUXqnzVkEiC+gXdA==} + engines: {node: '>=18.20.0'} + + '@wdio/local-runner@9.14.0': + resolution: {integrity: sha512-bNUSMXYM2oAEF0ZmwK2CPuQnt1knTsq7Cm0AT+ynsQhS8EhzhXLIrtrqFUNxTPz694RC5dhCMYFxOa8HDi6YWA==} + engines: {node: '>=18.20.0'} + + '@wdio/logger@9.4.4': + resolution: {integrity: sha512-BXx8RXFUW2M4dcO6t5Le95Hi2ZkTQBRsvBQqLekT2rZ6Xmw8ZKZBPf0FptnoftFGg6dYmwnDidYv/0+4PiHjpQ==} + engines: {node: '>=18.20.0'} + + '@wdio/mocha-framework@9.14.0': + resolution: {integrity: sha512-qxzOMuTNfgEiKPK0TlZWFHr4cT5EnRtzdkszAAF9PSIXQIhTeSCS6YuzPkliGQaz0DELn1npe23LsggUbmL1rQ==} + engines: {node: '>=18.20.0'} + + '@wdio/protocols@9.14.0': + resolution: {integrity: sha512-inJR+G8iiFrk8/JPMfxpy6wA7rvMIZFV0T8vDN1Io7sGGj+EXX7ujpDxoCns53qxV4RytnSlgHRcCaASPFcecQ==} + + '@wdio/repl@9.4.4': + resolution: {integrity: sha512-kchPRhoG/pCn4KhHGiL/ocNhdpR8OkD2e6sANlSUZ4TGBVi86YSIEjc2yXUwLacHknC/EnQk/SFnqd4MsNjGGg==} + engines: {node: '>=18.20.0'} + + '@wdio/reporter@9.14.0': + resolution: {integrity: sha512-/l1CrQ4q30ysBHoZOH1EOg8LZ2+AmrDdQdNhec5mjHT6p0/c6K4QeRHY/Ayh0hU27zR9Lj0tCoWjpmPgAqWI8g==} + engines: {node: '>=18.20.0'} + + '@wdio/runner@9.14.0': + resolution: {integrity: sha512-4HhNLXcKKzphlQvxY2nvJLj1mE+yd87rIvhldEO3HleMDq0h9C1K+m45J0SxzQmT5i7VVBuhiuXzgZV300bh8g==} + engines: {node: '>=18.20.0'} + + '@wdio/spec-reporter@9.14.0': + resolution: {integrity: sha512-k9uFEn/SHQCmPMn5DlcUdCLlCwyWodaLECr7YLpkfdywuwrBLrB7R8YME7g63lSQzH3CAzLzPhgMiokQWLUu4w==} + engines: {node: '>=18.20.0'} + + '@wdio/types@9.14.0': + resolution: {integrity: sha512-Zqc4sxaQLIXdI1EHItIuVIOn7LvPmDvl9JEANwiJ35ck82Xlj+X55Gd9NtELSwChzKgODD0OBzlLgXyxTr69KA==} + engines: {node: '>=18.20.0'} + + '@wdio/utils@9.14.0': + resolution: {integrity: sha512-oJapwraSflOe0CmeF3TBocdt983hq9mCutLCfie4QmE+TKRlCsZz4iidG1NRAZPGdKB32nfHtyQlW0Dfxwn6RA==} + engines: {node: '>=18.20.0'} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webcomponents/custom-elements@1.6.0': + resolution: {integrity: sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@zip.js/zip.js@2.7.62': + resolution: {integrity: sha512-OaLvZ8j4gCkLn048ypkZu29KX30r8/OfFF2w4Jo5WXFr+J04J+lzJ5TKZBVgFXhlvSkqNFQdfnY1Q8TMTCyBVA==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.1.5: + resolution: {integrity: sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-shorthand-properties@1.1.2: + resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} + + css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + engines: {node: '>=14.0.0'} + + edgedriver@6.1.1: + resolution: {integrity: sha512-/dM/PoBf22Xg3yypMWkmRQrBKEnSyNaZ7wHGCT9+qqT14izwtFT+QvdR89rjNkMfXwW+bSFoqOfbcvM+2Cyc7w==} + engines: {node: '>=18.0.0'} + hasBin: true + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.10.5: + resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@4.3.5: + resolution: {integrity: sha512-QGwhLrwn/WGOsdrWvjhm9n8BvKN/Wr41SQERMV7DQ2hm9+Ozas39CyQUxum///l2G2vefQVr7VbIaCFS5h9g5g==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import-x@4.12.2: + resolution: {integrity: sha512-0jVUgJQipbs0yUfLe7LwYD6p8rIGqCysWZdyJFgkPzDyJgiKpuCaXlywKUAWgJ6u1nLpfrdt21B60OUkupyBrQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-prettier@5.4.0: + resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-tailwindcss@3.18.0: + resolution: {integrity: sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + tailwindcss: ^3.4.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.27.0: + resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.5.3: + resolution: {integrity: sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==} + engines: {node: ^18.19.0 || >=20.5.0} + + expect-webdriverio@5.1.0: + resolution: {integrity: sha512-4u3q+Dqx/lXNgvCx1gKia4CfS28z1UxGGfVUkoMNbrsBlTBB2fYqXG+4+YtYoerxvp/XPwIb/+89IGEdyPbDXQ==} + engines: {node: '>=18 || >=20 || >=22'} + peerDependencies: + '@wdio/globals': ^9.0.0 + '@wdio/logger': ^9.0.0 + webdriverio: ^9.0.0 + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + geckodriver@5.0.0: + resolution: {integrity: sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.2: + resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} + engines: {node: 20 || >=22} + hasBin: true + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.1.0: + resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + htmlfy@0.6.7: + resolution: {integrity: sha512-r8hRd+oIM10lufovN+zr3VKPTYEIvIwqXGucidh2XQufmiw6sbUXFUFjWlfjo3AnefIDTyzykVzQ8IUVuT1peQ==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@5.1.2: + resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inquirer@11.1.0: + resolution: {integrity: sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==} + engines: {node: '>=18'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lint-staged@16.0.0: + resolution: {integrity: sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ==} + engines: {node: '>=20.18'} + hasBin: true + + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} + engines: {node: '>=18.0.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + locate-app@2.5.0: + resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + mylas@2.1.13: + resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} + engines: {node: '>=12.0.0'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nano-spawn@1.0.2: + resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + engines: {node: '>=20.17'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + plimit-lit@1.6.1: + resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-tailwindcss@0.6.11: + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue-lit@1.5.2: + resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} + engines: {node: '>=12'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-error-boundary@6.0.0: + resolution: {integrity: sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==} + peerDependencies: + react: '>=16.13.1' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.13.0: + resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-spinners@0.17.0: + resolution: {integrity: sha512-L/8HTylaBmIWwQzIjMq+0vyaRXuoAevzWoD35wKpNTxxtYXWZp+xtgkfD7Y4WItuX0YvdxMPU79+7VhhmbmuTQ==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + engines: {node: '>=16'} + + read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.41.0: + resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + run-script-os@1.1.6: + resolution: {integrity: sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==} + hasBin: true + + rxjs@7.5.7: + resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safaridriver@1.0.0: + resolution: {integrity: sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==} + engines: {node: '>=18.0.0'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.89.0: + resolution: {integrity: sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + spacetrim@0.11.59: + resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} + engines: {node: '>= 0.10.0'} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + 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.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.6: + resolution: {integrity: sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwind-merge@3.3.0: + resolution: {integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==} + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.39.2: + resolution: {integrity: sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-loader@9.5.2: + resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsc-alias@1.8.16: + resolution: {integrity: sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g==} + engines: {node: '>=16.20.2'} + hasBin: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.4: + resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + + turbo-darwin-64@2.5.3: + resolution: {integrity: sha512-YSItEVBUIvAGPUDpAB9etEmSqZI3T6BHrkBkeSErvICXn3dfqXUfeLx35LfptLDEbrzFUdwYFNmt8QXOwe9yaw==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.5.3: + resolution: {integrity: sha512-5PefrwHd42UiZX7YA9m1LPW6x9YJBDErXmsegCkVp+GjmWrADfEOxpFrGQNonH3ZMj77WZB2PVE5Aw3gA+IOhg==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.5.3: + resolution: {integrity: sha512-M9xigFgawn5ofTmRzvjjLj3Lqc05O8VHKuOlWNUlnHPUltFquyEeSkpQNkE/vpPdOR14AzxqHbhhxtfS4qvb1w==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.5.3: + resolution: {integrity: sha512-auJRbYZ8SGJVqvzTikpg1bsRAsiI9Tk0/SDkA5Xgg0GdiHDH/BOzv1ZjDE2mjmlrO/obr19Dw+39OlMhwLffrw==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.5.3: + resolution: {integrity: sha512-arLQYohuHtIEKkmQSCU9vtrKUg+/1TTstWB9VYRSsz+khvg81eX6LYHtXJfH/dK7Ho6ck+JaEh5G+QrE1jEmCQ==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.5.3: + resolution: {integrity: sha512-3JPn66HAynJ0gtr6H+hjY4VHpu1RPKcEwGATvGUTmLmYSYBQieVlnGDRMMoYN066YfyPqnNGCfhYbXfH92Cm0g==} + cpu: [arm64] + os: [win32] + + turbo@2.5.3: + resolution: {integrity: sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.32.1: + resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + engines: {node: '>=18.17'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unrs-resolver@1.7.2: + resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + userhome@1.0.1: + resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} + engines: {node: '>= 0.8.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vite-plugin-node-polyfills@0.23.0: + resolution: {integrity: sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + engines: {node: '>=10'} + hasBin: true + + watchpack@2.4.3: + resolution: {integrity: sha512-adBYQLivcg1jbdKEJeqScJJFvgm4qY9+3tXw+jdG6lkVeqRJEtiQmSWjmth8GKmDZuX7sYM4YFxQsf0AzMfGGw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webdriver@9.14.0: + resolution: {integrity: sha512-0mVjxafQ5GNdK4l/FVmmmXGUfLHCSBE4Ml2LG23rxgmw53CThAos6h01UgIEINonxIzgKEmwfqJioo3/frbpbQ==} + engines: {node: '>=18.20.0'} + + webdriverio@9.14.0: + resolution: {integrity: sha512-GP0p6J+yjcCXF9uXW7HjB6IEh33OKmZcLTSg/W2rnVYSWgsUEYPujKSXe5I8q5a99QID7OOKNKVMfs5ANoZ2BA==} + engines: {node: '>=18.20.0'} + peerDependencies: + puppeteer-core: '>=22.x || <=24.x' + peerDependenciesMeta: + puppeteer-core: + optional: true + + webextension-polyfill@0.12.0: + resolution: {integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/runtime@7.27.1': {} + + '@crxjs/vite-plugin@2.2.0': + dependencies: + '@rollup/pluginutils': 4.2.1 + '@webcomponents/custom-elements': 1.6.0 + acorn-walk: 8.3.4 + cheerio: 1.0.0 + convert-source-map: 1.9.0 + debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 0.10.5 + fast-glob: 3.3.3 + fs-extra: 10.1.0 + jsesc: 3.1.0 + magic-string: 0.30.17 + pathe: 2.0.3 + picocolors: 1.1.1 + react-refresh: 0.13.0 + rollup: 2.79.2 + rxjs: 7.5.7 + transitivePeerDependencies: + - supports-color + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@dotenvx/dotenvx@1.44.1': + dependencies: + commander: 11.1.0 + dotenv: 16.5.0 + eciesjs: 0.4.15 + execa: 5.1.1 + fdir: 6.4.4(picomatch@4.0.2) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.2 + which: 4.0.0 + + '@ecies/ciphers@0.2.3(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.4.2))': + dependencies: + eslint: 9.27.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.9(eslint@9.27.0(jiti@2.4.2))': + optionalDependencies: + eslint: 9.27.0(jiti@2.4.2) + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.2': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1(supports-color@8.1.1) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.27.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.1': + dependencies: + '@eslint/core': 0.14.0 + levn: 0.4.1 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/utils@0.2.10': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/checkbox@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.11 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/checkbox@4.1.6(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.21) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/confirm@4.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/confirm@5.1.10(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/core@10.1.11(@types/node@22.15.21)': + dependencies: + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.21) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.11 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.15.21 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/editor@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + external-editor: 3.1.0 + + '@inquirer/editor@4.2.11(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + external-editor: 3.1.0 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/expand@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/expand@4.0.13(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/figures@1.0.11': {} + + '@inquirer/input@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/input@4.1.10(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/number@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/number@3.0.13(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/password@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + + '@inquirer/password@4.0.13(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + ansi-escapes: 4.3.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/prompts@6.0.1': + dependencies: + '@inquirer/checkbox': 3.0.1 + '@inquirer/confirm': 4.0.1 + '@inquirer/editor': 3.0.1 + '@inquirer/expand': 3.0.1 + '@inquirer/input': 3.0.1 + '@inquirer/number': 2.0.1 + '@inquirer/password': 3.0.1 + '@inquirer/rawlist': 3.0.1 + '@inquirer/search': 2.0.1 + '@inquirer/select': 3.0.1 + + '@inquirer/prompts@7.5.1(@types/node@22.15.21)': + dependencies: + '@inquirer/checkbox': 4.1.6(@types/node@22.15.21) + '@inquirer/confirm': 5.1.10(@types/node@22.15.21) + '@inquirer/editor': 4.2.11(@types/node@22.15.21) + '@inquirer/expand': 4.0.13(@types/node@22.15.21) + '@inquirer/input': 4.1.10(@types/node@22.15.21) + '@inquirer/number': 3.0.13(@types/node@22.15.21) + '@inquirer/password': 4.0.13(@types/node@22.15.21) + '@inquirer/rawlist': 4.1.1(@types/node@22.15.21) + '@inquirer/search': 3.0.13(@types/node@22.15.21) + '@inquirer/select': 4.2.1(@types/node@22.15.21) + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/rawlist@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/rawlist@4.1.1(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/type': 3.0.6(@types/node@22.15.21) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/search@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.11 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@3.0.13(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.21) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/select@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.11 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@4.2.1(@types/node@22.15.21)': + dependencies: + '@inquirer/core': 10.1.11(@types/node@22.15.21) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.21) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.21 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@3.0.6(@types/node@22.15.21)': + optionalDependencies: + '@types/node': 22.15.21 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.15.21 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@laynezh/vite-plugin-lib-assets@1.1.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + escape-string-regexp: 4.0.0 + loader-utils: 3.3.1 + mrmime: 1.0.1 + semver: 7.7.2 + vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0) + + '@napi-rs/wasm-runtime@0.2.10': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.4': {} + + '@promptbook/utils@0.69.5': + dependencies: + spacetrim: 0.11.59 + + '@puppeteer/browsers@2.10.5': + dependencies: + debug: 4.4.1(supports-color@8.1.1) + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.2 + tar-fs: 3.0.8 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.5)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-slot@1.2.3(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + '@types/react-dom': 19.1.5(@types/react@19.1.5) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.5)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.5)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.5 + + '@radix-ui/rect@1.1.1': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/plugin-sucrase@5.0.2(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + sucrase: 3.35.0 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.4(rollup@4.41.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/rollup-android-arm-eabi@4.41.0': + optional: true + + '@rollup/rollup-android-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-x64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.0': + optional: true + + '@rtsao/scc@1.1.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@swc/core-darwin-arm64@1.11.24': + optional: true + + '@swc/core-darwin-x64@1.11.24': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.11.24': + optional: true + + '@swc/core-linux-arm64-gnu@1.11.24': + optional: true + + '@swc/core-linux-arm64-musl@1.11.24': + optional: true + + '@swc/core-linux-x64-gnu@1.11.24': + optional: true + + '@swc/core-linux-x64-musl@1.11.24': + optional: true + + '@swc/core-win32-arm64-msvc@1.11.24': + optional: true + + '@swc/core-win32-ia32-msvc@1.11.24': + optional: true + + '@swc/core-win32-x64-msvc@1.11.24': + optional: true + + '@swc/core@1.11.24': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.21 + optionalDependencies: + '@swc/core-darwin-arm64': 1.11.24 + '@swc/core-darwin-x64': 1.11.24 + '@swc/core-linux-arm-gnueabihf': 1.11.24 + '@swc/core-linux-arm64-gnu': 1.11.24 + '@swc/core-linux-arm64-musl': 1.11.24 + '@swc/core-linux-x64-gnu': 1.11.24 + '@swc/core-linux-x64-musl': 1.11.24 + '@swc/core-win32-arm64-msvc': 1.11.24 + '@swc/core-win32-ia32-msvc': 1.11.24 + '@swc/core-win32-x64-msvc': 1.11.24 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.21': + dependencies: + '@swc/counter': 0.1.3 + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chrome@0.0.323': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.16 + + '@types/eslint-plugin-jsx-a11y@6.10.0': + dependencies: + '@types/eslint': 9.6.1 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.7': {} + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/har-format@1.2.16': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': + optional: true + + '@types/mocha@10.0.10': {} + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.17.50 + + '@types/node@20.17.50': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.15.21': + dependencies: + undici-types: 6.21.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/react-dom@19.1.5(@types/react@19.1.5)': + dependencies: + '@types/react': 19.1.5 + + '@types/react@19.1.5': + dependencies: + csstype: 3.1.3 + + '@types/sinonjs__fake-timers@8.1.5': {} + + '@types/stack-utils@2.0.3': {} + + '@types/which@2.0.2': {} + + '@types/wrap-ansi@3.0.0': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.15.21 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.17.50 + optional: true + + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + eslint: 9.27.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 7.0.4 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.32.1': + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + + '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.32.1': {} + + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + eslint: 9.27.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.32.1': + dependencies: + '@typescript-eslint/types': 8.32.1 + eslint-visitor-keys: 4.2.0 + + '@unrs/resolver-binding-darwin-arm64@1.7.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.10 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + optional: true + + '@vitejs/plugin-react-swc@3.9.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@swc/core': 1.11.24 + vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0) + transitivePeerDependencies: + - '@swc/helpers' + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@wdio/cli@9.14.0': + dependencies: + '@types/node': 20.17.50 + '@vitest/snapshot': 2.1.9 + '@wdio/config': 9.14.0 + '@wdio/globals': 9.14.0(@wdio/logger@9.4.4) + '@wdio/logger': 9.4.4 + '@wdio/protocols': 9.14.0 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + async-exit-hook: 2.0.1 + chalk: 5.4.1 + chokidar: 4.0.3 + dotenv: 16.5.0 + ejs: 3.1.10 + execa: 9.5.3 + import-meta-resolve: 4.1.0 + inquirer: 11.1.0 + lodash.flattendeep: 4.4.0 + lodash.pickby: 4.6.0 + lodash.union: 4.6.0 + read-pkg-up: 10.1.0 + recursive-readdir: 2.2.3 + tsx: 4.19.4 + webdriverio: 9.14.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - puppeteer-core + - supports-color + - utf-8-validate + + '@wdio/config@9.14.0': + dependencies: + '@wdio/logger': 9.4.4 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + deepmerge-ts: 7.1.5 + glob: 10.4.5 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@wdio/dot-reporter@9.14.0': + dependencies: + '@wdio/reporter': 9.14.0 + '@wdio/types': 9.14.0 + chalk: 5.4.1 + + '@wdio/globals@9.14.0(@wdio/logger@9.4.4)': + optionalDependencies: + expect-webdriverio: 5.1.0(@wdio/globals@9.14.0(@wdio/logger@9.4.4))(@wdio/logger@9.4.4)(webdriverio@9.14.0) + webdriverio: 9.14.0 + transitivePeerDependencies: + - '@wdio/logger' + - bare-buffer + - bufferutil + - puppeteer-core + - supports-color + - utf-8-validate + + '@wdio/local-runner@9.14.0': + dependencies: + '@types/node': 20.17.50 + '@wdio/logger': 9.4.4 + '@wdio/repl': 9.4.4 + '@wdio/runner': 9.14.0 + '@wdio/types': 9.14.0 + async-exit-hook: 2.0.1 + split2: 4.2.0 + stream-buffers: 3.0.3 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - puppeteer-core + - supports-color + - utf-8-validate + + '@wdio/logger@9.4.4': + dependencies: + chalk: 5.4.1 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + + '@wdio/mocha-framework@9.14.0': + dependencies: + '@types/mocha': 10.0.10 + '@types/node': 20.17.50 + '@wdio/logger': 9.4.4 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + mocha: 10.8.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@wdio/protocols@9.14.0': {} + + '@wdio/repl@9.4.4': + dependencies: + '@types/node': 20.17.50 + + '@wdio/reporter@9.14.0': + dependencies: + '@types/node': 20.17.50 + '@wdio/logger': 9.4.4 + '@wdio/types': 9.14.0 + diff: 7.0.0 + object-inspect: 1.13.4 + + '@wdio/runner@9.14.0': + dependencies: + '@types/node': 20.17.50 + '@wdio/config': 9.14.0 + '@wdio/dot-reporter': 9.14.0 + '@wdio/globals': 9.14.0(@wdio/logger@9.4.4) + '@wdio/logger': 9.4.4 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + deepmerge-ts: 7.1.5 + expect-webdriverio: 5.1.0(@wdio/globals@9.14.0(@wdio/logger@9.4.4))(@wdio/logger@9.4.4)(webdriverio@9.14.0) + webdriver: 9.14.0 + webdriverio: 9.14.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - puppeteer-core + - supports-color + - utf-8-validate + + '@wdio/spec-reporter@9.14.0': + dependencies: + '@wdio/reporter': 9.14.0 + '@wdio/types': 9.14.0 + chalk: 5.4.1 + easy-table: 1.2.0 + pretty-ms: 9.2.0 + + '@wdio/types@9.14.0': + dependencies: + '@types/node': 20.17.50 + + '@wdio/utils@9.14.0': + dependencies: + '@puppeteer/browsers': 2.10.5 + '@wdio/logger': 9.4.4 + '@wdio/types': 9.14.0 + decamelize: 6.0.0 + deepmerge-ts: 7.1.5 + edgedriver: 6.1.1 + geckodriver: 5.0.0 + get-port: 7.1.0 + import-meta-resolve: 4.1.0 + locate-app: 2.5.0 + safaridriver: 1.0.0 + split2: 4.2.0 + wait-port: 1.1.0 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webcomponents/custom-elements@1.6.0': {} + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@zip.js/zip.js@2.7.62': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + acorn@8.15.0: {} + + agent-base@7.1.3: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + arg@4.1.3: {} + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + optional: true + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.2 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@2.1.0: + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + ast-types-flow@0.0.8: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + async-exit-hook@2.0.1: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + autoprefixer@10.4.21(postcss@8.5.3): + dependencies: + browserslist: 4.24.5 + caniuse-lite: 1.0.30001718 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.10.3: {} + + axobject-query@4.1.0: {} + + b4a@1.6.7: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.4: + optional: true + + bare-fs@4.1.5: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + + base64-js@1.5.1: {} + + basic-ftp@5.0.5: {} + + binary-extensions@2.3.0: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.10 + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.6 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.6 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + hash-base: 3.0.5 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-status-codes@3.0.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001718: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + chardet@0.7.0: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.3 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + cipher-base@1.0.6: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@4.1.0: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: + optional: true + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@11.1.0: {} + + commander@13.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@9.5.0: {} + + comment-parser@1.4.1: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + concat-map@0.0.1: {} + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + convert-source-map@1.9.0: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.6 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-shorthand-properties@1.1.2: {} + + css-value@0.0.1: {} + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + decamelize@6.0.0: {} + + deep-is@0.1.4: {} + + deepmerge-ts@7.1.5: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + optional: true + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + detect-libc@1.0.3: + optional: true + + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + diff@7.0.0: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.2 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domain-browser@4.22.0: {} + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@16.5.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + easy-table@1.2.0: + dependencies: + ansi-regex: 5.0.1 + optionalDependencies: + wcwidth: 1.0.1 + + eciesjs@0.4.15: + dependencies: + '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + + edge-paths@3.0.5: + dependencies: + '@types/which': 2.0.2 + which: 2.0.2 + + edgedriver@6.1.1: + dependencies: + '@wdio/logger': 9.4.4 + '@zip.js/zip.js': 2.7.62 + decamelize: 6.0.0 + edge-paths: 3.0.5 + fast-xml-parser: 4.5.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.155: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@4.5.0: {} + + entities@6.0.0: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@0.10.5: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@2.4.2)): + dependencies: + eslint: 9.27.0(jiti@2.4.2) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@4.3.5(eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)): + dependencies: + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.4.2) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.13 + unrs-resolver: 1.7.2 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.3.5)(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.3.5(eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.27.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.3.5(eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color + optional: true + + eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + comment-parser: 1.4.1 + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.10.1 + is-glob: 4.0.3 + minimatch: 10.0.1 + semver: 7.7.2 + stable-hash: 0.0.5 + tslib: 2.8.1 + unrs-resolver: 1.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.3.5)(eslint@9.27.0(jiti@2.4.2)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.27.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.3.5(eslint-plugin-import-x@4.12.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + optional: true + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.3 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.27.0(jiti@2.4.2) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-prettier@5.4.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@2.4.2)))(eslint@9.27.0(jiti@2.4.2))(prettier@3.5.3): + dependencies: + eslint: 9.27.0(jiti@2.4.2) + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.6 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.5(eslint@9.27.0(jiti@2.4.2)) + + eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.4.2)): + dependencies: + eslint: 9.27.0(jiti@2.4.2) + + eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.27.0(jiti@2.4.2) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3))): + dependencies: + fast-glob: 3.3.3 + postcss: 8.5.3 + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3)) + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.27.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.27.0 + '@eslint/plugin-kit': 0.3.1 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + esm@3.2.25: {} + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@9.5.3: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + expect-webdriverio@5.1.0(@wdio/globals@9.14.0(@wdio/logger@9.4.4))(@wdio/logger@9.4.4)(webdriverio@9.14.0): + dependencies: + '@vitest/snapshot': 2.1.9 + '@wdio/globals': 9.14.0(@wdio/logger@9.4.4) + '@wdio/logger': 9.4.4 + expect: 29.7.0 + jest-matcher-utils: 29.7.0 + lodash.isequal: 4.5.0 + webdriverio: 9.14.0 + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flat@5.0.2: {} + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + geckodriver@5.0.0: + dependencies: + '@wdio/logger': 9.4.4 + '@zip.js/zip.js': 2.7.62 + decamelize: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + tar-fs: 3.0.8 + which: 5.0.0 + transitivePeerDependencies: + - bare-buffer + - supports-color + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-port@7.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@6.0.4: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.2: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.0 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globals@14.0.0: {} + + globals@16.1.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + grapheme-splitter@1.0.4: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + htmlfy@0.6.7: {} + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + https-browserify@1.0.0: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} + + husky@9.1.7: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.4: {} + + immediate@3.0.6: {} + + immutable@5.1.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inquirer@11.1.0: + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/prompts': 6.0.1 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + ansi-escapes: 4.3.2 + mute-stream: 1.0.0 + run-async: 3.0.0 + rxjs: 7.8.2 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isomorphic-timers-promises@1.0.1: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.0: + dependencies: + '@isaacs/cliui': 8.0.2 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.15.21 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.15.21 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + jiti@2.4.2: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + optional: true + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + lint-staged@16.0.0: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.1(supports-color@8.1.1) + lilconfig: 3.1.3 + listr2: 8.3.3 + micromatch: 4.0.8 + nano-spawn: 1.0.2 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.0 + transitivePeerDependencies: + - supports-color + + listr2@8.3.3: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + loader-runner@4.3.0: {} + + loader-utils@3.3.1: {} + + locate-app@2.5.0: + dependencies: + '@promptbook/utils': 0.69.5 + type-fest: 4.26.0 + userhome: 1.0.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.clonedeep@4.5.0: {} + + lodash.flattendeep@4.4.0: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.pickby@4.6.0: {} + + lodash.union@4.6.0: {} + + lodash.zip@4.2.0: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@6.1.0: + dependencies: + 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 + + loglevel-plugin-prefix@0.8.4: {} + + loglevel@1.9.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@11.1.0: {} + + lru-cache@7.18.3: {} + + lucide-react@0.542.0(react@19.1.0): + dependencies: + react: 19.1.0 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: + optional: true + + minipass@7.1.2: {} + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + mrmime@1.0.1: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + mute-stream@2.0.0: {} + + mylas@2.1.13: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nano-spawn@1.0.2: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.2.4: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + netmask@2.0.2: {} + + node-addon-api@7.1.1: + optional: true + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.19: {} + + node-stdlib-browser@1.3.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object-treeify@1.1.33: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + optional: true + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + os-browserify@0.3.0: {} + + os-tmpdir@1.0.2: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-json-from-dist@1.0.1: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.5 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + + parse-ms@4.0.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + plimit-lit@1.6.1: + dependencies: + queue-lit: 1.5.2 + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.3): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.0 + optionalDependencies: + postcss: 8.5.3 + ts-node: 10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3) + + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.3 + tsx: 4.19.4 + yaml: 2.8.0 + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-tailwindcss@0.6.11(prettier@3.5.3): + dependencies: + prettier: 3.5.3 + + prettier@3.5.3: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + progress@2.0.3: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + query-selector-shadow-dom@1.0.1: {} + + querystring-es3@0.2.1: {} + + queue-lit@1.5.2: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-error-boundary@6.0.0(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.1 + react: 19.1.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-refresh@0.13.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.1.5)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.5)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.5 + + react-remove-scroll@2.7.1(@types/react@19.1.5)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.5)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.5)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.5)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.5)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.5 + + react-spinners@0.17.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react-style-singleton@2.2.3(@types/react@19.1.5)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.5 + + react@19.1.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-pkg-up@10.1.0: + dependencies: + find-up: 6.3.0 + read-pkg: 8.1.0 + type-fest: 4.41.0 + + read-pkg@8.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 7.1.1 + type-fest: 4.41.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resq@1.11.0: + dependencies: + fast-deep-equal: 2.0.1 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rgb2hex@0.2.5: {} + + rimraf@6.0.1: + dependencies: + glob: 11.0.2 + package-json-from-dist: 1.0.1 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.41.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.41.0 + '@rollup/rollup-android-arm64': 4.41.0 + '@rollup/rollup-darwin-arm64': 4.41.0 + '@rollup/rollup-darwin-x64': 4.41.0 + '@rollup/rollup-freebsd-arm64': 4.41.0 + '@rollup/rollup-freebsd-x64': 4.41.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 + '@rollup/rollup-linux-arm-musleabihf': 4.41.0 + '@rollup/rollup-linux-arm64-gnu': 4.41.0 + '@rollup/rollup-linux-arm64-musl': 4.41.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-musl': 4.41.0 + '@rollup/rollup-linux-s390x-gnu': 4.41.0 + '@rollup/rollup-linux-x64-gnu': 4.41.0 + '@rollup/rollup-linux-x64-musl': 4.41.0 + '@rollup/rollup-win32-arm64-msvc': 4.41.0 + '@rollup/rollup-win32-ia32-msvc': 4.41.0 + '@rollup/rollup-win32-x64-msvc': 4.41.0 + fsevents: 2.3.3 + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + run-script-os@1.1.6: {} + + rxjs@7.5.7: + dependencies: + tslib: 2.8.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safaridriver@1.0.0: {} + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sass@1.89.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.2 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scheduler@0.26.0: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + semver@6.3.1: {} + + semver@7.7.2: {} + + serialize-error@11.0.3: + dependencies: + type-fest: 2.19.0 + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setimmediate@1.0.5: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + spacetrim@0.11.59: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + split2@4.2.0: {} + + sprintf-js@1.1.3: {} + + stable-hash@0.0.5: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-buffers@3.0.3: {} + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: + optional: true + + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@3.1.1: {} + + strnum@1.1.2: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.6: + dependencies: + '@pkgr/core': 0.2.4 + + tailwind-merge@3.3.0: {} + + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.3)) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.2: {} + + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.5 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.0 + + terser-webpack-plugin@5.3.14(@swc/core@1.11.24)(webpack@5.94.0(@swc/core@1.11.24)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.39.2 + webpack: 5.94.0(@swc/core@1.11.24) + optionalDependencies: + '@swc/core': 1.11.24 + + terser@5.39.2: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + tinyrainbow@1.2.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-interface-checker@0.1.13: {} + + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.94.0(@swc/core@1.11.24)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.1 + micromatch: 4.0.8 + semver: 7.7.2 + source-map: 0.7.4 + typescript: 5.8.3 + webpack: 5.94.0(@swc/core@1.11.24) + + ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.21)(typescript@5.8.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': 22.15.21 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.24 + + tsc-alias@1.8.16: + dependencies: + chokidar: 3.6.0 + commander: 9.5.0 + get-tsconfig: 4.10.1 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.6.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + optional: true + + tslib@2.8.1: {} + + tsx@4.19.4: + dependencies: + esbuild: 0.25.4 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + tty-browserify@0.0.1: {} + + turbo-darwin-64@2.5.3: + optional: true + + turbo-darwin-arm64@2.5.3: + optional: true + + turbo-linux-64@2.5.3: + optional: true + + turbo-linux-arm64@2.5.3: + optional: true + + turbo-windows-64@2.5.3: + optional: true + + turbo-windows-arm64@2.5.3: + optional: true + + turbo@2.5.3: + optionalDependencies: + turbo-darwin-64: 2.5.3 + turbo-darwin-arm64: 2.5.3 + turbo-linux-64: 2.5.3 + turbo-linux-arm64: 2.5.3 + turbo-windows-64: 2.5.3 + turbo-windows-arm64: 2.5.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.21.3: {} + + type-fest@2.19.0: {} + + type-fest@3.13.1: {} + + type-fest@4.26.0: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.27.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.19.8: {} + + undici-types@6.21.0: {} + + undici@6.21.3: {} + + unicorn-magic@0.3.0: {} + + universalify@2.0.1: {} + + unrs-resolver@1.7.2: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.7.2 + '@unrs/resolver-binding-darwin-x64': 1.7.2 + '@unrs/resolver-binding-freebsd-x64': 1.7.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-musl': 1.7.2 + '@unrs/resolver-binding-wasm32-wasi': 1.7.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + + urlpattern-polyfill@10.1.0: {} + + use-callback-ref@1.3.3(@types/react@19.1.5)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.5 + + use-sidecar@1.1.3(@types/react@19.1.5)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.5 + + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + + userhome@1.0.1: {} + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vite-plugin-node-polyfills@0.23.0(rollup@4.41.0)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.41.0) + node-stdlib-browser: 1.3.1 + vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0) + transitivePeerDependencies: + - rollup + + vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(sass@1.89.0)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.41.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.15.21 + fsevents: 2.3.3 + jiti: 2.4.2 + sass: 1.89.0 + terser: 5.39.2 + tsx: 4.19.4 + yaml: 2.8.0 + + vm-browserify@1.1.2: {} + + wait-port@1.1.0: + dependencies: + chalk: 4.1.2 + commander: 9.5.0 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + watchpack@2.4.3: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + optional: true + + web-streams-polyfill@3.3.3: {} + + webdriver@9.14.0: + dependencies: + '@types/node': 20.17.50 + '@types/ws': 8.18.1 + '@wdio/config': 9.14.0 + '@wdio/logger': 9.4.4 + '@wdio/protocols': 9.14.0 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + deepmerge-ts: 7.1.5 + undici: 6.21.3 + ws: 8.18.2 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + + webdriverio@9.14.0: + dependencies: + '@types/node': 20.17.50 + '@types/sinonjs__fake-timers': 8.1.5 + '@wdio/config': 9.14.0 + '@wdio/logger': 9.4.4 + '@wdio/protocols': 9.14.0 + '@wdio/repl': 9.4.4 + '@wdio/types': 9.14.0 + '@wdio/utils': 9.14.0 + archiver: 7.0.1 + aria-query: 5.3.2 + cheerio: 1.0.0 + css-shorthand-properties: 1.1.2 + css-value: 0.0.1 + grapheme-splitter: 1.0.4 + htmlfy: 0.6.7 + is-plain-obj: 4.1.0 + jszip: 3.10.1 + lodash.clonedeep: 4.5.0 + lodash.zip: 4.2.0 + query-selector-shadow-dom: 1.0.1 + resq: 1.11.0 + rgb2hex: 0.2.5 + serialize-error: 11.0.3 + urlpattern-polyfill: 10.1.0 + webdriver: 9.14.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + + webextension-polyfill@0.12.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.94.0(@swc/core@1.11.24): + dependencies: + '@types/estree': 1.0.7 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + browserslist: 4.24.5 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(@swc/core@1.11.24)(webpack@5.94.0(@swc/core@1.11.24)) + watchpack: 2.4.3 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + word-wrap@1.2.5: {} + + workerpool@6.5.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yaml@2.8.0: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.1: {} + + yoctocolors-cjs@2.1.2: {} + + yoctocolors@2.1.1: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 diff --git a/extension/pnpm-workspace.yaml b/extension/pnpm-workspace.yaml new file mode 100644 index 0000000..9d5a113 --- /dev/null +++ b/extension/pnpm-workspace.yaml @@ -0,0 +1,13 @@ +packages: + - chrome-extension + - pages/* + - packages/* + - tests/* + +onlyBuiltDependencies: + - '@parcel/watcher' + - '@swc/core' + - edgedriver + - esbuild + - geckodriver + - unrs-resolver diff --git a/extension/tests/e2e/config/wdio.browser.conf.ts b/extension/tests/e2e/config/wdio.browser.conf.ts new file mode 100644 index 0000000..bda8167 --- /dev/null +++ b/extension/tests/e2e/config/wdio.browser.conf.ts @@ -0,0 +1,58 @@ +import { config as baseConfig } from './wdio.conf.js'; +import { getChromeExtensionPath, getFirefoxExtensionPath } from '../utils/extension-path.js'; +import { IS_CI, IS_FIREFOX } from '@extension/env'; +import { readdir, readFile } from 'node:fs/promises'; +import { extname, join } from 'node:path'; + +const extName = IS_FIREFOX ? '.xpi' : '.zip'; +const extensions = await readdir(join(import.meta.dirname, '../../../dist-zip')); +const latestExtension = extensions.filter(file => extname(file) === extName).at(-1); +const extPath = join(import.meta.dirname, `../../../dist-zip/${latestExtension}`); +const bundledExtension = (await readFile(extPath)).toString('base64'); + +const chromeCapabilities = { + browserName: 'chrome', + acceptInsecureCerts: true, + 'goog:chromeOptions': { + args: [ + '--disable-web-security', + '--disable-gpu', + '--no-sandbox', + '--disable-dev-shm-usage', + ...(IS_CI ? ['--headless'] : []), + ], + prefs: { 'extensions.ui.developer_mode': true }, + extensions: [bundledExtension], + }, +}; + +const firefoxCapabilities = { + browserName: 'firefox', + acceptInsecureCerts: true, + 'moz:firefoxOptions': { + args: [...(IS_CI ? ['--headless'] : [])], + }, +}; + +export const config: WebdriverIO.Config = { + ...baseConfig, + capabilities: IS_FIREFOX ? [firefoxCapabilities] : [chromeCapabilities], + + maxInstances: IS_CI ? 10 : 1, + logLevel: 'error', + execArgv: IS_CI ? [] : ['--inspect'], + before: async ({ browserName }: WebdriverIO.Capabilities, _specs, browser: WebdriverIO.Browser) => { + if (browserName === 'firefox') { + await browser.installAddOn(bundledExtension, true); + + browser.addCommand('getExtensionPath', async () => getFirefoxExtensionPath(browser)); + } else if (browserName === 'chrome') { + browser.addCommand('getExtensionPath', async () => getChromeExtensionPath(browser)); + } + }, + afterTest: async () => { + if (!IS_CI) { + await browser.pause(500); + } + }, +}; diff --git a/extension/tests/e2e/config/wdio.conf.ts b/extension/tests/e2e/config/wdio.conf.ts new file mode 100644 index 0000000..2567bb6 --- /dev/null +++ b/extension/tests/e2e/config/wdio.conf.ts @@ -0,0 +1,97 @@ +/** + * WebdriverIO v9 configuration file + * https://webdriver.io/docs/configurationfile + */ +export const config: WebdriverIO.Config = { + runner: 'local', + tsConfigPath: '../tsconfig.json', + + // + // ================== + // Specify Test Files + // ================== + // Define which test specs should run. The pattern is relative to the directory + // of the configuration file being run. + // + // The specs are defined as an array of spec files (optionally using wildcards + // that will be expanded). The test for each spec file will be run in a separate + // worker process. In order to have a group of spec files run in the same worker + // process simply enclose them in an array within the specs array. + // + // The path of the spec files will be resolved relative from the directory + // of the config file unless it's absolute. + specs: ['../specs/**/*.ts'], + // Patterns to exclude. + exclude: [], + // + // ============ + // Capabilities + // ============ + // Define your capabilities here. WebdriverIO can run multiple capabilities at the same + // time. Depending on the number of capabilities, WebdriverIO launches several test + // sessions. Within your capabilities you can overwrite the spec and exclude options in + // order to group specific specs to a specific capability. + // + // First, you can define how many instances should be started at the same time. Let's + // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have + // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec + // files and you set maxInstances to 10, all spec files will get tested at the same time + // and 30 processes will get spawned. The property handles how many capabilities + // from the same test should run tests. + // + maxInstances: 10, + // + // If you have trouble getting all important capabilities together, check out the + // Sauce Labs platform configurator - a great tool to configure your capabilities: + // https://saucelabs.com/platform/platform-configurator + // + capabilities: [], + + // + // =================== + // Test Configurations + // =================== + // Define all options that are relevant for the WebdriverIO instance here + // + // Level of logging verbosity: trace | debug | info | warn | error | silent + logLevel: 'info', + + // + // If you only want to run your tests until a specific amount of tests have failed use + // bail (default is 0 - don't bail, run all tests). + bail: 0, + // + // Default timeout for all waitFor* commands. + waitforTimeout: 10000, + + // + // Default timeout in milliseconds for request + // if browser driver or grid doesn't send response + connectionRetryTimeout: 120000, + + // + // Default request retries count + connectionRetryCount: 3, + + // + // Framework you want to run your specs with. + // The following are supported: Mocha, Jasmine, and Cucumber + // see also: https://webdriver.io/docs/frameworks + // + // Make sure you have the wdio adapter package for the specific framework installed + // before running any tests. + framework: 'mocha', + + // + // Test reporter for stdout. + // The only one supported by default is 'dot' + // see also: https://webdriver.io/docs/dot-reporter + reporters: ['spec'], + + // Options to be passed to Mocha. + // See the full list at http://mochajs.org/ + mochaOpts: { + ui: 'bdd', + timeout: 60000, + }, +}; diff --git a/extension/tests/e2e/config/wdio.d.ts b/extension/tests/e2e/config/wdio.d.ts new file mode 100644 index 0000000..8dbebe4 --- /dev/null +++ b/extension/tests/e2e/config/wdio.d.ts @@ -0,0 +1,7 @@ +declare namespace WebdriverIO { + interface Browser extends WebdriverIO.Browser { + getExtensionPath: () => Promise; + installAddOn: (extension: string, temporary: boolean) => Promise; + addCommand: (name: string, func: () => Promise) => void; + } +} diff --git a/extension/tests/e2e/helpers/theme.ts b/extension/tests/e2e/helpers/theme.ts new file mode 100644 index 0000000..9dfd6c1 --- /dev/null +++ b/extension/tests/e2e/helpers/theme.ts @@ -0,0 +1,26 @@ +/** + * Helper method to check if user can click on theme button and toggle theme color + */ +export const canSwitchTheme = async () => { + const LIGHT_THEME_CLASS = 'bg-slate-50'; + const DARK_THEME_CLASS = 'bg-gray-800'; + const TOGGLE_BUTTON_TEXT = 'Toggle theme'; + + const app = await $('.App').getElement(); + const toggleThemeButton = await $(`button=${TOGGLE_BUTTON_TEXT}`).getElement(); + + await expect(app).toBeExisting(); + await expect(toggleThemeButton).toBeExisting(); + + const appClasses = await app.getAttribute('class'); + const initialThemeClass = appClasses.includes(LIGHT_THEME_CLASS) ? LIGHT_THEME_CLASS : DARK_THEME_CLASS; + const afterClickThemeClass = appClasses.includes(LIGHT_THEME_CLASS) ? DARK_THEME_CLASS : LIGHT_THEME_CLASS; + + // Toggle theme + await toggleThemeButton.click(); + await expect(app).toHaveElementClass(afterClickThemeClass); + + // Toggle back to initial theme + await toggleThemeButton.click(); + await expect(app).toHaveElementClass(initialThemeClass); +}; diff --git a/extension/tests/e2e/package.json b/extension/tests/e2e/package.json new file mode 100644 index 0000000..51874fb --- /dev/null +++ b/extension/tests/e2e/package.json @@ -0,0 +1,24 @@ +{ + "name": "@extension/e2e", + "version": "0.5.0", + "description": "E2e tests configuration boilerplate", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "e2e": "wdio run config/wdio.browser.conf.ts", + "clean:node_modules": "pnpx rimraf node_modules", + "clean:turbo": "pnpx rimraf .turbo", + "clean": "pnpm clean:turbo && pnpm clean:node_modules" + }, + "devDependencies": { + "@extension/env": "workspace:*", + "@extension/tsconfig": "workspace:*", + "@wdio/cli": "^9.14.0", + "@wdio/globals": "^9.14.0", + "@wdio/local-runner": "^9.14.0", + "@wdio/mocha-framework": "^9.14.0", + "@wdio/spec-reporter": "^9.14.0", + "@wdio/types": "^9.14.0" + } +} diff --git a/extension/tests/e2e/specs/page-content-runtime.test.ts b/extension/tests/e2e/specs/page-content-runtime.test.ts new file mode 100644 index 0000000..6a4bc7f --- /dev/null +++ b/extension/tests/e2e/specs/page-content-runtime.test.ts @@ -0,0 +1,36 @@ +describe('Webextension Content Runtime Script', () => { + before(function () { + // Chrome doesn't allow content scripts on the extension pages + if ((browser.capabilities as WebdriverIO.Capabilities).browserName === 'chrome') { + this.skip(); + } + }); + + it('should create all runtime elements on the page', async function () { + // Open the popup + const extensionPath = await browser.getExtensionPath(); + const popupUrl = `${extensionPath}/popup/index.html`; + + // if Popup file not found, skip the test + try { + await browser.url(popupUrl); + } catch { + console.error('Popup file not found'); + this.skip(); + } + + await expect(browser).toHaveTitle('Popup'); + + // Trigger inject button on popup + const contentScriptsButton = await $('button*=Content Scripts').getElement(); + + await contentScriptsButton.click(); + + // Check if id exists on the page + const runtimeExampleElement = await $('#CEB-extension-runtime-example').getElement(); + const runtimeAllElement = await $('#CEB-extension-runtime-all').getElement(); + + await expect(runtimeExampleElement).toBeExisting(); + await expect(runtimeAllElement).toBeExisting(); + }); +}); diff --git a/extension/tests/e2e/specs/page-content-ui.test.ts b/extension/tests/e2e/specs/page-content-ui.test.ts new file mode 100644 index 0000000..0ce4cda --- /dev/null +++ b/extension/tests/e2e/specs/page-content-ui.test.ts @@ -0,0 +1,21 @@ +describe('Content UI Injection', () => { + it('should locate the injected content UI (all and example) div on example.com`', async () => { + await browser.url('https://example.com'); + + const contentAllDiv = await $('#CEB-extension-all').getElement(); + await expect(contentAllDiv).toBeDisplayed(); + + const contentExampleDiv = await $('#CEB-extension-example').getElement(); + await expect(contentExampleDiv).toBeDisplayed(); + }); + + it('should locate the injected content UI all div and not locate example div on google.com', async () => { + await browser.url('https://www.google.com'); + + const contentAllDiv = await $('#CEB-extension-all').getElement(); + await expect(contentAllDiv).toBeDisplayed(); + + const contentExampleDiv = await $('#CEB-extension-example').getElement(); + await expect(contentExampleDiv).not.toBeDisplayed(); + }); +}); diff --git a/extension/tests/e2e/specs/page-content.test.ts b/extension/tests/e2e/specs/page-content.test.ts new file mode 100644 index 0000000..3bd8c67 --- /dev/null +++ b/extension/tests/e2e/specs/page-content.test.ts @@ -0,0 +1,33 @@ +describe('Webextension Content Script', () => { + it('should log "example content script loaded" in console on example.com', async () => { + await browser.sessionSubscribe({ events: ['log.entryAdded'] }); + const logs: (string | null)[] = []; + + browser.on('log.entryAdded', logEntry => { + logs.push(logEntry.text); + }); + + await browser.url('https://example.com'); + + const EXPECTED_LOG_MESSAGE = '[CEB] Example content script loaded'; + await browser.waitUntil(() => logs.includes(EXPECTED_LOG_MESSAGE)); + + expect(logs).toContain(EXPECTED_LOG_MESSAGE); + }); + + it('should log "all content script loaded" in console on any page', async () => { + await browser.sessionSubscribe({ events: ['log.entryAdded'] }); + const logs: (string | null)[] = []; + + browser.on('log.entryAdded', logEntry => { + logs.push(logEntry.text); + }); + + await browser.url('https://www.google.com'); + + const EXPECTED_LOG_MESSAGE = '[CEB] All content script loaded'; + await browser.waitUntil(() => logs.includes(EXPECTED_LOG_MESSAGE)); + + expect(logs).toContain(EXPECTED_LOG_MESSAGE); + }); +}); diff --git a/extension/tests/e2e/specs/page-devtools-panel.test.ts b/extension/tests/e2e/specs/page-devtools-panel.test.ts new file mode 100644 index 0000000..5284f7f --- /dev/null +++ b/extension/tests/e2e/specs/page-devtools-panel.test.ts @@ -0,0 +1,12 @@ +import { canSwitchTheme } from '../helpers/theme.js'; + +describe('Webextension DevTools Panel', () => { + it('should make DevTools panel available', async () => { + const extensionPath = await browser.getExtensionPath(); + const devtoolsPanelUrl = `${extensionPath}/devtools-panel/index.html`; + + await browser.url(devtoolsPanelUrl); + await expect(browser).toHaveTitle('Devtools Panel'); + await canSwitchTheme(); + }); +}); diff --git a/extension/tests/e2e/specs/page-new-tab.test.ts b/extension/tests/e2e/specs/page-new-tab.test.ts new file mode 100644 index 0000000..44501c0 --- /dev/null +++ b/extension/tests/e2e/specs/page-new-tab.test.ts @@ -0,0 +1,15 @@ +import { canSwitchTheme } from '../helpers/theme.js'; + +describe('Webextension New Tab', () => { + it('should open the extension page when a new tab is opened', async () => { + const extensionPath = await browser.getExtensionPath(); + const newTabUrl = + process.env.CLI_CEB_FIREFOX === 'true' ? `${extensionPath}/new-tab/index.html` : 'chrome://newtab'; + + await browser.url(newTabUrl); + + const appDiv = await $('.App').getElement(); + await expect(appDiv).toBeExisting(); + await canSwitchTheme(); + }); +}); diff --git a/extension/tests/e2e/specs/page-options.test.ts b/extension/tests/e2e/specs/page-options.test.ts new file mode 100644 index 0000000..8dd308e --- /dev/null +++ b/extension/tests/e2e/specs/page-options.test.ts @@ -0,0 +1,13 @@ +import { canSwitchTheme } from '../helpers/theme.js'; + +describe('Webextension Options Page', () => { + it('should make options page accessible', async () => { + const extensionPath = await browser.getExtensionPath(); + const optionsUrl = `${extensionPath}/options/index.html`; + + await browser.url(optionsUrl); + + await expect(browser).toHaveTitle('Options'); + await canSwitchTheme(); + }); +}); diff --git a/extension/tests/e2e/specs/page-popup.test.ts b/extension/tests/e2e/specs/page-popup.test.ts new file mode 100644 index 0000000..7a4805e --- /dev/null +++ b/extension/tests/e2e/specs/page-popup.test.ts @@ -0,0 +1,12 @@ +import { canSwitchTheme } from '../helpers/theme.js'; + +describe('Webextension Popup', () => { + it('should open the popup successfully', async () => { + const extensionPath = await browser.getExtensionPath(); + const popupUrl = `${extensionPath}/popup/index.html`; + await browser.url(popupUrl); + + await expect(browser).toHaveTitle('Popup'); + await canSwitchTheme(); + }); +}); diff --git a/extension/tests/e2e/specs/page-side-panel.test.ts b/extension/tests/e2e/specs/page-side-panel.test.ts new file mode 100644 index 0000000..abbbb1d --- /dev/null +++ b/extension/tests/e2e/specs/page-side-panel.test.ts @@ -0,0 +1,12 @@ +import { canSwitchTheme } from '../helpers/theme.js'; + +describe('Webextension Side Panel', () => { + it('should make side panel accessible', async () => { + const extensionPath = await browser.getExtensionPath(); + const sidePanelUrl = `${extensionPath}/side-panel/index.html`; + + await browser.url(sidePanelUrl); + await expect(browser).toHaveTitle('Side Panel'); + await canSwitchTheme(); + }); +}); diff --git a/extension/tests/e2e/specs/smoke.test.ts b/extension/tests/e2e/specs/smoke.test.ts new file mode 100644 index 0000000..ba2d9ac --- /dev/null +++ b/extension/tests/e2e/specs/smoke.test.ts @@ -0,0 +1,7 @@ +describe('The example page can be loaded', () => { + it('should be able to go to example page', async () => { + await browser.url('https://www.example.com'); + + await expect(browser).toHaveTitle('Example Domain'); + }); +}); diff --git a/extension/tests/e2e/tsconfig.json b/extension/tests/e2e/tsconfig.json new file mode 100644 index 0000000..2c67c9d --- /dev/null +++ b/extension/tests/e2e/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@extension/tsconfig/module", + "compilerOptions": { + "lib": ["dom"], + "types": ["node", "@wdio/globals/types", "@wdio/mocha-framework"], + "resolveJsonModule": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["specs", "config", "helpers"] +} diff --git a/extension/tests/e2e/utils/extension-path.ts b/extension/tests/e2e/utils/extension-path.ts new file mode 100644 index 0000000..e863d0b --- /dev/null +++ b/extension/tests/e2e/utils/extension-path.ts @@ -0,0 +1,49 @@ +/** + * Returns the Chrome extension path. + * @param browser + * @returns path to the Chrome extension + */ +export const getChromeExtensionPath = async (browser: WebdriverIO.Browser) => { + await browser.url('chrome://extensions/'); + /** + * https://webdriver.io/docs/extension-testing/web-extensions/#test-popup-modal-in-chrome + * ```ts + * const extensionItem = await $('extensions-item').getElement(); + * ``` + * The above code is not working. I guess it's because the shadow root is not accessible. + * So I used the following code to access the shadow root manually. + * + * @url https://github.com/webdriverio/webdriverio/issues/13521 + * @url https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/786 + */ + const extensionItem = await (async () => { + const extensionsManager = await $('extensions-manager').getElement(); + const itemList = await extensionsManager.shadow$('#container > #viewManager > extensions-item-list'); + return itemList.shadow$('extensions-item'); + })(); + + const extensionId = await extensionItem.getAttribute('id'); + + if (!extensionId) { + throw new Error('Extension ID not found'); + } + + return `chrome-extension://${extensionId}`; +}; + +/** + * Returns the Firefox extension path. + * @param browser + * @returns path to the Firefox extension + */ +export const getFirefoxExtensionPath = async (browser: WebdriverIO.Browser) => { + await browser.url('about:debugging#/runtime/this-firefox'); + const uuidElement = await browser.$('//dt[contains(text(), "Internal UUID")]/following-sibling::dd').getElement(); + const internalUUID = await uuidElement.getText(); + + if (!internalUUID) { + throw new Error('Internal UUID not found'); + } + + return `moz-extension://${internalUUID}`; +}; diff --git a/extension/tsconfig.json b/extension/tsconfig.json new file mode 100644 index 0000000..2922c5f --- /dev/null +++ b/extension/tsconfig.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "ESLint", + "extends": "./packages/tsconfig/base.json", + "compilerOptions": { + "noImplicitAny": false, + "noEmit": false, + "target": "ESNext" + }, + "include": ["eslint.config.ts"] +} diff --git a/extension/turbo.json b/extension/turbo.json new file mode 100644 index 0000000..efa1bca --- /dev/null +++ b/extension/turbo.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://turbo.build/schema.json", + "ui": "tui", + "globalEnv": ["CEB_*", "CLI_CEB_*"], + "globalDependencies": [".env"], + "concurrency": "12", + "tasks": { + "ready": { + "dependsOn": ["^ready"], + "outputs": ["../../dist/**", "dist/**"], + "cache": false + }, + "dev": { + "dependsOn": ["ready"], + "outputs": ["../../dist/**", "dist/**"], + "cache": false, + "persistent": true + }, + "build": { + "dependsOn": ["ready", "^build"], + "outputs": ["../../dist/**", "dist/**"], + "cache": false + }, + "e2e": { + "cache": false + }, + "type-check": { + "cache": false + }, + "lint": { + "cache": false + }, + "lint:fix": { + "cache": false + }, + "format": { + "dependsOn": ["^format"], + "cache": false + }, + "clean:node_modules": { + "dependsOn": ["^clean:node_modules"], + "cache": false + }, + "clean:turbo": { + "dependsOn": ["^clean:turbo"], + "cache": false + }, + "clean:bundle": { + "dependsOn": ["^clean:bundle"], + "cache": false + }, + "clean": { + "dependsOn": ["^clean"], + "cache": false + } + } +} diff --git a/objective.md b/objective.md new file mode 100644 index 0000000..7f38ba4 --- /dev/null +++ b/objective.md @@ -0,0 +1,589 @@ +# 🐠 Orca: AI-Powered Test Automation Platform + +## Executive Summary + +### 🎯 Vision Statement +**"Democratizing test automation through AI-powered intelligence, transforming manual testers into automation experts without writing a single line of code."** + +Orca represents the next evolution in test automation - moving from the traditional code-heavy approach to an intelligent, AI-driven platform that understands user intent and automatically generates comprehensive test suites from simple recordings. + +### 🔥 The Problem We're Solving + +**Traditional Test Automation Challenges:** +- **High Technical Barrier**: Requires programming skills, limiting adoption to technical team members +- **Time-Intensive Setup**: Writing and maintaining test scripts consumes 60-80% of testing time +- **Brittle Tests**: DOM changes break tests frequently, requiring constant maintenance +- **Limited Coverage**: Manual script writing leads to incomplete test scenarios +- **Knowledge Silos**: Test automation expertise concentrated among few team members + +**Current Market Gap:** +While record-and-replay tools exist, they produce fragile, linear test scripts. **No current solution combines recording with AI to generate intelligent, robust, and comprehensive test suites.** + +### 💡 Our Revolutionary Solution + +**AI-Powered Test Automation Pipeline:** + +1. **🎥 Intelligent Recording**: Users perform natural workflows while Orca captures actions with semantic understanding +2. **🧠 AI Analysis**: Advanced algorithms understand user intent, business context, and workflow patterns +3. **⚡ Smart Generation**: AI creates multiple test scenarios, edge cases, and validation points automatically +4. **🔄 Orchestrated Execution**: Intelligent test suite composition with optimal parallel execution + +**Key Differentiators:** +- **Zero Code Required**: Complete test automation without programming knowledge +- **AI-Generated Test Cases**: One recording produces multiple intelligent test scenarios +- **Context-Aware Analysis**: Understands business workflows, not just individual actions +- **Self-Healing Tests**: AI adapts to UI changes automatically +- **Collaborative Platform**: Enables entire teams to contribute to test automation + +--- + +## 🏗️ Current System Architecture + +### **Established Foundation** + +#### **Backend Infrastructure (Rust)** +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ API Service │◄──►│ Engine Service │◄──►│ Database │ +│ (Axum/REST) │ │ (Controllers) │ │ (PostgreSQL) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +- **API Layer**: RESTful endpoints for apps, cases, actions, and suites +- **Engine Layer**: Test execution controllers with WebDriver integration +- **Database Layer**: Comprehensive schema for test automation entities + +#### **Data Model Architecture** +``` +Applications + ↓ +ActionGroups (Reusable test components) + ↓ +Actions (Individual test steps) + ↓ +Cases (Test scenarios) + ↓ +CaseBlocks (Execution flow control) + ↓ +Suites (Test collections) +``` + +#### **Current Capabilities** +- ✅ **Application Management**: Multi-tenant application support +- ✅ **Action System**: Click, Enter, DoubleClick, Open, VerifyText, VerifyAttribute +- ✅ **Target System**: CSS, XPath, ID-based element selection +- ✅ **Data Management**: Static and runtime data binding +- ✅ **Execution Engine**: WebDriver-based test execution with logging +- ✅ **Flow Control**: Conditions, loops, parallel execution support +- ✅ **Storage Integration**: S3-compatible storage for artifacts + +#### **Infrastructure Stack** +- **Database**: PostgreSQL with SeaORM for type-safe operations +- **Cache**: Redis for session and performance optimization +- **Storage**: MinIO S3-compatible storage for screenshots/artifacts +- **Browser Automation**: Selenium Grid with Chrome/Firefox support +- **Monitoring**: Comprehensive tracing and logging with structured data + +### **Gap Analysis: Missing Components** + +#### **Critical Missing Pieces** +- ❌ **Recording Mechanism**: No browser extension or recording interface +- ❌ **AI Engine**: No intelligent analysis or generation capabilities +- ❌ **User Interface**: No frontend for visual test management +- ❌ **Workflow Intelligence**: No semantic understanding of user actions + +--- + +## 🤖 AI Integration Strategy + +### **Core AI Components Architecture** + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Recording │────│ AI Engine │────│ Generation │ +│ Capture │ │ Analysis │ │ Engine │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ DOM Context │ │ Intent │ │ Test Scenarios │ +│ Business Rules │ │ Recognition │ │ Edge Cases │ +│ User Patterns │ │ Workflow │ │ Validation │ +│ │ │ Analysis │ │ Points │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### **AI Capabilities by Component** + +#### **1. Intelligent Recording Analysis** +**Technology Stack**: Computer Vision + NLP + Machine Learning + +**Capabilities:** +- **DOM Intelligence**: Smart element identification with multiple selectors +- **Context Awareness**: Understanding forms, workflows, and business processes +- **Pattern Recognition**: Identifying repeated actions and workflow templates +- **Intent Classification**: Categorizing user actions by business purpose + +**Implementation:** +```rust +// AI Analysis Service +pub struct AIAnalysisService { + intent_classifier: IntentClassifier, + pattern_recognizer: PatternRecognizer, + context_analyzer: ContextAnalyzer, +} + +pub enum ActionIntent { + Authentication, // Login, registration flows + DataEntry, // Form filling, data input + Navigation, // Menu clicks, page traversal + Validation, // Checking results, verification + BusinessProcess, // Domain-specific workflows +} +``` + +#### **2. Test Generation Engine** +**Technology Stack**: Large Language Models + Rule-Based Systems + +**Capabilities:** +- **Scenario Multiplication**: Generate multiple test cases from single recording +- **Edge Case Generation**: Automatic boundary testing and error scenarios +- **Validation Point Insertion**: Smart assertion generation based on context +- **Natural Language Descriptions**: Human-readable test documentation + +**Generated Test Types:** +- **Happy Path**: Standard successful workflow execution +- **Error Scenarios**: Invalid inputs, network failures, timeout cases +- **Boundary Testing**: Min/max values, empty fields, special characters +- **Cross-Browser**: Responsive design and compatibility testing +- **Performance**: Load time assertions and resource monitoring + +#### **3. Self-Healing Test Maintenance** +**Technology Stack**: Computer Vision + Diff Analysis + Machine Learning + +**Capabilities:** +- **Element Resilience**: Multiple selector strategies with fallback +- **UI Change Adaptation**: Automatic selector updates when DOM changes +- **Flaky Test Detection**: Pattern analysis to identify unstable tests +- **Maintenance Suggestions**: AI-recommended test improvements + +### **AI Model Integration Points** + +#### **Recording Phase AI** +```rust +pub struct RecordingAI { + // Analyze user actions in real-time + pub async fn analyze_action(&self, action: &BrowserAction) -> ActionAnalysis; + + // Identify business workflow patterns + pub async fn detect_workflow(&self, actions: &[BrowserAction]) -> WorkflowPattern; + + // Generate smart element selectors + pub async fn generate_selectors(&self, element: &DOMElement) -> Vec; +} +``` + +#### **Generation Phase AI** +```rust +pub struct GenerationAI { + // Create test variations from recorded workflow + pub async fn generate_scenarios(&self, workflow: &WorkflowPattern) -> Vec; + + // Generate natural language test descriptions + pub async fn describe_test(&self, scenario: &TestScenario) -> String; + + // Create validation assertions + pub async fn generate_assertions(&self, context: &BusinessContext) -> Vec; +} +``` + +--- + +## 👥 User Journey & Experience Design + +### **Primary Personas** + +#### **1. The Manual Tester** +- **Background**: Experienced in manual testing, limited coding skills +- **Pain Points**: Wants to automate but blocked by technical complexity +- **Goal**: Create automated tests without learning programming +- **Value**: 10x faster test creation, comprehensive coverage + +#### **2. The QA Lead** +- **Background**: Team management, process optimization focus +- **Pain Points**: Team productivity bottlenecked by automation skills gap +- **Goal**: Enable entire team to contribute to test automation +- **Value**: Team-wide automation adoption, improved test coverage + +#### **3. The Product Owner** +- **Background**: Business requirements, user experience focus +- **Pain Points**: Limited visibility into test coverage and quality +- **Goal**: Ensure comprehensive testing of business workflows +- **Value**: Business-readable test documentation, coverage insights + +### **Complete User Journey** + +#### **Phase 1: Onboarding & Setup (5 minutes)** +``` +🏁 Start → 📱 Install Extension → 🔐 Login → 🎯 Select App → ✅ Ready +``` + +**Experience:** +- One-click browser extension installation +- Seamless authentication with existing credentials +- Automatic application detection and configuration +- Guided tour of key features and concepts + +#### **Phase 2: Recording Workflow (Natural Usage)** +``` +🎥 Start Recording → 🖱️ Perform Actions → 🧠 AI Analysis → 📝 Review Results +``` + +**User Actions:** +1. **Click "Record"** - Extension begins capturing +2. **Use Application Naturally** - Login, navigate, perform business tasks +3. **Complete Workflow** - Finish business process (e.g., user registration) +4. **Stop Recording** - AI immediately analyzes captured workflow + +**AI Background Processing:** +- Real-time action classification and intent detection +- Business workflow pattern recognition +- Element selector optimization and validation +- Context gathering for later test generation + +#### **Phase 3: AI-Powered Enhancement (2 minutes)** +``` +🤖 AI Analysis → 📊 Scenario Generation → ✏️ User Review → ✅ Approval +``` + +**AI-Generated Outputs:** +- **Primary Test Case**: Happy path execution with smart assertions +- **Error Scenarios**: Invalid inputs, network failures, edge cases +- **Performance Tests**: Load time monitoring and optimization +- **Accessibility Tests**: ARIA compliance and keyboard navigation +- **Cross-Browser Variants**: Chrome, Firefox, Safari compatibility + +**User Review Interface:** +- Visual workflow diagram with action thumbnails +- Natural language test descriptions +- Editable test parameters and data sets +- Coverage analysis and gap identification + +#### **Phase 4: Test Orchestration (1 minute)** +``` +🔗 Group Tests → 📋 Create Suites → ⚙️ Configure Execution → 🚀 Launch +``` + +**Smart Orchestration Features:** +- **Dependency Detection**: Automatic test ordering based on prerequisites +- **Parallel Optimization**: AI determines optimal parallel execution strategy +- **Data Management**: Smart test data generation and isolation +- **Environment Configuration**: Automatic browser and device selection + +#### **Phase 5: Execution & Insights (Automated)** +``` +🏃 Execute Tests → 📸 Capture Evidence → 📈 Generate Reports → 🔄 Continuous Learning +``` + +**Execution Intelligence:** +- **Self-Healing**: Automatic adaptation to UI changes +- **Smart Retries**: Intelligent failure analysis and retry strategies +- **Evidence Capture**: Screenshots, videos, and performance metrics +- **Root Cause Analysis**: AI-powered failure investigation + +### **User Experience Principles** + +#### **1. Invisible Complexity** +- Complex AI processing hidden behind simple, intuitive interfaces +- Technical details available for advanced users but not required +- Progressive disclosure of advanced features + +#### **2. Immediate Value** +- First test case generated within minutes of recording +- Instant feedback on test quality and coverage gaps +- Real-time insights during recording process + +#### **3. Collaborative by Design** +- Natural language test documentation accessible to all stakeholders +- Business-readable reports and dashboards +- Team-wide contribution without technical barriers + +#### **4. Continuous Intelligence** +- System learns from user feedback and test results +- Automatic improvement suggestions based on usage patterns +- Predictive maintenance for test suite health + +--- + +## 🗓️ Development Roadmap + +### **Phase 1: Foundation & Recording (Month 1-2)** + +#### **Week 1-2: Recording Infrastructure** +**Epic: Browser Extension Development** + +*Frontend Components:* +- **Recording Interface**: Start/stop recording with visual feedback +- **Action Overlay**: Real-time action capture visualization +- **Element Inspector**: Smart selector generation interface + +*Backend Components:* +- **Recording API**: Endpoints for storing and retrieving recordings +- **Action Parser**: Convert DOM events to structured action data +- **Session Management**: Recording session persistence and replay + +**Deliverables:** +```rust +// New API endpoints +POST /api/v1/recording/start +POST /api/v1/recording/action +POST /api/v1/recording/stop +GET /api/v1/recording/{id} + +// New database entities +Recording { + id: Uuid, + session_id: String, + application_id: Uuid, + raw_actions: Vec, + metadata: RecordingMetadata, +} +``` + +#### **Week 3-4: Basic AI Analysis** +**Epic: Intent Recognition System** + +*AI Components:* +- **Action Classifier**: Categorize actions by business intent +- **Element Analyzer**: Generate robust selectors for UI elements +- **Pattern Detector**: Identify workflow patterns and sequences + +*Integration Points:* +- **Recording Pipeline**: Real-time action analysis during capture +- **Storage System**: Persist AI analysis results with raw data +- **API Extensions**: Endpoints for accessing analysis results + +### **Phase 2: AI-Powered Generation (Month 3-4)** + +#### **Week 5-6: Test Generation Engine** +**Epic: Intelligent Test Creation** + +*Core AI Systems:* +- **Scenario Generator**: Create multiple test variants from recordings +- **Assertion Engine**: Generate smart validation points +- **Edge Case Generator**: Automatic boundary and error testing + +*Integration Components:* +- **Generation API**: Endpoints for triggering and managing test generation +- **Template System**: Configurable test generation templates +- **Validation Framework**: Quality scoring for generated tests + +#### **Week 7-8: User Interface Development** +**Epic: Visual Test Management Platform** + +*Frontend Applications:* +- **Recording Review Interface**: Visual workflow editing and enhancement +- **Test Generation Dashboard**: AI-generated test case review and approval +- **Suite Builder**: Drag-and-drop test orchestration interface + +*User Experience Features:* +- **Natural Language Descriptions**: Human-readable test documentation +- **Visual Workflow Diagrams**: Graphical representation of test flows +- **Interactive Test Editing**: Point-and-click test modification + +### **Phase 3: Advanced Intelligence (Month 5-6)** + +#### **Week 9-10: Self-Healing & Optimization** +**Epic: Intelligent Test Maintenance** + +*Advanced AI Features:* +- **UI Change Detection**: Automatic adaptation to interface modifications +- **Flaky Test Analysis**: Pattern detection for unstable test identification +- **Performance Optimization**: Smart parallel execution and resource management + +*Maintenance Systems:* +- **Automated Healing**: Self-repairing tests with minimal user intervention +- **Maintenance Dashboards**: Proactive test suite health monitoring +- **Update Recommendations**: AI-suggested improvements and optimizations + +#### **Week 11-12: Enterprise Features** +**Epic: Scale & Collaboration** + +*Enterprise Components:* +- **Multi-Tenant Architecture**: Secure application and team isolation +- **Role-Based Access**: Granular permissions and workflow approval +- **Integration APIs**: CI/CD pipeline integration and webhook support + +*Collaboration Features:* +- **Team Dashboards**: Shared visibility into test automation status +- **Review Workflows**: Collaborative test case approval processes +- **Knowledge Sharing**: Best practices and pattern libraries + +### **Phase 4: Market Launch (Month 7-8)** + +#### **Week 13-14: Production Readiness** +**Epic: Scalability & Reliability** + +*Infrastructure Components:* +- **Cloud Deployment**: Kubernetes-based auto-scaling architecture +- **Monitoring Systems**: Comprehensive observability and alerting +- **Performance Optimization**: Load testing and capacity planning + +*Quality Assurance:* +- **Security Audit**: Penetration testing and vulnerability assessment +- **Performance Benchmarking**: Load testing under realistic conditions +- **User Acceptance Testing**: Beta user feedback integration + +#### **Week 15-16: Market Launch** +**Epic: Go-to-Market Execution** + +*Launch Components:* +- **Documentation Platform**: Comprehensive user guides and API documentation +- **Support Systems**: Help desk, knowledge base, and community forums +- **Marketing Website**: Feature showcases, demos, and trial signup + +*Growth Features:* +- **Analytics Platform**: Usage tracking and feature adoption metrics +- **Feedback Systems**: Continuous user feedback collection and analysis +- **A/B Testing**: Feature optimization based on user behavior data + +--- + +## 📊 Success Metrics & KPIs + +### **Technical Excellence Metrics** + +#### **Core Platform Performance** +- **Test Generation Speed**: < 30 seconds from recording to first test case +- **AI Accuracy**: > 85% intent classification accuracy on diverse workflows +- **Test Reliability**: < 5% false positive rate in generated assertions +- **Self-Healing Success**: > 90% automatic recovery from UI changes + +#### **User Experience Metrics** +- **Time to First Test**: < 5 minutes from installation to first automated test +- **User Adoption Rate**: > 70% of trial users create production test suites +- **Feature Discovery**: > 80% of users utilize AI-generated test variations +- **User Satisfaction**: > 4.5/5 stars in user experience surveys + +### **Business Impact Metrics** + +#### **Productivity Gains** +- **Test Creation Speed**: 10x faster compared to manual script writing +- **Coverage Improvement**: 5x increase in test scenario coverage per workflow +- **Maintenance Reduction**: 70% reduction in test maintenance effort +- **Team Productivity**: 50% more team members contributing to test automation + +#### **Quality Improvements** +- **Bug Detection**: 40% increase in pre-production bug discovery +- **Release Velocity**: 30% faster release cycles due to automation confidence +- **Customer Satisfaction**: Improved user experience through better testing +- **Cost Efficiency**: 60% reduction in manual testing effort and costs + +### **Growth & Adoption Metrics** + +#### **Market Penetration** +- **User Growth**: 100% month-over-month growth in active users (first 6 months) +- **Enterprise Adoption**: 50+ enterprise customers within first year +- **Market Share**: Top 3 position in AI-powered testing tools category +- **Partner Ecosystem**: Integration partnerships with 10+ development tool vendors + +--- + +## 🚀 Competitive Advantages + +### **Technical Differentiation** + +#### **1. AI-First Architecture** +- **Unlike Traditional Tools**: Not just record-and-replay, but intelligent understanding +- **Advanced ML Models**: Context-aware analysis beyond simple action capture +- **Continuous Learning**: System improves from user feedback and usage patterns + +#### **2. Zero-Code Approach** +- **Accessibility**: Enables non-technical team members to create robust tests +- **Speed**: Eliminates programming bottleneck in test automation adoption +- **Collaboration**: Bridges gap between business users and technical teams + +#### **3. Self-Healing Intelligence** +- **Reliability**: Automatic adaptation to UI changes without manual intervention +- **Maintenance**: Reduces ongoing test maintenance burden significantly +- **Stability**: Higher test reliability compared to brittle traditional automation + +### **Market Positioning** + +#### **vs. Selenium/Traditional Tools** +- **Ease of Use**: Visual interface vs. code-heavy development +- **Speed**: Minutes vs. days for test creation +- **Maintenance**: Self-healing vs. manual script updates + +#### **vs. Record-and-Replay Tools** +- **Intelligence**: AI understanding vs. simple action recording +- **Robustness**: Smart selectors vs. fragile element identification +- **Coverage**: Multiple scenarios vs. single linear workflow + +#### **vs. Low-Code Platforms** +- **AI Integration**: Intelligent generation vs. manual test building +- **Business Context**: Workflow understanding vs. technical action focus +- **Collaboration**: Natural language descriptions vs. technical documentation + +--- + +## 🔮 Future Vision & Roadmap + +### **Short Term (Year 1): Foundation Excellence** +- **Core Platform**: Robust recording, AI analysis, and test generation +- **User Experience**: Intuitive interface with comprehensive onboarding +- **Market Validation**: Product-market fit with early adopter customers + +### **Medium Term (Year 2-3): Advanced Intelligence** +- **Multi-Modal AI**: Voice commands, visual testing, accessibility analysis +- **Integration Ecosystem**: Deep integrations with popular development tools +- **Enterprise Features**: Advanced security, compliance, and governance + +### **Long Term (Year 3+): Industry Transformation** +- **Predictive Testing**: AI recommends tests before features are built +- **Autonomous QA**: Fully automated test planning, execution, and reporting +- **Industry Standards**: Define new paradigms for AI-powered quality assurance + +### **Innovation Areas** + +#### **Advanced AI Capabilities** +- **Natural Language Test Creation**: "Test user login with invalid credentials" +- **Visual Testing**: AI-powered UI/UX validation and regression detection +- **Performance Intelligence**: Automatic performance bottleneck identification +- **Security Testing**: AI-generated security test scenarios and vulnerability detection + +#### **Ecosystem Expansion** +- **Mobile Applications**: React Native, Flutter, native iOS/Android support +- **API Testing**: Intelligent API test generation from UI workflows +- **Database Testing**: Data validation and integrity testing automation +- **Load Testing**: AI-optimized performance and scalability testing + +#### **Business Intelligence** +- **Quality Insights**: Predictive analytics for product quality trends +- **Risk Assessment**: AI-powered release readiness evaluation +- **Cost Analysis**: ROI tracking and optimization recommendations +- **Compliance Automation**: Automated regulatory and standards compliance testing + +--- + +## 🎯 Conclusion + +Orca represents a fundamental shift in test automation philosophy - from **technical barrier** to **team enablement**, from **manual scripting** to **AI-powered generation**, from **maintenance burden** to **self-healing intelligence**. + +**Our unique value proposition:** +1. **Democratizes test automation** - Any team member can contribute without coding +2. **Multiplies test coverage** - One recording generates comprehensive test suites +3. **Reduces maintenance overhead** - Self-healing tests adapt to changes automatically +4. **Accelerates development velocity** - Faster, more reliable releases through better testing + +**The market opportunity is immense:** Organizations worldwide struggle with the test automation bottleneck. Orca eliminates this constraint, enabling teams to achieve comprehensive test coverage without the traditional technical barriers. + +**Our path to success:** Build the most intelligent, user-friendly test automation platform that transforms how teams think about quality assurance - from a specialized technical skill to a collaborative team capability. + +**The future we're building:** A world where comprehensive test automation is accessible to every development team, where AI handles the complexity, and where quality becomes a natural outcome of the development process rather than a specialized afterthought. + +--- + +*"The best test automation platform is one that makes testing so easy and intelligent that every team member naturally contributes to quality assurance."* + +**Let's build that future with Orca.** \ No newline at end of file diff --git a/web/README.md b/web/README.md deleted file mode 100644 index b87cb00..0000000 --- a/web/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/web/components.json b/web/components.json deleted file mode 100644 index 4f9b7b0..0000000 --- a/web/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "tailwind.config.js", - "css": "src/app/global.css", - "baseColor": "zinc", - "cssVariables": true, - "prefix": "src" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils" - } -} \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json deleted file mode 100644 index c764148..0000000 --- a/web/package-lock.json +++ /dev/null @@ -1,21382 +0,0 @@ -{ - "name": "ui", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ui", - "version": "0.1.0", - "dependencies": { - "@dagrejs/dagre": "^1.0.4", - "@headlessui/react": "^1.6.6", - "@heroicons/react": "^2.0.18", - "@hookform/resolvers": "^3.3.4", - "@preline/select": "^2.0.2", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-alert-dialog": "^1.0.5", - "@radix-ui/react-aspect-ratio": "^1.0.3", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-context-menu": "^2.1.5", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-form": "^0.0.3", - "@radix-ui/react-hover-card": "^1.0.7", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-navigation-menu": "^1.1.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-radio-group": "^1.1.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-toggle": "^1.0.3", - "@radix-ui/react-toggle-group": "^1.0.4", - "@radix-ui/react-tooltip": "^1.0.7", - "@radix-ui/themes": "^2.0.3", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.86", - "@types/react": "^18.2.63", - "@types/react-dom": "^18.2.19", - "@vercel/analytics": "^0.1.8", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "cmdk": "^0.2.1", - "dagre": "latest", - "date-fns": "^3.3.1", - "embla-carousel-react": "^8.0.0", - "immer": "^10.0.1", - "lucide-react": "^0.344.0", - "next-themes": "^0.2.1", - "react": "^18.2.0", - "react-day-picker": "^8.10.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.51.0", - "react-lazily": "^0.9.1", - "react-resizable-panels": "^2.0.12", - "react-router-dom": "^6.8.1", - "react-scripts": "5.0.1", - "reactflow": "^11.10.1", - "sonner": "^1.4.3", - "tailwind-merge": "^2.2.1", - "tailwindcss-animate": "^1.0.7", - "typescript": "^4.9.5", - "uuid": "^9.0.0", - "vaul": "^0.9.0", - "web-vitals": "^2.1.4", - "zod": "^3.22.4", - "zustand": "^4.3.7" - }, - "devDependencies": { - "@tailwindcss/forms": "^0.5.7", - "@types/react-router-dom": "^5.3.3", - "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.30.6", - "@typescript-eslint/parser": "^5.30.6", - "autoprefixer": "^10.4.18", - "chromatic": "^6.7.2", - "eslint": "^8.19.0", - "eslint-config-prettier": "^8.5.0", - "eslint-import-resolver-typescript": "^3.2.6", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-storybook": "^0.6.1", - "postcss": "^8.4.35", - "preline": "^2.0.3", - "prettier": "^2.7.1", - "prop-types": "^15.8.1", - "tailwindcss": "^3.4.1", - "webpack": "^5.74.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", - "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", - "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.0.tgz", - "integrity": "sha512-LiT1RqZWeij7X+wGxCoYh3/3b8nVOX6/7BZ9wiQgAIyjoeQWdROaodJCgT+dwtbjHaz0r7bEbHJzjSbVfcOyjQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.0.tgz", - "integrity": "sha512-MXW3pQCu9gUiVGzqkGqsgiINDVYXoAnrY8FYF/rmb+OfufNF0zHMpHPN4ulRrinxYT8Vk/aZJxYqOKsDECjKAw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", - "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@csstools/normalize.css": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", - "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@dagrejs/dagre": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.0.4.tgz", - "integrity": "sha512-jrEore+HhW1yg1Rsd9H1PPMcoEOD4bVh0WCXc6GqzyzubnJj4GaWGg8ETOrskTd/3n/g5LOzumGM4CCgpNLJNw==", - "dependencies": { - "@dagrejs/graphlib": "2.1.13" - } - }, - "node_modules/@dagrejs/graphlib": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.1.13.tgz", - "integrity": "sha512-calbMa7Gcyo+/t23XBaqQqon8LlgE9regey4UVoikoenKBXvUnCUL3s9RP6USCxttfr0XWVICtYUuKMdehKqMw==", - "engines": { - "node": ">17.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dependencies": { - "@floating-ui/dom": "^1.6.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@headlessui/react": { - "version": "1.7.18", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.18.tgz", - "integrity": "sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==", - "dependencies": { - "@tanstack/react-virtual": "^3.0.0-beta.60", - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@heroicons/react": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz", - "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==", - "peerDependencies": { - "react": ">= 16" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz", - "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@next/env": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.2.tgz", - "integrity": "sha512-U0iEG+JF86j6qyu330sfPgsMmDVH8vWVmzZadl+an5EU3o5HqdNytOpM+HsFpl58PmhGBTKx3UmM9c+eoLK0mA==", - "peer": true - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.2.tgz", - "integrity": "sha512-E4/clgk0ZrYMo9eMRwP/4IO/cvXF1yEYSnGcdGfH+NYTR8bNFy76TSlc1Vb2rK3oaQY4BVHRpx8f/sMN/D5gNw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.2.tgz", - "integrity": "sha512-j8mEOI+ZM0tU9B/L/OGa6F7d9FXYMkog5OWWuhTWzz3iZ91UKIGGpD/ojTNKuejainDMgbqOBTNnLg0jZywM/g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.2.tgz", - "integrity": "sha512-qpRrd5hl6BFTWiFLgHtJmqqQGRMs+ol0MN9pEp0SYoLs3j8OTErPiDMhbKWjMWHGdc2E3kg4RRBV3cSTZiePiQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.2.tgz", - "integrity": "sha512-HAhvVXAv+wnbj0wztT0YnpgJVoHtw1Mv4Y1R/JJcg5yXSU8FsP2uEGUwjQaqPoD76YSZjuKl32YbJlmPgQbLFw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.2.tgz", - "integrity": "sha512-PCWC312woXLWOXiedi1E+fEw6B/ECP1fMiK1nSoGS2E43o56Z8kq4WeJLbJoufFQGVj5ZOKU3jIVyV//3CI4wQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.2.tgz", - "integrity": "sha512-KQSKzdWPNrYZjeTPCsepEpagOzU8Nf3Zzu53X1cLsSY6QlOIkYcSgEihRjsMKyeQW4aSvc+nN5pIpC2pLWNSMA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.2.tgz", - "integrity": "sha512-3b0PouKd09Ulm2T1tjaRnwQj9+UwSsMO680d/sD4XAlm29KkNmVLAEIwWTfb3L+E11Qyw+jdcN3HtbDCg5+vYA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.2.tgz", - "integrity": "sha512-CC1gaJY4h+wg6d5r2biggGM6nCFXh/6WEim2VOQI0WrA6easCQi2P2hzWyrU6moQ0g1GOiWzesGc6nn0a92Kgg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.2.tgz", - "integrity": "sha512-pfASwanOd+yP3D80O63DuQffrBySZPuB7wRN0IGSRq/0rDm9p/MvvnLzzgP2kSiLOUklOrFYVax7P6AEzjGykQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@preline/select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@preline/select/-/select-2.0.2.tgz", - "integrity": "sha512-4gHxX4a6W5yyh058lDts3A8uuijM54aNhF/4J0peKFiKjcicsQoFbVFYurk9zIgpHOIzDzH9KVsQjjjLlF/A/Q==" - }, - "node_modules/@radix-ui/colors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", - "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==" - }, - "node_modules/@radix-ui/number": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", - "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.0.3.tgz", - "integrity": "sha512-duVGKeWPSUILr/MdlPxV+GeULTc2rS1aihGdQ3N2qCUPMgxYLxvAsHJM3mCVLF8d5eK+ympmB22mb1F3a5biNw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-visually-hidden": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", - "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collapsible": "1.0.3", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz", - "integrity": "sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dialog": "1.0.5", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.0.3.tgz", - "integrity": "sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", - "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz", - "integrity": "sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", - "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.1.5.tgz", - "integrity": "sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", - "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", - "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-form": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.0.3.tgz", - "integrity": "sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-label": "2.0.2", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.0.7.tgz", - "integrity": "sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", - "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", - "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", - "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.0.4.tgz", - "integrity": "sha512-bHgUo9gayKZfaQcWSSLr++LyS0rgh+MvD89DE4fJ6TkGHvjHgPaBZf44hdka7ogOxIOdj9163J+5xL2Dn4qzzg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.4.tgz", - "integrity": "sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", - "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", - "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.0.3.tgz", - "integrity": "sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz", - "integrity": "sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz", - "integrity": "sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", - "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", - "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.2.tgz", - "integrity": "sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.3.tgz", - "integrity": "sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", - "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz", - "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", - "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", - "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-toggle": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", - "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", - "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", - "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/themes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-2.0.3.tgz", - "integrity": "sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==", - "dependencies": { - "@radix-ui/colors": "^3.0.0", - "@radix-ui/primitive": "^1.0.1", - "@radix-ui/react-accessible-icon": "^1.0.3", - "@radix-ui/react-alert-dialog": "^1.0.5", - "@radix-ui/react-aspect-ratio": "^1.0.3", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-context-menu": "^2.1.5", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-direction": "^1.0.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-form": "^0.0.3", - "@radix-ui/react-hover-card": "^1.0.7", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-portal": "^1.0.4", - "@radix-ui/react-radio-group": "^1.1.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-tooltip": "^1.0.7", - "@radix-ui/react-use-callback-ref": "^1.0.1", - "@radix-ui/react-visually-hidden": "^1.0.3", - "classnames": "^2.3.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@reactflow/background": { - "version": "11.3.9", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.9.tgz", - "integrity": "sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==", - "dependencies": { - "@reactflow/core": "11.10.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/controls": { - "version": "11.2.9", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.9.tgz", - "integrity": "sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==", - "dependencies": { - "@reactflow/core": "11.10.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/core": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.10.4.tgz", - "integrity": "sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/minimap": { - "version": "11.7.9", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.9.tgz", - "integrity": "sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==", - "dependencies": { - "@reactflow/core": "11.10.4", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-resizer": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.9.tgz", - "integrity": "sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==", - "dependencies": { - "@reactflow/core": "11.10.4", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.9.tgz", - "integrity": "sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==", - "dependencies": { - "@reactflow/core": "11.10.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@remix-run/router": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz", - "integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", - "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@storybook/csf": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.1.3.tgz", - "integrity": "sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==", - "dependencies": { - "@tanstack/virtual-core": "3.1.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.1.3.tgz", - "integrity": "sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/react/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/react/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/react/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", - "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz", - "integrity": "sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", - "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", - "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/node": { - "version": "16.18.86", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.86.tgz", - "integrity": "sha512-QMvdZf+ZTSiv7gspwhqbfB7Y5DmbYgCsUnakS8Ul9uRbJQehDKaM7SL+GbcDS003Lh7VK4YlelHsRm9HCv26eA==" - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "node_modules/@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" - }, - "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "18.2.63", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.63.tgz", - "integrity": "sha512-ppaqODhs15PYL2nGUOaOu2RSCCB4Difu4UFrP4I3NHLloXC/ESQzQMi9nvjfT1+rudd0d2L3fQPJxRSey+rGlQ==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@vercel/analytics": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-0.1.11.tgz", - "integrity": "sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==", - "peerDependencies": { - "react": "^16.8||^17||^18" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/bfj": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", - "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "peer": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001594", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", - "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/check-types": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chromatic": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-6.24.1.tgz", - "integrity": "sha512-XbpdWWHvFpEHtcq1Km71UcuQ07effB+8q8L47E1Y7HJmJ4ZCoKCuPd8liNrbnvwEAxqfBZvTcONYU/3BPz2i5w==", - "dev": true, - "bin": { - "chroma": "dist/bin.js", - "chromatic": "dist/bin.js", - "chromatic-cli": "dist/bin.js" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" - }, - "node_modules/class-variance-authority": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", - "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "node_modules/class-variance-authority/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/classcat": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", - "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", - "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", - "dependencies": { - "@radix-ui/react-dialog": "1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", - "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", - "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", - "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", - "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", - "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", - "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-js": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", - "dependencies": { - "browserslist": "^4.22.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", - "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssdb": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.1.tgz", - "integrity": "sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/date-fns": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", - "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "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.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.692", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", - "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==" - }, - "node_modules/embla-carousel": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.0.0.tgz", - "integrity": "sha512-ecixcyqS6oKD2nh5Nj5MObcgoSILWNI/GtBxkidn5ytFaCCmwVHo2SecksaQZHcARMMpIR2dWOlSIdA1LkZFUA==" - }, - "node_modules/embla-carousel-react": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.0.0.tgz", - "integrity": "sha512-qT0dii8ZwoCtEIBE6ogjqU2+5IwnGfdt2teKjCzW88JRErflhlCpz8KjWnW8xoRZOP8g0clRtsMEFoAgS/elfA==", - "dependencies": { - "embla-carousel": "8.0.0", - "embla-carousel-reactive-utils": "8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.0.tgz", - "integrity": "sha512-JCw0CqCXI7tbHDRogBb9PoeMLyjEC1vpN0lDOzUjmlfVgtfF+ffLaOK8bVtXVUEbNs/3guGe3NSzA5J5aYzLzw==", - "peerDependencies": { - "embla-carousel": "8.0.0" - } - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", - "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-storybook": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz", - "integrity": "sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.45.0", - "requireindex": "^1.1.0", - "ts-dedent": "^2.2.0" - }, - "engines": { - "node": "12.x || 14.x || >= 16" - }, - "peerDependencies": { - "eslint": ">=6" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", - "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.344.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.344.0.tgz", - "integrity": "sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/next/-/next-14.1.2.tgz", - "integrity": "sha512-p4RfNmopqkzRP1uUyBJnHii+qMg71f2udWhTTZopBB8b3T5QXNzn7yO+LCYHPWZG2kAvEn4l4neyJHqkXvo2wg==", - "peer": true, - "dependencies": { - "@next/env": "14.1.2", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.1.2", - "@next/swc-darwin-x64": "14.1.2", - "@next/swc-linux-arm64-gnu": "14.1.2", - "@next/swc-linux-arm64-musl": "14.1.2", - "@next/swc-linux-x64-gnu": "14.1.2", - "@next/swc-linux-x64-musl": "14.1.2", - "@next/swc-win32-arm64-msvc": "14.1.2", - "@next/swc-win32-ia32-msvc": "14.1.2", - "@next/swc-win32-x64-msvc": "14.1.2" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", - "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", - "peerDependencies": { - "next": "*", - "react": "*", - "react-dom": "*" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", - "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/preline": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/preline/-/preline-2.0.3.tgz", - "integrity": "sha512-V/sLmRIHd23UCdvJNRKKszntgUqA0381erVzRpQ48NjjMOgI7DyFW4mr+lg387V0oeBc5Dx9Jxa5voppVoH9GA==", - "dev": true, - "dependencies": { - "@popperjs/core": "^2.11.2" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/react-day-picker": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.0.tgz", - "integrity": "sha512-mz+qeyrOM7++1NCb1ARXmkjMkzWVh2GL9YiPbRjKe0zHccvekk4HE+0MPOZOrosn8r8zTHIIeOUXTmXRqmkRmg==", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "date-fns": "^2.28.0 || ^3.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-hook-form": { - "version": "7.51.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz", - "integrity": "sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-lazily": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/react-lazily/-/react-lazily-0.9.2.tgz", - "integrity": "sha512-oBVRDQ+SuMPWenBO/0Kq+iZk34lOYJEmjiTto4bYRufndf8pux3E50BT3mJZbsq0vBsAVbX3fpQjlUvsXgDVag==", - "peerDependencies": { - "react": ">=16.8", - "react-dom": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.5.tgz", - "integrity": "sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.0.12.tgz", - "integrity": "sha512-m0cfwlVQ+460iQbOSVfs3MljVniHI/LGpHGQBa7aNCYUYwaERHcf5W/lCTsoRhbGQfMW9An0M8gxUHILA53Jeg==", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-router": { - "version": "6.22.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz", - "integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==", - "dependencies": { - "@remix-run/router": "1.15.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.22.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz", - "integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==", - "dependencies": { - "@remix-run/router": "1.15.2", - "react-router": "6.22.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/reactflow": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.10.4.tgz", - "integrity": "sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==", - "dependencies": { - "@reactflow/background": "11.3.9", - "@reactflow/controls": "11.2.9", - "@reactflow/core": "11.10.4", - "@reactflow/minimap": "11.7.9", - "@reactflow/node-resizer": "2.2.9", - "@reactflow/node-toolbar": "1.3.9" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/sonner": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.4.3.tgz", - "integrity": "sha512-SArYlHbkjqRuLiR0iGY2ZSr09oOrxw081ZZkQPfXrs8aZQLIBOLOdzTYxGJB5yIZ7qL56UEPmrX1YqbODwG0Lw==", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "peer": true, - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwind-merge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.1.tgz", - "integrity": "sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==", - "dependencies": { - "@babel/runtime": "^7.23.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.28.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", - "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz", - "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vaul": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.0.tgz", - "integrity": "sha512-bZSySGbAHiTXmZychprnX/dE0EsSige88xtyyL3/MCRbrFotRPQZo7UdydGXZWw+CKbNOw5Ow8gwAo93/nB/Cg==", - "dependencies": { - "@radix-ui/react-dialog": "^1.0.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", - "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/web/package.json b/web/package.json deleted file mode 100644 index d3457a8..0000000 --- a/web/package.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "name": "ui", - "version": "0.1.0", - "private": true, - "dependencies": { - "@dagrejs/dagre": "^1.0.4", - "@headlessui/react": "^1.6.6", - "@heroicons/react": "^2.0.18", - "@hookform/resolvers": "^3.3.4", - "@preline/select": "^2.0.2", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-alert-dialog": "^1.0.5", - "@radix-ui/react-aspect-ratio": "^1.0.3", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-context-menu": "^2.1.5", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-form": "^0.0.3", - "@radix-ui/react-hover-card": "^1.0.7", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-navigation-menu": "^1.1.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-radio-group": "^1.1.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-toggle": "^1.0.3", - "@radix-ui/react-toggle-group": "^1.0.4", - "@radix-ui/react-tooltip": "^1.0.7", - "@radix-ui/themes": "^2.0.3", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.86", - "@types/react": "^18.2.63", - "@types/react-dom": "^18.2.19", - "@vercel/analytics": "^0.1.8", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "cmdk": "^0.2.1", - "dagre": "latest", - "date-fns": "^3.3.1", - "embla-carousel-react": "^8.0.0", - "immer": "^10.0.1", - "lucide-react": "^0.344.0", - "next-themes": "^0.2.1", - "react": "^18.2.0", - "react-day-picker": "^8.10.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.51.0", - "react-lazily": "^0.9.1", - "react-resizable-panels": "^2.0.12", - "react-router-dom": "^6.8.1", - "react-scripts": "5.0.1", - "reactflow": "^11.10.1", - "sonner": "^1.4.3", - "tailwind-merge": "^2.2.1", - "tailwindcss-animate": "^1.0.7", - "typescript": "^4.9.5", - "uuid": "^9.0.0", - "vaul": "^0.9.0", - "web-vitals": "^2.1.4", - "zod": "^3.22.4", - "zustand": "^4.3.7" - }, - "devDependencies": { - "@tailwindcss/forms": "^0.5.7", - "@types/react-router-dom": "^5.3.3", - "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.30.6", - "@typescript-eslint/parser": "^5.30.6", - "autoprefixer": "^10.4.18", - "chromatic": "^6.7.2", - "eslint": "^8.19.0", - "eslint-config-prettier": "^8.5.0", - "eslint-import-resolver-typescript": "^3.2.6", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-storybook": "^0.6.1", - "postcss": "^8.4.35", - "preline": "^2.0.3", - "prettier": "^2.7.1", - "prop-types": "^15.8.1", - "tailwindcss": "^3.4.1", - "webpack": "^5.74.0" - }, - "scripts": { - "start": "BROWSER=none react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "proxy": "http://127.0.0.1:8080/" -} diff --git a/web/postcss.config.js b/web/postcss.config.js deleted file mode 100644 index 5a3d19f..0000000 --- a/web/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} \ No newline at end of file diff --git a/web/prettier.config.js b/web/prettier.config.js deleted file mode 100644 index c2249b3..0000000 --- a/web/prettier.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - plugins: ['prettier-plugin-tailwindcss'], - tailwindConfig: "./tailwind.config.js", - }; \ No newline at end of file diff --git a/web/public/favicon.ico b/web/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/web/public/index.html b/web/public/index.html deleted file mode 100644 index 98e461a..0000000 --- a/web/public/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - Orca - - - -
- - - - diff --git a/web/public/logo192.png b/web/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/web/src/App.tsx b/web/src/App.tsx deleted file mode 100644 index eeabe6c..0000000 --- a/web/src/App.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Spinner } from "core/components/spinner"; -import { Suspense, useEffect } from "react"; -import { BrowserRouter, Route, Routes } from "react-router-dom"; -import { ROUTES } from "utils/route"; - -function App() { - useEffect(() => { - import("preline"); - }, []); - - return ( - - }> - - {ROUTES.map((route) => { - const Component = route.component(); - return ( - }> - {route.nestedRoute - ? route.nestedRoute.map((subRoute: any) => { - const Element = subRoute.component(); - return ( - } - > - {subRoute?.nestedRoute - ? subRoute.nestedRoute.map( - (grandChildRoute: any) => { - const Element = grandChildRoute.component(); - return ( - } - /> - ); - } - ) - : null} - - ); - }) - : null} - - ); - })} - - - - ); -} - -export default App; diff --git a/web/src/app/global.css b/web/src/app/global.css deleted file mode 100644 index 53169fb..0000000 --- a/web/src/app/global.css +++ /dev/null @@ -1,76 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - --ring: 240 10% 3.9%; - - --radius: 0.5rem; - } - - .dark { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; - - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; - - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; - - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; - - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - --ring: 240 4.9% 83.9%; - } -} - -@layer base { - * { - @apply srcborder-border; - } - body { - @apply srcbg-background srctext-foreground; - } -} \ No newline at end of file diff --git a/web/src/assert/svg/NotFound.svg b/web/src/assert/svg/NotFound.svg deleted file mode 100644 index bf691dc..0000000 --- a/web/src/assert/svg/NotFound.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/src/assert/svg/index.ts b/web/src/assert/svg/index.ts deleted file mode 100644 index 732b64d..0000000 --- a/web/src/assert/svg/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { ReactComponent as NotFound } from "./NotFound.svg"; diff --git a/web/src/components/ui/accordion.tsx b/web/src/components/ui/accordion.tsx deleted file mode 100644 index 72c1a0e..0000000 --- a/web/src/components/ui/accordion.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from "react" -import * as AccordionPrimitive from "@radix-ui/react-accordion" -import { ChevronDownIcon } from "@radix-ui/react-icons" - -import { cn } from "@/lib/utils" - -const Accordion = AccordionPrimitive.Root - -const AccordionItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AccordionItem.displayName = "AccordionItem" - -const AccordionTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - svg]:srcrotate-180", - className - )} - {...props} - > - {children} - - - -)) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName - -const AccordionContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - -
{children}
-
-)) -AccordionContent.displayName = AccordionPrimitive.Content.displayName - -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/web/src/components/ui/alert-dialog.tsx b/web/src/components/ui/alert-dialog.tsx deleted file mode 100644 index 0e44f80..0000000 --- a/web/src/components/ui/alert-dialog.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import * as React from "react" -import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" - -import { cn } from "@/lib/utils" -import { buttonVariants } from "@/components/ui/button" - -const AlertDialog = AlertDialogPrimitive.Root - -const AlertDialogTrigger = AlertDialogPrimitive.Trigger - -const AlertDialogPortal = AlertDialogPrimitive.Portal - -const AlertDialogOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName - -const AlertDialogContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - -)) -AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName - -const AlertDialogHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -AlertDialogHeader.displayName = "AlertDialogHeader" - -const AlertDialogFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -AlertDialogFooter.displayName = "AlertDialogFooter" - -const AlertDialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName - -const AlertDialogDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogDescription.displayName = - AlertDialogPrimitive.Description.displayName - -const AlertDialogAction = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName - -const AlertDialogCancel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName - -export { - AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogFooter, - AlertDialogTitle, - AlertDialogDescription, - AlertDialogAction, - AlertDialogCancel, -} diff --git a/web/src/components/ui/alert.tsx b/web/src/components/ui/alert.tsx deleted file mode 100644 index 9764d61..0000000 --- a/web/src/components/ui/alert.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const alertVariants = cva( - "srcrelative srcw-full srcrounded-lg srcborder srcpx-4 srcpy-3 srctext-sm [&>svg+div]:srctranslate-y-[-3px] [&>svg]:srcabsolute [&>svg]:srcleft-4 [&>svg]:srctop-4 [&>svg]:srctext-foreground [&>svg~*]:srcpl-7", - { - variants: { - variant: { - default: "srcbg-background srctext-foreground", - destructive: - "srcborder-destructive/50 srctext-destructive dark:srcborder-destructive [&>svg]:srctext-destructive", - }, - }, - defaultVariants: { - variant: "default", - }, - } -) - -const Alert = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & VariantProps ->(({ className, variant, ...props }, ref) => ( -
-)) -Alert.displayName = "Alert" - -const AlertTitle = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -AlertTitle.displayName = "AlertTitle" - -const AlertDescription = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -AlertDescription.displayName = "AlertDescription" - -export { Alert, AlertTitle, AlertDescription } diff --git a/web/src/components/ui/aspect-ratio.tsx b/web/src/components/ui/aspect-ratio.tsx deleted file mode 100644 index c4abbf3..0000000 --- a/web/src/components/ui/aspect-ratio.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" - -const AspectRatio = AspectRatioPrimitive.Root - -export { AspectRatio } diff --git a/web/src/components/ui/avatar.tsx b/web/src/components/ui/avatar.tsx deleted file mode 100644 index 50aad53..0000000 --- a/web/src/components/ui/avatar.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from "react" -import * as AvatarPrimitive from "@radix-ui/react-avatar" - -import { cn } from "@/lib/utils" - -const Avatar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -Avatar.displayName = AvatarPrimitive.Root.displayName - -const AvatarImage = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AvatarImage.displayName = AvatarPrimitive.Image.displayName - -const AvatarFallback = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName - -export { Avatar, AvatarImage, AvatarFallback } diff --git a/web/src/components/ui/badge.tsx b/web/src/components/ui/badge.tsx deleted file mode 100644 index 8b11fc8..0000000 --- a/web/src/components/ui/badge.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const badgeVariants = cva( - "srcinline-flex srcitems-center srcrounded-md srcborder srcpx-2.5 srcpy-0.5 srctext-xs srcfont-semibold srctransition-colors focus:srcoutline-none focus:srcring-2 focus:srcring-ring focus:srcring-offset-2", - { - variants: { - variant: { - default: - "srcborder-transparent srcbg-primary srctext-primary-foreground srcshadow hover:srcbg-primary/80", - secondary: - "srcborder-transparent srcbg-secondary srctext-secondary-foreground hover:srcbg-secondary/80", - destructive: - "srcborder-transparent srcbg-destructive srctext-destructive-foreground srcshadow hover:srcbg-destructive/80", - outline: "srctext-foreground", - }, - }, - defaultVariants: { - variant: "default", - }, - } -) - -export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} - -function Badge({ className, variant, ...props }: BadgeProps) { - return ( -
- ) -} - -export { Badge, badgeVariants } diff --git a/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx deleted file mode 100644 index 85edc87..0000000 --- a/web/src/components/ui/button.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "lib/utils"; - -const buttonVariants = cva( - "srcinline-flex srcitems-center srcjustify-center srcwhitespace-nowrap srcrounded-md srctext-sm srcfont-medium srctransition-colors focus-visible:srcoutline-none focus-visible:srcring-1 focus-visible:srcring-ring disabled:srcpointer-events-none disabled:srcopacity-50", - { - variants: { - variant: { - default: - "srcbg-primary srctext-primary-foreground srcshadow hover:srcbg-primary/90", - destructive: - "srcbg-destructive srctext-destructive-foreground srcshadow-sm hover:srcbg-destructive/90", - outline: - "srcborder srcborder-input srcbg-background srcshadow-sm hover:srcbg-accent hover:srctext-accent-foreground", - secondary: - "srcbg-secondary srctext-secondary-foreground srcshadow-sm hover:srcbg-secondary/80", - ghost: "hover:srcbg-accent hover:srctext-accent-foreground", - link: "srctext-primary srcunderline-offset-4 hover:srcunderline" - }, - size: { - default: "srch-9 srcpx-4 srcpy-2", - sm: "srch-8 srcrounded-md srcpx-3 srctext-xs", - lg: "srch-10 srcrounded-md srcpx-8", - icon: "srch-9 srcw-9" - } - }, - defaultVariants: { - variant: "default", - size: "default" - } - } -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ( - - ); - } -); -Button.displayName = "Button"; - -export { Button, buttonVariants }; diff --git a/web/src/components/ui/calendar.tsx b/web/src/components/ui/calendar.tsx deleted file mode 100644 index 24571d6..0000000 --- a/web/src/components/ui/calendar.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import * as React from "react" -import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons" -import { DayPicker } from "react-day-picker" - -import { cn } from "@/lib/utils" -import { buttonVariants } from "@/components/ui/button" - -export type CalendarProps = React.ComponentProps - -function Calendar({ - className, - classNames, - showOutsideDays = true, - ...props -}: CalendarProps) { - return ( - .day-range-end)]:srcrounded-r-md [&:has(>.day-range-start)]:srcrounded-l-md first:[&:has([aria-selected])]:srcrounded-l-md last:[&:has([aria-selected])]:srcrounded-r-md" - : "[&:has([aria-selected])]:srcrounded-md" - ), - day: cn( - buttonVariants({ variant: "ghost" }), - "srch-8 srcw-8 srcp-0 srcfont-normal aria-selected:srcopacity-100" - ), - day_range_start: "srcday-range-start", - day_range_end: "srcday-range-end", - day_selected: - "srcbg-primary srctext-primary-foreground hover:srcbg-primary hover:srctext-primary-foreground focus:srcbg-primary focus:srctext-primary-foreground", - day_today: "srcbg-accent srctext-accent-foreground", - day_outside: - "srcday-outside srctext-muted-foreground srcopacity-50 src aria-selected:srcbg-accent/50 aria-selected:srctext-muted-foreground aria-selected:srcopacity-30", - day_disabled: "srctext-muted-foreground srcopacity-50", - day_range_middle: - "aria-selected:srcbg-accent aria-selected:srctext-accent-foreground", - day_hidden: "srcinvisible", - ...classNames, - }} - components={{ - IconLeft: ({ ...props }) => , - IconRight: ({ ...props }) => , - }} - {...props} - /> - ) -} -Calendar.displayName = "Calendar" - -export { Calendar } diff --git a/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx deleted file mode 100644 index 70a56d0..0000000 --- a/web/src/components/ui/card.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import * as React from "react" - -import { cn } from "@/lib/utils" - -const Card = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -Card.displayName = "Card" - -const CardHeader = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardHeader.displayName = "CardHeader" - -const CardTitle = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardTitle.displayName = "CardTitle" - -const CardDescription = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardDescription.displayName = "CardDescription" - -const CardContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardContent.displayName = "CardContent" - -const CardFooter = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardFooter.displayName = "CardFooter" - -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/web/src/components/ui/carousel.tsx b/web/src/components/ui/carousel.tsx deleted file mode 100644 index 71ddd52..0000000 --- a/web/src/components/ui/carousel.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import * as React from "react" -import { ArrowLeftIcon, ArrowRightIcon } from "@radix-ui/react-icons" -import useEmblaCarousel, { - type UseEmblaCarouselType, -} from "embla-carousel-react" - -import { cn } from "@/lib/utils" -import { Button } from "@/components/ui/button" - -type CarouselApi = UseEmblaCarouselType[1] -type UseCarouselParameters = Parameters -type CarouselOptions = UseCarouselParameters[0] -type CarouselPlugin = UseCarouselParameters[1] - -type CarouselProps = { - opts?: CarouselOptions - plugins?: CarouselPlugin - orientation?: "horizontal" | "vertical" - setApi?: (api: CarouselApi) => void -} - -type CarouselContextProps = { - carouselRef: ReturnType[0] - api: ReturnType[1] - scrollPrev: () => void - scrollNext: () => void - canScrollPrev: boolean - canScrollNext: boolean -} & CarouselProps - -const CarouselContext = React.createContext(null) - -function useCarousel() { - const context = React.useContext(CarouselContext) - - if (!context) { - throw new Error("useCarousel must be used within a ") - } - - return context -} - -const Carousel = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & CarouselProps ->( - ( - { - orientation = "horizontal", - opts, - setApi, - plugins, - className, - children, - ...props - }, - ref - ) => { - const [carouselRef, api] = useEmblaCarousel( - { - ...opts, - axis: orientation === "horizontal" ? "x" : "y", - }, - plugins - ) - const [canScrollPrev, setCanScrollPrev] = React.useState(false) - const [canScrollNext, setCanScrollNext] = React.useState(false) - - const onSelect = React.useCallback((api: CarouselApi) => { - if (!api) { - return - } - - setCanScrollPrev(api.canScrollPrev()) - setCanScrollNext(api.canScrollNext()) - }, []) - - const scrollPrev = React.useCallback(() => { - api?.scrollPrev() - }, [api]) - - const scrollNext = React.useCallback(() => { - api?.scrollNext() - }, [api]) - - const handleKeyDown = React.useCallback( - (event: React.KeyboardEvent) => { - if (event.key === "ArrowLeft") { - event.preventDefault() - scrollPrev() - } else if (event.key === "ArrowRight") { - event.preventDefault() - scrollNext() - } - }, - [scrollPrev, scrollNext] - ) - - React.useEffect(() => { - if (!api || !setApi) { - return - } - - setApi(api) - }, [api, setApi]) - - React.useEffect(() => { - if (!api) { - return - } - - onSelect(api) - api.on("reInit", onSelect) - api.on("select", onSelect) - - return () => { - api?.off("select", onSelect) - } - }, [api, onSelect]) - - return ( - -
- {children} -
-
- ) - } -) -Carousel.displayName = "Carousel" - -const CarouselContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { carouselRef, orientation } = useCarousel() - - return ( -
-
-
- ) -}) -CarouselContent.displayName = "CarouselContent" - -const CarouselItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { orientation } = useCarousel() - - return ( -
- ) -}) -CarouselItem.displayName = "CarouselItem" - -const CarouselPrevious = React.forwardRef< - HTMLButtonElement, - React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollPrev, canScrollPrev } = useCarousel() - - return ( - - ) -}) -CarouselPrevious.displayName = "CarouselPrevious" - -const CarouselNext = React.forwardRef< - HTMLButtonElement, - React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollNext, canScrollNext } = useCarousel() - - return ( - - ) -}) -CarouselNext.displayName = "CarouselNext" - -export { - type CarouselApi, - Carousel, - CarouselContent, - CarouselItem, - CarouselPrevious, - CarouselNext, -} diff --git a/web/src/components/ui/checkbox.tsx b/web/src/components/ui/checkbox.tsx deleted file mode 100644 index 1151f4f..0000000 --- a/web/src/components/ui/checkbox.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import * as React from "react" -import * as CheckboxPrimitive from "@radix-ui/react-checkbox" -import { CheckIcon } from "@radix-ui/react-icons" - -import { cn } from "@/lib/utils" - -const Checkbox = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - -)) -Checkbox.displayName = CheckboxPrimitive.Root.displayName - -export { Checkbox } diff --git a/web/src/components/ui/collapsible.tsx b/web/src/components/ui/collapsible.tsx deleted file mode 100644 index a23e7a2..0000000 --- a/web/src/components/ui/collapsible.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" - -const Collapsible = CollapsiblePrimitive.Root - -const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger - -const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent - -export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/web/src/components/ui/command.tsx b/web/src/components/ui/command.tsx deleted file mode 100644 index ceea641..0000000 --- a/web/src/components/ui/command.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import * as React from "react" -import { type DialogProps } from "@radix-ui/react-dialog" -import { MagnifyingGlassIcon } from "@radix-ui/react-icons" -import { Command as CommandPrimitive } from "cmdk" - -import { cn } from "@/lib/utils" -import { Dialog, DialogContent } from "@/components/ui/dialog" - -const Command = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -Command.displayName = CommandPrimitive.displayName - -interface CommandDialogProps extends DialogProps {} - -const CommandDialog = ({ children, ...props }: CommandDialogProps) => { - return ( - - - - {children} - - - - ) -} - -const CommandInput = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( -
- - -
-)) - -CommandInput.displayName = CommandPrimitive.Input.displayName - -const CommandList = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) - -CommandList.displayName = CommandPrimitive.List.displayName - -const CommandEmpty = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->((props, ref) => ( - -)) - -CommandEmpty.displayName = CommandPrimitive.Empty.displayName - -const CommandGroup = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) - -CommandGroup.displayName = CommandPrimitive.Group.displayName - -const CommandSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -CommandSeparator.displayName = CommandPrimitive.Separator.displayName - -const CommandItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) - -CommandItem.displayName = CommandPrimitive.Item.displayName - -const CommandShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { - return ( - - ) -} -CommandShortcut.displayName = "CommandShortcut" - -export { - Command, - CommandDialog, - CommandInput, - CommandList, - CommandEmpty, - CommandGroup, - CommandItem, - CommandShortcut, - CommandSeparator, -} diff --git a/web/src/components/ui/context-menu.tsx b/web/src/components/ui/context-menu.tsx deleted file mode 100644 index 9d93643..0000000 --- a/web/src/components/ui/context-menu.tsx +++ /dev/null @@ -1,202 +0,0 @@ -import * as React from "react" -import * as ContextMenuPrimitive from "@radix-ui/react-context-menu" -import { - CheckIcon, - ChevronRightIcon, - DotFilledIcon, -} from "@radix-ui/react-icons" - -import { cn } from "@/lib/utils" - -const ContextMenu = ContextMenuPrimitive.Root - -const ContextMenuTrigger = ContextMenuPrimitive.Trigger - -const ContextMenuGroup = ContextMenuPrimitive.Group - -const ContextMenuPortal = ContextMenuPrimitive.Portal - -const ContextMenuSub = ContextMenuPrimitive.Sub - -const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup - -const ContextMenuSubTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean - } ->(({ className, inset, children, ...props }, ref) => ( - - {children} - - -)) -ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName - -const ContextMenuSubContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName - -const ContextMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - -)) -ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName - -const ContextMenuItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean - } ->(({ className, inset, ...props }, ref) => ( - -)) -ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName - -const ContextMenuCheckboxItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, checked, ...props }, ref) => ( - - - - - - - {children} - -)) -ContextMenuCheckboxItem.displayName = - ContextMenuPrimitive.CheckboxItem.displayName - -const ContextMenuRadioItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)) -ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName - -const ContextMenuLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean - } ->(({ className, inset, ...props }, ref) => ( - -)) -ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName - -const ContextMenuSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName - -const ContextMenuShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { - return ( - - ) -} -ContextMenuShortcut.displayName = "ContextMenuShortcut" - -export { - ContextMenu, - ContextMenuTrigger, - ContextMenuContent, - ContextMenuItem, - ContextMenuCheckboxItem, - ContextMenuRadioItem, - ContextMenuLabel, - ContextMenuSeparator, - ContextMenuShortcut, - ContextMenuGroup, - ContextMenuPortal, - ContextMenuSub, - ContextMenuSubContent, - ContextMenuSubTrigger, - ContextMenuRadioGroup, -} diff --git a/web/src/components/ui/dialog.tsx b/web/src/components/ui/dialog.tsx deleted file mode 100644 index 7e5727b..0000000 --- a/web/src/components/ui/dialog.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import * as React from "react" -import * as DialogPrimitive from "@radix-ui/react-dialog" -import { Cross2Icon } from "@radix-ui/react-icons" - -import { cn } from "@/lib/utils" - -const Dialog = DialogPrimitive.Root - -const DialogTrigger = DialogPrimitive.Trigger - -const DialogPortal = DialogPrimitive.Portal - -const DialogClose = DialogPrimitive.Close - -const DialogOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DialogOverlay.displayName = DialogPrimitive.Overlay.displayName - -const DialogContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - {children} - - - Close - - - -)) -DialogContent.displayName = DialogPrimitive.Content.displayName - -const DialogHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -DialogHeader.displayName = "DialogHeader" - -const DialogFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -DialogFooter.displayName = "DialogFooter" - -const DialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DialogTitle.displayName = DialogPrimitive.Title.displayName - -const DialogDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DialogDescription.displayName = DialogPrimitive.Description.displayName - -export { - Dialog, - DialogPortal, - DialogOverlay, - DialogTrigger, - DialogClose, - DialogContent, - DialogHeader, - DialogFooter, - DialogTitle, - DialogDescription, -} diff --git a/web/src/components/ui/drawer.tsx b/web/src/components/ui/drawer.tsx deleted file mode 100644 index 453304e..0000000 --- a/web/src/components/ui/drawer.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from "react" -import { Drawer as DrawerPrimitive } from "vaul" - -import { cn } from "@/lib/utils" - -const Drawer = ({ - shouldScaleBackground = true, - ...props -}: React.ComponentProps) => ( - -) -Drawer.displayName = "Drawer" - -const DrawerTrigger = DrawerPrimitive.Trigger - -const DrawerPortal = DrawerPrimitive.Portal - -const DrawerClose = DrawerPrimitive.Close - -const DrawerOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName - -const DrawerContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - -
- {children} - - -)) -DrawerContent.displayName = "DrawerContent" - -const DrawerHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -DrawerHeader.displayName = "DrawerHeader" - -const DrawerFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -DrawerFooter.displayName = "DrawerFooter" - -const DrawerTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DrawerTitle.displayName = DrawerPrimitive.Title.displayName - -const DrawerDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -DrawerDescription.displayName = DrawerPrimitive.Description.displayName - -export { - Drawer, - DrawerPortal, - DrawerOverlay, - DrawerTrigger, - DrawerClose, - DrawerContent, - DrawerHeader, - DrawerFooter, - DrawerTitle, - DrawerDescription, -} diff --git a/web/src/components/ui/form.tsx b/web/src/components/ui/form.tsx deleted file mode 100644 index e807f39..0000000 --- a/web/src/components/ui/form.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { Slot } from "@radix-ui/react-slot" -import { - Controller, - ControllerProps, - FieldPath, - FieldValues, - FormProvider, - useFormContext, -} from "react-hook-form" - -import { cn } from "@/lib/utils" -import { Label } from "@/components/ui/label" - -const Form = FormProvider - -type FormFieldContextValue< - TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath = FieldPath -> = { - name: TName -} - -const FormFieldContext = React.createContext( - {} as FormFieldContextValue -) - -const FormField = < - TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath = FieldPath ->({ - ...props -}: ControllerProps) => { - return ( - - - - ) -} - -const useFormField = () => { - const fieldContext = React.useContext(FormFieldContext) - const itemContext = React.useContext(FormItemContext) - const { getFieldState, formState } = useFormContext() - - const fieldState = getFieldState(fieldContext.name, formState) - - if (!fieldContext) { - throw new Error("useFormField should be used within ") - } - - const { id } = itemContext - - return { - id, - name: fieldContext.name, - formItemId: `${id}-form-item`, - formDescriptionId: `${id}-form-item-description`, - formMessageId: `${id}-form-item-message`, - ...fieldState, - } -} - -type FormItemContextValue = { - id: string -} - -const FormItemContext = React.createContext( - {} as FormItemContextValue -) - -const FormItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const id = React.useId() - - return ( - -
- - ) -}) -FormItem.displayName = "FormItem" - -const FormLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { - const { error, formItemId } = useFormField() - - return ( -