diff --git a/apps/web/src/dialogs/store.test.ts b/apps/web/src/dialogs/store.test.ts index a9318e4b1..370a9d34d 100644 --- a/apps/web/src/dialogs/store.test.ts +++ b/apps/web/src/dialogs/store.test.ts @@ -1,6 +1,3 @@ -/** - * @vitest-environment jsdom - */ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useDialogStore } from "./store"; diff --git a/package.json b/package.json index 061616b59..859e7446d 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@testing-library/user-event": "^14.6.1", "@types/node": "^25.6.2", "@vitest/coverage-v8": "^4.1.5", - "jsdom": "^29.1.1", + "happy-dom": "^20.9.0", "knip": "^6.12.2", "lefthook": "^2.1.6", "npm-check-updates": "^22.1.1", diff --git a/packages/email/vitest.config.ts b/packages/email/vitest.config.ts index 16537df1d..7dff2d874 100644 --- a/packages/email/vitest.config.ts +++ b/packages/email/vitest.config.ts @@ -4,5 +4,5 @@ import { createVitestProjectConfig } from "../../vitest.shared"; export default createVitestProjectConfig({ name: "@reactive-resume/email", dirname: fileURLToPath(new URL(".", import.meta.url)), - environment: "jsdom", + environment: "happy-dom", }); diff --git a/packages/import/vitest.config.ts b/packages/import/vitest.config.ts index b6b380002..18881f090 100644 --- a/packages/import/vitest.config.ts +++ b/packages/import/vitest.config.ts @@ -4,5 +4,5 @@ import { createVitestProjectConfig } from "../../vitest.shared"; export default createVitestProjectConfig({ name: "@reactive-resume/import", dirname: fileURLToPath(new URL(".", import.meta.url)), - environment: "jsdom", + environment: "happy-dom", }); diff --git a/packages/pdf/src/section-title.test.ts b/packages/pdf/src/section-title.test.ts index c9c1c8f7f..723759c2a 100644 --- a/packages/pdf/src/section-title.test.ts +++ b/packages/pdf/src/section-title.test.ts @@ -107,7 +107,7 @@ describe("getResumeSectionTitle", () => { customSections: [ { id: "ext-1", - type: "cover-letter", + type: "cover-letter" as const, title: "My Cover Letter", columns: 1, hidden: false, @@ -124,7 +124,7 @@ describe("getResumeSectionTitle", () => { customSections: [ { id: "ext-1", - type: "cover-letter", + type: "cover-letter" as const, title: "", columns: 1, hidden: false, diff --git a/packages/ui/src/components/combobox.test.tsx b/packages/ui/src/components/combobox.test.tsx index c290b4782..f942db274 100644 --- a/packages/ui/src/components/combobox.test.tsx +++ b/packages/ui/src/components/combobox.test.tsx @@ -138,8 +138,12 @@ describe("ComboboxCollection", () => { - - {(item) => {item}} + + {(item) => ( + + {item} + + )} diff --git a/packages/ui/src/components/form.tsx b/packages/ui/src/components/form.tsx index 595fb55de..a10ef24e8 100644 --- a/packages/ui/src/components/form.tsx +++ b/packages/ui/src/components/form.tsx @@ -40,12 +40,12 @@ function FormLabel({ className, ...props }: React.ComponentProps) ); } -function FormControl(props: useRender.ComponentProps<"div">) { +function FormControl({ render, ...props }: useRender.ComponentProps<"div">) { const { id, hasError } = useFormItem(); return useRender({ - ...props, defaultTagName: "div", + render, state: { slot: "form-control" }, props: { id: `${id}-form-item`, diff --git a/packages/ui/src/components/resizable.test.tsx b/packages/ui/src/components/resizable.test.tsx index 945c382e0..8ed5aa45a 100644 --- a/packages/ui/src/components/resizable.test.tsx +++ b/packages/ui/src/components/resizable.test.tsx @@ -5,7 +5,7 @@ import { ResizableGroup, ResizablePanel, ResizableSeparator } from "./resizable" describe("ResizableGroup", () => { it("renders with data-slot='resizable-panel-group'", () => { const { container } = render( - + A B @@ -16,7 +16,7 @@ describe("ResizableGroup", () => { it("merges custom className", () => { const { container } = render( - + x , ); @@ -27,7 +27,7 @@ describe("ResizableGroup", () => { describe("ResizablePanel", () => { it("renders with data-slot='resizable-panel'", () => { const { container } = render( - + x , ); @@ -38,7 +38,7 @@ describe("ResizablePanel", () => { describe("ResizableSeparator", () => { it("renders with data-slot='resizable-handle' and no inner handle by default", () => { const { container } = render( - + A B @@ -52,7 +52,7 @@ describe("ResizableSeparator", () => { it("renders inner handle when withHandle=true", () => { const { container } = render( - + A B diff --git a/packages/ui/src/vitest.d.ts b/packages/ui/src/vitest.d.ts new file mode 100644 index 000000000..f149f27ae --- /dev/null +++ b/packages/ui/src/vitest.d.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom/vitest"; diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts index 02a754850..9a3e1b8d6 100644 --- a/packages/ui/vitest.config.ts +++ b/packages/ui/vitest.config.ts @@ -4,5 +4,5 @@ import { createVitestProjectConfig } from "../../vitest.shared"; export default createVitestProjectConfig({ name: "@reactive-resume/ui", dirname: fileURLToPath(new URL(".", import.meta.url)), - environment: "jsdom", + environment: "happy-dom", }); diff --git a/packages/utils/src/field.test.ts b/packages/utils/src/field.test.ts index a7f7a8e23..f2ffe8fab 100644 --- a/packages/utils/src/field.test.ts +++ b/packages/utils/src/field.test.ts @@ -43,7 +43,7 @@ describe("filterFieldValues", () => { it("filters out fields with missing keys", () => { const fields = [{ key: "name" as const }]; - const result = filterFieldValues({}, ...fields); + const result = filterFieldValues<"name", { key: "name" }>({}, ...fields); expect(result.size).toBe(0); }); diff --git a/packages/utils/src/file.test.ts b/packages/utils/src/file.test.ts index 30c88391d..159dd15c1 100644 --- a/packages/utils/src/file.test.ts +++ b/packages/utils/src/file.test.ts @@ -1,5 +1,5 @@ /** - * @vitest-environment jsdom + * @vitest-environment happy-dom */ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { downloadFromUrl, downloadWithAnchor, generateFilename } from "./file"; @@ -31,8 +31,8 @@ describe("generateFilename", () => { }); describe("downloadWithAnchor", () => { - let createObjectURLSpy: ReturnType; - let revokeObjectURLSpy: ReturnType; + let createObjectURLSpy: ReturnType>; + let revokeObjectURLSpy: ReturnType>; let originalCreate: typeof URL.createObjectURL; let originalRevoke: typeof URL.revokeObjectURL; @@ -40,8 +40,8 @@ describe("downloadWithAnchor", () => { vi.useFakeTimers(); originalCreate = URL.createObjectURL; originalRevoke = URL.revokeObjectURL; - createObjectURLSpy = vi.fn(() => "blob:mock-url"); - revokeObjectURLSpy = vi.fn(); + createObjectURLSpy = vi.fn(() => "blob:mock-url"); + revokeObjectURLSpy = vi.fn(); URL.createObjectURL = createObjectURLSpy; URL.revokeObjectURL = revokeObjectURLSpy; }); @@ -91,8 +91,8 @@ describe("downloadWithAnchor", () => { describe("downloadFromUrl", () => { let originalFetch: typeof global.fetch; - let createObjectURLSpy: ReturnType; - let revokeObjectURLSpy: ReturnType; + let createObjectURLSpy: ReturnType>; + let revokeObjectURLSpy: ReturnType>; let originalCreate: typeof URL.createObjectURL; let originalRevoke: typeof URL.revokeObjectURL; @@ -100,8 +100,8 @@ describe("downloadFromUrl", () => { originalFetch = global.fetch; originalCreate = URL.createObjectURL; originalRevoke = URL.revokeObjectURL; - createObjectURLSpy = vi.fn(() => "blob:mock-url"); - revokeObjectURLSpy = vi.fn(); + createObjectURLSpy = vi.fn(() => "blob:mock-url"); + revokeObjectURLSpy = vi.fn(); URL.createObjectURL = createObjectURLSpy; URL.revokeObjectURL = revokeObjectURLSpy; }); diff --git a/packages/utils/src/sanitize.test.ts b/packages/utils/src/sanitize.test.ts index 2bf070611..ae3788e21 100644 --- a/packages/utils/src/sanitize.test.ts +++ b/packages/utils/src/sanitize.test.ts @@ -1,5 +1,5 @@ /** - * @vitest-environment jsdom + * @vitest-environment happy-dom */ import { describe, expect, it } from "vitest"; import { isObject, sanitizeCss, sanitizeHtml } from "./sanitize"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94c082f18..0b77e264c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,9 +38,9 @@ importers: '@vitest/coverage-v8': specifier: ^4.1.5 version: 4.1.5(vitest@4.1.5) - jsdom: - specifier: ^29.1.1 - version: 29.1.1(@noble/hashes@2.2.0) + happy-dom: + specifier: ^20.9.0 + version: 20.9.0 knip: specifier: ^6.12.2 version: 6.12.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) @@ -58,7 +58,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) apps/web: dependencies: @@ -103,19 +103,19 @@ importers: version: 1.14.2(@opentelemetry/api@1.9.0) '@orpc/json-schema': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/openapi': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/server': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/tanstack-query': specifier: ^1.14.2 version: 1.14.2(@opentelemetry/api@1.9.0)(@orpc/client@1.14.2(@opentelemetry/api@1.9.0))(@tanstack/query-core@5.100.9) '@orpc/zod': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(@orpc/contract@1.14.2(@opentelemetry/api@1.9.0))(@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3))(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)(zod@4.4.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(@orpc/contract@1.14.2(@opentelemetry/api@1.9.0))(@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0))(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)(zod@4.4.3) '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -384,10 +384,10 @@ importers: version: 1.14.2(@opentelemetry/api@1.9.0) '@orpc/experimental-ratelimit': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/server': specifier: ^1.14.2 - version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + version: 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@reactive-resume/ai': specifier: workspace:* version: link:../ai @@ -926,21 +926,6 @@ packages: peerDependencies: ajv: '>=8' - '@asamuzakjp/css-color@5.1.11': - resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@7.1.1': - resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/generational-cache@1.0.1': - resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@authenio/xml-encryption@2.0.2': resolution: {integrity: sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==} engines: {node: '>=12'} @@ -1868,10 +1853,6 @@ packages: cpu: [x64] os: [win32] - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true - '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1957,42 +1938,6 @@ packages: conventional-commits-parser: optional: true - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} - engines: {node: '>=20.19.0'} - '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -2505,15 +2450,6 @@ packages: cpu: [x64] os: [win32] - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true - '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -4972,6 +4908,9 @@ packages: '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5699,10 +5638,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -5755,9 +5690,6 @@ packages: supports-color: optional: true - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -6045,10 +5977,6 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -6452,6 +6380,10 @@ packages: crossws: optional: true + happy-dom@20.9.0: + resolution: {integrity: sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ==} + engines: {node: '>=20.0.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -6502,10 +6434,6 @@ packages: hsl-to-rgb-for-reals@1.1.1: resolution: {integrity: sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==} - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -6704,9 +6632,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -6864,15 +6789,6 @@ packages: jsbi@4.3.2: resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==} - jsdom@29.1.1: - resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -7513,9 +7429,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} @@ -8033,10 +7946,6 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - scheduler@0.25.0-rc-603e6108-20241029: resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} @@ -8334,9 +8243,6 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -8425,10 +8331,6 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} @@ -8814,10 +8716,6 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - walk-up-path@4.0.0: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} @@ -8829,10 +8727,6 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -8841,18 +8735,14 @@ packages: engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} - - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -8965,6 +8855,18 @@ packages: utf-8-validate: optional: true + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + 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 + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -8980,10 +8882,6 @@ packages: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - xml-naming@0.1.0: resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} engines: {node: '>=16.0.0'} @@ -8995,9 +8893,6 @@ packages: resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} engines: {node: '>=20.0'} - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xpath@0.0.32: resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} engines: {node: '>=0.6.0'} @@ -9144,26 +9039,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@asamuzakjp/css-color@5.1.11': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@asamuzakjp/dom-selector@7.1.1': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - - '@asamuzakjp/generational-cache@1.0.1': {} - - '@asamuzakjp/nwsapi@2.3.9': {} - '@authenio/xml-encryption@2.0.2': dependencies: '@xmldom/xmldom': 0.8.13 @@ -10502,10 +10377,6 @@ snapshots: '@biomejs/cli-win32-x64@2.4.15': optional: true - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.2.1 - '@colors/colors@1.5.0': optional: true @@ -10625,30 +10496,6 @@ snapshots: optionalDependencies: conventional-commits-parser: 6.4.0 - '@csstools/color-helpers@6.0.2': {} - - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - - '@csstools/css-tokenizer@4.0.0': {} - '@dnd-kit/accessibility@3.1.1(react@19.2.6)': dependencies: react: 19.2.6 @@ -10943,10 +10790,6 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@exodus/bytes@1.15.0(@noble/hashes@2.2.0)': - optionalDependencies: - '@noble/hashes': 2.2.0 - '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -11447,10 +11290,10 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/experimental-ratelimit@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)': + '@orpc/experimental-ratelimit@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)': dependencies: '@orpc/client': 1.14.2(@opentelemetry/api@1.9.0) - '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/shared': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/standard-server': 1.14.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: @@ -11461,12 +11304,12 @@ snapshots: '@orpc/interop@1.14.2': {} - '@orpc/json-schema@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)': + '@orpc/json-schema@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)': dependencies: '@orpc/contract': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/interop': 1.14.2 - '@orpc/openapi': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) - '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + '@orpc/openapi': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) + '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/shared': 1.14.2(@opentelemetry/api@1.9.0) json-schema-typed: 8.0.2 transitivePeerDependencies: @@ -11484,13 +11327,13 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/openapi@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)': + '@orpc/openapi@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)': dependencies: '@orpc/client': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/contract': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/interop': 1.14.2 '@orpc/openapi-client': 1.14.2(@opentelemetry/api@1.9.0) - '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/shared': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/standard-server': 1.14.2(@opentelemetry/api@1.9.0) json-schema-typed: 8.0.2 @@ -11501,7 +11344,7 @@ snapshots: - fastify - ws - '@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)': + '@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)': dependencies: '@orpc/client': 1.14.2(@opentelemetry/api@1.9.0) '@orpc/contract': 1.14.2(@opentelemetry/api@1.9.0) @@ -11516,7 +11359,7 @@ snapshots: cookie: 1.1.1 optionalDependencies: crossws: 0.4.5(srvx@0.11.15) - ws: 8.18.3 + ws: 8.20.0 transitivePeerDependencies: - '@opentelemetry/api' - fastify @@ -11581,12 +11424,12 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/zod@1.14.2(@opentelemetry/api@1.9.0)(@orpc/contract@1.14.2(@opentelemetry/api@1.9.0))(@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3))(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3)(zod@4.4.3)': + '@orpc/zod@1.14.2(@opentelemetry/api@1.9.0)(@orpc/contract@1.14.2(@opentelemetry/api@1.9.0))(@orpc/server@1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0))(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0)(zod@4.4.3)': dependencies: '@orpc/contract': 1.14.2(@opentelemetry/api@1.9.0) - '@orpc/json-schema': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) - '@orpc/openapi': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) - '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.18.3) + '@orpc/json-schema': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) + '@orpc/openapi': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) + '@orpc/server': 1.14.2(@opentelemetry/api@1.9.0)(crossws@0.4.5(srvx@0.11.15))(ws@8.20.0) '@orpc/shared': 1.14.2(@opentelemetry/api@1.9.0) escape-string-regexp: 5.0.0 wildcard-match: 5.1.4 @@ -13411,6 +13254,8 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.1': dependencies: '@types/node': 25.6.2 @@ -13517,7 +13362,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + vitest: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/expect@4.1.5': dependencies: @@ -13767,7 +13612,7 @@ snapshots: pg: 8.20.0 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - vitest: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + vitest: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -14115,13 +13960,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-urls@7.0.0(@noble/hashes@2.2.0): - dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.2.0) - transitivePeerDependencies: - - '@noble/hashes' - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -14154,8 +13992,6 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.6.0: {} - dedent@1.7.2(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -14328,8 +14164,6 @@ snapshots: entities@7.0.1: {} - entities@8.0.0: {} - env-paths@2.2.1: {} env-paths@3.0.0: {} @@ -14884,6 +14718,18 @@ snapshots: optionalDependencies: crossws: 0.4.5(srvx@0.11.15) + happy-dom@20.9.0: + dependencies: + '@types/node': 25.6.2 + '@types/whatwg-mimetype': 3.0.2 + '@types/ws': 8.18.1 + entities: 7.0.1 + whatwg-mimetype: 3.0.0 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -14928,12 +14774,6 @@ snapshots: hsl-to-rgb-for-reals@1.1.1: {} - html-encoding-sniffer@6.0.0(@noble/hashes@2.2.0): - dependencies: - '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) - transitivePeerDependencies: - - '@noble/hashes' - html-escaper@2.0.2: {} html-to-text@9.0.5: @@ -15117,8 +14957,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: {} - is-promise@4.0.0: {} is-regex@1.2.1: @@ -15250,32 +15088,6 @@ snapshots: jsbi@4.3.2: {} - jsdom@29.1.1(@noble/hashes@2.2.0): - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@asamuzakjp/dom-selector': 7.1.1 - '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) - css-tree: 3.2.1 - data-urls: 7.0.0(@noble/hashes@2.2.0) - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.2.0) - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.6 - parse5: 8.0.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 7.25.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.2.0) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - jsesc@3.1.0: {} json-parse-even-better-errors@2.3.1: {} @@ -15918,10 +15730,6 @@ snapshots: dependencies: entities: 6.0.1 - parse5@8.0.1: - dependencies: - entities: 8.0.0 - parseley@0.12.1: dependencies: leac: 0.6.0 @@ -16533,10 +16341,6 @@ snapshots: sax@1.6.0: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - scheduler@0.25.0-rc-603e6108-20241029: {} scheduler@0.27.0: {} @@ -16929,8 +16733,6 @@ snapshots: react: 19.2.6 use-sync-external-store: 1.6.0(react@19.2.6) - symbol-tree@3.2.4: {} - tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} @@ -17002,10 +16804,6 @@ snapshots: dependencies: punycode: 2.3.1 - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - ts-morph@26.0.0: dependencies: '@ts-morph/common': 0.27.0 @@ -17240,7 +17038,7 @@ snapshots: optionalDependencies: vite: 8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) - vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)): + vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(happy-dom@20.9.0)(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(msw@2.14.5(@types/node@25.6.2)(typescript@6.0.3))(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) @@ -17266,42 +17064,28 @@ snapshots: '@opentelemetry/api': 1.9.0 '@types/node': 25.6.2 '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) - jsdom: 29.1.1(@noble/hashes@2.2.0) + happy-dom: 20.9.0 transitivePeerDependencies: - msw w3c-keyname@2.2.8: {} - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - walk-up-path@4.0.0: {} web-streams-polyfill@3.3.3: {} webidl-conversions@4.0.2: {} - webidl-conversions@8.0.1: {} - webpack-virtual-modules@0.6.2: {} whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} - whatwg-mimetype@5.0.0: {} - - whatwg-url@16.0.1(@noble/hashes@2.2.0): - dependencies: - '@exodus/bytes': 1.15.0(@noble/hashes@2.2.0) - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' - whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -17495,6 +17279,8 @@ snapshots: ws@8.18.3: {} + ws@8.20.0: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 @@ -17512,8 +17298,6 @@ snapshots: dependencies: sax: 1.6.0 - xml-name-validator@5.0.0: {} - xml-naming@0.1.0: {} xml@1.0.1: {} @@ -17525,8 +17309,6 @@ snapshots: '@oozcitak/util': 10.0.0 js-yaml: 4.1.1 - xmlchars@2.2.0: {} - xpath@0.0.32: {} xpath@0.0.33: {} diff --git a/vitest.shared.ts b/vitest.shared.ts index ac962b002..ce9ddaa1b 100644 --- a/vitest.shared.ts +++ b/vitest.shared.ts @@ -27,10 +27,24 @@ export const createVitestProjectConfig = ({ test: { name, environment, + environmentOptions: { + happyDOM: { + settings: { + disableJavaScriptFileLoading: true, + disableCSSFileLoading: true, + navigation: { + disableMainFrameNavigation: true, + disableChildFrameNavigation: true, + disableChildPageNavigation: true, + }, + }, + }, + }, setupFiles: [setupFile], include: ["src/**/*.{test,spec}.?(c|m)[jt]s?(x)"], exclude: ["node_modules", "dist", ".output", "coverage", "reports"], - pool: "forks", + pool: "threads", + isolate: false, passWithNoTests: true, coverage: { provider: "v8",