singularity-forge/scripts/fix-vitest-api.mjs
2026-05-05 14:46:18 +02:00

94 lines
3.1 KiB
JavaScript

#!/usr/bin/env node
/**
* Fix remaining node:test API calls that the initial migration missed.
*
* 1. t.after(() => ...) → afterEach(() => ...) (add afterEach to imports if needed)
* 2. t.before(() => ...) → beforeEach(() => ...) (add beforeEach to imports if needed)
* 3. await t.test("name", fn) → test("name", fn) (flatten subtests)
* 4. t.skip("msg") → return ctx.skip("msg") — only in describe blocks; most are top-level test() calls
* where t.skip() should become a return or conditional.
*/
import { execSync } from "node:child_process";
import { readFileSync, writeFileSync } from "node:fs";
const files = execSync(
'grep -rl "t\\.after\\b\\|t\\.before\\b\\|t\\.test(\\|t\\.skip(" src/tests/ src/resources/extensions/ --include="*.test.ts" --include="*.test.mjs"',
{ encoding: "utf-8", maxBuffer: 50 * 1024 * 1024 },
)
.trim()
.split("\n")
.filter(Boolean);
console.log(`Fixing ${files.length} files`);
let updated = 0;
for (const file of files) {
let content = readFileSync(file, "utf-8");
let changed = false;
// 1. t.after(() => ...) → afterEach(() => ...)
if (content.includes("t.after(")) {
content = content.replace(/\bt\.after\(/g, "afterEach(");
changed = true;
}
// 2. t.before(() => ...) → beforeEach(() => ...)
if (content.includes("t.before(")) {
content = content.replace(/\bt\.before\(/g, "beforeEach(");
changed = true;
}
// 3. await t.test("name", fn) → test("name", fn)
// and t.test("name", fn) without await
if (content.includes("t.test(")) {
content = content.replace(/await\s+t\.test\(/g, "test(");
content = content.replace(/\bt\.test\(/g, "test(");
changed = true;
}
// 4. t.skip("msg") → remove or comment — these are rare (4 files)
// In most cases t.skip is inside a test callback and means "skip this test".
// Vitest uses test.skip() at declaration time, not runtime.
// Best effort: replace with return + comment
if (content.includes("t.skip(")) {
content = content.replace(/\bt\.skip\(([^)]*)\)/g, "return; // skip: $1");
changed = true;
}
// 5. Ensure afterEach/beforeEach are imported from vitest if used
if (changed) {
const needsAfterEach = content.includes("afterEach(");
const needsBeforeEach = content.includes("beforeEach(");
if (needsAfterEach || needsBeforeEach) {
// Find the vitest import line and extend it
const vitestImportMatch = content.match(
/import\s+\{([^}]+)\}\s+from\s+['"]vitest['"];?/,
);
if (vitestImportMatch) {
const existing = vitestImportMatch[1].split(",").map((s) => s.trim());
const additions = [];
if (needsAfterEach && !existing.includes("afterEach"))
additions.push("afterEach");
if (needsBeforeEach && !existing.includes("beforeEach"))
additions.push("beforeEach");
if (additions.length > 0) {
const all = [...existing, ...additions];
const newImport = `import { ${all.join(", ")} } from 'vitest';`;
content = content.replace(vitestImportMatch[0], newImport);
}
}
}
}
if (changed) {
writeFileSync(file, content, "utf-8");
updated++;
}
}
console.log(`Updated ${updated} files`);