From 187a8147a4e4507e3d03993832c397f3ef24dbe3 Mon Sep 17 00:00:00 2001 From: Andy Pickler Date: Tue, 16 Jun 2026 07:12:13 -0600 Subject: [PATCH 1/4] chore(deps): upgrade Vitest 3.x to 4.x (#458) Bump vitest and @vitest/coverage-v8 to ^4.1.8 (latest release older than the repo's 7-day minimumReleaseAge gate). Vitest 4 requires Vite >= 6, which was only an auto-installed peer pinned at v5; declare vite (^7.3.5) in the catalog and as a direct devDependency in each vitest package so it resolves to 7.x deterministically, with no peer warnings. Preserve whole-src coverage measurement: Vitest 4's v8 provider drops coverage.all and only counts imported files unless coverage.include is set. Add a shared coverageInclude to @acme/vitest-config and apply it to me/api/map (plus literal includes in packages storage/api). auth keeps its narrow phone.ts scope. Re-ratchet thresholds to the honest whole-src baseline. Vitest 4's AST-aware v8 remapping counts branches/functions more granularly, lowering those numbers; autoUpdate only raises, so me's branch/function thresholds and map's static branch/function floors are lowered manually to match the v4 baseline. Fix a Vitest 4 mock regression: vi.fn().mockImplementation(() => ({...})) used with `new` throws "is not a constructor" (arrow functions have no [[Construct]]). Convert the MemoryRatelimiter mock to a function form across 19 test files. Also bumps the packageManager pin to pnpm@11.7.0. Verified: all 7 test tasks pass, coverage idempotent across two runs, and lint/typecheck/prettier clean. Co-Authored-By: Claude Opus 4.8 --- apps/api/package.json | 1 + apps/api/vitest.config.ts | 20 +- apps/auth/package.json | 1 + apps/auth/vitest.config.ts | 6 +- apps/map/package.json | 1 + apps/map/vitest.config.ts | 16 +- apps/me/package.json | 1 + apps/me/vitest.config.ts | 16 +- package.json | 2 +- packages/api/package.json | 1 + packages/api/src/lib/cascade-service.test.ts | 18 +- .../api/src/lib/first-event-service.test.ts | 18 +- packages/api/src/lib/webhook-events.test.ts | 6 +- packages/api/src/router/api-key.test.ts | 6 +- packages/api/src/router/attendance.test.ts | 6 +- .../api/src/router/event-instance.test.ts | 6 +- packages/api/src/router/event-tag.test.ts | 6 +- packages/api/src/router/event-type.test.ts | 6 +- packages/api/src/router/event.test.ts | 6 +- packages/api/src/router/location.test.ts | 6 +- packages/api/src/router/me/me.test.ts | 6 +- .../src/router/org-chart/org-chart.test.ts | 6 +- packages/api/src/router/org.test.ts | 6 +- packages/api/src/router/ping.test.ts | 6 +- packages/api/src/router/position.test.ts | 6 +- packages/api/src/router/request.test.ts | 6 +- .../api/src/router/user-grant-access.test.ts | 6 +- packages/api/src/router/user.test.ts | 6 +- packages/api/src/shared.test.ts | 6 +- packages/api/vitest.config.ts | 2 + packages/storage/package.json | 1 + packages/storage/vitest.config.ts | 2 + pnpm-lock.yaml | 1053 +++++++---------- pnpm-workspace.yaml | 8 +- tooling/vitest/coverage.ts | 9 + 35 files changed, 567 insertions(+), 711 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 652eea09..1632df25 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -58,6 +58,7 @@ "prettier": "catalog:", "tailwindcss": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vite-tsconfig-paths": "catalog:", "vitest": "catalog:" }, diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts index cdeefe95..bbb0f02f 100644 --- a/apps/api/vitest.config.ts +++ b/apps/api/vitest.config.ts @@ -1,4 +1,4 @@ -import { coverageExclude } from "@acme/vitest-config"; +import { coverageExclude, coverageInclude } from "@acme/vitest-config"; import react from "@vitejs/plugin-react"; import tsconfigPaths from "vite-tsconfig-paths"; import { defineConfig } from "vitest/config"; @@ -14,17 +14,19 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Exclude bootstrap/config files that aren't unit-testable (Sentry init, - // Next config, instrumentation, styling config). They otherwise sit in the - // denominator at 0% and make every edit to them break the global - // thresholds. Shared list keeps vitest's defaults plus the bootstrap globs. + // Measure all of src (Vitest 4 otherwise only counts imported files), minus + // bootstrap/config files that aren't unit-testable (Sentry init, Next config, + // instrumentation, styling config). Those otherwise sit in the denominator at + // 0% and make every edit to them break the global thresholds. Shared list + // keeps vitest's defaults plus the bootstrap globs. + include: coverageInclude, exclude: coverageExclude, thresholds: { autoUpdate: true, - statements: 65.41, - branches: 88.88, - functions: 50, - lines: 65.41, + statements: 90.32, + branches: 90.9, + functions: 77.77, + lines: 90.32, }, }, exclude: [ diff --git a/apps/auth/package.json b/apps/auth/package.json index f9a95495..c2a161ee 100644 --- a/apps/auth/package.json +++ b/apps/auth/package.json @@ -54,6 +54,7 @@ "tailwindcss": "catalog:", "tsx": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vitest": "catalog:" }, "prettier": "@acme/prettier-config" diff --git a/apps/auth/vitest.config.ts b/apps/auth/vitest.config.ts index 5109273a..e2af0043 100644 --- a/apps/auth/vitest.config.ts +++ b/apps/auth/vitest.config.ts @@ -11,10 +11,10 @@ export default defineConfig({ include: ["src/lib/phone.ts"], thresholds: { autoUpdate: true, - statements: 86.95, - branches: 72.72, + statements: 91.66, + branches: 80, functions: 100, - lines: 86.95, + lines: 90.9, }, }, }, diff --git a/apps/map/package.json b/apps/map/package.json index 7b24bc4e..c3faab61 100644 --- a/apps/map/package.json +++ b/apps/map/package.json @@ -83,6 +83,7 @@ "prettier": "catalog:", "tailwindcss": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vite-tsconfig-paths": "catalog:", "vitest": "catalog:", "vitest-canvas-mock": "catalog:" diff --git a/apps/map/vitest.config.ts b/apps/map/vitest.config.ts index a8d4d3b4..d28134a7 100644 --- a/apps/map/vitest.config.ts +++ b/apps/map/vitest.config.ts @@ -1,4 +1,4 @@ -import { coverageExclude } from "@acme/vitest-config"; +import { coverageExclude, coverageInclude } from "@acme/vitest-config"; import react from "@vitejs/plugin-react"; import tsconfigPaths from "vite-tsconfig-paths"; import { defineConfig } from "vitest/config"; @@ -14,14 +14,20 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Exclude non-testable bootstrap/config files (defensive; map uses static - // thresholds, so this only keeps the denominator consistent with other apps). + // Measure all of src (Vitest 4 otherwise only counts imported files), minus + // non-testable bootstrap/config files (defensive; map uses static thresholds, + // so this only keeps the denominator consistent with other apps). + include: coverageInclude, exclude: coverageExclude, thresholds: { autoUpdate: false, statements: 1.8, - branches: 27.23, - functions: 17.15, + // Vitest 4's AST-aware v8 remapping counts branches/functions more + // granularly, so whole-src branch/function coverage measures lower than + // under v3. Floors lowered to sit just under the v4 baseline (branches + // ~4.4%, functions ~7.7%) while still guarding against regressions. + branches: 4, + functions: 7, lines: 1.8, }, }, diff --git a/apps/me/package.json b/apps/me/package.json index e2fd4a6e..b5ee0dd3 100644 --- a/apps/me/package.json +++ b/apps/me/package.json @@ -52,6 +52,7 @@ "tailwindcss": "catalog:", "tailwindcss-animate": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vitest": "catalog:" } } diff --git a/apps/me/vitest.config.ts b/apps/me/vitest.config.ts index 5a9929f0..c0282123 100644 --- a/apps/me/vitest.config.ts +++ b/apps/me/vitest.config.ts @@ -1,4 +1,4 @@ -import { coverageExclude } from "@acme/vitest-config"; +import { coverageExclude, coverageInclude } from "@acme/vitest-config"; import { defineConfig } from "vitest/config"; import react from "@vitejs/plugin-react"; import path from "path"; @@ -13,15 +13,17 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Exclude non-testable bootstrap/config files so they don't sit in the - // coverage denominator at 0% and break the autoUpdate thresholds on edit. + // Measure all of src (Vitest 4 otherwise only counts imported files), minus + // non-testable bootstrap/config files that would sit in the denominator at 0% + // and break the autoUpdate thresholds on edit. + include: coverageInclude, exclude: coverageExclude, thresholds: { autoUpdate: true, - statements: 25.68, - branches: 82.81, - functions: 47.88, - lines: 25.68, + statements: 31.17, + branches: 34.83, + functions: 17.07, + lines: 32, }, }, setupFiles: ["./vitest.setup.ts"], diff --git a/package.json b/package.json index 77efe117..b0e46046 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "engines": { "node": ">=24.14.1 <25" }, - "packageManager": "pnpm@11.6.0+sha512.9a36518224080c6fe5165afdcfe79bfa118c29be703f3f462b1e32efe1e98e47e8750b148e08286250aad4113cc7993ca413c4e2cd447752708c2ee5751bc95f", + "packageManager": "pnpm@11.7.0+sha512.19cc852c120c7125760f2443ee6be0ca5b40f9f50598de1a09a1f177503e010e57c23c77646e01e761de59bf874fb22a3398c33ab9691fc13eb946b6f0f4d620", "scripts": { "build": "turbo build", "ci:local": "pnpm format && pnpm lint && pnpm typecheck && pnpm build && pnpm test", diff --git a/packages/api/package.json b/packages/api/package.json index a4e12e69..c64f34c7 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -51,6 +51,7 @@ "eslint": "catalog:", "prettier": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vite-tsconfig-paths": "catalog:", "vitest": "catalog:" }, diff --git a/packages/api/src/lib/cascade-service.test.ts b/packages/api/src/lib/cascade-service.test.ts index 2e17a37e..a2465e70 100644 --- a/packages/api/src/lib/cascade-service.test.ts +++ b/packages/api/src/lib/cascade-service.test.ts @@ -9,14 +9,16 @@ import { vi } from "vitest"; vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: vi.fn().mockResolvedValue({ - success: true, - limit: 10, - remaining: 9, - reset: Date.now() + 60000, - }), - })), + MemoryRatelimiter: vi.fn(function () { + return { + limit: vi.fn().mockResolvedValue({ + success: true, + limit: 10, + remaining: 9, + reset: Date.now() + 60000, + }), + }; + }), })); import { and, eq, gte, schema } from "@acme/db"; diff --git a/packages/api/src/lib/first-event-service.test.ts b/packages/api/src/lib/first-event-service.test.ts index e67f4ea4..3cdb1046 100644 --- a/packages/api/src/lib/first-event-service.test.ts +++ b/packages/api/src/lib/first-event-service.test.ts @@ -9,14 +9,16 @@ import { vi } from "vitest"; vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: vi.fn().mockResolvedValue({ - success: true, - limit: 10, - remaining: 9, - reset: Date.now() + 60000, - }), - })), + MemoryRatelimiter: vi.fn(function () { + return { + limit: vi.fn().mockResolvedValue({ + success: true, + limit: 10, + remaining: 9, + reset: Date.now() + 60000, + }), + }; + }), })); vi.mock("@acme/mail", async (importOriginal) => { diff --git a/packages/api/src/lib/webhook-events.test.ts b/packages/api/src/lib/webhook-events.test.ts index 41fb63fd..a71c5761 100644 --- a/packages/api/src/lib/webhook-events.test.ts +++ b/packages/api/src/lib/webhook-events.test.ts @@ -10,9 +10,9 @@ import { vi } from "vitest"; // Mock the rate limiter before any imports const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); // Mock notifyWebhooks to capture webhook calls diff --git a/packages/api/src/router/api-key.test.ts b/packages/api/src/router/api-key.test.ts index e0805826..ae5ed391 100644 --- a/packages/api/src/router/api-key.test.ts +++ b/packages/api/src/router/api-key.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/attendance.test.ts b/packages/api/src/router/attendance.test.ts index 03e7df43..76acfa54 100644 --- a/packages/api/src/router/attendance.test.ts +++ b/packages/api/src/router/attendance.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { and, eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/event-instance.test.ts b/packages/api/src/router/event-instance.test.ts index 694d5786..5f3ab7d0 100644 --- a/packages/api/src/router/event-instance.test.ts +++ b/packages/api/src/router/event-instance.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/event-tag.test.ts b/packages/api/src/router/event-tag.test.ts index 0faf6888..fd0dbf6d 100644 --- a/packages/api/src/router/event-tag.test.ts +++ b/packages/api/src/router/event-tag.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/event-type.test.ts b/packages/api/src/router/event-type.test.ts index a12817b3..ca403459 100644 --- a/packages/api/src/router/event-type.test.ts +++ b/packages/api/src/router/event-type.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/event.test.ts b/packages/api/src/router/event.test.ts index c396e673..31760a74 100644 --- a/packages/api/src/router/event.test.ts +++ b/packages/api/src/router/event.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/location.test.ts b/packages/api/src/router/location.test.ts index f01e20ef..79eaa148 100644 --- a/packages/api/src/router/location.test.ts +++ b/packages/api/src/router/location.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/me/me.test.ts b/packages/api/src/router/me/me.test.ts index bdb68567..d69e54c2 100644 --- a/packages/api/src/router/me/me.test.ts +++ b/packages/api/src/router/me/me.test.ts @@ -14,9 +14,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import type { Session } from "@acme/auth"; diff --git a/packages/api/src/router/org-chart/org-chart.test.ts b/packages/api/src/router/org-chart/org-chart.test.ts index c9d959a2..20bc4b8f 100644 --- a/packages/api/src/router/org-chart/org-chart.test.ts +++ b/packages/api/src/router/org-chart/org-chart.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { schema } from "@acme/db"; diff --git a/packages/api/src/router/org.test.ts b/packages/api/src/router/org.test.ts index 631e4d59..f80cdd4f 100644 --- a/packages/api/src/router/org.test.ts +++ b/packages/api/src/router/org.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { and, eq, gte, schema } from "@acme/db"; diff --git a/packages/api/src/router/ping.test.ts b/packages/api/src/router/ping.test.ts index fc954b77..03d1f6c6 100644 --- a/packages/api/src/router/ping.test.ts +++ b/packages/api/src/router/ping.test.ts @@ -10,9 +10,9 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { createTestClient } from "../__tests__/test-utils"; diff --git a/packages/api/src/router/position.test.ts b/packages/api/src/router/position.test.ts index 98dc3180..db60244f 100644 --- a/packages/api/src/router/position.test.ts +++ b/packages/api/src/router/position.test.ts @@ -12,9 +12,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { and, eq, inArray, schema } from "@acme/db"; diff --git a/packages/api/src/router/request.test.ts b/packages/api/src/router/request.test.ts index 1dffdf40..2df012b2 100644 --- a/packages/api/src/router/request.test.ts +++ b/packages/api/src/router/request.test.ts @@ -15,9 +15,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import { eq, schema } from "@acme/db"; diff --git a/packages/api/src/router/user-grant-access.test.ts b/packages/api/src/router/user-grant-access.test.ts index 67e51e45..eb61aa55 100644 --- a/packages/api/src/router/user-grant-access.test.ts +++ b/packages/api/src/router/user-grant-access.test.ts @@ -11,9 +11,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import type { Session } from "@acme/auth"; diff --git a/packages/api/src/router/user.test.ts b/packages/api/src/router/user.test.ts index 6692c634..ad4df9cc 100644 --- a/packages/api/src/router/user.test.ts +++ b/packages/api/src/router/user.test.ts @@ -17,9 +17,9 @@ import { vi } from "vitest"; const mockLimit = vi.hoisted(() => vi.fn()); vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); import type { Session } from "@acme/auth"; diff --git a/packages/api/src/shared.test.ts b/packages/api/src/shared.test.ts index 63e00af5..48ff6c68 100644 --- a/packages/api/src/shared.test.ts +++ b/packages/api/src/shared.test.ts @@ -12,9 +12,9 @@ const mockLimit = vi.fn(); const maxRequests = 10; vi.mock("@orpc/experimental-ratelimit/memory", () => ({ - MemoryRatelimiter: vi.fn().mockImplementation(() => ({ - limit: mockLimit, - })), + MemoryRatelimiter: vi.fn(function () { + return { limit: mockLimit }; + }), })); // Helper to create a test client with custom headers diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts index ff3b46f5..71a25ad9 100644 --- a/packages/api/vitest.config.ts +++ b/packages/api/vitest.config.ts @@ -11,6 +11,8 @@ export default defineConfig({ env: { NODE_ENV: "test" }, coverage: { provider: "v8", + // Measure all of src; Vitest 4 otherwise only counts files a test imported. + include: ["src/**/*.ts"], }, }, }); diff --git a/packages/storage/package.json b/packages/storage/package.json index 3fbd80c6..27368984 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -29,6 +29,7 @@ "@vitest/coverage-v8": "catalog:", "eslint": "catalog:", "typescript": "catalog:", + "vite": "catalog:", "vitest": "catalog:" }, "prettier": "@acme/prettier-config" diff --git a/packages/storage/vitest.config.ts b/packages/storage/vitest.config.ts index 30c0d92a..3be24e7b 100644 --- a/packages/storage/vitest.config.ts +++ b/packages/storage/vitest.config.ts @@ -6,6 +6,8 @@ export default defineConfig({ include: ["src/**/*.test.ts"], coverage: { provider: "v8", + // Measure all of src; Vitest 4 otherwise only counts files a test imported. + include: ["src/**/*.ts"], }, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86b76544..718c5f39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,8 +178,8 @@ catalogs: specifier: ^5.2.0 version: 5.2.0 '@vitest/coverage-v8': - specifier: ^3.2.6 - version: 3.2.6 + specifier: ^4.1.8 + version: 4.1.8 autoprefixer: specifier: ^10.5.0 version: 10.5.0 @@ -372,12 +372,15 @@ catalogs: vaul: specifier: ^0.9.0 version: 0.9.9 + vite: + specifier: ^7.3.5 + version: 7.3.5 vite-tsconfig-paths: specifier: ^6.1.1 version: 6.1.1 vitest: - specifier: ^3.2.6 - version: 3.2.6 + specifier: ^4.1.8 + version: 4.1.8 vitest-canvas-mock: specifier: ^1.1.4 version: 1.1.4 @@ -681,10 +684,10 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) + version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) eslint: specifier: 'catalog:' version: 10.4.0(jiti@2.7.0) @@ -703,12 +706,15 @@ importers: typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@6.0.3)(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) + version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) apps/auth: dependencies: @@ -793,7 +799,7 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) autoprefixer: specifier: 'catalog:' version: 10.5.0(postcss@8.5.15) @@ -821,9 +827,12 @@ importers: typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) apps/homepage: dependencies: @@ -1053,10 +1062,10 @@ importers: version: 7.1.3 '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) + version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) eslint: specifier: 'catalog:' version: 10.4.0(jiti@2.7.0) @@ -1075,15 +1084,18 @@ importers: typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@6.0.3)(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) + version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest-canvas-mock: specifier: 'catalog:' - version: 1.1.4(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 1.1.4(vitest@4.1.8) apps/me: dependencies: @@ -1162,10 +1174,10 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) + version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) autoprefixer: specifier: 'catalog:' version: 10.5.0(postcss@8.5.15) @@ -1187,9 +1199,12 @@ importers: typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/api: dependencies: @@ -1265,7 +1280,7 @@ importers: version: 4.17.24 '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) dotenv-cli: specifier: 'catalog:' version: 7.4.4 @@ -1278,12 +1293,15 @@ importers: typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@6.0.3)(vite@5.4.21(@types/node@25.9.2)(terser@5.48.0)) + version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/auth: dependencies: @@ -1602,16 +1620,19 @@ importers: version: 24.12.4 '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)) + version: 4.1.8(vitest@4.1.8) eslint: specifier: 'catalog:' version: 10.4.0(jiti@2.7.0) typescript: specifier: 'catalog:' version: 6.0.3 + vite: + specifier: 'catalog:' + version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/ui: dependencies: @@ -1969,7 +1990,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages: @@ -1980,10 +2001,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@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} @@ -2263,14 +2280,14 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2287,14 +2304,14 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2311,14 +2328,14 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2335,14 +2352,14 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2359,14 +2376,14 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2383,14 +2400,14 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2407,14 +2424,14 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2431,14 +2448,14 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2455,14 +2472,14 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2479,14 +2496,14 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2503,14 +2520,14 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2527,14 +2544,14 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2551,14 +2568,14 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2575,14 +2592,14 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2599,14 +2616,14 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2623,14 +2640,14 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2647,14 +2664,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2671,6 +2688,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} @@ -2683,14 +2706,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2707,6 +2730,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} @@ -2719,14 +2748,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2743,6 +2772,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} @@ -2755,14 +2790,14 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2779,14 +2814,14 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2803,14 +2838,14 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2827,14 +2862,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -3249,14 +3284,6 @@ packages: '@types/node': optional: true - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.6': - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} - engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -3872,10 +3899,6 @@ packages: '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@prisma/instrumentation@6.11.1': resolution: {integrity: sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==} peerDependencies: @@ -5529,43 +5552,43 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/coverage-v8@3.2.6': - resolution: {integrity: sha512-LsAdmUapA0qSN306d8+zOyawM0hFm2m2Hg9IwVNIKBm+qJV8cijiq2c+gxKZcB1HCfIWAy+0qEZDCUQA58A1cw==} + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: - '@vitest/browser': 3.2.6 - vitest: 3.2.6 + '@vitest/browser': 4.1.8 + vitest: 4.1.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.6': - resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@3.2.6': - resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.6': - resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@3.2.6': - resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@3.2.6': - resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@3.2.6': - resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/utils@3.2.6': - resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5783,8 +5806,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.12: - resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -5890,10 +5913,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} @@ -5924,8 +5943,8 @@ packages: caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@2.4.2: @@ -5949,10 +5968,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -6196,10 +6211,6 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -6408,9 +6419,6 @@ packages: duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -6464,9 +6472,6 @@ packages: resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} @@ -6499,16 +6504,16 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -6767,10 +6772,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - form-data@2.5.6: resolution: {integrity: sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==} engines: {node: '>= 0.12'} @@ -6896,11 +6897,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -7319,10 +7315,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -7331,9 +7323,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -7363,9 +7352,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -7563,9 +7549,6 @@ packages: lottie-web@5.13.0: resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -7602,8 +7585,8 @@ packages: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -7860,6 +7843,10 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obug@2.1.2: + resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} + engines: {node: '>=12.20.0'} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -7921,9 +7908,6 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} @@ -7978,10 +7962,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} @@ -8622,8 +8602,8 @@ packages: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -8639,10 +8619,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -8705,9 +8681,6 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@2.3.0: resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} @@ -8834,10 +8807,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.2: - resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} - engines: {node: '>=18'} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -8858,9 +8827,6 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.1.1: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} @@ -8872,16 +8838,8 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -9108,32 +9066,32 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-tsconfig-paths@6.1.1: resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} peerDependencies: vite: '*' - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -9148,32 +9106,49 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vitest-canvas-mock@1.1.4: resolution: {integrity: sha512-4boWHY+STwAxGl1+uwakNNoQky5EjPLC8HuponXNoAscYyT1h/F7RUvTkl4IyF/MiWr3V8Q626je3Iel3eArqA==} peerDependencies: vitest: ^3.0.0 || ^4.0.0 - vitest@3.2.6: - resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.6 - '@vitest/ui': 3.2.6 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -9284,10 +9259,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -9369,11 +9340,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -9722,10 +9688,10 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.14.0 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.27.7': optional: true '@esbuild/aix-ppc64@0.28.1': @@ -9734,10 +9700,10 @@ snapshots: '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.27.7': optional: true '@esbuild/android-arm64@0.28.1': @@ -9746,10 +9712,10 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.27.7': optional: true '@esbuild/android-arm@0.28.1': @@ -9758,10 +9724,10 @@ snapshots: '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.27.7': optional: true '@esbuild/android-x64@0.28.1': @@ -9770,10 +9736,10 @@ snapshots: '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.27.7': optional: true '@esbuild/darwin-arm64@0.28.1': @@ -9782,10 +9748,10 @@ snapshots: '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.27.7': optional: true '@esbuild/darwin-x64@0.28.1': @@ -9794,10 +9760,10 @@ snapshots: '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.27.7': optional: true '@esbuild/freebsd-arm64@0.28.1': @@ -9806,10 +9772,10 @@ snapshots: '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.27.7': optional: true '@esbuild/freebsd-x64@0.28.1': @@ -9818,10 +9784,10 @@ snapshots: '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.27.7': optional: true '@esbuild/linux-arm64@0.28.1': @@ -9830,10 +9796,10 @@ snapshots: '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.27.7': optional: true '@esbuild/linux-arm@0.28.1': @@ -9842,10 +9808,10 @@ snapshots: '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.27.7': optional: true '@esbuild/linux-ia32@0.28.1': @@ -9854,10 +9820,10 @@ snapshots: '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.27.7': optional: true '@esbuild/linux-loong64@0.28.1': @@ -9866,10 +9832,10 @@ snapshots: '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.27.7': optional: true '@esbuild/linux-mips64el@0.28.1': @@ -9878,10 +9844,10 @@ snapshots: '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.27.7': optional: true '@esbuild/linux-ppc64@0.28.1': @@ -9890,10 +9856,10 @@ snapshots: '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.27.7': optional: true '@esbuild/linux-riscv64@0.28.1': @@ -9902,10 +9868,10 @@ snapshots: '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.27.7': optional: true '@esbuild/linux-s390x@0.28.1': @@ -9914,10 +9880,10 @@ snapshots: '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.27.7': optional: true '@esbuild/linux-x64@0.28.1': @@ -9926,16 +9892,19 @@ snapshots: '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.27.7': + optional: true + '@esbuild/netbsd-arm64@0.28.1': optional: true '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.27.7': optional: true '@esbuild/netbsd-x64@0.28.1': @@ -9944,16 +9913,19 @@ snapshots: '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.27.7': + optional: true + '@esbuild/openbsd-arm64@0.28.1': optional: true '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.27.7': optional: true '@esbuild/openbsd-x64@0.28.1': @@ -9962,16 +9934,19 @@ snapshots: '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.27.7': + optional: true + '@esbuild/openharmony-arm64@0.28.1': optional: true '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.27.7': optional: true '@esbuild/sunos-x64@0.28.1': @@ -9980,10 +9955,10 @@ snapshots: '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.27.7': optional: true '@esbuild/win32-arm64@0.28.1': @@ -9992,10 +9967,10 @@ snapshots: '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.27.7': optional: true '@esbuild/win32-ia32@0.28.1': @@ -10004,10 +9979,10 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.27.7': optional: true '@esbuild/win32-x64@0.28.1': @@ -10346,17 +10321,6 @@ snapshots: optionalDependencies: '@types/node': 25.9.2 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.6': {} - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -10984,9 +10948,6 @@ snapshots: '@pinojs/redact@0.4.0': {} - '@pkgjs/parseargs@0.11.0': - optional: true - '@prisma/instrumentation@6.11.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -12701,7 +12662,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@vitejs/plugin-react@5.2.0(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0))': + '@vitejs/plugin-react@5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.0) @@ -12709,97 +12670,72 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 5.4.21(@types/node@24.12.4)(terser@5.48.0) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@3.2.6(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 - std-env: 3.10.0 - test-exclude: 7.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + vite: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.6(vitest@3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0))': + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3 + '@vitest/utils': 4.1.8 + ast-v8-to-istanbul: 1.0.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 - std-env: 3.10.0 - test-exclude: 7.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0) - transitivePeerDependencies: - - supports-color + magicast: 0.5.3 + obug: 2.1.2 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/expect@3.2.6': + '@vitest/expect@4.1.8': dependencies: + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.6(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0))': + '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@24.12.4)(terser@5.48.0) + vite: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) - '@vitest/mocker@3.2.6(vite@5.4.21(@types/node@25.9.2)(terser@5.48.0))': + '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@vitest/spy': 3.2.6 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@25.9.2)(terser@5.48.0) + vite: 7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) - '@vitest/pretty-format@3.2.6': + '@vitest/pretty-format@4.1.8': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.6': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 3.2.6 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.6': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.6 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.6': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.1.8': {} - '@vitest/utils@3.2.6': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.6 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@webassemblyjs/ast@1.14.1': dependencies: @@ -13053,7 +12989,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.12: + ast-v8-to-istanbul@1.0.3: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -13150,8 +13086,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - cac@6.7.14: {} - cachedir@2.3.0: {} call-bind-apply-helpers@1.0.2: @@ -13182,13 +13116,7 @@ snapshots: caniuse-lite@1.0.30001793: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk@2.4.2: dependencies: @@ -13231,8 +13159,6 @@ snapshots: chardet@2.1.1: {} - check-error@2.1.3: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -13472,8 +13398,6 @@ snapshots: dedent@0.7.0: {} - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -13598,8 +13522,6 @@ snapshots: readable-stream: 3.6.2 stream-shift: 1.0.3 - eastasianwidth@0.2.0: {} - ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 @@ -13712,8 +13634,6 @@ snapshots: math-intrinsics: 1.1.0 safe-array-concat: 1.1.3 - es-module-lexer@1.7.0: {} - es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: @@ -13771,32 +13691,6 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.21.5: - 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 - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -13826,6 +13720,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -14165,11 +14088,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - form-data@2.5.6: dependencies: asynckit: 0.4.0 @@ -14328,15 +14246,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -14818,14 +14727,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 @@ -14840,12 +14741,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jest-worker@27.5.1: dependencies: '@types/node': 25.9.2 @@ -14866,8 +14761,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -15072,8 +14965,6 @@ snapshots: lottie-web@5.13.0: {} - loupe@3.2.1: {} - lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 @@ -15104,7 +14995,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.3: dependencies: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 @@ -15337,6 +15228,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obug@2.1.2: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: @@ -15466,8 +15359,6 @@ snapshots: degenerator: 5.0.1 netmask: 2.1.0 - package-json-from-dist@1.0.1: {} - param-case@2.1.1: dependencies: no-case: 2.3.2 @@ -15517,8 +15408,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pg-cloudflare@1.3.0: optional: true @@ -16192,7 +16081,7 @@ snapshots: dependencies: type-fest: 0.7.1 - std-env@3.10.0: {} + std-env@4.1.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -16211,12 +16100,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -16299,10 +16182,6 @@ snapshots: strip-json-comments@5.0.3: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - strnum@2.3.0: {} stubs@3.0.0: {} @@ -16417,12 +16296,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.2: - dependencies: - '@istanbuljs/schema': 0.1.6 - glob: 10.5.0 - minimatch: 10.2.5 - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -16441,8 +16314,6 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} - tinyexec@1.1.1: {} tinyglobby@0.2.16: @@ -16455,11 +16326,7 @@ snapshots: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} + tinyrainbow@3.1.0: {} title-case@2.1.1: dependencies: @@ -16705,165 +16572,123 @@ snapshots: - '@types/react' - '@types/react-dom' - vite-node@3.2.4(@types/node@24.12.4)(terser@5.48.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 5.4.21(@types/node@24.12.4)(terser@5.48.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite-node@3.2.4(@types/node@25.9.2)(terser@5.48.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 5.4.21(@types/node@25.9.2)(terser@5.48.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)): + vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) - vite: 5.4.21(@types/node@24.12.4)(terser@5.48.0) + vite: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@5.4.21(@types/node@25.9.2)(terser@5.48.0)): + vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) - vite: 5.4.21(@types/node@25.9.2)(terser@5.48.0) + vite: 7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@24.12.4)(terser@5.48.0): + vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: - esbuild: 0.21.5 + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.15 rollup: 4.60.1 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 + jiti: 2.7.0 terser: 5.48.0 + tsx: 4.22.3 + yaml: 2.9.0 - vite@5.4.21(@types/node@25.9.2)(terser@5.48.0): + vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: - esbuild: 0.21.5 + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.15 rollup: 4.60.1 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.9.2 fsevents: 2.3.3 + jiti: 2.7.0 terser: 5.48.0 + tsx: 4.22.3 + yaml: 2.9.0 - vitest-canvas-mock@1.1.4(vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0)): + vitest-canvas-mock@1.1.4(vitest@4.1.8): dependencies: cssfontparser: 1.2.1 moo-color: 1.0.3 - vitest: 3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - vitest@3.2.6(@types/node@24.12.4)(jsdom@29.1.1)(terser@5.48.0): + vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@5.4.21(@types/node@24.12.4)(terser@5.48.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 3.10.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.1.1 tinyglobby: 0.2.16 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@24.12.4)(terser@5.48.0) - vite-node: 3.2.4(@types/node@24.12.4)(terser@5.48.0) + tinyrainbow: 3.1.0 + vite: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.1 '@types/node': 24.12.4 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) jsdom: 29.1.1 transitivePeerDependencies: - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vitest@3.2.6(@types/node@25.9.2)(jsdom@29.1.1)(terser@5.48.0): + vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@5.4.21(@types/node@25.9.2)(terser@5.48.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 3.10.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.1.1 tinyglobby: 0.2.16 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@25.9.2)(terser@5.48.0) - vite-node: 3.2.4(@types/node@25.9.2)(terser@5.48.0) + tinyrainbow: 3.1.0 + vite: 7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.1 '@types/node': 25.9.2 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) jsdom: 29.1.1 transitivePeerDependencies: - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser w3c-xmlserializer@5.0.0: dependencies: @@ -17018,12 +16843,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 99e57672..dd94ca3d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -63,7 +63,7 @@ catalog: "@types/supercluster": ^7.1.3 "@vis.gl/react-google-maps": ^1.5.2 "@vitejs/plugin-react": ^5.2.0 - "@vitest/coverage-v8": ^3.2.6 + "@vitest/coverage-v8": ^4.1.8 autoprefixer: ^10.5.0 class-variance-authority: ^0.7.0 clsx: ^2.1.0 @@ -129,8 +129,12 @@ catalog: typescript: ^6.0.3 typescript-eslint: ^8.60.0 vaul: ^0.9.0 + # Vitest 4 requires Vite >= 6. Vite is otherwise only a transitive (auto-installed + # peer) dep, which pnpm won't reliably bump from the locked v5; declaring it + # explicitly in each vitest package pins a compatible Vite deterministically. + vite: ^7.3.5 vite-tsconfig-paths: ^6.1.1 - vitest: ^3.2.6 + vitest: ^4.1.8 vitest-canvas-mock: ^1.1.4 zod: ^3.25.76 zustand: ^4.5.2 diff --git a/tooling/vitest/coverage.ts b/tooling/vitest/coverage.ts index ef8841fd..d0ffbfb1 100644 --- a/tooling/vitest/coverage.ts +++ b/tooling/vitest/coverage.ts @@ -26,3 +26,12 @@ export const coverageExclude = [ ...coverageConfigDefaults.exclude, ...bootstrapCoverageExclude, ]; + +/** + * Whole-`src` coverage measurement. Vitest 4's v8 provider removed `coverage.all` + * and only measures files a test actually imports unless `coverage.include` is set. + * Setting this explicitly preserves v3's behaviour — untested files stay in the + * denominator — so coverage keeps answering "how much of the app is tested" rather + * than "how much of what we imported is tested". Pair with `coverageExclude`. + */ +export const coverageInclude = ["src/**/*.{ts,tsx}"]; From d9fefdb3f3e835828a546fdcfa8063289542a7ca Mon Sep 17 00:00:00 2001 From: Andy Pickler Date: Tue, 16 Jun 2026 07:37:43 -0600 Subject: [PATCH 2/4] test(repo): include .tsx in package coverage globs packages/api and packages/storage set coverage.include to "src/**/*.ts", which does not match .tsx. packages/api/src/get-sorting-columns.tsx was therefore silently dropped from the coverage denominator under Vitest 4 (harmless to CI since the package has no thresholds, but the measurement was incomplete and inconsistent with the apps' shared coverageInclude). Widen both packages to "src/**/*.{ts,tsx}" so whole-src coverage matches @acme/vitest-config's coverageInclude. Co-Authored-By: Claude Opus 4.8 --- packages/api/vitest.config.ts | 2 +- packages/storage/vitest.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts index 71a25ad9..69742383 100644 --- a/packages/api/vitest.config.ts +++ b/packages/api/vitest.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ coverage: { provider: "v8", // Measure all of src; Vitest 4 otherwise only counts files a test imported. - include: ["src/**/*.ts"], + include: ["src/**/*.{ts,tsx}"], }, }, }); diff --git a/packages/storage/vitest.config.ts b/packages/storage/vitest.config.ts index 3be24e7b..ba68d6a8 100644 --- a/packages/storage/vitest.config.ts +++ b/packages/storage/vitest.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ coverage: { provider: "v8", // Measure all of src; Vitest 4 otherwise only counts files a test imported. - include: ["src/**/*.ts"], + include: ["src/**/*.{ts,tsx}"], }, }, }); From cf0fb95aa662bc91db8655f2b0029e8bf3f18a58 Mon Sep 17 00:00:00 2001 From: Andy Pickler Date: Fri, 19 Jun 2026 08:21:46 -0600 Subject: [PATCH 3/4] docs(repo): scrub vitest config comments, add docs/testing.md (#461) Move the Vitest 4 coverage rationale out of the per-app vitest.config.ts files (whose hand-written comment blocks varied per file and hardcoded threshold percentages prone to rot) into a canonical docs/testing.md, linked from AGENTS.md. Configs are now declarative; the shared globs keep their JSDoc in tooling/vitest/coverage.ts. Co-Authored-By: Claude Opus 4.8 --- AGENTS.md | 1 + apps/api/vitest.config.ts | 5 --- apps/map/vitest.config.ts | 7 ---- apps/me/vitest.config.ts | 3 -- docs/testing.md | 69 +++++++++++++++++++++++++++++++ packages/api/vitest.config.ts | 1 - packages/storage/vitest.config.ts | 1 - 7 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 docs/testing.md diff --git a/AGENTS.md b/AGENTS.md index 3e0accf2..976b0650 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -91,6 +91,7 @@ that app's `AGENTS.md`. - Use Vitest for unit and integration tests; name test files `*.test.ts[x]` and place under or near source code or in `__tests__`. - Reset databases before any suite that mutates data (`pnpm reset-test-db` or `pnpm -C packages/db reset-test-db`). - Prefer fixtures in `apps/map/tests` or `packages/*/__mocks__` instead of live service calls. +- How coverage is measured and why thresholds are set the way they are (Vitest 4's whole-`src` denominator, shared `coverageInclude`/`coverageExclude`): [`docs/testing.md`](docs/testing.md). ### Driving auth-bounded flows in local dev diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts index bbb0f02f..fc2db8d5 100644 --- a/apps/api/vitest.config.ts +++ b/apps/api/vitest.config.ts @@ -14,11 +14,6 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Measure all of src (Vitest 4 otherwise only counts imported files), minus - // bootstrap/config files that aren't unit-testable (Sentry init, Next config, - // instrumentation, styling config). Those otherwise sit in the denominator at - // 0% and make every edit to them break the global thresholds. Shared list - // keeps vitest's defaults plus the bootstrap globs. include: coverageInclude, exclude: coverageExclude, thresholds: { diff --git a/apps/map/vitest.config.ts b/apps/map/vitest.config.ts index d28134a7..61459033 100644 --- a/apps/map/vitest.config.ts +++ b/apps/map/vitest.config.ts @@ -14,18 +14,11 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Measure all of src (Vitest 4 otherwise only counts imported files), minus - // non-testable bootstrap/config files (defensive; map uses static thresholds, - // so this only keeps the denominator consistent with other apps). include: coverageInclude, exclude: coverageExclude, thresholds: { autoUpdate: false, statements: 1.8, - // Vitest 4's AST-aware v8 remapping counts branches/functions more - // granularly, so whole-src branch/function coverage measures lower than - // under v3. Floors lowered to sit just under the v4 baseline (branches - // ~4.4%, functions ~7.7%) while still guarding against regressions. branches: 4, functions: 7, lines: 1.8, diff --git a/apps/me/vitest.config.ts b/apps/me/vitest.config.ts index 523b7420..9166bdf0 100644 --- a/apps/me/vitest.config.ts +++ b/apps/me/vitest.config.ts @@ -13,9 +13,6 @@ export default defineConfig({ provider: "v8", reporter: ["text", "json", "html"], reportsDirectory: "./coverage", - // Measure all of src (Vitest 4 otherwise only counts imported files), minus - // non-testable bootstrap/config files that would sit in the denominator at 0% - // and break the autoUpdate thresholds on edit. include: coverageInclude, exclude: coverageExclude, thresholds: { diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 00000000..02b2a975 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,69 @@ +# Testing & Coverage + +How unit/integration tests and coverage are set up across the monorepo. The +per-app `vitest.config.ts` files are intentionally declarative — the rationale +behind the coverage settings lives here so it stays in one place instead of +drifting across config comments. + +## Running tests + +- All packages: `pnpm test` +- A single app/package: `pnpm -C apps/map test` (append `--run` for a one-shot, + non-watch run) +- CI runs these under the `test-coverage` check (one of the five required checks + enforced by the `dev` branch ruleset — see [AGENTS.md](../AGENTS.md)). + +Use Vitest for unit and integration tests. Name test files `*.test.ts[x]` and +place them next to the source or under `__tests__`. Reset databases before any +suite that mutates data (`pnpm reset-test-db`). + +## Coverage measurement (Vitest 4) + +Vitest 4's v8 coverage provider removed the `coverage.all` option and, by +default, only measures files that a test actually imported. Left unset, an +untested file disappears from the denominator entirely, so coverage silently +answers "how much of what we imported is tested" instead of "how much of the app +is tested." + +To preserve the v3 behaviour — untested files stay in the denominator — every +config sets `coverage.include` explicitly to the whole `src` tree +(`src/**/*.{ts,tsx}`). Apps that use the shared tooling import this rather than +hardcoding the glob: + +```ts +import { coverageExclude, coverageInclude } from "@acme/vitest-config"; +``` + +- **`coverageInclude`** — the whole-`src` glob (keeps untested files counted). +- **`coverageExclude`** — Vitest's built-in excludes plus non-testable + bootstrap/config files (Sentry init, `next.config.*`, `instrumentation*`, + Tailwind/PostCSS config, `middleware.*`). Those files would otherwise sit in + the denominator at 0% and break thresholds on every edit. + +Both constants, and the exact glob lists, are defined and documented in +[`tooling/vitest/coverage.ts`](../tooling/vitest/coverage.ts) (the +`@acme/vitest-config` package). That file is the single source of truth — update +the globs there, not in individual app configs. + +## Thresholds + +Coverage thresholds live in each app's `vitest.config.ts` under +`test.coverage.thresholds`. Two modes are in use: + +- **`autoUpdate: true`** (e.g. `apps/api`, `apps/me`) — Vitest ratchets the + thresholds up automatically as coverage improves, guarding against + regressions without manual bookkeeping. +- **Static floors** (`apps/map`) — fixed minimums that only change by hand. + +Note that Vitest 4's AST-aware v8 remapping counts branches and functions more +granularly than v3, so whole-`src` branch/function coverage measures lower than +it did before the upgrade. Static floors were lowered accordingly to sit just +under the v4 baseline while still catching regressions. The numbers in each +config are the source of truth — this doc deliberately doesn't repeat them. + +## Driving auth-bounded flows + +Tests and QA flows that require sign-in go through `apps/auth`'s email-based MFA +against a local mail backend (no real inbox). See the +[Testing Guidelines in AGENTS.md](../AGENTS.md) and +[`docs/QA_LOCAL_AUTH.md`](QA_LOCAL_AUTH.md). diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts index 69742383..67f2ac11 100644 --- a/packages/api/vitest.config.ts +++ b/packages/api/vitest.config.ts @@ -11,7 +11,6 @@ export default defineConfig({ env: { NODE_ENV: "test" }, coverage: { provider: "v8", - // Measure all of src; Vitest 4 otherwise only counts files a test imported. include: ["src/**/*.{ts,tsx}"], }, }, diff --git a/packages/storage/vitest.config.ts b/packages/storage/vitest.config.ts index ba68d6a8..144b8083 100644 --- a/packages/storage/vitest.config.ts +++ b/packages/storage/vitest.config.ts @@ -6,7 +6,6 @@ export default defineConfig({ include: ["src/**/*.test.ts"], coverage: { provider: "v8", - // Measure all of src; Vitest 4 otherwise only counts files a test imported. include: ["src/**/*.{ts,tsx}"], }, }, From 9bb32ca7a785924954728fde9072bb0e5cc6159a Mon Sep 17 00:00:00 2001 From: Andy Pickler Date: Fri, 19 Jun 2026 08:25:52 -0600 Subject: [PATCH 4/4] chore(deps): upgrade Vitest to 4.1.9 --- pnpm-lock.yaml | 154 ++++++++++++++++++++++++-------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 86 insertions(+), 70 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11b7590c..f9fd4bd1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -376,8 +376,8 @@ catalogs: specifier: ^6.1.1 version: 6.1.1 vitest: - specifier: ^4.1.8 - version: 4.1.8 + specifier: ^4.1.9 + version: 4.1.9 vitest-canvas-mock: specifier: ^1.1.4 version: 1.1.4 @@ -684,7 +684,7 @@ importers: version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) eslint: specifier: 'catalog:' version: 10.4.0(jiti@2.7.0) @@ -711,7 +711,7 @@ importers: version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) apps/auth: dependencies: @@ -796,7 +796,7 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) autoprefixer: specifier: 'catalog:' version: 10.5.0(postcss@8.5.15) @@ -829,7 +829,7 @@ importers: version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) apps/homepage: dependencies: @@ -1059,7 +1059,7 @@ importers: version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) autoprefixer: specifier: 'catalog:' version: 10.5.0(postcss@8.5.15) @@ -1092,10 +1092,10 @@ importers: version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest-canvas-mock: specifier: 'catalog:' - version: 1.1.4(vitest@4.1.8) + version: 1.1.4(vitest@4.1.9) apps/me: dependencies: @@ -1183,7 +1183,7 @@ importers: version: 5.2.0(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) autoprefixer: specifier: 'catalog:' version: 10.5.0(postcss@8.5.15) @@ -1210,7 +1210,7 @@ importers: version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/api: dependencies: @@ -1280,7 +1280,7 @@ importers: version: 4.17.24 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) dotenv-cli: specifier: 'catalog:' version: 7.4.4 @@ -1301,7 +1301,7 @@ importers: version: 6.1.1(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/auth: dependencies: @@ -1614,7 +1614,7 @@ importers: version: 24.12.4 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) eslint: specifier: 'catalog:' version: 10.4.0(jiti@2.7.0) @@ -1626,7 +1626,7 @@ importers: version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages/ui: dependencies: @@ -1982,7 +1982,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) packages: @@ -5556,11 +5556,11 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@4.1.8': - resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.8': - resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5573,18 +5573,24 @@ packages: '@vitest/pretty-format@4.1.8': resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@4.1.8': - resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.8': - resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.8': - resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -9085,20 +9091,20 @@ packages: peerDependencies: vitest: ^3.0.0 || ^4.0.0 - vitest@4.1.8: - resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.8 - '@vitest/browser-preview': 4.1.8 - '@vitest/browser-webdriverio': 4.1.8 - '@vitest/coverage-istanbul': 4.1.8 - '@vitest/coverage-v8': 4.1.8 - '@vitest/ui': 4.1.8 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -12675,7 +12681,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': + '@vitest/coverage-v8@4.1.8(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.8 @@ -12687,28 +12693,28 @@ snapshots: obug: 2.1.2 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/expect@4.1.8': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': + '@vitest/mocker@4.1.9(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.8 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) - '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': + '@vitest/mocker@4.1.9(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.8 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: @@ -12718,19 +12724,23 @@ snapshots: dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.8': + '@vitest/pretty-format@4.1.9': dependencies: - '@vitest/utils': 4.1.8 + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.9': + dependencies: + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.8': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.8': {} + '@vitest/spy@4.1.9': {} '@vitest/utils@4.1.8': dependencies: @@ -12738,6 +12748,12 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vitest/utils@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -16609,21 +16625,21 @@ snapshots: tsx: 4.22.3 yaml: 2.9.0 - vitest-canvas-mock@1.1.4(vitest@4.1.8): + vitest-canvas-mock@1.1.4(vitest@4.1.9): dependencies: cssfontparser: 1.2.1 moo-color: 1.0.3 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.8 - '@vitest/runner': 4.1.8 - '@vitest/snapshot': 4.1.8 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -16640,20 +16656,20 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 24.12.4 - '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@vitest/coverage-v8': 4.1.8(vitest@4.1.9) jsdom: 29.1.1 transitivePeerDependencies: - msw - vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.9.2)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.8 - '@vitest/runner': 4.1.8 - '@vitest/snapshot': 4.1.8 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@7.3.5(@types/node@25.9.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -16670,7 +16686,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.9.2 - '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@vitest/coverage-v8': 4.1.8(vitest@4.1.9) jsdom: 29.1.1 transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e1520dc9..b6521580 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -133,7 +133,7 @@ catalog: # explicitly in each vitest package pins a compatible Vite deterministically. vite: ^7.3.5 vite-tsconfig-paths: ^6.1.1 - vitest: ^4.1.8 + vitest: ^4.1.9 vitest-canvas-mock: ^1.1.4 zod: ^3.25.76 zustand: ^4.5.2