import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    include: ['test/**/*.test.ts'],
    // `npm test` runs two passes (see package.json): the unit/integration bulk in
    // parallel, then test/integration/server.test.ts on its own. That file boots a
    // real server and a real shell and asserts on prompt output within seconds —
    // budgets it cannot meet while ~8 workers saturate the machine. It passed
    // alone and flaked in the full run, which is a scheduling problem, not a
    // timeout value to keep raising. `vitest run` still runs everything at once.
    exclude: ['node_modules/**', 'dist/**'],
    environment: 'node',
    // jsdom 29's localStorage methods are undefined under this config; a shared
    // in-memory Web Storage polyfill fixes the frontend (@vitest-environment
    // jsdom) tests that call localStorage.clear()/setItem(). No-op in node env.
    setupFiles: ['test/setup/local-storage.ts'],
    // Scaffold has no tests yet; don't fail the script until modules add theirs.
    passWithNoTests: true,
    // Coverage target is the global 80% rule; enforced with `--coverage`.
    // Scope: all backend src/** (the review's core), plus the frontend modules
    // that carry real logic and have unit tests. The remaining public/*.ts are
    // thin DOM-wiring / entry-point glue (main.ts boots the app; dashboard/qr/
    // share/shortcuts/search/keybar/settings/history just build + wire DOM) with
    // no branch logic worth unit-testing in this fix-pass — excluded so the
    // threshold measures tested surface, not untestable wiring. (Browser-driven
    // E2E, not unit tests, is the right tool for those.)
    coverage: {
      provider: 'v8',
      include: [
        'src/**/*.ts',
        'public/terminal-session.ts',
        'public/link-paths.ts',
        'public/queue.ts',
        'public/tabs.ts',
        'public/fanout.ts',
        'public/grid-layout.ts',
        'public/grid-presets.ts',
        'public/cell-monitor.ts',
        'public/preview-grid.ts',
        'public/git-log.ts',
        'public/digest.ts',
        'public/title-util.ts',
        'public/voice-commands.ts',
        'public/voice-confirm.ts',
        // Desktop (Electron) shell: only the PURE logic modules are measured.
        // The Electron glue (main/window/tray/menu/notifications/preload/
        // embedded-server/settings-store) is thin, side-effectful wiring around
        // the electron/native/dist APIs — untestable as a unit and excluded on
        // the same principle as the thin DOM-wiring public/*.ts above.
        'desktop/src/port.ts',
        'desktop/src/shell.ts',
        'desktop/src/server-config.ts',
        'desktop/src/deep-link.ts',
        'desktop/src/notify-policy.ts',
        'desktop/src/notifications.ts',
        'desktop/src/live-poll.ts',
        'desktop/src/prefs.ts',
        'desktop/src/settings-store.ts',
      ],
      thresholds: {
        lines: 80,
        functions: 80,
        branches: 80,
        statements: 80,
      },
    },
  },
})
