diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 451197df6..1956c7969 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -152,7 +152,7 @@ jobs: - name: "Test" run: | - npm run test + npm run test-coverage - name: "Upload coverage results" uses: codecov/codecov-action@v5.1.2 diff --git a/packages/frontend/.gitignore b/packages/frontend/.gitignore deleted file mode 100644 index 4d29575de..000000000 --- a/packages/frontend/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/packages/frontend/__tests__/components/__snapshots__/AppNavigation.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/AppNavigation.test.tsx.snap deleted file mode 100644 index 0e3cf0fff..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/AppNavigation.test.tsx.snap +++ /dev/null @@ -1,49 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`AppNavigation component should render correctly 1`] = ` -.emotion-0 { - list-style: none; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - margin-bottom: 24px; - padding: 0 16px; - border-bottom: 1px solid #294885; -} - -.emotion-1 { - display: block; - padding: 0.2em 0.8em; - margin-bottom: -1px; - border: 1px solid transparent; - border-radius: 5px 5px 0 0; -} - -.emotion-1.active { - border-top: 1px solid #294885; - border-right: 1px solid #294885; - border-left: 1px solid #294885; - background-color: #fff; -} - - -`; diff --git a/packages/frontend/__tests__/components/__snapshots__/Button.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/Button.test.tsx.snap deleted file mode 100644 index fe1553c3a..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/Button.test.tsx.snap +++ /dev/null @@ -1,128 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Button component should render correctly 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - - - Link somewhere - -`; - -exports[`Button component should render correctly with custom class 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - - - Link somewhere - -`; - -exports[`Button component should render correctly with target self 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - - - Link somewhere - -`; - -exports[`Button component should render correctly with title 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - - - Link somewhere - -`; diff --git a/packages/frontend/__tests__/components/__snapshots__/ColoredTag.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/ColoredTag.test.tsx.snap deleted file mode 100644 index 1b1c23583..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/ColoredTag.test.tsx.snap +++ /dev/null @@ -1,19 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ColoredTag component should render correctly 1`] = ` -.emotion-0 { - background-color: #13791433; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - - - Tag - -`; diff --git a/packages/frontend/__tests__/components/__snapshots__/ExtLink.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/ExtLink.test.tsx.snap deleted file mode 100644 index cc33ec202..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/ExtLink.test.tsx.snap +++ /dev/null @@ -1,88 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ExtLink component should render correctly 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - - - Link somewhere - -`; - -exports[`ExtLink component should render correctly with custom class 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - - - Link somewhere - -`; - -exports[`ExtLink component should render correctly with target self 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - - - Link somewhere - -`; - -exports[`ExtLink component should render correctly with title 1`] = ` -.emotion-0 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - - - Link somewhere - -`; diff --git a/packages/frontend/__tests__/components/__snapshots__/Issue.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/Issue.test.tsx.snap deleted file mode 100644 index d60119182..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/Issue.test.tsx.snap +++ /dev/null @@ -1,195 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Issue component should render correctly 1`] = ` -.emotion-0 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - margin: 0 0 0.6em; -} - -.emotion-2 * { - font-size: 0.8rem; -} - -.emotion-3 { - margin: 0 0 16px; -} - -.emotion-3 img { - max-width: 100%; -} - -.emotion-4 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-5 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-6 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-7 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -
-

- - Add hint to set videos to public - -

-

- - WordPress plugin: Galerie obrázků a videí z Google Disku - -

-
-

- When editing and selecting a folder with videos, the editor could display a notice that setting videos to "Anyone can view" will speed them up. -

- - -

- Depends on #792 -

-
- - wordpress - - - php - - - javascript - - - google - -
-`; - -exports[`Issue component should render correctly without tags 1`] = ` -.emotion-0 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - margin: 0 0 0.6em; -} - -.emotion-2 * { - font-size: 0.8rem; -} - -.emotion-3 { - margin: 0 0 16px; -} - -.emotion-3 img { - max-width: 100%; -} - -
-

- - Add hint to set videos to public - -

-

- - WordPress plugin: Galerie obrázků a videí z Google Disku - -

-
-

- When editing and selecting a folder with videos, the editor could display a notice that setting videos to "Anyone can view" will speed them up. -

- - -

- Depends on #792 -

-
-
-`; diff --git a/packages/frontend/__tests__/components/__snapshots__/Navigation.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/Navigation.test.tsx.snap deleted file mode 100644 index 14d27cda0..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/Navigation.test.tsx.snap +++ /dev/null @@ -1,97 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Navigation component should render correctly 1`] = ` -.emotion-0 { - list-style: none; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - margin-bottom: 24px; - padding: 0 16px; - border-bottom: 1px solid #294885; -} - -.emotion-1 { - display: block; - padding: 0.2em 0.8em; - margin-bottom: -1px; - border: 1px solid transparent; - border-radius: 5px 5px 0 0; -} - -.emotion-1.active { - border-top: 1px solid #294885; - border-right: 1px solid #294885; - border-left: 1px solid #294885; - background-color: #fff; -} - - -`; - -exports[`Navigation component should render correctly wyth active item 1`] = ` -.emotion-0 { - list-style: none; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - margin-bottom: 24px; - padding: 0 16px; - border-bottom: 1px solid #294885; -} - -.emotion-1 { - display: block; - padding: 0.2em 0.8em; - margin-bottom: -1px; - border: 1px solid transparent; - border-radius: 5px 5px 0 0; -} - -.emotion-1.active { - border-top: 1px solid #294885; - border-right: 1px solid #294885; - border-left: 1px solid #294885; - background-color: #fff; -} - - -`; diff --git a/packages/frontend/__tests__/components/__snapshots__/Project.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/Project.test.tsx.snap deleted file mode 100644 index 5a31dd992..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/Project.test.tsx.snap +++ /dev/null @@ -1,116 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Project component should render correctly 1`] = ` -.emotion-0 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - margin: 0 0 0.6em; -} - -.emotion-2 * { - font-size: 0.8rem; -} - -.emotion-3 { - margin: 0 0 16px; -} - -.emotion-3 img { - max-width: 100%; -} - -.emotion-4 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-5 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-6 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-7 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -
-

- - WordPress plugin: Galerie obrázků a videí z Google Disku - -

-

-

-

- Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky. -

-
- - wordpress - - - php - - - javascript - - - google - -
-`; diff --git a/packages/frontend/__tests__/components/__snapshots__/ProjectLinks.test.tsx.snap b/packages/frontend/__tests__/components/__snapshots__/ProjectLinks.test.tsx.snap deleted file mode 100644 index 20530de1b..000000000 --- a/packages/frontend/__tests__/components/__snapshots__/ProjectLinks.test.tsx.snap +++ /dev/null @@ -1,83 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ProjectLinks component should render correctly 1`] = ` -.emotion-0 { - margin: 0 0 16px; -} - -.emotion-0 img { - max-width: 100%; -} - -.emotion-1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #999; - font-size: 0.8em; -} - -.emotion-1 svg { - margin-right: 0.2em; -} - -.emotion-2 a { - display: block; - font-size: 0.9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.emotion-3 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -
- - - - -   - Správce: - - - - Marek Dědič – Mlha - - -
-`; diff --git a/packages/frontend/__tests__/pages/__snapshots__/IssuesList.test.tsx.snap b/packages/frontend/__tests__/pages/__snapshots__/IssuesList.test.tsx.snap deleted file mode 100644 index a8cc602ed..000000000 --- a/packages/frontend/__tests__/pages/__snapshots__/IssuesList.test.tsx.snap +++ /dev/null @@ -1,128 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`IssuesList page should render correctly 1`] = ` -.emotion-0 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - margin: 0 0 0.6em; -} - -.emotion-2 * { - font-size: 0.8rem; -} - -.emotion-3 { - margin: 0 0 16px; -} - -.emotion-3 img { - max-width: 100%; -} - -.emotion-4 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-5 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-6 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-7 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -
-

- - Add hint to set videos to public - -

-

- - WordPress plugin: Galerie obrázků a videí z Google Disku - -

-
-

- When editing and selecting a folder with videos, the editor could display a notice that setting videos to "Anyone can view" will speed them up. -

- - -

- Depends on #792 -

-
- - wordpress - - - php - - - javascript - - - google - -
-`; diff --git a/packages/frontend/__tests__/pages/__snapshots__/ProjectsList.test.tsx.snap b/packages/frontend/__tests__/pages/__snapshots__/ProjectsList.test.tsx.snap deleted file mode 100644 index 919bfab22..000000000 --- a/packages/frontend/__tests__/pages/__snapshots__/ProjectsList.test.tsx.snap +++ /dev/null @@ -1,116 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ProjectsList page should render correctly 1`] = ` -.emotion-0 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - margin: 0 0 0.6em; -} - -.emotion-2 * { - font-size: 0.8rem; -} - -.emotion-3 { - margin: 0 0 16px; -} - -.emotion-3 img { - max-width: 100%; -} - -.emotion-4 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-5 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-6 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-7 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -
-

