// Using vitest/config rather than vite/config so one config surface drives // `vite dev` / `vite build` AND `vitest run`. Vitest's defineConfig is a // superset of Vite's — production builds ignore the `test` key. import { defineConfig } from "vitest/config"; import { sveltekit } from "@sveltejs/kit/vite"; import tailwindcss from "@tailwindcss/vite"; import { visualizer } from "rollup-plugin-visualizer"; // @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // @ts-expect-error process is a nodejs global const analyze = process.env.ANALYZE === "1"; // https://vite.dev/config/ export default defineConfig(async () => ({ plugins: [ sveltekit(), tailwindcss(), ...(analyze ? [ visualizer({ filename: "reports/bundle-stats.html", template: "treemap", gzipSize: true, brotliSize: true, open: false, }), ] : []), ], clearScreen: false, server: { port: 1420, strictPort: true, host: host || false, hmr: host ? { protocol: "ws", host, port: 1421, } : undefined, watch: { ignored: ["**/src-tauri/**"], }, }, test: { // jsdom gives storage-shim tests a real localStorage / DOMException / // window surface rather than hand-rolled mocks. Tests can override // per-file with `// @vitest-environment node` if they need to. environment: "jsdom", // Discover *.test.{ts,js} colocated next to source. Mirrors Rust's // #[cfg(test)] sibling convention; no separate tests/ tree. include: ["src/**/*.{test,spec}.{ts,js}"], // Frontend tests must never reach into the Tauri backend; that surface // is owned by `cargo test` in src-tauri/ and crates/. exclude: ["src-tauri/**", "node_modules/**", "build/**", ".svelte-kit/**"], // Restore a clean global state between tests — vitest's restoreMocks // unwinds vi.spyOn / vi.fn, clearMocks resets call history, and // unstubAllGlobals undoes vi.stubGlobal. Prevents accidental leakage // when tests share modules with module-level state. restoreMocks: true, clearMocks: true, unstubAllGlobals: true, }, }));