diff --git a/.github/workflows/test-apiscoringviewer.yml b/.github/workflows/test-apiscoringviewer.yml new file mode 100644 index 0000000..c5eaa6d --- /dev/null +++ b/.github/workflows/test-apiscoringviewer.yml @@ -0,0 +1,45 @@ +name: Test API Scoring Viewer + +permissions: + contents: read + actions: write + +on: + pull_request: + paths: + - "plugins/spa-apiscoringviewer/**" + - ".github/workflows/test-apiscoringviewer.yml" +jobs: + test: + name: Run Vitest Tests on SPA + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 8.15.9 + + - name: Install dependencies + run: | + cd plugins/spa-apiscoringviewer + pnpm install --frozen-lockfile --recursive + + - name: Run tests + run: | + cd plugins/spa-apiscoringviewer/packages/apiscoringviewer + pnpm test -- --run + + - name: Upload coverage reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + path: plugins/spa-apiscoringviewer/packages/apiscoringviewer/coverage/ + if-no-files-found: ignore diff --git a/plugins/spa-apiscoringviewer/README.md b/plugins/spa-apiscoringviewer/README.md index 2426168..4586258 100644 --- a/plugins/spa-apiscoringviewer/README.md +++ b/plugins/spa-apiscoringviewer/README.md @@ -56,7 +56,7 @@ This folder contains the **SPA** of the API Scoring extension. The structure is ``` npm install --global pnpm pnpm install - ``` + ``` 4. Once the process finishes, start the SPA: @@ -64,7 +64,7 @@ This folder contains the **SPA** of the API Scoring extension. The structure is pnpm start ``` -5. Configure the VSCode plugin (for local development): +5. Configure the VSCode plugin (for local development): If you are running the SPA locally, open VSCode with the plugin already installed. Then, in the plugin settings, go to (Api Scoring › Certification › Frontend: Url) and set the frontend URL to: @@ -72,13 +72,12 @@ If you are running the SPA locally, open VSCode with the plugin already installe http://localhost:3000 ``` - - > #### TIP +> > If you need to remove all dependencies, you can use the following command: > > ``` -> pnpm clean +> pnpm clear > ```
diff --git a/plugins/spa-apiscoringviewer/jest-setup.ts b/plugins/spa-apiscoringviewer/jest-setup.ts deleted file mode 100644 index 446a1e0..0000000 --- a/plugins/spa-apiscoringviewer/jest-setup.ts +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Industria de Diseño Textil S.A. INDITEX -// -// SPDX-License-Identifier: Apache-2.0 - -window.ResizeObserver = class ResizeObserver { - observe() {} - unobserve() {} - disconnect() {} -}; diff --git a/plugins/spa-apiscoringviewer/jest.config.js b/plugins/spa-apiscoringviewer/jest.config.js deleted file mode 100644 index edaf548..0000000 --- a/plugins/spa-apiscoringviewer/jest.config.js +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Industria de Diseño Textil S.A. INDITEX -// -// SPDX-License-Identifier: Apache-2.0 - -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: "ts-jest", - testEnvironment: "jsdom", - testEnvironmentOptions: { - customExportConditions: ["development"], - }, - testMatch: ["**/*.test.{ts,tsx}"], - transform: { - "^.+\\.tsx?$": "ts-jest", - }, - setupFilesAfterEnv: [ - "@testing-library/jest-dom/extend-expect", - "/jest-setup.ts", - ], -}; diff --git a/plugins/spa-apiscoringviewer/package.json b/plugins/spa-apiscoringviewer/package.json index d216e41..f83fd30 100644 --- a/plugins/spa-apiscoringviewer/package.json +++ b/plugins/spa-apiscoringviewer/package.json @@ -14,7 +14,6 @@ "prerelease": "preconstruct build", "postinstall": "preconstruct dev", "start": "pnpm --filter=spa-apiscoringviewer watch", - "test": "jest --config=jest.config.js", "prettier": "prettier --write \"**/*.{css,html,js,json,jsx,ts,tsx}\"", "prettier:ci": "prettier --check \"**/*.{css,html,js,json,jsx,ts,tsx}\"", "typescript": "tsc --noEmit", @@ -26,7 +25,7 @@ "@babel/preset-typescript": "^7.25.7", "@testing-library/jest-dom": "^6.5.0", "@types/jest": "^29.5.13", - "@types/node": "^18.19.55", + "@types/node": "^22.15.3", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "@types/testing-library__jest-dom": "^5.14.9", @@ -34,7 +33,6 @@ "@typescript-eslint/parser": "^6.21.0", "@typescript-eslint/type-utils": "^6.21.0", "eslint": "^8.57.1", - "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "parcel": "latest", "prettier": "latest", @@ -43,7 +41,6 @@ "typescript": "^5.6.3" }, "dependencies": { - "@jest/globals": "^29.7.0", "@parcel/config-default": "^2.9.3", "@parcel/core": "^2.9.3", "@parcel/packager-ts": "^2.9.3", diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/package.json b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/package.json index 7492b81..cdf7b13 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/package.json +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/package.json @@ -1,7 +1,7 @@ { "name": "@inditextech/apiscoringviewer", "description": "React components for API Scoring Viewer", - "version": "1.0.4", + "version": "1.1.0", "license": "Apache-2.0", "author": { "name": "Inditex Open Source Team", @@ -78,23 +78,28 @@ "clear:node_modules": "rm -rf ./node_modules", "build": "parcel build", "lint": "eslint \"src/**/*.{ts,tsx}\"", + "test": "vitest", "watch": "parcel watch --port=2345" }, "devDependencies": { "@babel/core": "^7.12.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.3.0", "@types/lodash": "^4.14.195", "@types/react-router-dom": "^5.3.3", "cpx": "^1.5.0", "eslint": "^8.37.0", "eslint-plugin-no-restricted-imports": "^0.0.0", "eslint-plugin-react-hooks": "^4.6.0", + "jsdom": "^26.1.0", "react": "^18", "react-dom": "^18", - "type-fest": "^3.12.0" + "type-fest": "^3.12.0", + "vitest": "^3.2.4" }, "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "browserslist": [ "Chrome 79" @@ -107,7 +112,6 @@ "@parcel/optimizer-htmlnano": "^2.9.3", "@sindresorhus/slugify": "^2.2.1", "@tabler/icons-react": "^2.23.0", - "@testing-library/jest-dom": "^5.16.5", "lodash": "^4.17.21", "react-error-boundary": "^4.0.10", "react-intl": "^6.4.4", diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/api-tabs.test.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/api-tabs.test.tsx index 97c3397..e46ccff 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/api-tabs.test.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/api-tabs.test.tsx @@ -2,6 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 +import { test, expect } from "vitest"; import { render, screen } from "@testing-library/react"; import ApiTabs from "../components/api-tabs"; import { CERTS_PAYLOAD, Providers } from "../../utils/test-utils"; diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/certification.test.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/certification.test.tsx new file mode 100644 index 0000000..ac9c8ca --- /dev/null +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/__tests__/certification.test.tsx @@ -0,0 +1,312 @@ +// SPDX-FileCopyrightText: 2023 Industria de Diseño Textil S.A. INDITEX +// +// SPDX-License-Identifier: Apache-2.0 + +import { act, fireEvent, render, screen, waitFor, within } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ReactNode } from "react"; +import { vi, beforeAll, afterEach, beforeEach, describe, test, expect } from "vitest"; +import { API_VALIDATION_RESULTS, CERTS_PAYLOAD, MODULE_RESULTS, Providers } from "../../utils/test-utils"; +import IdeProvider from "../ide-data-provider"; +import isVsCode from "../../utils/is-vscode"; +import isIntelliJ from "../../utils/is-intellij"; +import Certification from "../certification"; + +vi.mock("../../utils/is-vscode"); +vi.mock("../../utils/is-intellij"); +vi.mock("react-router-dom", async () => ({ + ...(await vi.importActual("react-router-dom")), + useParams: vi.fn(), +})); +vi.mock("react-virtualized-auto-sizer", () => ({ + default: ({ children }: { children: ({}) => ReactNode }) => children({ width: "100%", height: "100%" }), +})); + +const isVsCodeMock = vi.mocked(isVsCode); +const isIntelliJMock = vi.mocked(isIntelliJ); + +window.cefQuery = vi.fn(); +const postMessage = vi.fn(); + +beforeAll(() => { + Object.defineProperty(global.window, "parent", { + value: { + postMessage, + }, + writable: true, + }); +}); + +afterEach(() => { + vi.clearAllMocks(); +}); + +describe("renders inside VSCode IDE", () => { + beforeEach(() => { + isVsCodeMock.mockReturnValue(true); + isIntelliJMock.mockReturnValue(false); + postMessage.mockReset(); + }); + + test("renders certification", async () => { + render(, { + wrapper: Providers, + }); + + const certificationResultsEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, + }); + + await act(async () => { + window.dispatchEvent(certificationResultsEvent); + }); + + expect(screen.getByRole("tab", { selected: true })).toHaveTextContent("API Sample"); + expect(screen.getByTestId("ApiTab-Other API-REST")).toHaveTextContent("Other API"); + + await checkApiSampleContent(); + + const currentTabContainer = within(screen.getByTestId("ApiValidation-API Sample-REST")); + + postMessage.mockReset(); + + const revalidateLinterButton = screen.getByTestId("RevalidateButton-API Sample-DESIGN"); + await userEvent.click(revalidateLinterButton); + + expect(postMessage).toHaveBeenCalled(); + expect(postMessage).toHaveBeenCalledTimes(1); + expect(postMessage).toHaveBeenCalledWith( + { + command: "onClickValidateModule", + payload: { + apiDefinitionPath: "portal/v3", + apiName: "API Sample", + apiSpecType: "REST", + validationType: "DESIGN", + }, + }, + "*", + ); + + // Run compile + postMessage.mockReset(); + const lintListItem = screen.getByTestId("Issue-apis/example/v3/openapi-rest.yml-first-pass-lint-error-4527-22-4532-58-0"); + await userEvent.click(lintListItem); + expect(postMessage).toBeCalled(); + expect(postMessage).toBeCalledTimes(1); + expect(postMessage).toBeCalledWith( + { + command: "onClickOpenFile", + payload: { + fileName: "/some/user/p/app-apiposvc/apis/portal/v3/apis/example/v3/openapi-rest.yml", + infoPosition: { char: 22, lastLine: 4532, lastchar: 58, line: 4527 }, + }, + }, + "*", + ); + + // Revalidate the module + const moduleResultsEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { command: "setModuleResults", payload: MODULE_RESULTS }, + }); + + await act(async () => { + window.dispatchEvent(moduleResultsEvent); + }); + + // Overall rating info is no longer rendered + expect(screen.queryByTestId("ApiHeading-Score-API Sample-1")).not.toBeInTheDocument(); + + // New errors are displayed + expect(currentTabContainer.getByText("new-lint-error-on-revalidation")).toBeInTheDocument(); + expect(currentTabContainer.getByText("New lint error while revalidating")).toBeInTheDocument(); + + // Check that apiDefinitionPath was updated from the one in MODULE_RESULTS + postMessage.mockReset(); + const lintListItem2 = screen.getByTestId("Issue-apis/example/v3/openapi-rest.yml-new-lint-error-on-revalidation-3755-22-3760-26-0"); + await userEvent.click(lintListItem2); + expect(postMessage).toBeCalled(); + expect(postMessage).toBeCalledTimes(1); + expect(postMessage).toBeCalledWith( + { + command: "onClickOpenFile", + payload: { + fileName: "/some/user/p/app-apiposvc/apis/different/apis/route/portal/v3/apis/example/v3/openapi-rest.yml", + infoPosition: { char: 22, lastLine: 3760, lastchar: 26, line: 3755 }, + }, + }, + "*", + ); + + // When the tab is changed the content is reload accondingly + const secondTab = screen.getByRole("tab", { selected: false }); + expect(secondTab).toHaveTextContent("Other API"); + await userEvent.click(secondTab); + + const secondTabContainer = within(screen.getByTestId("ApiValidation-Other API-REST")); + + // When the errored tab is not selected, then is when the error icon is shown. + // expect(apiPortalTab.getElementsByClassName("icoErrorTab")).toHaveLength(1); + expect(secondTabContainer.getByText("js-properties-should-be-camel-case")).toBeInTheDocument(); + + postMessage.mockReset(); + const docListItem = screen.getByTestId("Issue-MIGRATION.md-13-MD009-no-trailing-spaces"); + await userEvent.click(docListItem); + + expect(postMessage).toBeCalled(); + expect(postMessage).toBeCalledTimes(1); + expect(postMessage).toBeCalledWith( + { + command: "onClickOpenFile", + payload: { + fileName: "/some/user/p/app-apiposvc/apis/MIGRATION.md", + infoPosition: { + char: 14, + lastLine: undefined, + lastchar: undefined, + line: 13, + }, + }, + }, + "*", + ); + }); + + test("api validation results are updated", async () => { + act(() => { + render(, { + wrapper: Providers, + }); + }); + + const certificationResultsEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, + }); + + act(() => { + window.dispatchEvent(certificationResultsEvent); + }); + + expect(postMessage).toBeCalled(); + expect(postMessage).toBeCalledTimes(1); + expect(postMessage).toBeCalledWith( + { + command: "onProjectLoaded", + payload: {}, + }, + "*", + ); + + postMessage.mockReset(); + + const revalidateApiButton = screen.getByTestId("RevalidateApiButton-API Sample"); + await userEvent.click(revalidateApiButton); + + expect(postMessage).toBeCalled(); + expect(postMessage).toBeCalledTimes(1); + expect(postMessage).toBeCalledWith( + { + command: "onClickValidateModule", + payload: { + apiDefinitionPath: "portal/v3", + apiName: "API Sample", + apiSpecType: "REST", + validationType: "OVERALL_SCORE", + }, + }, + "*", + ); + + expect(revalidateApiButton).toHaveAttribute("data-loading", "true"); + + const apiResultsEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { command: "setModuleResults", payload: API_VALIDATION_RESULTS }, + }); + + act(() => { + window.dispatchEvent(apiResultsEvent); + }); + + expect(screen.getByText(/You have to fix some errors to improve/i)).toBeInTheDocument(); + + // New errors are displayed + const tabContainer = within(await screen.findByTestId("ApiValidation-API Sample-REST")); + const designValidationResult = tabContainer.getByTestId("ValidationResult-DESIGN"); + expect(within(designValidationResult).getByText("new-lint-error-on-revalidation")).toBeInTheDocument(); + expect(within(designValidationResult).getByText("New lint error while revalidating")).toBeInTheDocument(); + + const securityValidationResult = tabContainer.getByTestId("ValidationResult-SECURITY"); + expect( + within(securityValidationResult).getByTestId("ProtoValidation-grpc/example/v1/adjustment.proto-array-required-properties-33-3-0"), + ).toBeInTheDocument(); + + const documentationValidationResult = tabContainer.getByTestId("ValidationResult-DOCUMENTATION"); + expect(within(documentationValidationResult).getByTestId("Issue-README.md-13-MD034-no-bare-urls")).toBeInTheDocument(); + }); + + test("revalidation module error is displayed and reseted", async () => { + render(, { + wrapper: Providers, + }); + + const certificationResultsEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, + }); + + act(() => { + window.dispatchEvent(certificationResultsEvent); + }); + + const runLintingButton = screen.getByTestId("RevalidateButton-API Sample-DESIGN"); + await userEvent.click(runLintingButton); + + expect(runLintingButton).toHaveAttribute("data-loading", "true"); + + const extensionErrorEvent = new MessageEvent("message", { + origin: "vscode-webview://", + data: { + command: "throwExtensionError", + payload: { name: "Some error", message: "Something wrong happened!" }, + }, + }); + + act(() => { + window.dispatchEvent(extensionErrorEvent); + }); + + expect(screen.queryByTestId("CertificationPage-NetworkError")).toBeInTheDocument(); + expect(runLintingButton).not.toHaveAttribute("data-loading", "true"); + }); +}); + +async function checkApiSampleContent() { + const tabContainer = within(await screen.findByTestId("ApiValidation-API Sample-REST")); + + expect(screen.getByTestId("ApiHeading-Badge-API Sample-REST")).toHaveTextContent("REST"); + expect(screen.getByTestId("ApiHeading-RatingScore-API Sample-REST")).toHaveTextContent("D"); + + expect(tabContainer.getByTestId("AccordionControlTitle-DESIGN")).toBeInTheDocument(); + expect(tabContainer.getByTestId("AccordionControlTitle-SECURITY")).toBeInTheDocument(); + expect(tabContainer.getByTestId("AccordionControlTitle-DOCUMENTATION")).toBeInTheDocument(); + + expect(tabContainer.getByTestId("ScoreLabel-DESIGN")).toHaveTextContent("C"); + expect(tabContainer.getByTestId("ScoreLabel-SECURITY")).toHaveTextContent("A+"); + expect(tabContainer.getByTestId("ScoreLabel-DOCUMENTATION")).toHaveTextContent("A"); + + const designValidationResult = tabContainer.getByTestId("ValidationResult-DESIGN"); + expect(within(designValidationResult).getByText("This error is only on first pass")).toBeInTheDocument(); + expect(within(designValidationResult).getByText("Property name has to be camelCase")).toBeInTheDocument(); + + const securityValidationResult = tabContainer.getByTestId("ValidationResult-SECURITY"); + expect(within(securityValidationResult).getByText("Global 'security' field is not defined")).toBeInTheDocument(); + expect(within(securityValidationResult).getByText("Server objects should support https")).toBeInTheDocument(); + expect(within(securityValidationResult).getByText('"schema.format" property must be defined')).toBeInTheDocument(); + + const documentationValidationResult = tabContainer.getByTestId("ValidationResult-DOCUMENTATION"); + expect(within(documentationValidationResult).getByText("Bare URL used")).toBeInTheDocument(); +} diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/certification.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/certification.tsx index 4ad0221..5540a89 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/certification.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/certification.tsx @@ -44,12 +44,13 @@ export default function CertificationPage )} - {(loading || intelliJLoading) && ( + {(loading || intelliJLoading) && !certification && !error && (
diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-heading/api-heading.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-heading/api-heading.tsx index 4b01506..6e7e129 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-heading/api-heading.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-heading/api-heading.tsx @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: Apache-2.0 -import ScoreLabel from "../score-label"; import type { ApiIdentifier, Certification, @@ -16,7 +15,6 @@ import { useCallback } from "react"; import { FormattedMessage } from "react-intl"; import { ActionIcon, Badge, Flex, Grid, MediaQuery, Title, Tooltip } from "@mantine/core"; import { IconPlayerPlay } from "@tabler/icons-react"; -import isIntelliJ from "../../../utils/is-intellij"; import isVsCode from "../../../utils/is-vscode"; import PercentageScoreLabel from "../score-label"; import RatingScoreLabel from "../score-label/rating-score-label"; @@ -50,15 +48,6 @@ export default function ApiHeading({ }; revalidateApi(payload); - - if (isIntelliJ()) { - window.cefQuery({ - request: JSON.stringify({ - request: "revalidateApi", - ...payload, - }), - }); - } } }, [definitionPath, name, protocol, revalidateApi]); @@ -88,6 +77,7 @@ export default function ApiHeading({ variant="transparent" onClick={onRevalidateApiClick} loading={apiRevalidationMetadata.loading} + disabled={apiRevalidationMetadata.loading} data-testid={`RevalidateApiButton-${name}`} > diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-tabs/api-tabs.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-tabs/api-tabs.tsx index 7ecebe5..fae069e 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-tabs/api-tabs.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/api-tabs/api-tabs.tsx @@ -3,7 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 import ApiValidation from "../api-validation"; -import getModuleId from "../../utils/get-module-id"; import { useState } from "react"; import { FormattedMessage } from "react-intl"; import AutoSizer from "react-virtualized-auto-sizer"; @@ -13,7 +12,6 @@ import { getRatingLabelColor, getScoreLabelColor } from "../../../utils/get-labe import Feedback from "../../../components/feedback"; import type { ApiIdentifier, - Certification, CertificationPayload, GetApiIdentifier, ModulesMetadata, @@ -110,9 +108,6 @@ export default function ApiTabs name === apiName && apiProtocol === apiSpecType)?.definitionPath ?? ""; - const moduleMetadata = modulesMetadata[getModuleId(api)] ?? { - loading: false, - }; const apiRevalidationMetadata = apisRevalidationMetadata[apiName] ?? { loading: false }; return ( @@ -121,7 +116,7 @@ export default function ApiTabs = { api: Certification; rootPath: CertificationPayload["rootPath"]; definitionPath: string; - moduleMetadata: ModuleMetadata; apiRevalidationMetadata: ModuleMetadata; + modulesMetadata: ModulesMetadata; revalidateModule?: RevalidateModule; revalidateApi?: RevalidateModule; scoreFormat: ScoreFormat; @@ -22,8 +30,8 @@ export default function ApiValidation({ api, definitionPath, rootPath, - moduleMetadata, apiRevalidationMetadata, + modulesMetadata, revalidateModule, revalidateApi, scoreFormat, @@ -44,11 +52,12 @@ export default function ApiValidation({ /> diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/validation/revalidate-module-action.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/validation/revalidate-module-action.tsx index 87cee1f..77752cf 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/validation/revalidate-module-action.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/components/validation/revalidate-module-action.tsx @@ -7,11 +7,7 @@ import { ActionIcon, Tooltip } from "@mantine/core"; import { IconPlayerPlay } from "@tabler/icons-react"; import isVsCode from "../../../utils/is-vscode"; import isIntelliJ from "../../../utils/is-intellij"; -import type { - Certification, - RevalidateModule, - ValidationType, -} from "../../../types"; +import type { Certification, RevalidateModule, ValidationType } from "../../../types"; type RevalidateModuleActionProps = { metadata: Pick; @@ -29,39 +25,24 @@ export default function RevalidateModuleAction({ loading, }: Readonly) { const onRevalidateClick = () => { - if (typeof revalidateModule === "function" && isVsCode()) { - revalidateModule({ - apiName, - apiSpecType: apiProtocol, - validationType, - apiDefinitionPath: definitionPath, - }); - } else if (isIntelliJ()) { - window.cefQuery({ - request: JSON.stringify({ - request: "revalidateModule", - apiName, - apiSpecType: apiProtocol, - validationType, - definitionPath, - }), - }); + if (typeof revalidateModule !== "function") { + return; } + + revalidateModule({ + apiName, + apiSpecType: apiProtocol, + validationType, + apiDefinitionPath: definitionPath, + }); }; - if (!isVsCode()) { + if (!isVsCode() && !isIntelliJ()) { return null; } return ( - - } - > + }> = { + api: Certification; result: Certification["result"]; metadata: Pick; rootPath: CertificationPayload["rootPath"]; + modulesMetadata: ModulesMetadata; definitionPath: string; - moduleMetadata: ModuleMetadata; revalidateModule?: RevalidateModule; scoreFormat: ScoreFormat; }; export default function Validation({ + api, result, metadata, rootPath = "", definitionPath, - moduleMetadata, + modulesMetadata, revalidateModule, scoreFormat, }: Readonly>) { @@ -61,6 +64,9 @@ export default function Validation({ } const [validation] = validationValues; const { validationType, rating, score } = validation; + const moduleMetadata = modulesMetadata[getModuleId({ ...api, validationType })] ?? { + loading: false, + }; return ( diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-vscode-certification.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-ide-certification.ts similarity index 97% rename from plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-vscode-certification.ts rename to plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-ide-certification.ts index 8aa60be..f3008f2 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-vscode-certification.ts +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/hooks/use-ide-certification.ts @@ -104,6 +104,6 @@ function patchModuleValidation(certificationResult: Certification["result"], mod return nextResult; } -export default function useVSCodeCertification() { +export default function useIdeCertification() { return useReducer | null, CertificationAction>>(reducer, null); } diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/vscode-data-provider.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/ide-data-provider.tsx similarity index 78% rename from plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/vscode-data-provider.tsx rename to plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/ide-data-provider.tsx index 5db4e5c..045d624 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/vscode-data-provider.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/ide-data-provider.tsx @@ -5,28 +5,24 @@ import { useCallback, useEffect, useState } from "react"; import { DataProviderChildFn, ModulesMetadata, SetCertificationResults, SetModuleResults, ModuleValidation, ApiIdentifier } from "../types"; import isIntelliJ from "../utils/is-intellij"; -import { sendMessageVscode } from "../utils/send-message-vscode"; -import useVSCodeCertification from "./hooks/use-vscode-certification"; +import { sendMessageIde } from "../utils/send-message-ide"; +import useIdeCertification from "./hooks/use-ide-certification"; import getModuleId from "./utils/get-module-id"; -export default function VSCodeDataProvider({ - children, -}: { - children: DataProviderChildFn; -}) { - return children(useVSCodeDataProvider()); +export default function IdeProvider({ children }: { children: DataProviderChildFn }) { + return children(useIdeProvider()); } -function useVSCodeDataProvider() { +function useIdeProvider() { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); - const [certification, dispatch] = useVSCodeCertification(); + const [certification, dispatch] = useIdeCertification(); const [apisRevalidationMetadata, setApisRevalidationMetadata] = useState({}); const [modulesMetadata, setModulesMetadata] = useState({}); const onMessageReceived = useCallback( ({ origin, data }: MessageEvent | SetModuleResults>) => { - //origin is vsCode or intelliiJ + // origin is VSCode or IntelliJ if (origin.startsWith("vscode-webview://") || origin === "null") { const { command, payload } = data; if (command === "setCertificationResults") { @@ -42,14 +38,14 @@ function useVSCodeDataProvider() { } = payload; if (validationType === "OVERALL_SCORE") { - // The inconming validation is an API validation. + // The incoming validation is an API validation. setApisRevalidationMetadata((prev) => ({ ...prev, [apiName]: { loading: false }, })); } else { - // The inconming validation is an API module validation. - const moduleId = getModuleId({ apiName, apiProtocol: apiSpecType }); + // The incoming validation is an API module validation. + const moduleId = getModuleId({ apiName, apiProtocol: apiSpecType, validationType }); setModulesMetadata((prev) => ({ ...prev, [moduleId]: { loading: false }, @@ -75,15 +71,15 @@ function useVSCodeDataProvider() { [apiName]: { loading: true }, })); - sendMessageVscode("onClickValidateModule", validationBody); + sendMessageIde("onClickValidateModule", validationBody); }, []); const revalidateModule = useCallback((validationBody: ModuleValidation) => { - const { apiName, apiSpecType } = validationBody; - const moduleId = getModuleId({ apiName, apiProtocol: apiSpecType }); + const { apiName, apiSpecType, validationType } = validationBody; + const moduleId = getModuleId({ apiName, apiProtocol: apiSpecType, validationType }); setModulesMetadata((prev) => ({ ...prev, [moduleId]: { loading: true } })); - sendMessageVscode("onClickValidateModule", validationBody); + sendMessageIde("onClickValidateModule", validationBody); }, []); useEffect(() => { @@ -98,7 +94,7 @@ function useVSCodeDataProvider() { if (!isIntelliJ()) { setLoading(true); } - sendMessageVscode("onProjectLoaded", {}); + sendMessageIde("onProjectLoaded", {}); }, []); return { diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/get-module-id.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/get-module-id.ts index fa75287..542e3b1 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/get-module-id.ts +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/get-module-id.ts @@ -2,8 +2,12 @@ // // SPDX-License-Identifier: Apache-2.0 -import type { ApiIdentifier } from "../../types"; +import type { ApiIdentifier, ValidationType } from "../../types"; -export default function getModuleId({ apiName, apiProtocol }: Pick) { - return `${apiName}-${apiProtocol}`; +export default function getModuleId({ + apiName, + apiProtocol, + validationType, +}: Pick & { validationType: ValidationType }) { + return `${apiName}-${apiProtocol}-${validationType}`; } diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/open-file.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/open-file.ts index a5ff576..15aa58b 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/open-file.ts +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/certification/utils/open-file.ts @@ -2,8 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -import { isIntelliJ, isVsCode } from "../.."; -import { sendMessageVscode } from "../../utils/send-message-vscode"; +import { sendMessageIde } from "../../utils/send-message-ide"; type FileLocation = { startLine?: number; @@ -12,10 +11,7 @@ type FileLocation = { endCharacter?: number; }; -export default function openFile( - filePath: string, - { startLine, startCharacter, endLine, endCharacter }: FileLocation -) { +export default function openFile(filePath: string, { startLine, startCharacter, endLine, endCharacter }: FileLocation) { const infoPosition = { line: startLine, char: startCharacter, @@ -23,15 +19,5 @@ export default function openFile( lastchar: endCharacter, }; - if (isVsCode()) { - sendMessageVscode("onClickOpenFile", { fileName: filePath, infoPosition }); - } else if (isIntelliJ()) { - window.cefQuery({ - request: JSON.stringify({ - request: "onClickOpenFile", - fileName: filePath, - infoPosition, - }), - }); - } + sendMessageIde("onClickOpenFile", { fileName: filePath, infoPosition }); } diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/__tests__/files-page.test.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/__tests__/files-page.test.tsx index 2e23740..87495da 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/__tests__/files-page.test.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/__tests__/files-page.test.tsx @@ -2,17 +2,13 @@ // // SPDX-License-Identifier: Apache-2.0 -import { act, fireEvent, render, screen } from "@testing-library/react"; +import { vi } from "vitest"; +import { act, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { - FileReaderMock, - Providers, - VALIDATION_FILE_RESULT, - createJSONFile, -} from "../../utils/test-utils"; +import { FileReaderMock, Providers, VALIDATION_FILE_RESULT, createJSONFile } from "../../utils/test-utils"; import FilesPage from "../files-page"; -const postMessage = jest.fn(); +const postMessage = vi.fn(); beforeAll(() => { Object.defineProperty(global.window, "parent", { @@ -27,39 +23,36 @@ test("file results are displayed", async () => { const fileReader = new FileReaderMock(); fileReader.result = ""; - jest.spyOn(window, "FileReader").mockImplementation(() => fileReader); + vi.spyOn(window, "FileReader").mockImplementation(() => fileReader); - act(() => { - render(, { wrapper: Providers }); - }); + render(, { wrapper: Providers }); - expect(postMessage).toHaveBeenCalled(); + waitFor(() => { + expect(postMessage).toHaveBeenCalled(); + }); expect(postMessage).toHaveBeenCalledTimes(1); expect(postMessage).toHaveBeenCalledWith( { command: "onFileLoaded", payload: {}, }, - "*" + "*", ); postMessage.mockClear(); - const fileInput = screen - .getByTestId("File") - .querySelector("input") as HTMLInputElement; + const fileInput = screen.getByTestId("File").querySelector("input") as HTMLInputElement; const file = createJSONFile(); await userEvent.upload(fileInput!, file); - expect(fileInput.files?.[0]).toStrictEqual(file); + act(() => { + expect(fileInput.files?.[0]).toStrictEqual(file); + }); - await userEvent.click( - screen.getByRole("searchbox", { name: /Select protocol/ }) - ); + await userEvent.click(screen.getByRole("searchbox", { name: /Select protocol/ })); await userEvent.click(screen.getByRole("option", { name: /gRPC/ })); - - fireEvent.submit(screen.getByRole("button", { name: /submit/ })); + await userEvent.click(screen.getByRole("button", { name: /submit/ })); expect(screen.getByTestId("FilesPage-Loader")).toBeInTheDocument(); @@ -73,7 +66,7 @@ test("file results are displayed", async () => { apiProtocol: "grpc", }, }, - "*" + "*", ); const validationSuccessEvent = new MessageEvent("message", { @@ -85,16 +78,8 @@ test("file results are displayed", async () => { window.dispatchEvent(validationSuccessEvent); }); - expect( - screen.getByTestId( - "Issue-/Users/inditex/path/to/file.json-global-doc-0-0-6-20-0" - ) - ).toBeInTheDocument(); - expect( - screen.getByText( - "Definition `doc` must be present and non-empty string in all types" - ) - ).toBeInTheDocument(); + expect(screen.getByTestId("Issue-/Users/inditex/path/to/file.json-global-doc-0-0-6-20-0")).toBeInTheDocument(); + expect(screen.getByText("Definition `doc` must be present and non-empty string in all types")).toBeInTheDocument(); // Unhappy path const validationErrorEvent = new MessageEvent("message", { diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/components/files-form/files-form.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/components/files-form/files-form.tsx index 8c01d3e..0cf4777 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/components/files-form/files-form.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/components/files-form/files-form.tsx @@ -4,26 +4,14 @@ import { useCallback, useReducer, useState } from "react"; import { FormattedMessage } from "react-intl"; -import { - ActionIcon, - Container, - FileInput, - Grid, - Loader, - Select, - Stack, -} from "@mantine/core"; +import { ActionIcon, Container, FileInput, Grid, Loader, Select, Stack } from "@mantine/core"; import { useForm } from "@mantine/form"; import { IconPlayerPlay, IconUpload } from "@tabler/icons-react"; -import { sendMessageVscode } from "../../../utils/send-message-vscode"; +import { sendMessageIde } from "../../../utils/send-message-ide"; import useEventHandler from "../../../hooks/use-event-handler"; import Feedback from "../../../components/feedback"; import CodeValidation from "../../../components/validation-result/code-validation"; -import type { - CodeIssue, - SetFileResults, - SetFileResultsError, -} from "../../../types"; +import type { CodeIssue, SetFileResults, SetFileResultsError } from "../../../types"; // There is a bug in the latest @matine/core lib that does not include the type for // the placeholder prop. This is a workaround to add the type to the InputSharedProps @@ -83,14 +71,14 @@ export default function FilesForm() { "setFileResults", useCallback((payload) => { dispatch({ type: "success", payload }); - }, []) + }, []), ); useEventHandler( "setFileResultsError", useCallback((payload) => { dispatch({ type: "error", payload }); - }, []) + }, []), ); function onSubmit({ file, ...restValues }: NonNullable) { @@ -99,7 +87,7 @@ export default function FilesForm() { if (typeof file !== "string" && file instanceof File) { const { path: filePath } = file; setSelectedFilePath(filePath); - sendMessageVscode("onClickValidateFile", { + sendMessageIde("onClickValidateFile", { filePath: filePath, ...restValues, }); @@ -138,35 +126,19 @@ export default function FilesForm() { - + - {error && ( - - )} + {error && } {loading && } {!loading && fileResults?.results && ( - + )} diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/files-page.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/files-page.tsx index 11e6c02..559dfab 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/files-page.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/files/files-page.tsx @@ -4,12 +4,11 @@ import { useEffect } from "react"; import FilesForm from "./components/files-form"; -import { sendMessageVscode } from "../utils/send-message-vscode"; -import { useMantineTheme } from "@mantine/core"; +import { sendMessageIde } from "../utils/send-message-ide"; export default function FilesPage() { useEffect(() => { - sendMessageVscode("onFileLoaded", {}); + sendMessageIde("onFileLoaded", {}); }, []); return ( diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/index.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/index.tsx index 0e99024..e9f1e2b 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/index.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/index.tsx @@ -4,14 +4,23 @@ export { default as CertificationPage } from "./certification"; export { default as CodeValidation } from "./components/validation-result/code-validation"; -export { default as VSCodeDataProvider } from "./certification/vscode-data-provider"; +export { default as IdeProvider } from "./certification/ide-data-provider"; export { default as FilesPage } from "./files"; -export { default as useVSCodeCertification } from "./certification/hooks/use-vscode-certification"; +export { default as useIdeCertification } from "./certification/hooks/use-ide-certification"; export { default as getModuleId } from "./certification/utils/get-module-id"; export { default as isIntelliJ } from "./utils/is-intellij"; export { default as isVsCode } from "./utils/is-vscode"; -export { sendMessageVscode } from "./utils/send-message-vscode"; +export { sendMessageIde, sendMessageVscode, sendMessageIntelliJ } from "./utils/send-message-ide"; export { theme } from "./theme"; export { default as messages } from "./locales"; export * from "./types"; export type * from "../declaration"; + +/** + * @deprecated Use IdeProvider instead + */ +export { default as VSCodeDataProvider } from "./certification/ide-data-provider"; +/** + * @deprecated Use useIdeCertification instead + */ +export { default as useVSCodeCertification } from "./certification/hooks/use-ide-certification"; diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-vscode.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-ide.ts similarity index 60% rename from plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-vscode.ts rename to plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-ide.ts index eecf85c..1752aad 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-vscode.ts +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/send-message-ide.ts @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { VSCodeMessage } from "../types"; +import isIntelliJ from "./is-intellij"; function tryAcquireVsCodeApi() { try { @@ -21,6 +22,36 @@ function tryAcquireVsCodeApi() { // changes between executions. const getPostMessageOrigin = () => "*"; +const intelliJCommands = new Map([ + ["onClickValidateModule", "revalidateModule"], + ["onClickOpenFile", "onClickOpenFile"], + ["onProjectLoaded", null], + ["onFileLoaded", null], + ["onClickValidateFile", null], +]); + +export function sendMessageIde(command: string, message: VSCodeMessage) { + if (isIntelliJ()) { + sendMessageIntelliJ(command, message); + return; + } + + sendMessageVscode(command, message); +} + +export function sendMessageIntelliJ(command: string, message: VSCodeMessage) { + const intelliJCommand = intelliJCommands.get(command); + if (!intelliJCommand) { + return; + } + window.cefQuery({ + request: JSON.stringify({ + request: intelliJCommand, + ...message, + }), + }); +} + export function sendMessageVscode(command: string, message: VSCodeMessage) { const vscode = tryAcquireVsCodeApi(); const payload = message; diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/test-utils.tsx b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/test-utils.tsx index 1caa9da..9f7e606 100644 --- a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/test-utils.tsx +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/src/utils/test-utils.tsx @@ -4,14 +4,11 @@ import { type ReactNode } from "react"; import { IntlProvider } from "react-intl"; +import { vi } from "vitest"; import { MantineProvider } from "@mantine/core"; import { theme } from "../theme"; import messages from "../locales"; -import { - type CertificationPayload, - type ModulePayload, - Severity, -} from "../types"; +import { type CertificationPayload, type ModulePayload, ProtocolType, Severity } from "../types"; export function Providers({ children }: { children?: ReactNode }) { return ( @@ -37,7 +34,12 @@ const API_SAMPLE_FILENAME = "hub/v3/openapi-rest.yml"; const CAMEL_CASE_FOR_PROPERTIES_CODE = "camel-case-for-properties"; const CAMEL_CASE_FOR_PROPERTIES_MESSAGE = "Property name has to be camelCase"; -export const CERTS_PAYLOAD: CertificationPayload = { +type ApiIdentifier = { + apiName: string; + apiProtocol: ProtocolType; +}; + +export const CERTS_PAYLOAD: CertificationPayload = { metadata: { apis: [ { @@ -66,13 +68,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: "first-pass-lint-error", message: "This error is only on first pass", - path: [ - "components", - "schemas", - "ApiVersionDTO", - "properties", - "definitionURL", - ], + path: ["components", "schemas", "ApiVersionDTO", "properties", "definitionURL"], severity: 1, source: API_SAMPLE_SOURCE, range: { @@ -90,13 +86,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: CAMEL_CASE_FOR_PROPERTIES_CODE, message: CAMEL_CASE_FOR_PROPERTIES_MESSAGE, - path: [ - "components", - "schemas", - "ApiVersionDTO", - "properties", - "artifactURL", - ], + path: ["components", "schemas", "ApiVersionDTO", "properties", "artifactURL"], severity: 1, source: API_SAMPLE_SOURCE, range: { @@ -114,13 +104,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: "ensure-properties-examples", message: "branch doesn't have an example", - path: [ - "components", - "schemas", - "ApiRepository", - "properties", - "branch", - ], + path: ["components", "schemas", "ApiRepository", "properties", "branch"], severity: 1, source: "/apicollections/rest/openapi-rest.yml", range: { @@ -189,14 +173,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: "numeric-required-properties-format", message: '"schema.format" property must be defined', - path: [ - "paths", - "/reports/notificationsList", - "get", - "parameters", - "0", - "schema", - ], + path: ["paths", "/reports/notificationsList", "get", "parameters", "0", "schema"], severity: 1, source: API_SAMPLE_SOURCE, range: { @@ -229,8 +206,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { lineNumber: 7, ruleNames: ["MD034", "no-bare-urls"], ruleDescription: "Bare URL used", - ruleInformation: - "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md034", + ruleInformation: "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md034", errorDetail: null, errorContext: "https://www.example.com/", errorRange: [27, 24], @@ -259,13 +235,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: "js-properties-should-be-camel-case", message: "JS Property name has to be camelCase", - path: [ - "components", - "schemas", - "ArtifactDTO", - "properties", - "URL", - ], + path: ["components", "schemas", "ArtifactDTO", "properties", "URL"], severity: 1, source: "apis/portal/operations/openapi-rest.yml", range: { @@ -283,13 +253,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { code: CAMEL_CASE_FOR_PROPERTIES_CODE, message: CAMEL_CASE_FOR_PROPERTIES_MESSAGE, - path: [ - "components", - "schemas", - "ApiDTO", - "properties", - "definitionURL", - ], + path: ["components", "schemas", "ApiDTO", "properties", "definitionURL"], severity: 1, source: "apis/portal/operations/openapi-rest.yml", range: { @@ -325,8 +289,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { { line: 33, column: 3, - message: - 'EnumField name "ADJUSTMENT_UNSPECIFIED" should have the prefix "ADJUSTMENT_TYPE"', + message: 'EnumField name "ADJUSTMENT_UNSPECIFIED" should have the prefix "ADJUSTMENT_TYPE"', rule: "ENUM_FIELD_NAMES_PREFIX", fileName: "grpc/example/v1/adjustment.proto", severity: 2, @@ -346,8 +309,7 @@ export const CERTS_PAYLOAD: CertificationPayload = { lineNumber: 13, ruleNames: ["MD009", "no-trailing-spaces"], ruleDescription: "Trailing spaces", - ruleInformation: - "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md009", + ruleInformation: "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md009", errorDetail: "Expected: 0 or 2; Actual: 1", errorContext: null, errorRange: [14, 1], @@ -371,13 +333,7 @@ const lintRevalidationError1 = { code: "new-lint-error-on-revalidation", fileName: "openapi-rest.yml", message: "New lint error while revalidating", - path: [ - "components", - "schemas", - "ApiVersionV2DTO", - "properties", - "definitionURL", - ], + path: ["components", "schemas", "ApiVersionV2DTO", "properties", "definitionURL"], severity: 1 as Severity, source: API_SAMPLE_SOURCE, range: { @@ -396,13 +352,7 @@ const lintRevalidationError2 = { code: "other-kind-of-error", fileName: "openapi-rest.yml", message: CAMEL_CASE_FOR_PROPERTIES_MESSAGE, - path: [ - "components", - "schemas", - "ApiVersionV2DTO", - "properties", - "artifactURL", - ], + path: ["components", "schemas", "ApiVersionV2DTO", "properties", "artifactURL"], severity: 1 as Severity, source: API_SAMPLE_SOURCE, range: { @@ -474,8 +424,7 @@ export const API_VALIDATION_RESULTS: ModulePayload = { lineNumber: 13, ruleNames: ["MD034", "no-bare-urls"], ruleDescription: "No bare urls", - ruleInformation: - "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md0123", + ruleInformation: "https://github.com/DavidAnson/markdownlint/blob/v0.25.1/doc/Rules.md#md0123", errorDetail: "Expected: 0 or 2; Actual: 1", errorContext: null, errorRange: [14, 1], @@ -512,8 +461,7 @@ export const VALIDATION_FILE_RESULT = { results: [ { code: "global-doc", - message: - "Definition `doc` must be present and non-empty string in all types", + message: "Definition `doc` must be present and non-empty string in all types", path: [], severity: 1, source: "/temporal/path/to/file.yml", @@ -538,21 +486,21 @@ export class FileReaderMock { readyState: 0 | 1 | 2 = 0; error: FileReader["error"] = null; result: FileReader["result"] = null; - abort = jest.fn(); - addEventListener = jest.fn(); - dispatchEvent = jest.fn(); - onabort = jest.fn(); - onerror = jest.fn(); - onload = jest.fn(); - onloadend = jest.fn(); - onloadprogress = jest.fn(); - onloadstart = jest.fn(); - onprogress = jest.fn(); - readAsArrayBuffer = jest.fn(); - readAsBinaryString = jest.fn(); + abort = vi.fn(); + addEventListener = vi.fn(); + dispatchEvent = vi.fn(); + onabort = vi.fn(); + onerror = vi.fn(); + onload = vi.fn(); + onloadend = vi.fn(); + onloadprogress = vi.fn(); + onloadstart = vi.fn(); + onprogress = vi.fn(); + readAsArrayBuffer = vi.fn(); + readAsBinaryString = vi.fn(); readAsDataURL = () => { this.onloadend(); }; - readAsText = jest.fn(); - removeEventListener = jest.fn(); + readAsText = vi.fn(); + removeEventListener = vi.fn(); } diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.config.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.config.ts new file mode 100644 index 0000000..7b0ebf4 --- /dev/null +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "jsdom", // Use for browser-like tests + coverage: { + reporter: ["text", "json", "html"], // Optional: Add coverage reports + }, + globals: true, + setupFiles: "./vitest.setup.ts", + }, + resolve: { + conditions: ["development", "browser"], + }, +}); diff --git a/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.setup.ts b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.setup.ts new file mode 100644 index 0000000..9abe420 --- /dev/null +++ b/plugins/spa-apiscoringviewer/packages/apiscoringviewer/vitest.setup.ts @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 Industria de Diseño Textil S.A. INDITEX +// +// SPDX-License-Identifier: Apache-2.0 +import "@testing-library/jest-dom"; +import { vi } from "vitest"; + +window.ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} +}; + +Object.defineProperty(window, "matchMedia", { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), // Deprecated + removeListener: vi.fn(), // Deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), +}); diff --git a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/index.tsx b/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/index.tsx index 7a40cc2..92e92f8 100644 --- a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/index.tsx +++ b/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/index.tsx @@ -7,7 +7,7 @@ import { createRoot } from "react-dom/client"; import { IntlProvider } from "react-intl"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import { MantineProvider } from "@mantine/core"; -import { theme, messages, CertificationPage, VSCodeDataProvider, FilesPage } from "../apiscoringviewer/src"; +import { theme, messages, CertificationPage, IdeProvider, FilesPage } from "../apiscoringviewer/src"; import Layout from "./src/components/layout"; const rootElement = document.getElementById("root")!; @@ -19,7 +19,7 @@ root.render( - } /> + } /> diff --git a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/package.json b/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/package.json index e7852aa..361142e 100644 --- a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/package.json +++ b/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/package.json @@ -8,7 +8,6 @@ "clear:parcel-cache": "rm -rf ./.parcel-cache", "build": "parcel build index.html", "kill-port": "kill-port ${PORT:-1234}", - "test": "jest --config=jest.config.js", "watch": "parcel index.html -p 3000" }, "dependencies": { @@ -24,7 +23,6 @@ }, "devDependencies": { "@babel/core": "^7.12.0", - "@types/jest": "^29.4.0", "@types/node": "^18.15.11", "@types/react-router-dom": "^5.3.3" } diff --git a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/tests/certification-page.test.tsx b/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/tests/certification-page.test.tsx deleted file mode 100644 index 6a8e1a6..0000000 --- a/plugins/spa-apiscoringviewer/packages/spa-apiscoringviewer/tests/certification-page.test.tsx +++ /dev/null @@ -1,405 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Industria de Diseño Textil S.A. INDITEX -// -// SPDX-License-Identifier: Apache-2.0 - -import { act, fireEvent, render, screen, within } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { ReactNode } from "react"; -import { - API_VALIDATION_RESULTS, - CERTS_PAYLOAD, - MODULE_RESULTS, - Providers, -} from "../../apiscoringviewer/src/utils/test-utils"; -import VSCodeDataProvider from "../../apiscoringviewer/src/certification/vscode-data-provider"; -import { isVsCode, CertificationPage } from "../../apiscoringviewer/src"; - -jest.mock("../../apiscoringviewer/src", () => ({ - ...jest.requireActual("../../apiscoringviewer/src"), - isVsCode: jest.fn(), -})); -jest.mock("react-router-dom", () => ({ - ...jest.requireActual("react-router-dom"), - useParams: jest.fn(), -})); -jest.mock( - "react-virtualized-auto-sizer", - () => - ({ children }: { children: ({}) => ReactNode }) => - children({ width: "100%", height: "100%" }) -); - -const isVsCodeMock = jest.mocked(isVsCode); - -window.cefQuery = jest.fn(); -const postMessage = jest.fn(); - -beforeAll(() => { - Object.defineProperty(global.window, "parent", { - value: { - postMessage, - }, - writable: true, - }); -}); - -afterEach(() => { - postMessage.mockClear(); -}); - -describe("renders inside IDE", () => { - beforeEach(() => { - isVsCodeMock.mockReturnValue(true); - postMessage.mockReset(); - }); - - test("renders certification", async () => { - act(() => { - render(, { - wrapper: Providers, - }); - }); - - const certificationResultsEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, - }); - - await act(async () => { - window.dispatchEvent(certificationResultsEvent); - }); - - expect(screen.getByRole("tab", { selected: true })).toHaveTextContent( - "API Sample" - ); - expect(screen.getByTestId("ApiTab-API Sample-1")).toBeInTheDocument(); - expect(screen.getByTestId("ApiTab-Other API-1")).toBeInTheDocument(); - - await checkApiSampleContent(); - - const currentTabContainer = within( - screen.getByTestId("ApiValidation-API Sample-1") - ); - - postMessage.mockReset(); - - const revalidateLinterButton = screen.getByTestId( - "RevalidateButton-API Sample-1" - ); - fireEvent.click(revalidateLinterButton); - expect(postMessage).toHaveBeenCalled(); - expect(postMessage).toHaveBeenCalledTimes(1); - expect(postMessage).toHaveBeenCalledWith( - { - command: "onClickValidateModule", - payload: { - apiDefinitionPath: "portal/v3", - apiName: "API Sample", - apiSpecType: 1, - validationType: 1, - }, - }, - "*" - ); - - // Run compile - postMessage.mockReset(); - const lintListItem = screen.getByTestId( - "Issue-apis/example/v3/openapi-rest.yml-first-pass-lint-error-4527-22-4532-58-0" - ); - fireEvent.click(lintListItem); - expect(postMessage).toBeCalled(); - expect(postMessage).toBeCalledTimes(1); - expect(postMessage).toBeCalledWith( - { - command: "onClickOpenFile", - payload: { - fileName: - "/some/user/p/app-apiposvc/apis/portal/v3/apis/example/v3/openapi-rest.yml", - infoPosition: { char: 22, lastLine: 4532, lastchar: 58, line: 4527 }, - }, - }, - "*" - ); - - // Revalidate the module - const moduleResultsEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { command: "setModuleResults", payload: MODULE_RESULTS }, - }); - - await act(async () => { - window.dispatchEvent(moduleResultsEvent); - }); - - // screen.debug(); - // Overall rating info is no longer rendered - expect( - screen.queryByTestId("ApiHeading-Score-API Sample-1") - ).not.toBeInTheDocument(); - - // New errors are displayed - expect( - currentTabContainer.getByText("new-lint-error-on-revalidation") - ).toBeInTheDocument(); - expect( - currentTabContainer.getByText("New lint error while revalidating") - ).toBeInTheDocument(); - - // Check that apiDefinitionPath was updated from the one in MODULE_RESULTS - postMessage.mockReset(); - const lintListItem2 = screen.getByTestId( - "Issue-apis/example/v3/openapi-rest.yml-new-lint-error-on-revalidation-3755-22-3760-26-0" - ); - fireEvent.click(lintListItem2); - expect(postMessage).toBeCalled(); - expect(postMessage).toBeCalledTimes(1); - expect(postMessage).toBeCalledWith( - { - command: "onClickOpenFile", - payload: { - fileName: - "/some/user/p/app-apiposvc/apis/different/apis/route/portal/v3/apis/example/v3/openapi-rest.yml", - infoPosition: { char: 22, lastLine: 3760, lastchar: 26, line: 3755 }, - }, - }, - "*" - ); - - // When the tab is changed the content is reload accondingly - const secondTab = screen.getByRole("tab", { selected: false }); - expect(secondTab).toHaveTextContent("Other API"); - fireEvent.click(secondTab); - - const secondTabContainer = within( - screen.getByTestId("ApiValidation-Other API-1") - ); - - // When the errored tab is not selected, then is when the error icon is shown. - // expect(apiPortalTab.getElementsByClassName("icoErrorTab")).toHaveLength(1); - expect( - secondTabContainer.getByText("js-properties-should-be-camel-case") - ).toBeInTheDocument(); - - postMessage.mockReset(); - const docListItem = screen.getByTestId( - "Issue-MIGRATION.md-13-MD009-no-trailing-spaces" - ); - fireEvent.click(docListItem); - - expect(postMessage).toBeCalled(); - expect(postMessage).toBeCalledTimes(1); - expect(postMessage).toBeCalledWith( - { - command: "onClickOpenFile", - payload: { - fileName: "/some/user/p/app-apiposvc/apis/MIGRATION.md", - infoPosition: { - char: 14, - lastLine: undefined, - lastchar: undefined, - line: 13, - }, - }, - }, - "*" - ); - }); - - test("api validation results are updated", async () => { - act(() => { - render(, { - wrapper: Providers, - }); - }); - - const certificationResultsEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, - }); - - act(() => { - window.dispatchEvent(certificationResultsEvent); - }); - - expect(postMessage).toBeCalled(); - expect(postMessage).toBeCalledTimes(1); - expect(postMessage).toBeCalledWith( - { - command: "onProjectLoaded", - payload: {}, - }, - "*" - ); - - postMessage.mockReset(); - - const revalidateApiButton = screen.getByTestId( - "RevalidateApiButton-API Sample" - ); - await userEvent.click(revalidateApiButton); - - expect(postMessage).toBeCalled(); - expect(postMessage).toBeCalledTimes(1); - expect(postMessage).toBeCalledWith( - { - command: "onClickValidateModule", - payload: { - apiDefinitionPath: "portal/v3", - apiName: "API Sample", - apiSpecType: 1, - validationType: 4, - }, - }, - "*" - ); - - expect(revalidateApiButton).toHaveAttribute("data-loading", "true"); - - const apiResultsEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { command: "setModuleResults", payload: API_VALIDATION_RESULTS }, - }); - - act(() => { - window.dispatchEvent(apiResultsEvent); - }); - - expect( - screen.getByText(/You have to fix some errors to improve/i) - ).toBeInTheDocument(); - - // New errors are displayed - const tabContainer = within( - await screen.findByTestId("ApiValidation-API Sample-1") - ); - const designValidationResult = - tabContainer.getByTestId("ValidationResult-1"); - expect( - within(designValidationResult).getByText("new-lint-error-on-revalidation") - ).toBeInTheDocument(); - expect( - within(designValidationResult).getByText( - "New lint error while revalidating" - ) - ).toBeInTheDocument(); - - const securityValidationResult = - tabContainer.getByTestId("ValidationResult-3"); - expect( - within(securityValidationResult).getByTestId( - "ProtoValidation-grpc/example/v1/adjustment.proto-array-required-properties-33-3-0" - ) - ).toBeInTheDocument(); - - const documentationValidationResult = - tabContainer.getByTestId("ValidationResult-2"); - expect( - within(documentationValidationResult).getByTestId( - "Issue-README.md-13-MD034-no-bare-urls" - ) - ).toBeInTheDocument(); - }); - - test("revalidation module error is displayed and reseted", async () => { - act(() => { - render(, { - wrapper: Providers, - }); - }); - - const certificationResultsEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { command: "setCertificationResults", payload: CERTS_PAYLOAD }, - }); - - act(() => { - window.dispatchEvent(certificationResultsEvent); - }); - - const runLintingButton = screen.getByTestId( - "RevalidateButton-API Sample-1" - ); - await userEvent.click(runLintingButton); - - expect(runLintingButton).toHaveAttribute("data-loading", "true"); - - const extensionErrorEvent = new MessageEvent("message", { - origin: "vscode-webview://", - data: { - command: "throwExtensionError", - payload: { name: "Some error", message: "Something wrong happened!" }, - }, - }); - - act(() => { - window.dispatchEvent(extensionErrorEvent); - }); - - expect( - screen.queryByTestId("CertificationPage-NetworkError") - ).toBeInTheDocument(); - expect(runLintingButton).not.toHaveAttribute("data-loading", "true"); - }); -}); - -async function checkApiSampleContent() { - const tabContainer = within( - await screen.findByTestId("ApiValidation-API Sample-1") - ); - - expect(screen.getByTestId("ApiHeading-Badge-API Sample-1")).toHaveTextContent( - "REST" - ); - expect(screen.getByTestId("ApiHeading-Score-API Sample-1")).toHaveTextContent( - "D" - ); - - expect( - tabContainer.getByTestId("AccordionControlTitle-1") - ).toBeInTheDocument(); - expect( - tabContainer.getByTestId("AccordionControlTitle-3") - ).toBeInTheDocument(); - expect( - tabContainer.getByTestId("AccordionControlTitle-2") - ).toBeInTheDocument(); - - expect(tabContainer.getByTestId("ScoreLabel-1")).toHaveTextContent("C"); - expect(tabContainer.getByTestId("ScoreLabel-3")).toHaveTextContent("A+"); - expect(tabContainer.getByTestId("ScoreLabel-2")).toHaveTextContent("A"); - - const designValidationResult = tabContainer.getByTestId("ValidationResult-1"); - expect( - within(designValidationResult).getByText("This error is only on first pass") - ).toBeInTheDocument(); - expect( - within(designValidationResult).getByText( - "Property name has to be camelCase" - ) - ).toBeInTheDocument(); - - const securityValidationResult = - tabContainer.getByTestId("ValidationResult-3"); - expect( - within(securityValidationResult).getByText( - "Global 'security' field is not defined" - ) - ).toBeInTheDocument(); - expect( - within(securityValidationResult).getByText( - "Server objects should support https" - ) - ).toBeInTheDocument(); - expect( - within(securityValidationResult).getByText( - '"schema.format" property must be defined' - ) - ).toBeInTheDocument(); - - const documentationValidationResult = - tabContainer.getByTestId("ValidationResult-2"); - expect( - within(documentationValidationResult).getByText("Bare URL used") - ).toBeInTheDocument(); -} diff --git a/plugins/spa-apiscoringviewer/pnpm-lock.yaml b/plugins/spa-apiscoringviewer/pnpm-lock.yaml index d29a477..3c1b31b 100644 --- a/plugins/spa-apiscoringviewer/pnpm-lock.yaml +++ b/plugins/spa-apiscoringviewer/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@parcel/config-default': specifier: ^2.9.3 version: 2.15.4(@parcel/core@2.15.4) @@ -55,8 +52,8 @@ importers: specifier: ^29.5.13 version: 29.5.14 '@types/node': - specifier: ^18.19.55 - version: 18.19.112 + specifier: ^22.15.3 + version: 22.16.0 '@types/react': specifier: ^18.3.11 version: 18.3.23 @@ -78,9 +75,6 @@ importers: eslint: specifier: ^8.57.1 version: 8.57.1 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.112) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -123,9 +117,6 @@ importers: '@tabler/icons-react': specifier: ^2.23.0 version: 2.47.0(react@18.3.1) - '@testing-library/jest-dom': - specifier: ^5.16.5 - version: 5.17.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -145,6 +136,12 @@ importers: '@babel/core': specifier: ^7.12.0 version: 7.27.4 + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7)(@types/react@18.3.23)(react-dom@18.3.1)(react@18.3.1) '@types/lodash': specifier: ^4.14.195 version: 4.17.18 @@ -163,6 +160,9 @@ importers: eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.2(eslint@8.57.1) + jsdom: + specifier: ^26.1.0 + version: 26.1.0 react: specifier: ^18 version: 18.3.1 @@ -172,6 +172,9 @@ importers: type-fest: specifier: ^3.12.0 version: 3.13.1 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.16.0)(jsdom@26.1.0) packages/spa-apiscoringviewer: dependencies: @@ -206,9 +209,6 @@ importers: '@babel/core': specifier: ^7.12.0 version: 7.27.4 - '@types/jest': - specifier: ^29.4.0 - version: 29.5.14 '@types/node': specifier: ^18.15.11 version: 18.19.112 @@ -220,6 +220,7 @@ packages: /@adobe/css-tools@4.4.3: resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + dev: true /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} @@ -228,6 +229,16 @@ packages: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + /@asamuzakjp/css-color@3.2.0: + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + dev: true + /@babel/code-frame@7.27.1: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -528,6 +539,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -536,6 +548,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -544,6 +557,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -553,6 +567,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4): resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} @@ -572,6 +587,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -580,6 +596,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -588,6 +605,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4): resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} @@ -597,6 +615,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -605,6 +624,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -613,6 +633,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -621,6 +642,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -629,6 +651,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -637,6 +660,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -645,6 +669,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -654,6 +679,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -663,6 +689,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4): resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} @@ -672,6 +699,7 @@ packages: dependencies: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + dev: true /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -1444,7 +1472,6 @@ packages: /@babel/runtime@7.27.6: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - dev: false /@babel/template@7.27.2: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} @@ -1479,6 +1506,49 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@csstools/color-helpers@5.0.2: + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + dev: true + + /@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + dev: true + + /@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + dev: true + + /@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4): + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + dependencies: + '@csstools/css-tokenizer': 3.0.4 + dev: true + + /@csstools/css-tokenizer@3.0.4: + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + dev: true + /@emotion/babel-plugin@11.13.5: resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} dependencies: @@ -1572,6 +1642,231 @@ packages: resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} dev: false + /@esbuild/aix-ppc64@0.25.5: + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.25.5: + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.25.5: + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.25.5: + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.25.5: + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.25.5: + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.25.5: + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.25.5: + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.25.5: + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.25.5: + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.25.5: + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.25.5: + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.25.5: + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.25.5: + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.25.5: + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.25.5: + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.25.5: + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.5: + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.25.5: + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.5: + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.25.5: + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.25.5: + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.25.5: + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.25.5: + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.25.5: + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.7.0(eslint@8.57.1): resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1750,17 +2045,19 @@ packages: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 + dev: true /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + dev: true /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -1781,14 +2078,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.112) + jest-config: 29.7.0(@types/node@22.16.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1816,14 +2113,16 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-mock: 29.7.0 + dev: true /@jest/expect-utils@29.7.0: resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 + dev: true /@jest/expect@29.7.0: resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} @@ -1833,6 +2132,7 @@ packages: jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + dev: true /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} @@ -1840,10 +2140,11 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 + dev: true /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} @@ -1855,6 +2156,7 @@ packages: jest-mock: 29.7.0 transitivePeerDependencies: - supports-color + dev: true /@jest/reporters@29.7.0: resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} @@ -1871,7 +2173,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -1898,6 +2200,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 + dev: true /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} @@ -1949,6 +2252,7 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color + dev: true /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} @@ -1957,9 +2261,10 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.112 + '@types/node': 22.16.0 '@types/yargs': 17.0.33 chalk: 4.1.2 + dev: true /@jridgewell/gen-mapping@0.3.8: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} @@ -3361,8 +3666,169 @@ packages: rollup: 2.79.2 dev: false + /@rollup/rollup-android-arm-eabi@4.44.1: + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.44.1: + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.44.1: + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.44.1: + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.44.1: + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.44.1: + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.44.1: + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.44.1: + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.44.1: + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.44.1: + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.44.1: + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.44.1: + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.44.1: + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-musl@4.44.1: + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.44.1: + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.44.1: + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.44.1: + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.44.1: + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.44.1: + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.44.1: + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true /@sindresorhus/slugify@2.2.1: resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} @@ -3383,11 +3849,13 @@ packages: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 + dev: true /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.1 + dev: true /@swc/core-darwin-arm64@1.12.5: resolution: {integrity: sha512-3WF+naP/qkt5flrTfJr+p07b522JcixKvIivM7FgvllA6LjJxf+pheoILrTS8IwrNAK/XtHfKWYcGY+3eaA4mA==} @@ -3532,7 +4000,6 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: false /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} @@ -3548,21 +4015,6 @@ packages: pretty-format: 27.5.1 dev: false - /@testing-library/jest-dom@5.17.0: - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} - dependencies: - '@adobe/css-tools': 4.4.3 - '@babel/runtime': 7.27.6 - '@types/testing-library__jest-dom': 5.14.9 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 - lodash: 4.17.21 - redent: 3.0.0 - dev: false - /@testing-library/jest-dom@6.6.3: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -3592,6 +4044,29 @@ packages: - '@types/react' dev: false + /@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7)(@types/react@18.3.23)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.27.6 + '@testing-library/dom': 10.4.0 + '@types/react': 18.3.23 + '@types/react-dom': 18.3.7(@types/react@18.3.23) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: true + /@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0): resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} @@ -3608,7 +4083,6 @@ packages: /@types/aria-query@5.0.4: resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: false /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3639,18 +4113,28 @@ packages: '@babel/types': 7.27.6 dev: true + /@types/chai@5.2.2: + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + dependencies: + '@types/deep-eql': 4.0.2 + dev: true + + /@types/deep-eql@4.0.2: + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + dev: true + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: false /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: false /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 18.19.112 + '@types/node': 22.16.0 + dev: true /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} @@ -3665,27 +4149,31 @@ packages: /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true /@types/istanbul-lib-report@3.0.3: resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} dependencies: '@types/istanbul-lib-coverage': 2.0.6 + dev: true /@types/istanbul-reports@3.0.4: resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: '@types/istanbul-lib-report': 3.0.3 + dev: true /@types/jest@29.5.14: resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 + dev: true /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.19.112 + '@types/node': 22.16.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 dev: true @@ -3702,6 +4190,12 @@ packages: resolution: {integrity: sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog==} dependencies: undici-types: 5.26.5 + dev: true + + /@types/node@22.16.0: + resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} + dependencies: + undici-types: 6.21.0 /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3741,7 +4235,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.19.112 + '@types/node': 22.16.0 dev: false /@types/semver@7.7.0: @@ -3750,11 +4244,13 @@ packages: /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true /@types/testing-library__jest-dom@5.14.9: resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} dependencies: '@types/jest': 29.5.14 + dev: true /@types/tough-cookie@4.0.5: resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -3762,11 +4258,13 @@ packages: /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true /@types/yargs@17.0.33: resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} dependencies: '@types/yargs-parser': 21.0.3 + dev: true /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.8.3): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} @@ -3904,6 +4402,69 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} dev: true + /@vitest/expect@3.2.4: + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + tinyrainbow: 2.0.0 + dev: true + + /@vitest/mocker@3.2.4(vite@7.0.2): + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 7.0.2(@types/node@22.16.0) + dev: true + + /@vitest/pretty-format@3.2.4: + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + dependencies: + tinyrainbow: 2.0.0 + dev: true + + /@vitest/runner@3.2.4: + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + dev: true + + /@vitest/snapshot@3.2.4: + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + dev: true + + /@vitest/spy@3.2.4: + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + dependencies: + tinyspy: 4.0.3 + dev: true + + /@vitest/utils@3.2.4: + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + dev: true + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -3945,6 +4506,11 @@ packages: - supports-color dev: true + /agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -3993,11 +4559,13 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 + dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -4019,11 +4587,11 @@ packages: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 - dev: false /aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + dev: true /arr-diff@2.0.0: resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} @@ -4070,6 +4638,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -4134,6 +4707,7 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color + dev: true /babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} @@ -4211,6 +4785,7 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + dev: true /babel-preset-jest@29.6.3(@babel/core@7.27.4): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -4330,6 +4905,7 @@ packages: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 + dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -4339,6 +4915,11 @@ packages: engines: {node: '>=6'} dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -4386,6 +4967,7 @@ packages: /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + dev: true /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} @@ -4395,12 +4977,24 @@ packages: /caniuse-lite@1.0.30001724: resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.4 + pathval: 2.0.1 + dev: true + /chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -4414,6 +5008,11 @@ packages: engines: {node: '>=10'} dev: true + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + /chokidar@1.7.0: resolution: {integrity: sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==} dependencies: @@ -4598,7 +5197,7 @@ packages: - supports-color dev: true - /create-jest@29.7.0(@types/node@18.19.112): + /create-jest@29.7.0(@types/node@22.16.0): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4607,7 +5206,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.112) + jest-config: 29.7.0(@types/node@22.16.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -4628,6 +5227,7 @@ packages: /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} @@ -4644,6 +5244,14 @@ packages: cssom: 0.3.8 dev: true + /cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + dev: true + /csstype@3.0.9: resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} dev: false @@ -4660,6 +5268,14 @@ packages: whatwg-url: 11.0.0 dev: true + /data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + dev: true + /dataloader@2.2.3: resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} dev: false @@ -4704,6 +5320,11 @@ packages: optional: true dev: true + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + /deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -4784,7 +5405,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: false /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} @@ -4812,6 +5432,7 @@ packages: /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -4829,7 +5450,6 @@ packages: /dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: false /dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} @@ -4966,6 +5586,10 @@ packages: stop-iteration-iterator: 1.1.0 dev: false + /es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + dev: true + /es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -4982,6 +5606,39 @@ packages: hasown: 2.0.2 dev: true + /esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + dev: true + /escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4989,6 +5646,7 @@ packages: /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + dev: true /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -5101,6 +5759,7 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + dev: true /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -5129,6 +5788,12 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: false + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.8 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -5183,6 +5848,11 @@ packages: fill-range: 2.2.4 dev: true + /expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + dev: true + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5192,6 +5862,7 @@ packages: jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 + dev: true /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -5250,6 +5921,7 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -5264,6 +5936,18 @@ packages: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 + dev: true + + /fdir@6.4.6(picomatch@4.0.2): + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -5330,6 +6014,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -5460,6 +6145,7 @@ packages: /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + dev: true /get-port@4.2.0: resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} @@ -5649,6 +6335,13 @@ packages: whatwg-encoding: 2.0.0 dev: true + /html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + dependencies: + whatwg-encoding: 3.1.1 + dev: true + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -5708,6 +6401,16 @@ packages: - supports-color dev: true + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -5718,6 +6421,16 @@ packages: - supports-color dev: true + /https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -5760,10 +6473,12 @@ packages: /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + dev: true /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -6110,6 +6825,7 @@ packages: /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + dev: true /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} @@ -6122,6 +6838,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true /istanbul-lib-instrument@6.0.3: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} @@ -6192,7 +6909,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -6213,7 +6930,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@18.19.112): + /jest-cli@29.7.0(@types/node@22.16.0): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6227,10 +6944,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.112) + create-jest: 29.7.0(@types/node@22.16.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.112) + jest-config: 29.7.0(@types/node@22.16.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6241,7 +6958,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.19.112): + /jest-config@29.7.0(@types/node@22.16.0): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6256,7 +6973,7 @@ packages: '@babel/core': 7.27.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 babel-jest: 29.7.0(@babel/core@7.27.4) chalk: 4.1.2 ci-info: 3.9.0 @@ -6289,6 +7006,7 @@ packages: diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} @@ -6321,7 +7039,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -6338,7 +7056,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -6346,6 +7064,7 @@ packages: /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true /jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} @@ -6353,7 +7072,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.112 + '@types/node': 22.16.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -6364,6 +7083,7 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 + dev: true /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} @@ -6381,6 +7101,7 @@ packages: jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true /jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} @@ -6395,14 +7116,16 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 + dev: true /jest-mock@29.7.0: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-util: 29.7.0 + dev: true /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} @@ -6419,6 +7142,7 @@ packages: /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} @@ -6454,7 +7178,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6485,7 +7209,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -6530,17 +7254,19 @@ packages: semver: 7.7.2 transitivePeerDependencies: - supports-color + dev: true /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 + dev: true /jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} @@ -6560,7 +7286,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.112 + '@types/node': 22.16.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6572,7 +7298,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.19.112 + '@types/node': 22.16.0 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -6581,12 +7307,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.19.112 + '@types/node': 22.16.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 + dev: true - /jest@29.7.0(@types/node@18.19.112): + /jest@29.7.0(@types/node@22.16.0): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6599,7 +7326,7 @@ packages: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.112) + jest-cli: 29.7.0(@types/node@22.16.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6610,12 +7337,17 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 + dev: true /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -6664,6 +7396,41 @@ packages: - utf-8-validate dev: true + /jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.5.0 + 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.20 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.2 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -6882,6 +7649,7 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -6911,6 +7679,14 @@ packages: dependencies: js-tokens: 4.0.0 + /loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -6919,7 +7695,6 @@ packages: /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - dev: false /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -6931,7 +7706,6 @@ packages: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - dev: false /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -6948,6 +7722,7 @@ packages: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 + dev: true /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -7043,6 +7818,7 @@ packages: /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7115,6 +7891,12 @@ packages: dev: true optional: true + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -7136,6 +7918,7 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -7159,6 +7942,7 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true /node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -7307,6 +8091,7 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: true /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -7319,6 +8104,7 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -7330,6 +8116,7 @@ packages: /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + dev: true /parcel@2.15.4: resolution: {integrity: sha512-eZHQ/omuQ7yBYB9XezyzSqhc826oy/uhloCNiej1CTZ+twAqJVtp4MRvTGMcivKhE+WE8QkYD5XkJHLLQsJQcg==} @@ -7394,6 +8181,7 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -7417,6 +8205,15 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: true + + /pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + dev: true + /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -7424,6 +8221,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + /pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -7448,6 +8250,15 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + /postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: true + /posthtml-parser@0.11.0: resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} engines: {node: '>=12'} @@ -7493,7 +8304,6 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: false /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} @@ -7502,6 +8312,7 @@ packages: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 + dev: true /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7620,10 +8431,10 @@ packages: /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false /react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true /react-refresh@0.16.0: resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} @@ -7771,6 +8582,7 @@ packages: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 + dev: true /regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} @@ -7931,6 +8743,40 @@ packages: fsevents: 2.3.3 dev: false + /rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 + fsevents: 2.3.3 + dev: true + + /rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -8076,8 +8922,13 @@ packages: side-channel-weakmap: 1.0.2 dev: false + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -8119,6 +8970,11 @@ packages: - supports-color dev: true + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated @@ -8171,12 +9027,18 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} @@ -8186,6 +9048,10 @@ packages: object-copy: 0.1.0 dev: true + /std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + dev: true + /stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -8238,12 +9104,19 @@ packages: engines: {node: '>=8'} dependencies: min-indent: 1.0.1 + dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true + /strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + dependencies: + js-tokens: 9.0.1 + dev: true + /stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false @@ -8265,6 +9138,7 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -8301,6 +9175,7 @@ packages: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + dev: true /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -8314,8 +9189,51 @@ packages: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + dev: true + + /tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + dev: true + + /tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + dependencies: + tldts-core: 6.1.86 + dev: true + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} @@ -8358,6 +9276,13 @@ packages: url-parse: 1.5.10 dev: true + /tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + dependencies: + tldts: 6.1.86 + dev: true + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -8365,6 +9290,13 @@ packages: punycode: 2.3.1 dev: true + /tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + dependencies: + punycode: 2.3.1 + dev: true + /ts-api-utils@1.4.3(typescript@5.8.3): resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -8405,7 +9337,7 @@ packages: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.112) + jest: 29.7.0(@types/node@22.16.0) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -8428,6 +9360,7 @@ packages: /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + dev: true /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -8455,6 +9388,10 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} /unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -8636,6 +9573,150 @@ packages: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} dev: false + /vite-node@3.2.4(@types/node@22.16.0): + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.2(@types/node@22.16.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /vite@7.0.2(@types/node@22.16.0): + resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.16.0 + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@3.2.4(@types/node@22.16.0)(jsdom@26.1.0): + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 5.2.2 + '@types/node': 22.16.0 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.2) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + jsdom: 26.1.0 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.2(@types/node@22.16.0) + vite-node: 3.2.4(@types/node@22.16.0) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -8643,10 +9724,18 @@ packages: xml-name-validator: 4.0.0 dev: true + /w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + dependencies: + xml-name-validator: 5.0.0 + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 + dev: true /weak-lru-cache@1.2.2: resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} @@ -8663,11 +9752,23 @@ packages: iconv-lite: 0.6.3 dev: true + /whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + dependencies: + iconv-lite: 0.6.3 + dev: true + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true + /whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + dev: true + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} @@ -8676,6 +9777,14 @@ packages: webidl-conversions: 7.0.0 dev: true + /whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + dev: true + /which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -8718,6 +9827,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -8741,6 +9859,7 @@ packages: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: true /ws@8.18.2: resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} @@ -8760,6 +9879,11 @@ packages: engines: {node: '>=12'} dev: true + /xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + dev: true + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true diff --git a/plugins/spa-apiscoringviewer/tsconfig.json b/plugins/spa-apiscoringviewer/tsconfig.json index c8869a0..a8c0f0e 100644 --- a/plugins/spa-apiscoringviewer/tsconfig.json +++ b/plugins/spa-apiscoringviewer/tsconfig.json @@ -11,12 +11,8 @@ "esModuleInterop": true, "isolatedModules": true, "typeRoots": ["node_modules/@types"], - "types": ["node", "jest", "testing-library__jest-dom"] + "types": ["node", "@testing-library/jest-dom"] }, "exclude": ["node_modules"], - "include": [ - "packages/**/*.ts", - "packages/**/*.tsx", - "packages/apiscoringviewer/declaration.d.ts" - ] + "include": ["packages/**/*.ts", "packages/**/*.tsx", "packages/apiscoringviewer/declaration.d.ts"] }