- - WordPress plugin: Galerie obrázků a videí z Google Disku - -

-

-

-

- Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky. -

-
- - wordpress - - - php - - - javascript - - - google - -
-`; diff --git a/packages/frontend/__tests__/setupTests.ts b/packages/frontend/__tests__/setupTests.ts deleted file mode 100644 index 13e414ea4..000000000 --- a/packages/frontend/__tests__/setupTests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createSerializer } from "@emotion/jest"; -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import "@testing-library/jest-dom"; - -expect.addSnapshotSerializer(createSerializer()); diff --git a/packages/frontend/eslint.config.js b/packages/frontend/eslint.config.js index 42e1f19fd..34dba11d9 100644 --- a/packages/frontend/eslint.config.js +++ b/packages/frontend/eslint.config.js @@ -1,8 +1,8 @@ import eslintComments from "@eslint-community/eslint-plugin-eslint-comments"; import commentsConfig from "@eslint-community/eslint-plugin-eslint-comments/configs"; import js from "@eslint/js"; +import vitest from "@vitest/eslint-plugin"; import compat from "eslint-plugin-compat"; -import jest from "eslint-plugin-jest"; import perfectionist from "eslint-plugin-perfectionist"; import preferArrowFunctions from "eslint-plugin-prefer-arrow-functions"; import prettierRecommended from "eslint-plugin-prettier/recommended"; @@ -31,7 +31,6 @@ export default tseslint.config( }, plugins: { "eslint-comments": eslintComments, - jest, "prefer-arrow-functions": preferArrowFunctions, }, rules: { @@ -212,41 +211,48 @@ export default tseslint.config( }, }, { - ...jest.configs["flat/recommended"], - ...jest.configs["flat/style"], - files: ["__tests__/**/*.test.ts", "__test__/**/*.test.tsx"], + files: ["tests/**/*.test.ts", "tests/**/*.test.tsx"], + ...vitest.configs.recommended, rules: { - ...jest.configs["flat/recommended"].rules, - ...jest.configs["flat/style"].rules, - "jest/consistent-test-it": ["error", { withinDescribe: "test" }], - "jest/no-conditional-in-test": "error", - "jest/no-confusing-set-timeout": "error", - "jest/no-duplicate-hooks": "error", - "jest/no-test-return-statement": "error", - "jest/no-untyped-mock-factory": "error", - "jest/padding-around-all": "error", - "jest/prefer-called-with": "error", - "jest/prefer-comparison-matcher": "error", - "jest/prefer-each": "error", - "jest/prefer-equality-matcher": "error", - "jest/prefer-expect-assertions": [ - "error", - { - onlyFunctionsWithAsyncKeyword: true, - onlyFunctionsWithExpectInCallback: true, - onlyFunctionsWithExpectInLoop: true, - }, - ], - "jest/prefer-expect-resolves": "error", - "jest/prefer-hooks-in-order": "error", - "jest/prefer-hooks-on-top": "error", - "jest/prefer-jest-mocked": "error", - "jest/prefer-mock-promise-shorthand": "error", - "jest/prefer-spy-on": "error", - "jest/prefer-strict-equal": "error", - "jest/require-hook": "error", - "jest/require-to-throw-message": "error", - "jest/unbound-method": "error", + ...vitest.configs.recommended.rules, + "vitest/consistent-test-it": ["error", { withinDescribe: "test" }], + "vitest/no-alias-methods": "error", + "vitest/no-conditional-expect": "error", + "vitest/no-conditional-in-test": "error", + "vitest/no-conditional-tests": "error", + "vitest/no-disabled-tests": "error", + "vitest/no-duplicate-hooks": "error", + "vitest/no-focused-tests": "error", + "vitest/no-interpolation-in-snapshots": "error", + "vitest/no-large-snapshots": "error", + "vitest/no-mocks-import": "error", + "vitest/no-standalone-expect": "error", + "vitest/no-test-prefixes": "error", + "vitest/no-test-return-statement": "error", + "vitest/padding-around-all": "error", + "vitest/prefer-called-with": "error", + "vitest/prefer-comparison-matcher": "error", + "vitest/prefer-each": "error", + "vitest/prefer-equality-matcher": "error", + "vitest/prefer-expect-assertions": "error", + "vitest/prefer-expect-resolves": "error", + "vitest/prefer-hooks-in-order": "error", + "vitest/prefer-hooks-on-top": "error", + "vitest/prefer-mock-promise-shorthand": "error", + "vitest/prefer-snapshot-hint": "error", + "vitest/prefer-spy-on": "error", + "vitest/prefer-strict-equal": "error", + "vitest/prefer-to-be": "error", + "vitest/prefer-to-be-falsy": "error", + "vitest/prefer-to-be-object": "error", + "vitest/prefer-to-be-truthy": "error", + "vitest/prefer-to-contain": "error", + "vitest/prefer-to-have-length": "error", + "vitest/prefer-todo": "error", + "vitest/prefer-vi-mocked": "error", + "vitest/require-hook": "error", + "vitest/require-to-throw-message": "error", + "vitest/valid-expect-in-promise": "error", }, }, { diff --git a/packages/frontend/jest.config.js b/packages/frontend/jest.config.js deleted file mode 100644 index 7f84e983e..000000000 --- a/packages/frontend/jest.config.js +++ /dev/null @@ -1,24 +0,0 @@ -/** @type {import('jest').Config} */ -export default { - collectCoverage: true, - collectCoverageFrom: [ - "src/**/*.{ts,tsx}", - "!src/index.tsx", - "!src/config.ts", - "!src/globalStyles.ts", - ], - moduleNameMapper: { - "\\.svg$": "/__mocks__/fileMock.ts", - }, - resetMocks: true, - setupFilesAfterEnv: ["/__tests__/setupTests.ts"], - testEnvironment: "jsdom", - testMatch: ["/__tests__/**/*.test.{js,jsx,ts,tsx}"], - transform: { - "^.+\\.(j|t)sx?$": ["ts-jest", { tsconfig: "test.tsconfig.json" }], - }, - transformIgnorePatterns: [ - "node_modules/(?!react-markdown)/", - "node_modules/@testing-library/", - ], -}; diff --git a/packages/frontend/package-lock.json b/packages/frontend/package-lock.json index 919020f8a..669fe8725 100644 --- a/packages/frontend/package-lock.json +++ b/packages/frontend/package-lock.json @@ -20,42 +20,38 @@ "swr": "^2.3.0" }, "devDependencies": { - "@emotion/jest": "^11.13.0", "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1", "@eslint/js": "^9.17.0", - "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.14", "@types/react-dom": "^18.3.1", "@types/react-test-renderer": "^19.0.0", "@vitejs/plugin-legacy": "^5.4.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/coverage-v8": "^2.1.8", + "@vitest/eslint-plugin": "^1.1.24", "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-compat": "^6.0.2", - "eslint-plugin-jest": "^28.10.0", "eslint-plugin-perfectionist": "^4.6.0", "eslint-plugin-prefer-arrow-functions": "^3.4.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.3", "globals": "^15.14.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-mock": "^29.7.0", + "jsdom": "^26.0.0", "npm-run-all": "^4.1.5", "prettier": "^3.4.1", "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", "typescript": "^5.5.4", "typescript-eslint": "^8.19.1", - "vite": "^5.4.11" + "vite": "^5.4.11", + "vitest": "^2.1.8" } }, "node_modules/@adobe/css-tools": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", "dev": true, "license": "MIT" }, @@ -73,6 +69,30 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.2.tgz", + "integrity": "sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^11.0.2" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", @@ -634,13 +654,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -760,13 +780,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1786,6 +1806,121 @@ "dev": true, "license": "MIT" }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -1818,9 +1953,9 @@ } }, "node_modules/@emotion/css-prettifier": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/css-prettifier/-/css-prettifier-1.1.4.tgz", - "integrity": "sha512-lEjrAxtju83kkF2N7nPoFSPa00o+h1QujXM2F60kudDWuwBbuxJSG1dGKHVnr9tjxmLho2B0HGfmVThpR+scWw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/css-prettifier/-/css-prettifier-1.2.0.tgz", + "integrity": "sha512-p+9m/5fp61i90CGUT+516glGBXWoEHgSelybqR+5vlX6Kb+Z0rkOfEMFqTBwYMRxXZTitibZERl32n2yPma7Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -1963,514 +2098,140 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/linux-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz", + "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "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, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz", - "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^4.0.0", - "ignore": "^5.2.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "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/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { @@ -2998,15 +2759,62 @@ "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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": "*" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/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, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@jest/schemas": { @@ -3254,149 +3062,6 @@ "node": ">=14.0.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", @@ -3423,45 +3088,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3515,6 +3141,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -3731,6 +3358,7 @@ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -4150,6 +3778,173 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.8.tgz", + "integrity": "sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.8", + "vitest": "2.1.8" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.24.tgz", + "integrity": "sha512-7IaENe4NNy33g0iuuy5bHY69JYYRjpv4lMx6H5Wp30W7ez2baLHwxsXF5TM4wa8JDYZt8ut99Ytoj7GiDO01hw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/utils": ">= 8.0", + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -4192,9 +3987,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { @@ -4205,16 +4000,13 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -4434,10 +4226,20 @@ "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" } }, "node_modules/ast-metadata-inferer": { @@ -4517,6 +4319,28 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", @@ -4534,6 +4358,21 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/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, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -4770,6 +4609,16 @@ "dev": true, "license": "MIT" }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -4866,6 +4715,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4933,6 +4799,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -4950,9 +4826,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz", - "integrity": "sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true, "license": "MIT" }, @@ -5144,25 +5020,19 @@ "license": "MIT" }, "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "dev": true, "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -5170,18 +5040,17 @@ "license": "MIT" }, "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/data-view-buffer": { @@ -5236,12 +5105,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -5287,6 +5156,16 @@ } } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5621,6 +5500,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -5882,6 +5768,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz", "integrity": "sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, @@ -6124,6 +6011,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -6184,6 +6081,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6408,9 +6315,9 @@ } }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, "license": "MIT", "dependencies": { @@ -6429,21 +6336,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6568,22 +6460,21 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "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" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6602,6 +6493,72 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/glob/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "15.14.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", @@ -6816,16 +6773,16 @@ "license": "ISC" }, "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-encoding": "^2.0.0" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/html-escaper": { @@ -6846,32 +6803,31 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -6884,6 +6840,19 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7510,30 +7479,20 @@ } }, "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==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", @@ -7799,10 +7758,32 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jest-config/node_modules/pretty-format": { @@ -7971,6 +7952,231 @@ } } }, + "node_modules/jest-environment-jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -8326,6 +8532,28 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -8562,44 +8790,39 @@ } }, "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -8854,6 +9077,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8883,6 +9113,18 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -9911,9 +10153,9 @@ } }, "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { @@ -10197,9 +10439,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true, "license": "MIT" }, @@ -10474,13 +10716,13 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -10558,6 +10800,23 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -10830,11 +11089,17 @@ } }, "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -11278,9 +11543,9 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -11411,6 +11676,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11664,6 +11936,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -11814,6 +12093,20 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -12209,20 +12502,110 @@ } }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.71", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.71.tgz", + "integrity": "sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.71" + }, + "bin": { + "tldts": "bin/cli.js" } }, + "node_modules/tldts-core": { + "version": "6.1.71", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.71.tgz", + "integrity": "sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -12244,42 +12627,29 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "punycode": "^2.3.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/trim-lines": { @@ -12681,6 +13051,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", @@ -12860,17 +13240,106 @@ } } }, + "node_modules/vite-node": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.8", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/walker": { @@ -12894,53 +13363,40 @@ } }, "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^3.0.0", + "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/which": { @@ -13043,6 +13499,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -13134,13 +13607,13 @@ } }, "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/xmlchars": { diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 8bb1bca9c..d17757249 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -20,13 +20,14 @@ "clean": "rimraf dist/*", "prebuild": "npm run clean", "build": "vite build", - "lint:ts:eslint": "eslint --color \"src/**/*\" \"__mocks__/**/*\" \"__tests__/**/*\" \"*.config.{js,ts}\"", + "lint:ts:eslint": "eslint --color \"src/**/*\" \"__mocks__/**/*\" \"tests/**/*\" \"*.config.{js,ts}\"", "lint:ts:typecheck": "tsc --noEmit", "lint:ts": "run-p -c --aggregate-output lint:ts:*", "lint": "run-p -c --aggregate-output lint:*", "start": "vite", - "test": "jest", - "test-accept": "jest --updateSnapshot" + "test": "vitest", + "test-coverage": "vitest run --coverage", + "test-accept": "vitest run --update" }, "dependencies": { "@emotion/react": "^11.14.0", @@ -41,36 +42,32 @@ "swr": "^2.3.0" }, "devDependencies": { - "@emotion/jest": "^11.13.0", "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1", "@eslint/js": "^9.17.0", - "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.14", "@types/react-dom": "^18.3.1", "@types/react-test-renderer": "^19.0.0", "@vitejs/plugin-legacy": "^5.4.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/coverage-v8": "^2.1.8", + "@vitest/eslint-plugin": "^1.1.24", "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-compat": "^6.0.2", - "eslint-plugin-jest": "^28.10.0", "eslint-plugin-perfectionist": "^4.6.0", "eslint-plugin-prefer-arrow-functions": "^3.4.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.3", "globals": "^15.14.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-mock": "^29.7.0", + "jsdom": "^26.0.0", "npm-run-all": "^4.1.5", "prettier": "^3.4.1", "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", "typescript": "^5.5.4", "typescript-eslint": "^8.19.1", - "vite": "^5.4.11" + "vite": "^5.4.11", + "vitest": "^2.1.8" }, "browserslist": { "production": [ diff --git a/packages/frontend/__tests__/App.test.tsx b/packages/frontend/tests/App.test.tsx similarity index 73% rename from packages/frontend/__tests__/App.test.tsx rename to packages/frontend/tests/App.test.tsx index 1d828ad00..2c8fa8878 100644 --- a/packages/frontend/__tests__/App.test.tsx +++ b/packages/frontend/tests/App.test.tsx @@ -1,95 +1,111 @@ import { render } from "@testing-library/react"; -import { mocked } from "jest-mock"; import { MemoryRouter } from "react-router-dom"; import * as swr from "swr"; +import { beforeAll, describe, expect, test, vi } from "vitest"; import { App } from "../src/App"; import { testData } from "./testData"; -jest.mock("swr"); +vi.mock("swr"); describe("App", () => { beforeAll(() => { - window.scrollTo = jest.fn(); + // eslint-disable-next-line @typescript-eslint/no-empty-function -- Function mock + vi.spyOn(window, "scrollTo").mockImplementation(() => {}); }); test("should render correctly", () => { - mocked(swr).default.mockReturnValue({ + expect.assertions(1); + + vi.mocked(swr).default.mockReturnValue({ data: testData, error: undefined, isLoading: false, isValidating: false, - mutate: jest.fn(), + mutate: vi.fn(), }); const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render projects correctly", () => { - mocked(swr).default.mockReturnValue({ + expect.assertions(1); + + vi.mocked(swr).default.mockReturnValue({ data: testData, error: undefined, isLoading: false, isValidating: false, - mutate: jest.fn(), + mutate: vi.fn(), }); const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render project listing correctly", () => { - mocked(swr).default.mockReturnValue({ + expect.assertions(1); + + vi.mocked(swr).default.mockReturnValue({ data: testData, error: undefined, isLoading: false, isValidating: false, - mutate: jest.fn(), + mutate: vi.fn(), }); const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render issue listing correctly", () => { - mocked(swr).default.mockReturnValue({ + expect.assertions(1); + + vi.mocked(swr).default.mockReturnValue({ data: testData, error: undefined, isLoading: false, isValidating: false, - mutate: jest.fn(), + mutate: vi.fn(), }); const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should handle error gracefully", () => { - mocked(swr).default.mockReturnValue({ + expect.assertions(1); + + vi.mocked(swr).default.mockReturnValue({ data: undefined, error: true, isLoading: false, isValidating: false, - mutate: jest.fn(), + mutate: vi.fn(), }); const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/__snapshots__/App.test.tsx.snap b/packages/frontend/tests/__snapshots__/App.test.tsx.snap similarity index 75% rename from packages/frontend/__tests__/__snapshots__/App.test.tsx.snap rename to packages/frontend/tests/__snapshots__/App.test.tsx.snap index ae48d5427..3496adae8 100644 --- a/packages/frontend/__tests__/__snapshots__/App.test.tsx.snap +++ b/packages/frontend/tests/__snapshots__/App.test.tsx.snap @@ -1,164 +1,29 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`App should handle error gracefully 1`] = ` +exports[`App > should handle error gracefully 1`] = `
Nepodařilo se načíst data webu.
`; -exports[`App should render correctly 1`] = ` -.emotion-0 { - max-width: 1000px; - padding: 0 16px; - margin: 0 auto; -} - -.emotion-1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 60px; - margin: 0 auto; - padding: 16px 0; -} - -.emotion-2 { - max-height: 100%; -} - -.emotion-3 { - font-family: themix; - font-size: 20px; - margin: 0 0 0 24px; -} - -.emotion-4 { - list-style: none; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - margin-bottom: 24px; - padding: 0 16px; - border-bottom: 1px solid #294885; -} - -.emotion-5 { - display: block; - padding: 0.2em 0.8em; - margin-bottom: -1px; - border: 1px solid transparent; - border-radius: 5px 5px 0 0; -} - -.emotion-5.active { - border-top: 1px solid #294885; - border-right: 1px solid #294885; - border-left: 1px solid #294885; - background-color: #fff; -} - -.emotion-7 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-8 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-9 { - margin: 0 0 0.6em; -} - -.emotion-9 * { - font-size: 0.8rem; -} - -.emotion-10 { - margin: 0 0 16px; -} - -.emotion-10 img { - max-width: 100%; -} - -.emotion-11 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-12 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-13 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-14 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-110 { - background-color: #6317e833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - +exports[`App > should render correctly 1`] = `
logo

