singularity-forge/vitest.config.ts
Mikael Hugo 59aaf3dcf3 chore: migrate test suite from node:test to vitest
Add vitest.config.ts with forks pool, v8 coverage, and package aliases.
Run migrate-to-vitest.mjs to replace `from "node:test"` imports with
`from 'vitest'` across 749 test files, converting mock.fn→vi.fn and
mock.timers→vi fake timers where needed.

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-02 04:37:33 +02:00

114 lines
4.2 KiB
TypeScript

/**
* Vitest configuration for singularity-forge.
*
* Runs tests directly from TypeScript source — no esbuild pre-compilation needed.
* Vitest handles TypeScript transformation via esbuild (bundled, not separate process).
*
* Coverage uses @vitest/coverage-v8 (same engine as c8, but integrated).
*
* Usage:
* npx vitest run # run all tests once
* npx vitest # watch mode
* npx vitest run --changed # only tests affected by recent changes
*/
import { defineConfig } from "vitest/config";
import { fileURLToPath } from "node:url";
import { dirname, resolve } from "node:path";
const __dirname = dirname(fileURLToPath(import.meta.url));
export default defineConfig({
test: {
// ── File patterns ─────────────────────────────────────────────────────────
include: [
"src/tests/**/*.test.ts",
"src/tests/**/*.test.mjs",
"src/resources/extensions/sf/tests/**/*.test.ts",
"src/resources/extensions/sf/tests/**/*.test.mjs",
"src/resources/extensions/shared/tests/**/*.test.ts",
"src/resources/extensions/claude-code-cli/tests/**/*.test.ts",
"src/resources/extensions/github-sync/tests/**/*.test.ts",
"src/resources/extensions/universal-config/tests/**/*.test.ts",
"src/resources/extensions/voice/tests/**/*.test.ts",
"src/resources/extensions/mcp-client/tests/**/*.test.ts",
"src/resources/extensions/async-jobs/*.test.ts",
"src/resources/extensions/browser-tools/tests/*.test.mjs",
"packages/pi-coding-agent/src/**/*.test.ts",
],
// ── Timeouts ──────────────────────────────────────────────────────────────
testTimeout: 30_000,
hookTimeout: 30_000,
// ── Pool: forks = one Node process per test file (best for Node.js tests) ─
pool: "forks",
poolOptions: {
forks: {
// Single worker in CI; parallel in dev for speed
singleFork: process.env.CI === "true",
},
},
// ── Coverage ──────────────────────────────────────────────────────────────
coverage: {
provider: "v8",
reporter: ["text", "lcov"],
exclude: [
"src/resources/extensions/sf/tests/**",
"src/tests/**",
"scripts/**",
"rust-engine/**",
"node_modules/**",
"dist/**",
"dist-test/**",
"web/**",
],
thresholds: {
statements: 40,
lines: 40,
branches: 20,
functions: 20,
},
},
// ── TypeScript / module resolution ─────────────────────────────────────────
// Vitest uses esbuild for TS transform (fast, bundled). We still set up
// NodeNext module resolution and path aliases to match the project's tsconfig.
resolve: {
alias: {
"@singularity-forge/pi-coding-agent": resolve(
__dirname,
"packages/pi-coding-agent/src/index.ts",
),
"@singularity-forge/pi-ai": resolve(
__dirname,
"packages/pi-ai/src/index.ts",
),
"@singularity-forge/pi-ai/oauth": resolve(
__dirname,
"packages/pi-ai/src/utils/oauth/index.ts",
),
"@singularity-forge/pi-agent-core": resolve(
__dirname,
"packages/pi-agent-core/src/index.ts",
),
"@singularity-forge/pi-tui": resolve(
__dirname,
"packages/pi-tui/src/index.ts",
),
"@singularity-forge/native": resolve(
__dirname,
"packages/native/src/index.ts",
),
"@singularity-forge/mcp-server": resolve(
__dirname,
"packages/mcp-server/src/index.ts",
),
"@singularity-forge/rpc-client": resolve(
__dirname,
"packages/rpc-client/src/index.ts",
),
},
},
},
});