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"]
}