IT poptávky

@@ -168,17 +33,17 @@ exports[`App should render correctly 1`] = `
`; -exports[`App should render issue listing correctly 1`] = ` -.emotion-0 { - max-width: 1000px; - padding: 0 16px; - margin: 0 auto; -} - -.emotion-1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 60px; - margin: 0 auto; - padding: 16px 0; -} - -.emotion-2 { - max-height: 100%; -} - -.emotion-3 { - font-family: themix; - font-size: 20px; - margin: 0 0 0 24px; -} - -@media (min-width: 850px) { - .emotion-4 { - display: grid; - grid-template-columns: 1fr 300px; - -webkit-column-gap: 36px; - column-gap: 36px; - } -} - -.emotion-5 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/span 2; -} - -.emotion-6 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #999; - font-size: 0.8em; -} - -.emotion-6 svg { - margin-right: 0.2em; -} - -.emotion-7 { - color: #294885; - margin: 0 0 16px; - font-family: themix; - font-size: 2em; -} - -.emotion-8 { - color: #999; - font-weight: normal; -} - -.emotion-9 { - margin-top: -16px; -} - -.emotion-10 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.emotion-11 { - max-width: 750px; -} - -.emotion-12 { - margin: 0 0 16px; - font-size: 18px; - margin: 0; -} - -.emotion-12 img { - max-width: 100%; -} - -.emotion-14 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - -.emotion-15 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 600px; - grid-column: 1/1; -} - -.emotion-16 { - color: white; - background-color: #294885; - margin-left: -10px; - margin-right: -10px; - padding: 20px; - border-radius: 10px; -} - -.emotion-16 * { - color: white; -} - -.emotion-16 *::selection { - background-color: white; - color: #294885; -} - -.emotion-18 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-19 { - margin: 0 0 16px; -} - -.emotion-19 img { - max-width: 100%; -} - -.emotion-21 { - background-color: #894cc033; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-22 { - background-color: #6d52b833; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-23 { - background-color: #8b843b33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-24 { - background-color: #d293ff33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-25 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 500px; - grid-column: 2/2; -} - -@media (min-width: 850px) { - .emotion-25 { - border: none; - } -} - -.emotion-28 a { - display: block; - font-size: 0.9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.emotion-54 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 450px; - grid-column: 1/1; -} - -.emotion-56 { - margin: 12px 0 24px; -} - -.emotion-56 img { - max-width: 100%; -} - +exports[`App > should render issue listing correctly 1`] = `
logo

