diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index c3a3feb..2874c90 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -16,7 +16,14 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: '10.0.x' + global-json-file: global.json + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + cache-dependency-path: TypeShim.E2E/vitest/package-lock.json + - name: Restore run: > dotnet nuget disable source LocalDev && @@ -26,16 +33,33 @@ jobs: dotnet build TypeShim.slnx --configuration Release --no-restore - - name: Test + + - name: Initialize E2E + working-directory: TypeShim.E2E/vitest + run: npm run initialize + + - name: Run Unit Tests run: > dotnet test TypeShim.slnx --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=test-results.trx" + + - name: Run E2E (Node) + if: (!cancelled()) + working-directory: TypeShim.E2E/vitest + run: npm run test:node + + - name: Run E2E (Browser) + if: (!cancelled()) + working-directory: TypeShim.E2E/vitest + run: npm run test:browser + - name: Publish Test Results uses: EnricoMi/publish-unit-test-result-action@v2 if: (!cancelled()) with: files: | **/*.trx + **/e2e-report-*.xml diff --git a/Sample/TypeShim.Sample.Client/@typeshim/app/src/App.tsx b/Sample/TypeShim.Sample.Client/@typeshim/app/src/App.tsx index 53b280e..0f67ec8 100644 --- a/Sample/TypeShim.Sample.Client/@typeshim/app/src/App.tsx +++ b/Sample/TypeShim.Sample.Client/@typeshim/app/src/App.tsx @@ -2,9 +2,7 @@ import { useMemo, useState } from 'react'; import Home from './pages/Home'; import People from './pages/People'; import CapabilitiesPage from './pages/Capabilities'; - import { createWasmRuntime, MyApp, TypeShimInitializer } from '@typeshim/wasm-exports'; -import { CompilationTest, ExportedClass } from "@typeshim/wasm-exports"; type Page = 'home' | 'people' | 'capabilities'; @@ -15,8 +13,6 @@ function App() { const runtimeInfo = await createWasmRuntime(); TypeShimInitializer.initialize(runtimeInfo); MyApp.Initialize(document.baseURI); - - E2E(); }, []); return ( @@ -62,87 +58,4 @@ function App() { ); } -export default App; - -function E2E() { - console.log("Starting E2E CompilationTest..."); - const exportedClass = new ExportedClass({ Id: 1 }); - const testObject = new CompilationTest({ - NIntProperty: 1, - ByteProperty: 2, - ShortProperty: 3, - IntProperty: 4, - LongProperty: 5, - BoolProperty: true, - StringProperty: "Test", - CharProperty: 'A', - DoubleProperty: 6.7, - FloatProperty: 8.9, - DateTimeProperty: new Date(), - DateTimeOffsetProperty: new Date(), - ExportedClassProperty: exportedClass, - ObjectProperty: exportedClass.instance, - JSObjectProperty: { foo: "bar" }, - TaskProperty: Promise.resolve(), - TaskOfByteProperty: Promise.resolve(22), - TaskOfNIntProperty: Promise.resolve(42), - TaskOfShortProperty: Promise.resolve(43), - TaskOfIntProperty: Promise.resolve(44), - TaskOfLongProperty: Promise.resolve(45), - TaskOfBoolProperty: Promise.resolve(true), - TaskOfCharProperty: Promise.resolve('B'), - TaskOfStringProperty: Promise.resolve("Task String"), - TaskOfDoubleProperty: Promise.resolve(67.8), - TaskOfFloatProperty: Promise.resolve(89.0), - TaskOfDateTimeProperty: Promise.resolve(new Date()), - TaskOfDateTimeOffsetProperty: Promise.resolve(new Date()), - TaskOfObjectProperty: Promise.resolve(exportedClass.instance), - TaskOfExportedClassProperty: Promise.resolve(exportedClass), - TaskOfJSObjectProperty: Promise.resolve({ baz: "qux" }), - ByteArrayProperty: [1, 2, 3], - IntArrayProperty: [7, 8, 9], - StringArrayProperty: ["one", "two", "three"], - DoubleArrayProperty: [1.1, 2.2, 3.3], - JSObjectArrayProperty: [{ a: 1 }, { b: 2 }, { c: 3 }], - ObjectArrayProperty: [exportedClass.instance], - ExportedClassArrayProperty: [exportedClass], - }); - - console.log("E2E CompilationTest instance:", testObject, CompilationTest.materialize(testObject)); - - testObject.CharProperty = 'Z'; - if (testObject.CharProperty !== 'Z') { - console.error(`E2E CharProperty value mismatch. Expected 'Z', got '${testObject.CharProperty}'`); - } - testObject.TaskOfCharProperty = Promise.resolve('Y'); - testObject.TaskOfCharProperty.then(value => { - if (value === 'Y') return; - console.error(`E2E TaskOfCharProperty value mismatch. Expected 'Y', got '${value}'`); - }).catch(err => { - console.error("E2E TaskOfCharProperty error:", err); - }); - - testObject.StringProperty = "Updated Test"; - if (testObject.StringProperty !== "Updated Test") { - console.error(`E2E StringProperty value mismatch. Expected 'Updated Test', got '${testObject.StringProperty}'`); - } - testObject.TaskOfStringProperty = Promise.resolve("Updated Task String"); - testObject.TaskOfStringProperty.then(value => { - if (value === "Updated Task String") return; - console.error(`E2E TaskOfStringProperty value mismatch. Expected 'Updated Task String', got '${value}'`); - }).catch(err => { - console.error("E2E TaskOfStringProperty error:", err); - }); - - testObject.ExportedClassProperty.Id = 99; - if (testObject.ExportedClassProperty.Id !== 99) { - console.error(`E2E ExportedClassProperty.Id value mismatch. Expected 99, got '${testObject.ExportedClassProperty.Id}'`); - } - const newExport = new ExportedClass({ Id: 100 }); - testObject.ExportedClassProperty = newExport; - if (testObject.ExportedClassProperty.Id !== 100) { - console.error(`E2E ExportedClassProperty reassignment value mismatch. Expected 100, got '${testObject.ExportedClassProperty.Id}'`); - } - - console.log("E2E CompilationTest completed."); -} \ No newline at end of file +export default App; \ No newline at end of file diff --git a/Sample/TypeShim.Sample.Client/@typeshim/wasm-exports/typeshim.ts b/Sample/TypeShim.Sample.Client/@typeshim/wasm-exports/typeshim.ts index ff72be0..affc1a1 100644 --- a/Sample/TypeShim.Sample.Client/@typeshim/wasm-exports/typeshim.ts +++ b/Sample/TypeShim.Sample.Client/@typeshim/wasm-exports/typeshim.ts @@ -76,95 +76,6 @@ export interface AssemblyExports{ set_StringProperty(instance: ManagedObject, value: string): void; }; }; - CompilationTestInterop: { - ctor(jsObject: object): ManagedObject; - VoidMethod(instance: ManagedObject): void; - IntMethod(instance: ManagedObject): number; - BoolMethod(instance: ManagedObject): boolean; - StringMethod(instance: ManagedObject): string; - DoubleMethod(instance: ManagedObject): number; - get_NIntProperty(instance: ManagedObject): number; - set_NIntProperty(instance: ManagedObject, value: number): void; - get_ByteProperty(instance: ManagedObject): number; - set_ByteProperty(instance: ManagedObject, value: number): void; - get_ShortProperty(instance: ManagedObject): number; - set_ShortProperty(instance: ManagedObject, value: number): void; - get_IntProperty(instance: ManagedObject): number; - set_IntProperty(instance: ManagedObject, value: number): void; - get_LongProperty(instance: ManagedObject): number; - set_LongProperty(instance: ManagedObject, value: number): void; - get_BoolProperty(instance: ManagedObject): boolean; - set_BoolProperty(instance: ManagedObject, value: boolean): void; - get_StringProperty(instance: ManagedObject): string; - set_StringProperty(instance: ManagedObject, value: string): void; - get_CharProperty(instance: ManagedObject): number; - set_CharProperty(instance: ManagedObject, value: number): void; - get_DoubleProperty(instance: ManagedObject): number; - set_DoubleProperty(instance: ManagedObject, value: number): void; - get_FloatProperty(instance: ManagedObject): number; - set_FloatProperty(instance: ManagedObject, value: number): void; - get_DateTimeProperty(instance: ManagedObject): Date; - set_DateTimeProperty(instance: ManagedObject, value: Date): void; - get_DateTimeOffsetProperty(instance: ManagedObject): Date; - set_DateTimeOffsetProperty(instance: ManagedObject, value: Date): void; - get_ObjectProperty(instance: ManagedObject): ManagedObject; - set_ObjectProperty(instance: ManagedObject, value: ManagedObject): void; - get_ExportedClassProperty(instance: ManagedObject): ManagedObject; - set_ExportedClassProperty(instance: ManagedObject, value: ManagedObject | object): void; - get_JSObjectProperty(instance: ManagedObject): object; - set_JSObjectProperty(instance: ManagedObject, value: object): void; - get_TaskProperty(instance: ManagedObject): Promise; - set_TaskProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfNIntProperty(instance: ManagedObject): Promise; - set_TaskOfNIntProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfShortProperty(instance: ManagedObject): Promise; - set_TaskOfShortProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfIntProperty(instance: ManagedObject): Promise; - set_TaskOfIntProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfLongProperty(instance: ManagedObject): Promise; - set_TaskOfLongProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfBoolProperty(instance: ManagedObject): Promise; - set_TaskOfBoolProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfByteProperty(instance: ManagedObject): Promise; - set_TaskOfByteProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfCharProperty(instance: ManagedObject): Promise; - set_TaskOfCharProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfStringProperty(instance: ManagedObject): Promise; - set_TaskOfStringProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfDoubleProperty(instance: ManagedObject): Promise; - set_TaskOfDoubleProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfFloatProperty(instance: ManagedObject): Promise; - set_TaskOfFloatProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfDateTimeProperty(instance: ManagedObject): Promise; - set_TaskOfDateTimeProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfDateTimeOffsetProperty(instance: ManagedObject): Promise; - set_TaskOfDateTimeOffsetProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfObjectProperty(instance: ManagedObject): Promise; - set_TaskOfObjectProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfExportedClassProperty(instance: ManagedObject): Promise; - set_TaskOfExportedClassProperty(instance: ManagedObject, value: Promise): void; - get_TaskOfJSObjectProperty(instance: ManagedObject): Promise; - set_TaskOfJSObjectProperty(instance: ManagedObject, value: Promise): void; - get_ByteArrayProperty(instance: ManagedObject): Array; - set_ByteArrayProperty(instance: ManagedObject, value: Array): void; - get_JSObjectArrayProperty(instance: ManagedObject): Array; - set_JSObjectArrayProperty(instance: ManagedObject, value: Array): void; - get_ObjectArrayProperty(instance: ManagedObject): Array; - set_ObjectArrayProperty(instance: ManagedObject, value: Array): void; - get_ExportedClassArrayProperty(instance: ManagedObject): Array; - set_ExportedClassArrayProperty(instance: ManagedObject, value: Array): void; - get_IntArrayProperty(instance: ManagedObject): Array; - set_IntArrayProperty(instance: ManagedObject, value: Array): void; - get_StringArrayProperty(instance: ManagedObject): Array; - set_StringArrayProperty(instance: ManagedObject, value: Array): void; - get_DoubleArrayProperty(instance: ManagedObject): Array; - set_DoubleArrayProperty(instance: ManagedObject, value: Array): void; - }; - ExportedClassInterop: { - ctor(jsObject: object): ManagedObject; - get_Id(instance: ManagedObject): number; - set_Id(instance: ManagedObject, value: number): void; - }; PeopleInterop: { ctor(jsObject: object): ManagedObject; get_All(instance: ManagedObject): Array; @@ -302,494 +213,6 @@ export namespace PrimitivesDemo { } } -// TypeShim generated TypeScript definitions for class: TypeShim.Sample.CompilationTest -export class CompilationTest extends ProxyBase { - constructor(jsObject: CompilationTest.Initializer) { - super(TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.ctor(jsObject)); - } - - public VoidMethod(): void { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.VoidMethod(this.instance); - } - - public IntMethod(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.IntMethod(this.instance); - } - - public BoolMethod(): boolean { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.BoolMethod(this.instance); - } - - public StringMethod(): string { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.StringMethod(this.instance); - } - - public DoubleMethod(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.DoubleMethod(this.instance); - } - public get NIntProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_NIntProperty(this.instance); - } - - public set NIntProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_NIntProperty(this.instance, value); - } - - public get ByteProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ByteProperty(this.instance); - } - - public set ByteProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ByteProperty(this.instance, value); - } - - public get ShortProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ShortProperty(this.instance); - } - - public set ShortProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ShortProperty(this.instance, value); - } - - public get IntProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_IntProperty(this.instance); - } - - public set IntProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_IntProperty(this.instance, value); - } - - public get LongProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_LongProperty(this.instance); - } - - public set LongProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_LongProperty(this.instance, value); - } - - public get BoolProperty(): boolean { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_BoolProperty(this.instance); - } - - public set BoolProperty(value: boolean) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_BoolProperty(this.instance, value); - } - - public get StringProperty(): string { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_StringProperty(this.instance); - } - - public set StringProperty(value: string) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_StringProperty(this.instance, value); - } - - public get CharProperty(): string { - return String.fromCharCode(TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_CharProperty(this.instance)); - } - - public set CharProperty(value: string) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_CharProperty(this.instance, value.charCodeAt(0)); - } - - public get DoubleProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_DoubleProperty(this.instance); - } - - public set DoubleProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_DoubleProperty(this.instance, value); - } - - public get FloatProperty(): number { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_FloatProperty(this.instance); - } - - public set FloatProperty(value: number) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_FloatProperty(this.instance, value); - } - - public get DateTimeProperty(): Date { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_DateTimeProperty(this.instance); - } - - public set DateTimeProperty(value: Date) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_DateTimeProperty(this.instance, value); - } - - public get DateTimeOffsetProperty(): Date { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_DateTimeOffsetProperty(this.instance); - } - - public set DateTimeOffsetProperty(value: Date) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_DateTimeOffsetProperty(this.instance, value); - } - - public get ObjectProperty(): ManagedObject { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ObjectProperty(this.instance); - } - - public set ObjectProperty(value: ManagedObject) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ObjectProperty(this.instance, value); - } - - public get ExportedClassProperty(): ExportedClass { - const res = TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ExportedClassProperty(this.instance); - return ProxyBase.fromHandle(ExportedClass, res); - } - - public set ExportedClassProperty(value: ExportedClass | ExportedClass.Initializer) { - const valueInstance = value instanceof ExportedClass ? value.instance : value; - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ExportedClassProperty(this.instance, valueInstance); - } - - public get JSObjectProperty(): object { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_JSObjectProperty(this.instance); - } - - public set JSObjectProperty(value: object) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_JSObjectProperty(this.instance, value); - } - - public get TaskProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskProperty(this.instance); - } - - public set TaskProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskProperty(this.instance, value); - } - - public get TaskOfNIntProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfNIntProperty(this.instance); - } - - public set TaskOfNIntProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfNIntProperty(this.instance, value); - } - - public get TaskOfShortProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfShortProperty(this.instance); - } - - public set TaskOfShortProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfShortProperty(this.instance, value); - } - - public get TaskOfIntProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfIntProperty(this.instance); - } - - public set TaskOfIntProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfIntProperty(this.instance, value); - } - - public get TaskOfLongProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfLongProperty(this.instance); - } - - public set TaskOfLongProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfLongProperty(this.instance, value); - } - - public get TaskOfBoolProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfBoolProperty(this.instance); - } - - public set TaskOfBoolProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfBoolProperty(this.instance, value); - } - - public get TaskOfByteProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfByteProperty(this.instance); - } - - public set TaskOfByteProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfByteProperty(this.instance, value); - } - - public get TaskOfCharProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfCharProperty(this.instance).then(c => String.fromCharCode(c)); - } - - public set TaskOfCharProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfCharProperty(this.instance, value.then(c => c.charCodeAt(0))); - } - - public get TaskOfStringProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfStringProperty(this.instance); - } - - public set TaskOfStringProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfStringProperty(this.instance, value); - } - - public get TaskOfDoubleProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfDoubleProperty(this.instance); - } - - public set TaskOfDoubleProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfDoubleProperty(this.instance, value); - } - - public get TaskOfFloatProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfFloatProperty(this.instance); - } - - public set TaskOfFloatProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfFloatProperty(this.instance, value); - } - - public get TaskOfDateTimeProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfDateTimeProperty(this.instance); - } - - public set TaskOfDateTimeProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfDateTimeProperty(this.instance, value); - } - - public get TaskOfDateTimeOffsetProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfDateTimeOffsetProperty(this.instance); - } - - public set TaskOfDateTimeOffsetProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfDateTimeOffsetProperty(this.instance, value); - } - - public get TaskOfObjectProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfObjectProperty(this.instance); - } - - public set TaskOfObjectProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfObjectProperty(this.instance, value); - } - - public get TaskOfExportedClassProperty(): Promise { - const res = TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfExportedClassProperty(this.instance); - return res.then(e => ProxyBase.fromHandle(ExportedClass, e)); - } - - public set TaskOfExportedClassProperty(value: Promise) { - const valueInstance = value.then(e => e instanceof ExportedClass ? e.instance : e); - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfExportedClassProperty(this.instance, valueInstance); - } - - public get TaskOfJSObjectProperty(): Promise { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_TaskOfJSObjectProperty(this.instance); - } - - public set TaskOfJSObjectProperty(value: Promise) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_TaskOfJSObjectProperty(this.instance, value); - } - - public get ByteArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ByteArrayProperty(this.instance); - } - - public set ByteArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ByteArrayProperty(this.instance, value); - } - - public get JSObjectArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_JSObjectArrayProperty(this.instance); - } - - public set JSObjectArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_JSObjectArrayProperty(this.instance, value); - } - - public get ObjectArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ObjectArrayProperty(this.instance); - } - - public set ObjectArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ObjectArrayProperty(this.instance, value); - } - - public get ExportedClassArrayProperty(): Array { - const res = TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_ExportedClassArrayProperty(this.instance); - return res.map(e => ProxyBase.fromHandle(ExportedClass, e)); - } - - public set ExportedClassArrayProperty(value: Array) { - const valueInstance = value.map(e => e instanceof ExportedClass ? e.instance : e); - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_ExportedClassArrayProperty(this.instance, valueInstance); - } - - public get IntArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_IntArrayProperty(this.instance); - } - - public set IntArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_IntArrayProperty(this.instance, value); - } - - public get StringArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_StringArrayProperty(this.instance); - } - - public set StringArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_StringArrayProperty(this.instance, value); - } - - public get DoubleArrayProperty(): Array { - return TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.get_DoubleArrayProperty(this.instance); - } - - public set DoubleArrayProperty(value: Array) { - TypeShimConfig.exports.TypeShim.Sample.CompilationTestInterop.set_DoubleArrayProperty(this.instance, value); - } -} -export namespace CompilationTest { - export interface Initializer { - NIntProperty: number; - ByteProperty: number; - ShortProperty: number; - IntProperty: number; - LongProperty: number; - BoolProperty: boolean; - StringProperty: string; - CharProperty: string; - DoubleProperty: number; - FloatProperty: number; - DateTimeProperty: Date; - DateTimeOffsetProperty: Date; - ObjectProperty: ManagedObject; - ExportedClassProperty: ExportedClass | ExportedClass.Initializer; - JSObjectProperty: object; - TaskProperty: Promise; - TaskOfNIntProperty: Promise; - TaskOfShortProperty: Promise; - TaskOfIntProperty: Promise; - TaskOfLongProperty: Promise; - TaskOfBoolProperty: Promise; - TaskOfByteProperty: Promise; - TaskOfCharProperty: Promise; - TaskOfStringProperty: Promise; - TaskOfDoubleProperty: Promise; - TaskOfFloatProperty: Promise; - TaskOfDateTimeProperty: Promise; - TaskOfDateTimeOffsetProperty: Promise; - TaskOfObjectProperty: Promise; - TaskOfExportedClassProperty: Promise; - TaskOfJSObjectProperty: Promise; - ByteArrayProperty: Array; - JSObjectArrayProperty: Array; - ObjectArrayProperty: Array; - ExportedClassArrayProperty: Array; - IntArrayProperty: Array; - StringArrayProperty: Array; - DoubleArrayProperty: Array; - } - export interface Snapshot { - NIntProperty: number; - ByteProperty: number; - ShortProperty: number; - IntProperty: number; - LongProperty: number; - BoolProperty: boolean; - StringProperty: string; - CharProperty: string; - DoubleProperty: number; - FloatProperty: number; - DateTimeProperty: Date; - DateTimeOffsetProperty: Date; - ObjectProperty: ManagedObject; - ExportedClassProperty: ExportedClass.Snapshot; - JSObjectProperty: object; - TaskProperty: Promise; - TaskOfNIntProperty: Promise; - TaskOfShortProperty: Promise; - TaskOfIntProperty: Promise; - TaskOfLongProperty: Promise; - TaskOfBoolProperty: Promise; - TaskOfByteProperty: Promise; - TaskOfCharProperty: Promise; - TaskOfStringProperty: Promise; - TaskOfDoubleProperty: Promise; - TaskOfFloatProperty: Promise; - TaskOfDateTimeProperty: Promise; - TaskOfDateTimeOffsetProperty: Promise; - TaskOfObjectProperty: Promise; - TaskOfExportedClassProperty: Promise; - TaskOfJSObjectProperty: Promise; - ByteArrayProperty: Array; - JSObjectArrayProperty: Array; - ObjectArrayProperty: Array; - ExportedClassArrayProperty: Array; - IntArrayProperty: Array; - StringArrayProperty: Array; - DoubleArrayProperty: Array; - } - export function materialize(proxy: CompilationTest): CompilationTest.Snapshot { - return { - NIntProperty: proxy.NIntProperty, - ByteProperty: proxy.ByteProperty, - ShortProperty: proxy.ShortProperty, - IntProperty: proxy.IntProperty, - LongProperty: proxy.LongProperty, - BoolProperty: proxy.BoolProperty, - StringProperty: proxy.StringProperty, - CharProperty: proxy.CharProperty, - DoubleProperty: proxy.DoubleProperty, - FloatProperty: proxy.FloatProperty, - DateTimeProperty: proxy.DateTimeProperty, - DateTimeOffsetProperty: proxy.DateTimeOffsetProperty, - ObjectProperty: proxy.ObjectProperty, - ExportedClassProperty: ExportedClass.materialize(proxy.ExportedClassProperty), - JSObjectProperty: proxy.JSObjectProperty, - TaskProperty: proxy.TaskProperty, - TaskOfNIntProperty: proxy.TaskOfNIntProperty, - TaskOfShortProperty: proxy.TaskOfShortProperty, - TaskOfIntProperty: proxy.TaskOfIntProperty, - TaskOfLongProperty: proxy.TaskOfLongProperty, - TaskOfBoolProperty: proxy.TaskOfBoolProperty, - TaskOfByteProperty: proxy.TaskOfByteProperty, - TaskOfCharProperty: proxy.TaskOfCharProperty, - TaskOfStringProperty: proxy.TaskOfStringProperty, - TaskOfDoubleProperty: proxy.TaskOfDoubleProperty, - TaskOfFloatProperty: proxy.TaskOfFloatProperty, - TaskOfDateTimeProperty: proxy.TaskOfDateTimeProperty, - TaskOfDateTimeOffsetProperty: proxy.TaskOfDateTimeOffsetProperty, - TaskOfObjectProperty: proxy.TaskOfObjectProperty, - TaskOfExportedClassProperty: proxy.TaskOfExportedClassProperty.then(e => ExportedClass.materialize(e)), - TaskOfJSObjectProperty: proxy.TaskOfJSObjectProperty, - ByteArrayProperty: proxy.ByteArrayProperty, - JSObjectArrayProperty: proxy.JSObjectArrayProperty, - ObjectArrayProperty: proxy.ObjectArrayProperty, - ExportedClassArrayProperty: proxy.ExportedClassArrayProperty.map(e => ExportedClass.materialize(e)), - IntArrayProperty: proxy.IntArrayProperty, - StringArrayProperty: proxy.StringArrayProperty, - DoubleArrayProperty: proxy.DoubleArrayProperty, - }; - } -} - -// TypeShim generated TypeScript definitions for class: TypeShim.Sample.ExportedClass -export class ExportedClass extends ProxyBase { - constructor(jsObject: ExportedClass.Initializer) { - super(TypeShimConfig.exports.TypeShim.Sample.ExportedClassInterop.ctor(jsObject)); - } - - public get Id(): number { - return TypeShimConfig.exports.TypeShim.Sample.ExportedClassInterop.get_Id(this.instance); - } - - public set Id(value: number) { - TypeShimConfig.exports.TypeShim.Sample.ExportedClassInterop.set_Id(this.instance, value); - } -} -export namespace ExportedClass { - export interface Initializer { - Id: number; - } - export interface Snapshot { - Id: number; - } - export function materialize(proxy: ExportedClass): ExportedClass.Snapshot { - return { - Id: proxy.Id, - }; - } -} - // TypeShim generated TypeScript definitions for class: TypeShim.Sample.People export class People extends ProxyBase { constructor(jsObject: People.Initializer) { diff --git a/Sample/TypeShim.Sample/CompilationTest.cs b/Sample/TypeShim.Sample/CompilationTest.cs deleted file mode 100644 index a931113..0000000 --- a/Sample/TypeShim.Sample/CompilationTest.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Runtime.InteropServices.JavaScript; -using System.Threading.Tasks; - -namespace TypeShim.Sample; - -[TSExport] -public class CompilationTest -{ - public nint NIntProperty { get; set; } - public byte ByteProperty { get; set; } - public short ShortProperty { get; set; } - public int IntProperty { get; set; } - public long LongProperty { get; set; } - public bool BoolProperty { get; set; } - public string StringProperty { get; set; } = string.Empty; - public char CharProperty { get; set; } - public double DoubleProperty { get; set; } - public float FloatProperty { get; set; } - public DateTime DateTimeProperty { get; set; } - public DateTimeOffset DateTimeOffsetProperty { get; set; } - public object ObjectProperty { get; set; } = new object(); - public ExportedClass ExportedClassProperty { get; set; } = new ExportedClass(); - public JSObject JSObjectProperty { get; set; } = null!; - public Task TaskProperty { get; set; } = Task.CompletedTask; - public Task TaskOfNIntProperty { get; set; } = Task.FromResult((nint)0); - public Task TaskOfShortProperty { get; set; } = Task.FromResult((short)0); - public Task TaskOfIntProperty { get; set; } = Task.FromResult(0); - public Task TaskOfLongProperty { get; set; } = Task.FromResult(0L); - public Task TaskOfBoolProperty { get; set; } = Task.FromResult(false); - public Task TaskOfByteProperty { get; set; } = Task.FromResult((byte)0); - public Task TaskOfCharProperty { get; set; } = Task.FromResult('\0'); - public Task TaskOfStringProperty { get; set; } = Task.FromResult(string.Empty); - public Task TaskOfDoubleProperty { get; set; } = Task.FromResult(0.0); - public Task TaskOfFloatProperty { get; set; } = Task.FromResult(0.0f); - public Task TaskOfDateTimeProperty { get; set; } = Task.FromResult(DateTime.Now); - public Task TaskOfDateTimeOffsetProperty { get; set; } = Task.FromResult(DateTimeOffset.Now); - public Task TaskOfObjectProperty { get; set; } = Task.FromResult(new object()); - public Task TaskOfExportedClassProperty { get; set; } = Task.FromResult(new ExportedClass()); - public Task TaskOfJSObjectProperty { get; set; } = Task.FromException(new Exception("biem")); - //public Task TaskOfExceptionProperty { get; set; } = Task.FromResult(new Exception("biem")); - public byte[] ByteArrayProperty { get; set; } = []; - public JSObject[] JSObjectArrayProperty { get; set; } = []; - public object[] ObjectArrayProperty { get; set; } = []; - public ExportedClass[] ExportedClassArrayProperty { get; set; } = []; - public int[] IntArrayProperty { get; set; } = []; - public string[] StringArrayProperty { get; set; } = []; - public double[] DoubleArrayProperty { get; set; } = []; - - public void VoidMethod() { } - public int IntMethod() => 42; - public bool BoolMethod() => true; - public string StringMethod() => "Hello, TypeShim!"; - public double DoubleMethod() => 3.14; -} - -[TSExport] -public class ExportedClass -{ - public int Id { get; set; } -} diff --git a/TypeShim.E2E/.gitignore b/TypeShim.E2E/.gitignore new file mode 100644 index 0000000..9935024 --- /dev/null +++ b/TypeShim.E2E/.gitignore @@ -0,0 +1,7 @@ +TypeShim.E2E.Wasm/bin +TypeShim.E2E.Wasm/obj +wasm-lib-publish +vitest/dist +vitest/node_modules +vitest/__screenshots__ +e2e-report-*.xml \ No newline at end of file diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/ArrayPropertiesClass.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/ArrayPropertiesClass.cs new file mode 100644 index 0000000..c54f69a --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/ArrayPropertiesClass.cs @@ -0,0 +1,15 @@ +using System.Runtime.InteropServices.JavaScript; + +namespace TypeShim.Sample; + +[TSExport] +public class ArrayPropertiesClass +{ + public byte[] ByteArrayProperty { get; set; } = []; + public JSObject[] JSObjectArrayProperty { get; set; } = []; + public object[] ObjectArrayProperty { get; set; } = []; + public ExportedClass[] ExportedClassArrayProperty { get; set; } = []; + public int[] IntArrayProperty { get; set; } = []; + public string[] StringArrayProperty { get; set; } = []; + public double[] DoubleArrayProperty { get; set; } = []; +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/ExportedClass.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/ExportedClass.cs new file mode 100644 index 0000000..e811795 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/ExportedClass.cs @@ -0,0 +1,7 @@ +namespace TypeShim.Sample; + +[TSExport] +public class ExportedClass // for referencing an exported class +{ + public int Id { get; set; } +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/Program.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/Program.cs new file mode 100644 index 0000000..ef8b601 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/Program.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading.Tasks; + +namespace TypeShim.E2E.Wasm; + +public class Program +{ + public static async Task Main(string[] args) + { + Console.WriteLine("Wasm module runtime entered Main"); + } +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/AssemblyInfo.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d5e1a31 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +[assembly: System.Runtime.Versioning.SupportedOSPlatform("browser")] diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/launchSettings.json b/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/launchSettings.json new file mode 100644 index 0000000..ae8058f --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "TypeShim.E2E.App": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:7055;http://localhost:5298", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + } + } +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/SimplePropertiesTest.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/SimplePropertiesTest.cs new file mode 100644 index 0000000..0e6b993 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/SimplePropertiesTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Runtime.InteropServices.JavaScript; + +namespace TypeShim.Sample; + +[TSExport] +public class SimplePropertiesTest +{ + public nint NIntProperty { get; set; } + public byte ByteProperty { get; set; } + public short ShortProperty { get; set; } + public int IntProperty { get; set; } + public long LongProperty { get; set; } + public bool BoolProperty { get; set; } + public string StringProperty { get; set; } = string.Empty; + public char CharProperty { get; set; } + public double DoubleProperty { get; set; } + public float FloatProperty { get; set; } + public DateTime DateTimeProperty { get; set; } + public DateTimeOffset DateTimeOffsetProperty { get; set; } + public object ObjectProperty { get; set; } = new object(); + public ExportedClass ExportedClassProperty { get; set; } = new ExportedClass(); + public JSObject JSObjectProperty { get; set; } = null!; +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/SimpleReturnMethodsClass.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/SimpleReturnMethodsClass.cs new file mode 100644 index 0000000..184cdc2 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/SimpleReturnMethodsClass.cs @@ -0,0 +1,18 @@ +using System; +using System.Globalization; + +namespace TypeShim.Sample; + +[TSExport] +public class SimpleReturnMethodsClass +{ + public void VoidMethod() { } + public int IntMethod() => 42; + public bool BoolMethod() => true; + public string StringMethod() => "Hello, from .NET"; + public double DoubleMethod() => 3.14159; + public DateTime DateTimeMethod() => new(1995, 4, 1); + public DateTime DateTimeNowDateMethod() => DateTime.Now.Date; + public DateTimeOffset DateTimeOffsetMethod() => new DateTimeOffset(new DateTime(1998, 4, 20, 0, 0, 0, DateTimeKind.Unspecified), TimeSpan.FromHours(3)); + public ExportedClass ExportedClassMethod() => new() { Id = 420 }; +} \ No newline at end of file diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/TaskPropertiesClass.cs b/TypeShim.E2E/TypeShim.E2E.Wasm/TaskPropertiesClass.cs new file mode 100644 index 0000000..6cedaa1 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/TaskPropertiesClass.cs @@ -0,0 +1,26 @@ +using System; +using System.Runtime.InteropServices.JavaScript; +using System.Threading.Tasks; + +namespace TypeShim.Sample; + +[TSExport] +public class TaskPropertiesClass +{ + public Task TaskProperty { get; set; } = Task.CompletedTask; + public Task TaskOfNIntProperty { get; set; } = Task.FromResult((nint)0); + public Task TaskOfShortProperty { get; set; } = Task.FromResult((short)0); + public Task TaskOfIntProperty { get; set; } = Task.FromResult(0); + public Task TaskOfLongProperty { get; set; } = Task.FromResult(0L); + public Task TaskOfBoolProperty { get; set; } = Task.FromResult(false); + public Task TaskOfByteProperty { get; set; } = Task.FromResult((byte)0); + public Task TaskOfCharProperty { get; set; } = Task.FromResult('\0'); + public Task TaskOfStringProperty { get; set; } = Task.FromResult(string.Empty); + public Task TaskOfDoubleProperty { get; set; } = Task.FromResult(0.0); + public Task TaskOfFloatProperty { get; set; } = Task.FromResult(0.0f); + public Task TaskOfDateTimeProperty { get; set; } = Task.FromResult(DateTime.MinValue); + public Task TaskOfDateTimeOffsetProperty { get; set; } = Task.FromResult(DateTimeOffset.MinValue); + public Task TaskOfObjectProperty { get; set; } = Task.FromResult(new object()); + public Task TaskOfExportedClassProperty { get; set; } = Task.FromResult(new ExportedClass()); + public Task TaskOfJSObjectProperty { get; set; } = Task.FromException(new Exception("biem")); +} diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/TypeShim.E2E.Wasm.csproj b/TypeShim.E2E/TypeShim.E2E.Wasm/TypeShim.E2E.Wasm.csproj new file mode 100644 index 0000000..d17fb51 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/TypeShim.E2E.Wasm.csproj @@ -0,0 +1,23 @@ + + + net10.0 + true + enable + + true + false + false + + + + ../wasm-lib-publish + wwwroot + High + + + + + + + + diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.d.ts b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.d.ts new file mode 100644 index 0000000..b768fd5 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.d.ts @@ -0,0 +1 @@ +export { dotnet } \ No newline at end of file diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.js b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.js new file mode 100644 index 0000000..cf131fe --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/main.js @@ -0,0 +1 @@ +export { dotnet } from './_framework/dotnet.js' \ No newline at end of file diff --git a/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/package.json b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/package.json new file mode 100644 index 0000000..6025243 --- /dev/null +++ b/TypeShim.E2E/TypeShim.E2E.Wasm/wwwroot/package.json @@ -0,0 +1,10 @@ +{ + "name": "@typeshim/e2e-wasm-lib", + "version": "1.0.0", + "private": true, + "type": "module", + "exports": { + ".": "./typeshim.ts", + "./dotnet": "./main.js" + } +} \ No newline at end of file diff --git a/TypeShim.E2E/vitest/package-lock.json b/TypeShim.E2E/vitest/package-lock.json new file mode 100644 index 0000000..26340f7 --- /dev/null +++ b/TypeShim.E2E/vitest/package-lock.json @@ -0,0 +1,2998 @@ +{ + "name": "@typeshim/e2e-vitest", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@typeshim/e2e-vitest", + "dependencies": { + "@typeshim/e2e-wasm-lib": "file:../wasm-lib-publish/wwwroot" + }, + "devDependencies": { + "@types/node": "^25.0.9", + "@vitest/browser": "^2.1.9", + "cross-env": "^7.0.3", + "jsdom": "^27.4.0", + "playwright": "^1.57.0", + "typescript": "^5.6.0", + "vite": "^5.4.0", + "vitest": "^2.1.9" + } + }, + "../e2e-wasm-lib": { + "extraneous": true + }, + "../e2e-wasm-lib/wwwroot": { + "name": "@typeshim/e2e-wasm-lib", + "version": "1.0.0", + "extraneous": true + }, + "../TypeShim.E2E.Wasm/publish/wwwroot": { + "name": "@typeshim/e2e-wasm-lib", + "version": "1.0.0", + "extraneous": true + }, + "../wasm-lib-publish/wwwroot": { + "name": "@typeshim/e2e-wasm-lib", + "version": "1.0.0" + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", + "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz", + "integrity": "sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", + "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.8.0.tgz", + "integrity": "sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@exodus/crypto": "^1.0.0-rc.4" + }, + "peerDependenciesMeta": { + "@exodus/crypto": { + "optional": true + } + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz", + "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typeshim/e2e-wasm-lib": { + "resolved": "../wasm-lib-publish/wwwroot", + "link": true + }, + "node_modules/@vitest/browser": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.9.tgz", + "integrity": "sha512-AHDanTP4Ed6J5R6wRBcWRQ+AxgMnNJxsbaa229nFQz5KOMFZqlW11QkIDoLgCjBOpQ1+c78lTN5jVxO8ME+S4w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.5.2", + "@vitest/mocker": "2.1.9", + "@vitest/utils": "2.1.9", + "magic-string": "^0.30.12", + "msw": "^2.6.4", + "sirv": "^3.0.0", + "tinyrainbow": "^1.2.0", + "ws": "^8.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "2.1.9", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", + "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/graphql": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.7.tgz", + "integrity": "sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/playwright": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/type-fest": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.1.tgz", + "integrity": "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/TypeShim.E2E/vitest/package.json b/TypeShim.E2E/vitest/package.json new file mode 100644 index 0000000..ed31c51 --- /dev/null +++ b/TypeShim.E2E/vitest/package.json @@ -0,0 +1,24 @@ +{ + "name": "@typeshim/e2e-vitest", + "private": true, + "type": "module", + "scripts": { + "test:node": "cross-env VITE_BROWSER_MODE=false vitest run", + "test:browser": "cross-env VITE_BROWSER_MODE=true vitest run", + "initialize": "dotnet publish ../TypeShim.E2E.Wasm -c Release && node ./scripts/patch-warnings.mjs && npm ci && npx playwright install chromium --with-deps", + "build": "dotnet publish ../TypeShim.E2E.Wasm -c Release && node ./scripts/patch-warnings.mjs" + }, + "dependencies": { + "@typeshim/e2e-wasm-lib": "file:../wasm-lib-publish/wwwroot" + }, + "devDependencies": { + "@types/node": "^25.0.9", + "@vitest/browser": "^2.1.9", + "cross-env": "^7.0.3", + "jsdom": "^27.4.0", + "playwright": "^1.57.0", + "typescript": "^5.6.0", + "vite": "^5.4.0", + "vitest": "^2.1.9" + } +} diff --git a/TypeShim.E2E/vitest/scripts/patch-warnings.mjs b/TypeShim.E2E/vitest/scripts/patch-warnings.mjs new file mode 100644 index 0000000..a046562 --- /dev/null +++ b/TypeShim.E2E/vitest/scripts/patch-warnings.mjs @@ -0,0 +1,29 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const dir = path.dirname(fileURLToPath(import.meta.url)); +const dotnetRuntimeFilePath = path.resolve(dir, '..', '..', 'wasm-lib-publish', 'wwwroot', '_framework', 'dotnet.runtime.js'); +const dotneFilePath = path.resolve(dir, '..', '..', 'wasm-lib-publish', 'wwwroot', '_framework', 'dotnet.js'); +createEmptyMapFile(`${dotnetRuntimeFilePath}.map`); +insertViteIgnores(dotnetRuntimeFilePath); +insertViteIgnores(dotneFilePath); + +function createEmptyMapFile(mapPath) { + const json = '{"version":3,"sources":[],"names":[],"mappings":""}\n'; + fs.mkdirSync(path.dirname(mapPath), { recursive: true }); + let shouldWrite = true; + try { shouldWrite = fs.statSync(mapPath).size < 10; } catch {} + + if (shouldWrite) fs.writeFileSync(mapPath, json, 'utf8'); +} + +function insertViteIgnores(file){ + const abs=path.resolve(file); + const src=fs.readFileSync(abs,'utf8'); + const out=src.replace(/\/\*! webpackIgnore: true \*\//g,'/* @vite-ignore */') + .replace(/await\s+import\(\s*(?!\/\*)/g, 'await import(/* @vite-ignore */ '); + // dotnet missed some imports, we do lookahead to see missing comment in import, then add where missing + if(out!==src) fs.writeFileSync(abs,out,'utf8'); + console.log(`[replace] ${out===src?'no changes':'updated'} ${abs}`); +} \ No newline at end of file diff --git a/TypeShim.E2E/vitest/src/array-properties.test.ts b/TypeShim.E2E/vitest/src/array-properties.test.ts new file mode 100644 index 0000000..4ba337f --- /dev/null +++ b/TypeShim.E2E/vitest/src/array-properties.test.ts @@ -0,0 +1,31 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { ArrayPropertiesClass, ExportedClass } from "@typeshim/e2e-wasm-lib"; + +describe('Array Properties Test', () => { + let exportedClass: ExportedClass; + let testObject: ArrayPropertiesClass; + beforeEach(() => { + exportedClass = new ExportedClass({ Id: 3 }); + testObject = new ArrayPropertiesClass({ + ByteArrayProperty: [1, 2, 3], + IntArrayProperty: [7, 8, 9], + StringArrayProperty: ["one", "two", "three"], + DoubleArrayProperty: [1.1, 2.2, 3.3], + JSObjectArrayProperty: [{ a: 1 }, { b: 2 }, { c: 3 }], + ObjectArrayProperty: [exportedClass.instance], + ExportedClassArrayProperty: [exportedClass], + }); + }); + + test('Byte array property', () => { + const original = testObject.ByteArrayProperty.slice(); + testObject.ByteArrayProperty[0] = 42; + expect(testObject.ByteArrayProperty).toStrictEqual(original); + }); + + test('Does not mutate Int array property', () => { + const original = testObject.IntArrayProperty.slice(); + testObject.IntArrayProperty[0] = 42; + expect(testObject.IntArrayProperty).toStrictEqual(original); + }); +}); \ No newline at end of file diff --git a/TypeShim.E2E/vitest/src/async.ts b/TypeShim.E2E/vitest/src/async.ts new file mode 100644 index 0000000..071fc61 --- /dev/null +++ b/TypeShim.E2E/vitest/src/async.ts @@ -0,0 +1,3 @@ +export function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/TypeShim.E2E/vitest/src/date.ts b/TypeShim.E2E/vitest/src/date.ts new file mode 100644 index 0000000..2fb4d77 --- /dev/null +++ b/TypeShim.E2E/vitest/src/date.ts @@ -0,0 +1,8 @@ +export function dateOnly(input: Date): Date { + return new Date(input.getFullYear(), input.getMonth(), input.getDate()); +} + +export function dateOffsetHour(input: Date, hours: number): Date { + input.setHours(input.getHours() + hours); + return input; +} \ No newline at end of file diff --git a/TypeShim.E2E/vitest/src/exception.test.ts b/TypeShim.E2E/vitest/src/exception.test.ts new file mode 100644 index 0000000..ffdd42c --- /dev/null +++ b/TypeShim.E2E/vitest/src/exception.test.ts @@ -0,0 +1,81 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { ExportedClass, SimplePropertiesTest, TaskPropertiesClass } from "@typeshim/e2e-wasm-lib"; +import { delay } from "./async"; +import { dateOnly, dateOffsetHour } from './date'; +import { isCI, skipInvalidPromiseResolveValueTests } from '../suite'; + +describe('Task Properties Test', () => { + let exportedClass: ExportedClass; + let taskTestObject: TaskPropertiesClass; + let simpleTestObject: SimplePropertiesTest; + let jsObject = { baz: "qux" }; + let dateNow = new Date(); + beforeEach(() => { + exportedClass = new ExportedClass({ Id: 2 }); + taskTestObject = new TaskPropertiesClass({ + TaskProperty: Promise.resolve(), + TaskOfByteProperty: Promise.resolve(32), + TaskOfNIntProperty: Promise.resolve(42), + TaskOfShortProperty: Promise.resolve(43), + TaskOfIntProperty: Promise.resolve(44), + TaskOfLongProperty: Promise.resolve(45),// new Promise(resolve => setTimeout(() => resolve(45), 1000)), + TaskOfBoolProperty: Promise.resolve(true), + TaskOfCharProperty: Promise.resolve('B'), + TaskOfStringProperty: Promise.resolve("Task String"), + TaskOfDoubleProperty: Promise.resolve(67.8), + TaskOfFloatProperty: Promise.resolve(89.0), + TaskOfDateTimeProperty: Promise.resolve(dateNow), + TaskOfDateTimeOffsetProperty: Promise.resolve(dateNow), + TaskOfObjectProperty: Promise.resolve(exportedClass.instance), + TaskOfExportedClassProperty: Promise.resolve(exportedClass), + TaskOfJSObjectProperty: Promise.resolve(jsObject), + }); + simpleTestObject = new SimplePropertiesTest({ + NIntProperty: 1, + ByteProperty: 2, + ShortProperty: 3, + IntProperty: 4, + LongProperty: 5, + BoolProperty: true, + StringProperty: "Test", + CharProperty: 'A', + DoubleProperty: 6.7, + FloatProperty: 8.9, + DateTimeProperty: dateNow, + DateTimeOffsetProperty: dateNow, + ExportedClassProperty: exportedClass, + ObjectProperty: exportedClass.instance, + JSObjectProperty: jsObject, + }); + }); + + test('Setting property to throwing void Promise sets throwing Task', async () => { + taskTestObject.TaskProperty = delay(10).then(() => { throw new Error("Thrown error"); }); + await expect(taskTestObject.TaskProperty).rejects.toThrow("Thrown error"); + }); + + test('Setting property to rejecting void Promise sets throwing Task', async () => { + taskTestObject.TaskProperty = Promise.reject(new Error("Rejected promise")); + await expect(taskTestObject.TaskProperty).rejects.toThrow("Rejected promise"); + }); + + test('Setting property to out-of-range NInt throws', () => { + expect(() => simpleTestObject.NIntProperty = -2).toThrow(); + expect(() => simpleTestObject.NIntProperty = -3).toThrow(); + }); + + test.skipIf(skipInvalidPromiseResolveValueTests)('Setting property to Promise of out-of-range NInt sets throwing Task', async () => { + taskTestObject.TaskOfNIntProperty = Promise.resolve(-1); + await expect(taskTestObject.TaskOfNIntProperty).rejects.toThrow(); // try to get the task back, it should throw the assertion + }); + + test('Cannot set out of range short', () => { + expect(() => simpleTestObject.ShortProperty = 1<<15).toThrow(); + expect(() => simpleTestObject.ShortProperty = -(1<<15) - 1).toThrow(); + }); + + test.skipIf(skipInvalidPromiseResolveValueTests)('Cannot set out of range Task of short', async () => { + taskTestObject.TaskOfShortProperty = Promise.resolve(1<<15); + await expect(taskTestObject.TaskOfShortProperty).rejects.toThrow(); // try to get the task back, it should throw the assertion + }); +}); \ No newline at end of file diff --git a/TypeShim.E2E/vitest/src/setup/fetch-from-disk.ts b/TypeShim.E2E/vitest/src/setup/fetch-from-disk.ts new file mode 100644 index 0000000..05f762f --- /dev/null +++ b/TypeShim.E2E/vitest/src/setup/fetch-from-disk.ts @@ -0,0 +1,82 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; + +// utility to handle fetch requests when running in node so wasm/dat files can be loaded from disk + +type FetchInput = string | URL | Request; + +function toUrlString(input: FetchInput): string { + if (typeof input === 'string') return input; + if (input instanceof URL) return input.toString(); + return input.url; +} + +function contentTypeForFile(filePath: string): string { + const ext = path.extname(filePath).toLowerCase(); + switch (ext) { + case '.wasm': + return 'application/wasm'; + case '.dat': + return 'application/octet-stream'; + case '.json': + return 'application/json'; + case '.js': + return 'application/javascript'; + case '.mjs': + return 'application/javascript'; + default: + return 'application/octet-stream'; + } +} + +function tryMapToFilePath(urlString: string): string | undefined { + let pathname = urlString; + if (/^https?:\/\//i.test(urlString)) { + try { + pathname = new URL(urlString).pathname; + } catch { } + } + // Vite filesystem URLs look like: /@fs/C:/path/to/file + if (pathname.startsWith('/@fs/')) { + let fsPath = pathname.slice('/@fs/'.length); + const isWindowsDrivePath = /^[a-zA-Z]:\//.test(fsPath); + fsPath = fsPath.replace(/\//g, path.sep); + + if (!isWindowsDrivePath && !path.isAbsolute(fsPath)) { + fsPath = path.sep + fsPath; + } + + return path.normalize(fsPath); + } + // When dotnet runtime uses its normal URLs, they look like /_framework/ + if (pathname.startsWith('/_framework/')) { + const wasmWwwroot = path.resolve(__dirname, '../e2e-wasm-app/wwwroot'); + const rel = pathname.replace(/^\//, ''); + return path.join(wasmWwwroot, rel); + } + return undefined; +} + +export function serveFetchRequestsFromDisk(): void { + const originalFetch = globalThis.fetch?.bind(globalThis); + if (!originalFetch) { + throw new Error('globalThis.fetch is not available; Vitest must run on a Node version with fetch'); + } + + globalThis.fetch = (async (input: FetchInput, init?: RequestInit): Promise => { + const urlString = toUrlString(input); + const mappedPath = tryMapToFilePath(urlString); + + if (!mappedPath) { + return originalFetch(input as any, init); + } + + const body = await readFile(mappedPath); + return new Response(body, { + status: 200, + headers: { + 'content-type': contentTypeForFile(mappedPath), + }, + }); + }) as any; +} diff --git a/TypeShim.E2E/vitest/src/setup/setup.ts b/TypeShim.E2E/vitest/src/setup/setup.ts new file mode 100644 index 0000000..a4c6b91 --- /dev/null +++ b/TypeShim.E2E/vitest/src/setup/setup.ts @@ -0,0 +1,30 @@ +import { beforeAll, beforeEach } from 'vitest'; +import { dotnet } from '@typeshim/e2e-wasm-lib/dotnet'; +import { TypeShimInitializer } from '@typeshim/e2e-wasm-lib'; +import { isBrowserMode } from '../../suite'; + +beforeAll(async () => { + console.log('Initializing WASM Runtime for tests'); + if (!isBrowserMode) { + console.log('Setting up fetch from disk for Node tests'); + const { serveFetchRequestsFromDisk } = await import('./fetch-from-disk.js'); + serveFetchRequestsFromDisk(); + } + await initializeWASMRuntime(); + console.log('Initialized WASM Runtime for tests'); +}); + +let runtimeInfo: any = undefined; +async function initializeWASMRuntime(): Promise { + runtimeInfo = await dotnet.create(); + const config = runtimeInfo.getConfig(); + if (!config?.mainAssemblyName) { + throw new Error('dotnet runtime config did not provide mainAssemblyName'); + } + + (runtimeInfo as any).assemblyExports ??= await runtimeInfo.getAssemblyExports(config.mainAssemblyName); + + console.log('Running main assembly:', config.mainAssemblyName); + runtimeInfo.runMain(); + TypeShimInitializer.initialize(runtimeInfo as any); +} diff --git a/TypeShim.E2E/vitest/src/simple-functions.test.ts b/TypeShim.E2E/vitest/src/simple-functions.test.ts new file mode 100644 index 0000000..45fcba6 --- /dev/null +++ b/TypeShim.E2E/vitest/src/simple-functions.test.ts @@ -0,0 +1,60 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { ExportedClass, SimpleReturnMethodsClass, TaskPropertiesClass } from '@typeshim/e2e-wasm-lib'; +import { dateOffsetHour, dateOnly } from './date'; + +describe('Simple Functions Test', () => { + let exportedClass: ExportedClass; + let testObject: SimpleReturnMethodsClass; + beforeEach(() => { + exportedClass = new ExportedClass({ Id: 2 }); + testObject = new SimpleReturnMethodsClass(); + }); + + test('Void returning parameterless method', () => { + expect(testObject.VoidMethod()).toBe(undefined); + }); + + test('Int returning parameterless method', () => { + expect(testObject.IntMethod()).toBe(42); + }); + + test('String returning parameterless method', () => { + expect(testObject.StringMethod()).toBe("Hello, from .NET"); + }); + + test('Bool returning parameterless method', () => { + expect(testObject.BoolMethod()).toBe(true); + }); + + test('Double returning parameterless method', () => { + expect(testObject.DoubleMethod()).toBeCloseTo(3.14159); + }); + + test('DateTime returning parameterless method', () => { + const result = testObject.DateTimeMethod(); + expect(result).toBeInstanceOf(Date); + expect(result).toEqual(new Date(1995, 3, 1)); + }); + + test('DateTime.Now.Date returning parameterless method', () => { + const result = testObject.DateTimeNowDateMethod(); + expect(result).toBeInstanceOf(Date); + const now = new Date(); + expect(result).toEqual(dateOnly(now)); + }); + + test('DateTimeOffset returning parameterless method', () => { + const result = testObject.DateTimeOffsetMethod(); + expect(result).toBeInstanceOf(Date); + + var expectedUtcMillis = Date.UTC(1998, 3, 20); + const dateWithTimezoneOffset = dateOffsetHour(new Date(expectedUtcMillis), -3); + expect(result).toEqual(dateWithTimezoneOffset); + }); + + test('ExportedClass returning parameterless method', () => { + const result = testObject.ExportedClassMethod(); + expect(result).toBeInstanceOf(ExportedClass); + expect(result.Id).toBe(420); + }); +}); diff --git a/TypeShim.E2E/vitest/src/simple-properties.test.ts b/TypeShim.E2E/vitest/src/simple-properties.test.ts new file mode 100644 index 0000000..5e1f955 --- /dev/null +++ b/TypeShim.E2E/vitest/src/simple-properties.test.ts @@ -0,0 +1,65 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { ExportedClass, SimplePropertiesTest, TaskPropertiesClass } from '@typeshim/e2e-wasm-lib'; + +describe('Simple Properties Test', () => { + let exportedClass: ExportedClass; + let testObject: SimplePropertiesTest; + let jsObject = { foo: "bar" }; + let dateNow = new Date(); + beforeEach(() => { + exportedClass = new ExportedClass({ Id: 2 }); + testObject = new SimplePropertiesTest({ + NIntProperty: 1, + ByteProperty: 2, + ShortProperty: 3, + IntProperty: 4, + LongProperty: 5, + BoolProperty: true, + StringProperty: "Test", + CharProperty: 'A', + DoubleProperty: 6.7, + FloatProperty: 8.9, + DateTimeProperty: dateNow, + DateTimeOffsetProperty: dateNow, + ExportedClassProperty: exportedClass, + ObjectProperty: exportedClass.instance, + JSObjectProperty: jsObject, + }); + }); + + test('Snapshot has property-value equality', async () => { + expect(testObject).toBeDefined(); + const snapshot = SimplePropertiesTest.materialize(testObject); + expect(testObject).toMatchObject(snapshot); // each property in snapshot should have a matching value in testObject + }); + test('Returns ExportedClass property correctly', () => { + expect(testObject.ExportedClassProperty).toBeInstanceOf(ExportedClass); + expect(testObject.ExportedClassProperty.Id).toBe(2); + }); + test('Returns JSObject property by reference', () => { + expect(testObject.JSObjectProperty).toBe(jsObject); + const obj = testObject.JSObjectProperty as any; + obj.bar = 123; + expect(testObject.JSObjectProperty).toHaveProperty("bar", 123); + expect(testObject.JSObjectProperty).toHaveProperty("foo", "bar"); + }); + test('Returns DateTime property as new instance', () => { + // dates are value object in dotnet, hence the new instance + expect(testObject.DateTimeProperty).toBeInstanceOf(Date); + expect(testObject.DateTimeProperty).not.toBe(dateNow); + expect(testObject.DateTimeProperty).toEqual(dateNow); + }); + test('Returns DateTimeOffset property as new instance', () => { + // dates are value object in dotnet, hence the new instance + expect(testObject.DateTimeOffsetProperty).toBeInstanceOf(Date); + expect(testObject.DateTimeOffsetProperty).not.toBe(dateNow); + expect(testObject.DateTimeOffsetProperty).toEqual(dateNow); + }); + test('Returns Long property by value', () => { + expect(testObject.LongProperty).toBe(5); + }); + test('Mutates Long property', () => { + testObject.LongProperty = 50; + expect(testObject.LongProperty).toBe(50); + }); +}); diff --git a/TypeShim.E2E/vitest/src/task-properties.test.ts b/TypeShim.E2E/vitest/src/task-properties.test.ts new file mode 100644 index 0000000..591f88c --- /dev/null +++ b/TypeShim.E2E/vitest/src/task-properties.test.ts @@ -0,0 +1,154 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { ExportedClass, TaskPropertiesClass } from "@typeshim/e2e-wasm-lib"; +import { delay } from "./async"; +import { dateOnly, dateOffsetHour } from './date'; +import { isCI } from '../suite'; + +describe('Task Properties Test', () => { + let exportedClass: ExportedClass; + let testObject: TaskPropertiesClass; + let jsObject = { baz: "qux" }; + let dateNow = new Date(); + beforeEach(() => { + exportedClass = new ExportedClass({ Id: 2 }); + testObject = new TaskPropertiesClass({ + TaskProperty: Promise.resolve(), + TaskOfByteProperty: Promise.resolve(32), + TaskOfNIntProperty: Promise.resolve(42), + TaskOfShortProperty: Promise.resolve(43), + TaskOfIntProperty: Promise.resolve(44), + TaskOfLongProperty: Promise.resolve(45), + TaskOfBoolProperty: Promise.resolve(true), + TaskOfCharProperty: Promise.resolve('B'), + TaskOfStringProperty: Promise.resolve("Task String"), + TaskOfDoubleProperty: Promise.resolve(67.8), + TaskOfFloatProperty: Promise.resolve(89.0), + TaskOfDateTimeProperty: Promise.resolve(dateNow), + TaskOfDateTimeOffsetProperty: Promise.resolve(dateNow), + TaskOfObjectProperty: Promise.resolve(exportedClass.instance), + TaskOfExportedClassProperty: Promise.resolve(exportedClass), + TaskOfJSObjectProperty: Promise.resolve(jsObject), + }); + }); + + test('Resolves void Task', async () => { + await expect(testObject.TaskProperty).resolves.toBeUndefined(); + }); + test('Can set and resolve void Task', async () => { + testObject.TaskProperty = delay(10); + await expect(testObject.TaskProperty).resolves.toBeUndefined(); + }); + test('Can set and resolve completed void Task', async () => { + testObject.TaskProperty = Promise.resolve(); + await expect(testObject.TaskProperty).resolves.toBeUndefined(); + }); + + test('Resolves Byte Task', async () => { + await expect(testObject.TaskOfByteProperty).resolves.toBe(32); + }); + test('Can set and resolve Byte Task', async () => { + testObject.TaskOfByteProperty = delay(10).then(() => 255); + await expect(testObject.TaskOfByteProperty).resolves.toBe(255); + }); + test('Can set and resolve completed Byte Task', async () => { + testObject.TaskOfByteProperty = Promise.resolve(128); + await expect(testObject.TaskOfByteProperty).resolves.toBe(128); + }); + + test('Resolves NInt Task', async () => { + await expect(testObject.TaskOfNIntProperty).resolves.toBe(42); + }); + test('Can set and resolve NInt Task', async () => { + testObject.TaskOfNIntProperty = delay(10).then(() => 420); + await expect(testObject.TaskOfNIntProperty).resolves.toBe(420); + }); + test('Can set and resolve completed NInt Task', async () => { + testObject.TaskOfNIntProperty = Promise.resolve(420); + await expect(testObject.TaskOfNIntProperty).resolves.toBe(420); + }); + + test('Resolves Short Task', async () => { + await expect(testObject.TaskOfShortProperty).resolves.toBe(43); + }); + test('Resolves Int Task immediately', async () => { + await expect(testObject.TaskOfIntProperty).resolves.toBe(44); + }); + test('Resolves Int Task', async () => { + testObject.TaskOfIntProperty = delay(10).then(() => 440); + await expect(testObject.TaskOfIntProperty).resolves.toBe(440); + }); + test('Resolves completed Int Task', async () => { + testObject.TaskOfIntProperty = delay(10).then(() => 440); + await delay(20); // wait longer than the task delay so its in completed state + await expect(testObject.TaskOfIntProperty).resolves.toBe(440); + }); + + test('Resolves Long Task', async () => { + testObject.TaskOfLongProperty = delay(10).then(() => 450); + await expect(testObject.TaskOfLongProperty).resolves.toBe(450); + }); + + // Completed task of long fails to marshall, skip in CI, keep active locally for visibility + // https://github.com/dotnet/runtime/pull/123366 + test.skipIf(isCI)('Resolves completed Long Task', async () => { + testObject.TaskOfLongProperty = delay(10).then(() => 450); + await delay(20); // wait longer than the task delay so its in completed state + await expect(testObject.TaskOfLongProperty).resolves.toBe(450); + }); + + test('Resolves Bool Task', async () => { + await expect(testObject.TaskOfBoolProperty).resolves.toBe(true); + }); + test('Resolves Char Task', async () => { + await expect(testObject.TaskOfCharProperty).resolves.toBe('B'); + }); + test('Resolves String Task', async () => { + await expect(testObject.TaskOfStringProperty).resolves.toBe("Task String"); + }); + test('Resolves Double Task', async () => { + await expect(testObject.TaskOfDoubleProperty).resolves.toBe(67.8); + }); + test('Resolves Float Task', async () => { + await expect(testObject.TaskOfFloatProperty).resolves.toBe(89.0); + }); + + test('Resolves DateTime Task', async () => { + const result = await testObject.TaskOfDateTimeProperty; + expect(result).toBeInstanceOf(Date); + expect(result).toEqual(dateNow); + }); + test('Can set and resolve DateTime Task', async () => { + const newDate = dateOnly(dateNow); + testObject.TaskOfDateTimeProperty = Promise.resolve(newDate); + const result = await testObject.TaskOfDateTimeProperty; + expect(result).toBeInstanceOf(Date); + expect(result).toEqual(newDate); + }); + + test('Resolves DateTimeOffset Task', async () => { + const result = await testObject.TaskOfDateTimeOffsetProperty; + expect(result).toBeInstanceOf(Date); + expect(result).toEqual(dateNow); + }); + test('Can set and resolve DateTimeOffset Task', async () => { + const newDate = dateOffsetHour(dateNow, 2); + testObject.TaskOfDateTimeOffsetProperty = Promise.resolve(newDate); + const result = await testObject.TaskOfDateTimeOffsetProperty; + expect(result).toBeInstanceOf(Date); + expect(result).toEqual(newDate); + }); + + test('Resolves Object Task', async () => { + const result = await testObject.TaskOfObjectProperty; + expect(result).toEqual(exportedClass.instance); + }); + test('Resolves ExportedClass Task', async () => { + const result = await testObject.TaskOfExportedClassProperty; + expect(result).toBeInstanceOf(ExportedClass); + expect(result.Id).toBe(2); + }); + test('Resolves JSObject Task', async () => { + const result = await testObject.TaskOfJSObjectProperty; + expect(result).toBe(jsObject); + }); +}); \ No newline at end of file diff --git a/TypeShim.E2E/vitest/suite.ts b/TypeShim.E2E/vitest/suite.ts new file mode 100644 index 0000000..627a506 --- /dev/null +++ b/TypeShim.E2E/vitest/suite.ts @@ -0,0 +1,9 @@ + +// Skip tests that marshall invalid values through Promise to .NET +// currently the runtime dies when trying to marshall such values making the tests un-runnable +// https://github.com/dotnet/runtime/pull/123523 +export const skipInvalidPromiseResolveValueTests: boolean = true; + +export const isBrowserMode: boolean = !!(globalThis as any).__BROWSER_MODE__; + +export const isCI: boolean = !!(globalThis as any).__IS_CI__; \ No newline at end of file diff --git a/TypeShim.E2E/vitest/tsconfig.json b/TypeShim.E2E/vitest/tsconfig.json new file mode 100644 index 0000000..6f4cd64 --- /dev/null +++ b/TypeShim.E2E/vitest/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vitest/globals"], + "strict": true, + "skipLibCheck": true + }, + "include": ["./**/*.ts"] +} diff --git a/TypeShim.E2E/vitest/vite.config.ts b/TypeShim.E2E/vitest/vite.config.ts new file mode 100644 index 0000000..f0e9902 --- /dev/null +++ b/TypeShim.E2E/vitest/vite.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from 'vite'; + +const isBrowserMode = ((process.env.VITE_BROWSER_MODE ?? '').toLowerCase() === 'true'); +const isCI = ((process.env.CI ?? '').toLowerCase() === 'true'); + +export default defineConfig({ + define: { __BROWSER_MODE__: isBrowserMode, __IS_CI__: isCI }, + root: '.', + assetsInclude: ['**/*.wasm', '**/*.dat'], + test: { + root: '.', + include: ['**/*.{test,spec}.ts', '**/*.{test,spec}.tsx'], + environment: 'node', + setupFiles: ['./src/setup/setup.ts'], + testTimeout: 10_000, + hookTimeout: 10_000, + browser: { + enabled: isBrowserMode, + name: 'chromium', + provider: 'playwright', + headless: isCI, + screenshotFailures: false + }, + reporters: isCI ? [['junit', { suiteName: isBrowserMode ? 'E2E (Browser)' : 'E2E (Node)' }]] : ['default'], + outputFile: { + junit: isBrowserMode ? '../e2e-report-browser.xml' : '../e2e-report-node.xml' + } + } +}); diff --git a/TypeShim.slnx b/TypeShim.slnx index 29fd57b..7c458ae 100644 --- a/TypeShim.slnx +++ b/TypeShim.slnx @@ -4,6 +4,7 @@ + diff --git a/global.json b/global.json new file mode 100644 index 0000000..13ecc98 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "10.0.101", + "rollForward": "latestMinor", + "allowPrerelease": false + } +} \ No newline at end of file