diff --git a/.gitignore b/.gitignore index aa17b3e4f04..4b6e857425f 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ build.log tcr-dry.log .agent-setup/ .agent-recordings/ +.vitest/ .vitest-profile/ .pi-subagents/ sbom-source.cdx.json diff --git a/scripts/gitignore.test.mjs b/scripts/gitignore.test.mjs new file mode 100644 index 00000000000..84aa06231f3 --- /dev/null +++ b/scripts/gitignore.test.mjs @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { test } from 'node:test'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = fileURLToPath(new URL('..', import.meta.url)); + +function ignoreRule(path) { + const result = spawnSync('git', ['check-ignore', '-v', '--no-index', '--', path], { + cwd: repoRoot, + encoding: 'utf8', + }); + assert.ifError(result.error); + assert.equal(result.status, 0, `${path} must be ignored by Git`); + const [rule, ignoredPath] = result.stdout.trim().split('\t'); + assert.equal(ignoredPath, path); + return rule; +} + +test('ignores existing Vitest profile output', () => { + assert.match( + ignoreRule('packages/cli/.vitest-profile/json/output.json'), + /^\.gitignore:\d+:\.vitest-profile\/$/, + ); +}); + +// DEVP-1240: Vitest 5 writes JSON reports into a package-local .vitest directory. +test('ignores Vitest JSON reports in workspace packages', () => { + for (const path of [ + 'packages/cli/.vitest/json/output.json', + 'packages/frontend/editor-ui/.vitest/json/output.json', + ]) { + assert.match(ignoreRule(path), /^\.gitignore:\d+:\.vitest\/$/); + } +});