IT poptávky

@@ -1572,33 +1194,33 @@ exports[`App should render issue listing correctly 1`] = `
Poptávka:

Editing doesn't check path validity   # 3

When opening the editor which contains a gallery that is made from a folder that has been renamed or deleted, the editor breaks. It shows: @@ -1640,12 +1262,12 @@ exports[`App should render issue listing correctly 1`] = `

Zaujala tě poptávka?
Další poptávky projektu:
`; -exports[`App should render project listing correctly 1`] = ` -.emotion-0 { - max-width: 1000px; - padding: 0 16px; - margin: 0 auto; -} - -.emotion-1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 60px; - margin: 0 auto; - padding: 16px 0; -} - -.emotion-2 { - max-height: 100%; -} - -.emotion-3 { - font-family: themix; - font-size: 20px; - margin: 0 0 0 24px; -} - -@media (min-width: 850px) { - .emotion-4 { - display: grid; - grid-template-columns: 1fr 300px; - -webkit-column-gap: 36px; - column-gap: 36px; - } -} - -.emotion-5 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/span 2; -} - -.emotion-6 { - color: white; - background-color: #294885; - margin-left: -10px; - margin-right: -10px; - padding: 20px; - border-radius: 10px; -} - -.emotion-6 * { - color: white; -} - -.emotion-6 *::selection { - background-color: white; - color: #294885; -} - -.emotion-7 { - color: #294885; - margin: 0 0 16px; - font-family: themix; - font-size: 2em; - color: white; -} - -.emotion-8 { - max-width: 750px; -} - -.emotion-9 { - margin: 0 0 16px; - font-size: 18px; - margin: 0; -} - -.emotion-9 img { - max-width: 100%; -} - -.emotion-11 { - background-color: #894cc033; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-12 { - background-color: #6d52b833; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-13 { - background-color: #8b843b33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-14 { - background-color: #d293ff33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-15 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 500px; - grid-column: 2/2; -} - -.emotion-16 { - margin: 0 0 16px; -} - -.emotion-16 img { - max-width: 100%; -} - -.emotion-17 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #999; - font-size: 0.8em; -} - -.emotion-17 svg { - margin-right: 0.2em; -} - -.emotion-18 a { - display: block; - font-size: 0.9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.emotion-19 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.emotion-44 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/1; - grid-row: 2/2; -} - -.emotion-46 { - margin: 12px 0 24px; -} - -.emotion-46 img { - max-width: 100%; -} - -.emotion-47 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-48 { - color: #999; - font-weight: normal; -} - +exports[`App > should render project listing correctly 1`] = `
logo

IT poptávky

@@ -2663,51 +2079,51 @@ exports[`App should render project listing correctly 1`] = `

WordPress plugin: Galerie obrázků a videí z Google Disku

Plugin pro WordPress, který ze složek s fotkami na Google Disku dělá galerie na webu.

Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky.

wordpress php javascript google @@ -2715,13 +2131,13 @@ exports[`App should render project listing correctly 1`] = `
Poptávky u projektu:
`; -exports[`App should render projects correctly 1`] = ` -.emotion-0 { - max-width: 1000px; - padding: 0 16px; - margin: 0 auto; -} - -.emotion-1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 60px; - margin: 0 auto; - padding: 16px 0; -} - -.emotion-2 { - max-height: 100%; -} - -.emotion-3 { - font-family: themix; - font-size: 20px; - margin: 0 0 0 24px; -} - -.emotion-4 { - list-style: none; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - margin-bottom: 24px; - padding: 0 16px; - border-bottom: 1px solid #294885; -} - -.emotion-5 { - display: block; - padding: 0.2em 0.8em; - margin-bottom: -1px; - border: 1px solid transparent; - border-radius: 5px 5px 0 0; -} - -.emotion-5.active { - border-top: 1px solid #294885; - border-right: 1px solid #294885; - border-left: 1px solid #294885; - background-color: #fff; -} - -.emotion-7 { - margin: 0 0 16px; - padding-bottom: 24px; - border-bottom: 1px solid #29488510; - max-width: 600px; -} - -.emotion-8 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-9 { - margin: 0 0 0.6em; -} - -.emotion-9 * { - font-size: 0.8rem; -} - -.emotion-10 { - margin: 0 0 16px; -} - -.emotion-10 img { - max-width: 100%; -} - -.emotion-11 { - background-color: #894cc033; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-12 { - background-color: #6d52b833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-13 { - background-color: #8b843b33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-14 { - background-color: #d293ff33; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - -.emotion-22 { - background-color: #6317e833; - color: #444; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; -} - +exports[`App > should render projects correctly 1`] = `
logo

IT poptávky

@@ -3633,17 +2914,17 @@ exports[`App should render projects correctly 1`] = `

Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky.

wordpress php javascript google

Plugin zajišťuje propojení skautských webů se skautISem. Dá se přes plugin registrovat, přihlašovat. Dokáže u stránek nastavovat oprávnění podle roli a dalších nastavení ve skautISu. Skrývá obsah podle toho jaká pravidla na stránce jsou nastavená.

wordpress php javascript skautis diff --git a/packages/frontend/__tests__/components/AppNavigation.test.tsx b/packages/frontend/tests/components/AppNavigation.test.tsx similarity index 84% rename from packages/frontend/__tests__/components/AppNavigation.test.tsx rename to packages/frontend/tests/components/AppNavigation.test.tsx index 92d6fae6f..0a6a54db5 100644 --- a/packages/frontend/__tests__/components/AppNavigation.test.tsx +++ b/packages/frontend/tests/components/AppNavigation.test.tsx @@ -1,15 +1,19 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { AppNavigation } from "../../src/components/AppNavigation"; describe("AppNavigation component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/Button.test.tsx b/packages/frontend/tests/components/Button.test.tsx similarity index 87% rename from packages/frontend/__tests__/components/Button.test.tsx rename to packages/frontend/tests/components/Button.test.tsx index 0f8e55cab..243bf95c5 100644 --- a/packages/frontend/__tests__/components/Button.test.tsx +++ b/packages/frontend/tests/components/Button.test.tsx @@ -1,39 +1,52 @@ import { render } from "@testing-library/react"; +import { describe, expect, test } from "vitest"; import { Button } from "../../src/components/Button"; describe("Button component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with title", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with custom class", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with target self", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/ColoredTag.test.tsx b/packages/frontend/tests/components/ColoredTag.test.tsx similarity index 80% rename from packages/frontend/__tests__/components/ColoredTag.test.tsx rename to packages/frontend/tests/components/ColoredTag.test.tsx index ae43cf5be..d07862436 100644 --- a/packages/frontend/__tests__/components/ColoredTag.test.tsx +++ b/packages/frontend/tests/components/ColoredTag.test.tsx @@ -1,10 +1,14 @@ import { render } from "@testing-library/react"; +import { describe, expect, test } from "vitest"; import { ColoredTag } from "../../src/components/ColoredTag"; describe("ColoredTag component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render(Tag); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/ExtLink.test.tsx b/packages/frontend/tests/components/ExtLink.test.tsx similarity index 87% rename from packages/frontend/__tests__/components/ExtLink.test.tsx rename to packages/frontend/tests/components/ExtLink.test.tsx index b62145764..459436e10 100644 --- a/packages/frontend/__tests__/components/ExtLink.test.tsx +++ b/packages/frontend/tests/components/ExtLink.test.tsx @@ -1,39 +1,52 @@ import { render } from "@testing-library/react"; +import { describe, expect, test } from "vitest"; import { ExtLink } from "../../src/components/ExtLink"; describe("ExtLink component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( Link somewhere, ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with title", () => { + expect.assertions(1); + const { container } = render( Link somewhere , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with custom class", () => { + expect.assertions(1); + const { container } = render( Link somewhere , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly with target self", () => { + expect.assertions(1); + const { container } = render( Link somewhere , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/Issue.test.tsx b/packages/frontend/tests/components/Issue.test.tsx similarity index 91% rename from packages/frontend/__tests__/components/Issue.test.tsx rename to packages/frontend/tests/components/Issue.test.tsx index defdb599d..96c7565ad 100644 --- a/packages/frontend/__tests__/components/Issue.test.tsx +++ b/packages/frontend/tests/components/Issue.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { Issue } from "../../src/components/Issue"; import { getIssueWithProject } from "../../src/utils/getIssueWithProject"; @@ -17,21 +18,27 @@ const issueWithProject = getIssueWithProject( describe("Issue component", () => { test("should render correctly", () => { + expect.assertions(2); expect(issue).not.toBeNull(); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly without tags", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/IssuesList.test.tsx b/packages/frontend/tests/components/IssuesList.test.tsx similarity index 90% rename from packages/frontend/__tests__/components/IssuesList.test.tsx rename to packages/frontend/tests/components/IssuesList.test.tsx index 9056a1693..b4ed58f09 100644 --- a/packages/frontend/__tests__/components/IssuesList.test.tsx +++ b/packages/frontend/tests/components/IssuesList.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { IssuesList } from "../../src/components/IssuesList"; import { testData } from "../testData"; @@ -8,14 +9,20 @@ const project = testData.projects[0]; describe("IssuesList component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); + test("should render correctly without link", () => { + expect.assertions(1); + const { container } = render( { /> , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/Navigation.test.tsx b/packages/frontend/tests/components/Navigation.test.tsx similarity index 86% rename from packages/frontend/__tests__/components/Navigation.test.tsx rename to packages/frontend/tests/components/Navigation.test.tsx index 69a9efec3..3a153668a 100644 --- a/packages/frontend/__tests__/components/Navigation.test.tsx +++ b/packages/frontend/tests/components/Navigation.test.tsx @@ -1,10 +1,13 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { Navigation } from "../../src/components/Navigation"; describe("Navigation component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( { /> , ); + expect(container.firstChild).toMatchSnapshot(); }); - test("should render correctly wyth active item", () => { + + test("should render correctly with active item", () => { + expect.assertions(1); + const { container } = render( { /> , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/Project.test.tsx b/packages/frontend/tests/components/Project.test.tsx similarity index 86% rename from packages/frontend/__tests__/components/Project.test.tsx rename to packages/frontend/tests/components/Project.test.tsx index 7b7fbef83..b0cbf87b5 100644 --- a/packages/frontend/__tests__/components/Project.test.tsx +++ b/packages/frontend/tests/components/Project.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { Project } from "../../src/components/Project"; import { testData } from "../testData"; @@ -8,11 +9,14 @@ const project = testData.projects[0]; describe("Project component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/ProjectLinks.test.tsx b/packages/frontend/tests/components/ProjectLinks.test.tsx similarity index 87% rename from packages/frontend/__tests__/components/ProjectLinks.test.tsx rename to packages/frontend/tests/components/ProjectLinks.test.tsx index f540c7668..3e2e79994 100644 --- a/packages/frontend/__tests__/components/ProjectLinks.test.tsx +++ b/packages/frontend/tests/components/ProjectLinks.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { ProjectLinks } from "../../src/components/ProjectLinks"; import { testData } from "../testData"; @@ -8,11 +9,14 @@ const project = testData.projects[0]; describe("ProjectLinks component", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/components/ScrollToTop.test.tsx b/packages/frontend/tests/components/ScrollToTop.test.tsx similarity index 70% rename from packages/frontend/__tests__/components/ScrollToTop.test.tsx rename to packages/frontend/tests/components/ScrollToTop.test.tsx index c087589e6..dd5f12533 100644 --- a/packages/frontend/__tests__/components/ScrollToTop.test.tsx +++ b/packages/frontend/tests/components/ScrollToTop.test.tsx @@ -1,14 +1,16 @@ import { render } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { Link, MemoryRouter, Route, Routes } from "react-router-dom"; +import { describe, expect, test, vi } from "vitest"; import { ScrollToTop } from "../../src/components/ScrollToTop"; -global.scrollTo = jest.fn(); - describe("ScrollToTop", () => { test("calls window.scrollTo when route changes", async () => { expect.assertions(3); + + // eslint-disable-next-line @typescript-eslint/no-empty-function -- Function mock + const scrollSpy = vi.spyOn(window, "scrollTo").mockImplementation(() => {}); const user = userEvent.setup(); const { getByText } = render( @@ -26,9 +28,12 @@ describe("ScrollToTop", () => { , ); - expect(global.scrollTo).toHaveBeenCalledTimes(1); + + expect(scrollSpy).toHaveBeenCalledTimes(1); + await user.click(getByText("Linkage")); - expect(global.scrollTo).toHaveBeenCalledTimes(2); - expect(global.scrollTo).toHaveBeenLastCalledWith(0, 0); + + expect(scrollSpy).toHaveBeenCalledTimes(2); + expect(scrollSpy).toHaveBeenLastCalledWith(0, 0); }); }); diff --git a/packages/frontend/tests/components/__snapshots__/AppNavigation.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/AppNavigation.test.tsx.snap new file mode 100644 index 000000000..c3c2d4a76 --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/AppNavigation.test.tsx.snap @@ -0,0 +1,23 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AppNavigation component > should render correctly 1`] = ` +
+`; diff --git a/packages/frontend/tests/components/__snapshots__/Button.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/Button.test.tsx.snap new file mode 100644 index 000000000..7db9fcf6d --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/Button.test.tsx.snap @@ -0,0 +1,44 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Button component > should render correctly 1`] = ` + + Link somewhere + +`; + +exports[`Button component > should render correctly with custom class 1`] = ` + + Link somewhere + +`; + +exports[`Button component > should render correctly with target self 1`] = ` + + Link somewhere + +`; + +exports[`Button component > should render correctly with title 1`] = ` + + Link somewhere + +`; diff --git a/packages/frontend/tests/components/__snapshots__/ColoredTag.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/ColoredTag.test.tsx.snap new file mode 100644 index 000000000..0032d648c --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/ColoredTag.test.tsx.snap @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ColoredTag component > should render correctly 1`] = ` + + Tag + +`; diff --git a/packages/frontend/tests/components/__snapshots__/ExtLink.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/ExtLink.test.tsx.snap new file mode 100644 index 000000000..5c1d8cf16 --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/ExtLink.test.tsx.snap @@ -0,0 +1,44 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ExtLink component > should render correctly 1`] = ` + + Link somewhere + +`; + +exports[`ExtLink component > should render correctly with custom class 1`] = ` + + Link somewhere + +`; + +exports[`ExtLink component > should render correctly with target self 1`] = ` + + Link somewhere + +`; + +exports[`ExtLink component > should render correctly with title 1`] = ` + + Link somewhere + +`; diff --git a/packages/frontend/tests/components/__snapshots__/Issue.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/Issue.test.tsx.snap new file mode 100644 index 000000000..801bd822e --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/Issue.test.tsx.snap @@ -0,0 +1,97 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Issue component > should render correctly 1`] = ` + +`; + +exports[`Issue component > should render correctly without tags 1`] = ` + +`; diff --git a/packages/frontend/__tests__/components/__snapshots__/IssuesList.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/IssuesList.test.tsx.snap similarity index 52% rename from packages/frontend/__tests__/components/__snapshots__/IssuesList.test.tsx.snap rename to packages/frontend/tests/components/__snapshots__/IssuesList.test.tsx.snap index 145eb0fe2..6c07bf627 100644 --- a/packages/frontend/__tests__/components/__snapshots__/IssuesList.test.tsx.snap +++ b/packages/frontend/tests/components/__snapshots__/IssuesList.test.tsx.snap @@ -1,30 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`IssuesList component should render correctly 1`] = ` -.emotion-0 { - margin: 12px 0 24px; -} - -.emotion-0 img { - max-width: 100%; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - color: #999; - font-weight: normal; -} +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`IssuesList component > should render correctly 1`] = ` `; -exports[`IssuesList component should render correctly without link 1`] = ` -.emotion-0 { - margin: 12px 0 24px; -} - -.emotion-0 img { - max-width: 100%; -} - -.emotion-1 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-2 { - color: #999; - font-weight: normal; -} - +exports[`IssuesList component > should render correctly without link 1`] = `

  # 1 diff --git a/packages/frontend/tests/components/__snapshots__/Navigation.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/Navigation.test.tsx.snap new file mode 100644 index 000000000..87af42f03 --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/Navigation.test.tsx.snap @@ -0,0 +1,45 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Navigation component > should render correctly 1`] = ` + +`; + +exports[`Navigation component > should render correctly with active item 1`] = ` + +`; diff --git a/packages/frontend/tests/components/__snapshots__/Project.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/Project.test.tsx.snap new file mode 100644 index 000000000..6789ffe2d --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/Project.test.tsx.snap @@ -0,0 +1,47 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Project component > should render correctly 1`] = ` +
+

+ + WordPress plugin: Galerie obrázků a videí z Google Disku + +

+

+

+

+ Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky. +

+
+ + wordpress + + + php + + + javascript + + + google + +
+`; diff --git a/packages/frontend/tests/components/__snapshots__/ProjectLinks.test.tsx.snap b/packages/frontend/tests/components/__snapshots__/ProjectLinks.test.tsx.snap new file mode 100644 index 000000000..8b91add2a --- /dev/null +++ b/packages/frontend/tests/components/__snapshots__/ProjectLinks.test.tsx.snap @@ -0,0 +1,39 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ProjectLinks component > should render correctly 1`] = ` +
+ + + + +   + Správce: + + + + Marek Dědič – Mlha + + +
+`; diff --git a/packages/frontend/__tests__/pages/IssueDetail.test.tsx b/packages/frontend/tests/pages/IssueDetail.test.tsx similarity index 92% rename from packages/frontend/__tests__/pages/IssueDetail.test.tsx rename to packages/frontend/tests/pages/IssueDetail.test.tsx index f1aab5c14..c5ecd82f9 100644 --- a/packages/frontend/__tests__/pages/IssueDetail.test.tsx +++ b/packages/frontend/tests/pages/IssueDetail.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter, Route, Routes } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { IssueDetail } from "../../src/pages/IssueDetail"; import { testData } from "../testData"; @@ -9,6 +10,8 @@ const issue = project.issues[0]; describe("IssueDetail page", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( { , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly if there is no related issue", () => { + expect.assertions(1); + const { container } = render( @@ -37,6 +43,7 @@ describe("IssueDetail page", () => { , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/pages/IssuesList.test.tsx b/packages/frontend/tests/pages/IssuesList.test.tsx similarity index 85% rename from packages/frontend/__tests__/pages/IssuesList.test.tsx rename to packages/frontend/tests/pages/IssuesList.test.tsx index a0be23f67..3c14449e6 100644 --- a/packages/frontend/__tests__/pages/IssuesList.test.tsx +++ b/packages/frontend/tests/pages/IssuesList.test.tsx @@ -1,16 +1,20 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { IssuesList } from "../../src/pages/IssuesList"; import { testData } from "../testData"; describe("IssuesList page", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/pages/ProjectDetail.test.tsx b/packages/frontend/tests/pages/ProjectDetail.test.tsx similarity index 91% rename from packages/frontend/__tests__/pages/ProjectDetail.test.tsx rename to packages/frontend/tests/pages/ProjectDetail.test.tsx index 54586c43a..c9fdc19e9 100644 --- a/packages/frontend/__tests__/pages/ProjectDetail.test.tsx +++ b/packages/frontend/tests/pages/ProjectDetail.test.tsx @@ -1,5 +1,6 @@ import { render } from "@testing-library/react"; import { MemoryRouter, Route, Routes } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { ProjectDetail } from "../../src/pages/ProjectDetail"; import { testData } from "../testData"; @@ -8,6 +9,8 @@ const project = testData.projects[0]; describe("ProjectDetail page", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( @@ -18,10 +21,13 @@ describe("ProjectDetail page", () => { , ); + expect(container.firstChild).toMatchSnapshot(); }); test("should render correctly if there is no related issue", () => { + expect.assertions(1); + const { container } = render( @@ -32,6 +38,7 @@ describe("ProjectDetail page", () => { , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/pages/ProjectsList.test.tsx b/packages/frontend/tests/pages/ProjectsList.test.tsx similarity index 85% rename from packages/frontend/__tests__/pages/ProjectsList.test.tsx rename to packages/frontend/tests/pages/ProjectsList.test.tsx index cd48d9b91..0f19d42d1 100644 --- a/packages/frontend/__tests__/pages/ProjectsList.test.tsx +++ b/packages/frontend/tests/pages/ProjectsList.test.tsx @@ -1,16 +1,20 @@ import { render } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { describe, expect, test } from "vitest"; import { ProjectsList } from "../../src/pages/ProjectsList"; import { testData } from "../testData"; describe("ProjectsList page", () => { test("should render correctly", () => { + expect.assertions(1); + const { container } = render( , ); + expect(container.firstChild).toMatchSnapshot(); }); }); diff --git a/packages/frontend/__tests__/pages/__snapshots__/IssueDetail.test.tsx.snap b/packages/frontend/tests/pages/__snapshots__/IssueDetail.test.tsx.snap similarity index 76% rename from packages/frontend/__tests__/pages/__snapshots__/IssueDetail.test.tsx.snap rename to packages/frontend/tests/pages/__snapshots__/IssueDetail.test.tsx.snap index 508234a12..95aa70a0c 100644 --- a/packages/frontend/__tests__/pages/__snapshots__/IssueDetail.test.tsx.snap +++ b/packages/frontend/tests/pages/__snapshots__/IssueDetail.test.tsx.snap @@ -1,247 +1,34 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`IssueDetail page should render correctly 1`] = ` -@media (min-width: 850px) { - .emotion-0 { - display: grid; - grid-template-columns: 1fr 300px; - -webkit-column-gap: 36px; - column-gap: 36px; - } -} - -.emotion-1 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/span 2; -} - -.emotion-2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #999; - font-size: 0.8em; -} - -.emotion-2 svg { - margin-right: 0.2em; -} - -.emotion-3 { - color: #294885; - margin: 0 0 16px; - font-family: themix; - font-size: 2em; -} - -.emotion-4 { - color: #999; - font-weight: normal; -} - -.emotion-5 { - margin-top: -16px; -} - -.emotion-6 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.emotion-7 { - max-width: 750px; -} - -.emotion-8 { - margin: 0 0 16px; - font-size: 18px; - margin: 0; -} - -.emotion-8 img { - max-width: 100%; -} - -.emotion-10 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: inline-block; - font-size: 1.2rem; - background-color: #294885; - color: white; - margin-top: 0.2rem; - padding: 0.6rem 1.2rem; - border-radius: 10px; - box-shadow: 0 0 0 #999; - -webkit-transition: box-shadow 300ms; - transition: box-shadow 300ms; -} - -.emotion-11 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 600px; - grid-column: 1/1; -} - -.emotion-12 { - color: white; - background-color: #294885; - margin-left: -10px; - margin-right: -10px; - padding: 20px; - border-radius: 10px; -} - -.emotion-12 * { - color: white; -} - -.emotion-12 *::selection { - background-color: white; - color: #294885; -} - -.emotion-14 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-15 { - margin: 0 0 16px; -} - -.emotion-15 img { - max-width: 100%; -} - -.emotion-17 { - background-color: #894cc033; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-18 { - background-color: #6d52b833; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-19 { - background-color: #8b843b33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-20 { - background-color: #d293ff33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-21 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 500px; - grid-column: 2/2; -} - -@media (min-width: 850px) { - .emotion-21 { - border: none; - } -} - -.emotion-24 a { - display: block; - font-size: 0.9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.emotion-50 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 450px; - grid-column: 1/1; -} - -.emotion-52 { - margin: 12px 0 24px; -} - -.emotion-52 img { - max-width: 100%; -} +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`IssueDetail page > should render correctly 1`] = `
Poptávka:

Add hint to set videos to public   # 1

When editing and selecting a folder with videos, the editor could display a notice that setting videos to "Anyone can view" will speed them up. @@ -279,12 +66,12 @@ exports[`IssueDetail page should render correctly 1`] = `

Zaujala tě poptávka?
Další poptávky projektu:
`; -exports[`IssueDetail page should render correctly if there is no related issue 1`] = ` +exports[`IssueDetail page > should render correctly if there is no related issue 1`] = `

Poptávka skaut diff --git a/packages/frontend/tests/pages/__snapshots__/IssuesList.test.tsx.snap b/packages/frontend/tests/pages/__snapshots__/IssuesList.test.tsx.snap new file mode 100644 index 000000000..b9984d3e9 --- /dev/null +++ b/packages/frontend/tests/pages/__snapshots__/IssuesList.test.tsx.snap @@ -0,0 +1,59 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`IssuesList page > should render correctly 1`] = ` + +`; diff --git a/packages/frontend/__tests__/pages/__snapshots__/ProjectDetail.test.tsx.snap b/packages/frontend/tests/pages/__snapshots__/ProjectDetail.test.tsx.snap similarity index 78% rename from packages/frontend/__tests__/pages/__snapshots__/ProjectDetail.test.tsx.snap rename to packages/frontend/tests/pages/__snapshots__/ProjectDetail.test.tsx.snap index 9190332b2..c401ebc76 100644 --- a/packages/frontend/__tests__/pages/__snapshots__/ProjectDetail.test.tsx.snap +++ b/packages/frontend/tests/pages/__snapshots__/ProjectDetail.test.tsx.snap @@ -1,228 +1,52 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ProjectDetail page should render correctly 1`] = ` -@media (min-width: 850px) { - .emotion-0 { - display: grid; - grid-template-columns: 1fr 300px; - -webkit-column-gap: 36px; - column-gap: 36px; - } -} - -.emotion-1 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/span 2; -} - -.emotion-2 { - color: white; - background-color: #294885; - margin-left: -10px; - margin-right: -10px; - padding: 20px; - border-radius: 10px; -} - -.emotion-2 * { - color: white; -} - -.emotion-2 *::selection { - background-color: white; - color: #294885; -} - -.emotion-3 { - color: #294885; - margin: 0 0 16px; - font-family: themix; - font-size: 2em; - color: white; -} - -.emotion-4 { - max-width: 750px; -} - -.emotion-5 { - margin: 0 0 16px; - font-size: 18px; - margin: 0; -} - -.emotion-5 img { - max-width: 100%; -} - -.emotion-7 { - background-color: #894cc033; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-8 { - background-color: #6d52b833; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-9 { - background-color: #8b843b33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-10 { - background-color: #d293ff33; - color: white; - font-family: themix; - font-size: 0.8rem; - margin-right: 8px; - padding: 0.2rem 0.4rem; - border-radius: 4px; - border: 1px solid #ffffff55; -} - -.emotion-11 { - margin: 0 0 16px; - padding-bottom: 24px; - max-width: 500px; - grid-column: 2/2; -} - -.emotion-12 { - margin: 0 0 16px; -} - -.emotion-12 img { - max-width: 100%; -} - -.emotion-13 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #999; - font-size: 0.8em; -} - -.emotion-13 svg { - margin-right: 0.2em; -} - -.emotion-14 a { - display: block; - font-size: 0.9em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.emotion-15 { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.emotion-40 { - margin: 0 0 16px; - padding-bottom: 24px; - grid-column: 1/1; - grid-row: 2/2; -} - -.emotion-42 { - margin: 12px 0 24px; -} - -.emotion-42 img { - max-width: 100%; -} - -.emotion-43 { - color: #294885; - margin: 0 0 12px; - font-family: themix; -} - -.emotion-44 { - color: #999; - font-weight: normal; -} +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`ProjectDetail page > should render correctly 1`] = `

WordPress plugin: Galerie obrázků a videí z Google Disku

Plugin pro WordPress, který ze složek s fotkami na Google Disku dělá galerie na webu.

Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky.

wordpress php javascript google @@ -230,13 +54,13 @@ exports[`ProjectDetail page should render correctly 1`] = `
Poptávky u projektu:
`; -exports[`ProjectDetail page should render correctly if there is no related issue 1`] = ` +exports[`ProjectDetail page > should render correctly if there is no related issue 1`] = `

Projekt owner diff --git a/packages/frontend/tests/pages/__snapshots__/ProjectsList.test.tsx.snap b/packages/frontend/tests/pages/__snapshots__/ProjectsList.test.tsx.snap new file mode 100644 index 000000000..579115b1f --- /dev/null +++ b/packages/frontend/tests/pages/__snapshots__/ProjectsList.test.tsx.snap @@ -0,0 +1,47 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ProjectsList page > should render correctly 1`] = ` +
+

+ + WordPress plugin: Galerie obrázků a videí z Google Disku + +

+

+

+

+ Galerie obrázků a videí z Google Disku je plugin pro WordPress, který propojí web s Google Diskem. V pluginu se dá vybrat libovolná složku na Google Disku nebo ve Sdíleném disku a plugin z ní vytvoří galerii s obrázky a videi na libovolné stránce či příspěvku na webu. Ze všech složek a podsložek jsou navíc vytvořeny vnořené “podgalerie”. Plugin vzniknul primárně pro potřeby Junáka, oddílů a středisek, ale vyvíjíme ho tzv. Open-Source (otevřeně pro veřejnost) a nabízíme ho v oficiální databázi pluginů pro WordPress. V tuto chvíli (léto 2021) podle statistik WordPressu plugin běží na víc jak 4 000 webových stránek a z kontaktů s uživateli víme, že ho využívají jak oddíly a střediska v Junáku, tak i "náhodná veřejnost" - zvlášť oblíbený se zdá být u skautů z celého světa a profesionálních fotografů, prezentujících svoje fotky. +

+
+ + wordpress + + + php + + + javascript + + + google + +
+`; diff --git a/packages/frontend/__tests__/testData.ts b/packages/frontend/tests/testData.ts similarity index 100% rename from packages/frontend/__tests__/testData.ts rename to packages/frontend/tests/testData.ts diff --git a/packages/frontend/__tests__/utils/__snapshots__/getAllIssues.test.ts.snap b/packages/frontend/tests/utils/__snapshots__/getAllIssues.test.ts.snap similarity index 99% rename from packages/frontend/__tests__/utils/__snapshots__/getAllIssues.test.ts.snap rename to packages/frontend/tests/utils/__snapshots__/getAllIssues.test.ts.snap index 49316bd82..ad0e560e5 100644 --- a/packages/frontend/__tests__/utils/__snapshots__/getAllIssues.test.ts.snap +++ b/packages/frontend/tests/utils/__snapshots__/getAllIssues.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`should all issues except one 1`] = ` [ diff --git a/packages/frontend/__tests__/utils/__snapshots__/getIssueWithProject.test.ts.snap b/packages/frontend/tests/utils/__snapshots__/getIssueWithProject.test.ts.snap similarity index 97% rename from packages/frontend/__tests__/utils/__snapshots__/getIssueWithProject.test.ts.snap rename to packages/frontend/tests/utils/__snapshots__/getIssueWithProject.test.ts.snap index 128f79e93..fc643b7d5 100644 --- a/packages/frontend/__tests__/utils/__snapshots__/getIssueWithProject.test.ts.snap +++ b/packages/frontend/tests/utils/__snapshots__/getIssueWithProject.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`should get issue with project 1`] = ` { diff --git a/packages/frontend/__tests__/utils/__snapshots__/getProject.test.ts.snap b/packages/frontend/tests/utils/__snapshots__/getProject.test.ts.snap similarity index 99% rename from packages/frontend/__tests__/utils/__snapshots__/getProject.test.ts.snap rename to packages/frontend/tests/utils/__snapshots__/getProject.test.ts.snap index 59b885d4b..ce85c352d 100644 --- a/packages/frontend/__tests__/utils/__snapshots__/getProject.test.ts.snap +++ b/packages/frontend/tests/utils/__snapshots__/getProject.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`should get project 1`] = ` { diff --git a/packages/frontend/__tests__/utils/getAllIssues.test.ts b/packages/frontend/tests/utils/getAllIssues.test.ts similarity index 82% rename from packages/frontend/__tests__/utils/getAllIssues.test.ts rename to packages/frontend/tests/utils/getAllIssues.test.ts index b034ac0c4..24d3f0eb0 100644 --- a/packages/frontend/__tests__/utils/getAllIssues.test.ts +++ b/packages/frontend/tests/utils/getAllIssues.test.ts @@ -1,13 +1,19 @@ +import { expect, test } from "vitest"; + import { getIssuesWithProjectInfo } from "../../src/utils/getAllIssues"; import { testData } from "../testData"; test("should get all issues", () => { + expect.assertions(1); + const result = getIssuesWithProjectInfo(testData); expect(result).toMatchSnapshot(); }); test("should all issues except one", () => { + expect.assertions(1); + const result = getIssuesWithProjectInfo(testData, { omitIssueNumber: 5 }); expect(result).toMatchSnapshot(); diff --git a/packages/frontend/__tests__/utils/getIssueLink.test.ts b/packages/frontend/tests/utils/getIssueLink.test.ts similarity index 84% rename from packages/frontend/__tests__/utils/getIssueLink.test.ts rename to packages/frontend/tests/utils/getIssueLink.test.ts index 580ff03a0..1e6ebb09e 100644 --- a/packages/frontend/__tests__/utils/getIssueLink.test.ts +++ b/packages/frontend/tests/utils/getIssueLink.test.ts @@ -1,7 +1,11 @@ +import { expect, test } from "vitest"; + import { getIssueLink } from "../../src/utils/getIssueLink"; import { testData } from "../testData"; test("should get issue link", () => { + expect.assertions(1); + const project = testData.projects[0]; const result = getIssueLink({ project: { ...project, ...project.info }, diff --git a/packages/frontend/__tests__/utils/getIssueWithProject.test.ts b/packages/frontend/tests/utils/getIssueWithProject.test.ts similarity index 88% rename from packages/frontend/__tests__/utils/getIssueWithProject.test.ts rename to packages/frontend/tests/utils/getIssueWithProject.test.ts index f525669d2..37452b48c 100644 --- a/packages/frontend/__tests__/utils/getIssueWithProject.test.ts +++ b/packages/frontend/tests/utils/getIssueWithProject.test.ts @@ -1,9 +1,13 @@ +import { expect, test } from "vitest"; + import { getIssueWithProject } from "../../src/utils/getIssueWithProject"; import { testData } from "../testData"; const project = testData.projects[0]; test("should get issue with project", () => { + expect.assertions(1); + const result = getIssueWithProject( testData, project.owner, @@ -15,6 +19,8 @@ test("should get issue with project", () => { }); test("should not get issue with project if there is no existing owner", () => { + expect.assertions(1); + const result = getIssueWithProject( testData, "", @@ -26,6 +32,8 @@ test("should not get issue with project if there is no existing owner", () => { }); test("should not get issue with project if there is no existing repo", () => { + expect.assertions(1); + const result = getIssueWithProject( testData, project.owner, @@ -37,6 +45,8 @@ test("should not get issue with project if there is no existing repo", () => { }); test("should not get issue with project if there is no existing issue number", () => { + expect.assertions(1); + const result = getIssueWithProject(testData, project.owner, project.repo, 99); expect(result).toBeUndefined(); diff --git a/packages/frontend/__tests__/utils/getProject.test.ts b/packages/frontend/tests/utils/getProject.test.ts similarity index 84% rename from packages/frontend/__tests__/utils/getProject.test.ts rename to packages/frontend/tests/utils/getProject.test.ts index 2794e9e83..6c4c667c6 100644 --- a/packages/frontend/__tests__/utils/getProject.test.ts +++ b/packages/frontend/tests/utils/getProject.test.ts @@ -1,21 +1,29 @@ +import { expect, test } from "vitest"; + import { getProject } from "../../src/utils/getProject"; import { testData } from "../testData"; const project = testData.projects[0]; test("should get project", () => { + expect.assertions(1); + const result = getProject(testData, project.owner, project.repo); expect(result).toMatchSnapshot(); }); test("should not get project if there is no existing owner", () => { + expect.assertions(1); + const result = getProject(testData, "", project.repo); expect(result).toBeUndefined(); }); test("should not get project if there is no existing repo", () => { + expect.assertions(1); + const result = getProject(testData, project.owner, ""); expect(result).toBeUndefined(); diff --git a/packages/frontend/__tests__/utils/getProjectLink.test.ts b/packages/frontend/tests/utils/getProjectLink.test.ts similarity index 81% rename from packages/frontend/__tests__/utils/getProjectLink.test.ts rename to packages/frontend/tests/utils/getProjectLink.test.ts index 512523767..000a5770a 100644 --- a/packages/frontend/__tests__/utils/getProjectLink.test.ts +++ b/packages/frontend/tests/utils/getProjectLink.test.ts @@ -1,9 +1,13 @@ +import { expect, test } from "vitest"; + import { getProjectLink } from "../../src/utils/getProjectLink"; import { testData } from "../testData"; const project = testData.projects[0]; test("should get project link", () => { + expect.assertions(1); + const result = getProjectLink(project); expect(result).toBe("/skaut/skaut-google-drive-gallery"); diff --git a/packages/frontend/vite.config.js b/packages/frontend/vite.config.js index dd5a891eb..81dd56a9b 100644 --- a/packages/frontend/vite.config.js +++ b/packages/frontend/vite.config.js @@ -8,4 +8,8 @@ export default defineConfig({ }, plugins: [legacy(), react()], root: "src", + test: { + environment: "jsdom", + root: ".", + }, });