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",