// 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";

// @ts-expect-error process is a nodejs global
const host = process.env.TAURI_DEV_HOST;

// https://vite.dev/config/
export default defineConfig(async () => ({
  plugins: [sveltekit(), tailwindcss()],
  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,
  },
}));
