From aab98e2bf45d62f856338472061572ae6a74ee8c Mon Sep 17 00:00:00 2001 From: nicholas-codecov Date: Wed, 18 Sep 2024 11:53:47 -0300 Subject: [PATCH 1/3] fix: Move Sunburst logic from recursion to stack based (#3206) --- .../CoverageTab/OverviewTab/OverviewTab.tsx | 9 ++++- src/ui/SunburstChart/SunburstChart.jsx | 38 +++++++++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx index 02ab86fe3a..5cef080431 100644 --- a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx +++ b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx @@ -20,6 +20,8 @@ const FileExplorer = lazy(() => import('./subroute/FileExplorer')) const CoverageChart = lazy(() => import('./subroute/CoverageChart')) const Sunburst = lazy(() => import('./subroute/Sunburst')) +const MAX_FILE_COUNT = 200_000 + const Loader = () => (
@@ -50,9 +52,12 @@ function CoverageOverviewTab() { branch: branch, }) - let displaySunburst = false const fileCount = data?.branch?.head?.totals?.fileCount - if (typeof fileCount === 'number' && fileCount <= 200_000) { + const withinFileCount = + typeof fileCount === 'number' && fileCount <= MAX_FILE_COUNT + + let displaySunburst = false + if (withinFileCount) { displaySunburst = true } diff --git a/src/ui/SunburstChart/SunburstChart.jsx b/src/ui/SunburstChart/SunburstChart.jsx index 75dfd446ee..fc00e39c3f 100644 --- a/src/ui/SunburstChart/SunburstChart.jsx +++ b/src/ui/SunburstChart/SunburstChart.jsx @@ -48,15 +48,39 @@ function SunburstChart({ // Tracks previous location for rendering .. in the breadcrumb. let previous - const selectorMutate = (node) => { - if (Array.isArray(node.children)) { - return { - ...node, - value: selectorHandler.current(node), - children: node.children.map((child) => selectorMutate(child)), + // const selectorMutate = (node) => { + // if (Array.isArray(node.children)) { + // return { + // ...node, + // value: selectorHandler.current(node), + // children: node.children.map((child) => selectorMutate(child)), + // } + // } + + // return { ...node, value: selectorHandler.current(node) } + // } + + const selectorMutate = (rootNode) => { + const stack = [rootNode] + const result = { ...rootNode, value: selectorHandler.current(rootNode) } + const nodeMap = new Map() + nodeMap.set(rootNode, result) + + while (stack.length > 0) { + const node = stack.pop() + const currentNode = nodeMap.get(node) + + if (Array.isArray(node.children)) { + currentNode.children = node.children.map((child) => { + const newChild = { ...child, value: selectorHandler.current(child) } + nodeMap.set(child, newChild) + stack.push(child) + return newChild + }) } } - return { ...node, value: selectorHandler.current(node) } + + return result } // Process data for use in D3 From 8057abacdb0c55a76cd563eb4e556768328fedf9 Mon Sep 17 00:00:00 2001 From: ajay-sentry <159853603+ajay-sentry@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:53:09 -0700 Subject: [PATCH 2/3] fix: Guard when calling match() on undefined (#3207) --- .../DefaultOrgSelector/DefaultOrgSelector.jsx | 2 +- .../DefaultOrgSelector.spec.jsx | 20 +++++++++---------- src/ui/A/A.jsx | 5 ++++- src/ui/A/A.spec.jsx | 13 +++++++++++- .../CodeRendererProgressHeader.jsx | 2 +- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx b/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx index 779f170443..87e530152a 100644 --- a/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx +++ b/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx @@ -47,7 +47,7 @@ const renderItem = ({ item }) => { if (item?.isProvider) { return (
- + Install Codecov GitHub app diff --git a/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx b/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx index 469240b794..c7ece2209f 100644 --- a/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx +++ b/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx @@ -330,8 +330,8 @@ describe('DefaultOrgSelector', () => { const selfOrg = screen.getByRole('option', { name: 'Rula' }) expect(selfOrg).toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -378,8 +378,8 @@ describe('DefaultOrgSelector', () => { const selfOrg = screen.queryByRole('option', { name: 'janedoe' }) expect(selfOrg).not.toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -417,8 +417,8 @@ describe('DefaultOrgSelector', () => { const noOrgsFound = screen.getByText(/No organizations found/) expect(noOrgsFound).toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -458,8 +458,8 @@ describe('DefaultOrgSelector', () => { const orgInList = screen.getByRole('option', { name: 'criticalRole' }) expect(orgInList).toBeInTheDocument() - const addNewOrg = screen.queryByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.queryByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).not.toBeInTheDocument() }) @@ -496,8 +496,8 @@ describe('DefaultOrgSelector', () => { await user.click(selectOrg) - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) await user.click(addNewOrg) diff --git a/src/ui/A/A.jsx b/src/ui/A/A.jsx index 601083b65c..058eca5c08 100644 --- a/src/ui/A/A.jsx +++ b/src/ui/A/A.jsx @@ -30,7 +30,10 @@ const variantClasses = { configure: `rounded bg-ds-blue-default px-4 py-1 font-semibold text-ds-gray-primary dark:text-white dark:bg-ds-blue-nonary`, } -const getHostnameFromRegex = (url) => { +export const getHostnameFromRegex = (url) => { + if (!url) { + return 'app.codecov.io' + } // run against regex const matches = url.match(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i) // extract hostname (will be null if no match is found) diff --git a/src/ui/A/A.spec.jsx b/src/ui/A/A.spec.jsx index bb618d4893..57ee13164e 100644 --- a/src/ui/A/A.spec.jsx +++ b/src/ui/A/A.spec.jsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import A from '.' +import A, { getHostnameFromRegex } from './A' describe('A', () => { function setup(props = {}) { @@ -10,6 +10,17 @@ describe('A', () => { }) } + describe('hostnameWithoutRegex', () => { + it('returns to home if no url passed', () => { + expect(getHostnameFromRegex(undefined)).toBe('app.codecov.io') + }) + it('scrubs URL if one exists', () => { + expect(getHostnameFromRegex('https://app.codecov.io')).toBe( + 'app.codecov.io' + ) + }) + }) + describe('when rendered with the prop `to`', () => { beforeEach(() => { setup({ diff --git a/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx b/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx index c68be21885..6fba3bf725 100644 --- a/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx +++ b/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx @@ -12,7 +12,7 @@ function CodeRendererProgressHeader({ path, fileCoverage, change }) { * Header component that shows progress bar for the Code Renderer component. * @param {[String]} treePaths path of file from root directory. Only used in standalone file viewer * @param {Float} fileCoverage total coverage of current file - * @param {Float} change difference between head and base coverage. Only used in commmit based file viewer + * @param {Float} change difference between head and base coverage. Only used in commit based file viewer */ const isUnsupportedFileType = unsupportedExtensionsMapper({ path }) From 9d66eb1a1226470426bebdacf31e4b3f8bb7ad43 Mon Sep 17 00:00:00 2001 From: nicholas-codecov Date: Thu, 19 Sep 2024 10:29:23 -0300 Subject: [PATCH 3/3] feat: Setup Vitest (#3201) --- .eslintrc.json | 2 +- .github/workflows/ci.yml | 159 +++- codecov.yml | 21 +- craco.config.cjs | 1 + package.json | 19 +- src/{App.spec.tsx => App.test.tsx} | 120 +-- src/{config.spec.js => config.test.js} | 0 .../{AppLink.spec.jsx => AppLink.test.jsx} | 0 .../{Avatar.spec.jsx => Avatar.test.jsx} | 0 .../Card/{Card.spec.jsx => Card.test.jsx} | 0 src/old_ui/Icon/Icon.jsx | 5 +- .../Icon/{Icon.spec.jsx => Icon.test.jsx} | 48 +- .../{Message.spec.jsx => Message.test.jsx} | 3 +- .../User/{User.spec.jsx => User.test.jsx} | 0 ...repo-jest-setup.js => repo-jest-setup.jsx} | 0 src/shared/utils/{cn.spec.ts => cn.test.ts} | 0 src/vite-env.d.ts | 1 + src/vitest.setup.ts | 37 + vitest.config.mjs | 67 ++ yarn.lock | 821 ++++++++++++++++-- 20 files changed, 1105 insertions(+), 199 deletions(-) rename src/{App.spec.tsx => App.test.tsx} (80%) rename src/{config.spec.js => config.test.js} (100%) rename src/old_ui/AppLink/{AppLink.spec.jsx => AppLink.test.jsx} (100%) rename src/old_ui/Avatar/{Avatar.spec.jsx => Avatar.test.jsx} (100%) rename src/old_ui/Card/{Card.spec.jsx => Card.test.jsx} (100%) rename src/old_ui/Icon/{Icon.spec.jsx => Icon.test.jsx} (57%) rename src/old_ui/Message/{Message.spec.jsx => Message.test.jsx} (96%) rename src/old_ui/User/{User.spec.jsx => User.test.jsx} (100%) rename src/pages/RepoPage/{repo-jest-setup.js => repo-jest-setup.jsx} (100%) rename src/shared/utils/{cn.spec.ts => cn.test.ts} (100%) create mode 100644 src/vitest.setup.ts create mode 100644 vitest.config.mjs diff --git a/.eslintrc.json b/.eslintrc.json index fb907be20c..5875299217 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -25,7 +25,7 @@ "testing-library/prefer-find-by": "warn", "testing-library/await-fire-event": "warn", "testing-library/no-global-regexp-flag-in-query": "warn", - "testing-library/no-manual-cleanup": "warn", + "testing-library/no-manual-cleanup": "off", "testing-library/prefer-user-event": "warn", "testing-library/prefer-wait-for": "warn", "testing-library/prefer-explicit-assert": "warn", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da98998df1..424e47b52c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,6 +45,7 @@ jobs: if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} run: | yarn install + lint: name: Run Lint runs-on: ubuntu-latest @@ -132,15 +133,15 @@ jobs: run: | yarn format-check - codecovstartup: + codecov-startup: name: Codecov Startup needs: install uses: codecov/gha-workflows/.github/workflows/codecov-startup.yml@v1.2.14 secrets: inherit - runner-indexes: + runner-indexes-craco: runs-on: ubuntu-latest - name: Generate runner indexes + name: Generate runner indexes CRACO needs: install env: TEST_SPLIT_NUMBER: 80 @@ -154,7 +155,7 @@ jobs: id: generate-index-list run: | shopt -s globstar - TEST_LIST=$(ls src/**/*.spec.js src/**/*.test.js src/**/*.spec.jsx src/**/*.spec.ts src/**/*.spec.tsx | jq -R -s -c 'split("\n")[:-1]') + TEST_LIST=$(ls src/**/*.spec.js src/**/*.spec.jsx src/**/*.spec.ts src/**/*.spec.tsx | jq -R -s -c 'split("\n")[:-1]') TEST_LENGTH=$(echo $TEST_LIST | jq length) MAX_INDEX=$((($TEST_LENGTH/${{ env.TEST_SPLIT_NUMBER }}))) MAX_INDEX=$(($MAX_INDEX < 0 ? 0 : $TEST_LENGTH % ${{ env.TEST_SPLIT_NUMBER }} == 0 ? $MAX_INDEX - 1 : $MAX_INDEX)) @@ -163,13 +164,13 @@ jobs: echo json=${INDEX_JSON} >> $GITHUB_OUTPUT echo test_list_array=$(echo ${TEST_LIST} | jq -c '[_nwise(${{ env.TEST_SPLIT_NUMBER }})]') >> $GITHUB_OUTPUT - test: - name: 'Test Runner #${{ matrix.runner-index }}' - needs: [install, codecovstartup, runner-indexes] + test-craco: + name: 'Test Runner #${{ matrix.runner-index }} - CRACO' + needs: [install, codecov-startup, runner-indexes-craco] runs-on: ubuntu-latest strategy: matrix: - runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }} + runner-index: ${{ fromjson(needs.runner-indexes-craco.outputs.json) }} steps: - name: Checkout uses: actions/checkout@v4 @@ -195,34 +196,152 @@ jobs: - name: Run tests run: | + yarn generate-icons:webpack TESTS=$(echo $TEST_LIST | jq -cr 'join(" ")') yarn test:ci --maxWorkers=2 $TESTS env: JEST_JUNIT_OUTPUT_DIR: ./reports/junit/ - TEST_LIST: ${{ tojson(fromjson(needs.runner-indexes.outputs.test_list_array)[matrix.runner-index]) }} + TEST_LIST: ${{ tojson(fromjson(needs.runner-indexes-craco.outputs.test_list_array)[matrix.runner-index]) }} + + - name: Upload test results to Codecov + uses: codecov/test-results-action@v1 + if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} + with: + token: ${{ secrets.CODECOV_ORG_TOKEN }} + url: ${{ secrets.CODECOV_URL }} + + - name: Upload test results to Codecov staging + uses: codecov/test-results-action@v1 + if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} + with: + token: ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} + url: ${{ secrets.CODECOV_STAGING_URL }} + + - name: Upload test results to Codecov QA + uses: codecov/test-results-action@v1 + if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} + with: + token: ${{ secrets.CODECOV_QA_TOKEN }} + url: ${{ secrets.CODECOV_QA_URL }} + + - name: Upload test results to Codecov public QA + uses: codecov/test-results-action@v1 + if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} + with: + token: ${{ secrets.CODECOV_PUBLIC_QA_TOKEN }} + url: ${{ secrets.CODECOV_PUBLIC_QA_URL }} + + - name: Install CLI + if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} + run: | + make test_env.install_cli + + ## Don't upload on forks for now. + - name: Upload coverage to Production + if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} + run: | + codecovcli -u ${{ secrets.CODECOV_URL }} do-upload -t ${{ secrets.CODECOV_ORG_TOKEN }} --fail-on-error --name "CRACO-${{ matrix.runner-index }}" + + - name: Upload coverage to Staging + if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} + run: | + codecovcli -u ${{ secrets.CODECOV_STAGING_URL }} do-upload -t ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} --fail-on-error + + - name: Upload coverage to QA + if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} + run: | + codecovcli -u ${{ secrets.CODECOV_QA_URL }} do-upload -t ${{ secrets.CODECOV_QA_TOKEN }} --fail-on-error + + - name: Upload coverage to Public QA + if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} + run: | + codecovcli -u ${{ secrets.CODECOV_PUBLIC_QA_URL }} do-upload -t ${{ secrets.CODECOV_PUBLIC_QA_TOKEN }} --fail-on-error + + runner-indexes-vitest: + runs-on: ubuntu-latest + name: Generate runner indexes Vitest + needs: install + env: + TEST_SPLIT_NUMBER: 80 + outputs: + json: ${{ steps.generate-index-list.outputs.json }} + test_list_array: ${{ steps.generate-index-list.outputs.test_list_array }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Generate test index list + id: generate-index-list + run: | + shopt -s globstar + TEST_LIST=$(ls src/**/*.test.js src/**/*.test.jsx src/**/*.test.ts src/**/*.test.tsx | jq -R -s -c 'split("\n")[:-1]') + TEST_LENGTH=$(echo $TEST_LIST | jq length) + MAX_INDEX=$((($TEST_LENGTH/${{ env.TEST_SPLIT_NUMBER }}))) + MAX_INDEX=$(($MAX_INDEX < 0 ? 0 : $TEST_LENGTH % ${{ env.TEST_SPLIT_NUMBER }} == 0 ? $MAX_INDEX - 1 : $MAX_INDEX)) + INDEX_LIST=$(seq 0 ${MAX_INDEX}) + INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) + echo json=${INDEX_JSON} >> $GITHUB_OUTPUT + echo test_list_array=$(echo ${TEST_LIST} | jq -c '[_nwise(${{ env.TEST_SPLIT_NUMBER }})]') >> $GITHUB_OUTPUT + + test-vitest: + name: 'Test Runner #${{ matrix.runner-index }} - Vitest' + needs: [install, codecov-startup, runner-indexes-vitest] + runs-on: ubuntu-latest + strategy: + matrix: + runner-index: ${{ fromjson(needs.runner-indexes-vitest.outputs.json) }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Cache node_modules + id: cache-node-modules + uses: actions/cache@v4 + env: + cache-name: cache-gazebo-node-modules + with: + path: | + node_modules + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-${{ env.cache-name }}- + + - name: Run tests + run: | + TESTS=$(echo $TEST_LIST | jq -cr 'join(" ")') + yarn test:ci:vite --minWorkers=1 --maxWorkers=2 $TESTS + env: + ENABLE_TEST_REPORTER: true + TEST_LIST: ${{ tojson(fromjson(needs.runner-indexes-vitest.outputs.test_list_array)[matrix.runner-index]) }} - - name: Upload test results to codecov + - name: Upload test results to Codecov uses: codecov/test-results-action@v1 if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} with: token: ${{ secrets.CODECOV_ORG_TOKEN }} url: ${{ secrets.CODECOV_URL }} - - name: Upload test results to codecov + - name: Upload test results to Codecov staging uses: codecov/test-results-action@v1 if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} with: token: ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} url: ${{ secrets.CODECOV_STAGING_URL }} - - name: Upload test results to codecov + - name: Upload test results to Codecov QA uses: codecov/test-results-action@v1 if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} with: token: ${{ secrets.CODECOV_QA_TOKEN }} url: ${{ secrets.CODECOV_QA_URL }} - - name: Upload test results to codecov + - name: Upload test results to Codecov public QA uses: codecov/test-results-action@v1 if: ${{ !cancelled() && !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov'}} with: @@ -235,22 +354,22 @@ jobs: make test_env.install_cli ## Don't upload on forks for now. - - name: Upload to Production + - name: Upload coverage to Production if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} run: | - codecovcli -u ${{ secrets.CODECOV_URL }} do-upload -t ${{ secrets.CODECOV_ORG_TOKEN }} --fail-on-error + codecovcli -u ${{ secrets.CODECOV_URL }} do-upload -t ${{ secrets.CODECOV_ORG_TOKEN }} --fail-on-error --name "VITEST-${{ matrix.runner-index }}" - - name: Upload to Staging + - name: Upload coverage to Staging if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} run: | codecovcli -u ${{ secrets.CODECOV_STAGING_URL }} do-upload -t ${{ secrets.CODECOV_ORG_TOKEN_STAGING }} --fail-on-error - - name: Upload to QA + - name: Upload coverage to QA if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} run: | codecovcli -u ${{ secrets.CODECOV_QA_URL }} do-upload -t ${{ secrets.CODECOV_QA_TOKEN }} --fail-on-error - - name: Upload to Public QA + - name: Upload coverage to Public QA if: ${{ !github.event.pull_request.head.repo.fork && github.repository_owner == 'codecov' }} run: | codecovcli -u ${{ secrets.CODECOV_PUBLIC_QA_URL }} do-upload -t ${{ secrets.CODECOV_PUBLIC_QA_TOKEN }} --fail-on-error @@ -383,7 +502,7 @@ jobs: build: name: Build App runs-on: ubuntu-latest - needs: [install, test] + needs: [install, test-craco] steps: - name: Checkout uses: actions/checkout@v4 @@ -420,7 +539,7 @@ jobs: self-hosted: name: Push Self Hosted Image - needs: [build-self-hosted, test] + needs: [build-self-hosted, test-craco] secrets: inherit if: ${{ github.event_name == 'push' && github.event.ref == 'refs/heads/main' && github.repository_owner == 'codecov' }} uses: codecov/gha-workflows/.github/workflows/self-hosted.yml@v1.2.14 diff --git a/codecov.yml b/codecov.yml index 5f5184914a..7c24041679 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,5 +1,5 @@ codecov: - require_ci_to_pass: yes + require_ci_to_pass: true ai_pr_review: enabled: false @@ -11,8 +11,8 @@ coverage: status: project: yes - patch: yes - changes: no + patch: true + changes: false github_checks: annotations: false @@ -20,10 +20,10 @@ github_checks: comment: layout: 'reach, diff, flags, files, components, footer' behavior: default - require_changes: no - require_base: no - require_head: yes - after_n_builds: 9 # ceil(number of test files / 80). See ci.yml for more details. + require_changes: false + require_base: false + require_head: true + after_n_builds: 10 # ceil(number of test files / 80). See ci.yml for more details. ignore: - ./src/**/*.stories.js @@ -32,6 +32,10 @@ ignore: - ./src/**/*.stories.tsx - ./src/setupTests.js - ./src/setupProxy.js + - ./src/ts-override.d.ts + - ./src/types.ts + - ./src/vite-env.d.ts + - ./src/vitest.setup.ts - ./src/reportWebVitals.js - ./scripts/* - ./src/index.ts @@ -42,6 +46,9 @@ ignore: - ./src/pages/RepoPage/repo-jest-setup.js - ./src/ui/SunburstChart/*.jsx - ./src/ui/SunburstChart/*.js + - './src/**/*.svg' + - './src/**/*.png' + - './src/**/*.jpg' component_management: default_rules: diff --git a/craco.config.cjs b/craco.config.cjs index 5486ed0702..b68840aafe 100644 --- a/craco.config.cjs +++ b/craco.config.cjs @@ -48,6 +48,7 @@ module.exports = { }, jest: { configure: { + modulePathIgnorePatterns: ['.*.test.*'], moduleNameMapper: { '^layouts/(.*)$': '/src/layouts/$1', '^ui/(.*)$': '/src/ui/$1', diff --git a/package.json b/package.json index 551818358c..9bb558bb5f 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,16 @@ "start:vite": "yarn generate-icons:vite && vite", "build:vite": "yarn generate-icons:vite && tsc -b && vite build", "dev": "yarn start", - "start": "yarn generate-icons:webpack && craco start", + "start": "craco start", "build": "yarn generate-icons:webpack && craco build --config craco.config.cjs", - "build:stats": "yarn generate-icons:webpack && craco build --config craco.stats.config.cjs", - "test": "yarn generate-icons:webpack && craco test", + "build:stats": "craco build --config craco.stats.config.cjs", + "test": "craco test", + "test:ci": "craco test --collectCoverage --reporters=default --reporters=jest-junit", + "test:vite": "yarn generate-icons:vite && vitest run --changed --config ./vitest.config.mjs", + "test:watch:vite": "yarn generate-icons:vite && vitest watch --changed --config ./vitest.config.mjs", + "test:ci:vite": "yarn generate-icons:vite && vitest run --config ./vitest.config.mjs --coverage", + "preview-coverage": "npx vite preview --open --outDir coverage", "test:mutation": "npx stryker run", - "test:ci": "yarn generate-icons:webpack && craco test --collectCoverage --reporters=default --reporters=jest-junit", "eject": "craco eject", "lint": "eslint --fix --no-ignore --max-warnings=-1 -c .eslintrc.json", "storybook": "storybook dev -p 6006", @@ -145,6 +149,9 @@ "@types/react-router-dom": "^5.3.3", "@types/semver": "^7", "@vitejs/plugin-react": "^4.3.1", + "@vitest/coverage-istanbul": "^2.1.1", + "@vitest/coverage-v8": "^2.1.1", + "@vitest/ui": "^2.1.1", "autoprefixer": "^10.4.14", "eslint": "^8.39.0", "eslint-config-prettier": "^9.1.0", @@ -155,8 +162,10 @@ "http-proxy-middleware": "^2.0.6", "husky": "^9.1.4", "jest-junit": "^13.0.0", + "jsdom": "^25.0.0", "lint-staged": "^15.2.8", "msw": "^1.2.1", + "msw2": "npm:msw@^2.4.8", "postcss": "^8.4.31", "prettier": "^3.3.3", "react-scripts": "^5.0.1", @@ -171,7 +180,7 @@ "vite-plugin-ejs": "^1.7.0", "vite-plugin-svgr": "^4.2.0", "vite-tsconfig-paths": "^5.0.1", - "vitest": "^2.0.5", + "vitest": "^2.1.1", "webpack": "^5.84.1", "webpackbar": "^6.0.1" }, diff --git a/src/App.spec.tsx b/src/App.test.tsx similarity index 80% rename from src/App.spec.tsx rename to src/App.test.tsx index 26708fdae4..091597addd 100644 --- a/src/App.spec.tsx +++ b/src/App.test.tsx @@ -1,9 +1,10 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { render, screen, waitFor } from '@testing-library/react' -import { graphql, rest } from 'msw' -import { setupServer } from 'msw/node' +import { graphql, http, HttpResponse } from 'msw2' +import { setupServer } from 'msw2/node' import React, { Suspense } from 'react' import { MemoryRouter, Route, useLocation } from 'react-router-dom' +import { type Mock, vi } from 'vitest' import config from 'config' @@ -11,26 +12,36 @@ import { useLocationParams } from 'services/navigation' import App from './App' -jest.mock('./pages/AccountSettings', () => () => 'AccountSettings') -jest.mock('./pages/AdminSettings', () => () => 'AdminSettingsPage') -jest.mock('./pages/AnalyticsPage', () => () => 'AnalyticsPage') -jest.mock('./pages/CommitDetailPage', () => () => 'CommitDetailPage') -jest.mock('./pages/LoginPage', () => () => 'LoginPage') -jest.mock('./pages/OwnerPage', () => () => 'OwnerPage') -jest.mock('./pages/MembersPage', () => () => 'MembersPage') -jest.mock('./pages/PlanPage', () => () => 'PlanPage') -jest.mock('./pages/PullRequestPage', () => () => 'PullRequestPage') -jest.mock('./pages/RepoPage', () => () => 'RepoPage') -jest.mock('./pages/TermsOfService', () => () => 'TermsOfService') -jest.mock('./pages/EnterpriseLandingPage', () => () => 'EnterpriseLandingPage') -jest.mock('./pages/SyncProviderPage', () => () => 'SyncProviderPage') - -jest.mock('services/navigation', () => ({ - ...jest.requireActual('services/navigation'), - useLocationParams: jest.fn(), +vi.mock('./pages/AccountSettings', () => ({ default: () => 'AccountSettings' })) +vi.mock('./pages/AdminSettings', () => ({ default: () => 'AdminSettingsPage' })) +vi.mock('./pages/AnalyticsPage', () => ({ default: () => 'AnalyticsPage' })) +vi.mock('./pages/CommitDetailPage', () => ({ + default: () => 'CommitDetailPage', })) +vi.mock('./pages/LoginPage', () => ({ default: () => 'LoginPage' })) +vi.mock('./pages/OwnerPage', () => ({ default: () => 'OwnerPage' })) +vi.mock('./pages/MembersPage', () => ({ default: () => 'MembersPage' })) +vi.mock('./pages/PlanPage', () => ({ default: () => 'PlanPage' })) +vi.mock('./pages/PullRequestPage', () => ({ default: () => 'PullRequestPage' })) +vi.mock('./pages/RepoPage', () => ({ default: () => 'RepoPage' })) +vi.mock('./pages/TermsOfService', () => ({ default: () => 'TermsOfService' })) +vi.mock('./pages/EnterpriseLandingPage', () => ({ + default: () => 'EnterpriseLandingPage', +})) +vi.mock('./pages/SyncProviderPage', () => ({ + default: () => 'SyncProviderPage', +})) + +vi.mock('services/navigation', async () => { + const servicesNavigation = await vi.importActual('services/navigation') + + return { + ...servicesNavigation, + useLocationParams: vi.fn(), + } +}) -const mockedUseLocationParams = useLocationParams as jest.Mock +const mockedUseLocationParams = useLocationParams as Mock const internalUser = { email: 'internal@user.com', @@ -117,7 +128,6 @@ const queryClient = new QueryClient({ }, }) -const server = setupServer() let testLocation: ReturnType const wrapper = (initialEntries = ['']): React.FC => @@ -138,6 +148,8 @@ const wrapper = ) +const server = setupServer() + beforeAll(() => { server.listen({ onUnhandledRequest: 'warn' }) console.error = () => {} @@ -163,57 +175,57 @@ describe('App', () => { hasSession?: boolean }) { server.use( - rest.get('/internal/user', (_, res, ctx) => { + http.get('/internal/user', (info) => { if (hasSession) { - return res(ctx.status(200), ctx.json(internalUser)) + return HttpResponse.json(internalUser, { status: 200 }) } else { - return res(ctx.status(200), ctx.json({})) + return HttpResponse.json({}, { status: 200 }) } }), - rest.get('/internal/users/current', (req, res, ctx) => { - return res(ctx.status(200), ctx.json({})) + http.get('/internal/users/current', (info) => { + return HttpResponse.json({}, { status: 200 }) }), - graphql.query('DetailOwner', (_, res, ctx) => - res(ctx.status(200), ctx.data({ owner: 'codecov' })) + graphql.query('DetailOwner', (info) => + HttpResponse.json({ data: { owner: 'codecov' } }, { status: 200 }) ), - graphql.query('CurrentUser', (req, res, ctx) => { + graphql.query('CurrentUser', (info) => { if (hasLoggedInUser) { - return res(ctx.status(200), ctx.data(user)) + return HttpResponse.json({ data: user }, { status: 200 }) } - return res(ctx.status(200), ctx.data({})) + HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('GetPlanData', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('GetPlanData', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('OwnerTier', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('OwnerTier', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('Seats', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('Seats', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('HasAdmins', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('HasAdmins', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('owner', (req, res, ctx) => { - return res( - ctx.status(200), - ctx.data({ me: { owner: { isAdmin: true } } }) + graphql.query('owner', (info) => { + return HttpResponse.json( + { data: { owner: { isAdmin: true } } }, + { status: 200 } ) }), - graphql.query('MyContexts', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('MyContexts', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('GetOktaConfig', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('GetOktaConfig', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('OwnerPageData', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.query('OwnerPageData', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.mutation('updateDefaultOrganization', (req, res, ctx) => { - return res(ctx.status(200), ctx.data({})) + graphql.mutation('updateDefaultOrganization', (info) => { + return HttpResponse.json({ data: {} }, { status: 200 }) }), - graphql.query('GetRepoOverview', (req, res, ctx) => { - return res(ctx.status(200), ctx.data(mockRepoOverview)) + graphql.query('GetRepoOverview', (info) => { + return HttpResponse.json({ data: mockRepoOverview }, { status: 200 }) }) ) } @@ -605,6 +617,7 @@ describe('App', () => { expect(page).toBeInTheDocument() }) }) + describe('user has session, not logged in', () => { it('redirects to session default', async () => { setup({ hasLoggedInUser: false, hasSession: true }) @@ -622,6 +635,7 @@ describe('App', () => { setup({ hasLoggedInUser: false, hasSession: true }) render(, { wrapper: wrapper(['/blah']) }) + await waitFor(() => expect(testLocation.pathname).toBe('/plan/cool-service/cool-guy') ) diff --git a/src/config.spec.js b/src/config.test.js similarity index 100% rename from src/config.spec.js rename to src/config.test.js diff --git a/src/old_ui/AppLink/AppLink.spec.jsx b/src/old_ui/AppLink/AppLink.test.jsx similarity index 100% rename from src/old_ui/AppLink/AppLink.spec.jsx rename to src/old_ui/AppLink/AppLink.test.jsx diff --git a/src/old_ui/Avatar/Avatar.spec.jsx b/src/old_ui/Avatar/Avatar.test.jsx similarity index 100% rename from src/old_ui/Avatar/Avatar.spec.jsx rename to src/old_ui/Avatar/Avatar.test.jsx diff --git a/src/old_ui/Card/Card.spec.jsx b/src/old_ui/Card/Card.test.jsx similarity index 100% rename from src/old_ui/Card/Card.spec.jsx rename to src/old_ui/Card/Card.test.jsx diff --git a/src/old_ui/Icon/Icon.jsx b/src/old_ui/Icon/Icon.jsx index 0c41802505..03519d5ad1 100644 --- a/src/old_ui/Icon/Icon.jsx +++ b/src/old_ui/Icon/Icon.jsx @@ -22,7 +22,10 @@ function Icon({ if (!IconSvg) return null return ( - + ) } diff --git a/src/old_ui/Icon/Icon.spec.jsx b/src/old_ui/Icon/Icon.test.jsx similarity index 57% rename from src/old_ui/Icon/Icon.spec.jsx rename to src/old_ui/Icon/Icon.test.jsx index f2671587c6..68e5852d5e 100644 --- a/src/old_ui/Icon/Icon.spec.jsx +++ b/src/old_ui/Icon/Icon.test.jsx @@ -3,71 +3,59 @@ import { render, screen } from '@testing-library/react' import Icon from './Icon' describe('Icon', () => { - function setup(props) { - render() - } - describe('when rendered with a SVG we have', () => { - beforeEach(() => { - setup({ name: 'check' }) - }) - it('renders a svg', () => { - const icon = screen.queryByText('check.svg') + render() + + const icon = screen.getByTestId('check-svg') expect(icon).toBeInTheDocument() }) }) describe('when rendered with a SVG we dont have', () => { - beforeEach(() => { - setup({ name: 'icon-we-dont-have' }) - }) - it('renders a svg', async () => { - const icon = screen.queryByText('icon-we-dont-have.svg') + render() + + const icon = screen.queryByTestId('icon-we-dont-have-svg') expect(icon).not.toBeInTheDocument() }) }) describe('renders small icon', () => { - beforeEach(() => { - setup({ name: 'check', size: 'sm' }) - }) it('renders small icon', async () => { - const icon = await screen.findByText('check.svg') + render() + + const icon = screen.getByTestId('check-svg') expect(icon).toHaveClass('w-3') expect(icon).toHaveClass('h-3') }) }) describe('renders medium icon', () => { - beforeEach(() => { - setup({ name: 'check' }) - }) it('renders small icon', async () => { - const icon = await screen.findByText('check.svg') + render() + + const icon = screen.getByTestId('check-svg') expect(icon).toHaveClass('w-6') expect(icon).toHaveClass('h-6') }) }) describe('renders large icon', () => { - beforeEach(() => { - setup({ name: 'check', size: 'lg' }) - }) it('renders small icon', async () => { - const icon = await screen.findByText('check.svg') + render() + + const icon = screen.getByTestId('check-svg') expect(icon).toHaveClass('w-16') expect(icon).toHaveClass('h-16') }) }) describe('renders custom size icon', () => { - beforeEach(() => { - setup({ name: 'check', size: 'lg', iconClass: 'w-1 h-1' }) - }) it('renders small icon', async () => { - const icon = await screen.findByText('check.svg') + render() + + const icon = screen.getByTestId('check-svg') expect(icon).toHaveClass('w-1') expect(icon).toHaveClass('h-1') }) diff --git a/src/old_ui/Message/Message.spec.jsx b/src/old_ui/Message/Message.test.jsx similarity index 96% rename from src/old_ui/Message/Message.spec.jsx rename to src/old_ui/Message/Message.test.jsx index 16ea1cccdf..0750868590 100644 --- a/src/old_ui/Message/Message.spec.jsx +++ b/src/old_ui/Message/Message.test.jsx @@ -1,5 +1,6 @@ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' +import { vi } from 'vitest' import Message from '.' @@ -9,7 +10,7 @@ describe('Message', () => { const defaultProps = { variant: 'info', children: 'hello', - onClose: jest.fn(), + onClose: vi.fn(), } function setup(over = {}) { diff --git a/src/old_ui/User/User.spec.jsx b/src/old_ui/User/User.test.jsx similarity index 100% rename from src/old_ui/User/User.spec.jsx rename to src/old_ui/User/User.test.jsx diff --git a/src/pages/RepoPage/repo-jest-setup.js b/src/pages/RepoPage/repo-jest-setup.jsx similarity index 100% rename from src/pages/RepoPage/repo-jest-setup.js rename to src/pages/RepoPage/repo-jest-setup.jsx diff --git a/src/shared/utils/cn.spec.ts b/src/shared/utils/cn.test.ts similarity index 100% rename from src/shared/utils/cn.spec.ts rename to src/shared/utils/cn.test.ts diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index b1f45c7866..a9936e5d2b 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,2 +1,3 @@ /// /// +/// diff --git a/src/vitest.setup.ts b/src/vitest.setup.ts new file mode 100644 index 0000000000..04b5458531 --- /dev/null +++ b/src/vitest.setup.ts @@ -0,0 +1,37 @@ +import * as matchers from '@testing-library/jest-dom/matchers' +import { cleanup } from '@testing-library/react' +import { vi } from 'vitest' +import '@testing-library/jest-dom/vitest' + +// not sure why this lint is being fired here so I'm disabling it +// eslint-disable-next-line testing-library/await-fire-event +expect.extend(matchers) + +// Prevent timezone differences between local and CI/CD +const setupTestGlobal = async () => { + process.env.TZ = 'UTC' +} + +export default setupTestGlobal + +process.env.REACT_APP_ZOD_IGNORE_TESTS = 'true' + +vi.mock('@sentry/react', async () => { + const originalModule = await vi.importActual('@sentry/react') + + return { + ...originalModule, + setUser: vi.fn(), + metrics: { + ...originalModule.metrics!, + distribution: vi.fn(), + gauge: vi.fn(), + increment: vi.fn(), + set: vi.fn(), + }, + } +}) + +afterEach(() => { + cleanup() +}) diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 0000000000..35e591886f --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,67 @@ +import { loadEnv } from 'vite' +import { defineConfig, mergeConfig } from 'vitest/config' + +import ViteConfig from './vite.config.mjs' + +// See for more details: https://vitest.dev/config/#coverage-exclude +const EXCLUDE_FROM_TESTING = [ + // Default exclude patterns + '**/node_modules/**', + '**/dist/**', + '**/cypress/**', + '**/.{idea,git,cache,output,temp}/**', + '**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*', + // Custom exclude patterns + 'src/**/*.spec.*', + 'src/**/*.stories.*', +] + +const EXCLUDE_FROM_COVERAGE = [ + ...EXCLUDE_FROM_TESTING, + 'src/**/*.test.*', + 'repo-jest-setup.jsx', + 'vitest.setup.ts', + 'custom-testing-library.js', + 'setupTestGlobal.js', + 'setupTests.js', + 'setupProxy.js', + 'ts-override.d.ts', + 'types.ts', + 'vite-env.d.ts', +] + +const VitestConfig = defineConfig((config) => { + const reporters = ['basic'] + if (process.env.ENABLE_TEST_REPORTER) { + reporters.push(['junit', { outputFile: 'reports/junit/junit.xml' }]) + } + + if (process.env.GITHUB_ACTIONS) { + reporters.push('github-actions') + } + + const env = loadEnv(config.mode, process.cwd(), 'REACT_APP') + + return { + test: { + env: env, + coverage: { + include: ['src/**/*'], + exclude: EXCLUDE_FROM_COVERAGE, + provider: 'istanbul', + reporters: [['text'], ['html', { outputFile: 'coverage/index.html' }]], + reportOnFailure: true, + }, + globals: true, + environment: 'jsdom', + setupFiles: './src/vitest.setup.ts', + reporters: reporters, + include: ['src/**/*.test.*'], + exclude: EXCLUDE_FROM_TESTING, + }, + } +}) + +export default defineConfig((configEnv) => + mergeConfig(ViteConfig(configEnv), VitestConfig(configEnv)) +) diff --git a/yarn.lock b/yarn.lock index ce83a4f9de..06aa13a2e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -128,7 +128,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.21.3, @babel/core@npm:^7.24.5": +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.5": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -567,6 +567,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.4": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": "npm:^7.25.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + languageName: node + linkType: hard + "@babel/parser@npm:^7.25.0": version: 7.25.0 resolution: "@babel/parser@npm:7.25.0" @@ -2190,6 +2201,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -2204,6 +2226,34 @@ __metadata: languageName: node linkType: hard +"@bundled-es-modules/cookie@npm:^2.0.0": + version: 2.0.0 + resolution: "@bundled-es-modules/cookie@npm:2.0.0" + dependencies: + cookie: "npm:^0.5.0" + checksum: 10c0/0655dd331b35d7b5b6dd2301c3bcfb7233018c0e3235a40ced1d53f00463ab92dc01f0091f153812867bc0ef0f8e0a157a30acb16e8d7ef149702bf8db9fe7a6 + languageName: node + linkType: hard + +"@bundled-es-modules/statuses@npm:^1.0.1": + version: 1.0.1 + resolution: "@bundled-es-modules/statuses@npm:1.0.1" + dependencies: + statuses: "npm:^2.0.1" + checksum: 10c0/c1a8ede3efa8da61ccda4b98e773582a9733edfbeeee569d4630785f8e018766202edb190a754a3ec7a7f6bd738e857829affc2fdb676b6dab4db1bb44e62785 + languageName: node + linkType: hard + +"@bundled-es-modules/tough-cookie@npm:^0.1.6": + version: 0.1.6 + resolution: "@bundled-es-modules/tough-cookie@npm:0.1.6" + dependencies: + "@types/tough-cookie": "npm:^4.0.5" + tough-cookie: "npm:^4.1.4" + checksum: 10c0/28bcac878bff6b34719ba3aa8341e9924772ee55de5487680ebe784981ec9fccb70ed5d46f563e2404855a04de606f9e56aa4202842d4f5835bc04a4fe820571 + languageName: node + linkType: hard + "@chromatic-com/storybook@npm:^1": version: 1.6.1 resolution: "@chromatic-com/storybook@npm:1.6.1" @@ -2752,6 +2802,61 @@ __metadata: languageName: node linkType: hard +"@inquirer/confirm@npm:^3.0.0": + version: 3.2.0 + resolution: "@inquirer/confirm@npm:3.2.0" + dependencies: + "@inquirer/core": "npm:^9.1.0" + "@inquirer/type": "npm:^1.5.3" + checksum: 10c0/a2cbfc8ae9c880bba4cce1993f5c399fb0d12741fdd574917c87fceb40ece62ffa60e35aaadf4e62d7c114f54008e45aee5d6d90497bb62d493996c02725d243 + languageName: node + linkType: hard + +"@inquirer/core@npm:^9.1.0": + version: 9.2.1 + resolution: "@inquirer/core@npm:9.2.1" + dependencies: + "@inquirer/figures": "npm:^1.0.6" + "@inquirer/type": "npm:^2.0.0" + "@types/mute-stream": "npm:^0.0.4" + "@types/node": "npm:^22.5.5" + "@types/wrap-ansi": "npm:^3.0.0" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^1.0.0" + signal-exit: "npm:^4.1.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10c0/11c14be77a9fa85831de799a585721b0a49ab2f3b7d8fd1780c48ea2b29229c6bdc94e7892419086d0f7734136c2ba87b6a32e0782571eae5bbd655b1afad453 + languageName: node + linkType: hard + +"@inquirer/figures@npm:^1.0.6": + version: 1.0.6 + resolution: "@inquirer/figures@npm:1.0.6" + checksum: 10c0/2a00cf8db0b038dfb3b7ac9d09fe57ba12f0349e6258ad821bfa8e2e3cd9127f34b88ed7cae3e3441586f988db4df16ba91d6d701f88e529e87d2c2130a5c138 + languageName: node + linkType: hard + +"@inquirer/type@npm:^1.5.3": + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 10c0/4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 + languageName: node + linkType: hard + +"@inquirer/type@npm:^2.0.0": + version: 2.0.0 + resolution: "@inquirer/type@npm:2.0.0" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 10c0/8c663d52beb2b89a896d3c3d5cc3d6d024fa149e565555bcb42fa640cbe23fba7ff2c51445342cef1fe6e46305e2d16c1590fa1d11ad0ddf93a67b655ef41f0a + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2779,7 +2884,7 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a @@ -3120,7 +3225,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -3175,6 +3280,20 @@ __metadata: languageName: node linkType: hard +"@mswjs/interceptors@npm:^0.35.6": + version: 0.35.6 + resolution: "@mswjs/interceptors@npm:0.35.6" + dependencies: + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/logger": "npm:^0.3.0" + "@open-draft/until": "npm:^2.0.0" + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.3" + strict-event-emitter: "npm:^0.5.1" + checksum: 10c0/9472f640183675869368bf2ccf32354db0dfb320c754bcbfc683059f5380674598c59dde4fa58007f74817e31aa1dbd123787fcd0b1d37d53595aa718d06bfbe + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -3353,6 +3472,23 @@ __metadata: languageName: node linkType: hard +"@open-draft/deferred-promise@npm:^2.2.0": + version: 2.2.0 + resolution: "@open-draft/deferred-promise@npm:2.2.0" + checksum: 10c0/eafc1b1d0fc8edb5e1c753c5e0f3293410b40dde2f92688211a54806d4136887051f39b98c1950370be258483deac9dfd17cf8b96557553765198ef2547e4549 + languageName: node + linkType: hard + +"@open-draft/logger@npm:^0.3.0": + version: 0.3.0 + resolution: "@open-draft/logger@npm:0.3.0" + dependencies: + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.0" + checksum: 10c0/90010647b22e9693c16258f4f9adb034824d1771d3baa313057b9a37797f571181005bc50415a934eaf7c891d90ff71dcd7a9d5048b0b6bb438f31bef2c7c5c1 + languageName: node + linkType: hard + "@open-draft/until@npm:^1.0.3": version: 1.0.3 resolution: "@open-draft/until@npm:1.0.3" @@ -3360,6 +3496,13 @@ __metadata: languageName: node linkType: hard +"@open-draft/until@npm:^2.0.0, @open-draft/until@npm:^2.1.0": + version: 2.1.0 + resolution: "@open-draft/until@npm:2.1.0" + checksum: 10c0/61d3f99718dd86bb393fee2d7a785f961dcaf12f2055f0c693b27f4d0cd5f7a03d498a6d9289773b117590d794a43cd129366fd8e99222e4832f67b1653d54cf + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -3404,6 +3547,13 @@ __metadata: languageName: node linkType: hard +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.25 + resolution: "@polka/url@npm:1.0.0-next.25" + checksum: 10c0/ef61f0a0fe94bb6e1143fc5b9d5a12e6ca9dbd2c57843ebf81db432c21b9f1005c09e8a1ef8b6d5ddfa42146ca65b640feb2d353bd0d3546da46ba59e48a5349 + languageName: node + linkType: hard + "@radix-ui/primitive@npm:1.1.0": version: 1.1.0 resolution: "@radix-ui/primitive@npm:1.1.0" @@ -5665,6 +5815,13 @@ __metadata: languageName: node linkType: hard +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 10c0/5b326bd0188120fb32c0be086b141b1481fec9941b76ad537f9110e10d61ee2636beac145463319c71e4be67a17e85b81ca9e13ceb6e3bb63b93d16824d6c149 + languageName: node + linkType: hard + "@types/cross-spawn@npm:^6.0.2": version: 6.0.6 resolution: "@types/cross-spawn@npm:6.0.6" @@ -6203,6 +6360,15 @@ __metadata: languageName: node linkType: hard +"@types/mute-stream@npm:^0.0.4": + version: 0.0.4 + resolution: "@types/mute-stream@npm:0.0.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/944730fd7b398c5078de3c3d4d0afeec8584283bc694da1803fdfca14149ea385e18b1b774326f1601baf53898ce6d121a952c51eb62d188ef6fcc41f725c0dc + languageName: node + linkType: hard + "@types/node-forge@npm:^1.3.0": version: 1.3.11 resolution: "@types/node-forge@npm:1.3.11" @@ -6230,6 +6396,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.5.5": + version: 22.5.5 + resolution: "@types/node@npm:22.5.5" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/ead9495cfc6b1da5e7025856dcce2591e9bae635357410c0d2dd619fce797d2a1d402887580ca4b336cb78168b195224869967de370a23f61663cf1e4836121c + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -6413,6 +6588,20 @@ __metadata: languageName: node linkType: hard +"@types/statuses@npm:^2.0.4": + version: 2.0.5 + resolution: "@types/statuses@npm:2.0.5" + checksum: 10c0/4dacec0b29483a44be902a022a11a22b339de7a6e7b2059daa4f7add10cb6dbcc28d02d2a416fe9687e48d335906bf983065391836d4e7c847e55ddef4de8fad + languageName: node + linkType: hard + +"@types/tough-cookie@npm:^4.0.5": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 + languageName: node + linkType: hard + "@types/trusted-types@npm:^2.0.2": version: 2.0.7 resolution: "@types/trusted-types@npm:2.0.7" @@ -6441,6 +6630,13 @@ __metadata: languageName: node linkType: hard +"@types/wrap-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/wrap-ansi@npm:3.0.0" + checksum: 10c0/8d8f53363f360f38135301a06b596c295433ad01debd082078c33c6ed98b05a5c8fe8853a88265432126096084f4a135ec1564e3daad631b83296905509f90b3 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.5": version: 8.5.11 resolution: "@types/ws@npm:8.5.11" @@ -6629,66 +6825,148 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/expect@npm:2.0.5" +"@vitest/coverage-istanbul@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/coverage-istanbul@npm:2.1.1" + dependencies: + "@istanbuljs/schema": "npm:^0.1.3" + debug: "npm:^4.3.6" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-instrument: "npm:^6.0.3" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.1.7" + magicast: "npm:^0.3.4" + test-exclude: "npm:^7.0.1" + tinyrainbow: "npm:^1.2.0" + peerDependencies: + vitest: 2.1.1 + checksum: 10c0/4dd4109294c2cc51306cb1cbabf22e0815664b07f3d668df3ebb0968fbf564213e85eca2e369c8dca838baf3e5ed4fbb243e7a98f20899a8040779fa7e6ee381 + languageName: node + linkType: hard + +"@vitest/coverage-v8@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/coverage-v8@npm:2.1.1" + dependencies: + "@ampproject/remapping": "npm:^2.3.0" + "@bcoe/v8-coverage": "npm:^0.2.3" + debug: "npm:^4.3.6" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.1.7" + magic-string: "npm:^0.30.11" + magicast: "npm:^0.3.4" + std-env: "npm:^3.7.0" + test-exclude: "npm:^7.0.1" + tinyrainbow: "npm:^1.2.0" + peerDependencies: + "@vitest/browser": 2.1.1 + vitest: 2.1.1 + peerDependenciesMeta: + "@vitest/browser": + optional: true + checksum: 10c0/3deba40edfae79ac4545cadb0786ecf6c8deb72cdfd1ba0f205d84804d241740a7e78892782a3002f87bb5c0a2705ab613fe5f54374f2fe9866cd0a574d65156 + languageName: node + linkType: hard + +"@vitest/expect@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/expect@npm:2.1.1" dependencies: - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" + "@vitest/spy": "npm:2.1.1" + "@vitest/utils": "npm:2.1.1" chai: "npm:^5.1.1" tinyrainbow: "npm:^1.2.0" - checksum: 10c0/08cb1b0f106d16a5b60db733e3d436fa5eefc68571488eb570dfe4f599f214ab52e4342273b03dbe12331cc6c0cdc325ac6c94f651ad254cd62f3aa0e3d185aa + checksum: 10c0/2a467bcd37378b653040cca062a665f382087eb9f69cff670848a0c207a8458f27211c408c75b7e563e069a2e6d533c78f24e1a317c259646b948813342dbf3d languageName: node linkType: hard -"@vitest/pretty-format@npm:2.0.5, @vitest/pretty-format@npm:^2.0.5": - version: 2.0.5 - resolution: "@vitest/pretty-format@npm:2.0.5" +"@vitest/mocker@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/mocker@npm:2.1.1" + dependencies: + "@vitest/spy": "npm:^2.1.0-beta.1" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.11" + peerDependencies: + "@vitest/spy": 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/e0681bb75bf7255ce49f720d193c9c795a64d42fef13c7af5c157514ebce88a5b89dbf702aa0929d4cefaed3db73351bd3ade3ccabecc09a23a872d9c55be50d + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.1, @vitest/pretty-format@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/pretty-format@npm:2.1.1" dependencies: tinyrainbow: "npm:^1.2.0" - checksum: 10c0/236c0798c5170a0b5ad5d4bd06118533738e820b4dd30079d8fbcb15baee949d41c60f42a9f769906c4a5ce366d7ef11279546070646c0efc03128c220c31f37 + checksum: 10c0/21057465a794a037a7af2c48397531eadf9b2d8a7b4d1ee5af9081cf64216cd0039b9e06317319df79aa2240fed1dbb6767b530deae2bd4b42d6fb974297e97d languageName: node linkType: hard -"@vitest/runner@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/runner@npm:2.0.5" +"@vitest/runner@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/runner@npm:2.1.1" dependencies: - "@vitest/utils": "npm:2.0.5" + "@vitest/utils": "npm:2.1.1" pathe: "npm:^1.1.2" - checksum: 10c0/d0ed3302a7e015bf44b7c0df9d8f7da163659e082d86f9406944b5a31a61ab9ddc1de530e06176d1f4ef0bde994b44bff4c7dab62aacdc235c8fc04b98e4a72a + checksum: 10c0/a6d1424d6224d8a60ed0bbf7cdacb165ef36bc71cc957ad2c11ed1989fa5106636173369f0d8e1fa3f319a965091e52c8ce21203fce4bafe772632ccc2bd65a6 languageName: node linkType: hard -"@vitest/snapshot@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/snapshot@npm:2.0.5" +"@vitest/snapshot@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/snapshot@npm:2.1.1" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - magic-string: "npm:^0.30.10" + "@vitest/pretty-format": "npm:2.1.1" + magic-string: "npm:^0.30.11" pathe: "npm:^1.1.2" - checksum: 10c0/7bf38474248f5ae0aac6afad511785d2b7a023ac5158803c2868fd172b5b9c1a569fb1dd64a09a49e43fd342cab71ea485ada89b7f08d37b1622a5a0ac00271d + checksum: 10c0/e9dadee87a2f489883dec0360b55b2776d2a07e460bf2430b34867cd4e9f34b09b3e219a23bc8c3e1359faefdd166072d3305b66a0bea475c7d616470b7d841c languageName: node linkType: hard -"@vitest/spy@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/spy@npm:2.0.5" +"@vitest/spy@npm:2.1.1, @vitest/spy@npm:^2.1.0-beta.1": + version: 2.1.1 + resolution: "@vitest/spy@npm:2.1.1" dependencies: tinyspy: "npm:^3.0.0" - checksum: 10c0/70634c21921eb271b54d2986c21d7ab6896a31c0f4f1d266940c9bafb8ac36237846d6736638cbf18b958bd98e5261b158a6944352742accfde50b7818ff655e + checksum: 10c0/b251be1390c105b68aa95270159c4583c3e1a0f7a2e1f82db8b7fadedc3cb459c5ef9286033a1ae764810e00715552fc80afe4507cd8b0065934fb1a64926e06 languageName: node linkType: hard -"@vitest/utils@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/utils@npm:2.0.5" +"@vitest/ui@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/ui@npm:2.1.1" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - estree-walker: "npm:^3.0.3" + "@vitest/utils": "npm:2.1.1" + fflate: "npm:^0.8.2" + flatted: "npm:^3.3.1" + pathe: "npm:^1.1.2" + sirv: "npm:^2.0.4" + tinyglobby: "npm:^0.2.6" + tinyrainbow: "npm:^1.2.0" + peerDependencies: + vitest: 2.1.1 + checksum: 10c0/52b1580edb9a7c87bdbfdc6521a8b01af1294a2a674f97597a8a923a663f198571972a7b65c66aebe5afb5f886bf1cd4e0828913558c95bc118f568d68afa046 + languageName: node + linkType: hard + +"@vitest/utils@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/utils@npm:2.1.1" + dependencies: + "@vitest/pretty-format": "npm:2.1.1" loupe: "npm:^3.1.1" tinyrainbow: "npm:^1.2.0" - checksum: 10c0/0d1de748298f07a50281e1ba058b05dcd58da3280c14e6f016265e950bd79adab6b97822de8f0ea82d3070f585654801a9b1bcf26db4372e51cf7746bf86d73b + checksum: 10c0/b724c7f23591860bd24cd8e6d0cd803405f4fbff746db160a948290742144463287566a05ca400deb56817603b5185c4429707947869c3d453805860b5e3a3e5 languageName: node linkType: hard @@ -8251,6 +8529,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f + languageName: node + linkType: hard + "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -8565,6 +8850,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 10c0/c01ca3ef8d7b8187bae434434582288681273b5a9ed27521d4d7f9f7928fe0c920df0decd9f9d3bbd2d14ac432b8c8cf42b98b3bdd5bfe0e6edddeebebe8b61d + languageName: node + linkType: hard + "copy-anything@npm:^3.0.2": version: 3.0.5 resolution: "copy-anything@npm:3.0.5" @@ -8990,6 +9282,15 @@ __metadata: languageName: node linkType: hard +"cssstyle@npm:^4.0.1": + version: 4.1.0 + resolution: "cssstyle@npm:4.1.0" + dependencies: + rrweb-cssom: "npm:^0.7.1" + checksum: 10c0/05c6597e5d3e0ec6b15221f2c0ce9a0443a46cc50a6089a3ba9ee1ac27f83ff86a445a8f95435137dadd859f091fc61b6d342abaf396d3c910471b5b33cfcbfa + languageName: node + linkType: hard + "csstype@npm:^3.0.2, csstype@npm:^3.1.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -9160,6 +9461,16 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^5.0.0": + version: 5.0.0 + resolution: "data-urls@npm:5.0.0" + dependencies: + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + checksum: 10c0/1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -9239,7 +9550,19 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.5, debug@npm:~4.3.6": +"debug@npm:^4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + +"debug@npm:~4.3.6": version: 4.3.6 resolution: "debug@npm:4.3.6" dependencies: @@ -9258,7 +9581,7 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.2.1": +"decimal.js@npm:^10.2.1, decimal.js@npm:^10.4.3": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee @@ -10933,6 +11256,25 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.3.0": + version: 6.3.0 + resolution: "fdir@npm:6.3.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/be91cd6ab2edbc6df457a69b79672ee9345996986821918ef01908ce9619b8cbecd9c6c13d4ca5d0aeb548b162050d68c599f45bb3fbff194a91e16f25e646b5 + languageName: node + linkType: hard + +"fflate@npm:^0.8.2": + version: 0.8.2 + resolution: "fflate@npm:0.8.2" + checksum: 10c0/03448d630c0a583abea594835a9fdb2aaf7d67787055a761515bf4ed862913cfd693b4c4ffd5c3f3b355a70cf1e19033e9ae5aedcca103188aaff91b8bd6e293 + languageName: node + linkType: hard + "figures@npm:^3.0.0, figures@npm:^3.2.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -11081,7 +11423,7 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.9": +"flatted@npm:^3.2.9, flatted@npm:^3.3.1": version: 3.3.1 resolution: "flatted@npm:3.3.1" checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf @@ -11189,6 +11531,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -11381,6 +11734,9 @@ __metadata: "@types/react-router-dom": "npm:^5.3.3" "@types/semver": "npm:^7" "@vitejs/plugin-react": "npm:^4.3.1" + "@vitest/coverage-istanbul": "npm:^2.1.1" + "@vitest/coverage-v8": "npm:^2.1.1" + "@vitest/ui": "npm:^2.1.1" autoprefixer: "npm:^10.4.14" classnames: "npm:^2.3.1" copy-to-clipboard: "npm:^3.3.3" @@ -11407,10 +11763,12 @@ __metadata: husky: "npm:^9.1.4" jest-junit: "npm:^13.0.0" js-cookie: "npm:^3.0.5" + jsdom: "npm:^25.0.0" launchdarkly-react-client-sdk: "npm:^3.0.9" lint-staged: "npm:^15.2.8" lodash: "npm:^4.17.21" msw: "npm:^1.2.1" + msw2: "npm:msw@^2.4.8" pluralize: "npm:^8.0.0" postcss: "npm:^8.4.31" prettier: "npm:^3.3.3" @@ -11446,7 +11804,7 @@ __metadata: vite-plugin-ejs: "npm:^1.7.0" vite-plugin-svgr: "npm:^4.2.0" vite-tsconfig-paths: "npm:^5.0.1" - vitest: "npm:^2.0.5" + vitest: "npm:^2.1.1" webpack: "npm:^5.84.1" webpackbar: "npm:^6.0.1" zod: "npm:^3.21.4" @@ -11590,7 +11948,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -11880,6 +12238,13 @@ __metadata: languageName: node linkType: hard +"headers-polyfill@npm:^4.0.2": + version: 4.0.3 + resolution: "headers-polyfill@npm:4.0.3" + checksum: 10c0/53e85b2c6385f8d411945fb890c5369f1469ce8aa32a6e8d28196df38568148de640c81cf88cbc7c67767103dd9acba48f4f891982da63178fc6e34560022afe + languageName: node + linkType: hard + "history@npm:^4.9.0": version: 4.10.1 resolution: "history@npm:4.10.1" @@ -11940,6 +12305,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 + languageName: node + linkType: hard + "html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": version: 2.5.2 resolution: "html-entities@npm:2.5.2" @@ -12068,7 +12442,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -12117,7 +12491,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": version: 7.0.5 resolution: "https-proxy-agent@npm:7.0.5" dependencies: @@ -12166,7 +12540,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -12844,7 +13218,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b @@ -12864,7 +13238,20 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": +"istanbul-lib-instrument@npm:^6.0.3": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" dependencies: @@ -12886,7 +13273,18 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3": +"istanbul-lib-source-maps@npm:^5.0.6": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + checksum: 10c0/ffe75d70b303a3621ee4671554f306e0831b16f39ab7f4ab52e54d356a5d33e534d97563e318f1333a6aae1d42f91ec49c76b6cd3f3fb378addcb5c81da0255f + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.7": version: 3.1.7 resolution: "istanbul-reports@npm:3.1.7" dependencies: @@ -13734,6 +14132,40 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^25.0.0": + version: 25.0.0 + resolution: "jsdom@npm:25.0.0" + dependencies: + cssstyle: "npm:^4.0.1" + data-urls: "npm:^5.0.0" + decimal.js: "npm:^10.4.3" + form-data: "npm:^4.0.0" + html-encoding-sniffer: "npm:^4.0.0" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.5" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.12" + parse5: "npm:^7.1.2" + rrweb-cssom: "npm:^0.7.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^4.1.4" + w3c-xmlserializer: "npm:^5.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^3.1.1" + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + ws: "npm:^8.18.0" + xml-name-validator: "npm:^5.0.0" + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/1552bcfb816b2c69ae159ba0cd79e8964030c106cc0cb2deb20a64c1ca54e1ea41352b9802d89b7cf823e43e6d74ed7289abff4aacc95b1b2bc936570aab3594 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -14271,7 +14703,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10": +"magic-string@npm:^0.30.11": version: 0.30.11 resolution: "magic-string@npm:0.30.11" dependencies: @@ -14289,6 +14721,17 @@ __metadata: languageName: node linkType: hard +"magicast@npm:^0.3.4": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" + source-map-js: "npm:^1.2.0" + checksum: 10c0/a6cacc0a848af84f03e3f5bda7b0de75e4d0aa9ddce5517fd23ed0f31b5ddd51b2d0ff0b7e09b51f7de0f4053c7a1107117edda6b0732dca3e9e39e6c5a68c64 + languageName: node + linkType: hard + "make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -15180,6 +15623,13 @@ __metadata: languageName: node linkType: hard +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -15194,13 +15644,45 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard +"msw2@npm:msw@^2.4.8": + version: 2.4.8 + resolution: "msw@npm:2.4.8" + dependencies: + "@bundled-es-modules/cookie": "npm:^2.0.0" + "@bundled-es-modules/statuses": "npm:^1.0.1" + "@bundled-es-modules/tough-cookie": "npm:^0.1.6" + "@inquirer/confirm": "npm:^3.0.0" + "@mswjs/interceptors": "npm:^0.35.6" + "@open-draft/until": "npm:^2.1.0" + "@types/cookie": "npm:^0.6.0" + "@types/statuses": "npm:^2.0.4" + chalk: "npm:^4.1.2" + graphql: "npm:^16.8.1" + headers-polyfill: "npm:^4.0.2" + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.2" + path-to-regexp: "npm:^6.3.0" + strict-event-emitter: "npm:^0.5.1" + type-fest: "npm:^4.9.0" + yargs: "npm:^17.7.2" + peerDependencies: + typescript: ">= 4.8.x" + peerDependenciesMeta: + typescript: + optional: true + bin: + msw: cli/index.js + checksum: 10c0/33a8c5697f7cb003a2af33ff6b259eaf7babf180fadf0697d107d0856ab0d2ff1a80d319e788d9127f289ff091334bee589f348180a1fdd0914bf8c4725830dc + languageName: node + linkType: hard + "msw@npm:^1.2.1": version: 1.3.3 resolution: "msw@npm:1.3.3" @@ -15254,6 +15736,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -15477,7 +15966,7 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.0": +"nwsapi@npm:^2.2.0, nwsapi@npm:^2.2.12": version: 2.2.12 resolution: "nwsapi@npm:2.2.12" checksum: 10c0/95e9623d63df111405503df8c5d800e26f71675d319e2c9c70cddfa31e5ace1d3f8b6d98d354544fc156a1506d920ec291e303fab761e4f99296868e199a466e @@ -15756,7 +16245,7 @@ __metadata: languageName: node linkType: hard -"outvariant@npm:^1.2.1, outvariant@npm:^1.4.0": +"outvariant@npm:^1.2.1, outvariant@npm:^1.4.0, outvariant@npm:^1.4.2, outvariant@npm:^1.4.3": version: 1.4.3 resolution: "outvariant@npm:1.4.3" checksum: 10c0/5976ca7740349cb8c71bd3382e2a762b1aeca6f33dc984d9d896acdf3c61f78c3afcf1bfe9cc633a7b3c4b295ec94d292048f83ea2b2594fae4496656eba992c @@ -15879,6 +16368,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.1.2": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: "npm:^4.4.0" + checksum: 10c0/297d7af8224f4b5cb7f6617ecdae98eeaed7f8cbd78956c42785e230505d5a4f07cef352af10d3006fa5c1544b76b57784d3a22d861ae071bbc460c649482bf4 + languageName: node + linkType: hard + "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -15978,6 +16476,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -16027,6 +16532,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pidtree@npm:~0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" @@ -17176,7 +17688,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 @@ -18379,6 +18891,13 @@ __metadata: languageName: node linkType: hard +"rrweb-cssom@npm:^0.7.1": + version: 0.7.1 + resolution: "rrweb-cssom@npm:0.7.1" + checksum: 10c0/127b8ca6c8aac45e2755abbae6138d4a813b1bedc2caabf79466ae83ab3cfc84b5bfab513b7033f0aa4561c7753edf787d0dd01163ceacdee2e8eb1b6bf7237e + languageName: node + linkType: hard + "rtl-css-js@npm:^1.16.1": version: 1.16.1 resolution: "rtl-css-js@npm:1.16.1" @@ -18514,6 +19033,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 + languageName: node + linkType: hard + "scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" @@ -18815,6 +19343,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^2.0.4": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/68f8ee857f6a9415e9c07a1f31c7c561df8d5f1b1ba79bee3de583fa37da8718def5309f6b1c6e2c3ef77de45d74f5e49efc7959214443aa92d42e9c99180a4e + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -19135,7 +19674,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": +"statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 @@ -19221,6 +19760,13 @@ __metadata: languageName: node linkType: hard +"strict-event-emitter@npm:^0.5.1": + version: 0.5.1 + resolution: "strict-event-emitter@npm:0.5.1" + checksum: 10c0/f5228a6e6b6393c57f52f62e673cfe3be3294b35d6f7842fc24b172ae0a6e6c209fa83241d0e433fc267c503bc2f4ffdbe41a9990ff8ffd5ac425ec0489417f7 + languageName: node + linkType: hard + "string-argv@npm:~0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -19813,6 +20359,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^10.4.1" + minimatch: "npm:^9.0.4" + checksum: 10c0/6d67b9af4336a2e12b26a68c83308c7863534c65f27ed4ff7068a56f5a58f7ac703e8fc80f698a19bb154fd8f705cdf7ec347d9512b2c522c737269507e7b263 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -19880,13 +20437,30 @@ __metadata: languageName: node linkType: hard -"tinybench@npm:^2.8.0": +"tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c languageName: node linkType: hard +"tinyexec@npm:^0.3.0": + version: 0.3.0 + resolution: "tinyexec@npm:0.3.0" + checksum: 10c0/138a4f4241aea6b6312559508468ab275a31955e66e2f57ed206e0aaabecee622624f208c5740345f0a66e33478fd065e359ed1eb1269eb6fd4fa25d44d0ba3b + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.6": + version: 0.2.6 + resolution: "tinyglobby@npm:0.2.6" + dependencies: + fdir: "npm:^6.3.0" + picomatch: "npm:^4.0.2" + checksum: 10c0/d7b5eb4c5b9c341f961c1d3c30624f9a1e22b27b48a79a65b48120245a77c143827f75f5854628fef1a4bd4bc3cfaf06ce76497f3a574e3f933229c5e556e5fe + languageName: node + linkType: hard + "tinypool@npm:^1.0.0": version: 1.0.1 resolution: "tinypool@npm:1.0.1" @@ -19954,7 +20528,14 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.0.0": +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + +"tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.4": version: 4.1.4 resolution: "tough-cookie@npm:4.1.4" dependencies: @@ -19984,6 +20565,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^5.0.0": + version: 5.0.0 + resolution: "tr46@npm:5.0.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/1521b6e7bbc8adc825c4561480f9fe48eb2276c81335eed9fa610aa4c44a48a3221f78b10e5f18b875769eb3413e30efbf209ed556a17a42aa8d690df44b7bee + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -20210,6 +20800,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^4.9.0": + version: 4.26.1 + resolution: "type-fest@npm:4.26.1" + checksum: 10c0/d2719ff8d380befe8a3c61068f37f28d6fa2849fd140c5d2f0f143099e371da6856aad7c97e56b83329d45bfe504afe9fd936a7cff600cc0d46aa9ffb008d6c6 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -20334,6 +20931,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + "undici@npm:^5.25.4": version: 5.28.4 resolution: "undici@npm:5.28.4" @@ -21218,18 +21822,17 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:2.0.5": - version: 2.0.5 - resolution: "vite-node@npm:2.0.5" +"vite-node@npm:2.1.1": + version: 2.1.1 + resolution: "vite-node@npm:2.1.1" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.5" + debug: "npm:^4.3.6" pathe: "npm:^1.1.2" - tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" bin: vite-node: vite-node.mjs - checksum: 10c0/affcc58ae8d45bce3e8bc3b5767acd57c24441634e2cd967cf97f4e5ed2bcead1714b60150cdf7ee153ebad47659c5cd419883207e1a95b69790331e3243749f + checksum: 10c0/8a8b958df3d48af915e07e7efb042ee4c036ca0b73d2c411dc29254fd3533ada0807ce5096d8339894d3e786418b7d1a9c4ae02718c6aca11b5098de2b14c336 languageName: node linkType: hard @@ -21359,34 +21962,34 @@ __metadata: languageName: node linkType: hard -"vitest@npm:^2.0.5": - version: 2.0.5 - resolution: "vitest@npm:2.0.5" - dependencies: - "@ampproject/remapping": "npm:^2.3.0" - "@vitest/expect": "npm:2.0.5" - "@vitest/pretty-format": "npm:^2.0.5" - "@vitest/runner": "npm:2.0.5" - "@vitest/snapshot": "npm:2.0.5" - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" +"vitest@npm:^2.1.1": + version: 2.1.1 + resolution: "vitest@npm:2.1.1" + dependencies: + "@vitest/expect": "npm:2.1.1" + "@vitest/mocker": "npm:2.1.1" + "@vitest/pretty-format": "npm:^2.1.1" + "@vitest/runner": "npm:2.1.1" + "@vitest/snapshot": "npm:2.1.1" + "@vitest/spy": "npm:2.1.1" + "@vitest/utils": "npm:2.1.1" chai: "npm:^5.1.1" - debug: "npm:^4.3.5" - execa: "npm:^8.0.1" - magic-string: "npm:^0.30.10" + debug: "npm:^4.3.6" + magic-string: "npm:^0.30.11" pathe: "npm:^1.1.2" std-env: "npm:^3.7.0" - tinybench: "npm:^2.8.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.0" tinypool: "npm:^1.0.0" tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" - vite-node: "npm:2.0.5" + vite-node: "npm:2.1.1" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.0.5 - "@vitest/ui": 2.0.5 + "@vitest/browser": 2.1.1 + "@vitest/ui": 2.1.1 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -21404,7 +22007,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10c0/b4e6cca00816bf967a8589111ded72faa12f92f94ccdd0dcd0698ffcfdfc52ec662753f66b387549c600ac699b993fd952efbd99dc57fcf4d1c69a2f1022b259 + checksum: 10c0/77a67092338613376dadd8f6f6872383db8409402ce400ac1de48efd87a7214183e798484a3eb2310221c03554e37a00f9fdbc91e49194e7c68e009a5589f494 languageName: node linkType: hard @@ -21426,6 +22029,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" + dependencies: + xml-name-validator: "npm:^5.0.0" + checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b + languageName: node + linkType: hard + "walk-up-path@npm:^3.0.1": version: 3.0.1 resolution: "walk-up-path@npm:3.0.1" @@ -21520,6 +22132,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^5.3.4": version: 5.3.4 resolution: "webpack-dev-middleware@npm:5.3.4" @@ -21757,6 +22376,15 @@ __metadata: languageName: node linkType: hard +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.6.2": version: 3.6.20 resolution: "whatwg-fetch@npm:3.6.20" @@ -21771,6 +22399,23 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df + languageName: node + linkType: hard + +"whatwg-url@npm:^14.0.0": + version: 14.0.0 + resolution: "whatwg-url@npm:14.0.0" + dependencies: + tr46: "npm:^5.0.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/ac32e9ba9d08744605519bbe9e1371174d36229689ecc099157b6ba102d4251a95e81d81f3d80271eb8da182eccfa65653f07f0ab43ea66a6934e643fd091ba9 + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -22136,7 +22781,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1": +"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: @@ -22214,7 +22859,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0, ws@npm:^8.2.3": +"ws@npm:^8.13.0, ws@npm:^8.18.0, ws@npm:^8.2.3": version: 8.18.0 resolution: "ws@npm:8.18.0" peerDependencies: @@ -22236,6 +22881,13 @@ __metadata: languageName: node linkType: hard +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 + languageName: node + linkType: hard + "xml@npm:^1.0.1": version: 1.0.1 resolution: "xml@npm:1.0.1" @@ -22325,7 +22977,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1": +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -22354,6 +23006,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.2 + resolution: "yoctocolors-cjs@npm:2.1.2" + checksum: 10c0/a0e36eb88fea2c7981eab22d1ba45e15d8d268626e6c4143305e2c1628fa17ebfaa40cd306161a8ce04c0a60ee0262058eab12567493d5eb1409780853454c6f + languageName: node + linkType: hard + "zod@npm:^3.21.4, zod@npm:^3.22.4": version: 3.23.8 resolution: "zod@npm:3.23.8"