From d1657d7dc393ac1f8979289d5c889ae34487c5a3 Mon Sep 17 00:00:00 2001 From: Nicolas Vuillamy Date: Mon, 7 Aug 2023 16:37:22 +0200 Subject: [PATCH] Setup Release Management (#28) * Initial commit * Run unit tests in CI * Change workflow file name * Run lint and build in CI * Rename workflow file to build * Load configuration from ENV variables using dotenv * Add a note about .env file in the readme * Fix production build not loading configuration properly * Update README.md Update .env variable info * Fix jest and cypress types collision * Fix typo in readme * Dockerfile + docker-compose + Github Actions (#8) * Dockerfile init * Multistage * dev version * Copy node_modules * Working docker-compose v0 * github job perms * Docker-compose for different purposes * Deploy Beta --------- Co-authored-by: Nicolas Vuillamy * Display megalinter errors to the user * Remove unused code * Move form loader to the button * Add file upload loader * Fix file upload form transition * Fix highlight in light mode * Adding language detection for snippet code * Add back to homepage button * Add file uploader unit tests * Breakdown language-detection * Simplify use of language detection * Move reolve icon * Rename name map file * Move resolveId and test * Unit test language detection * toBeUndefined(); * Small UI fixes * Export issues to CSV * Online documentation for GitHub Pages (#17) * Doc v0 * Change npm i to npm ci * v0.1 * More doc :) * links to ML & OX * fix doc --------- Co-authored-by: Nicolas Vuillamy Co-authored-by: itayox <111698101+itayox@users.noreply.github.com> * MegaLinter setup (#18) * MegaLinter setup * Fixes * Disable pre-commit handled linters * Use Cupcake flavor * config * Fixes * cspell + semver upgrade * Config * Upgrade ML to 7.2.1 * lycheeignore * disable kics & csslint + config trivy * checkov + jscpd * Disable temporary some linters --------- Co-authored-by: Nicolas Vuillamy * Fix jscpd config (#19) Co-authored-by: Nicolas Vuillamy * HTTP server breakdown * Fix typescript error * Docs + CNAME * Previous version display * Add retry mechanism * Update debugging information * Enable re-scanning * Remove text transform * Migrate turbo-repo * Fix switching between reports * Fix button not clickable * Reset report store on init * Replace Megalinter with MegaLinter label (#24) * Replace Megalinter with MegaLinter label * Inline disable devskim false positive --------- Co-authored-by: Nicolas Vuillamy * Fix footer text * Move api routes under /api and serve index.html for all GET requests * http unit tests * Add the test file * Add static folder path to unit test * Release management * Move parseSBOM * Fix unit test * Increase resource value text limit to 600px * Images versions + README * cspell * Aply ML fixes * Quick Start * SBOM for python * SBOM for python * SBOM for python #2 * Update contributing examples with iconPngUrl * Use megalinter api beta * [MegaLinter] Apply linters fixes --------- Co-authored-by: Itay Co-authored-by: itayox <111698101+itayox@users.noreply.github.com> Co-authored-by: Nicolas Vuillamy Co-authored-by: eyalatox <96191699+eyalatox@users.noreply.github.com> Co-authored-by: Eyal Paz Co-authored-by: nvuillam --- .dockerignore | 4 + .env | 16 + .eslintrc.cjs | 14 + .github/linters/.checkov.yml | 6 + .github/linters/.cspell.json | 246 + .github/linters/.gitleaks.toml | 21 + .github/linters/.jscpd.json | 24 + .github/workflows/build-deploy-docs.yml | 31 + .github/workflows/build.yml | 38 + .github/workflows/deploy-ALPHA.yml | 79 + .github/workflows/deploy-BETA.yml | 79 + .github/workflows/deploy-RELEASE.yml | 72 + .github/workflows/mega-linter.yml | 90 + .gitignore | 35 + .lycheeignore | 30 + .mega-linter.yml | 25 + .trivyignore | 2 + CHANGELOG.md | 11 + CONTRIBUTING.md | 429 + Dockerfile | 26 + Dockerfile-release | 25 + README.md | 11 +- cypress.config.ts | 10 + cypress/e2e/01-toggle-theme.cy.ts | 21 + cypress/e2e/02-analysis.cy.ts | 17 + cypress/e2e/03-report.cy.ts | 17 + cypress/e2e/utils/submit-snippet.ts | 17 + cypress/fixtures/example.json | 5 + cypress/support/commands.ts | 37 + cypress/support/e2e.ts | 20 + docker-compose-local.yml | 103 + docker-compose-megalinter.yml | 73 + docker-compose.yml | 103 + docs/CHANGELOG.md | 1 + docs/CNAME | 1 + docs/assets/images/ox-icon.jpg | Bin 0 -> 3002 bytes docs/assets/images/screen.jpg | Bin 0 -> 93594 bytes docs/contributing.md | 1 + docs/index.md | 9 + docs/javascripts/gtag.js | 20 + docs/javascripts/quickfixes.js | 17 + docs/javascripts/tables.js | 6 + docs/license-explanations.md | 29 + docs/license.md | 5 + docs/overrides/main.html | 32 + docs/quick-start.md | 25 + docs/security-linters.md | 48 + docs/stylesheets/extra.css | 76 + jest.config.mjs | 12 + mkdocs.yml | 65 + package-lock.json | 15295 ++++++++++++++++ package.json | 59 + packages/app/.eslintrc.cjs | 15 + packages/app/index.html | 22 + packages/app/package.json | 53 + packages/app/public/favicon.png | Bin 0 -> 574 bytes packages/app/public/robots.txt | 2 + packages/app/src/analysis/AnalysisPage.tsx | 39 + .../src/analysis/actions/analysis-actions.ts | 54 + .../analysis/components/AnalysisHeader.tsx | 54 + .../analysis/components/AnalysisInputForm.tsx | 114 + .../analysis/components/AnalysisTabPanel.tsx | 27 + .../analysis/components/CodeSnippetForm.tsx | 83 + .../analysis/components/FileUploadForm.tsx | 138 + .../analysis/components/RepositoryForm.tsx | 47 + .../src/analysis/components/SubmitButton.tsx | 25 + .../app/src/analysis/stores/analysis-store.ts | 45 + packages/app/src/app/components/App.tsx | 25 + .../src/app/components/AppRouteProvider.tsx | 27 + .../src/app/components/AppThemeProvider.tsx | 81 + packages/app/src/app/components/ErrorPage.tsx | 26 + packages/app/src/app/components/Footer.tsx | 98 + .../src/app/components/ToggleThemeButton.tsx | 27 + packages/app/src/app/stores/app-store.ts | 15 + packages/app/src/app/utils/theme-utilts.ts | 36 + packages/app/src/assets/bg.svg | 25 + packages/app/src/assets/error.svg | 3 + packages/app/src/assets/ox-avatar.svg | 43 + packages/app/src/assets/ox.svg | 6 + packages/app/src/assets/success.svg | 3 + .../app/src/common/AnalysisErrorDialog.tsx | 89 + packages/app/src/common/LanguageIcon.tsx | 57 + packages/app/src/common/utils/backend-url.ts | 11 + .../src/common/utils/detect-lanauge-utils.ts | 15 + packages/app/src/config.ts | 18 + packages/app/src/index.css | 143 + packages/app/src/index.tsx | 10 + packages/app/src/report/ReportPage.tsx | 39 + .../src/report/actions/error-report-action.ts | 8 + .../src/report/actions/init-report-action.ts | 29 + .../report/actions/subscribe-report-action.ts | 39 + .../app/src/report/components/BackButton.tsx | 21 + .../app/src/report/components/Details.tsx | 137 + .../app/src/report/components/Detection.tsx | 25 + .../components/DownloadAllIssuesButton.tsx | 60 + .../app/src/report/components/IssuesTable.tsx | 87 + .../src/report/components/LinterStatus.tsx | 42 + .../app/src/report/components/LintersList.tsx | 89 + packages/app/src/report/components/Loader.tsx | 35 + .../report/components/NewAnalysisDialog.tsx | 52 + .../src/report/components/ReportDrawer.tsx | 71 + .../src/report/components/ReportHeader.tsx | 155 + .../report/components/ReportHeaderSection.tsx | 50 + .../app/src/report/components/ReportPanel.tsx | 50 + .../src/report/components/ReportTabPanel.tsx | 25 + .../app/src/report/components/ReportTabs.tsx | 102 + .../src/report/components/ReportToolbar.tsx | 41 + .../src/report/components/ResponsiveList.tsx | 13 + .../src/report/components/ResponsiveTable.tsx | 158 + .../app/src/report/components/SBOMTable.tsx | 25 + .../app/src/report/components/SarifInfo.tsx | 36 + packages/app/src/report/components/Score.tsx | 127 + .../src/report/components/SeverityBadge.tsx | 63 + packages/app/src/report/fe-report-types.ts | 21 + .../app/src/report/stores/fe-report-store.ts | 103 + packages/app/src/report/utils/score-utils.ts | 14 + packages/app/src/report/utils/ws-client.ts | 33 + packages/app/src/vite-env.d.ts | 1 + packages/app/tsconfig.json | 25 + packages/app/tsconfig.node.json | 10 + packages/app/vite.config.ts | 47 + packages/backend/.eslintrc.cjs | 7 + packages/backend/jest.config.mjs | 10 + packages/backend/package.json | 45 + .../src/actions/create-analysis-request.ts | 62 + .../backend/src/actions/create-analysis.ts | 35 + .../src/actions/subscribe-to-megalinter.ts | 23 + .../src/actions/subscribe-to-report.ts | 24 + packages/backend/src/config.ts | 27 + .../src/http/create-http-server.test.ts | 38 + .../backend/src/http/create-http-server.ts | 30 + .../http/handlers/analysis-http-handler.ts | 21 + .../handlers/http-file-upload-handler.test.ts | 20 + .../http/handlers/http-file-upload-handler.ts | 15 + .../language-detection-http-handler.ts | 20 + .../src/http/handlers/report-http-handler.ts | 16 + .../backend/src/http/register-http-routes.ts | 26 + .../backend/src/http/start-http-server.ts | 18 + packages/backend/src/index.ts | 34 + .../language-detect.test.ts | 23 + .../src/language-detection/language-detect.ts | 22 + .../language-resolve-icon.test.ts | 23 + .../language-resolve-icon.ts | 12 + .../language-resolve-id.test.ts | 19 + .../language-detection/language-resolve-id.ts | 17 + .../language-resolve-name.test.ts | 13 + .../language-resolve-name.ts | 9 + .../languages-id-to-name-map.json | 420 + .../src/language-detection/snippets-mocks.ts | 28 + .../src/megalinter/megalinter-types.ts | 129 + .../src/megalinter/mocks/file-details.json | 7 + .../src/megalinter/mocks/repo-details.json | 15 + .../src/megalinter/mocks/sbom-packages.json | 196 + .../src/megalinter/parsers/parse-details.ts | 29 + .../megalinter/parsers/parse-errors.test.ts | 47 + .../src/megalinter/parsers/parse-errors.ts | 23 + .../parsers/parse-linter-status.test.ts | 25 + .../megalinter/parsers/parse-linter-status.ts | 17 + .../parsers/parse-megalinter-complete.test.ts | 52 + .../parsers/parse-megalinter-complete.ts | 16 + .../parsers/parse-megalinter-start.test.ts | 63 + .../parsers/parse-megalinter-start.ts | 27 + .../src/megalinter/parsers/parse-sarif.ts | 249 + .../src/megalinter/parsers/parse-sbom.ts | 153 + .../backend/src/megalinter/parsers/parser.ts | 63 + packages/backend/src/sbom/licenseConfig.json | 330 + .../src/stores/be-report-store.test.ts | 14 + .../backend/src/stores/be-report-store.ts | 33 + packages/backend/src/stores/store.test.ts | 36 + packages/backend/src/stores/store.ts | 37 + .../backend/src/stores/stores-map.test.ts | 9 + packages/backend/src/stores/stores-map.ts | 11 + .../src/transport/redis-client.test.ts | 42 + .../backend/src/transport/redis-client.ts | 27 + .../backend/src/transport/ws-server.test.ts | 26 + packages/backend/src/transport/ws-server.ts | 28 + packages/backend/src/utils/logger.test.ts | 27 + packages/backend/src/utils/logger.ts | 28 + packages/backend/src/utils/retry.ts | 24 + packages/backend/tsconfig.json | 18 + packages/shared-types/.eslintrc.cjs | 7 + packages/shared-types/package.json | 22 + packages/shared-types/src/analysis-types.ts | 35 + packages/shared-types/src/index.ts | 4 + packages/shared-types/src/language-types.ts | 5 + packages/shared-types/src/report-types.ts | 87 + packages/shared-types/src/typescript-types.ts | 1 + packages/shared-types/tsconfig.json | 12 + tsconfig.json | 13 + turbo.json | 22 + 190 files changed, 23811 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 .env create mode 100644 .eslintrc.cjs create mode 100644 .github/linters/.checkov.yml create mode 100644 .github/linters/.cspell.json create mode 100644 .github/linters/.gitleaks.toml create mode 100644 .github/linters/.jscpd.json create mode 100644 .github/workflows/build-deploy-docs.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/deploy-ALPHA.yml create mode 100644 .github/workflows/deploy-BETA.yml create mode 100644 .github/workflows/deploy-RELEASE.yml create mode 100644 .github/workflows/mega-linter.yml create mode 100644 .gitignore create mode 100644 .lycheeignore create mode 100644 .mega-linter.yml create mode 100644 .trivyignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 Dockerfile-release create mode 100644 cypress.config.ts create mode 100644 cypress/e2e/01-toggle-theme.cy.ts create mode 100644 cypress/e2e/02-analysis.cy.ts create mode 100644 cypress/e2e/03-report.cy.ts create mode 100644 cypress/e2e/utils/submit-snippet.ts create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/support/commands.ts create mode 100644 cypress/support/e2e.ts create mode 100644 docker-compose-local.yml create mode 100644 docker-compose-megalinter.yml create mode 100644 docker-compose.yml create mode 100644 docs/CHANGELOG.md create mode 100644 docs/CNAME create mode 100644 docs/assets/images/ox-icon.jpg create mode 100644 docs/assets/images/screen.jpg create mode 100644 docs/contributing.md create mode 100644 docs/index.md create mode 100644 docs/javascripts/gtag.js create mode 100644 docs/javascripts/quickfixes.js create mode 100644 docs/javascripts/tables.js create mode 100644 docs/license-explanations.md create mode 100644 docs/license.md create mode 100644 docs/overrides/main.html create mode 100644 docs/quick-start.md create mode 100644 docs/security-linters.md create mode 100644 docs/stylesheets/extra.css create mode 100644 jest.config.mjs create mode 100644 mkdocs.yml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/app/.eslintrc.cjs create mode 100644 packages/app/index.html create mode 100644 packages/app/package.json create mode 100644 packages/app/public/favicon.png create mode 100644 packages/app/public/robots.txt create mode 100644 packages/app/src/analysis/AnalysisPage.tsx create mode 100644 packages/app/src/analysis/actions/analysis-actions.ts create mode 100644 packages/app/src/analysis/components/AnalysisHeader.tsx create mode 100644 packages/app/src/analysis/components/AnalysisInputForm.tsx create mode 100644 packages/app/src/analysis/components/AnalysisTabPanel.tsx create mode 100644 packages/app/src/analysis/components/CodeSnippetForm.tsx create mode 100644 packages/app/src/analysis/components/FileUploadForm.tsx create mode 100644 packages/app/src/analysis/components/RepositoryForm.tsx create mode 100644 packages/app/src/analysis/components/SubmitButton.tsx create mode 100644 packages/app/src/analysis/stores/analysis-store.ts create mode 100644 packages/app/src/app/components/App.tsx create mode 100644 packages/app/src/app/components/AppRouteProvider.tsx create mode 100644 packages/app/src/app/components/AppThemeProvider.tsx create mode 100644 packages/app/src/app/components/ErrorPage.tsx create mode 100644 packages/app/src/app/components/Footer.tsx create mode 100644 packages/app/src/app/components/ToggleThemeButton.tsx create mode 100644 packages/app/src/app/stores/app-store.ts create mode 100644 packages/app/src/app/utils/theme-utilts.ts create mode 100644 packages/app/src/assets/bg.svg create mode 100644 packages/app/src/assets/error.svg create mode 100644 packages/app/src/assets/ox-avatar.svg create mode 100644 packages/app/src/assets/ox.svg create mode 100644 packages/app/src/assets/success.svg create mode 100644 packages/app/src/common/AnalysisErrorDialog.tsx create mode 100644 packages/app/src/common/LanguageIcon.tsx create mode 100644 packages/app/src/common/utils/backend-url.ts create mode 100644 packages/app/src/common/utils/detect-lanauge-utils.ts create mode 100644 packages/app/src/config.ts create mode 100644 packages/app/src/index.css create mode 100644 packages/app/src/index.tsx create mode 100644 packages/app/src/report/ReportPage.tsx create mode 100644 packages/app/src/report/actions/error-report-action.ts create mode 100644 packages/app/src/report/actions/init-report-action.ts create mode 100644 packages/app/src/report/actions/subscribe-report-action.ts create mode 100644 packages/app/src/report/components/BackButton.tsx create mode 100644 packages/app/src/report/components/Details.tsx create mode 100644 packages/app/src/report/components/Detection.tsx create mode 100644 packages/app/src/report/components/DownloadAllIssuesButton.tsx create mode 100644 packages/app/src/report/components/IssuesTable.tsx create mode 100644 packages/app/src/report/components/LinterStatus.tsx create mode 100644 packages/app/src/report/components/LintersList.tsx create mode 100644 packages/app/src/report/components/Loader.tsx create mode 100644 packages/app/src/report/components/NewAnalysisDialog.tsx create mode 100644 packages/app/src/report/components/ReportDrawer.tsx create mode 100644 packages/app/src/report/components/ReportHeader.tsx create mode 100644 packages/app/src/report/components/ReportHeaderSection.tsx create mode 100644 packages/app/src/report/components/ReportPanel.tsx create mode 100644 packages/app/src/report/components/ReportTabPanel.tsx create mode 100644 packages/app/src/report/components/ReportTabs.tsx create mode 100644 packages/app/src/report/components/ReportToolbar.tsx create mode 100644 packages/app/src/report/components/ResponsiveList.tsx create mode 100644 packages/app/src/report/components/ResponsiveTable.tsx create mode 100644 packages/app/src/report/components/SBOMTable.tsx create mode 100644 packages/app/src/report/components/SarifInfo.tsx create mode 100644 packages/app/src/report/components/Score.tsx create mode 100644 packages/app/src/report/components/SeverityBadge.tsx create mode 100644 packages/app/src/report/fe-report-types.ts create mode 100644 packages/app/src/report/stores/fe-report-store.ts create mode 100644 packages/app/src/report/utils/score-utils.ts create mode 100644 packages/app/src/report/utils/ws-client.ts create mode 100644 packages/app/src/vite-env.d.ts create mode 100644 packages/app/tsconfig.json create mode 100644 packages/app/tsconfig.node.json create mode 100644 packages/app/vite.config.ts create mode 100644 packages/backend/.eslintrc.cjs create mode 100644 packages/backend/jest.config.mjs create mode 100644 packages/backend/package.json create mode 100644 packages/backend/src/actions/create-analysis-request.ts create mode 100644 packages/backend/src/actions/create-analysis.ts create mode 100644 packages/backend/src/actions/subscribe-to-megalinter.ts create mode 100644 packages/backend/src/actions/subscribe-to-report.ts create mode 100644 packages/backend/src/config.ts create mode 100644 packages/backend/src/http/create-http-server.test.ts create mode 100644 packages/backend/src/http/create-http-server.ts create mode 100644 packages/backend/src/http/handlers/analysis-http-handler.ts create mode 100644 packages/backend/src/http/handlers/http-file-upload-handler.test.ts create mode 100644 packages/backend/src/http/handlers/http-file-upload-handler.ts create mode 100644 packages/backend/src/http/handlers/language-detection-http-handler.ts create mode 100644 packages/backend/src/http/handlers/report-http-handler.ts create mode 100644 packages/backend/src/http/register-http-routes.ts create mode 100644 packages/backend/src/http/start-http-server.ts create mode 100644 packages/backend/src/index.ts create mode 100644 packages/backend/src/language-detection/language-detect.test.ts create mode 100644 packages/backend/src/language-detection/language-detect.ts create mode 100644 packages/backend/src/language-detection/language-resolve-icon.test.ts create mode 100644 packages/backend/src/language-detection/language-resolve-icon.ts create mode 100644 packages/backend/src/language-detection/language-resolve-id.test.ts create mode 100644 packages/backend/src/language-detection/language-resolve-id.ts create mode 100644 packages/backend/src/language-detection/language-resolve-name.test.ts create mode 100644 packages/backend/src/language-detection/language-resolve-name.ts create mode 100644 packages/backend/src/language-detection/languages-id-to-name-map.json create mode 100644 packages/backend/src/language-detection/snippets-mocks.ts create mode 100644 packages/backend/src/megalinter/megalinter-types.ts create mode 100644 packages/backend/src/megalinter/mocks/file-details.json create mode 100644 packages/backend/src/megalinter/mocks/repo-details.json create mode 100644 packages/backend/src/megalinter/mocks/sbom-packages.json create mode 100644 packages/backend/src/megalinter/parsers/parse-details.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-errors.test.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-errors.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-linter-status.test.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-linter-status.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-megalinter-complete.test.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-megalinter-complete.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-megalinter-start.test.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-megalinter-start.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-sarif.ts create mode 100644 packages/backend/src/megalinter/parsers/parse-sbom.ts create mode 100644 packages/backend/src/megalinter/parsers/parser.ts create mode 100644 packages/backend/src/sbom/licenseConfig.json create mode 100644 packages/backend/src/stores/be-report-store.test.ts create mode 100644 packages/backend/src/stores/be-report-store.ts create mode 100644 packages/backend/src/stores/store.test.ts create mode 100644 packages/backend/src/stores/store.ts create mode 100644 packages/backend/src/stores/stores-map.test.ts create mode 100644 packages/backend/src/stores/stores-map.ts create mode 100644 packages/backend/src/transport/redis-client.test.ts create mode 100644 packages/backend/src/transport/redis-client.ts create mode 100644 packages/backend/src/transport/ws-server.test.ts create mode 100644 packages/backend/src/transport/ws-server.ts create mode 100644 packages/backend/src/utils/logger.test.ts create mode 100644 packages/backend/src/utils/logger.ts create mode 100644 packages/backend/src/utils/retry.ts create mode 100644 packages/backend/tsconfig.json create mode 100644 packages/shared-types/.eslintrc.cjs create mode 100644 packages/shared-types/package.json create mode 100644 packages/shared-types/src/analysis-types.ts create mode 100644 packages/shared-types/src/index.ts create mode 100644 packages/shared-types/src/language-types.ts create mode 100644 packages/shared-types/src/report-types.ts create mode 100644 packages/shared-types/src/typescript-types.ts create mode 100644 packages/shared-types/tsconfig.json create mode 100644 tsconfig.json create mode 100644 turbo.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1aace6d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.github +docs +redis +server-files \ No newline at end of file diff --git a/.env b/.env new file mode 100644 index 0000000..01a55fb --- /dev/null +++ b/.env @@ -0,0 +1,16 @@ +# MEGALINTER +MEGALINTER_ANALYSIS_URL=http://127.0.0.1:8000/analysis +MEGALINTER_UPLOAD_URL=http://127.0.0.1:8000/upload-file +MEGALINTER_REDIS_URL=redis://127.0.0.1:6379 +MEGALINTER_REDIS_CHANNEL=megalinter:pubsub: + +# BACKEND +CODETOTAL_HTTP_PORT=8081 +CODETOTAL_HTTP_HOST=127.0.0.1 +CODETOTAL_WS_PORT=8080 +CODETOTAL_WS_HOST=127.0.0.1 +DEBUG_MODULES=actions,megalinter,stores,transport + +# FRONTEND +CODETOTAL_UPLOAD_FILE_LIMIT_BYTES=10000000 + \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..4020bcb --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/.github/linters/.checkov.yml b/.github/linters/.checkov.yml new file mode 100644 index 0000000..fa5fb0e --- /dev/null +++ b/.github/linters/.checkov.yml @@ -0,0 +1,6 @@ +# You can see all available properties here: https://github.com/bridgecrewio/checkov#configuration-using-a-config-file +quiet: true +skip-check: + - CKV_DOCKER_2 + - CKV_DOCKER_3 + - CKV2_GHA_1 diff --git a/.github/linters/.cspell.json b/.github/linters/.cspell.json new file mode 100644 index 0000000..1c4d950 --- /dev/null +++ b/.github/linters/.cspell.json @@ -0,0 +1,246 @@ +{ + "ignorePaths": [ + "**/node_modules/**", + "**/vscode-extension/**", + "**/.git/**", + "**/.pnpm-lock.json", + ".vscode", + "megalinter", + "package-lock.json", + "report" + ], + "language": "en", + "noConfigSearch": true, + "version": "0.2", + "words": [ + "ABAP", + "ABNF", + "Bisoni", + "Brainfuck", + "Buildx", + "CODETOTAL", + "Cpcdos", + "Crmsh", + "Cypher", + "DEVSKIM", + "DJLINT", + "DUSTILOCK", + "Dafny", + "EBNF", + "Eyal", + "Flix", + "GITLEAKS", + "GSQL", + "Golo", + "HTMLHINT", + "Haml", + "Haxe", + "IRPF", + "Itay", + "Jolie", + "KICS", + "LDIF", + "Laravel", + "MLIR", + "Mathematica", + "Mojolicious", + "Moonscript", + "Motoko", + "NSIS", + "Oxygene", + "Proto", + "ROOTPATH", + "Rebol", + "Roboconf", + "SARIF", + "SEMGREP", + "SHELLCHECK", + "SHFMT", + "SYFT", + "Sarif", + "Satoshi", + "Scilab", + "Smali", + "Stata", + "TRIVY", + "TRUFFLEHOG", + "Toit", + "Trivy", + "VHDL", + "Vala", + "Verilog", + "Vuillamy", + "Zephir", + "abap", + "abnf", + "accesslog", + "actionscript", + "adoc", + "afpmcmb", + "angelscript", + "apacheconf", + "applescript", + "armasm", + "aspectj", + "autofix", + "autohotkey", + "autoit", + "avrasm", + "axapta", + "bbcode", + "bgcolor", + "brainfuck", + "buildx", + "bvyv", + "capnp", + "capnproto", + "cbdd", + "cffi", + "chpl", + "cmdline", + "codetotal", + "colorama", + "countup", + "craftcms", + "crmsh", + "cypher", + "dafny", + "dateutil", + "devicon", + "devskim", + "dsconfig", + "dustilock", + "ebnf", + "extrahead", + "filesize", + "flix", + "fontawesome", + "gcode", + "gdscript", + "gitleaks", + "glightbox", + "glsl", + "golo", + "gololang", + "grype", + "gsql", + "gtag", + "hadolint", + "haml", + "haxe", + "hlsl", + "htmlbars", + "hylang", + "iecst", + "irpf", + "itsdangerous", + "javascripts", + "jolie", + "kaos", + "kics", + "kubeconform", + "kubescape", + "languagedetection", + "lassoscript", + "ldif", + "livecodeserver", + "livescript", + "lookml", + "lycheeignore", + "markupsafe", + "materialx", + "mathematica", + "mawk", + "megalinter", + "mipsasm", + "mirc", + "mkdocs", + "mkdown", + "mlir", + "mojolicious", + "moonscript", + "motoko", + "nawk", + "nginxconf", + "njsproj", + "nodenext", + "nsis", + "ntvs", + "numpy", + "nvuillam", + "objc", + "opencontainers", + "openscad", + "osascript", + "oxsecurity", + "oxygene", + "paramiko", + "pcmk", + "pgsql", + "pinescript", + "podspec", + "postbuild", + "precodetotal", + "prestart", + "proto", + "protobuf", + "pycon", + "pycparser", + "pymdown", + "pymdownx", + "pynacl", + "pytz", + "pyyaml", + "qsharp", + "quickfixes", + "rapidfuzz", + "reasonml", + "rebol", + "redbol", + "riscript", + "ruleslanguage", + "sarif", + "scilab", + "sdfsdfsdf", + "semgrep", + "shellcheck", + "shexc", + "shfmt", + "smali", + "specfile", + "ssdeep", + "stanfuncs", + "stata", + "stefanzweifel", + "styl", + "stylelint", + "syft", + "terragrunt", + "terrascan", + "tflint", + "toit", + "trivy", + "trivyignore", + "trufflehog", + "tsbuildinfo", + "tsql", + "twemoji", + "typia", + "tzdata", + "uvicorn", + "vala", + "vbnet", + "vbscript", + "venv", + "verilog", + "vhdl", + "vuln", + "werkzeug", + "xquery", + "xsharp", + "xtlang", + "zenscript", + "zephir", + "zustand" + ] +} diff --git a/.github/linters/.gitleaks.toml b/.github/linters/.gitleaks.toml new file mode 100644 index 0000000..98d8e20 --- /dev/null +++ b/.github/linters/.gitleaks.toml @@ -0,0 +1,21 @@ + +title = "gitleaks config" + +[extend] +# useDefault will extend the base configuration with the default gitleaks config: +# https://github.com/zricethezav/gitleaks/blob/master/config/gitleaks.toml +useDefault = true + +[allowlist] + description = "Allowlisted files" + paths = [ + '''.automation/test''', + '''megalinter-reports''', + '''.github/linters''', + '''node_modules''', + '''.mypy_cache''', + '''(.*?)gitleaks\.toml$''', + '''(snippets-mocks.ts|language-resolve-id.test.ts|language-detector.ts|submit-snippet.ts)$''', + '''(.*?)(png|jpg|gif|doc|docx|pdf|bin|xls|pyc|zip)$''', + '''(go.mod|go.sum)$'''] + diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json new file mode 100644 index 0000000..c7b68e7 --- /dev/null +++ b/.github/linters/.jscpd.json @@ -0,0 +1,24 @@ +{ + "threshold": 0, + "reporters": ["html", "markdown"], + "ignore": [ + "**/node_modules/**", + "**/.git/**", + "**/.rbenv/**", + "**/.venv/**", + "**/*cache*/**", + "**/.automation/**", + "**/.github/**", + "**/.idea/**", + "**/docs/**", + "**/*.yml", + "**/CHANGELOG.md", + "**/licenses/*.md", + "**/docker-compose-megalinter.yml", + "**/docker-compose-local.yml", + "**/docker-compose.yml", + "**/AppThemeProvider.tsx", + "**/parse-linter-status.test.ts", + "**/parse-megalinter-complete.test.ts" + ] +} diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml new file mode 100644 index 0000000..f5a1e48 --- /dev/null +++ b/.github/workflows/build-deploy-docs.yml @@ -0,0 +1,31 @@ +name: "DOC - Build and deploy - main" +on: + push: + branches: + - main + - docs + paths: + - "docs/**" + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + contents: write + if: github.repository == 'oxsecurity/codetotal' + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-python@v4.5.0 + with: + python-version: 3.10.4 + - run: pip install --upgrade markdown==3.3.7 mkdocs-material pymdown-extensions==9.11 mkdocs-glightbox==0.3.2 mdx_truly_sane_lists + - run: | + git config --global user.name megalinter-bot + git config --global user.email nicolas.vuillamy@ox.security + - run: mkdocs gh-deploy --force diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7ede6cf --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,38 @@ +name: Build + +# Controls when the workflow will run +on: + push: + branches: ["**"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version: "18" + + # Runs a single command using the runners shell + - name: Install deps + run: npm ci + + - name: Lint + run: npm run lint + + - name: Unit test + run: npm run test + + - name: Build + run: npm run build diff --git a/.github/workflows/deploy-ALPHA.yml b/.github/workflows/deploy-ALPHA.yml new file mode 100644 index 0000000..373a301 --- /dev/null +++ b/.github/workflows/deploy-ALPHA.yml @@ -0,0 +1,79 @@ +--- +######################### +######################### +## Deploy Docker Image ## +######################### +######################### + +# +# Documentation: +# https://help.github.com/en/articles/workflow-syntax-for-github-actions +# + +####################################### +# Start the job on all push to main # +####################################### +name: "Build & Push - ALPHA" +on: + push: + branches: + - alpha + +############### +# Set the Job # +############### +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: Build & Push Docker Image - ALPHA + runs-on: ubuntu-latest + permissions: write-all + # Only run this on the main repo + if: github.repository == 'oxsecurity/codetotal' && !contains(github.event.head_commit.message, 'skip deploy') + steps: + ########################## + # Checkout the code base # + ########################## + - name: Checkout Code + uses: actions/checkout@v3 + + ################################################# + # Build & publish docker codetotal server image # + ################################################# + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get current date + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_ENV} + + - name: Build & Push CodeTotal Docker Image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + platforms: linux/amd64 + build-args: | + BUILD_DATE=${{ env.BUILD_DATE }} + BUILD_REVISION=${{ github.sha }} + BUILD_VERSION=alpha + load: false + push: true + secrets: | + GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} + tags: | + ghcr.io/oxsecurity/codetotal-server:alpha + # ghcr.io/oxsecurity/megalinter-server:alpha-${{ github.sha }} diff --git a/.github/workflows/deploy-BETA.yml b/.github/workflows/deploy-BETA.yml new file mode 100644 index 0000000..4a74be1 --- /dev/null +++ b/.github/workflows/deploy-BETA.yml @@ -0,0 +1,79 @@ +--- +######################### +######################### +## Deploy Docker Image ## +######################### +######################### + +# +# Documentation: +# https://help.github.com/en/articles/workflow-syntax-for-github-actions +# + +####################################### +# Start the job on all push to main # +####################################### +name: "Build & Push - Beta" +on: + push: + branches: + - main + +############### +# Set the Job # +############### +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: Build & Push Docker Image - Beta + runs-on: ubuntu-latest + permissions: write-all + # Only run this on the main repo + if: github.repository == 'oxsecurity/codetotal' && !contains(github.event.head_commit.message, 'skip deploy') + steps: + ########################## + # Checkout the code base # + ########################## + - name: Checkout Code + uses: actions/checkout@v3 + + ################################################# + # Build & publish docker codetotal server image # + ################################################# + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get current date + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_ENV} + + - name: Build & Push CodeTotal Docker Image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + platforms: linux/amd64 + build-args: | + BUILD_DATE=${{ env.BUILD_DATE }} + BUILD_REVISION=${{ github.sha }} + BUILD_VERSION=beta + load: false + push: true + secrets: | + GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} + tags: | + ghcr.io/oxsecurity/codetotal-server:beta + # ghcr.io/oxsecurity/megalinter-server:alpha-${{ github.sha }} diff --git a/.github/workflows/deploy-RELEASE.yml b/.github/workflows/deploy-RELEASE.yml new file mode 100644 index 0000000..fb1c295 --- /dev/null +++ b/.github/workflows/deploy-RELEASE.yml @@ -0,0 +1,72 @@ +--- +name: "Build & Push - RELEASE" +on: + release: + # Want to run the automation when a release is created + types: ["created"] + +############### +# Set the Job # +############### +jobs: + build: + # Name the Job + name: Build & Deploy Docker Image - RELEASE + # Set the agent to run on + runs-on: ubuntu-latest + # Only run on main repo + if: github.repository == 'oxsecurity/codetotal' && !contains(github.event.head_commit.message, 'skip deploy') + permissions: + packages: write + environment: + name: release + ################## + # Load all steps # + ################## + steps: + ########################## + # Checkout the code base # + ########################## + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # - name: Login to Docker Hub + # uses: docker/login-action@v2 + # with: + # username: ${{ secrets.DOCKER_USERNAME }} + # password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get current date + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_ENV} + + - name: Build Image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile-release + platforms: linux/amd64 + build-args: | + CODETOTAL_BASE_IMAGE=ghcr.io/oxsecurity/codetotal-server:beta + BUILD_DATE=${{ env.BUILD_DATE }} + BUILD_REVISION=${{ github.sha }} + BUILD_VERSION=${{ github.event.release.tag_name }} + load: false + push: true + secrets: | + GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} + tags: | + ghcr.io/oxsecurity/codetotal-server:latest + ghcr.io/oxsecurity/codetotal-server:${{ github.event.release.tag_name }} diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml new file mode 100644 index 0000000..afc5113 --- /dev/null +++ b/.github/workflows/mega-linter.yml @@ -0,0 +1,90 @@ +--- +# MegaLinter GitHub Action configuration file +# More info at https://megalinter.io +name: MegaLinter + +on: + # Trigger mega-linter at every push. Action will also be visible from Pull Requests to master + push: # Comment this line to trigger action only on pull-requests (not recommended if you don't pay for GH Actions) + pull_request: + branches: [master, main] + +env: # Comment env block if you do not want to apply fixes + # Apply linter fixes configuration + APPLY_FIXES: all # When active, APPLY_FIXES must also be defined as environment variable (in github/workflows/mega-linter.yml or other CI tool) + APPLY_FIXES_EVENT: pull_request # Decide which event triggers application of fixes in a commit or a PR (pull_request, push, all) + APPLY_FIXES_MODE: commit # If APPLY_FIXES is used, defines if the fixes are directly committed (commit) or posted in a PR (pull_request) + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: MegaLinter + runs-on: ubuntu-latest + permissions: + # Give the default GITHUB_TOKEN write permission to commit and push, comment issues & post new PR + # Remove the ones you do not need + contents: write + issues: write + pull-requests: write + steps: + # Git Checkout + - name: Checkout Code + uses: actions/checkout@v3 + with: + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} + fetch-depth: 0 # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to improve performances + + # MegaLinter + - name: MegaLinter + id: ml + # You can override MegaLinter flavor used to have faster performances + # More info at https://megalinter.io/flavors/ + uses: oxsecurity/megalinter/flavors/cupcake@v7.2.1 + env: + # All available variables are described in documentation + # https://megalinter.io/configuration/ + VALIDATE_ALL_CODEBASE: true # Set ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} to validate only diff with main branch + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # ADD YOUR CUSTOM ENV VARIABLES HERE TO OVERRIDE VALUES OF .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY + + # Upload MegaLinter artifacts + - name: Archive production artifacts + if: ${{ success() }} || ${{ failure() }} + uses: actions/upload-artifact@v3 + with: + name: MegaLinter reports + path: | + megalinter-reports + mega-linter.log + + # Create pull request if applicable (for now works only on PR from same repository, not from forks) + - name: Create Pull Request with applied fixes + id: cpr + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix') + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} + commit-message: "[MegaLinter] Apply linters automatic fixes" + title: "[MegaLinter] Apply linters automatic fixes" + labels: bot + - name: Create PR output + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix') + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" + + # Push new commit if applicable (for now works only on PR from same repository, not from forks) + - name: Prepare commit + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix') + run: sudo chown -Rc $UID .git/ + - name: Commit and push applied linter fixes + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix') + uses: stefanzweifel/git-auto-commit-action@v4 + with: + branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} + commit_message: "[MegaLinter] Apply linters fixes" + commit_user_name: megalinter-bot + commit_user_email: nicolas.vuillamy@ox.security diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8ebc8a --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +local +coverage +redis/dump.rdb + +server-files/ +*.tsbuildinfo +/redis/ +dump.rdb +megalinter-reports/ +1.json diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 0000000..61a7dcc --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,30 @@ +# These links are ignored by lychee link checker: https://github.com/lycheeverse/lychee +# The file allows you to list multiple regular expressions for exclusion (one pattern per line). +# The `.lycheeignore` file is only used for excluding URLs, not paths. Use the `exclude_path` key in the `lychee.toml` file. ref: https://github.com/lycheeverse/lycheeverse.github.io/blob/master/recipes/excluding-paths.md + +my-company.com +https://megalinter.io/ +https://megalinter.io/flavors/ +https://megalinter.io/configuration/ +https://www.linkedin.com/ +https://twitter.com +https://twitter.com/intent/tweet +https://fonts.gstatic.com +https://img.shields.io +http://mozilla.org/MPL/2.0/ +https://github.com/sider/goodcheck +https://api.github.com/repos/powershell/powershell/releases +https://storage.googleapis.com/dart-archive/channels/stable/release +https://stylelint.io/user-guide/integrations/other#analysis-platform-engines +https://raw.githubusercontent.com/some_org/some_repo/mega-linter-rules +https://raw.githubusercontent.com/cookiejar/megalinter-plugin-cookiejar/main/cookietemplate.mega-linter-descriptor.yml +https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/security.ico +https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/swift.ico +https://stylelint.io/user-guide/integrations/other#analysis-platform-engines +https://github.com/pmd/pmd/releases/download/pmd_releases +https://twitter.com/intent/tweet* +http://localhost* + +# temporary until repo is public +https://github.com/oxsecurity/codetotal* +https://codetotal.io/ \ No newline at end of file diff --git a/.mega-linter.yml b/.mega-linter.yml new file mode 100644 index 0000000..613de38 --- /dev/null +++ b/.mega-linter.yml @@ -0,0 +1,25 @@ +# Configuration file for MegaLinter +# See all available variables at https://megalinter.io/configuration/ and in linters documentation + +APPLY_FIXES: all # all, none, or list of linter keys +# ENABLE: # If you use ENABLE variable, all other languages/formats/tooling-formats will be disabled by default +# ENABLE_LINTERS: # If you use ENABLE_LINTERS variable, all other linters will be disabled by default +# DISABLE: +# - COPYPASTE # Uncomment to disable checks of excessive copy-pastes +# - SPELL # Uncomment to disable checks of spelling mistakes +SHOW_ELAPSED_TIME: true +FILEIO_REPORTER: false +# DISABLE_ERRORS: true # Uncomment if you want MegaLinter to detect errors but not block CI to pass +DISABLE: + - JAVASCRIPT # Handled by pre-commit + - JSX # Handled by pre-commit + - TYPESCRIPT # Handled by pre-commit + - TSX # Handled by pre-commit +DISABLE_LINTERS: + - MARKDOWN_MARKDOWN_LINK_CHECK +DISABLE_ERRORS_LINTERS: + - ACTION_ACTIONLINT + - REPOSITORY_KICS + - CSS_STYLELINT +HTML_HTMLHINT_FILTER_REGEX_EXCLUDE: (main\.html) +HTML_DJLINT_FILTER_REGEX_EXCLUDE: (packages\/app\/index\.html) diff --git a/.trivyignore b/.trivyignore new file mode 100644 index 0000000..d1c6f2d --- /dev/null +++ b/.trivyignore @@ -0,0 +1,2 @@ +DS002 +DS026 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4068c6f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] (beta, main branch content) + +## [v1.0.0] - 2023-08-04 + +- Initial version \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9dc1c6b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,429 @@ +- [Development Mode](#development-mode) +- [Available Scripts](#available-scripts) +- [Config](#config) +- [Building For Production](#building-for-production) +- [Debugging in VSCode](#debugging-in-vscode) +- [Messages from MegaLinter server](#messages-from-megalinter-server) + - [Start MegaLinter analysis](#start-megalinter-analysis) + - [Start Linter analysis](#start-linter-analysis) + - [Complete Linter analysis](#complete-linter-analysis) + - [Complete MegaLinter analysis](#complete-megalinter-analysis) + - [MegaLinter server error](#megalinter-server-error) + +## Development Mode + +- Clone this repo +- Run `npm i` to install dependencies +- Start megalinter server `npm run start:megalinter` +- Run `npm start` +- Open [`codetotal app`](http://localhost:3000) + +## Available Scripts + +- `npm start` start all projects in development mode +- `npm run lint` lint all projects +- `npm run build:be` build the backend (used by `launch.json` file for debugging) +- `npm run start:fe` start the FE in development mode +- `npm test` run all unit tests + +## Config + +Add a `.env` file in the root of the project. +Only variables starting with the `CODETOTAL_` prefix will be injected into the frontend bundle. + +```ini +# MEGALINTER +MEGALINTER_ANALYSIS_URL=http://127.0.0.1:8000/analysis +MEGALINTER_UPLOAD_URL=http://127.0.0.1:8000/upload-file +MEGALINTER_REDIS_URL=redis://127.0.0.1:6379 +MEGALINTER_REDIS_CHANNEL=megalinter:pubsub: + +# BACKEND +CODETOTAL_HTTP_PORT=8081 +CODETOTAL_HTTP_HOST=127.0.0.1 +CODETOTAL_WS_PORT=8080 +CODETOTAL_WS_HOST=127.0.0.1 +DEBUG_MODULES=actions,megalinter,stores,transport + +# FRONTEND +CODETOTAL_UPLOAD_FILE_LIMIT_BYTES=10000000 +``` + +## Building For Production + +- Config files must be set before the build (see `Config` section) +- Run `npm run build` at the root folder +- This will create a `dist` folder with the backend code +- The frontend code will be under `dist/public` +- Run using `npm run production` (equivalent to `node dist/index.js`) + +## Debugging in VSCode + +Add a `launch.json` file under the `.vscode` folder with the following content: + +```typescript +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Build Project", + "program": "${workspaceFolder}/packages/backend/dist/index.js", + "envFile": "${workspaceFolder}/.env", + "preLaunchTask": "npm: build:be", + "sourceMaps": true, + "smartStep": true, + "internalConsoleOptions": "openOnSessionStart", + "outFiles": ["${workspaceFolder}/packages/backend/dist/**/*.js"] + } + ] +} +``` + +## Messages from MegaLinter server + +Event-based management of MegaLinter Server can send the following list of messages into Redis PUBSUB channel built the following way: **megalinter:pubsub:REQUEST_ID** + +Example: `megalinter:pubsub:RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004` + +### Start MegaLinter analysis + +This message is sent once by analysis, when a **MegaLinter instance has identified the linters to run** and is about to start them. + +Example of **megalinterStart** messageType: + +```json +{ + "messageType": "megalinterStart", + "megaLinterStatus": "created", + "linters": [ + { + "descriptorId": "BASH", + "linterId": "bash-exec", + "linterKey": "BASH_EXEC", + "linterVersion": "5.2.15", + "linterCliLintMode": "file", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/bash_bash_exec", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/bash-exec.png", + "isFormatter": false, + "isSBOM": false, + "filesNumber": 1 + }, + { + "descriptorId": "BASH", + "linterId": "shellcheck", + "linterKey": "BASH_SHELLCHECK", + "linterVersion": "0.9.0", + "linterCliLintMode": "list_of_files", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/bash_shellcheck", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/shellcheck.png", + "isFormatter": false, + "isSBOM": false, + "filesNumber": 1 + }, + { + "descriptorId": "BASH", + "linterId": "shfmt", + "linterKey": "BASH_SHFMT", + "linterVersion": "ERROR", + "linterCliLintMode": "list_of_files", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/bash_shfmt", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/shfmt.png", + "isFormatter": true, + "isSBOM": false, + "filesNumber": 1 + }, + { + "descriptorId": "COPYPASTE", + "linterId": "jscpd", + "linterKey": "COPYPASTE_JSCPD", + "linterVersion": "ERROR", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/copypaste_jscpd", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "checkov", + "linterKey": "REPOSITORY_CHECKOV", + "linterVersion": "3.11", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_checkov", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/checkov.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "devskim", + "linterKey": "REPOSITORY_DEVSKIM", + "linterVersion": "1.0.11", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_devskim", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/devskim.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "dustilock", + "linterKey": "REPOSITORY_DUSTILOCK", + "linterVersion": "1.2.0", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_dustilock", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/dustilock.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "git_diff", + "linterKey": "REPOSITORY_GIT_DIFF", + "linterVersion": "2.38.5", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_git_diff", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "gitleaks", + "linterKey": "REPOSITORY_GITLEAKS", + "linterVersion": "8.17.0", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_gitleaks", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/gitleaks.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "kics", + "linterKey": "REPOSITORY_KICS", + "linterVersion": "1.7.3", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_kics", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/kics.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "secretlint", + "linterKey": "REPOSITORY_SECRETLINT", + "linterVersion": "7.0.3", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_secretlint", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/secretlint.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "semgrep", + "linterKey": "REPOSITORY_SEMGREP", + "linterVersion": "1.31.2", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_semgrep", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/semgrep.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "REPOSITORY", + "linterId": "trivy", + "linterKey": "REPOSITORY_TRIVY", + "linterVersion": "0.43.1", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_trivy", + "iconPngUrl": "https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/icons/linters/trivy.png", + "isFormatter": false, + "isSBOM": false + }, + { + "descriptorId": "SPELL", + "linterId": "cspell", + "linterKey": "SPELL_CSPELL", + "linterVersion": "ERROR", + "linterCliLintMode": "list_of_files", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/spell_cspell", + "isFormatter": false, + "filesNumber": 1, + "isSBOM": false + } + ], + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004" +} +``` + +### Start Linter analysis + +This message is sent once by linter run, it indicates that **a single linter has started running**. + +Example of **linterStart** messageType with `linterCliLintMode=project`: + +```json +{ + "messageType": "linterStart", + "linterStatus": "started", + "descriptorId": "REPOSITORY", + "linterId": "trivy", + "linterKey": "REPOSITORY_TRIVY", + "linterVersion": "0.43.1", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_trivy", + "isFormatter": false, + "isSBOM": false +} +``` + +Example of **linterStart** messageType with `linterCliLintMode=list_of_files` (with **filesNumber** additional property): + +```json +{ + "messageType": "linterStart", + "linterStatus": "started", + "descriptorId": "BASH", + "linterId": "shellcheck", + "linterKey": "BASH_SHELLCHECK", + "linterVersion": "0.9.0", + "linterCliLintMode": "list_of_files", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/bash_shellcheck", + "isFormatter": false, + "isSBOM": false, + "filesNumber": 1 +} +``` + +### Complete Linter analysis + +This message is sent once by linter run, it indicates that **a single linter has been completed**. + +If SARIF is available, it will be located in `outputSarif` property, otherwise results can be found in `outputText` and or `outputJson`. + +Example of **linterComplete** messageType: + +```json +{ + "messageType": "linterComplete", + "linterStatus": "success", + "linterErrorNumber": 0, + "linterStatusMessage": "No errors were found in the linting process", + "linterElapsedTime": 11.16, + "linterCliCommand": [ + "trivy", + "fs", + "--scanners", + "vuln,config", + "--exit-code", + "1", + "--format", + "sarif", + "-o", + "/tmp/ct-megalinter-xmv82bvyv/megalinter-reports/sarif/REPOSITORY_TRIVY.sarif", + "." + ], + "descriptorId": "REPOSITORY", + "linterId": "trivy", + "linterKey": "REPOSITORY_TRIVY", + "linterVersion": "0.43.1", + "linterCliLintMode": "project", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004", + "docUrl": "https://megalinter.io/alpha/descriptors/repository_trivy", + "isFormatter": false, + "isSBOM": false, + "outputSarif": { + "$schema": "https://json.schemastore.org/sarif-2.1.0.json", + "runs": [ + { + "columnKind": "utf16CodeUnits", + "originalUriBaseIds": { + "ROOTPATH": { + "uri": "file:///" + } + }, + "properties": { + "megalinter": { + "docUrl": "https://megalinter.io/alpha/descriptors/repository_trivy", + "linterKey": "REPOSITORY_TRIVY", + "linterVersion": "0.43.1" + } + }, + "results": [], + "tool": { + "driver": { + "fullName": "Trivy Vulnerability Scanner", + "informationUri": "https://github.com/aquasecurity/trivy", + "name": "Trivy (MegaLinter REPOSITORY_TRIVY)", + "rules": [], + "version": "0.43.1" + } + } + } + ], + "version": "2.1.0" + } +} +``` + +### Complete MegaLinter analysis + +This message is sent once by analysis, when a **MegaLinter analysis is completed**. + +CodeTotal stops listening to the requestId pubsub channel once this message is received, as no new message will be sent through this channel. + +Example of **megalinterComplete** messageType: + +```json +{ + "messageType": "megalinterComplete", + "megaLinterStatus": "completed", + "requestId": "RQ_cbdd1d82-1e7b-11ee-9258-0242ac120004" +} +``` + +### MegaLinter server error + +In some cases, it is not possible for MegaLinter to start an analysis because there has been an error during initialization. + +In that case, CodeTotal stops listening to the pubsub channel, as no more messages will be sent. + +List of errors: + +- `missingAnalysisType`: Missing type (snippet, file or repository) +- `gitCloneError`: Unable to clone the repository (probably not existing or not reachable) +- `uploadedFileNotFound`: Unable to find file(s) that were supposed to be uploaded by a previous HTTP call to `/upload-file` +- `snippetGuessError`: Unable to automatically detect the language of a code snippet +- `snippetBuildError`: Unable to find a file extension for the guessed snipper language + +Example of **serverError** messageType + +```json +{ + "messageType": "serverError", + "message": "Unable to clone repository\nCmd('git') failed due to: exit code(128)\n cmdline: git clone -v -- https://github.com/nvuillam/node-sarif-builder2 /tmp/ct-megalinter-x0afpmcmb\n stderr: 'Cloning into '/tmp/ct-megalinter-x0afpmcmb'...\nfatal: could not read Username for 'https://github.com': No such device or address\n'", + "errorCode": "gitCloneError", + "errorDetails": { + "error": "Cmd('git') failed due to: exit code(128)\n cmdline: git clone -v -- https://github.com/nvuillam/node-sarif-builder2 /tmp/ct-megalinter-x0afpmcmb\n stderr: 'Cloning into '/tmp/ct-megalinter-x0afpmcmb'...\nfatal: could not read Username for 'https://github.com': No such device or address\n'" + }, + "requestId": "RQ_e630c962-1e7c-11ee-9258-0242ac120004" +} +``` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dbde212 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# Builder +FROM node:18-alpine3.18 AS builder +WORKDIR /app +COPY . . +RUN npm install && npm run build + +# Final image +FROM node:18-alpine3.18 +ARG BUILD_DATE=dev +ARG BUILD_REVISION=dev +ARG BUILD_VERSION=dev +ENV NODE_ENV=production +WORKDIR /app +COPY --from=builder /app . +EXPOSE 3000 +CMD ["node", "dist/index.js"] +LABEL maintainer="Nicolas Vuillamy " \ + org.opencontainers.image.created=$BUILD_DATE \ + org.opencontainers.image.revision=$BUILD_REVISION \ + org.opencontainers.image.version=$BUILD_VERSION \ + org.opencontainers.image.authors="Nicolas Vuillamy , Eyal Paz , Itay Bisoni " \ + org.opencontainers.image.url="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.source="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.documentation="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.vendor="OX Security" \ + org.opencontainers.image.description="Front End and Back End for CodeTotal" \ No newline at end of file diff --git a/Dockerfile-release b/Dockerfile-release new file mode 100644 index 0000000..060bfd8 --- /dev/null +++ b/Dockerfile-release @@ -0,0 +1,25 @@ +# Use most recent beta image and just change labels +ARG CODETOTAL_BASE_IMAGE +ARG BUILD_DATE +ARG BUILD_REVISION +ARG BUILD_VERSION + +FROM $CODETOTAL_BASE_IMAGE + +ENV BUILD_DATE=$BUILD_DATE \ + BUILD_REVISION=$BUILD_REVISION \ + BUILD_VERSION=$BUILD_VERSION + +EXPOSE 3000 +CMD ["node", "dist/index.js"] +LABEL maintainer="Nicolas Vuillamy " \ + org.opencontainers.image.created=$BUILD_DATE \ + org.opencontainers.image.revision=$BUILD_REVISION \ + org.opencontainers.image.version=$BUILD_VERSION \ + org.opencontainers.image.authors="Nicolas Vuillamy , Eyal Paz , Itay Bisoni " \ + org.opencontainers.image.url="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.source="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.documentation="https://github.com/oxsecurity/codetotal" \ + org.opencontainers.image.vendor="OX Security" \ + org.opencontainers.image.description="Front End and Back End for CodeTotal" + diff --git a/README.md b/README.md index da7d0de..746a29b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ -# codetotal -Code Total Repository +# CodeTotal + +**CodeTotal** analyzes any **snippet**, **file**, or **repository** to detect possible **security flaws** such as **secret in code**, **open source vulnerability**, **code security**, **vulnerability**, insecure **infrastructure as code**, and potential **legal issues** with open source licenses. + +Brought to you by [OX Security](https://ox.security), powered by [MegaLinter](https://megalinter.io) + +[![CodeTotal Screenshot](docs/assets/images/screen.jpg "A screenshot from the app")](https://codetotal.io) + +To see how to use CodeTotal, please read [online documentation](https://codetotal.io) :) diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 0000000..78eed99 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "cypress"; + +export default defineConfig({ + e2e: { + baseUrl: "http://localhost:3000", + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); diff --git a/cypress/e2e/01-toggle-theme.cy.ts b/cypress/e2e/01-toggle-theme.cy.ts new file mode 100644 index 0000000..373aaa1 --- /dev/null +++ b/cypress/e2e/01-toggle-theme.cy.ts @@ -0,0 +1,21 @@ +describe("toggle-theme", () => { + it("should change theme", async () => { + cy.visit("/"); + + cy.get("body").then((el) => { + const body = el.get(0); + const { backgroundColor } = getComputedStyle(body); + + // toggle the theme + cy.get(`[data-cy="toggle-theme"]`).click(); + + cy.get("body").then((elNext) => { + const bodyNext = elNext.get(0); + const backgroundColorNext = getComputedStyle(bodyNext).backgroundColor; + + // asset body background-color changed + expect(backgroundColor).not.to.eq(backgroundColorNext); + }); + }); + }); +}); diff --git a/cypress/e2e/02-analysis.cy.ts b/cypress/e2e/02-analysis.cy.ts new file mode 100644 index 0000000..10e724d --- /dev/null +++ b/cypress/e2e/02-analysis.cy.ts @@ -0,0 +1,17 @@ +import { submitSnippet } from "./utils/submit-snippet"; + +describe("analysis", () => { + it("should pass the happy flow", () => { + cy.visit("/"); + + // submit button disabled by default + cy.get(`[data-cy="submit"]`).should("be.disabled"); + + submitSnippet(); + + // assert location changed to /report/:requestId + cy.location().should((loc) => { + expect(loc.pathname.startsWith("/report")).to.be.true; + }); + }); +}); diff --git a/cypress/e2e/03-report.cy.ts b/cypress/e2e/03-report.cy.ts new file mode 100644 index 0000000..c7b0875 --- /dev/null +++ b/cypress/e2e/03-report.cy.ts @@ -0,0 +1,17 @@ +import { submitSnippet } from "./utils/submit-snippet"; + +describe("report", () => { + it("should show initial report state", () => { + cy.visit("/"); + + submitSnippet(); + + // asset the score & progress is 0 + cy.get(`[data-cy="score"]`).should("contain.text", "0"); + cy.get(`[data-cy="progress"]`).should("contain.text", "0%"); + + // asset resource value and header not empty + cy.get(`[data-cy="resource-value"]`).should("not.be.empty"); + cy.get(`[data-cy="report-header"]`).should("not.be.empty"); + }); +}); diff --git a/cypress/e2e/utils/submit-snippet.ts b/cypress/e2e/utils/submit-snippet.ts new file mode 100644 index 0000000..a7c0ad0 --- /dev/null +++ b/cypress/e2e/utils/submit-snippet.ts @@ -0,0 +1,17 @@ +export const submitSnippet = () => { + // add a sample snippet + cy.get(`[data-cy="snippet-input"]`).type(snippetCode, { delay: 1 }); + + // assert the button is enabled + cy.get(`[data-cy="submit"]`).should("be.visible"); + + // submit the snippet + cy.get(`[data-cy="submit"]`).click(); +}; + +const snippetCode = ` + HEADERS = { + 'Accept': '*/*', + 'Accept-Language': 'en-US,en;q=0.9,ru;q=0.8', + 'authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGllbnROYW1lIjoid2ViYXBwLXYzMSIsInNjb3BlIjoic3RhdGljLWNvbnRlbnQtYXBpLGN1cmF0aW9uLWFwaSxuZXh4LWNvbnRlbnQtYXBpLXYzMSx3ZWJhcHAtYXBpIn0.mbuG9wS9Yf5q6PqgR4fiaRFIagiHk9JhwoKES7ksVX4', + }`; diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000..02e4254 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 0000000..698b01a --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,37 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } \ No newline at end of file diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts new file mode 100644 index 0000000..f80f74f --- /dev/null +++ b/cypress/support/e2e.ts @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/docker-compose-local.yml b/docker-compose-local.yml new file mode 100644 index 0000000..e957e8b --- /dev/null +++ b/docker-compose-local.yml @@ -0,0 +1,103 @@ +version: "3" +services: + # Redis server to manage request queues and results + megalinter_server_redis: + image: redis:7.0.11-alpine + ports: + - "6379:6379" + volumes: + - ./redis:/data + + # Server to receive requests and post them in redis queue + megalinter_server_api: + image: ghcr.io/oxsecurity/megalinter-server:alpha + command: uvicorn server.server:app --host 0.0.0.0 --port 8000 + environment: + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + ports: + - "8000:8000" + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files + + # Worker to process requests and post results in redis stream or pubsub + megalinter_server_worker: + #image: ghcr.io/oxsecurity/megalinter-worker-ci_light:alpha # ci_light is lighter + #image: ghcr.io/oxsecurity/megalinter-worker-javascript:alpha # javascript projects + image: ghcr.io/oxsecurity/megalinter-worker-security:alpha # cupcake is more complete + #image: ghcr.io/oxsecurity/megalinter-worker:alpha # all linters + + environment: + # ignore tool + - DISABLE_LINTERS=REPOSITORY_SYFT,REPOSITORY_DUSTILOCK + - FLAVOR_SUGGESTIONS=false + - LOG_LEVEL=DEBUG # Activate to have output commands in logs + - REPOSITORY_TRUFFLEHOG_ARGUMENTS=--json + # Worker variables + - MEGALINTER_SERVER=true + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + - MEGALINTER_SERVER_WORKER_POOL=true # Uncomment to try worker pool (beta), to have multiple jobs processed by the same worker + - MEGALINTER_SERVER_WORKER_POOL_NUMBER=5 # If worker pool active, number of parallel threads in the worker + + # Redis Reporter info: can be different than Redis job Queue server + - REDIS_REPORTER=true + - REDIS_REPORTER_HOST=megalinter_server_redis + - REDIS_REPORTER_PORT=6379 + + # Use either of the following variables groups depending you want to use redis stream messages or pubsub + + # Stream mode + #- REDIS_LINTER_REPORTER_METHOD=STREAM + #- REDIS_LINTER_REPORTER_STREAM=megalinter:stream:linter_results + + # PubSub mode (by default so commented) + # - REDIS_REPORTER_METHOD=PUBSUB + # - REDIS_LINTER_REPORTER_METHOD=PUBSUB + # - REDIS_ERRORS_REPORTER_METHOD=PUBSUB + ## You can force a channel. If not set, megalinter:pubsub:REQUEST_ID will be used (request_id is returned in initial POST body) + # - REDIS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:results + # - REDIS_LINTER_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:linter_results + # - REDIS_ERRORS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:error + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files + + # CodeTotal Server + code_total_server: + image: codetotal-server:dev + environment: + - NODE_ENV=production + # MEGALINTER API + - MEGALINTER_ANALYSIS_URL=http://megalinter_server_api:8000/analysis + - MEGALINTER_UPLOAD_URL=http://megalinter_server_api:8000/upload-file + # MEGALINTER REDIS + - MEGALINTER_REDIS_URL=redis://megalinter_server_redis:6379 + - MEGALINTER_REDIS_CHANNEL=megalinter:pubsub: + # BACKEND + - CODETOTAL_HTTP_PORT=8081 + - CODETOTAL_HTTP_HOST=0.0.0.0 + - CODETOTAL_WS_PORT=8080 + - CODETOTAL_WS_HOST=0.0.0.0 + - DEBUG_MODULES=actions,megalinter,stores,transport + # FRONTEND + - CODETOTAL_UPLOAD_FILE_LIMIT_BYTES=10000000 + ports: + - "8081:8081" + - "8080:8080" + depends_on: + - megalinter_server_redis + - megalinter_server_api + - megalinter_server_worker + links: + - megalinter_server_redis + - megalinter_server_api diff --git a/docker-compose-megalinter.yml b/docker-compose-megalinter.yml new file mode 100644 index 0000000..eea0fc0 --- /dev/null +++ b/docker-compose-megalinter.yml @@ -0,0 +1,73 @@ +version: "3" +services: + # Redis server to manage request queues and results + megalinter_server_redis: + image: redis:7.0.11-alpine + ports: + - "6379:6379" + volumes: + - ./redis:/data + + # Server to receive requests and post them in redis queue + megalinter_server_api: + image: ghcr.io/oxsecurity/megalinter-server:alpha + command: uvicorn server.server:app --host 0.0.0.0 --port 8000 + environment: + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + ports: + - "8000:8000" + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files + + # Worker to process requests and post results in redis stream or pubsub + megalinter_server_worker: + #image: ghcr.io/oxsecurity/megalinter-worker-ci_light:alpha # ci_light is lighter + #image: ghcr.io/oxsecurity/megalinter-worker-javascript:alpha # javascript projects + image: ghcr.io/oxsecurity/megalinter-worker-security:alpha # cupcake is more complete + #image: ghcr.io/oxsecurity/megalinter-worker:alpha # all linters + + environment: + # ignore tool + - DISABLE_LINTERS=REPOSITORY_SYFT,REPOSITORY_DUSTILOCK + - FLAVOR_SUGGESTIONS=false + - LOG_LEVEL=DEBUG # Activate to have output commands in logs + - REPOSITORY_TRUFFLEHOG_ARGUMENTS=--json + # Worker variables + - MEGALINTER_SERVER=true + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + - MEGALINTER_SERVER_WORKER_POOL=true # Uncomment to try worker pool (beta), to have multiple jobs processed by the same worker + - MEGALINTER_SERVER_WORKER_POOL_NUMBER=5 # If worker pool active, number of parallel threads in the worker + + # Redis Reporter info: can be different than Redis job Queue server + - REDIS_REPORTER=true + - REDIS_REPORTER_HOST=megalinter_server_redis + - REDIS_REPORTER_PORT=6379 + + # Use either of the following variables groups depending you want to use redis stream messages or pubsub + + # Stream mode + #- REDIS_LINTER_REPORTER_METHOD=STREAM + #- REDIS_LINTER_REPORTER_STREAM=megalinter:stream:linter_results + + # PubSub mode (by default so commented) + # - REDIS_REPORTER_METHOD=PUBSUB + # - REDIS_LINTER_REPORTER_METHOD=PUBSUB + # - REDIS_ERRORS_REPORTER_METHOD=PUBSUB + ## You can force a channel. If not set, megalinter:pubsub:REQUEST_ID will be used (request_id is returned in initial POST body) + # - REDIS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:results + # - REDIS_LINTER_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:linter_results + # - REDIS_ERRORS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:error + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a7b47b4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,103 @@ +version: "3" +services: + # Redis server to manage request queues and results + megalinter_server_redis: + image: redis:7.0.11-alpine + ports: + - "6379:6379" + volumes: + - ./redis:/data + + # Server to receive requests and post them in redis queue + megalinter_server_api: + image: ghcr.io/oxsecurity/megalinter-server:beta + command: uvicorn server.server:app --host 0.0.0.0 --port 8000 + environment: + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + ports: + - "8000:8000" + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files + + # Worker to process requests and post results in redis stream or pubsub + megalinter_server_worker: + #image: ghcr.io/oxsecurity/megalinter-worker-ci_light:alpha # ci_light is lighter + #image: ghcr.io/oxsecurity/megalinter-worker-javascript:alpha # javascript projects + image: ghcr.io/oxsecurity/megalinter-worker-security:beta # cupcake is more complete + #image: ghcr.io/oxsecurity/megalinter-worker:alpha # all linters + + environment: + # ignore tool + - DISABLE_LINTERS=REPOSITORY_SYFT,REPOSITORY_DUSTILOCK + - FLAVOR_SUGGESTIONS=false + - LOG_LEVEL=DEBUG # Activate to have output commands in logs + - REPOSITORY_TRUFFLEHOG_ARGUMENTS=--json + # Worker variables + - MEGALINTER_SERVER=true + - MEGALINTER_SERVER_REDIS_HOST=megalinter_server_redis + - MEGALINTER_SERVER_REDIS_PORT=6379 + - MEGALINTER_SERVER_REDIS_QUEUE=megalinter:queue:requests + - MEGALINTER_SERVER_WORKER_POOL=true # Uncomment to try worker pool (beta), to have multiple jobs processed by the same worker + - MEGALINTER_SERVER_WORKER_POOL_NUMBER=5 # If worker pool active, number of parallel threads in the worker + + # Redis Reporter info: can be different than Redis job Queue server + - REDIS_REPORTER=true + - REDIS_REPORTER_HOST=megalinter_server_redis + - REDIS_REPORTER_PORT=6379 + + # Use either of the following variables groups depending you want to use redis stream messages or pubsub + + # Stream mode + #- REDIS_LINTER_REPORTER_METHOD=STREAM + #- REDIS_LINTER_REPORTER_STREAM=megalinter:stream:linter_results + + # PubSub mode (by default so commented) + # - REDIS_REPORTER_METHOD=PUBSUB + # - REDIS_LINTER_REPORTER_METHOD=PUBSUB + # - REDIS_ERRORS_REPORTER_METHOD=PUBSUB + ## You can force a channel. If not set, megalinter:pubsub:REQUEST_ID will be used (request_id is returned in initial POST body) + # - REDIS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:results + # - REDIS_LINTER_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:linter_results + # - REDIS_ERRORS_REPORTER_PUBSUB_CHANNEL=megalinter:pubsub:error + depends_on: + - megalinter_server_redis + links: + - megalinter_server_redis + volumes: + - ./server-files:/tmp/server-files + + # CodeTotal Server + code_total_server: + image: ghcr.io/oxsecurity/codetotal-server:beta + environment: + - NODE_ENV=production + # MEGALINTER API + - MEGALINTER_ANALYSIS_URL=http://megalinter_server_api:8000/analysis + - MEGALINTER_UPLOAD_URL=http://megalinter_server_api:8000/upload-file + # MEGALINTER REDIS + - MEGALINTER_REDIS_URL=redis://megalinter_server_redis:6379 + - MEGALINTER_REDIS_CHANNEL=megalinter:pubsub: + # BACKEND + - CODETOTAL_HTTP_PORT=8081 + - CODETOTAL_HTTP_HOST=0.0.0.0 + - CODETOTAL_WS_PORT=8080 + - CODETOTAL_WS_HOST=0.0.0.0 + - DEBUG_MODULES=actions,megalinter,stores,transport + # FRONTEND + - CODETOTAL_UPLOAD_FILE_LIMIT_BYTES=10000000 + ports: + - "8081:8081" + - "8080:8080" + depends_on: + - megalinter_server_redis + - megalinter_server_api + - megalinter_server_worker + links: + - megalinter_server_redis + - megalinter_server_api diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..11fa8a5 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1 @@ +--8<-- "../CHANGELOG.md" diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..0b73676 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +codetotal.io \ No newline at end of file diff --git a/docs/assets/images/ox-icon.jpg b/docs/assets/images/ox-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb2207a2f0df390253ee4b5a0425caf595a0abf7 GIT binary patch literal 3002 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/screen.jpg b/docs/assets/images/screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c46723cc71878b0722132f15955f0f0f1aad4dd2 GIT binary patch literal 93594 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 VXoBPSyWYzcHrE!1(DJ4`{tZm^QTzY^ literal 0 HcmV?d00001 diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..3f2d90d --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1 @@ +--8<-- "../CONTRIBUTING.md" diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..28bae1c --- /dev/null +++ b/docs/index.md @@ -0,0 +1,9 @@ +# CodeTotal + +**CodeTotal** analyzes any **snippet**, **file**, or **repository** to detect possible **security flaws** such as **secret in code**, **open source vulnerability**, **code security**, **vulnerability**, insecure **infrastructure as code**, and potential **legal issues** with open source licenses. + +Brought to you by [OX Security](https://ox.security), powered by [MegaLinter](https://megalinter.io) + +![CodeTotal Screenshot](assets/images/screen.jpg "A screenshot from the app") + +[Start now !](quick-start.md) \ No newline at end of file diff --git a/docs/javascripts/gtag.js b/docs/javascripts/gtag.js new file mode 100644 index 0000000..2aa2817 --- /dev/null +++ b/docs/javascripts/gtag.js @@ -0,0 +1,20 @@ +var gtag_id = ""; //"G-9B8BSP0VV7"; replace by GTAG if you want stats + +if (gtag_id === "") { + return; +} + +var script = document.createElement("script"); +script.src = "https://www.googletagmanager.com/gtag/js?id=" + gtag_id; +document.head.appendChild(script); + +location$.subscribe(function (url) { + window.dataLayer = window.dataLayer || []; + + function gtag() { + dataLayer.push(arguments); + } + + gtag("js", new Date()); + gtag("config", gtag_id); +}); \ No newline at end of file diff --git a/docs/javascripts/quickfixes.js b/docs/javascripts/quickfixes.js new file mode 100644 index 0000000..eaeacd3 --- /dev/null +++ b/docs/javascripts/quickfixes.js @@ -0,0 +1,17 @@ +function hideHomeTitle () { + // Hide h1 containing Home (to have a nicer home page) + const h1s = document.querySelectorAll('h1') + for (let i = 0; i < h1s.length; i++) { + if (h1s[i].innerText === 'Home') { + h1s[i].style.display = 'none' + } + } +} + +(window.onload = function () { + hideHomeTitle() + // So ugly setInterval: TODO: make that clean + setInterval(function () { + hideHomeTitle() + }, 1000) +}) diff --git a/docs/javascripts/tables.js b/docs/javascripts/tables.js new file mode 100644 index 0000000..0bf112d --- /dev/null +++ b/docs/javascripts/tables.js @@ -0,0 +1,6 @@ +document$.subscribe(function () { + const tables = document.querySelectorAll('article table') + tables.forEach(function (table) { + new Tablesort(table) + }) +}) diff --git a/docs/license-explanations.md b/docs/license-explanations.md new file mode 100644 index 0000000..86bd144 --- /dev/null +++ b/docs/license-explanations.md @@ -0,0 +1,29 @@ +--- +title: License explanation +description: What you can do and can not do with CodeTotal +--- + + +# Why AGPL V3 License ? + +CodeTotal is an open-source and free tool graciously provided to the developer community. + +We don't earn money with CodeTotal, but it takes a lot of time to maintain it, so we want to avoid companies to make money with it by selling software or services without sharing their sources, like it happened in the past with [ElasticSearch](https://www.elastic.co/blog/why-license-change-aws) or [MongoDB](https://techcrunch.com/2018/10/16/mongodb-switches-up-its-open-source-license/). + +## What you can do + +- Use CodeTotal with public repositories +- Use CodeTotal with private repositories, even commercial ones +- Use CodeTotal to build commercial closed-source applications +- Use CodeTotal with on-premise Git services, like Github Enterprise or Gitlab Community Edition + +## What you can not do + +- Sell CodeTotal +- Expose a closed-source online service that calls CodeTotal in the background + +## What you could do + +If you have a professional use of CodeTotal, you can be nice and support us by [sponsoring us](https://megalinter.io/latest/sponsor/), and ask your clients to sponsor us too :) + +Any questions ? [Contact us](https://www.ox.security/contact/) ! \ No newline at end of file diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..ec5e9f6 --- /dev/null +++ b/docs/license.md @@ -0,0 +1,5 @@ +# License + +## GNU Affero General Public License + + --8<-- "../LICENSE" diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..1fc76a5 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block extrahead %} + +{% if page and page.meta and page.meta.title and page.meta.description %} + + + + + + + + + + +{% else %} + + + + + + + + + + + + + +{% endif %} + +{% endblock %} diff --git a/docs/quick-start.md b/docs/quick-start.md new file mode 100644 index 0000000..1785dc6 --- /dev/null +++ b/docs/quick-start.md @@ -0,0 +1,25 @@ +--- +title: Quick Start +description: Learn how to easily start CodeTotal on your computer or your server ! +--- + + +## Pre-requisites + +CodeTotal is based on docker images, so all you need to have is: + +- [docker](https://docs.docker.com/engine/install/) installed and started on your computer, so our [docker-compose.yml](https://github.com/oxsecurity/codetotal/blob/main/docker-compose.yml) file can be interpreted. +- [nodejs](https://nodejs.org/en), to call npm startup script + +## Clone the repository + +- Run `git clone https://github.com/oxsecurity/codetotal.git` + +## Start CodeTotal + +- Run `npm install` + +- Run `npm run codetotal` + +- Open in your Web browser + diff --git a/docs/security-linters.md b/docs/security-linters.md new file mode 100644 index 0000000..029799b --- /dev/null +++ b/docs/security-linters.md @@ -0,0 +1,48 @@ +--- +title: MegaLinter Security flavor +description: List of security linters embedded in CodeTotal +--- + +## Embedded linters + +CodeTotal is based on [MegaLinter security flavor](https://megalinter.io/latest/flavors/security/). + +### Languages + +| | Language | Linter | Additional | +|:----------------------------------------------------------------------------------------------------------------------------------------------------------------:|--------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| | [**BASH**](https://megalinter.io/beta/descriptors/bash/) | [**bash-exec**](https://megalinter.io/beta/descriptors/bash_bash_exec/)
[_BASH_EXEC_](https://megalinter.io/beta/descriptors/bash_bash_exec/) | | +| | [**BASH**](https://megalinter.io/beta/descriptors/bash/) | [**shellcheck**](https://megalinter.io/beta/descriptors/bash_shellcheck/)
[_BASH_SHELLCHECK_](https://megalinter.io/beta/descriptors/bash_shellcheck/) | [![GitHub stars](https://img.shields.io/github/stars/koalaman/shellcheck?cacheSeconds=3600)](https://github.com/koalaman/shellcheck) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**PYTHON**](https://megalinter.io/beta/descriptors/python/) | [**bandit**](https://megalinter.io/beta/descriptors/python_bandit/)
[_PYTHON_BANDIT_](https://megalinter.io/beta/descriptors/python_bandit/) | [![GitHub stars](https://img.shields.io/github/stars/PyCQA/bandit?cacheSeconds=3600)](https://github.com/PyCQA/bandit) ![sarif](https://shields.io/badge/-SARIF-orange) | + +### Tooling + +| | Tooling format | Linter | Additional | +|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| | [**ANSIBLE**](https://megalinter.io/beta/descriptors/ansible/) | [**ansible-lint**](https://megalinter.io/beta/descriptors/ansible_ansible_lint/)
[_ANSIBLE_ANSIBLE_LINT_](https://megalinter.io/beta/descriptors/ansible_ansible_lint/) | [![GitHub stars](https://img.shields.io/github/stars/ansible/ansible-lint?cacheSeconds=3600)](https://github.com/ansible/ansible-lint) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**CLOUDFORMATION**](https://megalinter.io/beta/descriptors/cloudformation/) | [**cfn-lint**](https://megalinter.io/beta/descriptors/cloudformation_cfn_lint/)
[_CLOUDFORMATION_CFN_LINT_](https://megalinter.io/beta/descriptors/cloudformation_cfn_lint/) | [![GitHub stars](https://img.shields.io/github/stars/aws-cloudformation/cfn-lint?cacheSeconds=3600)](https://github.com/aws-cloudformation/cfn-lint) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**DOCKERFILE**](https://megalinter.io/beta/descriptors/dockerfile/) | [**hadolint**](https://megalinter.io/beta/descriptors/dockerfile_hadolint/)
[_DOCKERFILE_HADOLINT_](https://megalinter.io/beta/descriptors/dockerfile_hadolint/) | [![GitHub stars](https://img.shields.io/github/stars/hadolint/hadolint?cacheSeconds=3600)](https://github.com/hadolint/hadolint) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**KUBERNETES**](https://megalinter.io/beta/descriptors/kubernetes/) | [**kubeconform**](https://megalinter.io/beta/descriptors/kubernetes_kubeconform/)
[_KUBERNETES_KUBECONFORM_](https://megalinter.io/beta/descriptors/kubernetes_kubeconform/) | [![GitHub stars](https://img.shields.io/github/stars/yannh/kubeconform?cacheSeconds=3600)](https://github.com/yannh/kubeconform) | +| | [**KUBERNETES**](https://megalinter.io/beta/descriptors/kubernetes/) | [**helm**](https://megalinter.io/beta/descriptors/kubernetes_helm/)
[_KUBERNETES_HELM_](https://megalinter.io/beta/descriptors/kubernetes_helm/) | [![GitHub stars](https://img.shields.io/github/stars/helm/helm?cacheSeconds=3600)](https://github.com/helm/helm) | +| | [**KUBERNETES**](https://megalinter.io/beta/descriptors/kubernetes/) | [**kubescape**](https://megalinter.io/beta/descriptors/kubernetes_kubescape/)
[_KUBERNETES_KUBESCAPE_](https://megalinter.io/beta/descriptors/kubernetes_kubescape/) | [![GitHub stars](https://img.shields.io/github/stars/kubescape/kubescape?cacheSeconds=3600)](https://github.com/kubescape/kubescape) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**TERRAFORM**](https://megalinter.io/beta/descriptors/terraform/) | [**tflint**](https://megalinter.io/beta/descriptors/terraform_tflint/)
[_TERRAFORM_TFLINT_](https://megalinter.io/beta/descriptors/terraform_tflint/) | [![GitHub stars](https://img.shields.io/github/stars/terraform-linters/tflint?cacheSeconds=3600)](https://github.com/terraform-linters/tflint) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**TERRAFORM**](https://megalinter.io/beta/descriptors/terraform/) | [**terrascan**](https://megalinter.io/beta/descriptors/terraform_terrascan/)
[_TERRAFORM_TERRASCAN_](https://megalinter.io/beta/descriptors/terraform_terrascan/) | [![GitHub stars](https://img.shields.io/github/stars/tenable/terrascan?cacheSeconds=3600)](https://github.com/tenable/terrascan) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**TERRAFORM**](https://megalinter.io/beta/descriptors/terraform/) | [**terragrunt**](https://megalinter.io/beta/descriptors/terraform_terragrunt/)
[_TERRAFORM_TERRAGRUNT_](https://megalinter.io/beta/descriptors/terraform_terragrunt/) | [![GitHub stars](https://img.shields.io/github/stars/gruntwork-io/terragrunt?cacheSeconds=3600)](https://github.com/gruntwork-io/terragrunt) ![autofix](https://shields.io/badge/-autofix-green) | + +### Other + +| | Code quality checker | Linter | Additional | +|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------:|----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**checkov**](https://megalinter.io/beta/descriptors/repository_checkov/)
[_REPOSITORY_CHECKOV_](https://megalinter.io/beta/descriptors/repository_checkov/) | [![GitHub stars](https://img.shields.io/github/stars/bridgecrewio/checkov?cacheSeconds=3600)](https://github.com/bridgecrewio/checkov) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**devskim**](https://megalinter.io/beta/descriptors/repository_devskim/)
[_REPOSITORY_DEVSKIM_](https://megalinter.io/beta/descriptors/repository_devskim/) | [![GitHub stars](https://img.shields.io/github/stars/microsoft/DevSkim?cacheSeconds=3600)](https://github.com/microsoft/DevSkim) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**dustilock**](https://megalinter.io/beta/descriptors/repository_dustilock/)
[_REPOSITORY_DUSTILOCK_](https://megalinter.io/beta/descriptors/repository_dustilock/) | [![GitHub stars](https://img.shields.io/github/stars/Checkmarx/dustilock?cacheSeconds=3600)](https://github.com/Checkmarx/dustilock) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**gitleaks**](https://megalinter.io/beta/descriptors/repository_gitleaks/)
[_REPOSITORY_GITLEAKS_](https://megalinter.io/beta/descriptors/repository_gitleaks/) | [![GitHub stars](https://img.shields.io/github/stars/gitleaks/gitleaks?cacheSeconds=3600)](https://github.com/gitleaks/gitleaks) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**grype**](https://megalinter.io/beta/descriptors/repository_grype/)
[_REPOSITORY_GRYPE_](https://megalinter.io/beta/descriptors/repository_grype/) | [![GitHub stars](https://img.shields.io/github/stars/anchore/grype?cacheSeconds=3600)](https://github.com/anchore/grype) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**kics**](https://megalinter.io/beta/descriptors/repository_kics/)
[_REPOSITORY_KICS_](https://megalinter.io/beta/descriptors/repository_kics/) | [![GitHub stars](https://img.shields.io/github/stars/checkmarx/kics?cacheSeconds=3600)](https://github.com/checkmarx/kics) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**secretlint**](https://megalinter.io/beta/descriptors/repository_secretlint/)
[_REPOSITORY_SECRETLINT_](https://megalinter.io/beta/descriptors/repository_secretlint/) | [![GitHub stars](https://img.shields.io/github/stars/secretlint/secretlint?cacheSeconds=3600)](https://github.com/secretlint/secretlint) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**semgrep**](https://megalinter.io/beta/descriptors/repository_semgrep/)
[_REPOSITORY_SEMGREP_](https://megalinter.io/beta/descriptors/repository_semgrep/) | [![GitHub stars](https://img.shields.io/github/stars/returntocorp/semgrep?cacheSeconds=3600)](https://github.com/returntocorp/semgrep) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**syft**](https://megalinter.io/beta/descriptors/repository_syft/)
[_REPOSITORY_SYFT_](https://megalinter.io/beta/descriptors/repository_syft/) | [![GitHub stars](https://img.shields.io/github/stars/anchore/syft?cacheSeconds=3600)](https://github.com/anchore/syft) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**trivy**](https://megalinter.io/beta/descriptors/repository_trivy/)
[_REPOSITORY_TRIVY_](https://megalinter.io/beta/descriptors/repository_trivy/) | [![GitHub stars](https://img.shields.io/github/stars/aquasecurity/trivy?cacheSeconds=3600)](https://github.com/aquasecurity/trivy) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**trivy-sbom**](https://megalinter.io/beta/descriptors/repository_trivy_sbom/)
[_REPOSITORY_TRIVY_SBOM_](https://megalinter.io/beta/descriptors/repository_trivy_sbom/) | [![GitHub stars](https://img.shields.io/github/stars/aquasecurity/trivy?cacheSeconds=3600)](https://github.com/aquasecurity/trivy) ![sarif](https://shields.io/badge/-SARIF-orange) | +| | [**REPOSITORY**](https://megalinter.io/beta/descriptors/repository/) | [**trufflehog**](https://megalinter.io/beta/descriptors/repository_trufflehog/)
[_REPOSITORY_TRUFFLEHOG_](https://megalinter.io/beta/descriptors/repository_trufflehog/) | [![GitHub stars](https://img.shields.io/github/stars/trufflesecurity/trufflehog?cacheSeconds=3600)](https://github.com/trufflesecurity/trufflehog) | + diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..42f48d5 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,76 @@ +/* stylelint-disable SelectorFormat, selector-class-pattern */ +.codetotal-banner { + height: 50px; + max-height: 150px; +} + +.codetotal-logo { + height: 70px; + max-height: 70px; +} + +.codetotal-icon { + max-height: 32px; + max-width: 32px; +} + +.megalinter-icon { + max-height: 32px; + max-width: 32px; +} + +.md-typeset__table { + min-width: 100%; +} + +.md-typeset table:not([class]) { + display: table; +} + +/* light mode table header bgcolor */ +.md-typeset__table th { + background-color: #f2edfe; +} + +/* dark mode table header bgcolor */ +[data-md-color-scheme="slate"] .md-typeset__table th { + background-color: hsl(var(--md-hue) 25% 25% / 100%) +} + +/* light mode alternating table bg colors */ +.md-typeset__table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +/* dark mode alternating table bg colors */ +[data-md-color-scheme="slate"] .md-typeset__table tr:nth-child(2n) { + background-color: hsl(var(--md-hue) 25% 25% / 100%) +} + +h1[content~="Home"] { + display: none; +} + +:root>* { + --md-default-fg-color: #1E144D; + --md-default-fg-color--light: #6A2BFF; + --md-default-fg-color--lighter: #FD80CD ; + --md-default-fg-color--lightest: #dcc4d3; + --md-default-bg-color: #fff; + --md-default-bg-color--light: #fff; + --md-default-bg-color--lighter: #fff; + --md-default-bg-color--lightest: #fff; + --md-primary-fg-color: #1E144D; + --md-primary-fg-color--light: #FD80CD; + --md-primary-fg-color--dark: #6A2BFF; + --md-primary-bg-color: #fff; + --md-primary-bg-color--light: #fff; + --md-accent-fg-color: #6A2BFF; + --md-accent-fg-color--transparent: #6A2BFF; + --md-accent-bg-color: #B95CE4; + --md-accent-bg-color--light: #FD80CD; + --md-footer-bg-color: #B95CE4; + --md-typeset-table-color--light: #fff5fb; + +} + diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 0000000..d3ca6d8 --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,12 @@ +import dotenv from "dotenv"; + +// load ENV variables from .env file +dotenv.config({ path: "./.env" }); + +// For VSCode support using the "Jest" extension by "Orta" +// (same goes for the root tsconfig.json file) +export default { + preset: "ts-jest", + testEnvironment: "node", + testPathIgnorePatterns: ["node_modules", "dist"], +}; diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..d086a3d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,65 @@ +--- +site_name: CodeTotal by OX Security +site_url: https://codetotal.io +repo_url: https://github.com/oxsecurity/codetotal +edit_uri: tree/main/docs +site_author: Nicolas Vuillamy +# site_description-start +site_description: +# site_description-end +copyright: Copyright © 2022 OX Security +theme: + name: material + font: + text: Satoshi, sans-serif + custom_dir: docs/overrides + features: + - navigation.instant + - navigation.footer + logo: assets/images/ox-icon.jpg + favicon: assets/images/ox-icon.jpg + palette: + primary: white +plugins: + - glightbox + - search +markdown_extensions: + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.snippets: + base_path: docs + check_paths: true + - mdx_truly_sane_lists + - attr_list +extra_javascript: + - https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js + - javascripts/tables.js + # - javascripts/gtag.js + # - javascripts/version-mike.js + - javascripts/quickfixes.js +extra_css: + - stylesheets/extra.css +extra: + social: + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/company/ox-security/ + - icon: fontawesome/regular/circle-question + link: https://github.com/oxsecurity/codetotal/issues + title: Need help ? Post an issue :) + - icon: fontawesome/brands/github + link: https://github.com/oxsecurity/codetotal + - icon: fontawesome/brands/docker + link: https://hub.docker.com/r/oxsecurity/codetotal + generator: false +nav: + - "Home": "index.md" + - "Quick Start": "quick-start.md" + - "Security linters": "security-linters.md" + - "Contribute": "contributing.md" + - "License": + - "AGPL V3 License": "license.md" + - "License explanations": "license-explanations.md" + - "Changelog": "CHANGELOG.md" + - "MegaLinter WebSite": "https://megalinter.io" + - "OX Security WebSite": "https://ox.security?ref=codetotal" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b22bb47 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15295 @@ +{ + "name": "codetotal", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "codetotal", + "version": "1.0.0", + "hasInstallScript": true, + "license": "ISC", + "workspaces": [ + "packages/shared-types", + "packages/backend", + "packages/app" + ], + "dependencies": { + "shared-types": "^1.0.0" + }, + "devDependencies": { + "@jest/globals": "^29.6.1", + "@types/jest": "^29.5.3", + "cross-env": "^7.0.3", + "cypress": "^12.17.1", + "jest": "^29.6.1", + "nodemon": "^2.0.22", + "npm-run-all": "^4.1.5", + "pre-commit": "^1.2.2", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "turbo": "^1.10.12", + "typescript": "^5.1.6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "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.22.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz", + "integrity": "sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg==", + "dev": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "eslint-visitor-keys": "^2.1.0" + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dependencies": { + "@babel/types": "^7.22.5", + "@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "dev": true, + "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-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "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.22.5", + "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.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.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==", + "dev": true, + "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.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", + "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.5" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "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.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^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-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@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.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "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-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^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-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "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-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^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-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^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-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^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-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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "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.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^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-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "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==", + "dev": true, + "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-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "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-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "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-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "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.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz", + "integrity": "sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", + "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "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-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "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-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "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/preset-env": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.7.tgz", + "integrity": "sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@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.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@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.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", + "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "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==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "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==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "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/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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==", + "dev": true, + "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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/@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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/@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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "dependencies": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "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-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/@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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/@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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@jest/transform/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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@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": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/@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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "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==", + "dev": true, + "peer": true, + "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.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.5.tgz", + "integrity": "sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.6", + "@popperjs/core": "^2.11.8", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.13.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz", + "integrity": "sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/material": { + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.6.tgz", + "integrity": "sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@mui/base": "5.0.0-beta.5", + "@mui/core-downloads-tracker": "^5.13.4", + "@mui/system": "^5.13.6", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.6", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.6.tgz", + "integrity": "sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.6.tgz", + "integrity": "sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", + "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/client/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/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", + "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.0.tgz", + "integrity": "sha512-Eu1V3kz3mV0wUpVTiFHuaT8UD1gj/0VnoFHQYX35xlslQUpe8CuYoKFn9d4WZFHm3yDywz6ALZuGdnUPKrNeAw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", + "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.0.tgz", + "integrity": "sha512-yhxwIlFVSVcMym3O31HoMnRXpoenmpIxcj4Yoes2DUpe+xCJnA7ECQP1Vw889V0jTt/2nzvpLQ/UuMYCd3JPIg==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "devOptional": true, + "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.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "devOptional": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "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.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/formidable": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-3.4.0.tgz", + "integrity": "sha512-JXP+LsspYYBIJJxZ9VJsswb5U1hkUUhLmtAb6EB1SWcDDbJQlWRhGoZYasMSnk2NsqtUEHd3uuaiImmSys+8AQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "dev": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", + "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/md5": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", + "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "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==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-csv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/react-csv/-/react-csv-1.1.3.tgz", + "integrity": "sha512-dkEdyRvRpygSnNg4cyzYWSUjukIQ5lAtXJwc7BqyUfzww/Cv2dcAFGYd+sWTFpGiDNZMVPp6vVPLcAPvJID8Kg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", + "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.61.0.tgz", + "integrity": "sha512-r4RTnwTcaRRVUyKb7JO4DiOGmcMCat+uNs6HqJBfX7K2nlq5TagYZShhbhAw7hFT3bHaYgxMw6pKP0fhu05VMA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", + "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "dev": true, + "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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.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.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.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/visitor-keys": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.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/@vitejs/plugin-react": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz", + "integrity": "sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.5", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/@vscode/vscode-languagedetection": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.22.tgz", + "integrity": "sha512-rQ/BgMyLuIXSmbA0MSkIPHtcOw14QkeDbAq19sjvaS9LTRr905yij0S8lsyqN5JgOsbtIx7pAcyOxFMzPmqhZQ==", + "bin": { + "vscode-languagedetection": "cli/index.js" + } + }, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peer": true + }, + "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==", + "dev": true, + "peer": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app": { + "resolved": "packages/app", + "link": true + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "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.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "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.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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-polyfill-corejs2": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dev": true + }, + "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==", + "dev": true, + "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": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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/backend": { + "resolved": "packages/backend", + "link": true + }, + "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==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "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/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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001508", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", + "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "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/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "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/chalk/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/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.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==", + "dev": true + }, + "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/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "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==", + "dev": true + }, + "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": "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/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-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "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/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/countup.js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.6.2.tgz", + "integrity": "sha512-PRvoilkebwr1MKaRAllyJl2cD7mgunGZWXLaSFL+YqHXlJpjLX7SHTWonRfIx2xg1Xf7SPbo92bOOonSIomRYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/cypress": { + "version": "12.17.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.2.tgz", + "integrity": "sha512-hxWAaWbqQBzzMuadSGSuQg5PDvIGOovm6xm0hIfpCVcORsCAj/gF2p0EvfnJ4f+jK2PCiDgP6D2eeE9/FK4Mjg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.11", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", + "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==", + "dev": true + }, + "node_modules/cypress/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/cypress/node_modules/chalk/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cypress/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==", + "dev": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/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==", + "dev": true, + "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/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/cypress/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/cypress/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "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==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", + "dev": true + }, + "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/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devicon": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/devicon/-/devicon-2.15.1.tgz", + "integrity": "sha512-iyapbDVaq1PgMSMZ4IekgjH230aSUU4kHmZ142lQ2TJ+9HB4P4V78eNDkyaQEEoi0KJhxIGPcTSFqxHaZ4OMyw==" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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/electron-to-chromium": { + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true, + "peer": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true, + "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/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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": "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": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "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", + "import-fresh": "^3.0.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", + "strip-json-comments": "^3.1.0", + "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-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==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/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==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "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==", + "dev": true, + "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-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "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==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", + "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", + "dev": true, + "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-plugin-tss-unused-classes": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-tss-unused-classes/-/eslint-plugin-tss-unused-classes-0.0.4.tgz", + "integrity": "sha512-QwT1wcG0hM00wOcRKqdIDi4WkUOb55flySNGcvICJoGxXcH9Uk49jy0+UFZOVyUIMOYUVkCFLk02Mq+i5hrc7g==", + "dev": true, + "peerDependencies": { + "eslint": "^7.14.0 || ^8.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "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/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "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/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "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/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "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/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/file-selector/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/filesize": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.7.tgz", + "integrity": "sha512-iMRG7Qo9nayLoU3PNCiLizYtsy4W1ClrapeCwEgtiQelOAOuRJiw4QaLI+sSr8xr901dgHv+EYP2bCusGZgoiA==", + "engines": { + "node": ">= 10.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==", + "dev": true, + "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-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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==", + "dev": true, + "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.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "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/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": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "peer": true + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dev": true, + "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-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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==", + "dev": true + }, + "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-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "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-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/inquirer/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/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==", + "dev": true + }, + "node_modules/inquirer/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "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==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.1", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": 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/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": 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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dev": true, + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "peer": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/log-symbols/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==", + "dev": true + }, + "node_modules/log-symbols/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/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==", + "dev": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "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/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "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/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/monaco-editor": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.40.0.tgz", + "integrity": "sha512-1wymccLEuFSMBvCk/jT1YDW/GuxMLYwnFwF9CDyYCxoTw2Pt379J3FUhwy9c43j51JdcxVPjwk0jm0EVDsBS2g==" + }, + "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/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "peer": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "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.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "dev": true, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/ora/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/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==", + "dev": true + }, + "node_modules/ora/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "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==", + "dev": true + }, + "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/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-commit/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8.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==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "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-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "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.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "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/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-countup": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.4.2.tgz", + "integrity": "sha512-wdDrNb2lPFGbLb+i0FTgswPbWziubS6KZRII8NRpXmUCoZsi15PFbIHgBz60Dyxd4KPuRvwsK5aawIU4OPP3jA==", + "dependencies": { + "@rollup/plugin-babel": "^6.0.3", + "countup.js": "^2.5.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, + "node_modules/react-csv": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-csv/-/react-csv-2.2.2.tgz", + "integrity": "sha512-RG5hOcZKZFigIGE8LxIEV/OgS1vigFQT4EkaHeKgyuCbUAu9Nbd/1RYq++bJcJJ9VOqO/n9TZRADsXNDR4VEpw==" + }, + "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-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "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/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.0.tgz", + "integrity": "sha512-OD+vkrcGbvlwkspUFDgMzsu1RXwdjNh83YgG/28lBnDzgslhCgxIqoExLlxsfTpIygp7fc+Hd3esloNwzkm2xA==", + "dependencies": { + "@remix-run/router": "1.7.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.0.tgz", + "integrity": "sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ==", + "dependencies": { + "@remix-run/router": "1.7.0", + "react-router": "6.14.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/readable-stream/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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", + "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.8", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.3", + "@redis/time-series": "1.0.4" + } + }, + "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==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "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/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.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==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true, + "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==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.2.tgz", + "integrity": "sha512-VLnkxZMDr3jpxgtmS8pQZ0UvhslmF4ADq/9w4erkctbgjCqLW9oa89fJuXEs4ZmgyoF7Dm8rMDKSS5b5u2hHUg==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "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/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.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/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==", + "dev": true, + "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/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shared-types": { + "resolved": "packages/shared-types", + "link": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "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==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-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==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "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/string_decoder/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/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "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-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/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "dev": true, + "peer": true, + "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.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "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-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==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/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==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-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==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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==", + "dev": true, + "peer": true + }, + "node_modules/terser/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==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/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==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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==", + "dev": true, + "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/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tss-react": { + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/tss-react/-/tss-react-4.8.6.tgz", + "integrity": "sha512-+ucvy+SLFUUxd3zA3QS9Q7bo5FerR8VIUOHieyvYYMoBqtpVinnOA0aTOSXcSdl4lqjFc/9gNA5x0B5iIWk7hA==", + "dependencies": { + "@emotion/cache": "*", + "@emotion/serialize": "*", + "@emotion/utils": "*" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/server": "^11.4.0", + "react": "^16.8.0 || ^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/server": { + "optional": true + } + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "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/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/turbo": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.10.12.tgz", + "integrity": "sha512-WM3+jTfQWnB9W208pmP4oeehZcC6JQNlydb/ZHMRrhmQa+htGhWLCzd6Q9rLe0MwZLPpSPFV2/bN5egCLyoKjQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "turbo": "bin/turbo" + }, + "optionalDependencies": { + "turbo-darwin-64": "1.10.12", + "turbo-darwin-arm64": "1.10.12", + "turbo-linux-64": "1.10.12", + "turbo-linux-arm64": "1.10.12", + "turbo-windows-64": "1.10.12", + "turbo-windows-arm64": "1.10.12" + } + }, + "node_modules/turbo-darwin-64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.10.12.tgz", + "integrity": "sha512-vmDfGVPl5/aFenAbOj3eOx3ePNcWVUyZwYr7taRl0ZBbmv2TzjRiFotO4vrKCiTVnbqjQqAFQWY2ugbqCI1kOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-darwin-arm64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.12.tgz", + "integrity": "sha512-3JliEESLNX2s7g54SOBqqkqJ7UhcOGkS0ywMr5SNuvF6kWVTbuUq7uBU/sVbGq8RwvK1ONlhPvJne5MUqBCTCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-linux-64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.10.12.tgz", + "integrity": "sha512-siYhgeX0DidIfHSgCR95b8xPee9enKSOjCzx7EjTLmPqPaCiVebRYvbOIYdQWRqiaKh9yfhUtFmtMOMScUf1gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-linux-arm64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.10.12.tgz", + "integrity": "sha512-K/ZhvD9l4SslclaMkTiIrnfcACgos79YcAo4kwc8bnMQaKuUeRpM15sxLpZp3xDjDg8EY93vsKyjaOhdFG2UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-windows-64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.10.12.tgz", + "integrity": "sha512-7FSgSwvktWDNOqV65l9AbZwcoueAILeE4L7JvjauNASAjjbuzXGCEq5uN8AQU3U5BOFj4TdXrVmO2dX+lLu8Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/turbo-windows-arm64": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.10.12.tgz", + "integrity": "sha512-gCNXF52dwom1HLY9ry/cneBPOKTBHhzpqhMylcyvJP0vp9zeMQQkt6yjYv+6QdnmELC92CtKNp2FsNZo+z0pyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typia": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/typia/-/typia-4.1.7.tgz", + "integrity": "sha512-zi4Go5K0iS5Vi0XFlQnpwL1Fhz3qkn2lxc2ol4GQ4mK04nDt/ocn4kWrmmpFBQrcCAkwOoP9GL51aDJDPobZSA==", + "dev": true, + "dependencies": { + "commander": "^10.0.0", + "comment-json": "^4.2.3", + "inquirer": "^8.2.5", + "randexp": "^0.5.3", + "raw-loader": "^4.0.2" + }, + "bin": { + "typia": "lib/executable/typia.js" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + } + }, + "node_modules/typia/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "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==", + "dev": true, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "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/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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/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": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "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/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.1.tgz", + "integrity": "sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/vite-plugin-checker/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vite-plugin-checker/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==", + "dev": true + }, + "node_modules/vite-plugin-checker/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@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.14.5", + "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.7", + "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-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==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "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==", + "dev": true, + "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-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "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/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "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": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz", + "integrity": "sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "packages/app": { + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.13.5", + "axios": "^1.4.0", + "filesize": "^10.0.7", + "lodash-es": "^4.17.21", + "md5": "^2.3.0", + "monaco-editor": "^0.40.0", + "react": "^18.2.0", + "react-countup": "^6.4.2", + "react-csv": "^2.2.2", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-icons": "^4.10.1", + "react-router-dom": "^6.13.0", + "shared-types": "^1.0.0", + "tss-react": "^4.8.6", + "zustand": "^4.3.8" + }, + "devDependencies": { + "@types/express": "^4.17.17", + "@types/lodash-es": "^4.17.8", + "@types/md5": "^2.3.2", + "@types/react": "^18.0.37", + "@types/react-csv": "^1.1.3", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "eslint-plugin-tss-unused-classes": "^0.0.4", + "express": "^4.18.2", + "typescript": "^5.0.2", + "vite": "^4.3.9", + "vite-plugin-checker": "^0.6.1" + } + }, + "packages/backend": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@vscode/vscode-languagedetection": "^1.0.22", + "axios": "^1.4.0", + "cors": "^2.8.5", + "devicon": "^2.15.1", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "md5": "^2.3.0", + "multer": "^1.4.5-lts.1", + "redis": "^4.6.7", + "shared-types": "^1.0.0", + "ws": "^8.13.0" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.0", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/formidable": "^3.4.0", + "@types/multer": "^1.4.7", + "@types/ws": "^8.5.5", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "eslint": "^8.44.0", + "nodemon": "^2.0.22", + "typescript": "^5.1.6", + "typia": "^4.1.7" + } + }, + "packages/shared-types": { + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@types/express": "^4.17.17", + "express": "^4.18.2", + "typescript": "^5.1.3" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..aa45900 --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "name": "codetotal", + "scripts": { + "start": "turbo run start", + "postinstall": "npm run build --workspace=packages/shared-types", + "lint": "npm run lint --workspaces", + "prebuild": "npm run clean", + "build": "npm run build --workspaces", + "postbuild": "mv ./packages/backend/dist . && mkdir -p ./dist/public && mv ./packages/app/dist/* ./dist/public", + "clean": "rm -rf dist && npm run clean --workspaces", + "production": "cross-env NODE_ENV=production node -r dotenv/config dist/index.js dotenv_config_path=./.env dotenv_config_debug=true", + "build:be": "npm run build:st && npm run build --workspace=packages/backend", + "build:st": "npm run build --workspace=packages/shared-types", + "start:be": "npm start --workspace=packages/backend", + "start:fe": "npm start --workspace=packages/app", + "test": "npm test --workspace=packages/backend", + "start:test": "npm run start:test --workspace=packages/backend", + "prestart:megalinter": "cross-env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f docker-compose-megalinter.yml pull", + "start:megalinter": "cross-env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f docker-compose-megalinter.yml up", + "precodetotal:dev": "docker build -t codetotal-server:dev --platform linux/amd64 -f Dockerfile .", + "codetotal:dev": "cross-env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f docker-compose-local.yml up", + "precodetotal": "cross-env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f docker-compose.yml pull", + "codetotal": "cross-env echo \"When CodeTotal is up, open http://localhost:8081\" && cross-env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f docker-compose.yml up", + "doc:install": "pip install --upgrade markdown==3.3.7 mkdocs-material pymdown-extensions==9.11 mkdocs-glightbox==0.3.2 mdx_truly_sane_lists", + "doc:test": "mkdocs serve", + "e2e": "npx cypress open" + }, + "pre-commit": [ + "test", + "lint" + ], + "workspaces": [ + "packages/shared-types", + "packages/backend", + "packages/app" + ], + "version": "1.0.0", + "description": "CodeTotal mono-repo", + "devDependencies": { + "@jest/globals": "^29.6.1", + "@types/jest": "^29.5.3", + "cross-env": "^7.0.3", + "cypress": "^12.17.1", + "jest": "^29.6.1", + "nodemon": "^2.0.22", + "npm-run-all": "^4.1.5", + "pre-commit": "^1.2.2", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "turbo": "^1.10.12", + "typescript": "^5.1.6" + }, + "keywords": [], + "author": "Itay", + "license": "ISC", + "dependencies": { + "shared-types": "^1.0.0" + } +} diff --git a/packages/app/.eslintrc.cjs b/packages/app/.eslintrc.cjs new file mode 100644 index 0000000..604b54d --- /dev/null +++ b/packages/app/.eslintrc.cjs @@ -0,0 +1,15 @@ +/* eslint-env node */ +module.exports = { + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "react-app", + "react-app/jest", + ], + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint", "tss-unused-classes"], + rules: { + "tss-unused-classes/unused-classes": "warn", + }, + root: true, +}; diff --git a/packages/app/index.html b/packages/app/index.html new file mode 100644 index 0000000..829f285 --- /dev/null +++ b/packages/app/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + Code Total By OX Security + + +
+ + + diff --git a/packages/app/package.json b/packages/app/package.json new file mode 100644 index 0000000..057a608 --- /dev/null +++ b/packages/app/package.json @@ -0,0 +1,53 @@ +{ + "name": "app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "start": "vite --clearScreen false", + "build": "tsc --noEmit && vite build", + "preview": "vite preview", + "lint": "npx eslint src --max-warnings=0", + "clean": "rm -rf dist" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.13.5", + "axios": "^1.4.0", + "filesize": "^10.0.7", + "lodash-es": "^4.17.21", + "md5": "^2.3.0", + "monaco-editor": "^0.40.0", + "react": "^18.2.0", + "react-countup": "^6.4.2", + "react-csv": "^2.2.2", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-icons": "^4.10.1", + "react-router-dom": "^6.13.0", + "shared-types": "^1.0.0", + "tss-react": "^4.8.6", + "zustand": "^4.3.8" + }, + "devDependencies": { + "@types/express": "^4.17.17", + "@types/lodash-es": "^4.17.8", + "@types/md5": "^2.3.2", + "@types/react": "^18.0.37", + "@types/react-csv": "^1.1.3", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "eslint-plugin-tss-unused-classes": "^0.0.4", + "express": "^4.18.2", + "typescript": "^5.0.2", + "vite": "^4.3.9", + "vite-plugin-checker": "^0.6.1" + } +} diff --git a/packages/app/public/favicon.png b/packages/app/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..65c29d798a6df36cd1b54671412fb6228318fb4d GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEdf3uu0T3C>VH5a7UUoKKM*Jd zk&S>V01Cnt!`c22*@*vvKv}SQkW@IjUXUzMB~V$!|BzUa;b95?Ba{F4b4`x`xCW@gxp`^l%J$khsnd3?JHWue z=;-O<7-Dhy?4;X4hYfgKM6LVg{$A^O`$9GMny3H&+xy(|WAm8zpz-swi>Iu$JO44S z-)<4V>TBVh38~_`oLBzyC^QuAl#m-dyiw&=x)z;tTJT}5dAe(d;IY&jWoINNGMzZSK=E)N$H}No0^h|Ww(xJ>VSMb0 z8nek7HgUDnMwj2RRS7NeoV4OefV0}{L;$@(*eUq0}&yX@^b<=Qzb<8A)+Pw&l5ULO*7L}|cZ8LzsQn!CT>o#|w^ zxY&h&h(@Qt4JsKj#{2c9FRc1$^CjN!-U0c~jCsdo{_Wz|ng)yj22WQ%mvv4FO#r*# B4jljh literal 0 HcmV?d00001 diff --git a/packages/app/public/robots.txt b/packages/app/public/robots.txt new file mode 100644 index 0000000..14267e9 --- /dev/null +++ b/packages/app/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / \ No newline at end of file diff --git a/packages/app/src/analysis/AnalysisPage.tsx b/packages/app/src/analysis/AnalysisPage.tsx new file mode 100644 index 0000000..8449780 --- /dev/null +++ b/packages/app/src/analysis/AnalysisPage.tsx @@ -0,0 +1,39 @@ +import { Theme } from "@mui/material"; +import { FC, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; +import { makeStyles } from "tss-react/mui"; +import { AnalysisHeader } from "./components/AnalysisHeader"; +import { AnalysisInputForm } from "./components/AnalysisInputForm"; + +const AnalysisPage: FC = () => { + const { classes } = useStyles(); + const navigate = useNavigate(); + + const handleAfterSubmit = useCallback( + (requestId: string) => { + navigate(`/report/${requestId}`); + }, + [navigate] + ); + + return ( +
+ +
+ +
+
+ ); +}; + +export default AnalysisPage; + +const useStyles = makeStyles()((theme: Theme) => ({ + main: { + marginBlockStart: theme.spacing(3), + maxWidth: 620, + marginInline: "auto", + borderRadius: 15, + overflow: "hidden", + }, +})); diff --git a/packages/app/src/analysis/actions/analysis-actions.ts b/packages/app/src/analysis/actions/analysis-actions.ts new file mode 100644 index 0000000..81f896f --- /dev/null +++ b/packages/app/src/analysis/actions/analysis-actions.ts @@ -0,0 +1,54 @@ +import axios from "axios"; +import { + Analysis, + AnalysisType, + FileAnalysis, + RepoAnalysis, + SnippetAnalysis, +} from "shared-types"; +import { backendUrl } from "../../common/utils/backend-url"; +import { AnalysisStore, AsyncState } from "../stores/analysis-store"; + +export const startAnalysis = async () => { + AnalysisStore.setState({ + sending: AsyncState.Loading, + }); + + try { + const data = createRequestData(); + const report = await axios.post(`${backendUrl}/analysis`, data, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); + AnalysisStore.getState().reset(); + return report.data.requestId; + } catch (err) { + console.error(err); + AnalysisStore.setState({ + sending: AsyncState.Error, + }); + } +}; + +const createRequestData = (): Analysis | undefined => { + const { inputType, repositoryURL, file, snippet, language } = + AnalysisStore.getState(); + const sharedVariables = { + name: "Lint", + inputType, + }; + + switch (inputType) { + case AnalysisType.Repo: + return { ...sharedVariables, url: repositoryURL } as RepoAnalysis; + case AnalysisType.File: + return { ...sharedVariables, file } as FileAnalysis; + case AnalysisType.Snippet: + return { + ...sharedVariables, + snippet, + language, + } as SnippetAnalysis; + } +}; diff --git a/packages/app/src/analysis/components/AnalysisHeader.tsx b/packages/app/src/analysis/components/AnalysisHeader.tsx new file mode 100644 index 0000000..7534c20 --- /dev/null +++ b/packages/app/src/analysis/components/AnalysisHeader.tsx @@ -0,0 +1,54 @@ +import { Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import oxAvatar from "../../assets/ox-avatar.svg"; + +export const AnalysisHeader: FC = () => { + const { classes } = useStyles(); + + return ( +
+ OX avatar + + CODE TOTAL + + + Analyze any snippet, file, or repository to detect possible security + flaws such as secret in code, open source vulnerability, code security, + vulnerability, insecure infrastructure as code, and potential legal + issues with open source licenses. + +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + header: { + paddingBlockStart: theme.spacing(6), + display: "flex", + alignItems: "center", + flexDirection: "column", + }, + avatar: { + marginInlineStart: -20, + width: 140, + height: "14vh", + }, + title: { + marginBlockStart: theme.spacing(1), + fontSize: "clamp(30px, 5vw, 50px)", + fontWeight: 800, + letterSpacing: 0.3, + }, + description: { + marginBlockStart: theme.spacing(3), + maxWidth: 420, + display: "inline-block", + lineHeight: 1.1, + textAlign: "justify", + }, +})); diff --git a/packages/app/src/analysis/components/AnalysisInputForm.tsx b/packages/app/src/analysis/components/AnalysisInputForm.tsx new file mode 100644 index 0000000..ee52efd --- /dev/null +++ b/packages/app/src/analysis/components/AnalysisInputForm.tsx @@ -0,0 +1,114 @@ +import { Alert, Paper, Tab, Tabs, Theme } from "@mui/material"; +import { FC, useCallback } from "react"; +import { AnalysisType, OneOfValues } from "shared-types"; +import { makeStyles } from "tss-react/mui"; +import { startAnalysis } from "../actions/analysis-actions"; +import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store"; +import { AnalysisTabPanel } from "./AnalysisTabPanel"; +import { CodeSnippetForm } from "./CodeSnippetForm"; +import { FileUploadForm } from "./FileUploadForm"; +import { RepositoryForm } from "./RepositoryForm"; + +export const AnalysisInputForm: FC = ({ + onAfterSubmit, +}) => { + const { classes } = useStyles(); + const { sending, inputType } = useAnalysisStore(); + + const handleFormTypeChange = ( + _: unknown, + newInputType: OneOfValues + ) => { + AnalysisStore.setState({ inputType: newInputType }); + }; + + const handleSubmit = useCallback(async () => { + const requestId = await startAnalysis(); + onAfterSubmit(requestId); + }, [onAfterSubmit]); + + return ( + +
+ + + + + +
+
+ {sending === "error" && ( + + Unable to start scanning, please try again later + + )} + + + + + + + + + +
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + inputForm: { + textAlign: "center", + transition: theme.transitions.create("all"), + display: "flex", + flexDirection: "column", + boxShadow: + theme.palette.mode === "light" + ? "0px 0px 10px 10px rgba(0, 3, 73, 0.02)" + : `0px 0px 10px 10px #00000010`, + width: "100%", + marginInline: "auto", + minHeight: 280, + }, + tabsContainer: { + borderBottom: 1, + borderColor: theme.palette.divider, + borderBottomStyle: "solid", + }, + tab: { + textTransform: "none", + "&:hover": { + color: theme.palette.primary.main, + }, + }, + tabPanel: { + flexGrow: 1, + position: "relative", + }, +})); + +interface AnalysisInputFormProps { + onAfterSubmit(requestId: string): void; +} + +export interface AnalysisFormProps { + onSubmit(): void; +} diff --git a/packages/app/src/analysis/components/AnalysisTabPanel.tsx b/packages/app/src/analysis/components/AnalysisTabPanel.tsx new file mode 100644 index 0000000..e913747 --- /dev/null +++ b/packages/app/src/analysis/components/AnalysisTabPanel.tsx @@ -0,0 +1,27 @@ +import { Box } from "@mui/material"; +import { FC, PropsWithChildren } from "react"; +import { AnalysisType, OneOfValues } from "shared-types"; + +export const AnalysisTabPanel: FC> = ( + props +) => { + const { children, value, selectedValue, ...other } = props; + + return ( + + ); +}; + +interface AnalysisTabPanelProps { + selectedValue: OneOfValues; + value: OneOfValues; +} diff --git a/packages/app/src/analysis/components/CodeSnippetForm.tsx b/packages/app/src/analysis/components/CodeSnippetForm.tsx new file mode 100644 index 0000000..ef4a328 --- /dev/null +++ b/packages/app/src/analysis/components/CodeSnippetForm.tsx @@ -0,0 +1,83 @@ +import { TextField, Theme, Typography } from "@mui/material"; +import { FC, useCallback } from "react"; +import { makeStyles } from "tss-react/mui"; +import { LanguageIcon } from "../../common/LanguageIcon"; +import { fetchDetect } from "../../common/utils/detect-lanauge-utils"; +import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store"; +import { AnalysisFormProps } from "./AnalysisInputForm"; +import { SubmitButton } from "./SubmitButton"; + +export const CodeSnippetForm: FC = ({ onSubmit }) => { + const { classes } = useStyles(); + const { snippet, snippetEnabled, sending, language } = useAnalysisStore(); + + const handleChange = useCallback((e: React.ChangeEvent) => { + const snippet = e.target.value; + AnalysisStore.setState({ snippet }); + fetchDetect(snippet); + }, []); + + return ( +
+ +
+
+ {language && language.name && ( +
+ {language.icon ? ( + + ) : ( + + {language.name} + + )} +
+ )} +
+ + Send Snippet + +
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + codeSnippetForm: { + display: "flex", + flexDirection: "column", + alignItems: "center", + gap: theme.spacing(2), + padding: theme.spacing(1), + }, + language: { + display: "flex", + gap: theme.spacing(1), + alignSelf: "flex-start", + }, + footer: { + display: "flex", + gap: theme.spacing(1), + alignSelf: "stretch", + justifyContent: "space-between", + }, +})); diff --git a/packages/app/src/analysis/components/FileUploadForm.tsx b/packages/app/src/analysis/components/FileUploadForm.tsx new file mode 100644 index 0000000..a5784b9 --- /dev/null +++ b/packages/app/src/analysis/components/FileUploadForm.tsx @@ -0,0 +1,138 @@ +import { + CircularProgress, + Theme, + Typography, + alpha, + darken, +} from "@mui/material"; +import { filesize } from "filesize"; +import { FC, useCallback, useState } from "react"; +import { FileRejection, useDropzone } from "react-dropzone"; +import { BiSolidCloudUpload } from "react-icons/bi"; +import { makeStyles } from "tss-react/mui"; +import config from "../../config"; +import { + AnalysisStore, + AsyncState, + useAnalysisStore, +} from "../stores/analysis-store"; +import { AnalysisFormProps } from "./AnalysisInputForm"; + +const MAX_SIZE = parseInt(config.CODETOTAL_UPLOAD_FILE_LIMIT_BYTES); + +export const FileUploadForm: FC = ({ onSubmit }) => { + const { classes } = useStyles(); + const { sending } = useAnalysisStore(); + const [error, setError] = useState(""); + + const onDrop = useCallback( + (files: File[], fileRejections: FileRejection[]) => { + if (fileRejections.length > 1) { + setError("Multiple files upload is not supported"); + return; + } + if ( + fileRejections.length === 1 && + fileRejections[0].errors[0].code === "file-too-large" + ) { + setError(`File too large (max allowed: ${filesize(MAX_SIZE)})`); + return; + } + if (fileRejections.length === 1) { + setError(fileRejections[0].errors[0].message); + return; + } + + const file = files[0]; + AnalysisStore.setState({ file }); + onSubmit(); + }, + [onSubmit] + ); + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + onDrop, + multiple: false, + maxSize: MAX_SIZE, + }); + + const uploading = sending === AsyncState.Loading; + + return ( +
+ + +
+ + {uploading && ( +
+ + + Uploading file + +
+ )} + {!uploading && ( + <> +
+ {isDragActive ? ( + + Release to upload... + + ) : ( + <> + + Drag and drop a file here +
+ or +
+ Click to browse +
+ {error && ( + + {error} + + )} + + )} +
+ + )} +
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + icon: { + fontSize: "5rem", + color: theme.palette.primary.main, + }, + container: { + outline: `2px dashed ${theme.palette.divider}`, + transition: theme.transitions.create("all", { + duration: theme.transitions.duration.short, + }), + "&:hover,&:focus-within": { + backgroundColor: + theme.palette.mode === "dark" + ? alpha(theme.palette.background.paper, 0.2) + : darken(theme.palette.background.paper, 0.05), + outline: "2px dashed", + outlineColor: + theme.palette.mode === "dark" + ? darken(theme.palette.divider, 0.3) + : darken(theme.palette.divider, 0.3), + }, + }, + uploading: { + display: "flex", + alignItems: "center", + justifyContent: "center", + gap: theme.spacing(1), + }, + dropZone: { + padding: theme.spacing(2), + cursor: "pointer", + }, +})); diff --git a/packages/app/src/analysis/components/RepositoryForm.tsx b/packages/app/src/analysis/components/RepositoryForm.tsx new file mode 100644 index 0000000..321f232 --- /dev/null +++ b/packages/app/src/analysis/components/RepositoryForm.tsx @@ -0,0 +1,47 @@ +import { FormControl, TextField, Theme } from "@mui/material"; +import { FC, useCallback } from "react"; +import { makeStyles } from "tss-react/mui"; +import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store"; +import { AnalysisFormProps } from "./AnalysisInputForm"; +import { SubmitButton } from "./SubmitButton"; + +export const RepositoryForm: FC = ({ onSubmit }) => { + const { classes } = useStyles(); + const { repositoryURL, repoEnabled, sending } = useAnalysisStore(); + + const handleChange = useCallback((e: React.ChangeEvent) => { + AnalysisStore.setState({ repositoryURL: e.target.value }); + }, []); + + return ( +
+ + + + + + Check Repository + +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + repositoryForm: { + display: "flex", + flexDirection: "column", + alignItems: "center", + gap: theme.spacing(2), + padding: theme.spacing(1), + }, +})); diff --git a/packages/app/src/analysis/components/SubmitButton.tsx b/packages/app/src/analysis/components/SubmitButton.tsx new file mode 100644 index 0000000..6536660 --- /dev/null +++ b/packages/app/src/analysis/components/SubmitButton.tsx @@ -0,0 +1,25 @@ +import { Button, ButtonProps, CircularProgress } from "@mui/material"; +import { FC } from "react"; +import { BiSend } from "react-icons/bi"; + +export const SubmitButton: FC = ({ loading, ...props }) => { + return ( + + + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + dialogContent: { + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + }, +})); diff --git a/packages/app/src/common/LanguageIcon.tsx b/packages/app/src/common/LanguageIcon.tsx new file mode 100644 index 0000000..c7df3ff --- /dev/null +++ b/packages/app/src/common/LanguageIcon.tsx @@ -0,0 +1,57 @@ +import { Theme, Tooltip, useTheme } from "@mui/material"; +import { FC } from "react"; +import { ProgrammingLanguage } from "shared-types"; +import { makeStyles } from "tss-react/mui"; + +export const LanguageIcon: FC = ({ language }) => { + const { classes, cx } = useStyles(); + const theme = useTheme(); + const isDarkmode = theme.palette.mode === "dark"; + if (!language) { + return null; + } + + // only is dark mode and only for "plain" type icons + // they require a background since when used with an img tag + // colors can't be applied through css and we end up with a black colored icon + const requiresBackground = isDarkmode && language.icon === "plain"; + + return ( + + + programming language icon + + + ); +}; +const useStyles = makeStyles()((theme: Theme) => ({ + languageIcon: { + display: "inline-flex", + height: "2em", + width: "2em", + }, + img: { + width: "100%", + height: "100%", + }, + darkmode: { + backgroundColor: theme.palette.text.secondary, + borderRadius: "50%", + display: "inline-flex", + }, +})); + +interface LanguageIconProps { + language?: ProgrammingLanguage; +} diff --git a/packages/app/src/common/utils/backend-url.ts b/packages/app/src/common/utils/backend-url.ts new file mode 100644 index 0000000..4017bb6 --- /dev/null +++ b/packages/app/src/common/utils/backend-url.ts @@ -0,0 +1,11 @@ +import config from "../../config"; + +const port = config.CODETOTAL_HTTP_PORT; +const host = config.CODETOTAL_HTTP_HOST; +const prefix = "api"; + +export const backendUrl = + port === "80" || port === undefined + ? `//${host}/${prefix}` + : `//${host}:${port}/${prefix}`; + \ No newline at end of file diff --git a/packages/app/src/common/utils/detect-lanauge-utils.ts b/packages/app/src/common/utils/detect-lanauge-utils.ts new file mode 100644 index 0000000..25885a1 --- /dev/null +++ b/packages/app/src/common/utils/detect-lanauge-utils.ts @@ -0,0 +1,15 @@ +import axios from "axios"; +import debounce from "lodash-es/debounce"; +import { ProgrammingLanguage } from "shared-types"; +import { AnalysisStore } from "../../analysis/stores/analysis-store"; +import { backendUrl } from "./backend-url"; + +export const detect = async (snippet: string) => { + const res = await axios.post( + `${backendUrl}/detect`, + { snippet } + ); + AnalysisStore.setState({ language: res.data }); +}; + +export const fetchDetect = debounce(detect, 1000); diff --git a/packages/app/src/config.ts b/packages/app/src/config.ts new file mode 100644 index 0000000..71ea9e4 --- /dev/null +++ b/packages/app/src/config.ts @@ -0,0 +1,18 @@ +interface FEConfig { + CODETOTAL_HTTP_PORT: string; + CODETOTAL_HTTP_HOST: string; + CODETOTAL_WS_PORT: string; + CODETOTAL_WS_HOST: string; + CODETOTAL_UPLOAD_FILE_LIMIT_BYTES: string; +} + +const config: FEConfig = { + CODETOTAL_HTTP_PORT: import.meta.env.CODETOTAL_HTTP_PORT, + CODETOTAL_HTTP_HOST: import.meta.env.CODETOTAL_HTTP_HOST, + CODETOTAL_WS_PORT: import.meta.env.CODETOTAL_WS_PORT, + CODETOTAL_WS_HOST: import.meta.env.CODETOTAL_WS_HOST, + CODETOTAL_UPLOAD_FILE_LIMIT_BYTES: import.meta.env + .CODETOTAL_UPLOAD_FILE_LIMIT_BYTES, +}; + +export default config; diff --git a/packages/app/src/index.css b/packages/app/src/index.css new file mode 100644 index 0000000..59418d1 --- /dev/null +++ b/packages/app/src/index.css @@ -0,0 +1,143 @@ +@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700&display=swap"); + +body { + overflow-y: scroll; + + /* background-color: #eff0f5 !important; */ +} + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +body { + line-height: 1; +} + +ol, +ul { + list-style: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote::before, +blockquote::after, +q::before, +q::after { + content: ""; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx new file mode 100644 index 0000000..7e9236c --- /dev/null +++ b/packages/app/src/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { App } from "./app/components/App"; +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + +); diff --git a/packages/app/src/report/ReportPage.tsx b/packages/app/src/report/ReportPage.tsx new file mode 100644 index 0000000..46e4bb0 --- /dev/null +++ b/packages/app/src/report/ReportPage.tsx @@ -0,0 +1,39 @@ +import { FC, useEffect } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { AnalysisErrorDialog } from "../common/AnalysisErrorDialog"; +import { initReport } from "./actions/init-report-action"; +import { IssuesTable } from "./components/IssuesTable"; +import { NewAnalysisDialog } from "./components/NewAnalysisDialog"; +import { ReportDrawer } from "./components/ReportDrawer"; +import { ReportHeader } from "./components/ReportHeader"; +import { ReportTabs } from "./components/ReportTabs"; + +const ReportPage: FC = () => { + const { requestId } = useParams(); + const navigate = useNavigate(); + + useEffect(() => { + (async () => { + if (requestId) { + const success = await initReport(requestId); + if (!success) { + navigate("/"); + } + } + })(); + }, [requestId, navigate]); + + return ( +
+ + + + + + + +
+ ); +}; + +export default ReportPage; diff --git a/packages/app/src/report/actions/error-report-action.ts b/packages/app/src/report/actions/error-report-action.ts new file mode 100644 index 0000000..026edda --- /dev/null +++ b/packages/app/src/report/actions/error-report-action.ts @@ -0,0 +1,8 @@ +import { ReportStore } from "../stores/fe-report-store"; + +export const resetReport = () => { + const { unsubscribe, reset } = ReportStore.getState(); + + unsubscribe && unsubscribe(); + reset(); +}; diff --git a/packages/app/src/report/actions/init-report-action.ts b/packages/app/src/report/actions/init-report-action.ts new file mode 100644 index 0000000..fd8e61f --- /dev/null +++ b/packages/app/src/report/actions/init-report-action.ts @@ -0,0 +1,29 @@ +import axios from "axios"; +import { AnalysisStatus } from "shared-types"; +import { backendUrl } from "../../common/utils/backend-url"; +import { ReportStore } from "../stores/fe-report-store"; +import { subscribeToReportProgress } from "./subscribe-report-action"; + +export const initReport = async (requestId: string) => { + try { + // reset report store + ReportStore.getState().reset(); + + // fetch report + const res = await axios.get(`${backendUrl}/report/${requestId}`); + + const { status } = res.data; + switch (status) { + case AnalysisStatus.Created: + subscribeToReportProgress(requestId); + break; + case AnalysisStatus.NotFound: + return false; + } + + ReportStore.setState(res.data); + return true; + } catch (err) { + console.error(err); + } +}; diff --git a/packages/app/src/report/actions/subscribe-report-action.ts b/packages/app/src/report/actions/subscribe-report-action.ts new file mode 100644 index 0000000..661fa59 --- /dev/null +++ b/packages/app/src/report/actions/subscribe-report-action.ts @@ -0,0 +1,39 @@ +import { AnalysisStatus, ReportState } from "shared-types"; +import { ReportStore } from "../stores/fe-report-store"; +import { subscribe } from "../utils/ws-client"; + +let unsubscribe: () => void; + +export const subscribeToReportProgress = (requestId: string) => { + // unsubscribe from previous connection + unsubscribe && unsubscribe(); + + // clear previous error + ReportStore.setState({ wsError: undefined }); + + unsubscribe = subscribe({ + requestId, + onMessage: (msg: Partial) => { + const completed = msg.status && msg.status === AnalysisStatus.Completed; + const error = !!msg.analysisError; + if (completed || error) { + // close ws connection on completed/error + unsubscribe(); + } + ReportStore.setState({ ...msg }); + }, + onError: () => { + ReportStore.setState({ + wsError: "Web socket connection error", + }); + }, + onClose: () => { + const { inProgress } = ReportStore.getState(); + inProgress && + ReportStore.setState({ + wsError: "Web socket connection closed while scanning", + }); + }, + }); + ReportStore.setState({ unsubscribe }); +}; diff --git a/packages/app/src/report/components/BackButton.tsx b/packages/app/src/report/components/BackButton.tsx new file mode 100644 index 0000000..3e4899e --- /dev/null +++ b/packages/app/src/report/components/BackButton.tsx @@ -0,0 +1,21 @@ +import { IconButton, Tooltip } from "@mui/material"; +import { FC, SyntheticEvent } from "react"; +import { IoMdArrowBack } from "react-icons/io"; +import { useNavigate } from "react-router-dom"; + +export const BackButton: FC = () => { + const navigate = useNavigate(); + + const navigateBack = (e: SyntheticEvent) => { + e.preventDefault(); + navigate("/"); + }; + + return ( + + + + + + ); +}; diff --git a/packages/app/src/report/components/Details.tsx b/packages/app/src/report/components/Details.tsx new file mode 100644 index 0000000..c86c373 --- /dev/null +++ b/packages/app/src/report/components/Details.tsx @@ -0,0 +1,137 @@ +import { Paper, Theme, Typography } from "@mui/material"; +import { filesize } from "filesize"; +import { FC } from "react"; +import { AnalysisType } from "shared-types"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; + +export const Details: FC = () => { + const { classes } = useStyles(); + const { repoDetails, fileDetails, resourceType } = useReportStore(); + + const emptyMessage = ( + + No details found + + ); + + // DevSkim: ignore DS126858 + return ( + + {resourceType === AnalysisType.File && ( + <> + {!fileDetails && emptyMessage} + {fileDetails && ( + <> + + + + + + + )} + + )} + {resourceType === AnalysisType.Repo && ( + <> + {!repoDetails && emptyMessage} + {repoDetails && ( + <> + `${language.name} ${language.percentage}%`) + .join(" | ")} + /> + + + + + + + + + v{repoDetails.latestVersion}   + {new Date( + repoDetails.latestVersionDate + ).toLocaleDateString()}{" "} + + + {repoDetails.releases} releases + + + + )} + + )} + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + reportDetails: { + padding: theme.spacing(3), + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + position: "relative", + wordBreak: "break-word", + }, + label: { + fontWeight: 600, + paddingBlock: theme.spacing(0.5), + }, + primaryColor: { + color: theme.palette.primary.main, + }, +})); + +const DetailsItem: FC< + { label: string; value: string | number } & Partial<{ + component: string; + href: string; + target: string; + className?: string; + }> +> = ({ label, value, ...typograpyProps }) => { + const { classes, cx } = useStyles(); + + return ( +
+ + {label} + + + {value} + +
+ ); +}; diff --git a/packages/app/src/report/components/Detection.tsx b/packages/app/src/report/components/Detection.tsx new file mode 100644 index 0000000..59b3843 --- /dev/null +++ b/packages/app/src/report/components/Detection.tsx @@ -0,0 +1,25 @@ +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; +import { LintersList } from "./LintersList"; +import { Loader } from "./Loader"; + +export const Detection: FC = () => { + const { classes } = useStyles(); + const { linters = [] } = useReportStore(); + const loading = linters.length === 0; + + return ( +
+ {loading && } + {!loading && } +
+ ); +}; + +const useStyles = makeStyles()(() => ({ + detection: { + height: "100%", + position: "relative", + }, +})); diff --git a/packages/app/src/report/components/DownloadAllIssuesButton.tsx b/packages/app/src/report/components/DownloadAllIssuesButton.tsx new file mode 100644 index 0000000..4606517 --- /dev/null +++ b/packages/app/src/report/components/DownloadAllIssuesButton.tsx @@ -0,0 +1,60 @@ +import { Button, Theme, Tooltip } from "@mui/material"; +import { FC } from "react"; +import { CSVLink } from "react-csv"; +import { MdCloudDownload } from "react-icons/md"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; + +export const DownloadAllIssuesButton: FC = () => { + const { classes } = useStyles(); + const { allIssues, requestId } = useReportStore(); + + const disabled = allIssues().length === 0; + const button = ( + + ); + const downloadLink = ( + + {button} + + ); + + return ( + + {disabled ? button : downloadLink} + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + exportToCSV: { + display: "inline-flex", + alignItems: "center", + gap: theme.spacing(1), + color: theme.palette.primary.main, + fontWeight: 400, + textDecoration: "none", + "&:hover": { + textDecoration: "underline", + }, + }, +})); diff --git a/packages/app/src/report/components/IssuesTable.tsx b/packages/app/src/report/components/IssuesTable.tsx new file mode 100644 index 0000000..8c58e6b --- /dev/null +++ b/packages/app/src/report/components/IssuesTable.tsx @@ -0,0 +1,87 @@ +import { Theme, Typography } from "@mui/material"; +import { FC, useMemo } from "react"; +import { Issue } from "shared-types"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; +import { ResponsiveTable, TableOptions } from "./ResponsiveTable"; +import { SeverityBadge } from "./SeverityBadge"; + +export const IssuesTable: FC = () => { + const { classes } = useStyles(); + const { selectedLinterName, linters = [] } = useReportStore(); + + const selectedLinter = linters.find( + (linter) => linter.name === selectedLinterName + ); + + const tableOptions = useMemo>( + () => ({ + emptyMessage: `No issues found for ${selectedLinter?.name}`, + cells: [ + { label: "Rule", key: "ruleId" }, + { label: "Title", key: "title" }, + { + label: "Severity", + cellRenderer: (row) => , + }, + { label: "Location", key: "location" }, + { + label: "Line #", + key: "lineNumber", + headerCellStyle: { whiteSpace: "nowrap" }, + }, + ], + }), + [selectedLinter?.name] + ); + + if (!selectedLinterName) { + return null; + } + + return ( +
+ {selectedLinter && ( +
+ + {selectedLinter?.name}  ( + + docs + + ) + + {selectedLinter.severity && ( + + )} +
+ )} + +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + header: { + paddingBlockEnd: theme.spacing(2), + marginBlockEnd: theme.spacing(2), + display: "flex", + flexDirection: "column", + gap: theme.spacing(1), + }, + link: { + color: theme.palette.primary.main, + fontWeight: 400, + textDecoration: "none", + "&:hover": { + textDecoration: "underline", + }, + }, +})); diff --git a/packages/app/src/report/components/LinterStatus.tsx b/packages/app/src/report/components/LinterStatus.tsx new file mode 100644 index 0000000..5d842f2 --- /dev/null +++ b/packages/app/src/report/components/LinterStatus.tsx @@ -0,0 +1,42 @@ +import { CircularProgress, Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { Linter } from "../fe-report-types"; +import { SeverityBadge } from "./SeverityBadge"; + +export const LinterStatus: FC = ({ status, severity }) => { + const { classes } = useStyles(); + + return ( +
+ {status === "started" ? ( + <> + + Scanning + + ) : ( + <> + {severity ? ( + + ) : ( + + )} + + )} +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + linterStatus: { + display: "inline-flex", + alignItems: "center", + gap: theme.spacing(1), + minWidth: 80, + }, +})); + +interface LinterStatusProps { + status: Linter["status"]; + severity?: Linter["severity"]; +} diff --git a/packages/app/src/report/components/LintersList.tsx b/packages/app/src/report/components/LintersList.tsx new file mode 100644 index 0000000..d5f1a92 --- /dev/null +++ b/packages/app/src/report/components/LintersList.tsx @@ -0,0 +1,89 @@ +import { + List, + ListItem, + ListItemButton, + Paper, + Theme, + Typography, +} from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { ReportStore, useReportStore } from "../stores/fe-report-store"; +import { LinterStatus } from "./LinterStatus"; + +export const LintersList: FC = () => { + const { classes } = useStyles(); + const { linters = [], issuesCount, selectedLinterName } = useReportStore(); + + const handleToolClick = (name: string) => { + ReportStore.setState({ selectedLinterName: name }); + }; + + return ( + + + {linters.map((linter, index) => { + const issues = issuesCount(linter.name); + + return ( + + handleToolClick(linter.name)} + className={classes.listItem} + > + + {linter.name} + + +
+ {issues > 0 && ( + + {issues} issues + + )} + + +
+
+
+ ); + })} +
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + lintersList: { + overflow: "hidden", + }, + list: { + listStyle: "none", + padding: 0, + margin: 0, + }, + listItem: { + minHeight: 50, + }, + toolName: { + flexGrow: 1, + textOverflow: "ellipsis", + overflow: "hidden", + display: "-webkit-box", + whiteSpace: "normal", + WebkitLineClamp: 2, + WebkitBoxOrient: "vertical", + }, + statsContainer: { + display: "flex", + gap: theme.spacing(2), + }, +})); diff --git a/packages/app/src/report/components/Loader.tsx b/packages/app/src/report/components/Loader.tsx new file mode 100644 index 0000000..e8d78e2 --- /dev/null +++ b/packages/app/src/report/components/Loader.tsx @@ -0,0 +1,35 @@ +import { CircularProgress, Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; + +export const Loader: FC = ({ text }) => { + const { classes } = useStyles(); + + return ( +
+ + {text && ( + + {text} + + )} +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + loader: { + position: "absolute", + inset: 0, + margin: "auto", + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + alignItems: "center", + justifyContent: "center", + }, +})); + +interface LoaderProps { + text?: string; +} diff --git a/packages/app/src/report/components/NewAnalysisDialog.tsx b/packages/app/src/report/components/NewAnalysisDialog.tsx new file mode 100644 index 0000000..8b79de5 --- /dev/null +++ b/packages/app/src/report/components/NewAnalysisDialog.tsx @@ -0,0 +1,52 @@ +import { + Button, + Dialog, + DialogActions, + DialogContent, + Theme, +} from "@mui/material"; +import { FC, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; +import { makeStyles } from "tss-react/mui"; +import { AnalysisInputForm } from "../../analysis/components/AnalysisInputForm"; +import { useReportStore } from "../stores/fe-report-store"; + +export const NewAnalysisDialog: FC = () => { + const { classes } = useStyles(); + const { newAnalysisDialogOpen, closeNewAnalysisDialog } = useReportStore(); + const navigate = useNavigate(); + + const handleAfterSubmit = useCallback( + (requestId: string) => { + closeNewAnalysisDialog(); + navigate(`/report/${requestId}`); + }, + [closeNewAnalysisDialog, navigate] + ); + + return ( + + + + + + + + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + dialogContent: { + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + padding: 0, + }, +})); diff --git a/packages/app/src/report/components/ReportDrawer.tsx b/packages/app/src/report/components/ReportDrawer.tsx new file mode 100644 index 0000000..d3e4fa8 --- /dev/null +++ b/packages/app/src/report/components/ReportDrawer.tsx @@ -0,0 +1,71 @@ +import { + Dialog, + DialogContent, + DialogTitle, + Divider, + IconButton, + Theme, + useMediaQuery, + useTheme, +} from "@mui/material"; +import Drawer from "@mui/material/Drawer"; +import { FC, PropsWithChildren } from "react"; +import { IoCloseSharp } from "react-icons/io5"; +import { makeStyles } from "tss-react/mui"; +import { ReportStore, useReportStore } from "../stores/fe-report-store"; + +export const ReportDrawer: FC = ({ children }) => { + const theme = useTheme(); + const { classes } = useStyles(); + const matches = useMediaQuery(theme.breakpoints.up("md")); + const { selectedLinterName } = useReportStore(); + + const closeDrawer = () => { + ReportStore.setState({ selectedLinterName: undefined }); + }; + + const closeButton = ( + + + + ); + + if (matches) { + return ( + +
+
{closeButton}
+
{children}
+
+
+ ); + } + + return ( + + {closeButton} + + {children} + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + drawer: { width: "75vw" }, + drawerPaper: { + backgroundColor: theme.palette.background.default, + }, + header: { + paddingBlockStart: theme.spacing(2), + paddingInlineEnd: theme.spacing(2), + textAlign: "end", + }, + main: { + padding: theme.spacing(2), + }, +})); diff --git a/packages/app/src/report/components/ReportHeader.tsx b/packages/app/src/report/components/ReportHeader.tsx new file mode 100644 index 0000000..0760bc1 --- /dev/null +++ b/packages/app/src/report/components/ReportHeader.tsx @@ -0,0 +1,155 @@ +import { + Divider, + Paper, + Theme, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { LanguageIcon } from "../../common/LanguageIcon"; +import { useReportStore } from "../stores/fe-report-store"; +import { ReportHeaderSection } from "./ReportHeaderSection"; +import { ReportToolbar } from "./ReportToolbar"; +import { Score } from "./Score"; + +export const ReportHeader: FC = ({ ready }) => { + const { classes } = useStyles(); + const theme = useTheme(); + const isMobile = !useMediaQuery(theme.breakpoints.up("md")); + const { + score, + scoreColor, + resourceType, + resourceValue, + linters = [], + lintersWithIssues, + progress, + language, + } = useReportStore(); + + if (!lintersWithIssues) { + return null; + } + const lintersWithIssuesCount = lintersWithIssues(); + const scoreColorKey = scoreColor(); + const color = theme.palette[scoreColorKey].main || theme.palette.divider; + + return ( + +
+ + {linters.length === 0 && <>Scanning {resourceType}...} + {linters.length > 0 && ( + <> + {lintersWithIssuesCount} / {linters.length} security linters + flagged this {resourceType} to have security issues + + )} + +
+ + + +
+ + +
+ +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + reportBanner: { + columnGap: theme.spacing(4), + gridTemplateColumns: "1fr auto", + borderTop: "solid 6px", + minHeight: 170, + padding: theme.spacing(1, 2), + borderBottomLeftRadius: 15, + borderBottomRightRadius: 15, + display: "flex", + flexDirection: "column-reverse", + alignItems: "center", + gap: theme.spacing(2), + [theme.breakpoints.up("md")]: { + flexDirection: "row", + justifyContent: "space-between", + }, + }, + textContainer: { + flexGrow: 1, + [theme.breakpoints.up("md")]: { + display: "flex", + flexDirection: "column", + justifyContent: "space-between", + }, + }, + title: { + textAlign: "center", + fontSize: "1rem", + fontWeight: 700, + [theme.breakpoints.up("md")]: { + fontSize: "1.562rem", + marginBlockStart: theme.spacing(2), + textAlign: "start", + }, + }, + statsContainer: { + paddingBlockStart: theme.spacing(2), + display: "flex", + flexDirection: "column", + gap: theme.spacing(4), + maxWidth: 600, + [theme.breakpoints.up("md")]: { + flexDirection: "row", + alignItems: "flex-end", + }, + }, + score: { + height: 80, + width: 80, + [theme.breakpoints.up("md")]: { + height: 120, + width: 120, + }, + }, + nowrap: { + wordBreak: "keep-all", + }, + resourceValue: { + maxWidth: 600, + whiteSpace: "nowrap", + }, +})); + +interface ReportBannerProps { + ready: boolean; +} diff --git a/packages/app/src/report/components/ReportHeaderSection.tsx b/packages/app/src/report/components/ReportHeaderSection.tsx new file mode 100644 index 0000000..0dc6d48 --- /dev/null +++ b/packages/app/src/report/components/ReportHeaderSection.tsx @@ -0,0 +1,50 @@ +import { Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; + +export const ReportHeaderSection: FC = ({ + label, + value, + valueClassName, + dataCy, +}) => { + const { classes } = useStyles(); + + return ( +
+ + {label} + + + {value} + +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + stat: { + "& > p": { + color: theme.palette.text.secondary, + }, + "& > div": { + marginBlockStart: theme.spacing(0.5), + color: theme.palette.text.primary, + fontWeight: "bold", + textOverflow: "ellipsis", + overflow: "hidden", + }, + }, +})); + +interface BannerStatProps { + label: string; + value: string | number; + valueClassName?: string; + dataCy?: string; +} diff --git a/packages/app/src/report/components/ReportPanel.tsx b/packages/app/src/report/components/ReportPanel.tsx new file mode 100644 index 0000000..099a413 --- /dev/null +++ b/packages/app/src/report/components/ReportPanel.tsx @@ -0,0 +1,50 @@ +import { Theme, Typography } from "@mui/material"; +import { FC, PropsWithChildren, ReactNode } from "react"; +import { makeStyles } from "tss-react/mui"; + +export const ReportPanel: FC> = ({ + title, + children, +}) => { + const { classes } = useStyles(); + + return ( +
+
+ {title} + + Do you want to automate checks? + +
+
{children}
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + header: { + display: "flex", + flexDirection: "column-reverse", + justifyContent: "space-between", + paddingBlock: theme.spacing(2), + gap: theme.spacing(2), + [theme.breakpoints.up("md")]: { + flexDirection: "row", + }, + }, + main: { + display: "grid", + position: "relative", + minHeight: "50vh", + }, +})); + +interface ReportPanelProps { + title: ReactNode; +} diff --git a/packages/app/src/report/components/ReportTabPanel.tsx b/packages/app/src/report/components/ReportTabPanel.tsx new file mode 100644 index 0000000..1979efb --- /dev/null +++ b/packages/app/src/report/components/ReportTabPanel.tsx @@ -0,0 +1,25 @@ +import { FC, PropsWithChildren } from "react"; + +export const ReportTabPanel: FC> = ( + props +) => { + const { children, value, index, ...other } = props; + + return ( + + ); +}; + +interface ReportTabPanelProps { + index: number; + value: number; +} diff --git a/packages/app/src/report/components/ReportTabs.tsx b/packages/app/src/report/components/ReportTabs.tsx new file mode 100644 index 0000000..1a95aa0 --- /dev/null +++ b/packages/app/src/report/components/ReportTabs.tsx @@ -0,0 +1,102 @@ +import { + Box, + Tab, + Tabs, + Theme, + Typography, + alpha, + useMediaQuery, + useTheme, +} from "@mui/material"; +import { FC, useState } from "react"; +import { makeStyles } from "tss-react/mui"; +import { ReportType } from "../fe-report-types"; +import { Details } from "./Details"; +import { Detection } from "./Detection"; +import { ReportPanel } from "./ReportPanel"; +import { ReportTabPanel } from "./ReportTabPanel"; +import { SBOMTable } from "./SBOMTable"; + +export const ReportTabs: FC = () => { + const theme = useTheme(); + const { classes } = useStyles(); + const matches = useMediaQuery(theme.breakpoints.up("md")); + const [panelType, setPanelType] = useState(ReportType.Detection); + + const handlePanelTypeChange = (_: unknown, value: number) => { + setPanelType(value); + }; + + return ( + <> + + + + + + + + + Security tools' analysis + } + > + + + + + Resource}> +
+ + + + SBOM Packages} + > + + + + + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + tab: { + textTransform: "none", + + transition: theme.transitions.create("background"), + [theme.breakpoints.up("md")]: { + minWidth: 180, + borderTopRightRadius: 15, + borderTopLeftRadius: 15, + }, + }, + selectedTab: { + background: alpha("#6837FF", 0.1), + }, +})); diff --git a/packages/app/src/report/components/ReportToolbar.tsx b/packages/app/src/report/components/ReportToolbar.tsx new file mode 100644 index 0000000..d45120d --- /dev/null +++ b/packages/app/src/report/components/ReportToolbar.tsx @@ -0,0 +1,41 @@ +import { Button, Divider, Theme } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; +import { BackButton } from "./BackButton"; +import { DownloadAllIssuesButton } from "./DownloadAllIssuesButton"; + +export const ReportToolbar: FC = () => { + const { classes } = useStyles(); + const { openNewAnalysisDialog } = useReportStore(); + + return ( +
+ + + + + + +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + reportToolbar: { + display: "flex", + alignItems: "center", + gap: theme.spacing(2), + paddingBlockStart: theme.spacing(1), + justifyContent: "space-between", + }, +})); diff --git a/packages/app/src/report/components/ResponsiveList.tsx b/packages/app/src/report/components/ResponsiveList.tsx new file mode 100644 index 0000000..0d6b9d0 --- /dev/null +++ b/packages/app/src/report/components/ResponsiveList.tsx @@ -0,0 +1,13 @@ +// import { Theme } from "@mui/material"; +// import { FC } from "react"; +// import { makeStyles } from "tss-react/mui"; + +// export const ResponsiveList: FC = (props) => { +// const { classes } = useStyles(); +// return
; +// }; + +// const useStyles = makeStyles()((theme: Theme) => ({})); + +// interface ResponsiveListProps {} +export {}; diff --git a/packages/app/src/report/components/ResponsiveTable.tsx b/packages/app/src/report/components/ResponsiveTable.tsx new file mode 100644 index 0000000..1ca298d --- /dev/null +++ b/packages/app/src/report/components/ResponsiveTable.tsx @@ -0,0 +1,158 @@ +import { + List, + ListItem, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Theme, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import { CSSProperties, Fragment, ReactNode } from "react"; +import { makeStyles } from "tss-react/mui"; + +export const ResponsiveTable =

({ + options, + data, +}: ResponsiveTableProps

) => { + const { classes } = useStyles(); + const theme = useTheme(); + const matches = useMediaQuery(theme.breakpoints.up("md")); + const { cells } = options; + + if (!data || data.length === 0) { + return ( + + + {options.emptyMessage} + + + ); + } + + if (!matches) { + return ( + + + {data.map((row, index) => ( + +

+ {cells.map((cell, cellIndex) => ( +
+ + {cell.label} + + {cell.key && ( + + {row[cell.key]} + + )} + {cell.cellRenderer && <>{cell.cellRenderer(row)}} +
+ ))} +
+ + ))} + + + ); + } + + return ( + + + + + {cells.map((cell, cellIndex) => ( + + {cell.label} + + ))} + + + + {data.map((row, index) => ( + + {cells.map((cell, cellIndex) => ( + + {cell.key && ( + + {row[cell.key]} + + )} + {cell.cellRenderer && ( + + {cell.cellRenderer(row)} + + )} + + ))} + + ))} + +
+
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + headerCell: { + fontWeight: 400, + fontSize: theme.typography.caption.fontSize, + }, + bodyCell: { + height: 50, + padding: theme.spacing(1, 2), + }, + tableRow: { + "&:last-of-type td": { + borderBottom: "none", + }, + }, + listItem: { + padding: theme.spacing(2, 2, 3), + }, + listItemContent: { + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + }, +})); + +interface ResponsiveTableProps { + options: TableOptions; + data: TData[]; +} + +export interface CellOptions { + key?: keyof TData; + label?: string; + cellRenderer?: (row: TData) => ReactNode; + headerCellStyle?: CSSProperties; +} + +export interface TableOptions { + emptyMessage: string; + cells: CellOptions[]; +} diff --git a/packages/app/src/report/components/SBOMTable.tsx b/packages/app/src/report/components/SBOMTable.tsx new file mode 100644 index 0000000..a79d0d5 --- /dev/null +++ b/packages/app/src/report/components/SBOMTable.tsx @@ -0,0 +1,25 @@ +import { FC } from "react"; +import { SbomPackage } from "shared-types"; +import { useReportStore } from "../stores/fe-report-store"; +import { ResponsiveTable, TableOptions } from "./ResponsiveTable"; +import { SeverityBadge } from "./SeverityBadge"; + +export const SBOMTable: FC = () => { + const { packages } = useReportStore(); + return ; +}; + +const tableOptions: TableOptions = { + emptyMessage: "No packages information found", + cells: [ + { label: "Name", key: "packageName" }, + { label: "Version", key: "packageVersion" }, + { + label: "Severity", + cellRenderer: (row) => , + }, + { label: "License", key: "license" }, + { label: "Registry", key: "registry" }, + { label: "File Path", key: "filePath" }, + ], +}; diff --git a/packages/app/src/report/components/SarifInfo.tsx b/packages/app/src/report/components/SarifInfo.tsx new file mode 100644 index 0000000..e8a34aa --- /dev/null +++ b/packages/app/src/report/components/SarifInfo.tsx @@ -0,0 +1,36 @@ +import { Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { makeStyles } from "tss-react/mui"; +import { useReportStore } from "../stores/fe-report-store"; +import { SeverityBadge } from "./SeverityBadge"; + +export const SarifInfo: FC = () => { + const { classes } = useStyles(); + const { selectedLinterName, linters = [] } = useReportStore(); + const selectedLinter = linters.find( + (linter) => linter.name === selectedLinterName + ); + + if (!selectedLinter) { + return null; + } + + return ( +
+ + {selectedLinterName} + + {selectedLinter.severity && ( + + )} +
+ ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + sarifInfo: { + display: "flex", + flexDirection: "column", + gap: theme.spacing(2), + }, +})); diff --git a/packages/app/src/report/components/Score.tsx b/packages/app/src/report/components/Score.tsx new file mode 100644 index 0000000..36a218a --- /dev/null +++ b/packages/app/src/report/components/Score.tsx @@ -0,0 +1,127 @@ +import { Theme, Typography } from "@mui/material"; +import Box from "@mui/material/Box/Box"; +import CircularProgress, { + CircularProgressProps, +} from "@mui/material/CircularProgress/CircularProgress"; +import { FC, LegacyRef, useEffect, useState } from "react"; +import CountUp from "react-countup"; +import { makeStyles } from "tss-react/mui"; + +const TIMEOUT_IN_SECONDS = 1; +const sharedProps: Partial = { + variant: "determinate", + thickness: 5, +}; + +export const Score: FC = ({ + value, + color, + ready, + size, + className, +}) => { + const { classes } = useStyles(); + const [progress, setProgress] = useState(0); + + useEffect(() => { + if (value > 0) { + setProgress(value); + } + }, [value, progress]); + + return ( + + +
+ {/* The background for the "incomplete" CircularProgress above */} + + {ready && ( +
+ + {({ countUpRef }) => ( +
} + className={classes.countUp} + style={{ color }} + data-cy="score" + /> + )} + + + Score + +
+ )} +
+ + ); +}; + +const useStyles = makeStyles()((theme: Theme) => ({ + circle: { + transitionDuration: `${TIMEOUT_IN_SECONDS}s`, + }, + centerAbsolute: { + top: 0, + left: 0, + bottom: 0, + right: 0, + position: "absolute", + display: "flex", + alignItems: "center", + justifyContent: "center", + }, + counterContainer: { + textAlign: "center", + }, + countUp: { + fontSize: 20, + [theme.breakpoints.up("sm")]: { + fontSize: 35, + }, + fontWeight: 700, + lineHeight: 1, + }, + label: { + fontSize: theme.typography.caption.fontSize, + }, +})); + +interface ScoreProps extends Omit { + value: number; + ready: boolean; + className?: string; + color: string; +} diff --git a/packages/app/src/report/components/SeverityBadge.tsx b/packages/app/src/report/components/SeverityBadge.tsx new file mode 100644 index 0000000..23f5560 --- /dev/null +++ b/packages/app/src/report/components/SeverityBadge.tsx @@ -0,0 +1,63 @@ +import { Theme, Typography } from "@mui/material"; +import { FC } from "react"; +import { BsExclamation } from "react-icons/bs"; +import { IoMdCheckmarkCircleOutline } from "react-icons/io"; +import { MdErrorOutline, MdOutlineWarningAmber } from "react-icons/md"; +import { TbUrgent } from "react-icons/tb"; +import { OneOfValues, Severity } from "shared-types"; +import { makeStyles } from "tss-react/mui"; + +export const SeverityBadge: FC = ({ severity }) => { + const { classes } = useStyles(); + const color = colorsMap.get(severity); + const Icon = iconsMap.get(severity); + + return ( + + + + {severity} + + + ); +}; + +const iconsMap = new Map([ + [Severity.Critical, TbUrgent], + [Severity.High, MdErrorOutline], + [Severity.Medium, MdOutlineWarningAmber], + [Severity.Low, BsExclamation], + [Severity.Clean, IoMdCheckmarkCircleOutline], +]); + +const colorsMap = new Map, string>([ + ["critical", "#D01502"], + ["high", "#ea7373"], + ["medium", "#FFC051"], + ["low", "#5C94ED"], + ["clean", "#33C600"], +]); + +const useStyles = makeStyles()((theme: Theme) => ({ + severityBadge: { + display: "flex", + alignItems: "center", + gap: theme.spacing(1), + }, + icon: { + fontSize: "1.3em", + }, + text: { + textTransform: "capitalize", + fontWeight: 600, + }, +})); + +interface SeverityBadgeProps { + severity: OneOfValues; +} diff --git a/packages/app/src/report/fe-report-types.ts b/packages/app/src/report/fe-report-types.ts new file mode 100644 index 0000000..26ec0c6 --- /dev/null +++ b/packages/app/src/report/fe-report-types.ts @@ -0,0 +1,21 @@ +import { OneOfValues, Severity } from "shared-types"; + +export enum ReportType { + Detection, + Details, + Links, +} + +export type ScoreColorKey = OneOfValues; +export const ScoreColor = { + High: "high", + Medium: "medium", + Low: "success", +} as const; + +export interface Linter { + name: string; + errors: number; + severity?: OneOfValues; + status: "started" | "success" | "error"; +} diff --git a/packages/app/src/report/stores/fe-report-store.ts b/packages/app/src/report/stores/fe-report-store.ts new file mode 100644 index 0000000..cda55e9 --- /dev/null +++ b/packages/app/src/report/stores/fe-report-store.ts @@ -0,0 +1,103 @@ +import { AnalysisStatus, Issue, ReportState } from "shared-types"; +import { createStore, useStore } from "zustand"; +import { ScoreColorKey } from "../fe-report-types"; +import { resolveScoreColor } from "../utils/score-utils"; + +const initialState: InitialState = { + status: AnalysisStatus.Created, + linters: [], + selectedLinterName: undefined, + packages: [], + score: 0, + inProgress: true, + resourceType: undefined, + resourceValue: undefined, + unsubscribe: undefined, + repoDetails: undefined, + fileDetails: undefined, + wsError: undefined, + analysisError: undefined, + newAnalysisDialogOpen: false, +}; + +export const ReportStore = createStore((set, get) => ({ + ...initialState, + issuesCount: (linterName: string): number => { + const { linters = [] } = get(); + const linter = linters.find((linter) => linter.name === linterName); + + if (linter && linter.issues) { + return linter.issues.length; + } + return 0; + }, + scoreColor: (): ScoreColorKey => { + const { score } = get(); + return resolveScoreColor(score); + }, + lintersWithIssues: (): number => { + const { linters = [] } = get(); + const filtered = linters.filter( + (linter) => linter.issues && linter.issues.length > 0 + ); + return filtered.length; + }, + lintersCompleted: (): number => { + const { linters } = get(); + return (linters || []).filter(({ status }) => status !== "started").length; + }, + progress: (): number => { + const { lintersCompleted, linters } = get(); + return lintersCompleted() > 0 + ? Math.ceil((lintersCompleted() / (linters || []).length) * 100) + : 0; + }, + reset: () => { + set({ ...initialState }); + }, + allIssues: () => { + const { linters } = get(); + return (linters || []) + .map((linter) => + (linter.issues || []).map((issue) => ({ + ...issue, + linter: linter.name, + })) + ) + .flat(); + }, + openNewAnalysisDialog: () => set({ newAnalysisDialogOpen: true }), + closeNewAnalysisDialog: () => set({ newAnalysisDialogOpen: false }), +})); + +export const useReportStore = () => useStore(ReportStore); + +type InitialState = Omit< + FeReportStoreState, + | "issuesCount" + | "scoreColor" + | "lintersWithIssues" + | "reset" + | "lintersCompleted" + | "progress" + | "allIssues" + | "openNewAnalysisDialog" + | "closeNewAnalysisDialog" +>; + +interface FeReportStoreState extends ReportState { + selectedLinterName?: string; + inProgress: boolean; + wsError?: string; + issuesCount(toolName: string): number; + unsubscribe?: () => void; + scoreColor(): ScoreColorKey; + lintersWithIssues(): number; + lintersCompleted(): number; + progress(): number; + reset(): void; + allIssues(): Issue[]; + newAnalysisDialogOpen: boolean; + openNewAnalysisDialog(): void; + closeNewAnalysisDialog(): void; +} diff --git a/packages/app/src/report/utils/score-utils.ts b/packages/app/src/report/utils/score-utils.ts new file mode 100644 index 0000000..7c0b498 --- /dev/null +++ b/packages/app/src/report/utils/score-utils.ts @@ -0,0 +1,14 @@ +import { ScoreColor, ScoreColorKey } from "../fe-report-types"; + +export const resolveScoreColor = (score: number): ScoreColorKey => { + if (numberInRange(score, 33.3, 66.6)) { + return ScoreColor.Medium; + } else if (numberInRange(score, 66.6, 100)) { + return ScoreColor.High; + } + + return ScoreColor.Low; +}; + +const numberInRange = (n: number, start: number, end: number) => + n >= start && n <= end; diff --git a/packages/app/src/report/utils/ws-client.ts b/packages/app/src/report/utils/ws-client.ts new file mode 100644 index 0000000..5171a84 --- /dev/null +++ b/packages/app/src/report/utils/ws-client.ts @@ -0,0 +1,33 @@ +import { ReportState } from "shared-types"; +import config from "../../config"; + +export const subscribe = ({ + requestId, + onMessage, + onError, + onClose, +}: WSClientSubsciptionOptions) => { + const ws = new WebSocket( + `ws://${config.CODETOTAL_WS_HOST}:${config.CODETOTAL_WS_PORT}?requestId=${requestId}` + ); + ws.onmessage = (event) => { + const data = JSON.parse(event.data); + onMessage(data); + }; + ws.onerror = onError; + ws.onclose = onClose; + + const unsubscribe = () => { + if (ws.readyState === ws.OPEN) { + ws.close(); + } + }; + return unsubscribe; +}; + +interface WSClientSubsciptionOptions { + requestId: string; + onMessage: (data: ReportState) => void; + onError: () => void; + onClose: () => void; +} diff --git a/packages/app/src/vite-env.d.ts b/packages/app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json new file mode 100644 index 0000000..3f97b1e --- /dev/null +++ b/packages/app/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "sourceMap": true, + + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "declaration": false + }, + "include": ["src/**/*"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/app/tsconfig.node.json b/packages/app/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/packages/app/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/app/vite.config.ts b/packages/app/vite.config.ts new file mode 100644 index 0000000..22c9848 --- /dev/null +++ b/packages/app/vite.config.ts @@ -0,0 +1,47 @@ +import react from "@vitejs/plugin-react"; +import { PluginOption, defineConfig } from "vite"; +import checker from "vite-plugin-checker"; + +export default defineConfig(({ command }) => { + const plugins: PluginOption[] = [react()]; + + // local development only plugins + if (command === "serve") { + // add Typescript type-checking + plugins.push( + checker({ + typescript: true, + }) + ); + } + + return { + envPrefix: "CODETOTAL_", + envDir: "../../", + mode: "production", + server: { + port: 3000, + }, + build: { + sourcemap: true, + manifest: true, + minify: true, + rollupOptions: { + treeshake: true, + output: { + manualChunks: { + "react-dom": ["react-dom"], + "@mui/material": ["@mui/material"], + }, + }, + }, + }, + esbuild: { + // needed for keepNames + minifyIdentifiers: false, + // keep components' names as is (for React's dev-tool to work properly) + keepNames: true, + }, + plugins, + }; +}); diff --git a/packages/backend/.eslintrc.cjs b/packages/backend/.eslintrc.cjs new file mode 100644 index 0000000..70ce0fc --- /dev/null +++ b/packages/backend/.eslintrc.cjs @@ -0,0 +1,7 @@ +/* eslint-env node */ +module.exports = { + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + root: true, + }; \ No newline at end of file diff --git a/packages/backend/jest.config.mjs b/packages/backend/jest.config.mjs new file mode 100644 index 0000000..485c465 --- /dev/null +++ b/packages/backend/jest.config.mjs @@ -0,0 +1,10 @@ +import dotenv from "dotenv"; + +// load ENV variables from .env file +dotenv.config({ path: "../../.env" }); + +export default { + preset: "ts-jest", + testEnvironment: "node", + testPathIgnorePatterns: ["node_modules", "dist"], +}; diff --git a/packages/backend/package.json b/packages/backend/package.json new file mode 100644 index 0000000..0d41398 --- /dev/null +++ b/packages/backend/package.json @@ -0,0 +1,45 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "", + "types": "./src/index.ts", + "main": "./dist/index.js", + "scripts": { + "start": "nodemon -r dotenv/config ./src/index.ts dotenv_config_path=../../.env dotenv_config_debug=true", + "build": "tsc", + "test": "jest", + "start:test": "jest --coverage --watch", + "lint": "npx eslint src --max-warnings=0", + "clean": "rm -rf dist" + }, + "keywords": [], + "author": "Itay", + "license": "ISC", + "dependencies": { + "@vscode/vscode-languagedetection": "^1.0.22", + "axios": "^1.4.0", + "cors": "^2.8.5", + "devicon": "^2.15.1", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "md5": "^2.3.0", + "multer": "^1.4.5-lts.1", + "redis": "^4.6.7", + "shared-types": "^1.0.0", + "ws": "^8.13.0" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.0", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/formidable": "^3.4.0", + "@types/multer": "^1.4.7", + "@types/ws": "^8.5.5", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "eslint": "^8.44.0", + "nodemon": "^2.0.22", + "typescript": "^5.1.6", + "typia": "^4.1.7" + } +} diff --git a/packages/backend/src/actions/create-analysis-request.ts b/packages/backend/src/actions/create-analysis-request.ts new file mode 100644 index 0000000..35ab600 --- /dev/null +++ b/packages/backend/src/actions/create-analysis-request.ts @@ -0,0 +1,62 @@ +import axios from "axios"; +import FormData from "form-data"; +import md5 from "md5"; // DevSkim: ignore DS126858 +import { + Analysis, + AnalysisType, + FileAnalysis, + ProgrammingLanguage, + RepoAnalysis, + SnippetAnalysis, +} from "shared-types"; +import config from "../config"; +import { logger } from "../utils/logger"; + +export const createAnalysisRequestData = async ( + action: Analysis +): Promise<[unknown, string, ProgrammingLanguage?]> => { + switch (action.inputType) { + case AnalysisType.Repo: { + return [ + { repositoryUrl: (action).url }, + (action).url, + ]; + } + case AnalysisType.Snippet: { + const snippetMd5 = md5((action).snippet); // DevSkim: ignore DS126858 + const snippetAction = action as SnippetAnalysis; + const languageId = snippetAction.language?.id; + const snippetExtension = languageId ? `.${languageId}` : undefined; + return [ + { + snippet: snippetAction.snippet, + snippetExtension, + }, + snippetMd5, // DevSkim: ignore DS126858 + snippetAction.language, + ]; + } + case AnalysisType.File: { + const fileAction = action as FileAnalysis; + const file = fileAction.file as Express.Multer.File; + + try { + const form = new FormData(); + form.append("file", file.buffer, { + filename: file.originalname, + contentType: file.mimetype, + }); + + const res = await axios.post<{ fileUploadId: string }>( + config.MEGALINTER_UPLOAD_URL, + form + ); + + return [{ fileUploadId: res.data.fileUploadId }, file.originalname]; + } catch (err) { + logger.actions.error("Unable to upload file"); + throw err; + } + } + } +}; diff --git a/packages/backend/src/actions/create-analysis.ts b/packages/backend/src/actions/create-analysis.ts new file mode 100644 index 0000000..d0b44e1 --- /dev/null +++ b/packages/backend/src/actions/create-analysis.ts @@ -0,0 +1,35 @@ +import axios from "axios"; +import { Analysis } from "shared-types"; +import config from "../config"; +import { createReportStore } from "../stores/be-report-store"; +import { logger } from "../utils/logger"; +import { createAnalysisRequestData } from "./create-analysis-request"; +import { subscribeToMegaLinter } from "./subscribe-to-megalinter"; + +export const createAnalysis = async ( + action: Analysis +): Promise<{ requestId: string }> => { + try { + const [data, resourceValue, language] = await createAnalysisRequestData(action); + + const response = await axios.post<{ request_id: string }>( + config.MEGALINTER_ANALYSIS_URL, + data + ); + + const requestId = response.data.request_id; + const reportStore = createReportStore(requestId); + reportStore.set({ + resourceType: action.inputType, + resourceValue, + language + }); + subscribeToMegaLinter(requestId, reportStore); + return { requestId }; + } catch (err) { + logger.actions.error( + `Unable to send HTTP request to megalinter at: ${config.MEGALINTER_ANALYSIS_URL}` + ); + throw err; + } +}; diff --git a/packages/backend/src/actions/subscribe-to-megalinter.ts b/packages/backend/src/actions/subscribe-to-megalinter.ts new file mode 100644 index 0000000..eb3ad48 --- /dev/null +++ b/packages/backend/src/actions/subscribe-to-megalinter.ts @@ -0,0 +1,23 @@ +import config from "../config"; +import { parseMessage } from "../megalinter/parsers/parser"; +import { ReportStore } from "../stores/be-report-store"; +import { subscribeToRedis } from "../transport/redis-client"; +import { logger } from "../utils/logger"; + +export const subscribeToMegaLinter = async ( + requestId: string, + store: ReportStore +) => { + try { + const channelId = config.MEGALINTER_REDIS_CHANNEL.replace( + "", + requestId + ); + await subscribeToRedis(channelId, (message: string) => { + parseMessage(JSON.parse(message), store); + }); + } catch (err) { + logger.actions.error("Unable to subscribe to Redis"); + throw err; + } +}; diff --git a/packages/backend/src/actions/subscribe-to-report.ts b/packages/backend/src/actions/subscribe-to-report.ts new file mode 100644 index 0000000..1a405a9 --- /dev/null +++ b/packages/backend/src/actions/subscribe-to-report.ts @@ -0,0 +1,24 @@ +import WebSocket from "ws"; +import { getStore } from "../stores/stores-map"; +import { WSRequest } from "../transport/ws-server"; +import { logger } from "../utils/logger"; + +export const subscribeToReport = (ws: WebSocket, request: WSRequest) => { + try { + const url = new URL(request.url, `http://${request.headers.host}`); + + const requestId = url.searchParams.get("requestId"); + if (!requestId) return; + + const reportStore = getStore(requestId); + if (!reportStore) return; + + reportStore.subscribe((state) => { + ws.send(JSON.stringify(state)); + }); + } catch (err) { + logger.actions.error( + `Unable to subscribe to reportStore (url: "${request.url}")` + ); + } +}; diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts new file mode 100644 index 0000000..d626312 --- /dev/null +++ b/packages/backend/src/config.ts @@ -0,0 +1,27 @@ +declare const process: { + env: { + MEGALINTER_ANALYSIS_URL: string; + MEGALINTER_UPLOAD_URL: string; + MEGALINTER_REDIS_URL: string; + MEGALINTER_REDIS_CHANNEL: string; + CODETOTAL_HTTP_PORT: number; + CODETOTAL_HTTP_HOST: string; + CODETOTAL_WS_PORT: number; + CODETOTAL_WS_HOST: string; + DEBUG_MODULES: string; + }; +}; + +const config = { + MEGALINTER_ANALYSIS_URL: process.env.MEGALINTER_ANALYSIS_URL, + MEGALINTER_UPLOAD_URL: process.env.MEGALINTER_UPLOAD_URL, + MEGALINTER_REDIS_URL: process.env.MEGALINTER_REDIS_URL, + MEGALINTER_REDIS_CHANNEL: process.env.MEGALINTER_REDIS_CHANNEL, + CODETOTAL_HTTP_PORT: process.env.CODETOTAL_HTTP_PORT, + CODETOTAL_HTTP_HOST: process.env.CODETOTAL_HTTP_HOST, + CODETOTAL_WS_PORT: process.env.CODETOTAL_WS_PORT, + CODETOTAL_WS_HOST: process.env.CODETOTAL_WS_HOST, + DEBUG_MODULES: process.env.DEBUG_MODULES, +}; + +export default config; diff --git a/packages/backend/src/http/create-http-server.test.ts b/packages/backend/src/http/create-http-server.test.ts new file mode 100644 index 0000000..200d18b --- /dev/null +++ b/packages/backend/src/http/create-http-server.test.ts @@ -0,0 +1,38 @@ +import bodyParser from "body-parser"; +import cors from "cors"; +import path from "node:path"; +import { ServerFactory, createHttpServer } from "./create-http-server"; + +jest.mock("cors", () => jest.fn(() => jest.fn())); + +jest.mock("body-parser", () => { + const jsonFuncMock = jest.fn(() => jest.fn()); + const urlencodedFuncMock = jest.fn(() => jest.fn()); + return { + urlencoded: urlencodedFuncMock, + json: jsonFuncMock, + }; +}); + +const useFuncMock = jest.fn(); +const serverFactoryMock = jest.fn(() => ({ + use: useFuncMock, +})); +const staticFileHandler = jest.fn(); +const staticFuncMock = jest.fn(() => staticFileHandler); +serverFactoryMock["static"] = staticFuncMock; + +describe("create-http-server", () => { + test("createHttpServer", () => { + const server = createHttpServer( + serverFactoryMock as unknown as ServerFactory + ); + expect(server).toBeDefined(); + expect(serverFactoryMock).toBeCalled(); + expect(useFuncMock).toBeCalled(); + expect(cors).toBeCalled(); + expect(bodyParser.urlencoded).toBeCalledWith({ extended: false }); + expect(staticFuncMock).toBeCalledWith(path.resolve(".", "dist", "public")); + expect(useFuncMock).toBeCalledWith(staticFileHandler); + }); +}); diff --git a/packages/backend/src/http/create-http-server.ts b/packages/backend/src/http/create-http-server.ts new file mode 100644 index 0000000..48b91ac --- /dev/null +++ b/packages/backend/src/http/create-http-server.ts @@ -0,0 +1,30 @@ +import bodyParser from "body-parser"; +import cors from "cors"; +import express, { RequestHandler } from "express"; +import path from "node:path"; +import { logger } from "../utils/logger"; + +export const createHttpServer = (factory: ServerFactory) => { + const app = factory(); + + // enable cors + app.use(cors()); + + // parse application/x-www-form-urlencoded + app.use(bodyParser.urlencoded({ extended: false })); + + // parse application/json + app.use(bodyParser.json()); + + // serve static files from "public" under "dist" + const staticFolderPath = path.resolve(".", "dist", "public"); + logger.transport.log(`Setting static folder to: "${staticFolderPath}"`); + app.use(factory.static(staticFolderPath)); + + return app; +}; + +export type ServerFactory = { + (): express.Express; + static(path: string): RequestHandler; +}; diff --git a/packages/backend/src/http/handlers/analysis-http-handler.ts b/packages/backend/src/http/handlers/analysis-http-handler.ts new file mode 100644 index 0000000..5783e58 --- /dev/null +++ b/packages/backend/src/http/handlers/analysis-http-handler.ts @@ -0,0 +1,21 @@ +import { Request, Response } from "express"; +import { Analysis, FileAnalysis } from "shared-types"; +import { createAnalysis } from "../../actions/create-analysis"; +import { logger } from "../../utils/logger"; + +export const analysisHttpHandler = async (req: Request, res: Response) => { + logger.transport.log("Received new analysis request"); + const file = req.file; + let action = req.body as Analysis; + if (file) { + action = { ...action, file } as FileAnalysis; + } + + try { + const result = await createAnalysis(action); + res.json(result); + } catch (err) { + logger.transport.error(err.message); + res.status(500).send(); + } +}; diff --git a/packages/backend/src/http/handlers/http-file-upload-handler.test.ts b/packages/backend/src/http/handlers/http-file-upload-handler.test.ts new file mode 100644 index 0000000..92a1586 --- /dev/null +++ b/packages/backend/src/http/handlers/http-file-upload-handler.test.ts @@ -0,0 +1,20 @@ +import { + FileUploader, + createFileUploadHandler, +} from "./http-file-upload-handler"; + +const memStorageMock = jest.fn(() => ({})); +const singleFuncMock = jest.fn(() => jest.fn()); +const uploader = jest.fn(() => ({ single: singleFuncMock })); +uploader["memoryStorage"] = memStorageMock; + +describe("http-file-upload-handler", () => { + test("createFileUploadHandler", () => { + const handler = createFileUploadHandler(uploader as unknown as FileUploader); + + expect(memStorageMock).toBeCalled(); + expect(uploader).toBeCalledWith({ storage: {} }); + expect(singleFuncMock).toBeCalledWith("file"); + expect(typeof handler).toBe("function"); + }); +}); diff --git a/packages/backend/src/http/handlers/http-file-upload-handler.ts b/packages/backend/src/http/handlers/http-file-upload-handler.ts new file mode 100644 index 0000000..35f4040 --- /dev/null +++ b/packages/backend/src/http/handlers/http-file-upload-handler.ts @@ -0,0 +1,15 @@ +import { RequestHandler } from "express"; +import multer from "multer"; + +export const createFileUploadHandler = (uploader: FileUploader): RequestHandler => { + const storage = uploader.memoryStorage(); + const upload = uploader({ storage }); + return upload.single("file"); +}; + +export const multerFileUploadHandler = createFileUploadHandler(multer as FileUploader); + +export type FileUploader = { + memoryStorage(): object; + (options: { storage: object }); +}; diff --git a/packages/backend/src/http/handlers/language-detection-http-handler.ts b/packages/backend/src/http/handlers/language-detection-http-handler.ts new file mode 100644 index 0000000..240e244 --- /dev/null +++ b/packages/backend/src/http/handlers/language-detection-http-handler.ts @@ -0,0 +1,20 @@ +import { Request, Response } from "express"; +import { detectLanguage } from "../../language-detection/language-detect"; +import { logger } from "../../utils/logger"; + +export const languageDetectionHttpHandler = async ( + req: Request, + res: Response +) => { + const { snippet } = req.body; + + try { + const language = await detectLanguage(snippet); + language && res.json(language); + } catch (err) { + logger.transport.error(err.message); + res.status(500).send(); + } + + res.status(200).send(); +}; diff --git a/packages/backend/src/http/handlers/report-http-handler.ts b/packages/backend/src/http/handlers/report-http-handler.ts new file mode 100644 index 0000000..902644c --- /dev/null +++ b/packages/backend/src/http/handlers/report-http-handler.ts @@ -0,0 +1,16 @@ +import { Request, Response } from "express"; +import { AnalysisStatus } from "shared-types"; +import { getStore } from "../../stores/stores-map"; + +export const reportHttpHandler = (req: Request, res: Response) => { + const { requestId } = req.params; + + // Resolve store + const reportStore = getStore(requestId); + + if (reportStore) { + res.json({ ...reportStore.get() }); + } else { + res.json({ status: AnalysisStatus.NotFound }); + } +}; diff --git a/packages/backend/src/http/register-http-routes.ts b/packages/backend/src/http/register-http-routes.ts new file mode 100644 index 0000000..ec9f40d --- /dev/null +++ b/packages/backend/src/http/register-http-routes.ts @@ -0,0 +1,26 @@ +import express from "express"; +import fs from "node:fs"; +import path from "node:path"; +import { analysisHttpHandler } from "./handlers/analysis-http-handler"; +import { multerFileUploadHandler } from "./handlers/http-file-upload-handler"; +import { languageDetectionHttpHandler } from "./handlers/language-detection-http-handler"; +import { reportHttpHandler } from "./handlers/report-http-handler"; + +export const registerRoutes = (app: express.Express) => { + const prefix = "/api"; + + app.post(`${prefix}/analysis`, multerFileUploadHandler, analysisHttpHandler); + app.get(`${prefix}/report/:requestId`, reportHttpHandler); + app.post(`${prefix}/detect`, languageDetectionHttpHandler); + + if (process.env.NODE_ENV === "production") { + const indexHTMLPath = path.resolve("./dist", "public", "index.html"); + const indexHTML = fs.readFileSync(indexHTMLPath).toString(); + console.log("Serving the following index.html file for all GET requests"); + console.log(indexHTML); + + app.get("*", (req, res) => { + res.send(indexHTML); + }); + } +}; diff --git a/packages/backend/src/http/start-http-server.ts b/packages/backend/src/http/start-http-server.ts new file mode 100644 index 0000000..67ad565 --- /dev/null +++ b/packages/backend/src/http/start-http-server.ts @@ -0,0 +1,18 @@ +import express from "express"; +import { logger } from "../utils/logger"; + +export const startHttpServer = ({ + httpServer, + host, + port, +}: StartHttpServerOptions) => { + httpServer.listen(port, host, () => { + logger.transport.log(`HTTP server is running on ${host}:${port}`); + }); +}; + +interface StartHttpServerOptions { + httpServer: express.Express; + host: string; + port: number; +} diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts new file mode 100644 index 0000000..0bafb3b --- /dev/null +++ b/packages/backend/src/index.ts @@ -0,0 +1,34 @@ +import express from "express"; +import { subscribeToReport } from "./actions/subscribe-to-report"; +import config from "./config"; +import { createHttpServer } from "./http/create-http-server"; +import { registerRoutes } from "./http/register-http-routes"; +import { startHttpServer } from "./http/start-http-server"; +import { startRedisClient } from "./transport/redis-client"; +import { createWSServer, listenToWSConnection } from "./transport/ws-server"; +import { retry } from "./utils/retry"; + +const retryOptions = { + interval: 5000, + retries: -1, +}; + +const wsOptions = { + host: config.CODETOTAL_WS_HOST, + port: config.CODETOTAL_WS_PORT, +}; + +retry(startRedisClient, retryOptions); + +retry(() => { + const wsServer = createWSServer(wsOptions); + listenToWSConnection(wsServer, subscribeToReport); +}, retryOptions); + +const httpServer = createHttpServer(express); +registerRoutes(httpServer); +startHttpServer({ + httpServer, + host: config.CODETOTAL_HTTP_HOST, + port: config.CODETOTAL_HTTP_PORT, +}); diff --git a/packages/backend/src/language-detection/language-detect.test.ts b/packages/backend/src/language-detection/language-detect.test.ts new file mode 100644 index 0000000..7e8e3bb --- /dev/null +++ b/packages/backend/src/language-detection/language-detect.test.ts @@ -0,0 +1,23 @@ +import { detectLanguage } from "./language-detect"; +import { tsCodeSnippet } from "./snippets-mocks"; + +describe("language-detect", () => { + test("resolve language", async () => { + const language = await detectLanguage(tsCodeSnippet); + expect(language.id).toBeDefined(); + expect(language.name).toBeDefined(); + expect(language.icon).toBeDefined(); + }); + + test("resolve language without an icon", async () => { + const language = await detectLanguage("MKDIR mydir Set X=123"); + expect(language.id).toBeDefined(); + expect(language.name).toBeDefined(); + expect(language.icon).toBeUndefined(); + }); + + test("resolveId return undefined when language not detected", async () => { + const language = await detectLanguage(""); + expect(language).toBeUndefined(); + }); +}); diff --git a/packages/backend/src/language-detection/language-detect.ts b/packages/backend/src/language-detection/language-detect.ts new file mode 100644 index 0000000..dff7168 --- /dev/null +++ b/packages/backend/src/language-detection/language-detect.ts @@ -0,0 +1,22 @@ +import { ProgrammingLanguage } from "shared-types"; +import { resolveIcon } from "./language-resolve-icon"; +import { resolveName } from "./language-resolve-name"; +import { resolveId } from "./language-resolve-id"; + +export const detectLanguage = async ( + snippet: string +): Promise => { + const languageId = await resolveId(snippet); + + if (languageId) { + const name = resolveName(languageId); + const icon = resolveIcon(name); + return { + id: languageId, + name, + icon, + }; + } + + return undefined; +}; diff --git a/packages/backend/src/language-detection/language-resolve-icon.test.ts b/packages/backend/src/language-detection/language-resolve-icon.test.ts new file mode 100644 index 0000000..e662861 --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-icon.test.ts @@ -0,0 +1,23 @@ +import { resolveIcon } from "./language-resolve-icon"; + +describe("language-resolve-icon", () => { + test("resolve TypeScript Icon", () => { + const icon = resolveIcon("TypeScript"); + expect(icon).toBe("original"); + }); + + test("resolve Rust Icon", () => { + const icon = resolveIcon("Rust"); + expect(icon).toBe("plain"); + }); + + test("resolve Python Icon", () => { + const icon = resolveIcon("Python"); + expect(icon).toBe("original"); + }); + + test("resolveIcon return undefined when icon not found", () => { + const name = resolveIcon("123"); + expect(name).toBeUndefined(); + }); +}); diff --git a/packages/backend/src/language-detection/language-resolve-icon.ts b/packages/backend/src/language-detection/language-resolve-icon.ts new file mode 100644 index 0000000..897300f --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-icon.ts @@ -0,0 +1,12 @@ +import iconsMap from "devicon/devicon.json"; + +export const resolveIcon = (languageName: string): string | undefined => { + const lcName = languageName.toLowerCase(); + const devIconInfo = iconsMap.find((l) => l.name === lcName); + + if (devIconInfo) { + return devIconInfo.versions.svg[0]; + } + + return undefined; +}; diff --git a/packages/backend/src/language-detection/language-resolve-id.test.ts b/packages/backend/src/language-detection/language-resolve-id.test.ts new file mode 100644 index 0000000..1196714 --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-id.test.ts @@ -0,0 +1,19 @@ +import { resolveId } from "./language-resolve-id"; +import { pyCodeSnippet, tsCodeSnippet } from "./snippets-mocks"; + +describe("language-resolve-id", () => { + test("resolveId language id from snippet", async () => { + const id = await resolveId(pyCodeSnippet); + expect(id).toBe("py"); + }); + + test("resolveId language id from snippet", async () => { + const id = await resolveId(tsCodeSnippet); + expect(id).toBe("ts"); + }); + + test("resolveId return undefined when language not detected", async () => { + const id = await resolveId("123"); + expect(id).toBeUndefined(); + }); +}); diff --git a/packages/backend/src/language-detection/language-resolve-id.ts b/packages/backend/src/language-detection/language-resolve-id.ts new file mode 100644 index 0000000..bded142 --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-id.ts @@ -0,0 +1,17 @@ +import { ModelOperations } from "@vscode/vscode-languagedetection"; + +// Language detection of code snippet using @vscode/vscode-languagedetection (guesslang) +// Name resolution using highlight.js (https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md) +// Icon resolution using "devicon" (https://devicon.dev/) + +const modulOperations = new ModelOperations(); + +export const resolveId = async (snippet: string): Promise => { + const detection = await modulOperations.runModel(snippet); + + if (detection.length > 0) { + return detection[0].languageId; + } + + return undefined; +}; diff --git a/packages/backend/src/language-detection/language-resolve-name.test.ts b/packages/backend/src/language-detection/language-resolve-name.test.ts new file mode 100644 index 0000000..42660a1 --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-name.test.ts @@ -0,0 +1,13 @@ +import { resolveName } from "./language-resolve-name"; + +describe("language-resolve-name", () => { + test("resolveName", () => { + const name = resolveName("ts"); + expect(name).toBe("TypeScript"); + }); + + test("resolveName return undefined when language not found", () => { + const name = resolveName("123"); + expect(name).toBeUndefined(); + }); +}); diff --git a/packages/backend/src/language-detection/language-resolve-name.ts b/packages/backend/src/language-detection/language-resolve-name.ts new file mode 100644 index 0000000..92391cf --- /dev/null +++ b/packages/backend/src/language-detection/language-resolve-name.ts @@ -0,0 +1,9 @@ +import languagesMap from "./languages-id-to-name-map.json"; + +export const resolveName = (languageId: string): string | undefined => { + if (languagesMap[languageId]) { + return languagesMap[languageId]; + } + + return undefined; +}; diff --git a/packages/backend/src/language-detection/languages-id-to-name-map.json b/packages/backend/src/language-detection/languages-id-to-name-map.json new file mode 100644 index 0000000..dfe86f8 --- /dev/null +++ b/packages/backend/src/language-detection/languages-id-to-name-map.json @@ -0,0 +1,420 @@ +{ + "1c": "1C", + "4d": "4D", + "sap-abap": "ABAP", + "abap": "ABAP", + "abnf": "ABNF", + "accesslog": "Access logs", + "ada": "Ada", + "apex": "Apex", + "arduino": "Arduino (C++ w/Arduino libs)", + "ino": "Arduino (C++ w/Arduino libs)", + "armasm": "ARM assembler", + "arm": "ARM assembler", + "avrasm": "AVR assembler", + "actionscript": "ActionScript", + "as": "ActionScript", + "alan": "Alan IF", + "i": "Alan IF", + "ln": "Alan", + "angelscript": "AngelScript", + "asc": "AngelScript", + "apache": "Apache", + "apacheconf": "Apache", + "applescript": "AppleScript", + "osascript": "AppleScript", + "arcade": "Arcade", + "asciidoc": "AsciiDoc", + "adoc": "AsciiDoc", + "aspectj": "AspectJ", + "autohotkey": "AutoHotkey", + "autoit": "AutoIt", + "awk": "Awk", + "mawk": "Awk", + "nawk": "Awk", + "gawk": "Awk", + "bash": "Bash", + "sh": "Bash", + "zsh": "Bash", + "basic": "Basic", + "bbcode": "BBCode", + "blade": "Blade (Laravel)", + "bnf": "BNF", + "bqn": "BQN", + "brainfuck": "Brainfuck", + "bf": "Brainfuck", + "csharp": "C#", + "cs": "C#", + "c": "C", + "h": "C", + "cpp": "C++", + "hpp": "C++", + "cc": "C++", + "hh": "C++", + "c++": "C++", + "h++": "C++", + "cxx": "C++", + "hxx": "C++", + "cal": "C/AL", + "c3": "C3", + "cos": "Cache Object Script", + "cls": "Cache Object Script", + "candid": "Candid", + "did": "Candid", + "cmake": "CMake", + "cmake.in": "CMake", + "cobol": "COBOL", + "standard-cobol": "COBOL", + "coq": "Coq", + "csp": "CSP", + "css": "CSS", + "capnproto": "Cap’n Proto", + "capnp": "Cap’n Proto", + "chaos": "Chaos", + "kaos": "Chaos", + "chapel": "Chapel", + "chpl": "Chapel", + "cisco": "Cisco CLI", + "clojure": "Clojure", + "clj": "Clojure", + "coffeescript": "CoffeeScript", + "coffee": "CoffeeScript", + "cson": "CoffeeScript", + "iced": "CoffeeScript", + "cpc": "CpcdosC+", + "crmsh": "Crmsh", + "crm": "Crmsh", + "pcmk": "Crmsh", + "crystal": "Crystal", + "cr": "Crystal", + "curl": "cURL", + "cypher": "Cypher (Neo4j)", + "d": "D", + "dafny": "Dafny", + "dart": "Dart", + "dpr": "Delphi", + "dfm": "Delphi", + "pas": "Delphi", + "pascal": "Delphi", + "diff": "Diff", + "patch": "Diff", + "django": "Django", + "jinja": "Django", + "dns": "DNS Zone file", + "zone": "DNS Zone file", + "bind": "DNS Zone file", + "dockerfile": "Dockerfile", + "docker": "Dockerfile", + "dos": "DOS", + "bat": "DOS", + "cmd": "DOS", + "dsconfig": "dsconfig", + "dts": "DTS (Device Tree)", + "dust": "Dust", + "dst": "Dust", + "dylan": "Dylan", + "ebnf": "EBNF", + "elixir": "Elixir", + "elm": "Elm", + "erlang": "Erlang", + "erl": "Erlang", + "excel": "Excel", + "xls": "Excel", + "xlsx": "Excel", + "extempore": "Extempore", + "xtlang": "Extempore", + "xtm": "Extempore", + "fsharp": "F#", + "fs": "F#", + "fix": "FIX", + "flix": "Flix", + "fortran": "Fortran", + "f90": "Fortran", + "f95": "Fortran", + "func": "FunC", + "gcode": "G-Code", + "nc": "G-Code", + "gams": "Gams", + "gms": "Gams", + "gauss": "GAUSS", + "gss": "GAUSS", + "godot": "GDScript", + "gdscript": "GDScript", + "gherkin": "Gherkin", + "hbs": "Handlebars", + "glimmer": "Glimmer and EmberJS", + "html.hbs": "Handlebars", + "html.handlebars": "Handlebars", + "htmlbars": "Glimmer and EmberJS", + "gn": "GN for Ninja", + "gni": "GN for Ninja", + "go": "Go", + "golang": "Go", + "gf": "Grammatical Framework", + "golo": "Golo", + "gololang": "Golo", + "gradle": "Gradle", + "graphql": "GraphQL", + "groovy": "Groovy", + "gsql": "GSQL", + "xml": "HTML, XML", + "html": "HTML, XML", + "xhtml": "HTML, XML", + "rss": "HTML, XML", + "atom": "HTML, XML", + "xjb": "HTML, XML", + "xsd": "HTML, XML", + "xsl": "HTML, XML", + "plist": "HTML, XML", + "svg": "HTML, XML", + "http": "HTTP", + "https": "HTTP", + "haml": "Haml", + "handlebars": "Handlebars", + "haskell": "Haskell", + "hs": "Haskell", + "haxe": "Haxe", + "hx": "Haxe", + "hlsl": "High-level shader language", + "hy": "Hy", + "hylang": "Hy", + "ini": "Ini, TOML", + "toml": "Ini, TOML", + "inform7": "Inform7", + "i7": "Inform7", + "irpf90": "IRPF90", + "iptables": "Iptables", + "json": "JSON", + "java": "Java", + "jsp": "Java", + "javascript": "JavaScript", + "js": "JavaScript", + "jsx": "JavaScript", + "jolie": "Jolie", + "iol": "Jolie", + "ol": "Jolie", + "julia": "Julia", + "julia-repl": "Julia", + "kotlin": "Kotlin", + "kt": "Kotlin", + "": "Lang", + "tex": "LaTeX", + "leaf": "Leaf", + "lean": "Lean", + "lasso": "Lasso", + "ls": "LiveScript", + "lassoscript": "Lasso", + "less": "Less", + "ldif": "LDIF", + "lisp": "Lisp", + "livecodeserver": "LiveCode Server", + "livescript": "LiveScript", + "lookml": "LookML", + "lua": "Lua", + "macaulay2": "Macaulay2", + "makefile": "Makefile", + "mk": "Makefile", + "mak": "Makefile", + "make": "Makefile", + "markdown": "Markdown", + "md": "Markdown", + "mkdown": "Markdown", + "mkd": "Markdown", + "mathematica": "Mathematica", + "mma": "Mathematica", + "wl": "Mathematica", + "matlab": "Matlab", + "maxima": "Maxima", + "mel": "Maya Embedded Language", + "mercury": "Mercury", + "mips": "MIPS Assembler", + "mipsasm": "MIPS Assembler", + "mint": "Mint", + "mirc": "mIRC Scripting Language", + "mrc": "mIRC Scripting Language", + "mizar": "Mizar", + "mkb": "MKB", + "mlir": "MLIR", + "mojolicious": "Mojolicious", + "monkey": "Monkey", + "moonscript": "Moonscript", + "moon": "Moonscript", + "motoko": "Motoko", + "mo": "Motoko", + "n1ql": "N1QL", + "nsis": "NSIS", + "never": "Never", + "nginx": "Nginx", + "nginxconf": "Nginx", + "nim": "Nim", + "nimrod": "Nim", + "nix": "Nix", + "oak": "Oak", + "ocl": "Object Constraint Language", + "ocaml": "OCaml", + "ml": "OCaml", + "objectivec": "Objective C", + "mm": "Objective C", + "objc": "Objective C", + "obj-c": "Objective C", + "obj-c++": "Objective C", + "objective-c++": "Objective C", + "glsl": "OpenGL Shading Language", + "openscad": "OpenSCAD", + "scad": "OpenSCAD", + "ruleslanguage": "Oracle Rules Language", + "oxygene": "Oxygene", + "pf": "PF", + "pf.conf": "PF", + "php": "PHP", + "papyrus": "Papyrus", + "psc": "Papyrus", + "parser3": "Parser3", + "perl": "Perl", + "pl": "Perl", + "pm": "Perl", + "pine": "Pine Script", + "pinescript": "Pine Script", + "plaintext": "Plaintext", + "txt": "Plaintext", + "text": "Plaintext", + "pony": "Pony", + "pgsql": "PostgreSQL & PL/pgSQL", + "postgres": "PostgreSQL & PL/pgSQL", + "postgresql": "PostgreSQL & PL/pgSQL", + "powershell": "PowerShell", + "ps": "PowerShell", + "ps1": "PowerShell", + "processing": "Processing", + "prolog": "Prolog", + "properties": "Properties", + "proto": "Protocol Buffers", + "protobuf": "Protocol Buffers", + "puppet": "Puppet", + "pp": "Puppet", + "python": "Python", + "py": "Python", + "gyp": "Python", + "profile": "Python profiler results", + "python-repl": "Python REPL", + "pycon": "Python REPL", + "qsharp": "Q#", + "k": "Q", + "kdb": "Q", + "qml": "QML", + "r": "R", + "cshtml": "Razor CSHTML", + "razor": "Razor CSHTML", + "razor-cshtml": "Razor CSHTML", + "reasonml": "ReasonML", + "re": "ReasonML", + "redbol": "Rebol & Red", + "rebol": "Rebol & Red", + "red": "Rebol & Red", + "red-system": "Rebol & Red", + "rib": "RenderMan RIB", + "rsl": "RenderMan RSL", + "risc": "RiScript", + "riscript": "RiScript", + "graph": "Roboconf", + "instances": "Roboconf", + "robot": "Robot Framework", + "rf": "Robot Framework", + "rpm-specfile": "RPM spec files", + "rpm": "RPM spec files", + "spec": "RPM spec files", + "rpm-spec": "RPM spec files", + "specfile": "RPM spec files", + "ruby": "Ruby", + "rb": "Ruby", + "gemspec": "Ruby", + "podspec": "Ruby", + "thor": "Ruby", + "irb": "Ruby", + "rust": "Rust", + "rs": "Rust", + "rvt": "RVT Script", + "rvt-script": "RVT Script", + "SAS": "SAS", + "sas": "SAS", + "scss": "SCSS", + "sql": "SQL", + "p21": "STEP Part 21", + "step": "STEP Part 21", + "stp": "STEP Part 21", + "scala": "Scala", + "scheme": "Scheme", + "scilab": "Scilab", + "sci": "Scilab", + "sfz": "SFZ", + "shexc": "Shape Expressions", + "shell": "Shell", + "console": "Shell", + "smali": "Smali", + "smalltalk": "Smalltalk", + "st": "Smalltalk", + "sml": "SML", + "solidity": "Solidity", + "sol": "Solidity", + "spl": "Splunk SPL", + "stan": "Stan", + "stanfuncs": "Stan", + "stata": "Stata", + "iecst": "Structured Text", + "scl": "Structured Text", + "stl": "Structured Text", + "structured-text": "Structured Text", + "stylus": "Stylus", + "styl": "Stylus", + "subunit": "SubUnit", + "supercollider": "Supercollider", + "sc": "Supercollider", + "svelte": "Svelte", + "swift": "Swift", + "tcl": "Tcl", + "tk": "Tcl", + "terraform": "Terraform (HCL)", + "tf": "Terraform (HCL)", + "hcl": "Terraform (HCL)", + "tap": "Test Anything Protocol", + "thrift": "Thrift", + "toit": "Toit", + "tp": "TP", + "tsql": "Transact-SQL", + "twig": "Twig", + "craftcms": "Twig", + "typescript": "TypeScript", + "ts": "TypeScript", + "tsx": "TypeScript", + "mts": "TypeScript", + "cts": "TypeScript", + "unicorn-rails-log": "Unicorn Rails log", + "vbnet": "VB.Net", + "vb": "VB.Net", + "vba": "VBA", + "vbscript": "VBScript", + "vbs": "VBScript", + "vhdl": "VHDL", + "vala": "Vala", + "verilog": "Verilog", + "v": "Verilog", + "vim": "Vim Script", + "xsharp": "X#", + "xs": "X#", + "prg": "X#", + "axapta": "X++", + "x++": "X++", + "x86asm": "x86 Assembly", + "xl": "XL", + "tao": "XL", + "xquery": "XQuery", + "xpath": "XQuery", + "xq": "XQuery", + "xqm": "XQuery", + "yml": "YAML", + "yaml": "YAML", + "zenscript": "ZenScript", + "zs": "ZenScript", + "zephir": "Zephir", + "zep": "Zephir" +} diff --git a/packages/backend/src/language-detection/snippets-mocks.ts b/packages/backend/src/language-detection/snippets-mocks.ts new file mode 100644 index 0000000..0645265 --- /dev/null +++ b/packages/backend/src/language-detection/snippets-mocks.ts @@ -0,0 +1,28 @@ +export const pyCodeSnippet = ` + import pandas as pd + import requests + from requests import post + print(pd.read_csv('1.csv')) + HEADERS = { + 'Accept': '*/*', + 'Accept-Language': 'en-US,en;q=0.9,ru;q=0.8', + 'authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGllbnROYW1lIjoid2ViYXBwLXYzMSIsInNjb3BlIjoic3RhdGljLWNvbnRlbnQtYXBpLGN1cmF0aW9uLWFwaSxuZXh4LWNvbnRlbnQtYXBpLXYzMSx3ZWJhcHAtYXBpIn0.mbuG9wS9Yf5q6PqgR4fiaRFIagiHk9JhwoKES7ksVX4', + } + res1 = requests.get('http://pbom.dev/', headers=HEADERS) + res2 = requests.get('http://ox.security/', allow_redirects=True) + res3 = requests.get('https://megalinter.io/', verify=False) +`; + +export const tsCodeSnippet = ` +import iconsMap from "devicon/devicon.json"; +export const resolveIcon = (languageName: string): string | undefined => { + const lcName = languageName.toLowerCase(); + const devIconInfo = iconsMap.find((l) => l.name === lcName); + + if (devIconInfo) { + return devIconInfo.versions.svg[0]; + } + + return undefined; +}; +`; diff --git a/packages/backend/src/megalinter/megalinter-types.ts b/packages/backend/src/megalinter/megalinter-types.ts new file mode 100644 index 0000000..1b4035d --- /dev/null +++ b/packages/backend/src/megalinter/megalinter-types.ts @@ -0,0 +1,129 @@ +import { AnalysisStatus, LinterStatus } from "shared-types"; + +export enum MessageType { + MegalinterStart = "megalinterStart", + LinterStart = "linterStart", + LinterComplete = "linterComplete", + MegalinterComplete = "megalinterComplete", + SBOMPackages = "sbom-packages", + FileDetails = "file-details", + RepoDetails = "repo-details", + ServerError = "serverError", +} + +export interface BaseMessage { + messageType: MessageType; + isSBOM: boolean; +} + +export interface MegalinterStartMessage extends BaseMessage { + messageType: typeof MessageType.MegalinterStart; + megaLinterStatus: AnalysisStatus; + linters: RawLinter[]; +} + +export interface MegalinterCompleteMessage extends BaseMessage { + messageType: typeof MessageType.MegalinterComplete; + megaLinterStatus: AnalysisStatus; + requestId: string; +} + +export interface LinterStartMessage extends BaseMessage { + messageType: typeof MessageType.LinterStart; + linterStatus: LinterStatus; + descriptorId: string; + linterId: string; + linterKey: string; + linterVersion: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + linterCliLintMode: any; // TODO: itay: ask Nicolas + requestId: string; + docUrl: string; + isFormatter: boolean; + isSBOM: boolean; + filesNumber: number; +} + +export interface LinterCompleteMessage extends BaseMessage { + messageType: typeof MessageType.LinterComplete; + linterId: string; + linterStatus: LinterStatus; + linterErrorNumber: number; + linterStatusMessage: string; + linterElapsedTime: number; + linterCliCommand: string[]; + descriptorId: string; + linterKey: string; + linterVersion: string; + linterCliLintMode: string; + requestId: string; + docUrl: string; + isFormatter: boolean; + isSBOM: boolean; + outputJson?: unknown; + outputSarif: { + $schema: string; + runs: [ + { + columnKind: string; + originalUriBaseIds: { + ROOTPATH: { + uri: string; + }; + }; + properties: { + megalinter: { + docUrl: string; + linterKey: string; + linterVersion: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sbom?: any; + }; + }; + results: []; + tool: { + driver: { + fullName: string; + informationUri: string; + name: string; + rules: unknown[]; + version: string; + }; + }; + } + ]; + version: string; + }; +} + +export interface MegalinterErrorMessage extends BaseMessage { + messageType: typeof MessageType.ServerError; + message: string; + errorCode: MegalinterErrorCode; + errorDetails: { + error: string; + }; + requestId: string; +} + +export enum MegalinterErrorCode { + MissingAnalysisType = "missingAnalysisType", + GitClone = "gitCloneError", + UploadFileNotFound = "uploadedFileNotFound", + SnippetGuessError = "snippetGuessError", + SnippetBuildError = "snippetBuildError", +} + +export interface RawLinter { + descriptorId: string; + linterId: string; + linterKey: string; + linterVersion: string; + linterCliLintMode: string; + requestId: string; + docUrl: string; + isFormatter: boolean; + isSBOM: boolean; + filesNumber: number; + linterStatus: LinterStatus; +} diff --git a/packages/backend/src/megalinter/mocks/file-details.json b/packages/backend/src/megalinter/mocks/file-details.json new file mode 100644 index 0000000..60e334c --- /dev/null +++ b/packages/backend/src/megalinter/mocks/file-details.json @@ -0,0 +1,7 @@ +{ + "language": "HTML", + "fileSize": 15553, + "md5": "234@34234235", + "ssdeep": "sdfsdfsdf", + "encoding": "UTF-8" +} diff --git a/packages/backend/src/megalinter/mocks/repo-details.json b/packages/backend/src/megalinter/mocks/repo-details.json new file mode 100644 index 0000000..79f734c --- /dev/null +++ b/packages/backend/src/megalinter/mocks/repo-details.json @@ -0,0 +1,15 @@ +{ + "languages": [ + { "name": "HTML", "percentage": 30 }, + { "name": "CSS", "percentage": 50 } + ], + "readmeUrl": "https://www.google.com", + "activityUrl": "https://www.google.com", + "stars": 13300, + "watching": 140, + "forks": 1200, + "releases": 151, + "latestVersion": "8.17.0", + "latestVersionDate": "2023-07-10T15:11:13.346Z", + "license": "MIT" +} diff --git a/packages/backend/src/megalinter/mocks/sbom-packages.json b/packages/backend/src/megalinter/mocks/sbom-packages.json new file mode 100644 index 0000000..0708c64 --- /dev/null +++ b/packages/backend/src/megalinter/mocks/sbom-packages.json @@ -0,0 +1,196 @@ +{ + "packages": [ + { + "packageName": "levenshtein", + "packageVersion": "0.21.1", + "license": "GNU General Public License v2 or later (GPLv2+)", + "registry": "PyPi", + "severity": "high", + "filePath": "poetry.lock" + }, + { + "packageName": "paramiko", + "packageVersion": "3.2.0", + "license": "GNU Library or Lesser General Public License (LGPL)", + "registry": "PyPi", + "severity": "high", + "filePath": "poetry.lock" + }, + { + "packageName": "bcrypt", + "packageVersion": "4.0.1", + "license": "Apache-2.0", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "blinker", + "packageVersion": "1.6.2", + "license": "MIT", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "cffi", + "packageVersion": "1.15.1", + "license": "MIT", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "click", + "packageVersion": "8.1.4", + "license": "BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "colorama", + "packageVersion": "0.4.6", + "license": "BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "cryptography", + "packageVersion": "41.0.2", + "license": "Apache Software License, BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "flask", + "packageVersion": "2.3.2", + "license": "BSD-3-Clause", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "itsdangerous", + "packageVersion": "2.1.2", + "license": "BSD-3-Clause", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "jinja2", + "packageVersion": "3.1.2", + "license": "BSD-3-Clause", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "markupsafe", + "packageVersion": "2.1.3", + "license": "BSD-3-Clause", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "numpy", + "packageVersion": "1.25.1", + "license": "BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "pandas", + "packageVersion": "2.0.3", + "license": "BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "pycparser", + "packageVersion": "2.21", + "license": "BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "pynacl", + "packageVersion": "1.5.0", + "license": "Apache-2.0", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "python-dateutil", + "packageVersion": "2.8.2", + "license": "Apache Software License, BSD License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "pytz", + "packageVersion": "2023.3", + "license": "MIT License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "pyyaml", + "packageVersion": "6.0", + "license": "MIT License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "rapidfuzz", + "packageVersion": "3.1.1", + "license": "MIT", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "requests", + "packageVersion": "2.1.0", + "license": "Apache Software License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "six", + "packageVersion": "1.16.0", + "license": "MIT", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "tzdata", + "packageVersion": "2023.3", + "license": "Apache Software License", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + }, + { + "packageName": "werkzeug", + "packageVersion": "2.3.6", + "license": "BSD-3-Clause", + "registry": "PyPi", + "severity": "clean", + "filePath": "poetry.lock" + } + ] +} diff --git a/packages/backend/src/megalinter/parsers/parse-details.ts b/packages/backend/src/megalinter/parsers/parse-details.ts new file mode 100644 index 0000000..77b3def --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-details.ts @@ -0,0 +1,29 @@ +import { AnalysisType, ReportState } from "shared-types"; +import { ReportStore } from "../../stores/be-report-store"; +import { logger } from "../../utils/logger"; +import { BaseMessage } from "../megalinter-types"; +import fileDetailsMock from "../mocks/file-details.json"; +import repoDetailsMock from "../mocks/repo-details.json"; + +const mock: ReportState["repoDetails"] = { + ...repoDetailsMock, + latestVersionDate: new Date(repoDetailsMock.latestVersionDate), +}; + +export const parseDetails = (_: BaseMessage, reportStore: ReportStore) => { + const { resourceType, fileDetails, repoDetails } = reportStore.get(); + + if (fileDetails || repoDetails) { + return; + } + + logger.megalinter.log(`parseDetails: resourceType: "${resourceType}"`); + switch (resourceType) { + case AnalysisType.File: + reportStore.set({ fileDetails: fileDetailsMock }); + break; + case AnalysisType.Repo: + reportStore.set({ repoDetails: mock }); + break; + } +}; diff --git a/packages/backend/src/megalinter/parsers/parse-errors.test.ts b/packages/backend/src/megalinter/parsers/parse-errors.test.ts new file mode 100644 index 0000000..90f1742 --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-errors.test.ts @@ -0,0 +1,47 @@ +import { MegalinterErrorMessage, MessageType } from "../megalinter-types"; +import { parseMegalinterError } from "./parse-errors"; + +const storeMock = { + set: jest.fn(), + get: jest.fn().mockImplementation(() => ({ linters: [{ name: "devskim" }] })), + subscribe: jest.fn(), +}; + +describe("parse-errors", () => { + test("parseMegalinterError", () => { + const linterErrorMessage = { + messageType: MessageType.ServerError, + message: "Some error message", + errorCode: "gitCloneError", + errorDetails: { + error: "Some error details", + }, + requestId: "123", + }; + parseMegalinterError( + linterErrorMessage as MegalinterErrorMessage, + storeMock + ); + + expect(storeMock.set).toBeCalledWith({ + analysisError: { + errorCode: "gitCloneError", + errorMessage: "Some error message", + errorDetails: "Some error details", + }, + }); + }); + + test("parseMegalinterError should fail gracefully", () => { + const linterErrorMessage = {}; + + try { + parseMegalinterError( + linterErrorMessage as MegalinterErrorMessage, + storeMock + ); + } catch (err) { + expect(err.message).toBe("Unable to parse megalinter error message"); + } + }); +}); diff --git a/packages/backend/src/megalinter/parsers/parse-errors.ts b/packages/backend/src/megalinter/parsers/parse-errors.ts new file mode 100644 index 0000000..d2a2c2e --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-errors.ts @@ -0,0 +1,23 @@ +import { ReportStore } from "../../stores/be-report-store"; +import { logger } from "../../utils/logger"; +import { MegalinterErrorMessage } from "../megalinter-types"; + +export const parseMegalinterError = ( + msg: MegalinterErrorMessage, + reportStore: ReportStore +) => { + try { + const { errorCode, message, errorDetails } = msg; + const analysisError = { + errorCode, + errorMessage: message, + errorDetails: errorDetails.error, + }; + reportStore.set({ + analysisError, + }); + } catch (err) { + logger.megalinter.error(err); + throw new Error("Unable to parse megalinter error message"); + } +}; diff --git a/packages/backend/src/megalinter/parsers/parse-linter-status.test.ts b/packages/backend/src/megalinter/parsers/parse-linter-status.test.ts new file mode 100644 index 0000000..16f9ada --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-linter-status.test.ts @@ -0,0 +1,25 @@ +import { LinterStatus } from "shared-types"; +import { LinterCompleteMessage } from "../megalinter-types"; +import { parseLinterStatus } from "./parse-linter-status"; + +const storeMock = { + set: jest.fn(), + get: jest.fn().mockImplementation(() => ({ linters: [{ name: "devskim" }] })), + subscribe: jest.fn(), +}; + +describe("parse-linter-status", () => { + test("parseLinterStatus", () => { + const linterCompleteMessage = { + linterStatus: LinterStatus.Success, + linterId: "devskim", + }; + parseLinterStatus( + linterCompleteMessage as LinterCompleteMessage, + storeMock + ); + expect(storeMock.set).toBeCalledWith({ + linters: [{ name: "devskim", status: LinterStatus.Success }], + }); + }); +}); diff --git a/packages/backend/src/megalinter/parsers/parse-linter-status.ts b/packages/backend/src/megalinter/parsers/parse-linter-status.ts new file mode 100644 index 0000000..285f665 --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-linter-status.ts @@ -0,0 +1,17 @@ +import { ReportStore } from "../../stores/be-report-store"; +import { LinterCompleteMessage } from "../megalinter-types"; + +export const parseLinterStatus = ( + msg: LinterCompleteMessage, + reportStore: ReportStore +) => { + const { linterStatus, linterId } = msg; + const { linters } = reportStore.get(); + const linter = linters.find((linter) => linter.name === linterId); + if (linter) { + linter.status = linterStatus; + reportStore.set({ linters: [...linters] }); + } + + return linter; +}; diff --git a/packages/backend/src/megalinter/parsers/parse-megalinter-complete.test.ts b/packages/backend/src/megalinter/parsers/parse-megalinter-complete.test.ts new file mode 100644 index 0000000..622661c --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-megalinter-complete.test.ts @@ -0,0 +1,52 @@ +import { AnalysisStatus } from "shared-types"; +import { MegalinterCompleteMessage } from "../megalinter-types"; +import { parseMegalinterComplete } from "./parse-megalinter-complete"; + +const storeMock = { + set: jest.fn(), + get: jest.fn().mockImplementation(() => ({ linters: [{ name: "devskim" }] })), + subscribe: jest.fn(), +}; + +describe("parse-megalinter-complete", () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + test("set status to completed", () => { + const megalinterCompleteMessage = { + megaLinterStatus: AnalysisStatus.Completed, + }; + parseMegalinterComplete( + megalinterCompleteMessage as MegalinterCompleteMessage, + storeMock + ); + expect(storeMock.set).toBeCalledWith({ + status: AnalysisStatus.Completed, + }); + }); + + test("set status to created", () => { + const megalinterCompleteMessage = { + megaLinterStatus: AnalysisStatus.Created, + }; + parseMegalinterComplete( + megalinterCompleteMessage as MegalinterCompleteMessage, + storeMock + ); + expect(storeMock.set).toBeCalledWith({ + status: AnalysisStatus.Created, + }); + }); + + test("should not set an unknown status", () => { + const megalinterCompleteMessage = { + megaLinterStatus: "someUnknownStatus", + }; + parseMegalinterComplete( + megalinterCompleteMessage as MegalinterCompleteMessage, + storeMock + ); + expect(storeMock.set).not.toBeCalled(); + }); +}); diff --git a/packages/backend/src/megalinter/parsers/parse-megalinter-complete.ts b/packages/backend/src/megalinter/parsers/parse-megalinter-complete.ts new file mode 100644 index 0000000..25946dc --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-megalinter-complete.ts @@ -0,0 +1,16 @@ +import { AnalysisStatus } from "shared-types"; +import { ReportStore } from "../../stores/be-report-store"; +import { MegalinterCompleteMessage } from "../megalinter-types"; + +export const parseMegalinterComplete = ( + msg: MegalinterCompleteMessage, + reportStore: ReportStore +) => { + const { megaLinterStatus } = msg; + if ( + megaLinterStatus === AnalysisStatus.Created || + megaLinterStatus === AnalysisStatus.Completed + ) { + reportStore.set({ status: megaLinterStatus }); + } +}; diff --git a/packages/backend/src/megalinter/parsers/parse-megalinter-start.test.ts b/packages/backend/src/megalinter/parsers/parse-megalinter-start.test.ts new file mode 100644 index 0000000..3cf2b5a --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-megalinter-start.test.ts @@ -0,0 +1,63 @@ +import { AnalysisStatus, LinterStatus } from "shared-types"; +import { + MegalinterStartMessage, + MessageType, + RawLinter, +} from "../megalinter-types"; +import { parseMegalinterStart } from "./parse-megalinter-start"; + +const storeMock = { + set: jest.fn(), + get: jest.fn(), + subscribe: jest.fn(), +}; + +const docUrl = "https://www.google.com"; + +const messageMock: MegalinterStartMessage = { + isSBOM: false, + megaLinterStatus: AnalysisStatus.Created, + messageType: MessageType.MegalinterStart, + linters: [ + { + linterId: "devskim", + docUrl, + linterStatus: LinterStatus.Started, + } as RawLinter, + { + linterId: "gitleaks", + docUrl, + linterStatus: undefined, + } as RawLinter, + { + linterId: "trivy-sbom", + isSBOM: true, + docUrl, + linterStatus: undefined, + } as RawLinter, + ], +}; + +describe("parse-megalinter-start", () => { + test("add linters to store", () => { + parseMegalinterStart(messageMock, storeMock); + expect(storeMock.set).toBeCalledWith({ + linters: [ + { + name: "devskim", + errors: 0, + severity: undefined, + docUrl, + status: LinterStatus.Started, + }, + { + name: "gitleaks", + errors: 0, + severity: undefined, + docUrl, + status: LinterStatus.Started, + }, + ], + }); + }); +}); diff --git a/packages/backend/src/megalinter/parsers/parse-megalinter-start.ts b/packages/backend/src/megalinter/parsers/parse-megalinter-start.ts new file mode 100644 index 0000000..f5261e3 --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-megalinter-start.ts @@ -0,0 +1,27 @@ +import { LinterStatus } from "shared-types"; +import { ReportStore } from "../../stores/be-report-store"; +import { + MegalinterStartMessage, + MessageType, + RawLinter, +} from "../megalinter-types"; + +export const parseMegalinterStart = ( + msg: MegalinterStartMessage, + reportStore: ReportStore +) => { + if (msg.messageType === MessageType.MegalinterStart) { + const linters = msg.linters.filter(filterLinters).map((linter) => ({ + name: linter.linterId, + errors: 0, + severity: undefined, + docUrl: linter.docUrl, + status: linter.linterStatus || LinterStatus.Started, + })); + + reportStore.set({ linters }); + } +}; + +// filter out linters with isSBOM (Megalinter requirment) +const filterLinters = (linter: RawLinter): boolean => !linter.isSBOM; diff --git a/packages/backend/src/megalinter/parsers/parse-sarif.ts b/packages/backend/src/megalinter/parsers/parse-sarif.ts new file mode 100644 index 0000000..b77dd5f --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-sarif.ts @@ -0,0 +1,249 @@ +/* eslint-disable */ +import { Issue, OneOfValues, Severity } from "shared-types"; +import { BaseMessage } from "../megalinter-types"; + +export const parseSarif = (msg: any) => { + console.log(`Processing sarif or json message from ${msg.linterKey}...`); + let topSeverity: OneOfValues = Severity.Clean; + let score = 0; + let toolName = msg.linterId; + const issues: Issue[] = []; + + // SBOM results case + if ( + msg?.outputSarif && + msg.outputSarif?.properties && + msg.outputSarif.properties.isSBOM === true + ) { + const sbom = msg.outputSarif.runs[0].properties.megalinter.sbom; + console.log("SBOM: " + JSON.stringify(sbom, null, 2)); // TODO Itay here do what you need with SBOM :) + } + + // simple json, no sarif, like for trufflehog + if (msg?.outputJson) { + const jsonResult = msg.outputJson; + console.log("JSON: " + JSON.stringify(jsonResult, null, 2)); // TODO Eyal do what you need with JSON :) + } + + if ( + msg?.outputSarif && + msg.outputSarif?.runs && + msg.outputSarif.runs.length > 0 && + msg.outputSarif.runs[0]?.results + ) { + const toolResults: Result[] = msg.outputSarif.runs[0].results; + + // const jsonString = JSON.stringify(msg, null, 2); // Convert JSON data to a formatted string + // fs.writeFile(`/Users/eyal/ox/code-total/local/${toolName}.json`, jsonString, 'utf8', (err) => { + // if (err) { + // console.error('Error writing JSON file:', err); + // } else { + // console.log('JSON file has been saved!'); + // } + // }); + + toolResults.forEach((toolResult: Result) => { + // console.log(toolName); + // if (toolName == "tflint" || toolName == "semgrep") { + // let a = 1; + // console.log(toolResult); + // } + let location = ""; + let lineNumber = 1; + let ruleId = ""; + let title = ""; + let severity: OneOfValues; + if (toolResult?.locations && toolResult.locations.length > 0) { + if (toolResult.locations[0]?.physicalLocation?.artifactLocation?.uri) { + location = + toolResult.locations[0].physicalLocation.artifactLocation.uri; + if ( + location.startsWith("/tmp/") || + location.startsWith("file:///tmp/") + ) { + location = location + .replace("file://", "") + .split("/") + .slice(3) + .join("/"); + } + } + if (toolResult?.locations[0]?.physicalLocation?.region?.startLine) { + lineNumber = + toolResult.locations[0].physicalLocation.region.startLine; + } + } + if (toolResult?.ruleId) { + ruleId = toolResult?.ruleId; + } + + if (toolResult?.message?.text && toolResult.message.text.length < 150) { + title = toolResult.message.text; + } else { + const ruleInfo = msg.outputSarif?.runs?.[0]?.tool?.driver?.rules?.find( + (i) => i?.id === toolResult.ruleId + ); + if (ruleInfo != undefined) { + if ( + ruleInfo?.shortDescription && + (!ruleInfo.shortDescription.text.includes(ruleId) || + ruleInfo.shortDescription.text.length - ruleId.length > 20) + ) + title = ruleInfo.shortDescription.text; + else if (ruleInfo?.fullDescription) + title = ruleInfo.fullDescription.text; + else if (ruleInfo?.help?.text) title = ruleInfo.help.text; + else if (ruleInfo?.name) title = ruleInfo.name; + } + } + if (!title && ruleId) { + title = ruleId; + } + if (toolResult?.level) { + if (severityMapping.hasOwnProperty(toolResult.level)) { + severity = severityMapping[toolResult.level]; + } else { + severity = "medium"; + } + } else { + severity = getSevirtyBasedOnProperty(toolResult, toolName); + } + + issues.push({ + location, + lineNumber, + ruleId, + title, + severity, + }); + }); + } + + if (issues.length > 0) { + const severityOrder = ["critical", "high", "medium", "low"]; + issues.sort( + (a, b) => + severityOrder.indexOf(a.severity) - severityOrder.indexOf(b.severity) + ); + topSeverity = issues[0].severity; + const countBySeverity = issues.reduce((counts, item) => { + const { severity } = item; + counts[severity] = (counts[severity] || 0) + 1; + return counts; + }, {}); + const lowSum = countBySeverity["low"] + ? Math.min(20, countBySeverity["low"] * 2) + : 0; + const mediumSum = countBySeverity["medium"] + ? Math.min(40, countBySeverity["medium"] * 3) + : 0; + const highSum = countBySeverity["high"] + ? Math.min(80, countBySeverity["high"] * 7) + : 0; + const criticalSum = countBySeverity["critical"] + ? Math.min(100, countBySeverity["critical"] * 13) + : 0; + const totalSum = lowSum + mediumSum + highSum + criticalSum; + score = Math.min(100, totalSum); + } + + return { ...msg, issues, score, severity: topSeverity }; +}; + +export interface SarifRawMessage extends BaseMessage { + outputSarif: { + properties: { + isSBOM: boolean; + }; + runs: { + properties: { + megalinter: { + sbom: any; + }; + }; + tool: { + driver: { + rules: { + id: string; + name: string; + shortDescription: { + text: string; + }; + fullDescription: { + text: string; + }; + help?: any; + helpUri?: string; + }[]; + }; + }; + results: Result[]; + }[]; + }; + outputJson: any; +} + +export interface SarifMessage extends BaseMessage { + issues: Issue[]; +} + +interface Result { + fixes?: any[]; + locations?: any[]; + message?: { + text: string; + }; + properties?: any; + ruleId?: string; + level?: string | number; +} + +export const severityMapping: Record> = { + error: "high", + warning: "medium", + info: "low", +}; + +export const getSevirtyBasedOnProperty = (toolResult, toolName) => { + if (toolName === "devskim") { + if (!toolResult?.properties?.DevSkimSeverity) return ""; + + const devSeverity = toolResult?.properties?.DevSkimSeverity; + if (devSeverity == 1) return "low"; + if (devSeverity == 2) return "medium"; + if (devSeverity == 3) return "high"; + if (devSeverity == 4) return "high"; + } + if (toolName.toLowerCase() === "bandit") { + if (toolResult?.properties?.issue_severity) + return toolResult?.properties?.issue_severity.toLowerCase(); + } + return "medium"; +}; + +// const gitleaks_filepath = '/Users/eyal/ox/code-total/local/gitleaks.json' +// const checkov_filepath = '/Users/eyal/ox/code-total/local/checkov.json' +// const tflint_filepath = '/Users/eyal/ox/code-total/local/tflint.json' +// const terrascan_filepath = '/Users/eyal/ox/code-total/local/terrascan.json' +// const devskim_filepath = '/Users/eyal/ox/code-total/local/devskim.json' +// const trivy_filepath = '/Users/eyal/ox/code-total/local/trivy.json' +// const bandit_filepath = '/Users/eyal/ox/code-total/local/bandit.json' +// const semgrep_filepath = '/Users/eyal/ox/code-total/local/semgrep.json' + +// const files: string[] = [gitleaks_filepath, checkov_filepath, tflint_filepath, terrascan_filepath, devskim_filepath, trivy_filepath, bandit_filepath, semgrep_filepath] + +// files.forEach((path: string) => { +// fs.readFile(path, 'utf8', (err, data) => { +// if (err) { +// console.error('Error reading JSON file:', err); +// } else { +// try { +// const debugMsg = JSON.parse(data); +// const issues = getIssueList(debugMsg as SarifMessage); +// console.log(path, issues.length); +// } catch (parseError) { +// console.error('Error parsing JSON:', parseError); +// } +// } +// }); +// }); diff --git a/packages/backend/src/megalinter/parsers/parse-sbom.ts b/packages/backend/src/megalinter/parsers/parse-sbom.ts new file mode 100644 index 0000000..0ed104a --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parse-sbom.ts @@ -0,0 +1,153 @@ +import { SbomPackage, Severity } from "shared-types"; +import { ReportStore } from "../../stores/be-report-store"; +import { LinterCompleteMessage } from "../megalinter-types"; +import axios from "axios"; +import licenseConfig from "../../sbom/licenseConfig.json"; +// import packagesMock from "../mocks/sbom-packages.json"; + +export const parseSBOM = async (msg: LinterCompleteMessage, reportStore: ReportStore) => { + const { packages } = reportStore.get(); + if (!packages) { + if (msg?.outputSarif?.runs + && msg?.outputSarif?.runs.length > 0 + && msg.outputSarif.runs[0]?.properties?.megalinter?.sbom) { + console.log('parsing sbom...') + + const components = msg.outputSarif.runs[0].properties.megalinter.sbom.components as Component[]; + const dependencies = msg.outputSarif.runs[0].properties.megalinter.sbom.dependencies as Dependency[]; + const applications = extractMappingForApplication(components); + const sbomPackages: SbomPackage[] = await getPackages(dependencies, components, applications); + if (sbomPackages && sbomPackages.length > 0) { + reportStore.set({ packages: sbomPackages }); + } + } + } +}; + +interface Component { + "bom-ref": string; + type: string; + name?: string; + version?: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + properties?: any[]; + purl?: string; +} + +interface Dependency { + ref: string; + dependsOn?: string[]; +} + +interface LicenseInfo { + license: string; + severity: string; +} + +function sortByLicenseLength(arr: LicenseInfo[]): LicenseInfo[] { + return arr.sort((a, b) => b.license.length - a.license.length); +} + +async function getPackages(dependencies: Dependency[], components: Component[], applications: Record) { + const sbomPackages: SbomPackage[] = []; + const sortedLicenseConfig = sortByLicenseLength(licenseConfig); + let filePath = "" + + for (const dependency of dependencies) { + // if (applications.hasOwnProperty(dependency.ref)) { + if ( Object.prototype.hasOwnProperty.call(applications, dependency.ref) ) { + filePath = applications[dependency.ref] + } else { + console.log(`no application for ref: ${dependency.ref}`); + } + if (dependency.dependsOn) { + for(const purl of dependency.dependsOn) { + console.log(`working on purl ${purl}`); + const component = components.find((component) => component.purl === purl); + let registry = ""; + let license = "Unknown"; + let severity = Severity.Medium; + if (component) { + const packageName = component.name; + const packageVersion = component.version; + if (purl.startsWith("pkg:pypi")) { + registry = "PyPi"; + try { + const packageInfo = await fetchDataFromPyPi(packageName, packageVersion); + console.log('Package Info fetched successfully for:', packageName); + + const sourceList: string[]= []; + if (packageInfo?.info?.license) { + sourceList.push(packageInfo.info.license); + } + if (packageInfo.info.classifiers) { + sourceList.push(packageInfo?.info.classifiers.join(' ')); + } + + if (sourceList.length == 0) { + console.log(`no where to get license for ${packageName}`); + } else { + for (const licenseSoruce of sourceList) { + const licenseItem = sortedLicenseConfig.find(item => licenseSoruce.includes(item.license)); + if (licenseItem) { + license = licenseItem.license; + severity = Severity[licenseItem.severity]; + break; + } + } + } + + } catch (error) { + console.error('Error:', error); + } + } else { + console.log(`purl: ${purl}`); + } + sbomPackages.push({ + packageName: component.name, + packageVersion: component.version, + license: license, + registry: registry, + severity: severity, + filePath: filePath, + }); + } else { + console.log(`missing component info, purl: ${purl}`); + } + } + } else { + console.log(`no depends for ref: ${dependency.ref}`); + } + } + + const severityOrder = ["critical", "high", "medium", "low"]; + sbomPackages.sort( + (a, b) => + severityOrder.indexOf(b.severity) - severityOrder.indexOf(a.severity) + ); + return sbomPackages; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +async function fetchDataFromPyPi(name: string, version: string): Promise { + try { + const url = `https://pypi.org/pypi/${name}/${version}/json` + const response = await axios.get(url); + return response.data; + } catch (error) { + console.error('Error fetching data:', error); + throw error; + } +} + +function extractMappingForApplication(components: Component[]): Record { + const mapping: Record = {}; + + for (const component of components) { + if (component.type === "application") { + mapping[component["bom-ref"]] = component.name; + } + } + + return mapping; +} diff --git a/packages/backend/src/megalinter/parsers/parser.ts b/packages/backend/src/megalinter/parsers/parser.ts new file mode 100644 index 0000000..a24c63d --- /dev/null +++ b/packages/backend/src/megalinter/parsers/parser.ts @@ -0,0 +1,63 @@ +import { ReportStore } from "../../stores/be-report-store"; +import { + BaseMessage, + LinterCompleteMessage, + MegalinterCompleteMessage, + MegalinterErrorMessage, + MegalinterStartMessage, + MessageType, +} from "../megalinter-types"; +import { parseDetails } from "./parse-details"; +import { parseMegalinterError } from "./parse-errors"; +import { parseLinterStatus } from "./parse-linter-status"; +import { parseMegalinterComplete } from "./parse-megalinter-complete"; +import { parseMegalinterStart } from "./parse-megalinter-start"; +import { parseSarif } from "./parse-sarif"; +import { parseSBOM } from "./parse-sbom"; + +export const parseMessage = (msg: BaseMessage, reportStore: ReportStore) => { + switch (msg.messageType) { + case MessageType.MegalinterStart: + parseMegalinterStart(msg as MegalinterStartMessage, reportStore); + break; + case MessageType.MegalinterComplete: + parseMegalinterComplete(msg as MegalinterCompleteMessage, reportStore); + + break; + case MessageType.LinterComplete: + if (msg.isSBOM) { + parseSBOM(msg as LinterCompleteMessage, reportStore); + } else { + runSarif(msg as LinterCompleteMessage, reportStore); + } + parseLinterStatus(msg as LinterCompleteMessage, reportStore); + break; + case MessageType.ServerError: + parseMegalinterError(msg as MegalinterErrorMessage, reportStore); + break; + } + + parseDetails(msg, reportStore); +}; + +const runSarif = (msg: LinterCompleteMessage, reportStore: ReportStore) => { + if (msg.outputSarif || msg.outputJson) { + const sarifResults = parseSarif(msg); + + if (sarifResults.issues) { + const { linters } = reportStore.get(); + const linter = linters.find((linter) => linter.name === msg.linterId); + if (linter) { + linter.issues = sarifResults.issues; + linter.severity = sarifResults.severity; + } + reportStore.set({ linters: [...linters] }); + } + if ( + sarifResults.score > 0 && + sarifResults.score > reportStore.get().score + ) { + reportStore.set({ score: sarifResults.score }); + } + } +}; diff --git a/packages/backend/src/sbom/licenseConfig.json b/packages/backend/src/sbom/licenseConfig.json new file mode 100644 index 0000000..4aaed96 --- /dev/null +++ b/packages/backend/src/sbom/licenseConfig.json @@ -0,0 +1,330 @@ +[ + { + "license": "Proprietary", + "severity": "Critical" + }, + { + "license": "Commercial", + "severity": "Critical" + }, + { + "license": "Closed Source", + "severity": "Critical" + }, + { + "license": "Binary Only", + "severity": "Critical" + }, + { + "license": "EULA", + "severity": "Critical" + }, + { + "license": "Academic Free License 2.0", + "severity": "High" + }, + { + "license": "Common Public License 1.0", + "severity": "High" + }, + { + "license": "Mozilla Public License 1.0", + "severity": "High" + }, + { + "license": "JasPer License", + "severity": "High" + }, + { + "license": "LESSER GENERAL PUBLIC LICENSE", + "severity": "High" + }, + { + "license": "ISC License (ISC)", + "severity": "Medium" + }, + { + "license": "Simplified BSD License", + "severity": "Medium" + }, + { + "license": "New BSD License", + "severity": "Medium" + }, + { + "license": "Academic Free License 3.0", + "severity": "Medium" + }, + { + "license": "EPL 1.0", + "severity": "Medium" + }, + { + "license": "GNU General Public License v2.0", + "severity": "Medium" + }, + { + "license": "GNU Lesser General Public License v2.1", + "severity": "Medium" + }, + { + "license": "GNU Free Documentation License v1.3", + "severity": "Medium" + }, + { + "license": "Python Software Foundation License", + "severity": "Medium" + }, + { + "license": "Mozilla Public License 1.1", + "severity": "Medium" + }, + { + "license": "Apache License 1.1", + "severity": "Medium" + }, + { + "license": "JasPer License, Version 2.0", + "severity": "Medium" + }, + { + "license": "W3C Software Notice and License", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Components", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Public Documents", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Executable Files", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Documentation", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Test Fixtures", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Fonts", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Images", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Templates", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Style Sheets", + "severity": "Low" + }, + { + "license": "W3C Software Notice and License for Scripts", + "severity": "Low" + }, + { + "license": "W3C", + "severity": "Low" + }, + { + "license": "Apache License 2.0", + "severity": "Clean" + }, + { + "license": "MIT License", + "severity": "Clean" + }, + { + "license": "BSD 3-Clause License", + "severity": "Clean" + }, + { + "license": "BSD 2-Clause License", + "severity": "Clean" + }, + { + "license": "ISC License", + "severity": "Clean" + }, + { + "license": "WTFPL", + "severity": "Clean" + }, + { + "license": "Zlib License", + "severity": "Clean" + }, + { + "license": "Artistic License 2.0", + "severity": "Clean" + }, + { + "license": "GNU General Public License v3.0", + "severity": "Clean" + }, + { + "license": "GNU Lesser General Public License v3.0", + "severity": "Clean" + }, + { + "license": "Mozilla Public License 2.0", + "severity": "Clean" + }, + { + "license": "Eclipse Public License 2.0", + "severity": "Clean" + }, + { + "license": "Apache License 2.0 with LLVM Exception", + "severity": "Clean" + }, + { + "license": "OpenSSL License", + "severity": "Clean" + }, + { + "license": "Boost Software License 1.0", + "severity": "Clean" + }, + { + "license": "Apache License 2.0 with HealthCare Disclaimer", + "severity": "Clean" + }, + { + "license": "GNU Affero General Public License v3.0", + "severity": "Clean" + }, + { + "license": "Universal Permissive License 1.0", + "severity": "Clean" + }, + { + "license": "University of Illinois/NCSA Open Source License", + "severity": "Clean" + }, + { + "license": "Common Public License 1.0", + "severity": "Clean" + }, + { + "license": "JasPer License", + "severity": "Clean" + }, + { + "license": "LESSER GENERAL PUBLIC LICENSE", + "severity": "Clean" + }, + { + "license": "ISC License (ISC)", + "severity": "Clean" + }, + { + "license": "Simplified BSD License", + "severity": "Clean" + }, + { + "license": "New BSD License", + "severity": "Clean" + }, + { + "license": "Academic Free License 3.0", + "severity": "Clean" + }, + { + "license": "EPL 1.0", + "severity": "Clean" + }, + { + "license": "GNU General Public License v2.0", + "severity": "Clean" + }, + { + "license": "GNU Lesser General Public License v2.1", + "severity": "Clean" + }, + { + "license": "GNU Free Documentation License v1.3", + "severity": "Clean" + }, + { + "license": "Python Software Foundation License", + "severity": "Clean" + }, + { + "license": "Mozilla Public License 1.1", + "severity": "Clean" + }, + { + "license": "Apache License 1.1", + "severity": "Clean" + }, + { + "license": "JasPer License, Version 2.0", + "severity": "Clean" + }, + { + "license": "MPL-2.0", + "severity": "Clean" + }, + { + "license": "MPL", + "severity": "Clean" + }, + { + "license": "MIT", + "severity": "Clean" + }, + { + "license": "AGPL", + "severity": "High" + }, + { + "license": "LGPL", + "severity": "High" + }, + { + "license": "GPL", + "severity": "High" + }, + { + "license": "ISC", + "severity": "Clean" + }, + { + "license": "BSD", + "severity": "Clean" + }, + { + "license": "BSD License", + "severity": "Clean" + }, + { + "license": "0BSD", + "severity": "Clean" + }, + { + "license": "Apache License", + "severity": "Clean" + }, + { + "license": "Apache Software License", + "severity": "Clean" + }, + { + "license": "Public Domain", + "severity": "Clean" + }, + { + "license": "Apache 2.0", + "severity": "Clean" + } +] diff --git a/packages/backend/src/stores/be-report-store.test.ts b/packages/backend/src/stores/be-report-store.test.ts new file mode 100644 index 0000000..e2df2ac --- /dev/null +++ b/packages/backend/src/stores/be-report-store.test.ts @@ -0,0 +1,14 @@ +import { AnalysisStatus } from "shared-types"; +import { createReportStore } from "./be-report-store"; +import { getStore } from "./stores-map"; + +describe("report-store", () => { + test("Create store with initial state", () => { + const reportStore = createReportStore("123"); + expect(getStore("123").get().requestId).toEqual("123"); + expect(getStore("123").get().status).toEqual(AnalysisStatus.Created); + expect(getStore("123").get().score).toEqual(0); + expect(getStore("123").get().analysisError).toEqual(undefined); + expect(getStore("123")).toEqual(reportStore); + }); +}); diff --git a/packages/backend/src/stores/be-report-store.ts b/packages/backend/src/stores/be-report-store.ts new file mode 100644 index 0000000..7773b24 --- /dev/null +++ b/packages/backend/src/stores/be-report-store.ts @@ -0,0 +1,33 @@ +import { AnalysisStatus, ReportState } from "shared-types"; +import { logger } from "../utils/logger"; +import { Store, createStore } from "./store"; +import { addStore } from "./stores-map"; + +export const createReportStore = (requestId: string) => { + logger.stores.log(`Creating report store for requestId: "${requestId}"`); + + const reportStore = createStore({ + requestId, + resourceType: undefined, + resourceValue: undefined, + status: AnalysisStatus.Created, + linters: undefined, + packages: undefined, + repoDetails: undefined, + fileDetails: undefined, + score: 0, + analysisError: undefined, + }); + + // save the store instance for later use + addStore(requestId, reportStore); + + return reportStore; +}; + +export type InitialReportStoreState = Pick< + ReportState, + "requestId" | "status" | "score" +>; + +export type ReportStore = Store; diff --git a/packages/backend/src/stores/store.test.ts b/packages/backend/src/stores/store.test.ts new file mode 100644 index 0000000..9706a70 --- /dev/null +++ b/packages/backend/src/stores/store.test.ts @@ -0,0 +1,36 @@ +import { createStore } from "./store"; + +interface MockState { + a: number; + b: number; + c?: number; +} +const mockState = { a: 123, b: 123 }; + +describe("store", () => { + test("store partial state", () => { + const { set, get } = createStore(mockState); + set({ c: 123 }); + expect(get()).toEqual({ ...mockState, c: 123 }); + }); + + test("not leak information between stores", () => { + const store1 = createStore(mockState); + const store2 = createStore(mockState); + store1.set({ c: 123 }); + expect(store2.get()).toEqual(mockState); + }); + + test("subscribe to updates", () => { + const store = createStore(mockState); + const callback = jest.fn(); + store.subscribe(callback); + + store.set({ a: 123 }); + store.set({ b: 456 }); + + expect(callback).toBeCalledWith({ a: 123 }); + expect(callback).toHaveBeenLastCalledWith({ b: 456 }); + expect(callback).toHaveBeenCalledTimes(2); + }); +}); diff --git a/packages/backend/src/stores/store.ts b/packages/backend/src/stores/store.ts new file mode 100644 index 0000000..0d7c9ba --- /dev/null +++ b/packages/backend/src/stores/store.ts @@ -0,0 +1,37 @@ +import { logger } from "../utils/logger"; + +export const createStore = ( + initialState: State +): Store => { + let state: State = initialState; + let _callback = undefined; + + const set = (newState: Partial) => { + logger.stores.log( + `Setting store keys: ${Object.keys(newState).join(", ")}` + ); + state = { ...state, ...newState }; + _callback && _callback(newState); + }; + + const get = (): State => { + return state; + }; + + const subscribe = (callback: (state: State) => void) => { + logger.stores.log(`Subscribed to store`); + _callback = callback; + }; + + return { + subscribe, + get, + set, + }; +}; + +export interface Store { + get(): State; + set(state: Partial): void; + subscribe(callback: (state: Partial) => void): void; +} diff --git a/packages/backend/src/stores/stores-map.test.ts b/packages/backend/src/stores/stores-map.test.ts new file mode 100644 index 0000000..6bf6ca5 --- /dev/null +++ b/packages/backend/src/stores/stores-map.test.ts @@ -0,0 +1,9 @@ +import { ReportStore } from "./be-report-store"; +import { addStore, getStore } from "./stores-map"; + +describe("stores-map", () => { + test("add and get store by requestId", () => { + addStore("123", { test: "123" } as unknown as ReportStore); + expect(getStore("123")).toEqual({ test: "123" }); + }); +}); diff --git a/packages/backend/src/stores/stores-map.ts b/packages/backend/src/stores/stores-map.ts new file mode 100644 index 0000000..e4b8d48 --- /dev/null +++ b/packages/backend/src/stores/stores-map.ts @@ -0,0 +1,11 @@ +import { ReportStore } from "./be-report-store"; + +const storesMap = new Map(); + +export const addStore = (requestId: string, store: ReportStore) => { + storesMap.set(requestId, store); +}; + +export const getStore = (requestId: string) => { + return storesMap.get(requestId); +}; diff --git a/packages/backend/src/transport/redis-client.test.ts b/packages/backend/src/transport/redis-client.test.ts new file mode 100644 index 0000000..d2d774a --- /dev/null +++ b/packages/backend/src/transport/redis-client.test.ts @@ -0,0 +1,42 @@ +import * as redis from "redis"; +import config from "../config"; +import { startRedisClient, subscribeToRedis } from "./redis-client"; + +const mRedisClient = { + connect: jest.fn().mockImplementation(), + subscribe: jest.fn().mockImplementation(), +}; + +const createClientSpy = jest + .spyOn(redis, "createClient") + .mockReturnValue(mRedisClient as unknown as redis.RedisClientType); + +describe("redis-client", () => { + test("startRedisClient", async () => { + await startRedisClient(); + expect(createClientSpy).toBeCalledWith({ + url: config.MEGALINTER_REDIS_URL, + }); + expect(mRedisClient.connect).toBeCalled(); + }); + + test("createRedisClient should fail gracefully", async () => { + createClientSpy.mockImplementation(() => { + throw new Error("error"); + }); + try { + await startRedisClient(); + } catch (err) { + expect(err.message).toBe("error"); + } + }); + + test("subscribeToRedis", async () => { + const callback = noop; + await subscribeToRedis("channel-123", callback); + expect(mRedisClient.subscribe).toBeCalledWith("channel-123", callback); + }); +}); + +// eslint-disable-next-line @typescript-eslint/no-empty-function +const noop = () => {}; diff --git a/packages/backend/src/transport/redis-client.ts b/packages/backend/src/transport/redis-client.ts new file mode 100644 index 0000000..27e2647 --- /dev/null +++ b/packages/backend/src/transport/redis-client.ts @@ -0,0 +1,27 @@ +import { RedisClientType, createClient } from "redis"; +import config from "../config"; +import { logger } from "../utils/logger"; + +let _client: RedisClientType; + +export const startRedisClient = async (): Promise => { + try { + _client = createClient({ + url: config.MEGALINTER_REDIS_URL, + }); + await _client.connect(); + logger.transport.log("Redis client created"); + return; + } catch (err) { + logger.transport.error("Unable to create a Redis client", err); + throw err; + } +}; + +export const subscribeToRedis = async ( + channel: string, + callback: (msg: string) => void +) => { + await _client.subscribe(channel, callback); + logger.transport.log(`Redis subscribed to channel: "${channel}"`); +}; diff --git a/packages/backend/src/transport/ws-server.test.ts b/packages/backend/src/transport/ws-server.test.ts new file mode 100644 index 0000000..79d2647 --- /dev/null +++ b/packages/backend/src/transport/ws-server.test.ts @@ -0,0 +1,26 @@ +import { WebSocketServer } from "ws"; +import { createWSServer, listenToWSConnection } from "./ws-server"; + +// mock WS to avoid openning a real mock server +// during unit tests +jest.mock("ws", () => ({ + WebSocketServer: jest.fn(() => ({ + on: jest.fn(), + })), +})); + +const mock = { on: jest.fn() }; + +describe("ws-server", () => { + test("createWSServer", () => { + const server = createWSServer({ host: "localhost", port: 8081 }); + expect(server).toBeDefined(); + expect(typeof server.on).toBe("function"); + }); + + test("listenToWSConnection", () => { + const callback = jest.fn(); + listenToWSConnection(mock as unknown as WebSocketServer, callback); + expect(mock.on).toBeCalledWith("connection", callback); + }); +}); diff --git a/packages/backend/src/transport/ws-server.ts b/packages/backend/src/transport/ws-server.ts new file mode 100644 index 0000000..96151ed --- /dev/null +++ b/packages/backend/src/transport/ws-server.ts @@ -0,0 +1,28 @@ +import { WebSocketServer } from "ws"; +import { logger } from "../utils/logger"; + +export const createWSServer = (options: CreateServerOptions) => { + logger.transport.log( + `WebSocket server running on ${options.host}:${options.port}` + ); + return new WebSocketServer(options); +}; + +export const listenToWSConnection = ( + wss: WebSocketServer, + callback: Callback +) => { + wss.on("connection", callback); +}; + +export type Callback = ( + ws: { send: (message: string) => void }, + request: WSRequest +) => void; + +export interface CreateServerOptions { + host: string; + port: number; +} + +export type WSRequest = { url: string; headers: { host: string } }; diff --git a/packages/backend/src/utils/logger.test.ts b/packages/backend/src/utils/logger.test.ts new file mode 100644 index 0000000..ad20d64 --- /dev/null +++ b/packages/backend/src/utils/logger.test.ts @@ -0,0 +1,27 @@ +import { logger } from "./logger"; + +describe("logger", () => { + let originalNodeEnv = process.env.NODE_ENV; + + beforeEach(() => { + originalNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = "production"; + console.log = jest.fn(); + console.error = jest.fn(); + }); + + afterEach(() => { + process.env.NODE_ENV = originalNodeEnv; + jest.resetAllMocks(); + }); + + test("log", () => { + logger.actions.log("123"); + expect(console.log).toBeCalledWith("[actions] 123"); + }); + + test("error", () => { + logger.stores.error("123"); + expect(console.error).toBeCalledWith("[stores] 123"); + }); +}); diff --git a/packages/backend/src/utils/logger.ts b/packages/backend/src/utils/logger.ts new file mode 100644 index 0000000..876d963 --- /dev/null +++ b/packages/backend/src/utils/logger.ts @@ -0,0 +1,28 @@ +import process from "node:process"; +import config from "../config"; + +const debugModules = config.DEBUG_MODULES.split(","); + +const createLogger = (moduleName: string) => { + return { + log(...args: string[]) { + if (debugModules.includes(moduleName)) { + process.env.NODE_ENV !== "test" && + console.log(`[${moduleName}] ${args.join("\n")}`); + } + }, + error(...args: string[]) { + if (debugModules.includes(moduleName)) { + process.env.NODE_ENV !== "test" && + console.error(`[${moduleName}] ${args.join("\n")}`); + } + }, + }; +}; + +export const logger = { + actions: createLogger("actions"), + megalinter: createLogger("megalinter"), + stores: createLogger("stores"), + transport: createLogger("transport"), +}; diff --git a/packages/backend/src/utils/retry.ts b/packages/backend/src/utils/retry.ts new file mode 100644 index 0000000..5e81468 --- /dev/null +++ b/packages/backend/src/utils/retry.ts @@ -0,0 +1,24 @@ +export const retry = (callback: RetryCallback, options: RetryOptions): void => { + let retryCount = 0; + + const execute = () => { + try { + callback(); + } catch (err) { + console.log(`trying again in ${options.interval}ms ...`); + if (options.retries === -1 || retryCount <= options.retries) { + retryCount++; + setTimeout(execute, options.interval); + } + } + }; + + execute(); +}; + +interface RetryOptions { + interval: number; + retries: number; +} + +type RetryCallback = () => void; diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json new file mode 100644 index 0000000..b24a480 --- /dev/null +++ b/packages/backend/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "sourceMap": true, + "moduleResolution": "node", + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "module": "CommonJS", + "resolveJsonModule": true, + "skipLibCheck": true, + "declaration": false, + "esModuleInterop": true, + "strict": false + }, + "include": ["src/**/*.ts"], + "exclude": ["cypress"] +} diff --git a/packages/shared-types/.eslintrc.cjs b/packages/shared-types/.eslintrc.cjs new file mode 100644 index 0000000..70ce0fc --- /dev/null +++ b/packages/shared-types/.eslintrc.cjs @@ -0,0 +1,7 @@ +/* eslint-env node */ +module.exports = { + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + root: true, + }; \ No newline at end of file diff --git a/packages/shared-types/package.json b/packages/shared-types/package.json new file mode 100644 index 0000000..aac6347 --- /dev/null +++ b/packages/shared-types/package.json @@ -0,0 +1,22 @@ +{ + "name": "shared-types", + "version": "1.0.0", + "main": "./dist/index.js", + "module": "./src/index.ts", + "types": "./src/index.ts", + "description": "CodeTotal shared types", + "scripts": { + "prestart": "npm run build", + "build": "tsc", + "lint": "npx eslint src --max-warnings=0", + "clean": "rm -rf dist" + }, + "keywords": [], + "author": "Itay", + "license": "ISC", + "devDependencies": { + "@types/express": "^4.17.17", + "express": "^4.18.2", + "typescript": "^5.1.3" + } +} diff --git a/packages/shared-types/src/analysis-types.ts b/packages/shared-types/src/analysis-types.ts new file mode 100644 index 0000000..d65548b --- /dev/null +++ b/packages/shared-types/src/analysis-types.ts @@ -0,0 +1,35 @@ +import { ProgrammingLanguage } from "./language-types"; +import { OneOfValues } from "./typescript-types"; + +export interface Analysis { + inputType: OneOfValues; +} + +export const AnalysisType = { + File: "file", + Repo: "repo", + Snippet: "snippet", +} as const; + +export interface RepoAnalysis extends Analysis { + inputType: typeof AnalysisType.Repo; + url: string; +} + +export interface SnippetAnalysis extends Analysis { + inputType: typeof AnalysisType.Snippet; + snippet: string; + language?: ProgrammingLanguage; +} + +export interface FileAnalysis extends Analysis { + inputType: typeof AnalysisType.File; + // in the backend we use Multer, in the browser native File object + file: File | Express.Multer.File; +} + +export enum AnalysisStatus { + Created = "created", + Completed = "completed", + NotFound = "not-found", +} diff --git a/packages/shared-types/src/index.ts b/packages/shared-types/src/index.ts new file mode 100644 index 0000000..0a34791 --- /dev/null +++ b/packages/shared-types/src/index.ts @@ -0,0 +1,4 @@ +export * from "./analysis-types"; +export * from "./language-types"; +export * from "./report-types"; +export * from "./typescript-types"; diff --git a/packages/shared-types/src/language-types.ts b/packages/shared-types/src/language-types.ts new file mode 100644 index 0000000..3d6daf8 --- /dev/null +++ b/packages/shared-types/src/language-types.ts @@ -0,0 +1,5 @@ +export interface ProgrammingLanguage { + id: string; + name?: string; + icon?: string; +} diff --git a/packages/shared-types/src/report-types.ts b/packages/shared-types/src/report-types.ts new file mode 100644 index 0000000..508030c --- /dev/null +++ b/packages/shared-types/src/report-types.ts @@ -0,0 +1,87 @@ +import { ProgrammingLanguage } from "."; +import { AnalysisStatus } from "./analysis-types"; +import { OneOfValues } from "./typescript-types"; + +export interface ReportState { + requestId?: string; + resourceType?: string; + resourceValue?: string; + status: AnalysisStatus; + linters?: Linter[]; + packages: SbomPackage[]; + repoDetails?: RepoDetails; + fileDetails?: FileDetails; + score: number; + analysisError?: { + errorCode?: string; + errorMessage?: string; + errorDetails?: string; + }; + language?: ProgrammingLanguage; +} + +export interface RepoDetails { + languages: ReportLanguage[]; + readmeUrl: string; + license: string; + activityUrl: string; + stars: number; + watching: number; + forks: number; + releases: number; + latestVersion: string; + latestVersionDate: Date; +} + +export interface ReportLanguage { + name: string; + percentage: number; +} + +interface FileDetails { + language: string; + fileSize: number; + md5: string; // DevSkim: ignore DS126858 + ssdeep: string; + encoding: string; +} + +export interface Linter { + name: string; + errors: number; + severity?: OneOfValues; + status: LinterStatus; + issues?: Issue[]; + docUrl: string; +} + +export enum LinterStatus { + Started = "started", + Success = "success", + Error = "error", +} + +export const Severity = { + Critical: "critical", + High: "high", + Medium: "medium", + Low: "low", + Clean: "clean", +} as const; + +export interface Issue { + location: string; + lineNumber: number; + title: string; + severity: OneOfValues; + ruleId: string; +} + +export interface SbomPackage { + packageName: string; + packageVersion: string; + license: string; + registry: string; + severity: OneOfValues; + filePath: string; +} diff --git a/packages/shared-types/src/typescript-types.ts b/packages/shared-types/src/typescript-types.ts new file mode 100644 index 0000000..42fd97d --- /dev/null +++ b/packages/shared-types/src/typescript-types.ts @@ -0,0 +1 @@ +export type OneOfValues = T[keyof T]; diff --git a/packages/shared-types/tsconfig.json b/packages/shared-types/tsconfig.json new file mode 100644 index 0000000..83d44f8 --- /dev/null +++ b/packages/shared-types/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "target": "ES5", + "moduleResolution": "nodenext", + "sourceMap": true, + "module": "CommonJS", + "lib": ["DOM"] + }, + "include": ["src/index.ts"], + "exclude": ["node_modules", "./dist"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f1a1022 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "noEmit": true, + "moduleResolution": "node", + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "module": "CommonJS", + "resolveJsonModule": true, + "skipLibCheck": true, + "esModuleInterop": true + }, + "exclude": ["cypress", "cypress.config.ts"] +} diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..dfb5e82 --- /dev/null +++ b/turbo.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://turbo.build/schema.json", + "pipeline": { + "start": { + "cache": false, + "dependsOn": ["prestart", "^start"] + }, + "prestart": { + "cache": false + }, + "build": { + "cache": false, + "dependsOn": ["^build"] + }, + "test": { + "cache": false + }, + "lint": { + "cache": false + } + } +}