From 370509bac9bbcfecea39e91d3971d938595c063b Mon Sep 17 00:00:00 2001 From: Freya Gustavsson Date: Thu, 3 Oct 2024 01:43:14 +0200 Subject: [PATCH] chore: add Vitest --- Makefile | 3 + frontend/package.json | 8 +- frontend/src/components/forgeUrls.test.tsx | 23 + frontend/src/components/forgeUrls.tsx | 22 +- .../statusLabels/BaseStatusLabel.test.tsx | 19 + .../BaseStatusLabel.test.tsx.snap | 47 ++ frontend/src/routeTree.gen.ts | 366 ++++++++- frontend/vite.config.ts | 12 +- pnpm-lock.yaml | 727 ++++++++++++++++++ frontend/tsconfig.json => tsconfig.json | 6 +- 10 files changed, 1167 insertions(+), 66 deletions(-) create mode 100644 frontend/src/components/forgeUrls.test.tsx create mode 100644 frontend/src/components/statusLabels/BaseStatusLabel.test.tsx create mode 100644 frontend/src/components/statusLabels/__snapshots__/BaseStatusLabel.test.tsx.snap rename frontend/tsconfig.json => tsconfig.json (85%) diff --git a/Makefile b/Makefile index 5d4653e..36707bc 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,9 @@ check: test_image: files/ansible/install-deps.yaml files/ansible/recipe-tests.yaml $(CONTAINER_ENGINE) build --rm -t $(TEST_IMAGE) -f Dockerfile.tests . +test_frontend: + cd frontend && pnpm run test + check_in_container: test_image $(CONTAINER_ENGINE) run --rm \ --security-opt label=disable \ diff --git a/frontend/package.json b/frontend/package.json index fd96b3b..dbda569 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,10 +20,12 @@ "@tanstack/react-router": "^1.58.15", "@tanstack/router-devtools": "^1.58.15", "@tanstack/router-plugin": "^1.58.12", + "@testing-library/react": "^16.0.1", "@types/node": "^22.7.4", "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.2", + "happy-dom": "^15.7.4", "react": "^18.3.1", "react-dom": "^18.3.1", "sharp": "^0.33.5", @@ -40,7 +42,8 @@ "start": "vite", "build": "vite build", "build:analyze": "vite-bundle-visualizer --open", - "preview": "vite preview" + "preview": "vite preview", + "test": "vitest" }, "browserslist": { "production": [ @@ -57,7 +60,8 @@ "devDependencies": { "@biomejs/biome": "1.8.3", "babel-plugin-named-exports-order": "^0.0.2", - "prop-types": "^15.8.1" + "prop-types": "^15.8.1", + "vitest": "^2.1.2" }, "engines": { "node": ">=20", diff --git a/frontend/src/components/forgeUrls.test.tsx b/frontend/src/components/forgeUrls.test.tsx new file mode 100644 index 0000000..1d56662 --- /dev/null +++ b/frontend/src/components/forgeUrls.test.tsx @@ -0,0 +1,23 @@ +// Copyright Contributors to the Packit project. +// SPDX-License-Identifier: MIT +import { assertType, test, vi } from "vitest"; +import { getHostName } from "./forgeUrls"; + +test("can get hostname from string", ({ expect }) => { + expect(getHostName("https://example.com?foo=bar")).toBe("example.com"); +}); + +test("can get hostname from URL instance", ({ expect }) => { + const host = new URL("https://example.com"); + expect(getHostName(host)).toBe("example.com"); +}); + +test("hostname logs error for invalid URL", ({ expect }) => { + const consoleMock = vi + .spyOn(console, "error") + .mockImplementation(() => undefined); + expect(getHostName("invalid url")).toBe(""); + + expect(consoleMock.mock.lastCall?.[0].toString()).toContain("Invalid URL"); + expect(consoleMock.mock.lastCall?.[0]).toBeInstanceOf(TypeError); +}); diff --git a/frontend/src/components/forgeUrls.tsx b/frontend/src/components/forgeUrls.tsx index 332bb07..d97d5b5 100644 --- a/frontend/src/components/forgeUrls.tsx +++ b/frontend/src/components/forgeUrls.tsx @@ -2,19 +2,18 @@ // SPDX-License-Identifier: MIT // getHostName - returns the hostname if possible, otherwise an empty string -function getHostName(url: string | URL) { +export function getHostName(url: string | URL) { let hostname = ""; try { hostname = new URL(url).hostname; } catch (error) { - console.log("Invalid URL"); console.error(error); } return hostname; } // getPRLink - returns the PR link if possible otherwise an empty string -function getPRLink(gitRepo: string, prID: number) { +export function getPRLink(gitRepo: string, prID: number) { const forge = getHostName(gitRepo); switch (forge) { case "github.com": @@ -28,7 +27,7 @@ function getPRLink(gitRepo: string, prID: number) { } // getBranchLink - returns the branch link if possible otherwise an empty string -function getBranchLink(gitRepo: string, branchName: string) { +export function getBranchLink(gitRepo: string, branchName: string) { const forge = getHostName(gitRepo); switch (forge) { case "github.com": @@ -42,7 +41,7 @@ function getBranchLink(gitRepo: string, branchName: string) { } // getIssueLink - returns the issue link if possible otherwise an empty string -function getIssueLink(gitRepo: string, issueID: number) { +export function getIssueLink(gitRepo: string, issueID: number) { const forge = getHostName(gitRepo); switch (forge) { case "github.com": @@ -56,7 +55,7 @@ function getIssueLink(gitRepo: string, issueID: number) { } // getReleaseLink - returns the link to release if possible otherwise an empty string -function getReleaseLink(gitRepo: string, release: string) { +export function getReleaseLink(gitRepo: string, release: string) { const forge = getHostName(gitRepo); switch (forge) { case "github.com": @@ -69,7 +68,7 @@ function getReleaseLink(gitRepo: string, release: string) { } // getCommitLink - returns a link to the commit -function getCommitLink(gitRepo: string, commit_hash: string) { +export function getCommitLink(gitRepo: string, commit_hash: string) { const forge = getHostName(gitRepo); switch (forge) { case "github.com": @@ -81,12 +80,3 @@ function getCommitLink(gitRepo: string, commit_hash: string) { return `${gitRepo}/-/commit/${commit_hash}`; } } - -export { - getHostName, - getPRLink, - getBranchLink, - getIssueLink, - getReleaseLink, - getCommitLink, -}; diff --git a/frontend/src/components/statusLabels/BaseStatusLabel.test.tsx b/frontend/src/components/statusLabels/BaseStatusLabel.test.tsx new file mode 100644 index 0000000..3df3333 --- /dev/null +++ b/frontend/src/components/statusLabels/BaseStatusLabel.test.tsx @@ -0,0 +1,19 @@ +// Copyright Contributors to the Packit project. +// SPDX-License-Identifier: MIT + +import { IceCreamIcon } from "@patternfly/react-icons"; +import { render } from "@testing-library/react"; +import { test } from "vitest"; +import { BaseStatusLabel } from "./BaseStatusLabel"; + +test("default label", async ({ expect }) => { + const { baseElement } = render( + } + label="Label fsdf" + />, + ); + expect(baseElement).toMatchSnapshot("default label"); +}); diff --git a/frontend/src/components/statusLabels/__snapshots__/BaseStatusLabel.test.tsx.snap b/frontend/src/components/statusLabels/__snapshots__/BaseStatusLabel.test.tsx.snap new file mode 100644 index 0000000..73818b0 --- /dev/null +++ b/frontend/src/components/statusLabels/__snapshots__/BaseStatusLabel.test.tsx.snap @@ -0,0 +1,47 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`default label > default label 1`] = ` + +
+
+ + + + + + + Label fsdf + + tooltipText + + + + +
+
+ +`; diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index a3e64cf..4a7eb7c 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -1,3 +1,7 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + // @ts-nocheck // noinspection JSUnusedGlobalSymbols @@ -506,45 +510,329 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - JobsRoute: JobsRoute.addChildren({ - JobsBodhiRoute, - JobsBodhiUpdatesRoute, - JobsCoprRoute, - JobsCoprBuildsRoute, - JobsDownstreamKojiBuildsRoute, - JobsKojiRoute, - JobsKojiBuildsRoute, - JobsKojiDownstreamRoute, - JobsProposeDownstreamRoute, - JobsProposeDownstreamsRoute, - JobsPullFromUpstreamRoute, - JobsPullFromUpstreamsRoute, - JobsSrpmRoute, - JobsSrpmBuildsRoute, - JobsTestingFarmRoute, - JobsTestingFarmRunsRoute, - JobsIndexRoute, - }), - PipelineRoute, - PipelinesRoute, - ResultsRoute, - UsageRoute, - PipelineIdRoute, - ProjectsForgeLazyRoute, - ProjectsIndexRoute, - JobsBodhiIdRoute, - JobsCoprIdRoute, - JobsKojiDownstreamIdRoute, - JobsKojiIdRoute, - JobsProposeDownstreamIdRoute, - JobsPullFromUpstreamIdRoute, - JobsSrpmIdRoute, - JobsTestingFarmIdRoute, - ProjectsForgeNamespaceLazyRoute, - ProjectsForgeNamespaceRepoRoute, -}) +interface JobsRouteChildren { + JobsBodhiRoute: typeof JobsBodhiRoute + JobsBodhiUpdatesRoute: typeof JobsBodhiUpdatesRoute + JobsCoprRoute: typeof JobsCoprRoute + JobsCoprBuildsRoute: typeof JobsCoprBuildsRoute + JobsDownstreamKojiBuildsRoute: typeof JobsDownstreamKojiBuildsRoute + JobsKojiRoute: typeof JobsKojiRoute + JobsKojiBuildsRoute: typeof JobsKojiBuildsRoute + JobsKojiDownstreamRoute: typeof JobsKojiDownstreamRoute + JobsProposeDownstreamRoute: typeof JobsProposeDownstreamRoute + JobsProposeDownstreamsRoute: typeof JobsProposeDownstreamsRoute + JobsPullFromUpstreamRoute: typeof JobsPullFromUpstreamRoute + JobsPullFromUpstreamsRoute: typeof JobsPullFromUpstreamsRoute + JobsSrpmRoute: typeof JobsSrpmRoute + JobsSrpmBuildsRoute: typeof JobsSrpmBuildsRoute + JobsTestingFarmRoute: typeof JobsTestingFarmRoute + JobsTestingFarmRunsRoute: typeof JobsTestingFarmRunsRoute + JobsIndexRoute: typeof JobsIndexRoute +} + +const JobsRouteChildren: JobsRouteChildren = { + JobsBodhiRoute: JobsBodhiRoute, + JobsBodhiUpdatesRoute: JobsBodhiUpdatesRoute, + JobsCoprRoute: JobsCoprRoute, + JobsCoprBuildsRoute: JobsCoprBuildsRoute, + JobsDownstreamKojiBuildsRoute: JobsDownstreamKojiBuildsRoute, + JobsKojiRoute: JobsKojiRoute, + JobsKojiBuildsRoute: JobsKojiBuildsRoute, + JobsKojiDownstreamRoute: JobsKojiDownstreamRoute, + JobsProposeDownstreamRoute: JobsProposeDownstreamRoute, + JobsProposeDownstreamsRoute: JobsProposeDownstreamsRoute, + JobsPullFromUpstreamRoute: JobsPullFromUpstreamRoute, + JobsPullFromUpstreamsRoute: JobsPullFromUpstreamsRoute, + JobsSrpmRoute: JobsSrpmRoute, + JobsSrpmBuildsRoute: JobsSrpmBuildsRoute, + JobsTestingFarmRoute: JobsTestingFarmRoute, + JobsTestingFarmRunsRoute: JobsTestingFarmRunsRoute, + JobsIndexRoute: JobsIndexRoute, +} + +const JobsRouteWithChildren = JobsRoute._addFileChildren(JobsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/jobs': typeof JobsRouteWithChildren + '/pipeline': typeof PipelineRoute + '/pipelines': typeof PipelinesRoute + '/results': typeof ResultsRoute + '/usage': typeof UsageRoute + '/jobs/bodhi': typeof JobsBodhiRoute + '/jobs/bodhi-updates': typeof JobsBodhiUpdatesRoute + '/jobs/copr': typeof JobsCoprRoute + '/jobs/copr-builds': typeof JobsCoprBuildsRoute + '/jobs/downstream-koji-builds': typeof JobsDownstreamKojiBuildsRoute + '/jobs/koji': typeof JobsKojiRoute + '/jobs/koji-builds': typeof JobsKojiBuildsRoute + '/jobs/koji-downstream': typeof JobsKojiDownstreamRoute + '/jobs/propose-downstream': typeof JobsProposeDownstreamRoute + '/jobs/propose-downstreams': typeof JobsProposeDownstreamsRoute + '/jobs/pull-from-upstream': typeof JobsPullFromUpstreamRoute + '/jobs/pull-from-upstreams': typeof JobsPullFromUpstreamsRoute + '/jobs/srpm': typeof JobsSrpmRoute + '/jobs/srpm-builds': typeof JobsSrpmBuildsRoute + '/jobs/testing-farm': typeof JobsTestingFarmRoute + '/jobs/testing-farm-runs': typeof JobsTestingFarmRunsRoute + '/pipeline/$id': typeof PipelineIdRoute + '/projects/$forge': typeof ProjectsForgeLazyRoute + '/jobs/': typeof JobsIndexRoute + '/projects': typeof ProjectsIndexRoute + '/jobs/bodhi/$id': typeof JobsBodhiIdRoute + '/jobs/copr/$id': typeof JobsCoprIdRoute + '/jobs/koji-downstream/$id': typeof JobsKojiDownstreamIdRoute + '/jobs/koji/$id': typeof JobsKojiIdRoute + '/jobs/propose-downstream/$id': typeof JobsProposeDownstreamIdRoute + '/jobs/pull-from-upstream/$id': typeof JobsPullFromUpstreamIdRoute + '/jobs/srpm/$id': typeof JobsSrpmIdRoute + '/jobs/testing-farm/$id': typeof JobsTestingFarmIdRoute + '/projects/$forge/$namespace': typeof ProjectsForgeNamespaceLazyRoute + '/projects/$forge/$namespace/$repo': typeof ProjectsForgeNamespaceRepoRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/pipeline': typeof PipelineRoute + '/pipelines': typeof PipelinesRoute + '/results': typeof ResultsRoute + '/usage': typeof UsageRoute + '/jobs/bodhi': typeof JobsBodhiRoute + '/jobs/bodhi-updates': typeof JobsBodhiUpdatesRoute + '/jobs/copr': typeof JobsCoprRoute + '/jobs/copr-builds': typeof JobsCoprBuildsRoute + '/jobs/downstream-koji-builds': typeof JobsDownstreamKojiBuildsRoute + '/jobs/koji': typeof JobsKojiRoute + '/jobs/koji-builds': typeof JobsKojiBuildsRoute + '/jobs/koji-downstream': typeof JobsKojiDownstreamRoute + '/jobs/propose-downstream': typeof JobsProposeDownstreamRoute + '/jobs/propose-downstreams': typeof JobsProposeDownstreamsRoute + '/jobs/pull-from-upstream': typeof JobsPullFromUpstreamRoute + '/jobs/pull-from-upstreams': typeof JobsPullFromUpstreamsRoute + '/jobs/srpm': typeof JobsSrpmRoute + '/jobs/srpm-builds': typeof JobsSrpmBuildsRoute + '/jobs/testing-farm': typeof JobsTestingFarmRoute + '/jobs/testing-farm-runs': typeof JobsTestingFarmRunsRoute + '/pipeline/$id': typeof PipelineIdRoute + '/projects/$forge': typeof ProjectsForgeLazyRoute + '/jobs': typeof JobsIndexRoute + '/projects': typeof ProjectsIndexRoute + '/jobs/bodhi/$id': typeof JobsBodhiIdRoute + '/jobs/copr/$id': typeof JobsCoprIdRoute + '/jobs/koji-downstream/$id': typeof JobsKojiDownstreamIdRoute + '/jobs/koji/$id': typeof JobsKojiIdRoute + '/jobs/propose-downstream/$id': typeof JobsProposeDownstreamIdRoute + '/jobs/pull-from-upstream/$id': typeof JobsPullFromUpstreamIdRoute + '/jobs/srpm/$id': typeof JobsSrpmIdRoute + '/jobs/testing-farm/$id': typeof JobsTestingFarmIdRoute + '/projects/$forge/$namespace': typeof ProjectsForgeNamespaceLazyRoute + '/projects/$forge/$namespace/$repo': typeof ProjectsForgeNamespaceRepoRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/jobs': typeof JobsRouteWithChildren + '/pipeline': typeof PipelineRoute + '/pipelines': typeof PipelinesRoute + '/results': typeof ResultsRoute + '/usage': typeof UsageRoute + '/jobs/bodhi': typeof JobsBodhiRoute + '/jobs/bodhi-updates': typeof JobsBodhiUpdatesRoute + '/jobs/copr': typeof JobsCoprRoute + '/jobs/copr-builds': typeof JobsCoprBuildsRoute + '/jobs/downstream-koji-builds': typeof JobsDownstreamKojiBuildsRoute + '/jobs/koji': typeof JobsKojiRoute + '/jobs/koji-builds': typeof JobsKojiBuildsRoute + '/jobs/koji-downstream': typeof JobsKojiDownstreamRoute + '/jobs/propose-downstream': typeof JobsProposeDownstreamRoute + '/jobs/propose-downstreams': typeof JobsProposeDownstreamsRoute + '/jobs/pull-from-upstream': typeof JobsPullFromUpstreamRoute + '/jobs/pull-from-upstreams': typeof JobsPullFromUpstreamsRoute + '/jobs/srpm': typeof JobsSrpmRoute + '/jobs/srpm-builds': typeof JobsSrpmBuildsRoute + '/jobs/testing-farm': typeof JobsTestingFarmRoute + '/jobs/testing-farm-runs': typeof JobsTestingFarmRunsRoute + '/pipeline/$id': typeof PipelineIdRoute + '/projects/$forge': typeof ProjectsForgeLazyRoute + '/jobs/': typeof JobsIndexRoute + '/projects/': typeof ProjectsIndexRoute + '/jobs/bodhi/$id': typeof JobsBodhiIdRoute + '/jobs/copr/$id': typeof JobsCoprIdRoute + '/jobs/koji-downstream/$id': typeof JobsKojiDownstreamIdRoute + '/jobs/koji/$id': typeof JobsKojiIdRoute + '/jobs/propose-downstream/$id': typeof JobsProposeDownstreamIdRoute + '/jobs/pull-from-upstream/$id': typeof JobsPullFromUpstreamIdRoute + '/jobs/srpm/$id': typeof JobsSrpmIdRoute + '/jobs/testing-farm/$id': typeof JobsTestingFarmIdRoute + '/projects/$forge/$namespace': typeof ProjectsForgeNamespaceLazyRoute + '/projects/$forge/$namespace/$repo': typeof ProjectsForgeNamespaceRepoRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/jobs' + | '/pipeline' + | '/pipelines' + | '/results' + | '/usage' + | '/jobs/bodhi' + | '/jobs/bodhi-updates' + | '/jobs/copr' + | '/jobs/copr-builds' + | '/jobs/downstream-koji-builds' + | '/jobs/koji' + | '/jobs/koji-builds' + | '/jobs/koji-downstream' + | '/jobs/propose-downstream' + | '/jobs/propose-downstreams' + | '/jobs/pull-from-upstream' + | '/jobs/pull-from-upstreams' + | '/jobs/srpm' + | '/jobs/srpm-builds' + | '/jobs/testing-farm' + | '/jobs/testing-farm-runs' + | '/pipeline/$id' + | '/projects/$forge' + | '/jobs/' + | '/projects' + | '/jobs/bodhi/$id' + | '/jobs/copr/$id' + | '/jobs/koji-downstream/$id' + | '/jobs/koji/$id' + | '/jobs/propose-downstream/$id' + | '/jobs/pull-from-upstream/$id' + | '/jobs/srpm/$id' + | '/jobs/testing-farm/$id' + | '/projects/$forge/$namespace' + | '/projects/$forge/$namespace/$repo' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/pipeline' + | '/pipelines' + | '/results' + | '/usage' + | '/jobs/bodhi' + | '/jobs/bodhi-updates' + | '/jobs/copr' + | '/jobs/copr-builds' + | '/jobs/downstream-koji-builds' + | '/jobs/koji' + | '/jobs/koji-builds' + | '/jobs/koji-downstream' + | '/jobs/propose-downstream' + | '/jobs/propose-downstreams' + | '/jobs/pull-from-upstream' + | '/jobs/pull-from-upstreams' + | '/jobs/srpm' + | '/jobs/srpm-builds' + | '/jobs/testing-farm' + | '/jobs/testing-farm-runs' + | '/pipeline/$id' + | '/projects/$forge' + | '/jobs' + | '/projects' + | '/jobs/bodhi/$id' + | '/jobs/copr/$id' + | '/jobs/koji-downstream/$id' + | '/jobs/koji/$id' + | '/jobs/propose-downstream/$id' + | '/jobs/pull-from-upstream/$id' + | '/jobs/srpm/$id' + | '/jobs/testing-farm/$id' + | '/projects/$forge/$namespace' + | '/projects/$forge/$namespace/$repo' + id: + | '__root__' + | '/' + | '/jobs' + | '/pipeline' + | '/pipelines' + | '/results' + | '/usage' + | '/jobs/bodhi' + | '/jobs/bodhi-updates' + | '/jobs/copr' + | '/jobs/copr-builds' + | '/jobs/downstream-koji-builds' + | '/jobs/koji' + | '/jobs/koji-builds' + | '/jobs/koji-downstream' + | '/jobs/propose-downstream' + | '/jobs/propose-downstreams' + | '/jobs/pull-from-upstream' + | '/jobs/pull-from-upstreams' + | '/jobs/srpm' + | '/jobs/srpm-builds' + | '/jobs/testing-farm' + | '/jobs/testing-farm-runs' + | '/pipeline/$id' + | '/projects/$forge' + | '/jobs/' + | '/projects/' + | '/jobs/bodhi/$id' + | '/jobs/copr/$id' + | '/jobs/koji-downstream/$id' + | '/jobs/koji/$id' + | '/jobs/propose-downstream/$id' + | '/jobs/pull-from-upstream/$id' + | '/jobs/srpm/$id' + | '/jobs/testing-farm/$id' + | '/projects/$forge/$namespace' + | '/projects/$forge/$namespace/$repo' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + JobsRoute: typeof JobsRouteWithChildren + PipelineRoute: typeof PipelineRoute + PipelinesRoute: typeof PipelinesRoute + ResultsRoute: typeof ResultsRoute + UsageRoute: typeof UsageRoute + PipelineIdRoute: typeof PipelineIdRoute + ProjectsForgeLazyRoute: typeof ProjectsForgeLazyRoute + ProjectsIndexRoute: typeof ProjectsIndexRoute + JobsBodhiIdRoute: typeof JobsBodhiIdRoute + JobsCoprIdRoute: typeof JobsCoprIdRoute + JobsKojiDownstreamIdRoute: typeof JobsKojiDownstreamIdRoute + JobsKojiIdRoute: typeof JobsKojiIdRoute + JobsProposeDownstreamIdRoute: typeof JobsProposeDownstreamIdRoute + JobsPullFromUpstreamIdRoute: typeof JobsPullFromUpstreamIdRoute + JobsSrpmIdRoute: typeof JobsSrpmIdRoute + JobsTestingFarmIdRoute: typeof JobsTestingFarmIdRoute + ProjectsForgeNamespaceLazyRoute: typeof ProjectsForgeNamespaceLazyRoute + ProjectsForgeNamespaceRepoRoute: typeof ProjectsForgeNamespaceRepoRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + JobsRoute: JobsRouteWithChildren, + PipelineRoute: PipelineRoute, + PipelinesRoute: PipelinesRoute, + ResultsRoute: ResultsRoute, + UsageRoute: UsageRoute, + PipelineIdRoute: PipelineIdRoute, + ProjectsForgeLazyRoute: ProjectsForgeLazyRoute, + ProjectsIndexRoute: ProjectsIndexRoute, + JobsBodhiIdRoute: JobsBodhiIdRoute, + JobsCoprIdRoute: JobsCoprIdRoute, + JobsKojiDownstreamIdRoute: JobsKojiDownstreamIdRoute, + JobsKojiIdRoute: JobsKojiIdRoute, + JobsProposeDownstreamIdRoute: JobsProposeDownstreamIdRoute, + JobsPullFromUpstreamIdRoute: JobsPullFromUpstreamIdRoute, + JobsSrpmIdRoute: JobsSrpmIdRoute, + JobsTestingFarmIdRoute: JobsTestingFarmIdRoute, + ProjectsForgeNamespaceLazyRoute: ProjectsForgeNamespaceLazyRoute, + ProjectsForgeNamespaceRepoRoute: ProjectsForgeNamespaceRepoRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 86124ea..dbc8c90 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,6 +1,6 @@ // Copyright Contributors to the Packit project. // SPDX-License-Identifier: MIT - +/// import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { sentryVitePlugin } from "@sentry/vite-plugin"; @@ -14,11 +14,7 @@ export default defineConfig(() => ({ rollupOptions: { output: { manualChunks: function manualChunks(id) { - if ( - id.includes("victory-") || - id.includes("d3") || - id.includes("@patternfly/react-charts") - ) { + if (id.includes("victory-") || id.includes("d3") || id.includes("@patternfly/react-charts")) { return "charts"; } else if (id.includes("@patternfly")) { return "patternfly"; @@ -46,9 +42,13 @@ export default defineConfig(() => ({ authToken: process.env.SENTRY_AUTH_TOKEN, telemetry: false, reactComponentAnnotation: { enabled: true }, + disable: process.env.SENTRY_AUTH_TOKEN === undefined, }), ], server: { open: true, }, + test: { + environment: "happy-dom", + }, })); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48d2049..e5cef0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: '@tanstack/router-plugin': specifier: ^1.58.12 version: 1.58.12(vite@5.4.8(@types/node@22.7.4))(webpack-sources@3.2.3) + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': specifier: ^22.7.4 version: 22.7.4 @@ -68,6 +71,9 @@ importers: '@vitejs/plugin-react': specifier: ^4.3.2 version: 4.3.2(vite@5.4.8(@types/node@22.7.4)) + happy-dom: + specifier: ^15.7.4 + version: 15.7.4 react: specifier: ^18.3.1 version: 18.3.1 @@ -108,6 +114,9 @@ importers: prop-types: specifier: ^15.8.1 version: 15.8.1 + vitest: + specifier: ^2.1.2 + version: 2.1.2(@types/node@22.7.4)(happy-dom@15.7.4)(jsdom@25.0.1) packages: @@ -1058,10 +1067,32 @@ packages: resolution: {integrity: sha512-fBUj+lbSaw+VxoBN4J/WFE7dTx8x4XCTRAQvbiIyPJ8MY1KRVkdZV6cbLvg7MeDP6CxUcj6XNvWU6h0ic1Ipyg==} engines: {node: '>=12'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1122,6 +1153,36 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@vitest/expect@2.1.2': + resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} + + '@vitest/mocker@2.1.2': + resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} + peerDependencies: + '@vitest/spy': 2.1.2 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.2': + resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} + + '@vitest/runner@2.1.2': + resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} + + '@vitest/snapshot@2.1.2': + resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} + + '@vitest/spy@2.1.2': + resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + + '@vitest/utils@2.1.2': + resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} @@ -1131,6 +1192,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1147,6 +1212,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1154,6 +1223,16 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + attr-accept@2.2.2: resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} engines: {node: '>=4'} @@ -1201,10 +1280,22 @@ packages: caniuse-lite@1.0.30001664: resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1237,6 +1328,10 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1278,6 +1373,10 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1325,6 +1424,10 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1334,6 +1437,13 @@ packages: supports-color: optional: true + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -1344,10 +1454,21 @@ packages: delaunay-find@0.0.6: resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1402,6 +1523,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + file-selector@0.6.0: resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} engines: {node: '>= 12'} @@ -1417,6 +1541,10 @@ packages: focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1433,6 +1561,9 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -1456,20 +1587,44 @@ packages: peerDependencies: csstype: ^3.0.10 + happy-dom@15.7.4: + resolution: {integrity: sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ==} + engines: {node: '>=18.0.0'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1519,6 +1674,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -1533,6 +1691,15 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1605,6 +1772,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -1614,6 +1784,13 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -1627,6 +1804,14 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -1669,6 +1854,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.13: + resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1693,6 +1881,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1708,6 +1899,10 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -1724,6 +1919,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -1734,6 +1933,10 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + react-display-name@0.2.5: resolution: {integrity: sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==} @@ -1754,6 +1957,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-jss@10.10.0: resolution: {integrity: sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ==} peerDependencies: @@ -1800,6 +2006,16 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -1819,6 +2035,9 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -1833,6 +2052,12 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1845,6 +2070,10 @@ packages: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} @@ -1857,6 +2086,9 @@ packages: resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} engines: {node: '>=0.10.0'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -1872,6 +2104,31 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.49: + resolution: {integrity: sha512-ctRO/wzBasOCxAStJG/60Qe8/QpGmaVPsE8djdk0vioxN4uCOgKoveH71Qc2EOmVMIjVf0BjigI5p9ZDuLOygg==} + + tldts@6.1.49: + resolution: {integrity: sha512-E5se9HuCyfwWvmc0JiXiocOw+Cm4tlJCKewdB5RKMH8MmtiTsQCc+yu5BBYB5ZN4lNbz8Xg65bqJ1odS9+RhIA==} + hasBin: true + tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -1884,9 +2141,17 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + tsconfck@3.1.3: resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} engines: {node: ^18 || >=20} @@ -2049,6 +2314,11 @@ packages: engines: {node: ^18.19.0 || >=20.6.0} hasBin: true + vite-node@2.1.2: + resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-image-optimizer@1.1.8: resolution: {integrity: sha512-40bYRDHQLUOrIwJIJQqyKJHrfgVshqzDLtMy8SEgf+fB7PnppslSTTkY7PJFrBGqgbCdOdN9KkqsvccXmnEa5Q==} engines: {node: '>=14'} @@ -2099,9 +2369,42 @@ packages: terser: optional: true + vitest@2.1.2: + resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.2 + '@vitest/ui': 2.1.2 + 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 + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -2112,6 +2415,22 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -2120,10 +2439,34 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2979,8 +3322,31 @@ snapshots: '@tanstack/virtual-file-routes@1.56.0': {} + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.25.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@testing-library/dom': 10.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + '@trysound/sax@0.2.0': {} + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.6 @@ -3054,6 +3420,46 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@2.1.2': + dependencies: + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.4))': + dependencies: + '@vitest/spy': 2.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.8(@types/node@22.7.4) + + '@vitest/pretty-format@2.1.2': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.2': + dependencies: + '@vitest/utils': 2.1.2 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.1.2': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + acorn@8.12.1: {} agent-base@6.0.2: @@ -3062,6 +3468,13 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + optional: true + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -3074,6 +3487,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -3081,6 +3496,15 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + assertion-error@2.0.1: {} + + asynckit@0.4.0: + optional: true + attr-accept@2.2.2: {} babel-dead-code-elimination@1.0.6: @@ -3123,12 +3547,27 @@ snapshots: caniuse-lite@1.0.30001664: {} + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3171,6 +3610,11 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + optional: true + commander@7.2.0: {} convert-source-map@2.0.0: {} @@ -3219,6 +3663,11 @@ snapshots: dependencies: css-tree: 2.2.1 + cssstyle@4.1.0: + dependencies: + rrweb-cssom: 0.7.1 + optional: true + csstype@3.1.3: {} d3-array@3.2.4: @@ -3259,10 +3708,21 @@ snapshots: d3-timer@3.0.1: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + optional: true + debug@4.3.7: dependencies: ms: 2.1.3 + decimal.js@10.4.3: + optional: true + + deep-eql@5.0.2: {} + define-lazy-prop@2.0.0: {} delaunator@4.0.1: {} @@ -3271,8 +3731,15 @@ snapshots: dependencies: delaunator: 4.0.1 + delayed-stream@1.0.0: + optional: true + + dequal@2.0.3: {} + detect-libc@2.0.3: {} + dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -3367,6 +3834,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + file-selector@0.6.0: dependencies: tslib: 2.7.0 @@ -3384,6 +3855,13 @@ snapshots: dependencies: tabbable: 6.2.0 + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + optional: true + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -3393,6 +3871,8 @@ snapshots: get-caller-file@2.0.5: {} + get-func-name@2.0.2: {} + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -3416,12 +3896,33 @@ snapshots: dependencies: csstype: 3.1.3 + happy-dom@15.7.4: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + has-flag@3.0.0: {} + has-flag@4.0.0: {} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + optional: true + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + optional: true + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -3429,8 +3930,21 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + optional: true + hyphenate-style-name@1.1.0: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -3469,6 +3983,9 @@ snapshots: is-number@7.0.0: {} + is-potential-custom-element-name@1.0.1: + optional: true + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -3481,6 +3998,35 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@25.0.1: + dependencies: + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.13 + parse5: 7.1.2 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true + jsesc@2.5.2: {} json-parse-even-better-errors@2.3.1: {} @@ -3593,6 +4139,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: tslib: 2.7.0 @@ -3603,6 +4153,12 @@ snapshots: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3613,6 +4169,14 @@ snapshots: memoize-one@5.2.1: {} + mime-db@1.52.0: + optional: true + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + optional: true + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 @@ -3642,6 +4206,9 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.13: + optional: true + object-assign@4.1.1: {} open@8.4.2: @@ -3669,6 +4236,11 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5@7.1.2: + dependencies: + entities: 4.5.0 + optional: true + path-exists@4.0.0: {} path-scurry@1.11.1: @@ -3680,6 +4252,8 @@ snapshots: pathe@1.1.2: {} + pathval@2.0.0: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -3692,6 +4266,12 @@ snapshots: prettier@3.3.3: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + progress@2.0.3: {} prop-types@15.8.1: @@ -3702,6 +4282,9 @@ snapshots: proxy-from-env@1.1.0: {} + punycode@2.3.1: + optional: true + react-display-name@0.2.5: {} react-dom@18.3.1(react@18.3.1): @@ -3721,6 +4304,8 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-jss@10.10.0(react@18.3.1): dependencies: '@babel/runtime': 7.25.6 @@ -3785,6 +4370,17 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.23.0 fsevents: 2.3.3 + rrweb-cssom@0.7.1: + optional: true + + safer-buffer@2.1.2: + optional: true + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + optional: true + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -3821,6 +4417,8 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + siginfo@2.0.0: {} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -3834,6 +4432,10 @@ snapshots: source-map@0.7.4: {} + stackback@0.0.2: {} + + std-env@3.7.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3848,6 +4450,10 @@ snapshots: dependencies: has-flag: 3.0.0 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + svg-parser@2.0.4: {} svgo@3.3.2: @@ -3862,6 +4468,9 @@ snapshots: symbol-observable@1.2.0: {} + symbol-tree@3.2.4: + optional: true + tabbable@6.2.0: {} theming@3.3.0(react@18.3.1): @@ -3876,6 +4485,24 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tldts-core@6.1.49: + optional: true + + tldts@6.1.49: + dependencies: + tldts-core: 6.1.49 + optional: true + tmp@0.2.3: {} to-fast-properties@2.0.0: {} @@ -3884,8 +4511,18 @@ snapshots: dependencies: is-number: 7.0.0 + tough-cookie@5.0.0: + dependencies: + tldts: 6.1.49 + optional: true + tr46@0.0.3: {} + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + optional: true + tsconfck@3.1.3(typescript@5.6.2): optionalDependencies: typescript: 5.6.2 @@ -4105,6 +4742,23 @@ snapshots: - rollup - supports-color + vite-node@2.1.2(@types/node@22.7.4): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.8(@types/node@22.7.4) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-plugin-image-optimizer@1.1.8(vite@5.4.8(@types/node@22.7.4)): dependencies: ansi-colors: 4.1.3 @@ -4142,14 +4796,73 @@ snapshots: '@types/node': 22.7.4 fsevents: 2.3.3 + vitest@2.1.2(@types/node@22.7.4)(happy-dom@15.7.4)(jsdom@25.0.1): + dependencies: + '@vitest/expect': 2.1.2 + '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.4)) + '@vitest/pretty-format': 2.1.2 + '@vitest/runner': 2.1.2 + '@vitest/snapshot': 2.1.2 + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.8(@types/node@22.7.4) + vite-node: 2.1.2(@types/node@22.7.4) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.7.4 + happy-dom: 15.7.4 + jsdom: 25.0.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + optional: true + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + webpack-sources@3.2.3: {} webpack-virtual-modules@0.5.0: {} webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + optional: true + + whatwg-mimetype@3.0.0: {} + + whatwg-mimetype@4.0.0: + optional: true + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + optional: true + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -4159,12 +4872,26 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + ws@8.18.0: + optional: true + + xml-name-validator@5.0.0: + optional: true + + xmlchars@2.2.0: + optional: true + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/frontend/tsconfig.json b/tsconfig.json similarity index 85% rename from frontend/tsconfig.json rename to tsconfig.json index 77cf61e..2b54b50 100644 --- a/frontend/tsconfig.json +++ b/tsconfig.json @@ -19,11 +19,11 @@ "jsx": "preserve" }, "include": [ - "src" + "frontend/src" ], "exclude": [ "node_modules", - "vite.config.ts", - "eslint.config.js", + "frontend/vite.config.ts", + "frontend/eslint.config.js", ] }