diff --git a/package.json b/package.json index 971f493..810367a 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "eslint-plugin-sonarjs": "^1.0.3", "globals": "^15.8.0", "semantic-release": "^24.0.0", - "ts-node": "^10.9.2", "tslib": "^2.6.3", "turbo": "^2.0.6", "typedoc": "^0.26.3", diff --git a/packages/core/package.json b/packages/core/package.json index a9b66e9..2afa1d2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -19,7 +19,6 @@ "source": "./src/main.ts", "main": "./dist/main.cjs", "module": "./dist/main.js", - "unpkg": "./dist/main.umd.cjs", "types": "./dist/main.d.ts", "exports": { ".": { @@ -40,11 +39,11 @@ }, "scripts": { "build": "vite build", - "check": "yarn compile && yarn test", + "check": "yarn compile && yarn test --run", "compile": "tsc -p tsconfig.json", "docs": "typedoc", "release": "semantic-release", - "test": "NODE_ENV=test mocha", + "test": "vitest", "test:silent": "DEBUG_PRINT_LIMIT=0 yarn test", "test:verbose": "DEBUG_PRINT_LIMIT=1000000 yarn test" }, @@ -57,17 +56,14 @@ }, "devDependencies": { "@assertive-ts/core": "^2.1.0", + "@assertive-ts/sinon": "^1.0.0", "@testing-library/dom": "^10.3.1", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", - "@types/mocha": "^10.0.7", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/sinon": "^17.0.3", - "expect-type": "^0.19.0", - "jsdom": "^24.1.0", - "jsdom-global": "^3.0.2", - "mocha": "^10.6.0", + "happy-dom": "^14.12.3", "react": "^18.3.1", "react-dom": "^18.3.1", "semantic-release": "^24.0.0", @@ -76,7 +72,8 @@ "tslib": "^2.6.3", "typescript": "^5.5.3", "vite": "^5.3.3", - "vite-plugin-dts": "^3.9.1" + "vite-plugin-dts": "^3.9.1", + "vitest": "^1.6.0" }, "optionalDependencies": { "yup": "^1.4.0", diff --git a/packages/core/test/hooks.ts b/packages/core/test/hooks.ts deleted file mode 100644 index d61d09a..0000000 --- a/packages/core/test/hooks.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Sinon from "sinon"; - -export const mochaHooks: () => Mocha.RootHookObject = () => { - return { - afterEach: () => { - Sinon.restore(); - }, - }; -}; diff --git a/packages/core/test/integration/lib/Form.context.test.ts b/packages/core/test/integration/lib/Form.context.test.ts index 4b50947..227380f 100644 --- a/packages/core/test/integration/lib/Form.context.test.ts +++ b/packages/core/test/integration/lib/Form.context.test.ts @@ -1,11 +1,12 @@ import { expect } from "@assertive-ts/core"; import { renderHook } from "@testing-library/react"; +import { describe, it, suite } from "vitest"; import { useForm, useFormSelector } from "../../../src/lib/Form.context"; -describe("[Integration] Form.context.test.ts", () => { +suite("[Integration] Form.context.test.ts", () => { describe(".useForm", () => { - context("when the hook is rendered", () => { + describe("when the hook is rendered", () => { it("returns the complete Form context", () => { const { result } = renderHook(() => useForm()); const { current } = result; @@ -24,7 +25,7 @@ describe("[Integration] Form.context.test.ts", () => { }); describe(".useFormSelector", () => { - context("when the hook is rendered", () => { + describe("when the hook is rendered", () => { it("returns only the selected value from the Form context", () => { const { result } = renderHook(() => useFormSelector(ctxt => ctxt.values)); diff --git a/packages/core/test/integration/lib/Form.provider.test.tsx b/packages/core/test/integration/lib/Form.provider.test.tsx index 8db674d..b71e043 100644 --- a/packages/core/test/integration/lib/Form.provider.test.tsx +++ b/packages/core/test/integration/lib/Form.provider.test.tsx @@ -1,8 +1,9 @@ import { expect } from "@assertive-ts/core"; import { render, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import { userEvent } from "@testing-library/user-event"; import { type ReactElement, useCallback, useState } from "react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, boolean, isSchema, number, object, string } from "yup"; import { z } from "zod"; @@ -94,8 +95,8 @@ function WasSubmitted(): ReactElement { ); } -describe("[Integration] Form.provider.test.tsx", () => { - context("when the provider children is a function", () => { +suite("[Integration] Form.provider.test.tsx", () => { + describe("when the provider children is a function", () => { it("renders the result passing context as parameters", async () => { const { getByText } = render( @@ -121,7 +122,7 @@ describe("[Integration] Form.provider.test.tsx", () => { }); }); - context("when the provider children is not a function", () => { + describe("when the provider children is not a function", () => { it("renders the children elements", async () => { const { getByText } = render( @@ -137,7 +138,7 @@ describe("[Integration] Form.provider.test.tsx", () => { }); }); - context("when the values prop changes", () => { + describe("when the values prop changes", () => { it("updates the from values in the context", async () => { const { getByText, findByRole } = render(); @@ -159,12 +160,12 @@ describe("[Integration] Form.provider.test.tsx", () => { }); }); - context("when the submit function is called from the context", () => { + describe("when the submit function is called from the context", () => { it("calls the onSubmit callback once", async () => { - const spySubmit = Sinon.spy<(v: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(v: Foo) => void>(() => undefined); const { findByRole } = render( - onSubmit={spySubmit} + onSubmit={submitSpy} validation={yupSchema} values={{ x: 1, y: "foo", z: true }} > @@ -180,19 +181,23 @@ describe("[Integration] Form.provider.test.tsx", () => { await userEvent.click(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { x: 1, y: "foo", z: true }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ x: 1, y: "foo", z: true }); + }); }); }); [yupSchema, zodSchema].forEach(schema => { const schemaName = isSchema(schema) ? "Yup" : "Zod"; - context("when the validation fails", () => { + describe("when the validation fails", () => { it("sets all the violations, does not call the onSubmit callback, sets the form as submitted", async () => { - const spySubmit = Sinon.spy<(v: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(v: Foo) => void>(() => undefined); const { findByRole, getByText } = render( , ); @@ -205,19 +210,19 @@ describe("[Integration] Form.provider.test.tsx", () => { await waitFor(() => getByText("Errors: x, y, z")); - Sinon.assert.notCalled(spySubmit); + expect(submitSpy).toNeverBeCalled(); await waitFor(() => getByText("Submitted? true")); }); }); describe(`[${schemaName}] validate`, () => { - context("when the validation success", () => { + describe("when the validation success", () => { it("clears the errors, calls the onSubmit callback once, and sets the form as submitted", async () => { - const spySubmit = Sinon.spy<(v: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(v: Foo) => void>(() => undefined); const { findByRole, getByText, queryByText } = render( , ); @@ -244,11 +249,12 @@ describe("[Integration] Form.provider.test.tsx", () => { await waitFor(() => { expect(queryByText("Errors: x, y, z")).toBeNull(); + getByText("Submitted? true"); }); - Sinon.assert.calledWithExactly(spySubmit, { x: 5, y: "foo", z: true }); - - await waitFor(() => getByText("Submitted? true")); + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ x: 5, y: "foo", z: true }); }); }); }); diff --git a/packages/core/test/integration/lib/components/ArrayField.component.test.tsx b/packages/core/test/integration/lib/components/ArrayField.component.test.tsx index 2007f73..5836625 100644 --- a/packages/core/test/integration/lib/components/ArrayField.component.test.tsx +++ b/packages/core/test/integration/lib/components/ArrayField.component.test.tsx @@ -1,5 +1,6 @@ import { render, waitFor } from "@testing-library/react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, array, number, object, string } from "yup"; import { FormProvider } from "../../../../src/lib/Form.provider"; @@ -17,8 +18,8 @@ const schema: ObjectSchema = object({ name: string().required(), }); -describe("[Integration] ArrayField.component.test.tsx", () => { - context("when the array field is rendered", () => { +suite("[Integration] ArrayField.component.test.tsx", () => { + describe("when the array field is rendered", () => { it("renders the result of the function in the children", async () => { const { getByRole } = render( diff --git a/packages/core/test/integration/lib/components/Field.component.test.tsx b/packages/core/test/integration/lib/components/Field.component.test.tsx index 601b3cb..d25ff73 100644 --- a/packages/core/test/integration/lib/components/Field.component.test.tsx +++ b/packages/core/test/integration/lib/components/Field.component.test.tsx @@ -1,5 +1,6 @@ import { render, waitFor } from "@testing-library/react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, boolean, object, string } from "yup"; import { FormProvider } from "../../../../src/lib/Form.provider"; @@ -17,8 +18,8 @@ const schema: ObjectSchema = object({ other: boolean().required(), }); -describe("[Integration] Field.component.test.tsx", () => { - context("when the field is rendered", () => { +suite("[Integration] Field.component.test.tsx", () => { + describe("when the field is rendered", () => { it("renders the result of the function in the children", async () => { const { getByDisplayValue } = render( diff --git a/packages/core/test/integration/lib/hooks/useArrayField.test.tsx b/packages/core/test/integration/lib/hooks/useArrayField.test.tsx index da1271f..3eb2c1c 100644 --- a/packages/core/test/integration/lib/hooks/useArrayField.test.tsx +++ b/packages/core/test/integration/lib/hooks/useArrayField.test.tsx @@ -1,6 +1,7 @@ import { expect } from "@assertive-ts/core"; import { type RenderHookResult, renderHook } from "@testing-library/react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, array, object, string } from "yup"; import { FormProvider } from "../../../../src/lib/Form.provider"; @@ -28,8 +29,8 @@ function renderWith(...roles: string[]): RenderHookResult, }); } -describe("[Integration] useArrayField.test.tsx", () => { - context("when the hook is rendered", () => { +suite("[Integration] useArrayField.test.tsx", () => { + describe("when the hook is rendered", () => { it("returns the array items and helpers", () => { const { result } = renderWith("foo", "bar", "baz"); const { current } = result; @@ -89,7 +90,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); describe(".insert", () => { - context("when the index in inbounds", () => { + describe("when the index in inbounds", () => { it("insters the item at the index", () => { const { result, rerender } = renderWith("foo", "baz"); @@ -103,7 +104,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); }); - context("when the index is greater than the array size", () => { + describe("when the index is greater than the array size", () => { it("insert the item at the end of the array", () => { const { result, rerender } = renderWith("foo", "bar"); @@ -117,7 +118,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); }); - context("when the index is negative", () => { + describe("when the index is negative", () => { it("treats the index as an offset", () => { const { result, rerender } = renderWith("foo", "baz"); @@ -133,7 +134,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); describe(".keygen", () => { - context("when a key is not provided", () => { + describe("when a key is not provided", () => { it("returns a generated uuid", () => { const pattern = /[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}/i; const { result } = renderWith("foo", "bar"); @@ -147,7 +148,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); }); - context("when the key is provided", () => { + describe("when the key is provided", () => { it("prefers the key over the generated uuid", () => { const today = new Date(); const { result } = renderWith("foo", "bar"); @@ -190,7 +191,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); describe(".replace", () => { - context("when the index is inbounds", () => { + describe("when the index is inbounds", () => { it("replaces the item at the index", () => { const { result, rerender } = renderWith("foo", "bar", "baz"); @@ -204,7 +205,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); }); - context("when the index is greater than the array size", () => { + describe("when the index is greater than the array size", () => { it("insert the item at the end of the array", () => { const { result, rerender } = renderWith("foo", "bar", "baz"); @@ -218,7 +219,7 @@ describe("[Integration] useArrayField.test.tsx", () => { }); }); - context("when the index is negative", () => { + describe("when the index is negative", () => { it("treats the index as na offset", () => { const { result, rerender } = renderWith("foo", "bar", "baz"); diff --git a/packages/core/test/integration/lib/hooks/useField.test.tsx b/packages/core/test/integration/lib/hooks/useField.test.tsx index 873e6cb..3dca913 100644 --- a/packages/core/test/integration/lib/hooks/useField.test.tsx +++ b/packages/core/test/integration/lib/hooks/useField.test.tsx @@ -1,8 +1,9 @@ import { expect } from "@assertive-ts/core"; import { type RenderHookResult, fireEvent, render, renderHook, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import { userEvent } from "@testing-library/user-event"; import { type ChangeEvent, type ReactElement, useCallback } from "react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, isSchema, number, object, string } from "yup"; import { z } from "zod"; @@ -86,8 +87,8 @@ function Field(): ReactElement { ); } -describe("[Integration] useField.test.tsx", () => { - context("when the hook is rendered", () => { +suite("[Integration] useField.test.tsx", () => { + describe("when the hook is rendered", () => { it("returns the field value and state setters", () => { const { result } = renderWith({ path: "name", values: { name: "Alice" } }); const { current } = result; @@ -99,7 +100,7 @@ describe("[Integration] useField.test.tsx", () => { }); describe("fallback", () => { - context("when the fallback is not provided", () => { + describe("when the fallback is not provided", () => { it("starts the value as undefined and can change it back to undefined", () => { const { result, rerender } = renderWith({ path: "name" }); @@ -119,7 +120,7 @@ describe("[Integration] useField.test.tsx", () => { }); }); - context("when the fallback is defined", () => { + describe("when the fallback is defined", () => { it("starts the value with a default and falls back if changed to undefined", () => { const { result, rerender } = renderWith({ fallback: 0, path: "age" }); @@ -159,8 +160,8 @@ describe("[Integration] useField.test.tsx", () => { const schemaName = isSchema(schema) ? "Yup" : "Zod"; describe(`[${schemaName}] validation`, () => { - context("when the field is valid", () => { - context("and the field is untouched", () => { + describe("when the field is valid", () => { + describe("and the field is untouched", () => { it("does not show any error", async () => { const { findByRole, getByText } = render(); @@ -180,7 +181,7 @@ describe("[Integration] useField.test.tsx", () => { }); }); - context("and the field is touched", () => { + describe("and the field is touched", () => { it("does not show any error", async () => { const { findByRole, getByText } = render(); @@ -208,8 +209,8 @@ describe("[Integration] useField.test.tsx", () => { }); }); - context("when the field is invalid", () => { - context("and the field is untouched", () => { + describe("when the field is invalid", () => { + describe("and the field is untouched", () => { it("does not show the error", async () => { const { findByRole, getByText } = render(); @@ -236,7 +237,7 @@ describe("[Integration] useField.test.tsx", () => { }); }); - context("and the field is touched", () => { + describe("and the field is touched", () => { it("shows the error", async () => { const { findByRole, getByText } = render(); diff --git a/packages/core/test/integration/lib/hooks/useFieldValidation.test.tsx b/packages/core/test/integration/lib/hooks/useFieldValidation.test.tsx index 6c1f4a3..0f64633 100644 --- a/packages/core/test/integration/lib/hooks/useFieldValidation.test.tsx +++ b/packages/core/test/integration/lib/hooks/useFieldValidation.test.tsx @@ -1,6 +1,7 @@ import { expect } from "@assertive-ts/core"; import { type RenderHookResult, renderHook, waitFor } from "@testing-library/react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, isSchema, number, object, string } from "yup"; import { z } from "zod"; @@ -43,12 +44,12 @@ function renderWith(options: RenderOptions): RenderHookResult { +suite("[Integration] useFieldValidation.test.tsx", () => { [yupSchema, zodSchema].forEach(schema => { const schemaName = isSchema(schema) ? "Yup" : "Zod"; describe(`[${schemaName}] when the validation is a schema`, () => { - context("and the hook is rendered", () => { + describe("and the hook is rendered", () => { it("returns the error and required states", async () => { const { result } = renderWith({ path: "name", schema }); const { current } = result; @@ -60,7 +61,7 @@ describe("[Integration] useFieldValidation.test.tsx", () => { }); }); - context("and the field is required", () => { + describe("and the field is required", () => { it("sets the required state to true", async () => { const { result } = renderWith({ path: "name", schema }); @@ -70,7 +71,7 @@ describe("[Integration] useFieldValidation.test.tsx", () => { }); }); - context("and the field is not required", () => { + describe("and the field is not required", () => { it("sets the required state to false", async () => { const { result } = renderWith({ path: "age", schema }); diff --git a/packages/core/test/integration/main.test.ts b/packages/core/test/integration/main.test.ts index 1d59fc6..2ec4b01 100644 --- a/packages/core/test/integration/main.test.ts +++ b/packages/core/test/integration/main.test.ts @@ -1,8 +1,9 @@ import { expect } from "@assertive-ts/core"; +import { it, suite } from "vitest"; -describe("[Integration] main.test.tsx", () => { +suite("[Integration] main.test.tsx", () => { it("re-exports the library exports", async () => { - const core = await expect(import("../../src/main")).toBeResolved(); + const core = await import("../../src/main"); expect(core).toHaveKeys( "ArrayField", diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts new file mode 100644 index 0000000..e2a4ea9 --- /dev/null +++ b/packages/core/test/setup.ts @@ -0,0 +1,29 @@ +import { usePlugin } from "@assertive-ts/core"; +import { SinonPlugin } from "@assertive-ts/sinon"; +import { cleanup } from "@testing-library/react"; +import { userEvent } from "@testing-library/user-event"; +import Sinon from "sinon"; +import { afterEach, beforeEach } from "vitest"; + +process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS = "true"; + +const newUserEvent = userEvent.setup({ + advanceTimers: delay => Sinon.clock.tickAsync(delay).then(), + delay: 0, +}); + +Object.assign(userEvent, newUserEvent); + +usePlugin(SinonPlugin); + +beforeEach(() => { + Sinon.useFakeTimers({ + advanceTimeDelta: 0, + shouldAdvanceTime: true, + }); +}); + +afterEach(() => { + cleanup(); + Sinon.restore(); +}); diff --git a/packages/core/test/types/lib/Form.context.typetest.ts b/packages/core/test/types/lib/Form.context.typetest.ts deleted file mode 100644 index f6d0e14..0000000 --- a/packages/core/test/types/lib/Form.context.typetest.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { expectTypeOf } from "expect-type"; - -import type { Path, ValueByPath } from "../../../src/lib/Form.context"; - -interface Foo { - x: number; - y: Array<{ a: boolean; b: string; c: number[]; }>; - z: { - m: Date; - n: { end: "foo"; }; - }; -} - -expectTypeOf>().toEqualTypeOf< - | "x" - | "y" - | `y.${number}` - | `y.${number}.a` - | `y.${number}.b` - | `y.${number}.c` - | `y.${number}.c.${number}` - | "z" - | "z.m" - | "z.n" - | "z.n.end" ->(); -expectTypeOf>().toEqualTypeOf<"x">(); -expectTypeOf>().toEqualTypeOf<"y" | `y.${number}.c`>(); -expectTypeOf>().toEqualTypeOf<`y.${number}.c`>(); -expectTypeOf>().toEqualTypeOf<`y.${number}.b` | "z.n.end">(); -expectTypeOf>().toEqualTypeOf<"z.n.end">(); - -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf<"foo">(); diff --git a/packages/core/test/types/lib/components/ArrayField.component.typetest.ts b/packages/core/test/types/lib/components/ArrayField.component.typetest.ts deleted file mode 100644 index 6f11190..0000000 --- a/packages/core/test/types/lib/components/ArrayField.component.typetest.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { expectTypeOf } from "expect-type"; - -import type { ArrayFieldOf, ArrayFieldProps, ArrayValue } from "../../../../src/lib/components/ArrayField.component"; -import type { ReactNode } from "react"; - -interface Foo { - x: number; - y: Array<{ a: boolean; b: string; c: string[]; }>; - z: { - m: Date; - n: number[]; - }; -} - -expectTypeOf>().toBeNever(); -expectTypeOf>().toEqualTypeOf<{ a: boolean; b: string; c: string[]; }>(); -expectTypeOf>().toEqualTypeOf(); -expectTypeOf>().toEqualTypeOf(); - -expectTypeOf>().toMatchTypeOf< - (props: ArrayFieldProps) => ReactNode ->(); diff --git a/packages/core/test/types/lib/components/Field.component.typetest.ts b/packages/core/test/types/lib/components/Field.component.typetest.ts deleted file mode 100644 index 5ecccf0..0000000 --- a/packages/core/test/types/lib/components/Field.component.typetest.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { expectTypeOf } from "expect-type"; - -import type { Optional, Path, ValueByPath } from "../../../../src/lib/Form.context"; -import type { FieldOf, FieldProps } from "../../../../src/lib/components/Field.component"; -import type { ReactNode } from "react"; - -interface Foo { - x: number; - y: Array<{ a: boolean; b: string; c: number[]; }>; - z: { - m: Date; - n: { end: "foo"; }; - }; -} - -expectTypeOf>().toMatchTypeOf< - (props: FieldProps, Optional>>>) => ReactNode ->(); diff --git a/packages/core/test/unit/lib/Form.context.test.ts b/packages/core/test/unit/lib/Form.context.test.ts new file mode 100644 index 0000000..4d96fe0 --- /dev/null +++ b/packages/core/test/unit/lib/Form.context.test.ts @@ -0,0 +1,46 @@ +import { describe, expectTypeOf, it, suite } from "vitest"; + +import type { Path, ValueByPath } from "../../../src/lib/Form.context"; + +interface Foo { + x: number; + y: Array<{ a: boolean; b: string; c: number[]; }>; + z: { + m: Date; + n: { end: "foo"; }; + }; +} + +suite("[Unit] Form.context.test.ts", () => { + describe("types definitions", () => { + it("defines the types of Path", () => { + expectTypeOf>().toEqualTypeOf< + | "x" + | "y" + | `y.${number}` + | `y.${number}.a` + | `y.${number}.b` + | `y.${number}.c` + | `y.${number}.c.${number}` + | "z" + | "z.m" + | "z.n" + | "z.n.end" + >(); + expectTypeOf>().toEqualTypeOf<"x">(); + expectTypeOf>().toEqualTypeOf<"y" | `y.${number}.c`>(); + expectTypeOf>().toEqualTypeOf<`y.${number}.c`>(); + expectTypeOf>().toEqualTypeOf<`y.${number}.b` | "z.n.end">(); + expectTypeOf>().toEqualTypeOf<"z.n.end">(); + }); + + it("defines the types of ValueByPath", () => { + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf<"foo">(); + }); + }); +}); diff --git a/packages/core/test/unit/lib/components/ArrayField.component.test.ts b/packages/core/test/unit/lib/components/ArrayField.component.test.ts new file mode 100644 index 0000000..92c7aac --- /dev/null +++ b/packages/core/test/unit/lib/components/ArrayField.component.test.ts @@ -0,0 +1,30 @@ +import { describe, expectTypeOf, it, suite } from "vitest"; + +import type { ArrayFieldOf, ArrayFieldProps, ArrayValue } from "../../../../src/lib/components/ArrayField.component"; +import type { ReactNode } from "react"; + +interface Foo { + x: number; + y: Array<{ a: boolean; b: string; c: string[]; }>; + z: { + m: Date; + n: number[]; + }; +} + +suite("[Unit] ArrayField.component.test.ts", () => { + describe("types definitions", () => { + it("defines the types of ArrayValue", () => { + expectTypeOf>().toBeNever(); + expectTypeOf>().toEqualTypeOf<{ a: boolean; b: string; c: string[]; }>(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + }); + + it("defines the types of ArrayFieldOf", () => { + expectTypeOf>().toMatchTypeOf< + (props: ArrayFieldProps) => ReactNode + >(); + }); + }); +}); diff --git a/packages/core/test/unit/lib/components/Field.component.test.ts b/packages/core/test/unit/lib/components/Field.component.test.ts new file mode 100644 index 0000000..5d6e344 --- /dev/null +++ b/packages/core/test/unit/lib/components/Field.component.test.ts @@ -0,0 +1,24 @@ +import { describe, expectTypeOf, it, suite } from "vitest"; + +import type { Optional, Path, ValueByPath } from "../../../../src/lib/Form.context"; +import type { FieldOf, FieldProps } from "../../../../src/lib/components/Field.component"; +import type { ReactNode } from "react"; + +interface Foo { + x: number; + y: Array<{ a: boolean; b: string; c: number[]; }>; + z: { + m: Date; + n: { end: "foo"; }; + }; +} + +suite("[Unit] Field.component.test.ts", () => { + describe("types definitions", () => { + it("defines the types of FieldOf", () => { + expectTypeOf>().toMatchTypeOf< + (props: FieldProps, Optional>>>) => ReactNode + >(); + }); + }); +}); diff --git a/packages/core/test/unit/lib/helpers/commons.test.ts b/packages/core/test/unit/lib/helpers/commons.test.ts index 209a6a0..f15d052 100644 --- a/packages/core/test/unit/lib/helpers/commons.test.ts +++ b/packages/core/test/unit/lib/helpers/commons.test.ts @@ -1,8 +1,9 @@ import { expect } from "@assertive-ts/core"; +import { describe, it, suite } from "vitest"; import { noop } from "../../../../src/lib/helpers/commons"; -describe("[Unit] commons.test.ts", () => { +suite("[Unit] commons.test.ts", () => { describe(".noop", () => { it("does nothing", () => { expect(noop).not.toThrow(); diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts index 2ee5df4..2560f22 100644 --- a/packages/core/vite.config.ts +++ b/packages/core/vite.config.ts @@ -6,10 +6,16 @@ export default defineConfig({ lib: { entry: "./src/main.ts", fileName: "main", - formats: ["cjs", "es", "umd"], - name: "LynxtsCore", + formats: ["cjs", "es"], + }, + rollupOptions: { + output: { + exports: "named", + preserveModules: true, + }, }, sourcemap: true, + ssr: true, }, plugins: [ dts({ diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts new file mode 100644 index 0000000..bc634c9 --- /dev/null +++ b/packages/core/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "happy-dom", + include: ["test/**/*.test.ts?(x)"], + setupFiles: "./test/setup.ts", + }, +}); diff --git a/packages/native/babel.config.js b/packages/native/babel.config.js deleted file mode 100644 index 68228c8..0000000 --- a/packages/native/babel.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * @type {import('@babel/core').TransformOptions} - */ -const babelConfig = { - presets: ["module:@react-native/babel-preset"], -}; - -export default babelConfig; diff --git a/packages/native/docs/interfaces/TextFiedProps.md b/packages/native/docs/interfaces/TextFiedProps.md index f184f5f..e8c8885 100644 --- a/packages/native/docs/interfaces/TextFiedProps.md +++ b/packages/native/docs/interfaces/TextFiedProps.md @@ -1108,7 +1108,7 @@ node\_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts:68 ### keyboardAppearance? -> `optional` **keyboardAppearance**: `"light"` \| `"default"` \| `"dark"` +> `optional` **keyboardAppearance**: `"default"` \| `"light"` \| `"dark"` Determines the color of the keyboard. @@ -2983,7 +2983,7 @@ node\_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts:880 ### textAlignVertical? -> `optional` **textAlignVertical**: `"center"` \| `"auto"` \| `"top"` \| `"bottom"` +> `optional` **textAlignVertical**: `"auto"` \| `"center"` \| `"top"` \| `"bottom"` Vertically align text when `multiline` is set to true diff --git a/packages/native/jest.config.ts b/packages/native/jest.config.ts deleted file mode 100644 index 260433a..0000000 --- a/packages/native/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { Config } from "jest"; - -const jestConfig: Config = { - preset: "react-native", - setupFilesAfterEnv: ["/test/setup.ts"], - testRegex: "test/.*\\.test\\.(tsx?)$", - testTimeout: 30000, // https://github.com/jestjs/jest/issues/11234 -}; - -export default jestConfig; diff --git a/packages/native/metro.config.cjs b/packages/native/metro.config.cjs deleted file mode 100644 index 6ef5474..0000000 --- a/packages/native/metro.config.cjs +++ /dev/null @@ -1,3 +0,0 @@ -const { getDefaultConfig, mergeConfig } = require("@react-native/metro-config"); - -module.exports = mergeConfig(getDefaultConfig(__dirname), { }); diff --git a/packages/native/package.json b/packages/native/package.json index 025862e..d844597 100644 --- a/packages/native/package.json +++ b/packages/native/package.json @@ -20,7 +20,6 @@ "source": "./src/main.ts", "main": "./dist/main.cjs", "module": "./dist/main.js", - "unpkg": "./dist/main.umd.cjs", "types": "./dist/main.d.ts", "react-native": "./dist/main.js", "exports": { @@ -43,11 +42,11 @@ }, "scripts": { "build": "vite build", - "check": "yarn compile && yarn test", + "check": "yarn compile && yarn test --run", "compile": "tsc -p tsconfig.json", "docs": "typedoc", "release": "semantic-release", - "test": "NODE_ENV=test jest", + "test": "vitest", "test:silent": "DEBUG_PRINT_LIMIT=0 yarn test", "test:verbose": "DEBUG_PRINT_LIMIT=1000000 yarn test" }, @@ -57,21 +56,20 @@ }, "devDependencies": { "@assertive-ts/core": "^2.1.0", + "@assertive-ts/sinon": "^1.0.0", "@babel/core": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/runtime": "^7.24.7", "@lynxts/core": "workspace:^", "@react-native/babel-preset": "^0.74.85", - "@react-native/metro-config": "^0.74.85", "@testing-library/react-native": "^12.5.1", "@types/node": "^20.14.10", "@types/react": "^18.3.3", "@types/react-test-renderer": "^18.3.0", "@types/sinon": "^17.0.3", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", "react": "^18.3.1", "react-native": "^0.74.3", + "react-native-testing-mocks": "^1.4.1", "react-test-renderer": "^18.3.1", "semantic-release": "^24.0.0", "semantic-release-yarn": "^3.0.2", @@ -81,6 +79,7 @@ "typescript": "^5.5.3", "vite": "^5.3.3", "vite-plugin-dts": "^3.9.1", + "vitest": "^1.6.0", "yup": "^1.4.0" }, "peerDependencies": { diff --git a/packages/native/test/integration/lib/SubmitButton.component.test.tsx b/packages/native/test/integration/lib/SubmitButton.component.test.tsx index da2a5c0..d9d9606 100644 --- a/packages/native/test/integration/lib/SubmitButton.component.test.tsx +++ b/packages/native/test/integration/lib/SubmitButton.component.test.tsx @@ -1,45 +1,55 @@ +import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { render, userEvent, waitFor } from "@testing-library/react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { SubmitButton } from "../../../src/lib/SubmitButton.component"; import { type Foo, foo, schema } from "../../helpers/testSchema"; -describe("[Integration] SubmitButton.component.test.tsx", () => { - context("when the button is pressed", () => { - context("and the onPress callback is not set", () => { +suite("[Integration] SubmitButton.component.test.tsx", () => { + describe("when the button is pressed", () => { + describe("and the onPress callback is not set", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByText } = render( - + , ); const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); - context("and the onPress callback is set", () => { + describe("and the onPress callback is set", () => { it("submits the form and calls the onPress callback", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const spyOnPress = Sinon.spy<() => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const onPressSpy = Sinon.spy<() => void>(() => undefined); const { findByText } = render( - - + + , ); const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); - Sinon.assert.calledOnce(spyOnPress); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + expect(onPressSpy).toBeCalledOnce(); + }); }); }); }); diff --git a/packages/native/test/integration/lib/SubmitHighlight.component.test.tsx b/packages/native/test/integration/lib/SubmitHighlight.component.test.tsx index 6a62406..404453c 100644 --- a/packages/native/test/integration/lib/SubmitHighlight.component.test.tsx +++ b/packages/native/test/integration/lib/SubmitHighlight.component.test.tsx @@ -1,18 +1,20 @@ +import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { render, userEvent, waitFor } from "@testing-library/react-native"; import { Text } from "react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { SubmitHighlight } from "../../../src/lib/SubmitHighlight.component"; import { type Foo, foo, schema } from "../../helpers/testSchema"; -describe("[Integration] SubmitHighlight.component.test.tsx", () => { - context("when the button is pressed", () => { - context("and the onPress callback is not set", () => { +suite("[Integration] SubmitHighlight.component.test.tsx", () => { + describe("when the button is pressed", () => { + describe("and the onPress callback is not set", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByText } = render( - + {"Submit!"} @@ -21,19 +23,23 @@ describe("[Integration] SubmitHighlight.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); - context("and the onPress callback is set", () => { + describe("and the onPress callback is set", () => { it("submits the form and calls the onPress callback", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const spyOnPress = Sinon.spy<() => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const onPressSpy = Sinon.spy<() => void>(() => undefined); const { findByText } = render( - - + + {"Submit!"} , @@ -41,10 +47,14 @@ describe("[Integration] SubmitHighlight.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); - Sinon.assert.calledOnce(spyOnPress); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + expect(onPressSpy).toBeCalledOnce(); + }); }); }); }); diff --git a/packages/native/test/integration/lib/SubmitNativeFeedback.component.test.tsx b/packages/native/test/integration/lib/SubmitNativeFeedback.component.test.tsx index 7df1896..4d7c004 100644 --- a/packages/native/test/integration/lib/SubmitNativeFeedback.component.test.tsx +++ b/packages/native/test/integration/lib/SubmitNativeFeedback.component.test.tsx @@ -1,18 +1,20 @@ +import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { render, userEvent, waitFor } from "@testing-library/react-native"; import { Text } from "react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { SubmitNativeFeedback } from "../../../src/lib/SubmitNativeFeedback.component"; import { type Foo, foo, schema } from "../../helpers/testSchema"; -describe("[Integration] SubmitNativeFeedback.component.test.tsx", () => { - context("when the button is pressed", () => { - context("and the onPress callback is not set", () => { +suite("[Integration] SubmitNativeFeedback.component.test.tsx", () => { + describe("when the button is pressed", () => { + describe("and the onPress callback is not set", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByText } = render( - + {"Submit!"} @@ -21,19 +23,23 @@ describe("[Integration] SubmitNativeFeedback.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); - context("and the onPress callback is set", () => { + describe("and the onPress callback is set", () => { it("submits the form and calls the onPress callback", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const spyOnPress = Sinon.spy<() => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const onPressSpy = Sinon.spy<() => void>(() => undefined); const { findByText } = render( - - + + {"Submit!"} , @@ -41,10 +47,14 @@ describe("[Integration] SubmitNativeFeedback.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); - Sinon.assert.calledOnce(spyOnPress); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + expect(onPressSpy).toBeCalledOnce(); + }); }); }); }); diff --git a/packages/native/test/integration/lib/SubmitOpacity.component.test.tsx b/packages/native/test/integration/lib/SubmitOpacity.component.test.tsx index 43307b8..0842659 100644 --- a/packages/native/test/integration/lib/SubmitOpacity.component.test.tsx +++ b/packages/native/test/integration/lib/SubmitOpacity.component.test.tsx @@ -1,18 +1,20 @@ +import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { render, userEvent, waitFor } from "@testing-library/react-native"; import { Text } from "react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { SubmitOpacity } from "../../../src/lib/SubmitOpacity.component"; import { type Foo, foo, schema } from "../../helpers/testSchema"; -describe("[Integration] SubmitOpacity.component.test.tsx", () => { - context("when the button is pressed", () => { - context("and the onPress callback is not set", () => { +suite("[Integration] SubmitOpacity.component.test.tsx", () => { + describe("when the button is pressed", () => { + describe("and the onPress callback is not set", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByText } = render( - + {"Submit!"} @@ -21,19 +23,23 @@ describe("[Integration] SubmitOpacity.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); - context("and the onPress callback is set", () => { + describe("and the onPress callback is set", () => { it("submits the form and calls the onPress callback", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const spyOnPress = Sinon.spy<() => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const onPressSpy = Sinon.spy<() => void>(() => undefined); const { findByText } = render( - - + + {"Submit!"} , @@ -41,10 +47,14 @@ describe("[Integration] SubmitOpacity.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); - Sinon.assert.calledOnce(spyOnPress); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + expect(onPressSpy).toBeCalledOnce(); + }); }); }); }); diff --git a/packages/native/test/integration/lib/SubmitWithoutFeedback.component.test.tsx b/packages/native/test/integration/lib/SubmitWithoutFeedback.component.test.tsx index eee7707..c8b2704 100644 --- a/packages/native/test/integration/lib/SubmitWithoutFeedback.component.test.tsx +++ b/packages/native/test/integration/lib/SubmitWithoutFeedback.component.test.tsx @@ -1,18 +1,20 @@ +import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { render, userEvent, waitFor } from "@testing-library/react-native"; import { Text } from "react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { SubmitWithoutFeedback } from "../../../src/lib/SubmitWithoutFeedback.component"; import { type Foo, foo, schema } from "../../helpers/testSchema"; -describe("[Integration] SubmitWithoutFeedback.component.test.tsx", () => { - context("when the button is pressed", () => { - context("and the onPress callback is not set", () => { +suite("[Integration] SubmitWithoutFeedback.component.test.tsx", () => { + describe("when the button is pressed", () => { + describe("and the onPress callback is not set", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByText } = render( - + {"Submit!"} @@ -21,19 +23,23 @@ describe("[Integration] SubmitWithoutFeedback.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); - context("and the onPress callback is set", () => { + describe("and the onPress callback is set", () => { it("submits the form and calls the onPress callback", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const spyOnPress = Sinon.spy<() => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const onPressSpy = Sinon.spy<() => void>(() => undefined); const { findByText } = render( - - + + {"Submit!"} , @@ -41,10 +47,14 @@ describe("[Integration] SubmitWithoutFeedback.component.test.tsx", () => { const submit = await findByText("Submit!"); - await waitFor(() => fireEvent.press(submit)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); - Sinon.assert.calledOnce(spyOnPress); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + expect(onPressSpy).toBeCalledOnce(); + }); }); }); }); diff --git a/packages/native/test/integration/lib/fields/TextField.component.test.tsx b/packages/native/test/integration/lib/fields/TextField.component.test.tsx index e4d8301..de03d69 100644 --- a/packages/native/test/integration/lib/fields/TextField.component.test.tsx +++ b/packages/native/test/integration/lib/fields/TextField.component.test.tsx @@ -1,9 +1,10 @@ import { expect } from "@assertive-ts/core"; import { FormProvider } from "@lynxts/core"; -import { fireEvent, render, waitFor } from "@testing-library/react-native"; +import { fireEvent, render, userEvent, waitFor } from "@testing-library/react-native"; import { type ReactElement, useCallback, useState } from "react"; import { Button } from "react-native"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, object, string } from "yup"; import { SubmitButton } from "../../../../src/lib/SubmitButton.component"; @@ -42,27 +43,31 @@ function TestForm({ onSubmit = Sinon.fake }: TestFormProps): ReactElement { ); } -describe("[Integration] TextField.component.test.tsx", () => { - context("when the text field changes", () => { +suite("[Integration] TextField.component.test.tsx", () => { + describe("when the text field changes", () => { it("sets the new value in the form context", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const { findByLabelText, getByDisplayValue, findByRole } = render(); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const { findByLabelText, getByDisplayValue, findByRole } = render(); const nameField = await findByLabelText("Name: *"); - await waitFor(() => fireEvent.changeText(nameField, "bar")); + await userEvent.type(nameField, "bar"); await waitFor(() => getByDisplayValue("bar")); const submitButton = await findByRole("button", { name: "Submit!" }); - await waitFor(() => fireEvent.press(submitButton)); + await userEvent.press(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "bar", other: "5" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "bar", other: "5" }); + }); }); }); - context("when the field looses focus", () => { + describe("when the field looses focus", () => { it("sets the field as touched", async () => { const { findByLabelText, queryByText, getByText } = render(); @@ -76,10 +81,10 @@ describe("[Integration] TextField.component.test.tsx", () => { }); }); - context("when the form context value changes", () => { + describe("when the form context value changes", () => { it("changes the text field value", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const { queryByDisplayValue, findByRole, getByDisplayValue } = render(); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const { queryByDisplayValue, findByRole, getByDisplayValue } = render(); await waitFor(() => { expect(queryByDisplayValue("foo")).toBeNull(); @@ -87,19 +92,23 @@ describe("[Integration] TextField.component.test.tsx", () => { const updateButton = await findByRole("button", { name: "Update!" }); - await waitFor(() => fireEvent.press(updateButton)); + await userEvent.press(updateButton); await waitFor(() => getByDisplayValue("foo")); - const submitButton = await findByRole("button", { name: "Submit!" }); + const submit = await findByRole("button", { name: "Submit!" }); - await waitFor(() => fireEvent.press(submitButton)); + await userEvent.press(submit); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: "10" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: "10" }); + }); }); }); - context("when the label prop is omitted", () => { + describe("when the label prop is omitted", () => { it("does not render a label on the field", async () => { const { getByPlaceholderText, queryByText } = render( onSubmit={Sinon.fake} validation={schema}> @@ -113,8 +122,8 @@ describe("[Integration] TextField.component.test.tsx", () => { }); }); - context("when the requiredText prop is changed", () => { - context("and the required text is not empty", () => { + describe("when the requiredText prop is changed", () => { + describe("and the required text is not empty", () => { it("uses the text instead of the asterisk", async () => { const { getByLabelText } = render( onSubmit={Sinon.fake} validation={schema}> @@ -130,7 +139,7 @@ describe("[Integration] TextField.component.test.tsx", () => { }); }); - context("and the required text is empty", () => { + describe("and the required text is empty", () => { it("does not show the required text", async () => { const { getByLabelText } = render( onSubmit={Sinon.fake} validation={schema}> @@ -147,24 +156,28 @@ describe("[Integration] TextField.component.test.tsx", () => { }); }); - context("when the keyboard submit is pressed", () => { + describe("when the keyboard submit is pressed", () => { it("submits the form", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { findByLabelText, getByDisplayValue } = render( - onSubmit={spySubmit} validation={schema}> + onSubmit={submitSpy} validation={schema}> , ); const textField = await findByLabelText("Name: *"); - await waitFor(() => fireEvent.changeText(textField, "foo")); + await userEvent.type(textField, "foo"); await waitFor(() => getByDisplayValue("foo")); await waitFor(() => fireEvent(textField, "submitEditing")); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo" }); + }); }); }); }); diff --git a/packages/native/test/integration/main.test.ts b/packages/native/test/integration/main.test.ts index 08c8cf0..be9f2e4 100644 --- a/packages/native/test/integration/main.test.ts +++ b/packages/native/test/integration/main.test.ts @@ -1,9 +1,10 @@ import { expect } from "@assertive-ts/core"; +import { it, suite } from "vitest"; // eslint-disable-next-line import/no-namespace import * as native from "../../src/main"; -describe("[Integration] main.test.ts", () => { +suite("[Integration] main.test.ts", () => { it("re-exports the library exports", () => { expect(native).toHaveKeys( "SubmitButton", diff --git a/packages/native/test/setup.ts b/packages/native/test/setup.ts index 1e08efb..e1b6e03 100644 --- a/packages/native/test/setup.ts +++ b/packages/native/test/setup.ts @@ -1,10 +1,28 @@ -import { afterEach, describe, it } from "@jest/globals"; +import { usePlugin } from "@assertive-ts/core"; +import { SinonPlugin } from "@assertive-ts/sinon"; +import { cleanup, userEvent } from "@testing-library/react-native"; import Sinon from "sinon"; +import { afterEach, beforeEach } from "vitest"; -global.context = describe; -global.describe = describe; -global.it = it; +process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS = "true"; + +const newUserEvent = userEvent.setup({ + advanceTimers: delay => Sinon.clock.tickAsync(delay).then(), + delay: 0, +}); + +Object.assign(userEvent, newUserEvent); + +usePlugin(SinonPlugin); + +beforeEach(() => { + Sinon.useFakeTimers({ + advanceTimeDelta: 0, + shouldAdvanceTime: true, + }); +}); afterEach(() => { + cleanup(); Sinon.restore(); }); diff --git a/packages/native/tsconfig.json b/packages/native/tsconfig.json index 2dc3203..91a1db8 100644 --- a/packages/native/tsconfig.json +++ b/packages/native/tsconfig.json @@ -5,14 +5,6 @@ "typeRoots": [ "../../node_modules/@types", "./typings" - ], - // Jest and Mocha types conflict with eachother. - // Check: https://github.com/microsoft/TypeScript/issues/18588#issuecomment-704482601 - "types": [ - "node", - "react", - "react-test-renderer", - "sinon" ] }, "exclude": [ diff --git a/packages/native/vite.config.ts b/packages/native/vite.config.ts index 5d9db22..2560f22 100644 --- a/packages/native/vite.config.ts +++ b/packages/native/vite.config.ts @@ -6,13 +6,16 @@ export default defineConfig({ lib: { entry: "./src/main.ts", fileName: "main", - formats: ["cjs", "es", "umd"], - name: "LynxtsNative", + formats: ["cjs", "es"], }, rollupOptions: { - external: ["react-native", "@react-native"], + output: { + exports: "named", + preserveModules: true, + }, }, sourcemap: true, + ssr: true, }, plugins: [ dts({ diff --git a/packages/native/vitest.config.ts b/packages/native/vitest.config.ts new file mode 100644 index 0000000..0fd10e9 --- /dev/null +++ b/packages/native/vitest.config.ts @@ -0,0 +1,10 @@ +import { reactNativeVitestPlugin } from "react-native-testing-mocks/vitest"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [reactNativeVitestPlugin()], + test: { + include: ["test/**/*.test.ts?(x)"], + setupFiles: "./test/setup.ts", + }, +}); diff --git a/packages/web/docs/interfaces/FormProps.md b/packages/web/docs/interfaces/FormProps.md index 45d5f5f..890327a 100644 --- a/packages/web/docs/interfaces/FormProps.md +++ b/packages/web/docs/interfaces/FormProps.md @@ -110,7 +110,7 @@ node\_modules/@types/react/index.d.ts:2595 ### aria-autocomplete? -> `optional` **aria-autocomplete**: `"list"` \| `"none"` \| `"inline"` \| `"both"` +> `optional` **aria-autocomplete**: `"inline"` \| `"none"` \| `"list"` \| `"both"` Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made. @@ -401,7 +401,7 @@ node\_modules/@types/react/index.d.ts:2664 ### ~~aria-dropeffect?~~ -> `optional` **aria-dropeffect**: `"link"` \| `"none"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` +> `optional` **aria-dropeffect**: `"none"` \| `"link"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` Indicates what functions can be performed when a dragged object is released on the drop target. @@ -1143,7 +1143,7 @@ returns a React.js node. #### Defined in -packages/core/dist/lib/Form.provider.d.ts:87 +packages/core/dist/lib/Form.provider.d.ts:88 *** @@ -1363,7 +1363,7 @@ node\_modules/@types/react/index.d.ts:2923 ### inputMode? -> `optional` **inputMode**: `"search"` \| `"text"` \| `"none"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` +> `optional` **inputMode**: `"none"` \| `"search"` \| `"text"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` Hints at the type of data that might be entered by the user while editing the element or its contents @@ -3513,7 +3513,7 @@ the validated values `T` of the form #### Defined in -packages/core/dist/lib/Form.provider.d.ts:93 +packages/core/dist/lib/Form.provider.d.ts:94 *** @@ -4130,7 +4130,7 @@ tells the form and the hooks how to handle the validation. #### Defined in -packages/core/dist/lib/Form.provider.d.ts:102 +packages/core/dist/lib/Form.provider.d.ts:103 *** @@ -4147,7 +4147,7 @@ the field values as well. #### Defined in -packages/core/dist/lib/Form.provider.d.ts:107 +packages/core/dist/lib/Form.provider.d.ts:108 *** diff --git a/packages/web/docs/interfaces/InputProps.md b/packages/web/docs/interfaces/InputProps.md index 212544f..a6d2402 100644 --- a/packages/web/docs/interfaces/InputProps.md +++ b/packages/web/docs/interfaces/InputProps.md @@ -111,7 +111,7 @@ node\_modules/@types/react/index.d.ts:2595 ### aria-autocomplete? -> `optional` **aria-autocomplete**: `"list"` \| `"none"` \| `"inline"` \| `"both"` +> `optional` **aria-autocomplete**: `"inline"` \| `"none"` \| `"list"` \| `"both"` Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made. @@ -402,7 +402,7 @@ node\_modules/@types/react/index.d.ts:2664 ### ~~aria-dropeffect?~~ -> `optional` **aria-dropeffect**: `"link"` \| `"none"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` +> `optional` **aria-dropeffect**: `"none"` \| `"link"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` Indicates what functions can be performed when a dragged object is released on the drop target. @@ -1132,7 +1132,7 @@ node\_modules/@types/react/index.d.ts:2935 ### capture? -> `optional` **capture**: `boolean` \| `"user"` \| `"environment"` +> `optional` **capture**: `boolean` \| `"environment"` \| `"user"` #### Inherited from @@ -1518,7 +1518,7 @@ node\_modules/@types/react/index.d.ts:2923 ### inputMode? -> `optional` **inputMode**: `"search"` \| `"text"` \| `"none"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` +> `optional` **inputMode**: `"none"` \| `"search"` \| `"text"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` Hints at the type of data that might be entered by the user while editing the element or its contents diff --git a/packages/web/docs/interfaces/SelectProps.md b/packages/web/docs/interfaces/SelectProps.md index 612132f..6a7398e 100644 --- a/packages/web/docs/interfaces/SelectProps.md +++ b/packages/web/docs/interfaces/SelectProps.md @@ -87,7 +87,7 @@ node\_modules/@types/react/index.d.ts:2595 ### aria-autocomplete? -> `optional` **aria-autocomplete**: `"list"` \| `"none"` \| `"inline"` \| `"both"` +> `optional` **aria-autocomplete**: `"inline"` \| `"none"` \| `"list"` \| `"both"` Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made. @@ -378,7 +378,7 @@ node\_modules/@types/react/index.d.ts:2664 ### ~~aria-dropeffect?~~ -> `optional` **aria-dropeffect**: `"link"` \| `"none"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` +> `optional` **aria-dropeffect**: `"none"` \| `"link"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` Indicates what functions can be performed when a dragged object is released on the drop target. @@ -1327,7 +1327,7 @@ node\_modules/@types/react/index.d.ts:2923 ### inputMode? -> `optional` **inputMode**: `"search"` \| `"text"` \| `"none"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` +> `optional` **inputMode**: `"none"` \| `"search"` \| `"text"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` Hints at the type of data that might be entered by the user while editing the element or its contents diff --git a/packages/web/docs/interfaces/TextareaProps.md b/packages/web/docs/interfaces/TextareaProps.md index 6d81f65..952a191 100644 --- a/packages/web/docs/interfaces/TextareaProps.md +++ b/packages/web/docs/interfaces/TextareaProps.md @@ -83,7 +83,7 @@ node\_modules/@types/react/index.d.ts:2595 ### aria-autocomplete? -> `optional` **aria-autocomplete**: `"list"` \| `"none"` \| `"inline"` \| `"both"` +> `optional` **aria-autocomplete**: `"inline"` \| `"none"` \| `"list"` \| `"both"` Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made. @@ -374,7 +374,7 @@ node\_modules/@types/react/index.d.ts:2664 ### ~~aria-dropeffect?~~ -> `optional` **aria-dropeffect**: `"link"` \| `"none"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` +> `optional` **aria-dropeffect**: `"none"` \| `"link"` \| `"copy"` \| `"execute"` \| `"move"` \| `"popup"` Indicates what functions can be performed when a dragged object is released on the drop target. @@ -1393,7 +1393,7 @@ node\_modules/@types/react/index.d.ts:2923 ### inputMode? -> `optional` **inputMode**: `"search"` \| `"text"` \| `"none"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` +> `optional` **inputMode**: `"none"` \| `"search"` \| `"text"` \| `"tel"` \| `"url"` \| `"email"` \| `"numeric"` \| `"decimal"` Hints at the type of data that might be entered by the user while editing the element or its contents diff --git a/packages/web/package.json b/packages/web/package.json index bb007f7..413c8ff 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -20,7 +20,6 @@ "source": "./src/main.ts", "main": "./dist/main.cjs", "module": "./dist/main.js", - "unpkg": "./dist/main.umd.cjs", "types": "./dist/main.d.ts", "exports": { ".": { @@ -41,11 +40,11 @@ }, "scripts": { "build": "vite build", - "check": "yarn compile && yarn test", + "check": "yarn compile && yarn test --run", "compile": "tsc -p tsconfig.json", "docs": "typedoc", "release": "semantic-release", - "test": "NODE_ENV=test mocha", + "test": "vitest", "test:silent": "DEBUG_PRINT_LIMIT=0 yarn test", "test:verbose": "DEBUG_PRINT_LIMIT=1000000 yarn test" }, @@ -55,17 +54,15 @@ }, "devDependencies": { "@assertive-ts/core": "^2.1.0", + "@assertive-ts/sinon": "^1.0.0", "@lynxts/core": "workspace:^", "@testing-library/dom": "^10.3.1", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", - "@types/mocha": "^10.0.7", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/sinon": "^17.0.3", - "jsdom": "^24.1.0", - "jsdom-global": "^3.0.2", - "mocha": "^10.6.0", + "happy-dom": "^14.12.3", "react": "^18.3.1", "react-dom": "^18.3.1", "semantic-release": "^24.0.0", @@ -75,6 +72,7 @@ "typescript": "^5.5.3", "vite": "^5.3.3", "vite-plugin-dts": "^3.9.1", + "vitest": "^1.6.0", "yup": "^1.4.0" }, "peerDependencies": { diff --git a/packages/web/test/hooks.ts b/packages/web/test/hooks.ts deleted file mode 100644 index d61d09a..0000000 --- a/packages/web/test/hooks.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Sinon from "sinon"; - -export const mochaHooks: () => Mocha.RootHookObject = () => { - return { - afterEach: () => { - Sinon.restore(); - }, - }; -}; diff --git a/packages/web/test/integration/lib/Form.component.test.tsx b/packages/web/test/integration/lib/Form.component.test.tsx index f5f731a..690bd6b 100644 --- a/packages/web/test/integration/lib/Form.component.test.tsx +++ b/packages/web/test/integration/lib/Form.component.test.tsx @@ -1,6 +1,8 @@ +import { expect } from "@assertive-ts/core"; import { render, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, number, object, string } from "yup"; import { Form } from "../../../src/lib/Form.component"; @@ -15,14 +17,14 @@ const schema: ObjectSchema = object({ other: number().required(), }); -describe("[Integration] Form.component.test.tsx", () => { - context("when the From component is rendered", () => { +suite("[Integration] Form.component.test.tsx", () => { + describe("when the From component is rendered", () => { it("renders a FormProvider children wrapped around a
element", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); const { getByText, findByRole } = render( @@ -47,7 +49,11 @@ describe("[Integration] Form.component.test.tsx", () => { await userEvent.click(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo", other: 5 }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo", other: 5 }); + }); }); }); }); diff --git a/packages/web/test/integration/lib/fields/Input.component.test.tsx b/packages/web/test/integration/lib/fields/Input.component.test.tsx index 5785e26..d3df741 100644 --- a/packages/web/test/integration/lib/fields/Input.component.test.tsx +++ b/packages/web/test/integration/lib/fields/Input.component.test.tsx @@ -3,6 +3,7 @@ import { fireEvent, render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { type ReactElement, useCallback, useState } from "react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, object, string } from "yup"; import { Form } from "../../../../src/lib/Form.component"; @@ -42,11 +43,11 @@ function TestForm({ onSubmit = Sinon.fake }: TestFormProps): ReactElement { ); } -describe("[Integration] Input.component.test.tsx", () => { - context("when the input changes", () => { +suite("[Integration] Input.component.test.tsx", () => { + describe("when the input changes", () => { it("sets the new value in the form context", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const { findByRole } = render(); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const { findByRole } = render(); const nameInput = await findByRole("textbox", { name: "Name: *" }); @@ -56,11 +57,15 @@ describe("[Integration] Input.component.test.tsx", () => { await userEvent.click(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo" }); + }); }); }); - context("when the field looses focus", () => { + describe("when the field looses focus", () => { it("sets the field as touched", async () => { const { findByRole, queryByText, getByText } = render(); @@ -74,7 +79,7 @@ describe("[Integration] Input.component.test.tsx", () => { }); }); - context("when the form context value changes", () => { + describe("when the form context value changes", () => { it("changes the input value", async () => { const { queryByDisplayValue, findByRole, getByDisplayValue } = render(); @@ -94,7 +99,7 @@ describe("[Integration] Input.component.test.tsx", () => { }); }); - context("when the label prop is omitted", () => { + describe("when the label prop is omitted", () => { it("does not render a label on the field", async () => { const { getByRole, queryByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -108,8 +113,8 @@ describe("[Integration] Input.component.test.tsx", () => { }); }); - context("when the requiredText prop is changed", () => { - context("and the required text is not empty", () => { + describe("when the requiredText prop is changed", () => { + describe("and the required text is not empty", () => { it("uses the text instead of the asterisk", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -125,7 +130,7 @@ describe("[Integration] Input.component.test.tsx", () => { }); }); - context("and the required text is empty", () => { + describe("and the required text is empty", () => { it("does not show the required text", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> diff --git a/packages/web/test/integration/lib/fields/Select.component.test.tsx b/packages/web/test/integration/lib/fields/Select.component.test.tsx index f96279b..324e55b 100644 --- a/packages/web/test/integration/lib/fields/Select.component.test.tsx +++ b/packages/web/test/integration/lib/fields/Select.component.test.tsx @@ -3,6 +3,7 @@ import { fireEvent, render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { type ReactElement, useCallback, useState } from "react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, object, string } from "yup"; import { Form } from "../../../../src/lib/Form.component"; @@ -63,11 +64,11 @@ function TestForm({ onSubmit = Sinon.fake }: TestFormProps): ReactElement { ); } -describe("[Integration] Select.component.test.tsx", () => { - context("when the select option changes", () => { +suite("[Integration] Select.component.test.tsx", () => { + describe("when the select option changes", () => { it("sets the new value in the form context", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const { findByRole } = render(); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const { findByRole } = render(); const osSelect = await findByRole("combobox", { name: "OS: *" }); @@ -77,11 +78,15 @@ describe("[Integration] Select.component.test.tsx", () => { await userEvent.click(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { os: "win" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ os: "win" }); + }); }); }); - context("when the field looses focus", () => { + describe("when the field looses focus", () => { it("sets the field as touched", async () => { const { findByRole, queryByText, getByText } = render(); @@ -95,7 +100,7 @@ describe("[Integration] Select.component.test.tsx", () => { }); }); - context("when the form context value changes", () => { + describe("when the form context value changes", () => { it("changes the input value", async () => { const { getAllByDisplayValue, queryByDisplayValue, findByRole, getByDisplayValue } = render(); @@ -116,7 +121,7 @@ describe("[Integration] Select.component.test.tsx", () => { }); }); - context("when the label prop is omitted", () => { + describe("when the label prop is omitted", () => { it("does not render a label on the field", async () => { const { getByRole, queryByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -130,8 +135,8 @@ describe("[Integration] Select.component.test.tsx", () => { }); }); - context("when the requiredText prop is changed", () => { - context("and the required text is not empty", () => { + describe("when the requiredText prop is changed", () => { + describe("and the required text is not empty", () => { it("uses the text instead of the asterisk", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -147,7 +152,7 @@ describe("[Integration] Select.component.test.tsx", () => { }); }); - context("and the reuired text is empty", () => { + describe("and the reuired text is empty", () => { it("does not show the required superscript", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> diff --git a/packages/web/test/integration/lib/fields/Textarea.component.test.tsx b/packages/web/test/integration/lib/fields/Textarea.component.test.tsx index ce5f86f..8f8c58d 100644 --- a/packages/web/test/integration/lib/fields/Textarea.component.test.tsx +++ b/packages/web/test/integration/lib/fields/Textarea.component.test.tsx @@ -3,6 +3,7 @@ import { fireEvent, render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { type ReactElement, useCallback, useState } from "react"; import Sinon from "sinon"; +import { describe, it, suite } from "vitest"; import { type ObjectSchema, object, string } from "yup"; import { Form } from "../../../../src/lib/Form.component"; @@ -45,11 +46,11 @@ function TestForm({ onSubmit = Sinon.fake }: TestFormProps): ReactElement { ); } -describe("[Integration] Textarea.component.test.tsx", () => { - context("when the textarea changes", () => { +suite("[Integration] Textarea.component.test.tsx", () => { + describe("when the textarea changes", () => { it("sets the new value in the form context", async () => { - const spySubmit = Sinon.spy<(values: Foo) => void>(() => undefined); - const { findByRole } = render(); + const submitSpy = Sinon.spy<(values: Foo) => void>(() => undefined); + const { findByRole } = render(); const nameTextarea = await findByRole("textbox", { name: "Name: *" }); @@ -59,11 +60,15 @@ describe("[Integration] Textarea.component.test.tsx", () => { await userEvent.click(submitButton); - Sinon.assert.calledOnceWithExactly(spySubmit, { name: "foo" }); + await waitFor(() => { + expect(submitSpy) + .toBeCalledOnce() + .toHaveArgs({ name: "foo" }); + }); }); }); - context("when the field looses focus", () => { + describe("when the field looses focus", () => { it("sets the field as touched", async () => { const { findByRole, queryByText, getByText } = render(); @@ -77,7 +82,7 @@ describe("[Integration] Textarea.component.test.tsx", () => { }); }); - context("when the form context value changes", () => { + describe("when the form context value changes", () => { it("changes the textarea value", async () => { const { queryByDisplayValue, findByRole, getByDisplayValue } = render(); @@ -97,7 +102,7 @@ describe("[Integration] Textarea.component.test.tsx", () => { }); }); - context("when the label prop is omitted", () => { + describe("when the label prop is omitted", () => { it("does not render a label on the field", async () => { const { getByRole, queryByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -111,8 +116,8 @@ describe("[Integration] Textarea.component.test.tsx", () => { }); }); - context("when the requiredText prop is changed", () => { - context("and the required text is not empty", () => { + describe("when the requiredText prop is changed", () => { + describe("and the required text is not empty", () => { it("uses the text instead of the asterisk", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> @@ -128,7 +133,7 @@ describe("[Integration] Textarea.component.test.tsx", () => { }); }); - context("and the reuired text is empty", () => { + describe("and the reuired text is empty", () => { it("does not show the required superscript", async () => { const { getByRole } = render( onSubmit={Sinon.fake} validation={schema}> diff --git a/packages/web/test/integration/main.test.ts b/packages/web/test/integration/main.test.ts index bc90f59..1d808dd 100644 --- a/packages/web/test/integration/main.test.ts +++ b/packages/web/test/integration/main.test.ts @@ -1,6 +1,7 @@ import { expect } from "@assertive-ts/core"; +import { it, suite } from "vitest"; -describe("[Integration] main.test.ts", () => { +suite("[Integration] main.test.ts", () => { it("re-exports the library exports", async () => { const web = await expect(import("../../src/main")).toBeResolved(); diff --git a/packages/web/test/setup.ts b/packages/web/test/setup.ts new file mode 100644 index 0000000..e2a4ea9 --- /dev/null +++ b/packages/web/test/setup.ts @@ -0,0 +1,29 @@ +import { usePlugin } from "@assertive-ts/core"; +import { SinonPlugin } from "@assertive-ts/sinon"; +import { cleanup } from "@testing-library/react"; +import { userEvent } from "@testing-library/user-event"; +import Sinon from "sinon"; +import { afterEach, beforeEach } from "vitest"; + +process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS = "true"; + +const newUserEvent = userEvent.setup({ + advanceTimers: delay => Sinon.clock.tickAsync(delay).then(), + delay: 0, +}); + +Object.assign(userEvent, newUserEvent); + +usePlugin(SinonPlugin); + +beforeEach(() => { + Sinon.useFakeTimers({ + advanceTimeDelta: 0, + shouldAdvanceTime: true, + }); +}); + +afterEach(() => { + cleanup(); + Sinon.restore(); +}); diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index 3669010..2560f22 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -6,10 +6,16 @@ export default defineConfig({ lib: { entry: "./src/main.ts", fileName: "main", - formats: ["cjs", "es", "umd"], - name: "LynxtsWeb", + formats: ["cjs", "es"], + }, + rollupOptions: { + output: { + exports: "named", + preserveModules: true, + }, }, sourcemap: true, + ssr: true, }, plugins: [ dts({ diff --git a/packages/web/vitest.config.ts b/packages/web/vitest.config.ts new file mode 100644 index 0000000..bc634c9 --- /dev/null +++ b/packages/web/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "happy-dom", + include: ["test/**/*.test.ts?(x)"], + setupFiles: "./test/setup.ts", + }, +}); diff --git a/tsconfig.json b/tsconfig.json index b26cff8..51b6940 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -31,9 +31,5 @@ "build/**", "dist/**", "node_modules/**", - ], - "ts-node": { - "transpileOnly": true, - "files": true - } + ] } diff --git a/yarn.lock b/yarn.lock index 68bb54c..e10dcaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,23 @@ __metadata: languageName: node linkType: hard +"@assertive-ts/sinon@npm:^1.0.0": + version: 1.0.0 + resolution: "@assertive-ts/sinon@npm:1.0.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + "@assertive-ts/core": ">=2.0.0" + sinon: ">=15.2.0" + peerDependenciesMeta: + "@assertive-ts/core": + optional: false + sinon: + optional: true + checksum: 10/89279083bde7fc4aec2708c71bf18d25430c8a39b5eb48dcc8a3ffb358c7145ae5e26b1f08e08ac033350de2c56abaa88a51f3991849dd36016c3c33e36f5c0d + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" @@ -42,7 +59,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.7": +"@babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.24.7": version: 7.24.7 resolution: "@babel/core@npm:7.24.7" dependencies: @@ -65,7 +82,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.24.7, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/generator@npm:7.24.7" dependencies: @@ -345,7 +362,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7": +"@babel/parser@npm:^7.13.16, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.24.7": version: 7.24.7 resolution: "@babel/parser@npm:7.24.7" bin: @@ -536,18 +553,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -635,7 +641,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": +"@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: @@ -657,7 +663,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.24.7, @babel/plugin-syntax-jsx@npm:^7.7.2": +"@babel/plugin-syntax-jsx@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" dependencies: @@ -668,7 +674,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: @@ -690,7 +696,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: @@ -745,7 +751,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": version: 7.14.5 resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: @@ -756,7 +762,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" dependencies: @@ -1580,7 +1586,7 @@ __metadata: languageName: node linkType: hard -"@babel/register@npm:^7.13.16": +"@babel/register@npm:^7.13.16, @babel/register@npm:^7.24.6": version: 7.24.6 resolution: "@babel/register@npm:7.24.6" dependencies: @@ -1611,7 +1617,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.0.0, @babel/template@npm:^7.24.7, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.0.0, @babel/template@npm:^7.24.7": version: 7.24.7 resolution: "@babel/template@npm:7.24.7" dependencies: @@ -1640,7 +1646,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.20.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.24.7 resolution: "@babel/types@npm:7.24.7" dependencies: @@ -1651,13 +1657,6 @@ __metadata: languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 10/1a1f0e356a3bb30b5f1ced6f79c413e6ebacf130421f15fac5fcd8be5ddf98aedb4404d7f5624e3285b700e041f9ef938321f3ca4d359d5b716f96afa120d88d - languageName: node - linkType: hard - "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -1974,81 +1973,6 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: "npm:^5.3.1" - find-up: "npm:^4.1.0" - get-package-type: "npm:^0.1.0" - js-yaml: "npm:^3.13.1" - resolve-from: "npm:^5.0.0" - checksum: 10/b000a5acd8d4fe6e34e25c399c8bdbb5d3a202b4e10416e17bfc25e12bab90bb56d33db6089ae30569b52686f4b35ff28ef26e88e21e69821d2b85884bd055b8 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 10/a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b - languageName: node - linkType: hard - -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10/4a80c750e8a31f344233cb9951dee9b77bf6b89377cb131f8b3cde07ff218f504370133a5963f6a786af4d2ce7f85642db206ff7a15f99fe58df4c38ac04899e - languageName: node - linkType: hard - -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/reporters": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^29.7.0" - jest-config: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-resolve-dependencies: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-ansi: "npm:^6.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/ab6ac2e562d083faac7d8152ec1cc4eccc80f62e9579b69ed40aedf7211a6b2d57024a6cd53c4e35fd051c39a236e86257d1d99ebdb122291969a0a04563b51e - languageName: node - linkType: hard - "@jest/create-cache-key-function@npm:^29.6.3": version: 29.7.0 resolution: "@jest/create-cache-key-function@npm:29.7.0" @@ -2070,25 +1994,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - checksum: 10/ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee - languageName: node - linkType: hard - -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" - dependencies: - expect: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - checksum: 10/fea6c3317a8da5c840429d90bfe49d928e89c9e89fceee2149b93a11b7e9c73d2f6e4d7cdf647163da938fc4e2169e4490be6bae64952902bc7a701033fd4880 - languageName: node - linkType: hard - "@jest/fake-timers@npm:^29.7.0": version: 29.7.0 resolution: "@jest/fake-timers@npm:29.7.0" @@ -2103,55 +2008,6 @@ __metadata: languageName: node linkType: hard -"@jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - jest-mock: "npm:^29.7.0" - checksum: 10/97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 - languageName: node - linkType: hard - -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" - dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - collect-v8-coverage: "npm:^1.0.0" - exit: "npm:^0.1.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - slash: "npm:^3.0.0" - string-length: "npm:^4.0.1" - strip-ansi: "npm:^6.0.0" - v8-to-istanbul: "npm:^9.0.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/a17d1644b26dea14445cedd45567f4ba7834f980be2ef74447204e14238f121b50d8b858fde648083d2cd8f305f81ba434ba49e37a5f4237a6f2a61180cc73dc - languageName: node - linkType: hard - "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -2161,64 +2017,6 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.18" - callsites: "npm:^3.0.0" - graceful-fs: "npm:^4.2.9" - checksum: 10/bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb - languageName: node - linkType: hard - -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: 10/c073ab7dfe3c562bff2b8fee6cc724ccc20aa96bcd8ab48ccb2aa309b4c0c1923a9e703cea386bd6ae9b71133e92810475bb9c7c22328fc63f797ad3324ed189 - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10/4420c26a0baa7035c5419b0892ff8ffe9a41b1583ec54a10db3037cd46a7e29dd3d7202f8aa9d376e9e53be5f8b1bc0d16e1de6880a6d319b033b01dc4c8f639 - languageName: node - linkType: hard - -"@jest/transform@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - babel-plugin-istanbul: "npm:^6.1.1" - chalk: "npm:^4.0.0" - convert-source-map: "npm:^2.0.0" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pirates: "npm:^4.0.4" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^4.0.2" - checksum: 10/30f42293545ab037d5799c81d3e12515790bb58513d37f788ce32d53326d0d72ebf5b40f989e6896739aa50a5f77be44686e510966370d58511d5ad2637c68c1 - languageName: node - linkType: hard - "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -2298,7 +2096,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -2329,19 +2127,16 @@ __metadata: resolution: "@lynxts/core@workspace:packages/core" dependencies: "@assertive-ts/core": "npm:^2.1.0" + "@assertive-ts/sinon": "npm:^1.0.0" "@lukeed/uuid": "npm:^2.0.1" "@testing-library/dom": "npm:^10.3.1" "@testing-library/react": "npm:^16.0.0" "@testing-library/user-event": "npm:^14.5.2" - "@types/mocha": "npm:^10.0.7" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.3.0" "@types/sinon": "npm:^17.0.3" dot-prop-immutable: "npm:^2.1.1" - expect-type: "npm:^0.19.0" - jsdom: "npm:^24.1.0" - jsdom-global: "npm:^3.0.2" - mocha: "npm:^10.6.0" + happy-dom: "npm:^14.12.3" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" scheduler: "npm:^0.23.2" @@ -2353,6 +2148,7 @@ __metadata: use-context-selector: "npm:^2.0.0" vite: "npm:^5.3.3" vite-plugin-dts: "npm:^3.9.1" + vitest: "npm:^1.6.0" yup: "npm:^1.4.0" zod: "npm:^3.23.8" peerDependencies: @@ -2379,22 +2175,21 @@ __metadata: resolution: "@lynxts/native@workspace:packages/native" dependencies: "@assertive-ts/core": "npm:^2.1.0" + "@assertive-ts/sinon": "npm:^1.0.0" "@babel/core": "npm:^7.24.7" "@babel/preset-env": "npm:^7.24.7" "@babel/runtime": "npm:^7.24.7" "@lynxts/core": "workspace:^" "@react-native/babel-preset": "npm:^0.74.85" - "@react-native/metro-config": "npm:^0.74.85" "@testing-library/react-native": "npm:^12.5.1" "@types/node": "npm:^20.14.10" "@types/react": "npm:^18.3.3" "@types/react-test-renderer": "npm:^18.3.0" "@types/sinon": "npm:^17.0.3" - babel-jest: "npm:^29.7.0" - jest: "npm:^29.7.0" react: "npm:^18.3.1" react-fast-compare: "npm:^3.2.2" react-native: "npm:^0.74.3" + react-native-testing-mocks: "npm:^1.4.1" react-test-renderer: "npm:^18.3.1" semantic-release: "npm:^24.0.0" semantic-release-yarn: "npm:^3.0.2" @@ -2404,6 +2199,7 @@ __metadata: typescript: "npm:^5.5.3" vite: "npm:^5.3.3" vite-plugin-dts: "npm:^3.9.1" + vitest: "npm:^1.6.0" yup: "npm:^1.4.0" peerDependencies: "@lynxts/core": ">=1.0.0" @@ -2424,17 +2220,15 @@ __metadata: resolution: "@lynxts/web@workspace:packages/web" dependencies: "@assertive-ts/core": "npm:^2.1.0" + "@assertive-ts/sinon": "npm:^1.0.0" "@lynxts/core": "workspace:^" "@testing-library/dom": "npm:^10.3.1" "@testing-library/react": "npm:^16.0.0" "@testing-library/user-event": "npm:^14.5.2" - "@types/mocha": "npm:^10.0.7" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.3.0" "@types/sinon": "npm:^17.0.3" - jsdom: "npm:^24.1.0" - jsdom-global: "npm:^3.0.2" - mocha: "npm:^10.6.0" + happy-dom: "npm:^14.12.3" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-fast-compare: "npm:^3.2.2" @@ -2445,6 +2239,7 @@ __metadata: typescript: "npm:^5.5.3" vite: "npm:^5.3.3" vite-plugin-dts: "npm:^3.9.1" + vitest: "npm:^1.6.0" yup: "npm:^1.4.0" peerDependencies: "@lynxts/core": ">=1.0.0" @@ -3255,18 +3050,6 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-config@npm:^0.74.85": - version: 0.74.85 - resolution: "@react-native/metro-config@npm:0.74.85" - dependencies: - "@react-native/js-polyfills": "npm:0.74.85" - "@react-native/metro-babel-transformer": "npm:0.74.85" - metro-config: "npm:^0.80.3" - metro-runtime: "npm:^0.80.3" - checksum: 10/381363a706e2c8d866342a61b95cd1cfe3cc1dceda47238dcbe44329e784d698127f8d017ee8d17940bff1330d55fea39390ce8611e35116cf5e485328fde5b4 - languageName: node - linkType: hard - "@react-native/normalize-colors@npm:0.74.85": version: 0.74.85 resolution: "@react-native/normalize-colors@npm:0.74.85" @@ -3953,47 +3736,6 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10/c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.6.8 - resolution: "@types/babel__generator@npm:7.6.8" - dependencies: - "@babel/types": "npm:^7.0.0" - checksum: 10/b53c215e9074c69d212402990b0ca8fa57595d09e10d94bda3130aa22b55d796e50449199867879e4ea0ee968f3a2099e009cfb21a726a53324483abbf25cd30 - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.4 - resolution: "@types/babel__template@npm:7.4.4" - dependencies: - "@babel/parser": "npm:^7.1.0" - "@babel/types": "npm:^7.0.0" - checksum: 10/d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.6 - resolution: "@types/babel__traverse@npm:7.20.6" - dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10/63d13a3789aa1e783b87a8b03d9fb2c2c90078de7782422feff1631b8c2a25db626e63a63ac5a1465d47359201c73069dacb4b52149d17c568187625da3064ae - languageName: node - linkType: hard - "@types/eslint@npm:*, @types/eslint@npm:^8.56.10, @types/eslint@npm:^8.56.5": version: 8.56.10 resolution: "@types/eslint@npm:8.56.10" @@ -4029,15 +3771,6 @@ __metadata: languageName: node linkType: hard -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.9 - resolution: "@types/graceful-fs@npm:4.1.9" - dependencies: - "@types/node": "npm:*" - checksum: 10/79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 - languageName: node - linkType: hard - "@types/hast@npm:^3.0.4": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" @@ -4047,7 +3780,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 @@ -4086,13 +3819,6 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:^10.0.7": - version: 10.0.7 - resolution: "@types/mocha@npm:10.0.7" - checksum: 10/4494871e8a867633d818b00d6f29d47379f9e23655b89ca728166ff2f0a406b97d376fcc3e7a570a3840f72abb03c886c5e66f50ae0f018376e4dc10ed179564 - languageName: node - linkType: hard - "@types/node-forge@npm:^1.3.0": version: 1.3.11 resolution: "@types/node-forge@npm:1.3.11" @@ -4416,6 +4142,60 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/expect@npm:1.6.0" + dependencies: + "@vitest/spy": "npm:1.6.0" + "@vitest/utils": "npm:1.6.0" + chai: "npm:^4.3.10" + checksum: 10/e82304a12e22b98c1ccea81e8f33c838561deb878588eac463164cc4f8fc0c401ace3a9e6758d9e3a6bcc01313e845e8478aaefb7548eaded04b8de12c1928f6 + languageName: node + linkType: hard + +"@vitest/runner@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/runner@npm:1.6.0" + dependencies: + "@vitest/utils": "npm:1.6.0" + p-limit: "npm:^5.0.0" + pathe: "npm:^1.1.1" + checksum: 10/d83a608be36dace77f91a9d15ab7753f9c5923281188a8d9cb5ccec770df9cc9ba80e5e1e3465328c7605977be0f0708610855abf5f4af037a4ede5f51a83e47 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/snapshot@npm:1.6.0" + dependencies: + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + pretty-format: "npm:^29.7.0" + checksum: 10/0bfc26a48b45814604ff0f7276d73a047b79f3618e0b620ff54ea2de548e9603a9770963ba6ebb19f7ea1ed51001cbca58d74aa0271651d4f8e88c6233885eba + languageName: node + linkType: hard + +"@vitest/spy@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/spy@npm:1.6.0" + dependencies: + tinyspy: "npm:^2.2.0" + checksum: 10/1c9698272a58aa47708bb8a1672d655fcec3285b02067cc3f70bfe76f4eda7a756eb379f8c945ccbe61677f5189aeb5ba93c2737a9d7db2de8c4e7bbdffcd372 + languageName: node + linkType: hard + +"@vitest/utils@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/utils@npm:1.6.0" + dependencies: + diff-sequences: "npm:^29.6.3" + estree-walker: "npm:^3.0.3" + loupe: "npm:^2.3.7" + pretty-format: "npm:^29.7.0" + checksum: 10/5c5d7295ac13fcea1da039232bcc7c3fc6f070070fe12ba2ad152456af6e216e48a3ae169016cfcd5055706a00dc567b8f62e4a9b1914f069f52b8f0a3c25e60 + languageName: node + linkType: hard + "@volar/language-core@npm:1.11.1, @volar/language-core@npm:~1.11.1": version: 1.11.1 resolution: "@volar/language-core@npm:1.11.1" @@ -4540,7 +4320,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.3.2": version: 8.3.3 resolution: "acorn-walk@npm:8.3.3" dependencies: @@ -4615,22 +4395,6 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.3": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10/8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 - languageName: node - linkType: hard - "ansi-escapes@npm:^7.0.0": version: 7.0.0 resolution: "ansi-escapes@npm:7.0.0" @@ -4711,7 +4475,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -4926,6 +4690,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 10/fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf + languageName: node + linkType: hard + "ast-types@npm:0.15.2": version: 0.15.2 resolution: "ast-types@npm:0.15.2" @@ -4949,13 +4720,6 @@ __metadata: languageName: node linkType: hard -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10/3ce727cbc78f69d6a4722517a58ee926c8c21083633b1d3fdf66fd688f6c127a53a592141bd4866f9b63240a86e9d8e974b13919450bd17fa33c2d22c4558ad8 - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -4974,45 +4738,12 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" - dependencies: - "@jest/transform": "npm:^29.7.0" - "@types/babel__core": "npm:^7.1.14" - babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^29.6.3" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - slash: "npm:^3.0.0" - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 10/8a0953bd813b3a8926008f7351611055548869e9a53dd36d6e7e96679001f71e65fd7dbfe253265c3ba6a4e630dc7c845cf3e78b17d758ef1880313ce8fba258 - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-instrument: "npm:^5.0.4" - test-exclude: "npm:^6.0.0" - checksum: 10/ffd436bb2a77bbe1942a33245d770506ab2262d9c1b3c1f1da7f0592f78ee7445a95bc2efafe619dd9c1b6ee52c10033d6c7d29ddefe6f5383568e60f31dfe8d - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" +"babel-plugin-extension-resolver@npm:^1.0.12": + version: 1.0.12 + resolution: "babel-plugin-extension-resolver@npm:1.0.12" dependencies: - "@babel/template": "npm:^7.3.3" - "@babel/types": "npm:^7.3.3" - "@types/babel__core": "npm:^7.1.14" - "@types/babel__traverse": "npm:^7.0.6" - checksum: 10/9bfa86ec4170bd805ab8ca5001ae50d8afcb30554d236ba4a7ffc156c1a92452e220e4acbd98daefc12bf0216fccd092d0a2efed49e7e384ec59e0597a926d65 + resolve: "npm:1.17.0" + checksum: 10/08c84f43b01dcedddf08d556aa69b6a6641cde41fbb21e711cfe080d066bc7ed506a463c1f4bd65f35284571dba55c398e846a299fd164f234d447661a4e7a6b languageName: node linkType: hard @@ -5061,40 +4792,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" - dependencies: - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.8.3" - "@babel/plugin-syntax-import-meta": "npm:^7.8.3" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/94561959cb12bfa80867c9eeeace7c3d48d61707d33e55b4c3fdbe82fc745913eb2dbfafca62aef297421b38aadcb58550e5943f50fbcebbeefd70ce2bed4b74 - languageName: node - linkType: hard - -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" - dependencies: - babel-plugin-jest-hoist: "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -5128,7 +4825,7 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0, binary-extensions@npm:^2.3.0": +"binary-extensions@npm:^2.3.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" checksum: 10/bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 @@ -5172,7 +4869,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.3, braces@npm:~3.0.2": +"braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -5181,13 +4878,6 @@ __metadata: languageName: node linkType: hard -"browser-stdout@npm:^1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: 10/ac70a84e346bb7afc5045ec6f22f6a681b15a4057447d4cc1c48a25c6dedb302a49a46dd4ddfb5cdd9c96e0c905a8539be1b98ae7bc440512152967009ec7015 - languageName: node - linkType: hard - "browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": version: 4.23.1 resolution: "browserslist@npm:4.23.1" @@ -5235,6 +4925,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10/002769a0fbfc51c062acd2a59df465a2a947916b02ac50b56c69ec6c018ee99ac3e7f4dd7366334ea847f1ecacf4defaa61bcd2ac283db50156ce1f1d8c8ad42 + languageName: node + linkType: hard + "cacache@npm:^18.0.0, cacache@npm:^18.0.3": version: 18.0.3 resolution: "cacache@npm:18.0.3" @@ -5300,14 +4997,14 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": +"camelcase@npm:^5.0.0": version: 5.3.1 resolution: "camelcase@npm:5.3.1" checksum: 10/e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b languageName: node linkType: hard -"camelcase@npm:^6.0.0, camelcase@npm:^6.2.0": +"camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 10/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d @@ -5321,9 +5018,24 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.3.2, chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" +"chai@npm:^4.3.10": + version: 4.4.1 + resolution: "chai@npm:4.4.1" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.3" + deep-eql: "npm:^4.1.3" + get-func-name: "npm:^2.0.2" + loupe: "npm:^2.3.6" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.0.8" + checksum: 10/c6d7aba913a67529c68dbec3673f94eb9c586c5474cc5142bd0b587c9c9ec9e5fbaa937e038ecaa6475aea31433752d5fabdd033b9248bde6ae53befcde774ae + languageName: node + linkType: hard + +"chalk@npm:^2.3.2, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" dependencies: ansi-styles: "npm:^3.2.1" escape-string-regexp: "npm:^1.0.5" @@ -5356,22 +5068,12 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.5.3": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + get-func-name: "npm:^2.0.2" + checksum: 10/e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 languageName: node linkType: hard @@ -5426,13 +5128,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0": - version: 1.3.1 - resolution: "cjs-module-lexer@npm:1.3.1" - checksum: 10/6629188d5ce74b57e5dce2222db851b5496a8d65b533a05957fb24089a3cec8d769378013c375a954c5a0f7522cde6a36d5a65bfd88f5575cb2de3176046fa8e - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -5562,20 +5257,6 @@ __metadata: languageName: node linkType: hard -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 10/a5d9f37091c70398a269e625cedff5622f200ed0aa0cff22ee7b55ed74a123834b58711776eb0f1dc58eb6ebbc1185aa7567b57bd5979a948c6e4f85073e2c05 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: 10/30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 - languageName: node - linkType: hard - "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -5615,15 +5296,6 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10/2e969e637d05d09fa50b02d74c83a1186f6914aae89e6653b62595cc75a221464f884f55f231b8f4df7a49537fba60bdc0427acd2bf324c09a1dbb84837e36e4 - languageName: node - linkType: hard - "command-exists@npm:^1.2.8": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -5714,6 +5386,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.7": + version: 0.1.7 + resolution: "confbox@npm:0.1.7" + checksum: 10/3086687b9a2a70d44d4b40a2d376536fe7e1baec4a2a34261b21b8a836026b419cbf89ded6054216631823e7d63c415dad4b4d53591d6edbb202bb9820dfa6fa + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -5861,23 +5540,6 @@ __metadata: languageName: node linkType: hard -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - prompts: "npm:^2.0.1" - bin: - create-jest: bin/create-jest.js - checksum: 10/847b4764451672b4174be4d5c6d7d63442ec3aa5f3de52af924e4d996d87d7801c18e125504f25232fc75840f6625b3ac85860fac6ce799b5efae7bdcaf4a2b7 - languageName: node - linkType: hard - "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -5914,15 +5576,6 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^4.0.1": - version: 4.0.1 - resolution: "cssstyle@npm:4.0.1" - dependencies: - rrweb-cssom: "npm:^0.6.0" - checksum: 10/180d4e6b406c30811e55a64add32a2111c9c5da4ed2dc67638ddb55c29b877ec1ed71e2e70a34f59c3523dbee35b0d35aa13b963db1ca8cb929d69c7ce81e3b0 - languageName: node - linkType: hard - "csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -5930,16 +5583,6 @@ __metadata: languageName: node linkType: hard -"data-urls@npm:^5.0.0": - version: 5.0.0 - resolution: "data-urls@npm:5.0.0" - dependencies: - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - checksum: 10/5c40568c31b02641a70204ff233bc4e42d33717485d074244a98661e5f2a1e80e38fe05a5755dfaf2ee549f2ab509d6a3af2a85f4b2ad2c984e5d176695eaf46 - languageName: node - linkType: hard - "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -6024,21 +5667,7 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: 10/b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 - languageName: node - linkType: hard - -"decimal.js@npm:^10.4.3": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10/de663a7bc4d368e3877db95fcd5c87b965569b58d16cdc4258c063d231ca7118748738df17cd638f7e9dd0be8e34cec08d7234b20f1f2a756a52fc5a38b188d0 - languageName: node - linkType: hard - -"dedent@npm:^1.0.0, dedent@npm:^1.5.1": +"dedent@npm:^1.5.1": version: 1.5.3 resolution: "dedent@npm:1.5.3" peerDependencies: @@ -6050,6 +5679,15 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^4.1.3": + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 10/f04f4d581f044a824a6322fe4f68fbee4d6780e93fc710cd9852cbc82bfc7010df00f0e05894b848abbe14dc3a25acac44f424e181ae64d12f2ab9d0a875a5ef + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -6064,7 +5702,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0": +"deepmerge@npm:^4.3.0": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 @@ -6102,13 +5740,6 @@ __metadata: languageName: node linkType: hard -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10/46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - "denodeify@npm:^1.2.1": version: 1.2.1 resolution: "denodeify@npm:1.2.1" @@ -6137,13 +5768,6 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: 10/ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -6236,13 +5860,6 @@ __metadata: languageName: node linkType: hard -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 10/fbe214171d878b924eedf1757badf58a5dce071cd1fa7f620fa841a0901a80d6da47ff05929d53163105e621ce11a71b9d8acb1148ffe1745e045145f6e69521 - languageName: node - linkType: hard - "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -6958,6 +6575,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -7033,33 +6659,6 @@ __metadata: languageName: node linkType: hard -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: 10/387555050c5b3c10e7a9e8df5f43194e95d7737c74532c409910e585d5554eaff34960c166643f5e23d042196529daad059c292dcf1fb61b8ca878d3677f4b87 - languageName: node - linkType: hard - -"expect-type@npm:^0.19.0": - version: 0.19.0 - resolution: "expect-type@npm:0.19.0" - checksum: 10/d1a389095eb082d81d3f4342caf360637c23867a52c63c46b582cd8dfc7c75458a78d9b53b770ed30d05698543c5c17390a58779d084436792e8c395384d61fe - languageName: node - linkType: hard - -"expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10/63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -7087,7 +6686,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e @@ -7224,7 +6823,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": +"find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: @@ -7264,15 +6863,6 @@ __metadata: languageName: node linkType: hard -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10/72479e651c15eab53e25ce04c31bab18cfaac0556505cac19221dbbe85bbb9686bc76e4d397e89e5bf516ce667dcf818f8b07e585568edba55abc2bf1f698fb5 - languageName: node - linkType: hard - "flatted@npm:^3.2.9": version: 3.3.1 resolution: "flatted@npm:3.3.1" @@ -7313,17 +6903,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 10/7264aa760a8cf09482816d8300f1b6e2423de1b02bba612a136857413fdc96d7178298ced106817655facc6b89036c6e12ae31c9eb5bdc16aabf502ae8a5d805 - languageName: node - linkType: hard - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -7465,6 +7044,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10/3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b + languageName: node + linkType: hard + "get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" @@ -7478,13 +7064,6 @@ __metadata: languageName: node linkType: hard -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -7550,7 +7129,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -7584,7 +7163,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^7.1.1, glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -7598,19 +7177,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.1.0": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^5.0.1" - once: "npm:^1.3.0" - checksum: 10/9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -7718,6 +7284,17 @@ __metadata: languageName: node linkType: hard +"happy-dom@npm:^14.12.3": + version: 14.12.3 + resolution: "happy-dom@npm:14.12.3" + dependencies: + entities: "npm:^4.5.0" + webidl-conversions: "npm:^7.0.0" + whatwg-mimetype: "npm:^3.0.0" + checksum: 10/3c254614d41807a7734637a75efd678d7cca41f330a13daec685bc5d4e4a298c687c8cdcbb826afa85f3b76489beacf22ae53e99a6a31181282600eecf7e924e + languageName: node + linkType: hard + "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -7853,22 +7430,6 @@ __metadata: languageName: node linkType: hard -"html-encoding-sniffer@npm:^4.0.0": - version: 4.0.0 - resolution: "html-encoding-sniffer@npm:4.0.0" - dependencies: - whatwg-encoding: "npm:^3.1.1" - checksum: 10/e86efd493293a5671b8239bd099d42128433bb3c7b0fdc7819282ef8e118a21f5dead0ad6f358e024a4e5c84f17ebb7a9b36075220fac0a6222b207248bede6f - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -7889,7 +7450,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": +"http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -7899,7 +7460,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.4": +"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1": version: 7.0.5 resolution: "https-proxy-agent@npm:7.0.5" dependencies: @@ -7930,7 +7491,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -8010,18 +7571,6 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10/bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd - languageName: node - linkType: hard - "import-meta-resolve@npm:^4.0.0": version: 4.1.0 resolution: "import-meta-resolve@npm:4.1.0" @@ -8185,15 +7734,6 @@ __metadata: languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10/078e51b4f956c2c5fd2b26bb2672c3ccf7e1faff38e0ebdba45612265f4e3d9fc3127a1fa8370bbf09eab61339203c3d3b7af5662cbf8be4030f8fac37745b0e - languageName: node - linkType: hard - "is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" @@ -8293,13 +7833,6 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: 10/a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 - languageName: node - linkType: hard - "is-generator-function@npm:^1.0.10": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" @@ -8309,7 +7842,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -8376,13 +7909,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: 10/cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa - languageName: node - linkType: hard - "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -8399,13 +7925,6 @@ __metadata: languageName: node linkType: hard -"is-potential-custom-element-name@npm:^1.0.1": - version: 1.0.1 - resolution: "is-potential-custom-element-name@npm:1.0.1" - checksum: 10/ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab - languageName: node - linkType: hard - "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -8584,71 +8103,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^5.0.4": - version: 5.2.1 - resolution: "istanbul-lib-instrument@npm:5.2.1" - dependencies: - "@babel/core": "npm:^7.12.3" - "@babel/parser": "npm:^7.14.7" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^6.3.0" - checksum: 10/bbc4496c2f304d799f8ec22202ab38c010ac265c441947f075c0f7d46bd440b45c00e46017cf9053453d42182d768b1d6ed0e70a142c95ab00df9843aa5ab80e - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.3 - resolution: "istanbul-lib-instrument@npm:6.0.3" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10/86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10/5526983462799aced011d776af166e350191b816821ea7bcf71cab3e5272657b062c47dc30697a22a43656e3ced78893a42de677f9ccf276a28c913190953b82 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.3": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10/f1faaa4684efaf57d64087776018d7426312a59aa6eeb4e0e3a777347d23cd286ad18f427e98f0e3dee666103d7404c9d7abc5f240406a912fa16bd6695437fa - languageName: node - linkType: hard - "iterator.prototype@npm:^1.1.2": version: 1.1.2 resolution: "iterator.prototype@npm:1.1.2" @@ -8682,109 +8136,6 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" - dependencies: - execa: "npm:^5.0.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - checksum: 10/3d93742e56b1a73a145d55b66e96711fbf87ef89b96c2fab7cfdfba8ec06612591a982111ca2b712bb853dbc16831ec8b43585a2a96b83862d6767de59cbf83d - languageName: node - linkType: hard - -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - co: "npm:^4.6.0" - dedent: "npm:^1.0.0" - is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^29.7.0" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - pure-rand: "npm:^6.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10/716a8e3f40572fd0213bcfc1da90274bf30d856e5133af58089a6ce45089b63f4d679bd44e6be9d320e8390483ebc3ae9921981993986d21639d9019b523123d - languageName: node - linkType: hard - -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" - dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - create-jest: "npm:^29.7.0" - exit: "npm:^0.1.2" - import-local: "npm:^3.0.2" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - yargs: "npm:^17.3.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10/6cc62b34d002c034203065a31e5e9a19e7c76d9e8ef447a6f70f759c0714cb212c6245f75e270ba458620f9c7b26063cd8cf6cd1f7e3afd659a7cc08add17307 - languageName: node - linkType: hard - -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-jest: "npm:^29.7.0" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - deepmerge: "npm:^4.2.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - parse-json: "npm:^5.2.0" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-json-comments: "npm:^3.1.1" - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: 10/6bdf570e9592e7d7dd5124fc0e21f5fe92bd15033513632431b211797e3ab57eaa312f83cc6481b3094b72324e369e876f163579d60016677c117ec4853cf02b - languageName: node - linkType: hard - "jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" @@ -8797,29 +8148,7 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" - dependencies: - detect-newline: "npm:^3.0.0" - checksum: 10/8d48818055bc96c9e4ec2e217a5a375623c0d0bfae8d22c26e011074940c202aa2534a3362294c81d981046885c05d304376afba9f2874143025981148f3e96d - languageName: node - linkType: hard - -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - pretty-format: "npm:^29.7.0" - checksum: 10/bd1a077654bdaa013b590deb5f7e7ade68f2e3289180a8c8f53bc8a49f3b40740c0ec2d3a3c1aee906f682775be2bebbac37491d80b634d15276b0aa0f2e3fda - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.6.3, jest-environment-node@npm:^29.7.0": +"jest-environment-node@npm:^29.6.3": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" dependencies: @@ -8840,39 +8169,6 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/graceful-fs": "npm:^4.1.3" - "@types/node": "npm:*" - anymatch: "npm:^3.0.3" - fb-watchman: "npm:^2.0.0" - fsevents: "npm:^2.3.2" - graceful-fs: "npm:^4.2.9" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: 10/8531b42003581cb18a69a2774e68c456fb5a5c3280b1b9b77475af9e346b6a457250f9d756bfeeae2fe6cbc9ef28434c205edab9390ee970a919baddfa08bb85 - languageName: node - linkType: hard - -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 - languageName: node - linkType: hard - "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -8913,139 +8209,6 @@ __metadata: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: 10/db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 - languageName: node - linkType: hard - -"jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 10/0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" - dependencies: - jest-regex-util: "npm:^29.6.3" - jest-snapshot: "npm:^29.7.0" - checksum: 10/1e206f94a660d81e977bcfb1baae6450cb4a81c92e06fad376cc5ea16b8e8c6ea78c383f39e95591a9eb7f925b6a1021086c38941aa7c1b8a6a813c2f6e93675 - languageName: node - linkType: hard - -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-pnp-resolver: "npm:^1.2.2" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - resolve: "npm:^1.20.0" - resolve.exports: "npm:^2.0.0" - slash: "npm:^3.0.0" - checksum: 10/faa466fd9bc69ea6c37a545a7c6e808e073c66f46ab7d3d8a6ef084f8708f201b85d5fe1799789578b8b47fa1de47b9ee47b414d1863bc117a49e032ba77b7c7 - languageName: node - linkType: hard - -"jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/environment": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - graceful-fs: "npm:^4.2.9" - jest-docblock: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-leak-detector: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-resolve: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - source-map-support: "npm:0.5.13" - checksum: 10/9d8748a494bd90f5c82acea99be9e99f21358263ce6feae44d3f1b0cd90991b5df5d18d607e73c07be95861ee86d1cbab2a3fc6ca4b21805f07ac29d47c1da1e - languageName: node - linkType: hard - -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/globals": "npm:^29.7.0" - "@jest/source-map": "npm:^29.6.3" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - cjs-module-lexer: "npm:^1.0.0" - collect-v8-coverage: "npm:^1.0.0" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10/59eb58eb7e150e0834a2d0c0d94f2a0b963ae7182cfa6c63f2b49b9c6ef794e5193ef1634e01db41420c36a94cefc512cdd67a055cd3e6fa2f41eaf0f82f5a20 - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@babel/generator": "npm:^7.7.2" - "@babel/plugin-syntax-jsx": "npm:^7.7.2" - "@babel/plugin-syntax-typescript": "npm:^7.7.2" - "@babel/types": "npm:^7.3.3" - "@jest/expect-utils": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - chalk: "npm:^4.0.0" - expect: "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - natural-compare: "npm:^1.4.0" - pretty-format: "npm:^29.7.0" - semver: "npm:^7.5.3" - checksum: 10/cb19a3948256de5f922d52f251821f99657339969bf86843bd26cf3332eae94883e8260e3d2fba46129a27c3971c1aa522490e460e16c7fad516e82d10bbf9f8 - languageName: node - linkType: hard - "jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -9060,7 +8223,7 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:^29.6.3, jest-validate@npm:^29.7.0": +"jest-validate@npm:^29.6.3": version: 29.7.0 resolution: "jest-validate@npm:29.7.0" dependencies: @@ -9074,23 +8237,7 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - jest-util: "npm:^29.7.0" - string-length: "npm:^4.0.1" - checksum: 10/4f616e0345676631a7034b1d94971aaa719f0cd4a6041be2aa299be437ea047afd4fe05c48873b7963f5687a2f6c7cbf51244be8b14e313b97bfe32b1e127e55 - languageName: node - linkType: hard - -"jest-worker@npm:^29.6.3, jest-worker@npm:^29.7.0": +"jest-worker@npm:^29.6.3": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" dependencies: @@ -9102,25 +8249,6 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" - dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10/97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a - languageName: node - linkType: hard - "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -9148,6 +8276,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^9.0.0": + version: 9.0.0 + resolution: "js-tokens@npm:9.0.0" + checksum: 10/65e7a55a1a18d61f1cf94bfd7704da870b74337fa08d4c58118e69a8b10225b5ad887ff3ae595d720301b0924811a9b0594c679621a85ecbac6e3aac8533c53b + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -9230,49 +8365,6 @@ __metadata: languageName: node linkType: hard -"jsdom-global@npm:^3.0.2": - version: 3.0.2 - resolution: "jsdom-global@npm:3.0.2" - peerDependencies: - jsdom: ">=10.0.0" - checksum: 10/5c665a412c244d8cfe541da784ff6888c0ed041da3f4c03d7d4ab514215b3f50a934f89c33b543b7848765d841029978a2592dc04b2e0a8734b4bb54809e67d7 - languageName: node - linkType: hard - -"jsdom@npm:^24.1.0": - version: 24.1.0 - resolution: "jsdom@npm:24.1.0" - dependencies: - cssstyle: "npm:^4.0.1" - data-urls: "npm:^5.0.0" - decimal.js: "npm:^10.4.3" - form-data: "npm:^4.0.0" - html-encoding-sniffer: "npm:^4.0.0" - http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.4" - is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.10" - parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.7.0" - saxes: "npm:^6.0.0" - symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^4.1.4" - w3c-xmlserializer: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^3.1.1" - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - ws: "npm:^8.17.0" - xml-name-validator: "npm:^5.0.0" - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10/0821daf73ea4b486f93a51d304037e3864ef3ca515e4646afa997b4f7f6054e6a62aabf34e2e3f2d7e0e76d3ff3d70aa81df07e96145a37988e47318e976242d - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -9650,6 +8742,16 @@ __metadata: languageName: node linkType: hard +"local-pkg@npm:^0.5.0": + version: 0.5.0 + resolution: "local-pkg@npm:0.5.0" + dependencies: + mlly: "npm:^1.4.2" + pkg-types: "npm:^1.0.3" + checksum: 10/20f4caba50dc6fb00ffcc1a78bc94b5acb33995e0aadf4d4edcdeab257e891aa08f50afddf02f3240b2c3d02432bc2078f2a916a280ed716b64753a3d250db70 + languageName: node + linkType: hard + "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -9806,6 +8908,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^2.3.6, loupe@npm:^2.3.7": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10/635c8f0914c2ce7ecfe4e239fbaf0ce1d2c00e4246fafcc4ed000bfdb1b8f89d05db1a220054175cca631ebf3894872a26fffba0124477fcb562f78762848fb1 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2": version: 10.3.1 resolution: "lru-cache@npm:10.3.1" @@ -9860,7 +8971,6 @@ __metadata: eslint-plugin-sonarjs: "npm:^1.0.3" globals: "npm:^15.8.0" semantic-release: "npm:^24.0.0" - ts-node: "npm:^10.9.2" tslib: "npm:^2.6.3" turbo: "npm:^2.0.6" typedoc: "npm:^0.26.3" @@ -9880,7 +8990,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.8": +"magic-string@npm:^0.30.5, magic-string@npm:^0.30.8": version: 0.30.10 resolution: "magic-string@npm:0.30.10" dependencies: @@ -9899,15 +9009,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10/bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a - languageName: node - linkType: hard - "make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" @@ -10262,7 +9363,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -10319,7 +9420,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.2, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -10328,15 +9429,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 - languageName: node - linkType: hard - "minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" @@ -10466,34 +9558,15 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.6.0": - version: 10.6.0 - resolution: "mocha@npm:10.6.0" +"mlly@npm:^1.4.2, mlly@npm:^1.7.1": + version: 1.7.1 + resolution: "mlly@npm:1.7.1" dependencies: - ansi-colors: "npm:^4.1.3" - browser-stdout: "npm:^1.3.1" - chokidar: "npm:^3.5.3" - debug: "npm:^4.3.5" - diff: "npm:^5.2.0" - escape-string-regexp: "npm:^4.0.0" - find-up: "npm:^5.0.0" - glob: "npm:^8.1.0" - he: "npm:^1.2.0" - js-yaml: "npm:^4.1.0" - log-symbols: "npm:^4.1.0" - minimatch: "npm:^5.1.6" - ms: "npm:^2.1.3" - serialize-javascript: "npm:^6.0.2" - strip-json-comments: "npm:^3.1.1" - supports-color: "npm:^8.1.1" - workerpool: "npm:^6.5.1" - yargs: "npm:^16.2.0" - yargs-parser: "npm:^20.2.9" - yargs-unparser: "npm:^2.0.0" - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 10/8e9901f4c8a3299c3e1b65821778915622aa0b5758acbe6d5b96f142843e23562b6aa3c87c2baa8626640ecb7e6b956d7a6cdb622ac8422d43a13558cb748e42 + acorn: "npm:^8.11.3" + pathe: "npm:^1.1.2" + pkg-types: "npm:^1.1.1" + ufo: "npm:^1.5.3" + checksum: 10/c1ef3989e95fb6c6c27a238330897b01f46507020501f45a681f2cae453f982e38dcb0e45aa65f672ea7280945d4a729d266f17a8acb187956f312b0cafddf61 languageName: node linkType: hard @@ -10511,7 +9584,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.2, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.2": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -10712,7 +9785,7 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 @@ -10928,13 +10001,6 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.10": - version: 2.2.10 - resolution: "nwsapi@npm:2.2.10" - checksum: 10/b310e9dd0886da338cbbb1be9fec473a50269e2935d537f95a03d0038f7ea831ce12b4816d97f42e458e5273158aea2a6c86bc4bb60f79911226154aa66740f7 - languageName: node - linkType: hard - "ob1@npm:0.80.9": version: 0.80.9 resolution: "ob1@npm:0.80.9" @@ -11174,7 +10240,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -11183,6 +10249,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^5.0.0": + version: 5.0.0 + resolution: "p-limit@npm:5.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10/87bf5837dee6942f0dbeff318436179931d9a97848d1b07dbd86140a477a5d2e6b90d9701b210b4e21fe7beaea2979dfde366e4f576fa644a59bd4d6a6371da7 + languageName: node + linkType: hard + "p-locate@npm:^2.0.0": version: 2.0.0 resolution: "p-locate@npm:2.0.0" @@ -11392,16 +10467,7 @@ __metadata: "parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" - checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 - languageName: node - linkType: hard - -"parse5@npm:^7.1.2": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 10/3c86806bb0fb1e9a999ff3a4c883b1ca243d99f45a619a0898dbf021a95a0189ed955c31b07fe49d342b54e814f33f2c9d7489198e8630dacd5477d413ec5782 + checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 languageName: node linkType: hard @@ -11492,6 +10558,20 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 10/b50a4751068aa3a5428f5a0b480deecedc6f537666a3630a0c2ae2d5e7c0f4bf0ee77b48404441ec1220bef0c91625e6030b3d3cf5a32ab0d9764018d1d9dbb6 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": version: 1.0.1 resolution: "picocolors@npm:1.0.1" @@ -11499,7 +10579,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc @@ -11527,7 +10607,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.4, pirates@npm:^4.0.6": +"pirates@npm:^4.0.6": version: 4.0.6 resolution: "pirates@npm:4.0.6" checksum: 10/d02dda76f4fec1cbdf395c36c11cf26f76a644f9f9a1bfa84d3167d0d3154d5289aacc72677aa20d599bb4a6937a471de1b65c995e2aea2d8687cbcd7e43ea5f @@ -11553,12 +10633,14 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" +"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1": + version: 1.1.3 + resolution: "pkg-types@npm:1.1.3" dependencies: - find-up: "npm:^4.0.0" - checksum: 10/9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + confbox: "npm:^0.1.7" + mlly: "npm:^1.7.1" + pathe: "npm:^1.1.2" + checksum: 10/06c03ca679ea8e3a1ea7cb74e92af1a486a6081401aac35f6aa51fb6f0855cd86bbfc713f9bfdaaa730815b5ae147b4d6a838710b550c1c4b3f54a6653ff04a3 languageName: node linkType: hard @@ -11708,7 +10790,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1, prompts@npm:^2.4.2": +"prompts@npm:^2.4.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -11752,13 +10834,6 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 - languageName: node - linkType: hard - "punycode.js@npm:^2.3.1": version: 2.3.1 resolution: "punycode.js@npm:2.3.1" @@ -11766,20 +10841,13 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": +"punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.1.0 - resolution: "pure-rand@npm:6.1.0" - checksum: 10/256aa4bcaf9297256f552914e03cbdb0039c8fe1db11fa1e6d3f80790e16e563eb0a859a1e61082a95e224fc0c608661839439f8ecc6a3db4e48d46d99216ee4 - languageName: node - linkType: hard - "qrcode-terminal@npm:^0.12.0": version: 0.12.0 resolution: "qrcode-terminal@npm:0.12.0" @@ -11796,13 +10864,6 @@ __metadata: languageName: node linkType: hard -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 10/46ab16f252fd892fc29d6af60966d338cdfeea68a231e9457631ffd22d67cec1e00141e0a5236a2eb16c0d7d74175d9ec1d6f963660c6f2b1c2fc85b194c5680 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -11826,15 +10887,6 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10/4efd1ad3d88db77c2d16588dc54c2b52fd2461e70fe5724611f38d283857094fe09040fa2c9776366803c3152cf133171b452ef717592b65631ce5dc3a2bdafc - languageName: node - linkType: hard - "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -11906,6 +10958,32 @@ __metadata: languageName: node linkType: hard +"react-native-testing-mocks@npm:^1.4.1": + version: 1.4.1 + resolution: "react-native-testing-mocks@npm:1.4.1" + dependencies: + "@babel/core": "npm:^7.24.7" + "@babel/register": "npm:^7.24.6" + babel-plugin-extension-resolver: "npm:^1.0.12" + debug: "npm:^4.3.5" + dot-prop-immutable: "npm:^2.1.1" + supports-color: "npm:^9.4.0" + ts-pattern: "npm:^5.2.0" + peerDependencies: + "@react-native/babel-preset": ">=0.73.18" + react: ">=18.2.0" + react-native: ">=0.73.2" + peerDependenciesMeta: + "@react-native/babel-preset": + optional: false + react: + optional: false + react-native: + optional: false + checksum: 10/341009111c6faf5249b8f76a6598dc5db8e08352b422e4b4cfd0e1a2e230bd95dd54036ca4d2af1405792ba94514673814651515e6259d82cd2f7d771aca3959 + languageName: node + linkType: hard + "react-native@npm:^0.74.3": version: 0.74.3 resolution: "react-native@npm:0.74.3" @@ -12088,15 +11166,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10/196b30ef6ccf9b6e18c4e1724b7334f72a093d011a99f3b5920470f0b3406a51770867b3e1ae9711f227ef7a7065982f6ee2ce316746b2cb42c88efe44297fe7 - languageName: node - linkType: hard - "readline@npm:^1.3.0": version: 1.3.0 resolution: "readline@npm:1.3.0" @@ -12247,22 +11316,6 @@ __metadata: languageName: node linkType: hard -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10/878880ee78ccdce372784f62f52a272048e2d0827c29ae31e7f99da18b62a2b9463ea03a75f277352f4697c100183debb0532371ad515a2d49d4bfe596dd4c20 - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: "npm:^5.0.0" - checksum: 10/546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - "resolve-from@npm:^3.0.0": version: 3.0.0 resolution: "resolve-from@npm:3.0.0" @@ -12291,14 +11344,16 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 10/f1cc0b6680f9a7e0345d783e0547f2a5110d8336b3c2a4227231dd007271ffd331fd722df934f017af90bae0373920ca0d4005da6f76cb3176c8ae426370f893 +"resolve@npm:1.17.0": + version: 1.17.0 + resolution: "resolve@npm:1.17.0" + dependencies: + path-parse: "npm:^1.0.6" + checksum: 10/74141da8c56192fd46f6aa887864f8fd74c1755425174526610cb775177278bb414c6f6feb3051ccd73d774d2ae124c6c97e463e30d7ffd9a87f7da202b851dd languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.4, resolve@npm:~1.22.1": +"resolve@npm:^1.14.2, resolve@npm:^1.22.4, resolve@npm:~1.22.1": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -12334,7 +11389,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": +"resolve@patch:resolve@npm%3A1.17.0#optional!builtin": + version: 1.17.0 + resolution: "resolve@patch:resolve@npm%3A1.17.0#optional!builtin::version=1.17.0&hash=c3c19d" + dependencies: + path-parse: "npm:^1.0.6" + checksum: 10/02e87fe9233d169fdc5220572c7b8933c9e23323aaecfd5b8d0b106a7f09dc676dd4d380e66c72b1369489292bcb337b13aad28b480a1bde5a5c040ff16758ea + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -12479,20 +11543,6 @@ __metadata: languageName: node linkType: hard -"rrweb-cssom@npm:^0.6.0": - version: 0.6.0 - resolution: "rrweb-cssom@npm:0.6.0" - checksum: 10/5411836a4a78d6b68480767b8312de291f32d5710a278343954a778e5b420eaf13c90d9d2a942acf4718ddf497baa75ce653a314b332a380b6eaae1dee72257e - languageName: node - linkType: hard - -"rrweb-cssom@npm:^0.7.0": - version: 0.7.1 - resolution: "rrweb-cssom@npm:0.7.1" - checksum: 10/e80cf25c223a823921d7ab57c0ce78f5b7ebceab857b400cce99dd4913420ce679834bc5707e8ada47d062e21ad368108a9534c314dc8d72c20aa4a4fa0ed16a - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -12521,7 +11571,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -12546,15 +11596,6 @@ __metadata: languageName: node linkType: hard -"saxes@npm:^6.0.0": - version: 6.0.0 - resolution: "saxes@npm:6.0.0" - dependencies: - xmlchars: "npm:^2.2.0" - checksum: 10/97b50daf6ca3a153e89842efa18a862e446248296622b7473c169c84c823ee8a16e4a43bac2f73f11fc8cb9168c73fbb0d73340f26552bac17970e9052367aa9 - languageName: node - linkType: hard - "scheduler@npm:0.24.0-canary-efb381bbf-20230505": version: 0.24.0-canary-efb381bbf-20230505 resolution: "scheduler@npm:0.24.0-canary-efb381bbf-20230505" @@ -12667,7 +11708,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -12724,15 +11765,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10/445a420a6fa2eaee4b70cbd884d538e259ab278200a2ededd73253ada17d5d48e91fb1f4cd224a236ab62ea7ba0a70c6af29fc93b4f3d3078bf7da1c031fde58 - languageName: node - linkType: hard - "serve-static@npm:^1.13.1": version: 1.15.0 resolution: "serve-static@npm:1.15.0" @@ -12839,7 +11871,14 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10/e93ff66c6531a079af8fb217240df01f980155b5dc408d2d7bebc398dd284e383eb318153bf8acd4db3c4fe799aa5b9a641e38b0ba3b1975700b1c89547ea4e7 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -12975,16 +12014,6 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10/d1514a922ac9c7e4786037eeff6c3322f461cd25da34bb9fefb15387b3490531774e6e31d95ab6d5b84a3e139af9c3a570ccaee6b47bd7ea262691ed3a8bc34e - languageName: node - linkType: hard - "source-map-support@npm:^0.5.16, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -13108,6 +12137,13 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10/2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + "stackframe@npm:^1.3.4": version: 1.3.4 resolution: "stackframe@npm:1.3.4" @@ -13138,6 +12174,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.5.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + languageName: node + linkType: hard + "stream-combiner2@npm:~1.1.1": version: 1.1.1 resolution: "stream-combiner2@npm:1.1.1" @@ -13155,16 +12198,6 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: "npm:^1.0.2" - strip-ansi: "npm:^6.0.0" - checksum: 10/ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -13293,13 +12326,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 10/9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -13344,6 +12370,15 @@ __metadata: languageName: node linkType: hard +"strip-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "strip-literal@npm:2.1.0" + dependencies: + js-tokens: "npm:^9.0.0" + checksum: 10/21c813aa1e669944e7e2318c8c927939fb90b0c52f53f57282bfc3dd6e19d53f70004f1f1693e33e5e790ad5ef102b0fce2b243808229d1ce07ae71f326c0e82 + languageName: node + linkType: hard + "strnum@npm:^1.0.5": version: 1.0.5 resolution: "strnum@npm:1.0.5" @@ -13386,7 +12421,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1, supports-color@npm:~8.1.1": +"supports-color@npm:^8.0.0, supports-color@npm:~8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -13419,13 +12454,6 @@ __metadata: languageName: node linkType: hard -"symbol-tree@npm:^3.2.4": - version: 3.2.4 - resolution: "symbol-tree@npm:3.2.4" - checksum: 10/c09a00aadf279d47d0c5c46ca3b6b2fbaeb45f0a184976d599637d412d3a70bbdc043ff33effe1206dea0e36e0ad226cb957112e7ce9a4bf2daedf7fa4f85c53 - languageName: node - linkType: hard - "synckit@npm:^0.9.0": version: 0.9.0 resolution: "synckit@npm:0.9.0" @@ -13506,17 +12534,6 @@ __metadata: languageName: node linkType: hard -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10/8fccb2cb6c8fcb6bb4115394feb833f8b6cf4b9503ec2485c2c90febf435cac62abe882a0c5c51a37b9bbe70640cdd05acf5f45e486ac4583389f4b0855f69e5 - languageName: node - linkType: hard - "text-table@npm:^0.2.0, text-table@npm:~0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -13582,6 +12599,27 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.5.1": + version: 2.8.0 + resolution: "tinybench@npm:2.8.0" + checksum: 10/9731d070bedee6d44f3bb565862c284776e6adfd70d81a051a5c79b77479408509b448ad8d467d538d18bc0ae857b3ead8168d7e98d7f1355f8a0b01aa2f163b + languageName: node + linkType: hard + +"tinypool@npm:^0.8.3": + version: 0.8.4 + resolution: "tinypool@npm:0.8.4" + checksum: 10/7365944c2532f240111443e7012be31a634faf1a02db08a91db3aa07361c26a374d0be00a0f2ea052c4bee39c107ba67f1f814c108d9d51dfc725c559c1a9c03 + languageName: node + linkType: hard + +"tinyspy@npm:^2.2.0": + version: 2.2.1 + resolution: "tinyspy@npm:2.2.1" + checksum: 10/170d6232e87f9044f537b50b406a38fbfd6f79a261cd12b92879947bd340939a833a678632ce4f5c4a6feab4477e9c21cd43faac3b90b68b77dd0536c4149736 + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -13619,27 +12657,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.4": - version: 4.1.4 - resolution: "tough-cookie@npm:4.1.4" - dependencies: - psl: "npm:^1.1.33" - punycode: "npm:^2.1.1" - universalify: "npm:^0.2.0" - url-parse: "npm:^1.5.3" - checksum: 10/75663f4e2cd085f16af0b217e4218772adf0617fb3227171102618a54ce0187a164e505d61f773ed7d65988f8ff8a8f935d381f87da981752c1171b076b4afac - languageName: node - linkType: hard - -"tr46@npm:^5.0.0": - version: 5.0.0 - resolution: "tr46@npm:5.0.0" - dependencies: - punycode: "npm:^2.3.1" - checksum: 10/29155adb167d048d3c95d181f7cb5ac71948b4e8f3070ec455986e1f34634acae50ae02a3c8d448121c3afe35b76951cd46ed4c128fd80264280ca9502237a3e - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -13708,6 +12725,13 @@ __metadata: languageName: node linkType: hard +"ts-pattern@npm:^5.2.0": + version: 5.2.0 + resolution: "ts-pattern@npm:5.2.0" + checksum: 10/d85607629a46d93a6245b3b17238648fda49d3ab01366df4d049dd5b293876de599f0a810c9a62de13adad38028ffb336539f612bc2686a1f879cd1f3f671a0c + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -13852,20 +12876,13 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8, type-detect@npm:^4.0.8": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 10/5179e3b8ebc51fce1b13efb75fdea4595484433f9683bbc2dca6d99789dba4e602ab7922d2656f2ce8383987467f7770131d4a7f06a26287db0615d2f4c4ce7d languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10/f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f - languageName: node - linkType: hard - "type-fest@npm:^0.7.1": version: 0.7.1 resolution: "type-fest@npm:0.7.1" @@ -14051,6 +13068,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.5.3": + version: 1.5.3 + resolution: "ufo@npm:1.5.3" + checksum: 10/2b30dddd873c643efecdb58cfe457183cd4d95937ccdacca6942c697b87a2c578232c25a5149fda85436696bf0fdbc213bf2b220874712bc3e58c0fb00a2c950 + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.18.0 resolution: "uglify-js@npm:3.18.0" @@ -14165,13 +13189,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: 10/e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 - languageName: node - linkType: hard - "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -14216,16 +13233,6 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: "npm:^2.1.1" - requires-port: "npm:^1.0.0" - checksum: 10/c9e96bc8c5b34e9f05ddfeffc12f6aadecbb0d971b3cc26015b58d5b44676a99f50d5aeb1e5c9e61fa4d49961ae3ab1ae997369ed44da51b2f5ac010d188e6ad - languageName: node - linkType: hard - "use-context-selector@npm:^2.0.0": version: 2.0.0 resolution: "use-context-selector@npm:2.0.0" @@ -14257,17 +13264,6 @@ __metadata: languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.1": - version: 9.3.0 - resolution: "v8-to-istanbul@npm:9.3.0" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.12" - "@types/istanbul-lib-coverage": "npm:^2.0.1" - convert-source-map: "npm:^2.0.0" - checksum: 10/fb1d70f1176cb9dc46cabbb3fd5c52c8f3e8738b61877b6e7266029aed0870b04140e3f9f4550ac32aebcfe1d0f38b0bac57e1e8fb97d68fec82f2b416148166 - languageName: node - linkType: hard - "validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -14299,6 +13295,21 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:1.6.0": + version: 1.6.0 + resolution: "vite-node@npm:1.6.0" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.4" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + vite: "npm:^5.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10/40230598c3c285cf65f407ac50b1c7753ab2dfa960de76ec1a95a0ce0ff963919d065c29ba538d9fb2fba3e0703a051d49d1ad6486001ba2f90616cc706ddc3d + languageName: node + linkType: hard + "vite-plugin-dts@npm:^3.9.1": version: 3.9.1 resolution: "vite-plugin-dts@npm:3.9.1" @@ -14320,7 +13331,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.3.3": +"vite@npm:^5.0.0, vite@npm:^5.3.3": version: 5.3.3 resolution: "vite@npm:5.3.3" dependencies: @@ -14360,6 +13371,56 @@ __metadata: languageName: node linkType: hard +"vitest@npm:^1.6.0": + version: 1.6.0 + resolution: "vitest@npm:1.6.0" + dependencies: + "@vitest/expect": "npm:1.6.0" + "@vitest/runner": "npm:1.6.0" + "@vitest/snapshot": "npm:1.6.0" + "@vitest/spy": "npm:1.6.0" + "@vitest/utils": "npm:1.6.0" + acorn-walk: "npm:^8.3.2" + chai: "npm:^4.3.10" + debug: "npm:^4.3.4" + execa: "npm:^8.0.1" + local-pkg: "npm:^0.5.0" + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + std-env: "npm:^3.5.0" + strip-literal: "npm:^2.0.0" + tinybench: "npm:^2.5.1" + tinypool: "npm:^0.8.3" + vite: "npm:^5.0.0" + vite-node: "npm:1.6.0" + why-is-node-running: "npm:^2.2.2" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 1.6.0 + "@vitest/ui": 1.6.0 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10/ad921a723ac9438636d37111f0b2ea5afd0ba4a7813fb75382b9f75574e10d533cf950573ebb9332a595ce197cb83593737a6b55a3b6e6eb00bddbcd0920a03e + languageName: node + linkType: hard + "vlq@npm:^1.0.0": version: 1.0.1 resolution: "vlq@npm:1.0.1" @@ -14392,15 +13453,6 @@ __metadata: languageName: node linkType: hard -"w3c-xmlserializer@npm:^5.0.0": - version: 5.0.0 - resolution: "w3c-xmlserializer@npm:5.0.0" - dependencies: - xml-name-validator: "npm:^5.0.0" - checksum: 10/d78f59e6b4f924aa53b6dfc56949959229cae7fe05ea9374eb38d11edcec01398b7f5d7a12576bd5acc57ff446abb5c9115cd83b9d882555015437cf858d42f0 - languageName: node - linkType: hard - "walk-up-path@npm:^3.0.1": version: 3.0.1 resolution: "walk-up-path@npm:3.0.1" @@ -14408,7 +13460,7 @@ __metadata: languageName: node linkType: hard -"walker@npm:^1.0.7, walker@npm:^1.0.8": +"walker@npm:^1.0.7": version: 1.0.8 resolution: "walker@npm:1.0.8" dependencies: @@ -14440,15 +13492,6 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^3.1.1": - version: 3.1.1 - resolution: "whatwg-encoding@npm:3.1.1" - dependencies: - iconv-lite: "npm:0.6.3" - checksum: 10/bbef815eb67f91487c7f2ef96329743f5fd8357d7d62b1119237d25d41c7e452dff8197235b2d3c031365a17f61d3bb73ca49d0ed1582475aa4a670815e79534 - languageName: node - linkType: hard - "whatwg-fetch@npm:^3.0.0": version: 3.6.20 resolution: "whatwg-fetch@npm:3.6.20" @@ -14456,20 +13499,10 @@ __metadata: languageName: node linkType: hard -"whatwg-mimetype@npm:^4.0.0": - version: 4.0.0 - resolution: "whatwg-mimetype@npm:4.0.0" - checksum: 10/894a618e2d90bf444b6f309f3ceb6e58cf21b2beaa00c8b333696958c4076f0c7b30b9d33413c9ffff7c5832a0a0c8569e5bb347ef44beded72aeefd0acd62e8 - languageName: node - linkType: hard - -"whatwg-url@npm:^14.0.0": - version: 14.0.0 - resolution: "whatwg-url@npm:14.0.0" - dependencies: - tr46: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - checksum: 10/67ea7a359a90663b28c816d76379b4be62d13446e9a4c0ae0b5ae0294b1c22577750fcdceb40827bb35a61777b7093056953c856604a28b37d6a209ba59ad062 +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 10/96f9f628c663c2ae05412c185ca81b3df54bcb921ab52fe9ebc0081c1720f25d770665401eb2338ab7f48c71568133845638e18a81ed52ab5d4dcef7d22b40ef languageName: node linkType: hard @@ -14570,6 +13603,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.2.2": + version: 2.2.2 + resolution: "why-is-node-running@npm:2.2.2" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10/f3582e0337f4b25537d492b1d40f00b978ce04b1d1eeea8f310bfa8aae8a7d11d118d672e2f0760c164ce3753a620a70aa29ff3620e340197624940cf9c08615 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -14584,13 +13629,6 @@ __metadata: languageName: node linkType: hard -"workerpool@npm:^6.5.1": - version: 6.5.1 - resolution: "workerpool@npm:6.5.1" - checksum: 10/b1b00139fe62f2ebec556a2af8085bf6e7502ad26cf2a4dcb34fb4408b2e68aa12c88b0a50cb463b24f2806d60fa491fc0da933b56ec3b53646aeec0025d14cb - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -14642,16 +13680,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.7" - checksum: 10/3be1f5508a46c190619d5386b1ac8f3af3dbe951ed0f7b0b4a0961eed6fc626bd84b50cf4be768dabc0a05b672f5d0c5ee7f42daa557b14415d18c3a13c7d246 - languageName: node - linkType: hard - "write-file-atomic@npm:^5.0.0, write-file-atomic@npm:^5.0.1": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" @@ -14686,35 +13714,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.17.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6 - languageName: node - linkType: hard - -"xml-name-validator@npm:^5.0.0": - version: 5.0.0 - resolution: "xml-name-validator@npm:5.0.0" - checksum: 10/43f30f3f6786e406dd665acf08cd742d5f8a46486bd72517edb04b27d1bcd1599664c2a4a99fc3f1e56a3194bff588b12f178b7972bc45c8047bdc4c3ac8d4a1 - languageName: node - linkType: hard - -"xmlchars@npm:^2.2.0": - version: 2.2.0 - resolution: "xmlchars@npm:2.2.0" - checksum: 10/4ad5924974efd004a47cce6acf5c0269aee0e62f9a805a426db3337af7bcbd331099df174b024ace4fb18971b8a56de386d2e73a1c4b020e3abd63a4a9b917f1 - languageName: node - linkType: hard - "xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -14769,7 +13768,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9": +"yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc @@ -14783,18 +13782,6 @@ __metadata: languageName: node linkType: hard -"yargs-unparser@npm:^2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: "npm:^6.0.0" - decamelize: "npm:^4.0.0" - flat: "npm:^5.0.2" - is-plain-obj: "npm:^2.1.0" - checksum: 10/68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 - languageName: node - linkType: hard - "yargs@npm:^15.1.0": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -14814,7 +13801,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.0.0, yargs@npm:^16.2.0": +"yargs@npm:^16.0.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -14829,7 +13816,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.5.1, yargs@npm:^17.6.2": +"yargs@npm:^17.0.0, yargs@npm:^17.5.1, yargs@npm:^17.6.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -14858,6 +13845,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.0.0": + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10/f2e05b767ed3141e6372a80af9caa4715d60969227f38b1a4370d60bffe153c9c5b33a862905609afc9b375ec57cd40999810d20e5e10229a204e8bde7ef255c + languageName: node + linkType: hard + "yoctocolors@npm:^2.0.0": version: 2.1.1 resolution: "yoctocolors@npm:2.1.1"