diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 9306e437076..d0c691b4c83 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -9,6 +9,7 @@ "localdev": "dotenv -e ../../.env -- vinxi dev --port 3002", "build": "vinxi build", "tauri": "tauri", + "test": "vitest run", "test:display-transport": "node scripts/desktop-display-transport-benchmark.js", "test:memory": "node scripts/desktop-memory-soak.js", "test:memory:unit": "vitest run scripts/desktop-memory-soak.test.js" diff --git a/apps/storybook/package.json b/apps/storybook/package.json index 4ea3d148eef..89dada1d62e 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -4,7 +4,8 @@ "type": "module", "scripts": { "dev:storybook": "storybook dev -p 6006", - "build:storybook": "storybook build" + "build:storybook": "storybook build", + "test": "vitest run" }, "dependencies": { "@cap/ui-solid": "workspace:*", @@ -25,6 +26,7 @@ "storybook-solidjs-vite": "^1.0.0-beta.2", "typescript": "^5.8.3", "vite": "^6.3.5", - "vite-plugin-solid": "^2.10.2" + "vite-plugin-solid": "^2.10.2", + "vitest": "~2.1.9" } } diff --git a/apps/storybook/storybook-vite.test.ts b/apps/storybook/storybook-vite.test.ts new file mode 100644 index 00000000000..dedc84b973b --- /dev/null +++ b/apps/storybook/storybook-vite.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; +import config from "./vite.config"; + +describe("storybook Vite config", () => { + it("loads Solid and Cap UI plugins", () => { + const plugins = config.plugins ?? []; + + expect( + plugins.some( + (plugin) => !Array.isArray(plugin) && plugin?.name === "solid", + ), + ).toBe(true); + expect( + plugins.some( + (plugin) => + Array.isArray(plugin) && + plugin.some((entry) => entry?.name === "unplugin-icons"), + ), + ).toBe(true); + }); +}); diff --git a/apps/storybook/vitest.config.ts b/apps/storybook/vitest.config.ts new file mode 100644 index 00000000000..ce63ad84542 --- /dev/null +++ b/apps/storybook/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["**/*.test.ts"], + }, +}); diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index 5c30d80a6ce..2e586a6d162 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -4,7 +4,8 @@ "scripts": { "dev_": "pnpm dotenv -e ../../.env -- concurrently \"deno run --allow-all --watch ./src/runner/index.ts\" \"deno run --allow-all --watch ./src/shard-manager.ts\"", "build": "pnpm run --filter @cap/web-cluster^... build", - "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." + "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest .", + "test": "vitest run" }, "dependencies": { "@cap/web-backend": "workspace:*", @@ -26,6 +27,7 @@ }, "devDependencies": { "concurrently": "^9.2.1", - "dotenv-cli": "^10.0.0" + "dotenv-cli": "^10.0.0", + "vitest": "~2.1.9" } } diff --git a/apps/web-cluster/src/cluster/container-metadata.test.ts b/apps/web-cluster/src/cluster/container-metadata.test.ts new file mode 100644 index 00000000000..e7181d8dd0d --- /dev/null +++ b/apps/web-cluster/src/cluster/container-metadata.test.ts @@ -0,0 +1,47 @@ +import { Effect } from "effect"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { ContainerMetadata } from "./container-metadata"; + +const originalEnv = { ...process.env }; + +afterEach(() => { + process.env = { ...originalEnv }; + vi.unstubAllGlobals(); +}); + +function getContainerMetadata() { + return Effect.gen(function* () { + return yield* ContainerMetadata; + }).pipe(Effect.provide(ContainerMetadata.Default)); +} + +describe("ContainerMetadata", () => { + it("uses local defaults when ECS metadata is unavailable", async () => { + delete process.env.ECS_CONTAINER_METADATA_URI_V4; + delete process.env.PORT; + + const metadata = await Effect.runPromise(getContainerMetadata()); + + expect(metadata).toEqual({ ipAddress: "0.0.0.0", port: 42069 }); + }); + + it("reads container IP and port from the runtime environment", async () => { + process.env.ECS_CONTAINER_METADATA_URI_V4 = "http://metadata.local"; + process.env.PORT = "5173"; + const fetchMock = vi.fn(async () => ({ + json: async () => ({ + Containers: [ + { + Networks: [{ IPv4Addresses: ["10.0.0.42"] }], + }, + ], + }), + })); + vi.stubGlobal("fetch", fetchMock); + + const metadata = await Effect.runPromise(getContainerMetadata()); + + expect(fetchMock).toHaveBeenCalledWith("http://metadata.local/task"); + expect(metadata).toEqual({ ipAddress: "10.0.0.42", port: 5173 }); + }); +}); diff --git a/apps/web-cluster/vitest.config.ts b/apps/web-cluster/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/apps/web-cluster/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/config/package.json b/packages/config/package.json index e05ced6a042..d0e7721690b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -5,6 +5,9 @@ "./*": "./*", "./vite": "./vite" }, + "scripts": { + "test": "vitest run" + }, "devDependencies": { "@types/node": "^20.4.5", "@typescript-eslint/eslint-plugin": "^5.59.6", @@ -17,7 +20,8 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-tailwindcss": "^3.12.0", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "vitest": "~2.1.9" }, "dependencies": { "@vitejs/plugin-react": "^4.0.3", diff --git a/packages/config/vite/relativeAliasResolver.test.ts b/packages/config/vite/relativeAliasResolver.test.ts new file mode 100644 index 00000000000..fe68dd0adff --- /dev/null +++ b/packages/config/vite/relativeAliasResolver.test.ts @@ -0,0 +1,32 @@ +import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; +import resolver from "./relativeAliasResolver"; + +let testRoot: string | undefined; + +afterEach(async () => { + if (testRoot) await rm(testRoot, { recursive: true, force: true }); + testRoot = undefined; +}); + +describe("relativeAliasResolver", () => { + it("resolves ~/ imports relative to a package src directory", async () => { + testRoot = await mkdtemp(join(tmpdir(), "cap-alias-")); + await mkdir(join(testRoot, "src", "nested"), { recursive: true }); + await writeFile(join(testRoot, "package.json"), "{}"); + await writeFile(join(testRoot, "src", "nested", "target.ts"), ""); + + const customResolver = resolver.customResolver; + if (!customResolver) throw new Error("customResolver is not configured"); + + const resolved = await customResolver( + "~/nested/target", + join(testRoot, "src", "importer.ts"), + {}, + ); + + expect(resolved).toBe(join(testRoot, "src", "nested", "target.ts")); + }); +}); diff --git a/packages/config/vitest.config.ts b/packages/config/vitest.config.ts new file mode 100644 index 00000000000..ce63ad84542 --- /dev/null +++ b/packages/config/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["**/*.test.ts"], + }, +}); diff --git a/packages/database/crypto.test.ts b/packages/database/crypto.test.ts new file mode 100644 index 00000000000..b9785e5bbe7 --- /dev/null +++ b/packages/database/crypto.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; +import { hashPassword, verifyPassword } from "./crypto"; + +describe("password hashing", () => { + it("verifies matching passwords and rejects mismatches", async () => { + const hash = await hashPassword("correct horse battery staple"); + + await expect( + verifyPassword(hash, "correct horse battery staple"), + ).resolves.toBe(true); + await expect(verifyPassword(hash, "wrong password")).resolves.toBe(false); + }); + + it("rejects empty stored hashes or password input", async () => { + await expect(verifyPassword("", "password")).resolves.toBe(false); + await expect(verifyPassword("stored", "")).resolves.toBe(false); + await expect(hashPassword("")).rejects.toThrow( + "Cannot hash empty or null password", + ); + }); +}); diff --git a/packages/database/package.json b/packages/database/package.json index a221a469a38..9f8f2ef9880 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -13,7 +13,8 @@ "db:studio": "drizzle-kit studio --config=drizzle.config.ts", "db:check-integrity": "node scripts/check-migration-integrity.js", "drizzle-kit": "pnpm dotenv -e ../../.env drizzle-kit --config=drizzle.config.ts", - "build": "tsdown" + "build": "tsdown", + "test": "vitest run" }, "dependencies": { "@cap/env": "workspace:*", @@ -50,7 +51,8 @@ "react-dom": "^19.1.1", "react-router-dom": "^6.18.0", "tsconfig": "workspace:*", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "vitest": "~2.1.9" }, "engines": { "node": ">=20" diff --git a/packages/database/vitest.config.ts b/packages/database/vitest.config.ts new file mode 100644 index 00000000000..ce63ad84542 --- /dev/null +++ b/packages/database/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["**/*.test.ts"], + }, +}); diff --git a/packages/env/build.test.ts b/packages/env/build.test.ts new file mode 100644 index 00000000000..13433eb6cd0 --- /dev/null +++ b/packages/env/build.test.ts @@ -0,0 +1,32 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const originalEnv = { ...process.env }; + +beforeEach(() => { + process.env = { ...originalEnv }; + vi.resetModules(); +}); + +afterEach(() => { + process.env = { ...originalEnv }; +}); + +describe("buildEnv", () => { + it("uses WEB_URL as the public web URL when present", async () => { + process.env.WEB_URL = "https://web-url.example"; + process.env.NEXT_PUBLIC_WEB_URL = "https://next-public.example"; + + const { buildEnv } = await import("./build"); + + expect(buildEnv.NEXT_PUBLIC_WEB_URL).toBe("https://web-url.example"); + }); + + it("falls back to NEXT_PUBLIC_WEB_URL when WEB_URL is absent", async () => { + delete process.env.WEB_URL; + process.env.NEXT_PUBLIC_WEB_URL = "https://next-public.example"; + + const { buildEnv } = await import("./build"); + + expect(buildEnv.NEXT_PUBLIC_WEB_URL).toBe("https://next-public.example"); + }); +}); diff --git a/packages/env/package.json b/packages/env/package.json index 926c67f70b7..635593920e8 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -5,7 +5,8 @@ "main": "./index.ts", "types": "./index.ts", "scripts": { - "build": "tsdown" + "build": "tsdown", + "test": "vitest run" }, "publishConfig": { "main": "./dist/index.js" @@ -15,6 +16,7 @@ "zod": "^3.25.76" }, "devDependencies": { - "@types/node": "^22.15.14" + "@types/node": "^22.15.14", + "vitest": "~2.1.9" } } diff --git a/packages/env/vitest.config.ts b/packages/env/vitest.config.ts new file mode 100644 index 00000000000..ce63ad84542 --- /dev/null +++ b/packages/env/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["**/*.test.ts"], + }, +}); diff --git a/packages/sdk-embed/package.json b/packages/sdk-embed/package.json index 0c732bce52e..e694855cbe7 100644 --- a/packages/sdk-embed/package.json +++ b/packages/sdk-embed/package.json @@ -24,6 +24,7 @@ ], "scripts": { "build": "tsup", + "test": "vitest run", "typecheck": "tsc --noEmit" }, "dependencies": {}, @@ -39,6 +40,7 @@ "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "tsup": "^8.0.0", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vitest": "~2.1.9" } } diff --git a/packages/sdk-embed/src/vanilla/cap-embed.test.ts b/packages/sdk-embed/src/vanilla/cap-embed.test.ts new file mode 100644 index 00000000000..b4fc33bee52 --- /dev/null +++ b/packages/sdk-embed/src/vanilla/cap-embed.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from "vitest"; +import { createEmbedUrl } from "./cap-embed"; + +describe("createEmbedUrl", () => { + it("builds the default Cap embed URL", () => { + const url = createEmbedUrl({ + videoId: "video_123", + publicKey: "pk_test", + }); + + expect(url).toBe("https://cap.so/embed/video_123?sdk=1&pk=pk_test"); + }); + + it("includes optional base, playback, and branding parameters", () => { + const url = createEmbedUrl({ + videoId: "video_123", + publicKey: "pk_test", + apiBase: "https://app.example", + autoplay: true, + branding: { + logoUrl: "https://cdn.example/logo.png", + accentColor: "#abcdef", + }, + }); + + expect(url).toBe( + "https://app.example/embed/video_123?sdk=1&pk=pk_test&autoplay=1&logo=https%3A%2F%2Fcdn.example%2Flogo.png&accent=%23abcdef", + ); + }); +}); diff --git a/packages/sdk-embed/vitest.config.ts b/packages/sdk-embed/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/sdk-embed/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/sdk-recorder/package.json b/packages/sdk-recorder/package.json index 7fef2785793..dcd16b9acad 100644 --- a/packages/sdk-recorder/package.json +++ b/packages/sdk-recorder/package.json @@ -20,6 +20,7 @@ ], "scripts": { "build": "tsup", + "test": "vitest run", "typecheck": "tsc --noEmit" }, "dependencies": {}, @@ -35,6 +36,7 @@ "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "tsup": "^8.0.0", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vitest": "~2.1.9" } } diff --git a/packages/sdk-recorder/src/core/mime-types.test.ts b/packages/sdk-recorder/src/core/mime-types.test.ts new file mode 100644 index 00000000000..b92649d84fe --- /dev/null +++ b/packages/sdk-recorder/src/core/mime-types.test.ts @@ -0,0 +1,24 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { getSupportedMimeType } from "./mime-types"; + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +describe("getSupportedMimeType", () => { + it("selects the first supported MIME type by priority", () => { + vi.stubGlobal("MediaRecorder", { + isTypeSupported: vi.fn((mimeType: string) => mimeType.includes("vp8")), + }); + + expect(getSupportedMimeType()).toBe("video/webm;codecs=vp8,opus"); + }); + + it("returns an empty string when no preferred type is supported", () => { + vi.stubGlobal("MediaRecorder", { + isTypeSupported: vi.fn(() => false), + }); + + expect(getSupportedMimeType()).toBe(""); + }); +}); diff --git a/packages/sdk-recorder/vitest.config.ts b/packages/sdk-recorder/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/sdk-recorder/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/tsconfig/base.test.ts b/packages/tsconfig/base.test.ts new file mode 100644 index 00000000000..80509e2d1e3 --- /dev/null +++ b/packages/tsconfig/base.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from "vitest"; +import base from "./base.json"; +import nextjs from "./nextjs.json"; +import reactLibrary from "./react-library.json"; + +describe("shared TypeScript configs", () => { + it("keeps strictness enabled in the base config", () => { + expect(base.compilerOptions.strict).toBe(true); + expect(base.compilerOptions.forceConsistentCasingInFileNames).toBe(true); + }); + + it("extends the base config for React and Next.js presets", () => { + expect(reactLibrary.extends).toBe("./base.json"); + expect(reactLibrary.compilerOptions.jsx).toBe("react-jsx"); + expect(nextjs.extends).toBe("./base.json"); + expect(nextjs.compilerOptions.jsx).toBe("preserve"); + }); +}); diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 92ef9e4c59b..fc048323746 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -3,6 +3,12 @@ "version": "0.0.0", "private": true, "license": "MIT", + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "vitest": "~2.1.9" + }, "publishConfig": { "access": "public" } diff --git a/packages/tsconfig/vitest.config.ts b/packages/tsconfig/vitest.config.ts new file mode 100644 index 00000000000..5aee5c5b672 --- /dev/null +++ b/packages/tsconfig/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["*.test.ts"], + }, +}); diff --git a/packages/ui-solid/package.json b/packages/ui-solid/package.json index a17666853a5..99c21fe3891 100644 --- a/packages/ui-solid/package.json +++ b/packages/ui-solid/package.json @@ -10,6 +10,9 @@ "./vite": "./vite.js", "./types": "./src/types.d.ts" }, + "scripts": { + "test": "vitest run" + }, "dependencies": { "@kobalte/core": "^0.13.7", "cva": "npm:class-variance-authority@^0.7.0", @@ -20,6 +23,7 @@ "@fontsource/geist-sans": "^5.0.3", "@iconify/json": "^2.2.239", "@tailwindcss/typography": "^0.5.9", + "@testing-library/jest-dom": "^6.5.0", "autoprefixer": "^10.4.21", "postcss": "^8.5.10", "storybook-solidjs": "^1.0.0-beta.2", @@ -28,7 +32,10 @@ "tw-animate-css": "^1.4.0", "unplugin-auto-import": "^0.18.2", "unplugin-fonts": "^1.1.1", - "unplugin-icons": "^0.19.2" + "unplugin-icons": "^0.19.2", + "vite": "^6.3.5", + "vite-plugin-solid": "^2.10.2", + "vitest": "~2.1.9" }, "peerDependencies": { "@fontsource/geist-sans": "^5.0.3" diff --git a/packages/ui-solid/src/ProgressCircle.test.tsx b/packages/ui-solid/src/ProgressCircle.test.tsx new file mode 100644 index 00000000000..e7ecb2a1d9e --- /dev/null +++ b/packages/ui-solid/src/ProgressCircle.test.tsx @@ -0,0 +1,32 @@ +import { renderToString } from "solid-js/web"; +import { describe, expect, it } from "vitest"; +import { ProgressCircle } from "./ProgressCircle"; + +describe("ProgressCircle", () => { + it("renders accessible progress values", () => { + const markup = renderToString(() => ( + + )); + + expect(markup).toContain('role="progressbar"'); + expect(markup).toContain('aria-valuenow="42"'); + expect(markup).toContain('aria-valuemin="0"'); + expect(markup).toContain('aria-valuemax="100"'); + expect(markup).toContain("stroke-blue-10"); + expect(markup).toContain("stroke-blue-5"); + }); + + it("clamps progress before rendering aria state and stroke offset", () => { + const overMaxMarkup = renderToString(() => ( + + )); + const belowMinMarkup = renderToString(() => ( + + )); + + expect(overMaxMarkup).toContain('aria-valuenow="100"'); + expect(overMaxMarkup).toContain('stroke-dashoffset="0"'); + expect(belowMinMarkup).toContain('aria-valuenow="0"'); + expect(belowMinMarkup).toContain('stroke-dashoffset="37.69911184307752"'); + }); +}); diff --git a/packages/ui-solid/vitest.config.ts b/packages/ui-solid/vitest.config.ts new file mode 100644 index 00000000000..627689f2784 --- /dev/null +++ b/packages/ui-solid/vitest.config.ts @@ -0,0 +1,10 @@ +import solid from "vite-plugin-solid"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [solid({ ssr: true })], + test: { + environment: "node", + include: ["src/**/*.test.{ts,tsx}"], + }, +}); diff --git a/packages/ui/package.json b/packages/ui/package.json index b76a0f4b1e8..4bcf18973ce 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -10,6 +10,7 @@ "./style": "./style/styles.css" }, "scripts": { + "test": "vitest run", "typecheck": "tsc -b" }, "devDependencies": { @@ -32,7 +33,8 @@ "tsconfig": "workspace:*", "typescript": "^5.8.3", "vite": "^6.3.5", - "vite-tsconfig-paths": "^4.2.1" + "vite-tsconfig-paths": "^4.2.1", + "vitest": "~2.1.9" }, "dependencies": { "@cap/utils": "workspace:*", diff --git a/packages/ui/src/components/Button.test.tsx b/packages/ui/src/components/Button.test.tsx new file mode 100644 index 00000000000..572a1c63fc9 --- /dev/null +++ b/packages/ui/src/components/Button.test.tsx @@ -0,0 +1,31 @@ +import { renderToStaticMarkup } from "react-dom/server"; +import { describe, expect, it } from "vitest"; +import { Button } from "./Button"; + +describe("Button", () => { + it("renders default button attributes and content", () => { + const markup = renderToStaticMarkup(); + + expect(markup).toContain(" { + const markup = renderToStaticMarkup( + , + ); + + expect(markup).toContain("D"); + expect(markup).toContain("animation:spin"); + expect(markup).toContain("bg-blue-600"); + }); +}); diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts new file mode 100644 index 00000000000..f9c9982b0f0 --- /dev/null +++ b/packages/ui/vitest.config.ts @@ -0,0 +1,10 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [react()], + test: { + environment: "node", + include: ["src/**/*.test.{ts,tsx}"], + }, +}); diff --git a/packages/utils/package.json b/packages/utils/package.json index 82f842d4c57..ee1e804d5b3 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -5,6 +5,7 @@ ".": "./src/index.ts" }, "scripts": { + "test": "vitest run", "typecheck": "tsc -b", "build": "tsdown" }, @@ -16,7 +17,8 @@ "react-dom": "^19.1.1", "react-router-dom": "^6.18.0", "tsconfig": "workspace:*", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "vitest": "~2.1.9" }, "dependencies": { "@aws-sdk/client-s3": "^3.485.0", diff --git a/packages/utils/src/helpers.test.ts b/packages/utils/src/helpers.test.ts new file mode 100644 index 00000000000..e7cb72b6710 --- /dev/null +++ b/packages/utils/src/helpers.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it } from "vitest"; +import { + calculateStrokeDashoffset, + classNames, + getDisplayProgress, + getProgressCircleConfig, + isEmailAllowedByRestriction, + uuidFormat, + uuidParse, +} from "./helpers"; + +describe("helpers", () => { + it("merges Tailwind classes with later conflicting classes winning", () => { + expect(classNames("px-2 text-sm", false, "px-4")).toBe("text-sm px-4"); + }); + + it("round-trips UUID formatting", () => { + const uuid = "123e4567-e89b-12d3-a456-426614174000"; + + expect(uuidFormat(uuidParse(uuid))).toBe(uuid); + }); + + it("calculates progress circle geometry", () => { + const { radius, circumference } = getProgressCircleConfig(); + + expect(radius).toBe(8); + expect(circumference).toBe(2 * Math.PI * 8); + expect(calculateStrokeDashoffset(25, circumference)).toBe( + circumference * 0.75, + ); + }); + + it("prefers defined upload progress over processing progress", () => { + expect(getDisplayProgress(42, 10)).toBe(42); + expect(getDisplayProgress(0, 64)).toBe(0); + expect(getDisplayProgress(undefined, 64)).toBe(64); + }); + + it("matches exact emails and domain restrictions", () => { + expect(isEmailAllowedByRestriction("person@example.com", "")).toBe(true); + expect( + isEmailAllowedByRestriction( + "person@example.com", + "admin@example.com, example.com", + ), + ).toBe(true); + expect(isEmailAllowedByRestriction("person@other.com", "example.com")).toBe( + false, + ); + }); +}); diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/utils/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/web-api-contract-effect/package.json b/packages/web-api-contract-effect/package.json index d2e58173bbd..b9ae97fd89a 100644 --- a/packages/web-api-contract-effect/package.json +++ b/packages/web-api-contract-effect/package.json @@ -4,8 +4,14 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "scripts": { + "test": "vitest run" + }, "dependencies": { "@effect/platform": "^0.92.1", "effect": "^3.18.4" + }, + "devDependencies": { + "vitest": "~2.1.9" } } diff --git a/packages/web-api-contract-effect/src/index.test.ts b/packages/web-api-contract-effect/src/index.test.ts new file mode 100644 index 00000000000..2addabb8913 --- /dev/null +++ b/packages/web-api-contract-effect/src/index.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from "vitest"; +import { Authentication, User } from "./index"; + +describe("web API contract effect exports", () => { + it("constructs immutable user context data", () => { + const user = new User({ + id: "user_1", + email: "user@example.com", + stripeSubscriptionStatus: "active", + thirdPartyStripeSubscriptionId: null, + stripeSubscriptionId: "sub_1", + stripeCustomerId: "cus_1", + }); + + expect(user).toMatchObject({ + id: "user_1", + email: "user@example.com", + stripeSubscriptionStatus: "active", + thirdPartyStripeSubscriptionId: null, + stripeSubscriptionId: "sub_1", + stripeCustomerId: "cus_1", + }); + }); + + it("exposes the authentication context tag", () => { + expect(Authentication.key).toBe("Authentication"); + }); +}); diff --git a/packages/web-api-contract-effect/vitest.config.ts b/packages/web-api-contract-effect/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/web-api-contract-effect/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/web-api-contract/package.json b/packages/web-api-contract/package.json index 9b22385f99e..49d6a4b7d67 100644 --- a/packages/web-api-contract/package.json +++ b/packages/web-api-contract/package.json @@ -4,8 +4,14 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "scripts": { + "test": "vitest run" + }, "dependencies": { "@ts-rest/core": "^3.52.1", "zod": "^3.25.76" + }, + "devDependencies": { + "vitest": "~2.1.9" } } diff --git a/packages/web-api-contract/src/desktop.test.ts b/packages/web-api-contract/src/desktop.test.ts new file mode 100644 index 00000000000..8a5a5e0f128 --- /dev/null +++ b/packages/web-api-contract/src/desktop.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "vitest"; +import { + OrganizationBrandingPatchBody, + OrganizationHexColor, + OrganizationLogoUpdate, +} from "./desktop"; + +describe("desktop contract schemas", () => { + it("accepts valid organization brand colors and rejects malformed hex", () => { + expect(OrganizationHexColor.safeParse("#ABC123").success).toBe(true); + expect(OrganizationHexColor.safeParse("ABC123").success).toBe(false); + expect(OrganizationHexColor.safeParse("#12345").success).toBe(false); + }); + + it("validates logo upload payloads", () => { + expect( + OrganizationLogoUpdate.safeParse({ + action: "upload", + contentType: "image/png", + data: "base64-data", + }).success, + ).toBe(true); + expect( + OrganizationLogoUpdate.safeParse({ + action: "upload", + contentType: "image/svg+xml", + data: "base64-data", + }).success, + ).toBe(false); + }); + + it("parses a full branding patch body", () => { + const result = OrganizationBrandingPatchBody.parse({ + brandColors: { + primary: "#000000", + secondary: null, + accent: "#ffffff", + background: null, + }, + logo: { action: "keep" }, + }); + + expect(result.logo).toEqual({ action: "keep" }); + }); +}); diff --git a/packages/web-api-contract/vitest.config.ts b/packages/web-api-contract/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/web-api-contract/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/web-backend/package.json b/packages/web-backend/package.json index 6d644700853..97a1137ade3 100644 --- a/packages/web-backend/package.json +++ b/packages/web-backend/package.json @@ -8,7 +8,8 @@ "main": "./dist/index.js" }, "scripts": { - "build": "tsdown" + "build": "tsdown", + "test": "vitest run" }, "dependencies": { "@cap/env": "workspace:*", @@ -30,5 +31,8 @@ "effect": "^3.18.4", "next": "15.5.9", "server-only": "^0.0.1" + }, + "devDependencies": { + "vitest": "~2.1.9" } } diff --git a/packages/web-backend/src/Videos/EffectiveVideoRules.test.ts b/packages/web-backend/src/Videos/EffectiveVideoRules.test.ts new file mode 100644 index 00000000000..efb7a46e245 --- /dev/null +++ b/packages/web-backend/src/Videos/EffectiveVideoRules.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, it } from "vitest"; +import { + collectPasswordHashes, + resolveEffectiveVideoRules, +} from "./EffectiveVideoRules"; + +describe("resolveEffectiveVideoRules", () => { + it("lets space settings override video and organization defaults", () => { + const rules = resolveEffectiveVideoRules({ + videoSettings: { disableCaptions: false, disableComments: true }, + organizationSettings: { + disableCaptions: true, + disableComments: false, + disableTranscript: true, + }, + spaces: [ + { + id: "space_1", + name: "Engineering", + settings: { disableCaptions: true }, + }, + ], + }); + + expect(rules.settings).toMatchObject({ + disableCaptions: true, + disableComments: true, + disableTranscript: true, + }); + expect(rules.inheritedSettings.disableCaptions).toEqual([ + { id: "space_1", name: "Engineering" }, + ]); + }); + + it("preserves explicit false video settings over organization true defaults", () => { + const rules = resolveEffectiveVideoRules({ + videoSettings: { disableSummary: false }, + organizationSettings: { disableSummary: true }, + spaces: [], + }); + + expect(rules.settings.disableSummary).toBe(false); + }); + + it("collects inherited password sources", () => { + const rules = resolveEffectiveVideoRules({ + spaces: [ + { id: "space_1", name: "Engineering", hasPassword: true }, + { id: "space_2", name: "Design", password: "hash" }, + { id: "space_3", name: "Open" }, + ], + }); + + expect(rules.hasInheritedPassword).toBe(true); + expect(rules.inheritedPasswordSources).toEqual([ + { id: "space_1", name: "Engineering" }, + { id: "space_2", name: "Design" }, + ]); + }); +}); + +describe("collectPasswordHashes", () => { + it("collects video and space password hashes while skipping empty values", () => { + expect( + collectPasswordHashes({ + videoPassword: "video_hash", + spacePasswords: [ + { password: "space_hash" }, + { password: null }, + { password: "" }, + {}, + ], + }), + ).toEqual(["video_hash", "space_hash"]); + }); + + it("handles absent video passwords", () => { + expect( + collectPasswordHashes({ + videoPassword: null, + spacePasswords: [{ password: "space_hash" }], + }), + ).toEqual(["space_hash"]); + }); +}); diff --git a/packages/web-backend/vitest.config.ts b/packages/web-backend/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/web-backend/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index e96e70bc883..d6e6136d59b 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -9,7 +9,8 @@ }, "scripts": { "build": "tsdown", - "generate-openapi": "node scripts/generate-openapi.ts" + "generate-openapi": "node scripts/generate-openapi.ts", + "test": "vitest run" }, "dependencies": { "@effect/platform": "^0.92.1", @@ -18,6 +19,7 @@ "effect": "^3.18.4" }, "devDependencies": { - "@effect/platform-node": "^0.98.3" + "@effect/platform-node": "^0.98.3", + "vitest": "~2.1.9" } } diff --git a/packages/web-domain/src/utils.test.ts b/packages/web-domain/src/utils.test.ts new file mode 100644 index 00000000000..c9f989b9274 --- /dev/null +++ b/packages/web-domain/src/utils.test.ts @@ -0,0 +1,23 @@ +import { Option, Schema } from "effect"; +import { describe, expect, it } from "vitest"; +import { optional } from "./utils"; + +describe("optional", () => { + it("decodes present values as Some", () => { + const decoded = Schema.decodeUnknownSync( + Schema.Struct({ value: optional(Schema.String) }), + )({ value: "cap" }); + + expect(Option.getOrUndefined(decoded.value)).toBe("cap"); + }); + + it("decodes null values as None and leaves absent keys omitted", () => { + const schema = Schema.Struct({ value: optional(Schema.String) }); + + const nullDecoded = Schema.decodeUnknownSync(schema)({ value: null }); + const missingDecoded = Schema.decodeUnknownSync(schema)({}); + + expect(Option.isNone(nullDecoded.value)).toBe(true); + expect("value" in missingDecoded).toBe(false); + }); +}); diff --git a/packages/web-domain/vitest.config.ts b/packages/web-domain/vitest.config.ts new file mode 100644 index 00000000000..cfbd4c3fcac --- /dev/null +++ b/packages/web-domain/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["src/**/*.test.ts"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2810356dc57..f97dffcd8e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -205,7 +205,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -224,7 +224,7 @@ importers: version: 4.3.0 '@tailwindcss/typography': specifier: ^0.5.9 - version: 0.5.16(tailwindcss@4.3.0) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3))) '@tauri-apps/cli': specifier: '>=2.1.0' version: 2.11.0 @@ -384,6 +384,9 @@ importers: vite-plugin-solid: specifier: ^2.10.2 version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1)) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) apps/web: dependencies: @@ -899,6 +902,9 @@ importers: dotenv-cli: specifier: ^10.0.0 version: 10.0.0 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) infra: dependencies: @@ -970,6 +976,9 @@ importers: eslint-utils: specifier: ^3.0.0 version: 3.0.0(eslint@8.57.1) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@20.17.43)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/database: dependencies: @@ -1073,6 +1082,9 @@ importers: typescript: specifier: ^5.8.3 version: 5.8.3 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@20.17.43)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/env: dependencies: @@ -1086,6 +1098,9 @@ importers: '@types/node': specifier: ^22.15.14 version: 22.15.14 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.14)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/local-docker: {} @@ -1107,6 +1122,9 @@ importers: typescript: specifier: ^5.7.3 version: 5.8.3 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/sdk-recorder: dependencies: @@ -1126,8 +1144,15 @@ importers: typescript: specifier: ^5.7.3 version: 5.8.3 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) - packages/tsconfig: {} + packages/tsconfig: + devDependencies: + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/ui: dependencies: @@ -1246,6 +1271,9 @@ importers: vite-tsconfig-paths: specifier: ^4.2.1 version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1)) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@20.17.43)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/ui-solid: dependencies: @@ -1271,6 +1299,9 @@ importers: '@tailwindcss/typography': specifier: ^0.5.9 version: 0.5.16(tailwindcss@4.3.0) + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.14) @@ -1298,6 +1329,15 @@ importers: unplugin-icons: specifier: ^0.19.2 version: 0.19.3 + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.10.2 + version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1)) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/utils: dependencies: @@ -1338,6 +1378,9 @@ importers: typescript: specifier: ^5.8.3 version: 5.8.3 + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/web-api-contract: dependencies: @@ -1347,6 +1390,10 @@ importers: zod: specifier: ^3.25.76 version: 3.25.76 + devDependencies: + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/web-api-contract-effect: dependencies: @@ -1356,6 +1403,10 @@ importers: effect: specifier: ^3.18.4 version: 3.18.4 + devDependencies: + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/web-backend: dependencies: @@ -1416,6 +1467,10 @@ importers: server-only: specifier: ^0.0.1 version: 0.0.1 + devDependencies: + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages/web-domain: dependencies: @@ -1435,6 +1490,9 @@ importers: '@effect/platform-node': specifier: ^0.98.3 version: 0.98.3(@effect/cluster@0.50.4(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/workflow@0.11.3(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4))(effect@3.18.4))(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4) + vitest: + specifier: ~2.1.9 + version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0) packages: @@ -4907,8 +4965,8 @@ packages: resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} - '@oxc-project/types@0.130.0': - resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@oxc-project/types@0.132.0': + resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} @@ -5731,95 +5789,111 @@ packages: '@react-email/body@0.0.11': resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/button@0.1.0': resolution: {integrity: sha512-fg4LtgTu5zXxaRSly9cuv6sHVF/hi1lElbRaIA8EPx5coWOBhCto6rCPfawcXpaN2oER7rNHUrcNBkI+lz5F9A==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-block@0.1.0': resolution: {integrity: sha512-jSpHFsgqnQXxDIssE4gvmdtFncaFQz5D6e22BnVjcCPk/udK+0A9jRwGFEG8JD2si9ZXBmU4WsuqQEczuZn4ww==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-inline@0.0.5': resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/column@0.0.13': resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/components@0.1.0': resolution: {integrity: sha512-Rx0eZk0XuzLKXC5NoMm8xuH72ALVsPYNb/BvcdCJx4EZAoVpQISb4sCqpo9blVYVIazNr4MqWroqFb3ZNrCLMQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/container@0.0.15': resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/font@0.0.9': resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/head@0.0.12': resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/heading@0.0.15': resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/hr@0.0.11': resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/html@0.0.11': resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/img@0.0.11': resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/link@0.0.12': resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/markdown@0.0.15': resolution: {integrity: sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/preview@0.0.13': resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5833,24 +5907,28 @@ packages: '@react-email/row@0.0.12': resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/section@0.0.16': resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/tailwind@1.0.5': resolution: {integrity: sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/text@0.1.5': resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5895,8 +5973,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.1': - resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + '@rolldown/binding-android-arm64@1.0.2': + resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -5907,8 +5985,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.1': - resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + '@rolldown/binding-darwin-arm64@1.0.2': + resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -5919,8 +5997,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.1': - resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + '@rolldown/binding-darwin-x64@1.0.2': + resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -5931,8 +6009,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.1': - resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + '@rolldown/binding-freebsd-x64@1.0.2': + resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -5943,8 +6021,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': - resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': + resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -5955,8 +6033,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.1': - resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + '@rolldown/binding-linux-arm64-gnu@1.0.2': + resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5967,20 +6045,20 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.1': - resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + '@rolldown/binding-linux-arm64-musl@1.0.2': + resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-ppc64-gnu@1.0.1': - resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.2': + resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@rolldown/binding-linux-s390x-gnu@1.0.1': - resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.2': + resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -5991,8 +6069,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.1': - resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + '@rolldown/binding-linux-x64-gnu@1.0.2': + resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -6003,8 +6081,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.1': - resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + '@rolldown/binding-linux-x64-musl@1.0.2': + resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -6015,8 +6093,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.1': - resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + '@rolldown/binding-openharmony-arm64@1.0.2': + resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -6026,8 +6104,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.1': - resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + '@rolldown/binding-wasm32-wasi@1.0.2': + resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] @@ -6037,8 +6115,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.1': - resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + '@rolldown/binding-win32-arm64-msvc@1.0.2': + resolution: {integrity: sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -6055,8 +6133,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.1': - resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + '@rolldown/binding-win32-x64-msvc@1.0.2': + resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -7191,10 +7269,10 @@ packages: react-dom: optional: true - '@storybook/builder-vite@10.5.0-alpha.0': - resolution: {integrity: sha512-4iCteRr03HHLbeD3osey14D8ZQS8hu5OkamlmARR4JLJUF/o6hjxckZ9xD+Ci7jjeGrlGLom71Y+TneN1iLx4g==} + '@storybook/builder-vite@10.5.0-alpha.2': + resolution: {integrity: sha512-yzjn/TcKNSOXvdn5S0A5RrkSCtsYa0Ath3aL0EVfgkWbPuwHwOD/u3h91CVWRpjGHAOctjhk6cX1nJJQwDx1kQ==} peerDependencies: - storybook: ^10.5.0-alpha.0 + storybook: ^10.5.0-alpha.2 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 '@storybook/core@8.6.12': @@ -7205,12 +7283,12 @@ packages: prettier: optional: true - '@storybook/csf-plugin@10.5.0-alpha.0': - resolution: {integrity: sha512-XO6PgW7aldty1BsvwL7HFljELSJK4noZsGqgt+nHXvq46mXyl2OXJUpO+z06DoN8KabQGup//y49aYh4uBm/uw==} + '@storybook/csf-plugin@10.5.0-alpha.2': + resolution: {integrity: sha512-U2eLlrx3PrzwSbUSa8N1rScUqo+QD3T0yATfneWjiKfpQ5gL1O5dK2U/AbfqIdXzLEgco7NDz8iGx45CtFJlmA==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.5.0-alpha.0 + storybook: ^10.5.0-alpha.2 vite: '*' webpack: '*' peerDependenciesMeta: @@ -9160,6 +9238,7 @@ packages: aws-sdk@2.1692.0: resolution: {integrity: sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==} engines: {node: '>= 10.0.0'} + deprecated: The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} @@ -14382,8 +14461,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.1: - resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + rolldown@1.0.2: + resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -20496,7 +20575,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.37.0': {} - '@oxc-project/types@0.130.0': {} + '@oxc-project/types@0.132.0': {} '@oxc-project/types@0.94.0': {} @@ -21681,67 +21760,67 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-android-arm64@1.0.1': + '@rolldown/binding-android-arm64@1.0.2': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-arm64@1.0.1': + '@rolldown/binding-darwin-arm64@1.0.2': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-x64@1.0.1': + '@rolldown/binding-darwin-x64@1.0.2': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-freebsd-x64@1.0.1': + '@rolldown/binding-freebsd-x64@1.0.2': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.1': + '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.1': + '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.1': + '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.1': + '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.1': + '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-musl@1.0.1': + '@rolldown/binding-linux-x64-musl@1.0.2': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-openharmony-arm64@1.0.1': + '@rolldown/binding-openharmony-arm64@1.0.2': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': @@ -21749,7 +21828,7 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.6 optional: true - '@rolldown/binding-wasm32-wasi@1.0.1': + '@rolldown/binding-wasm32-wasi@1.0.2': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 @@ -21759,7 +21838,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.1': + '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': @@ -21768,7 +21847,7 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.1': + '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true '@rolldown/pluginutils@1.0.0': {} @@ -23081,11 +23160,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -23096,7 +23175,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -23226,9 +23305,9 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/builder-vite@10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/builder-vite@10.5.0-alpha.2(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: - '@storybook/csf-plugin': 10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/csf-plugin': 10.5.0-alpha.2(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) storybook: 8.6.12(prettier@3.7.4) ts-dedent: 2.2.0 vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1) @@ -23258,7 +23337,7 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/csf-plugin@10.5.0-alpha.2(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: storybook: 8.6.12(prettier@3.7.4) unplugin: 2.3.11 @@ -24627,7 +24706,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -24638,18 +24717,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -24719,6 +24798,22 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0) + + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0) + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@22.15.17)(lightningcss@1.32.0)(terser@5.44.0))': dependencies: '@vitest/spy': 2.1.9 @@ -25843,7 +25938,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.4.1 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 type-fest: 4.41.0 @@ -27354,7 +27449,7 @@ snapshots: eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.30.1(jiti@2.6.1)) @@ -27411,7 +27506,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -27466,7 +27561,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -30540,7 +30635,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.1)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.2)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -30594,7 +30689,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rolldown@1.0.1)(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rolldown@1.0.2)(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -30991,7 +31086,7 @@ snapshots: ora@8.2.0: dependencies: - chalk: 5.4.1 + chalk: 5.6.2 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -32054,7 +32149,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.16.11(rolldown@1.0.1)(typescript@5.8.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.2)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -32065,7 +32160,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.11.0 magic-string: 0.30.19 - rolldown: 1.0.1 + rolldown: 1.0.2 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32093,26 +32188,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 - rolldown@1.0.1: + rolldown@1.0.2: dependencies: - '@oxc-project/types': 0.130.0 + '@oxc-project/types': 0.132.0 '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.1 - '@rolldown/binding-darwin-arm64': 1.0.1 - '@rolldown/binding-darwin-x64': 1.0.1 - '@rolldown/binding-freebsd-x64': 1.0.1 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 - '@rolldown/binding-linux-arm64-gnu': 1.0.1 - '@rolldown/binding-linux-arm64-musl': 1.0.1 - '@rolldown/binding-linux-ppc64-gnu': 1.0.1 - '@rolldown/binding-linux-s390x-gnu': 1.0.1 - '@rolldown/binding-linux-x64-gnu': 1.0.1 - '@rolldown/binding-linux-x64-musl': 1.0.1 - '@rolldown/binding-openharmony-arm64': 1.0.1 - '@rolldown/binding-wasm32-wasi': 1.0.1 - '@rolldown/binding-win32-arm64-msvc': 1.0.1 - '@rolldown/binding-win32-x64-msvc': 1.0.1 + '@rolldown/binding-android-arm64': 1.0.2 + '@rolldown/binding-darwin-arm64': 1.0.2 + '@rolldown/binding-darwin-x64': 1.0.2 + '@rolldown/binding-freebsd-x64': 1.0.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.2 + '@rolldown/binding-linux-arm64-gnu': 1.0.2 + '@rolldown/binding-linux-arm64-musl': 1.0.2 + '@rolldown/binding-linux-ppc64-gnu': 1.0.2 + '@rolldown/binding-linux-s390x-gnu': 1.0.2 + '@rolldown/binding-linux-x64-gnu': 1.0.2 + '@rolldown/binding-linux-x64-musl': 1.0.2 + '@rolldown/binding-openharmony-arm64': 1.0.2 + '@rolldown/binding-wasm32-wasi': 1.0.2 + '@rolldown/binding-win32-arm64-msvc': 1.0.2 + '@rolldown/binding-win32-x64-msvc': 1.0.2 rollup-plugin-inject@3.0.2: dependencies: @@ -32124,14 +32219,14 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rolldown@1.0.1)(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rolldown@1.0.2)(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.1 + rolldown: 1.0.2 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -32759,7 +32854,7 @@ snapshots: storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): dependencies: - '@storybook/builder-vite': 10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/builder-vite': 10.5.0-alpha.2(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) magic-string: 0.30.17 solid-js: 1.9.6 @@ -33378,8 +33473,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.1 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.1)(typescript@5.8.3) + rolldown: 1.0.2 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.2)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -34051,7 +34146,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.15.2)(rolldown@1.0.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -34073,7 +34168,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.1)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.2)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -34129,6 +34224,42 @@ snapshots: - xml2js - yaml + vite-node@2.1.9(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@2.1.9(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@2.1.9(@types/node@22.15.17)(lightningcss@1.32.0)(terser@5.44.0): dependencies: cac: 6.7.14 @@ -34220,6 +34351,28 @@ snapshots: - supports-color - typescript + vite@5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.14 + rollup: 4.40.2 + optionalDependencies: + '@types/node': 20.17.43 + fsevents: 2.3.3 + lightningcss: 1.32.0 + terser: 5.44.0 + + vite@5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.14 + rollup: 4.40.2 + optionalDependencies: + '@types/node': 22.15.14 + fsevents: 2.3.3 + lightningcss: 1.32.0 + terser: 5.44.0 + vite@5.4.19(@types/node@22.15.17)(lightningcss@1.32.0)(terser@5.44.0): dependencies: esbuild: 0.21.5 @@ -34280,6 +34433,78 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(yaml@2.8.1) + vitest@2.1.9(@types/node@20.17.43)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0) + vite-node: 2.1.9(@types/node@20.17.43)(lightningcss@1.32.0)(terser@5.44.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.43 + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@2.1.9(@types/node@22.15.14)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0) + vite-node: 2.1.9(@types/node@22.15.14)(lightningcss@1.32.0)(terser@5.44.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.15.14 + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.44.0): dependencies: '@vitest/expect': 2.1.9