import { promises as fs } from "node:fs"; import path from "node:path"; import { collectTypeScriptFilesFromRoots, resolveRepoRoot, resolveSourceRoots, } from "./ts-guard-utils.mjs"; export async function runCallsiteGuard(params) { const repoRoot = resolveRepoRoot(params.importMetaUrl); const sourceRoots = resolveSourceRoots(repoRoot, params.sourceRoots); const files = await collectTypeScriptFilesFromRoots(sourceRoots, { extraTestSuffixes: params.extraTestSuffixes, }); const violations = []; for (const filePath of files) { const relPath = path.relative(repoRoot, filePath).replaceAll(path.sep, "/"); if (params.skipRelativePath?.(relPath)) { continue; } const content = await fs.readFile(filePath, "utf8"); for (const line of params.findCallLines(content, filePath)) { const callsite = `${relPath}:${line}`; if (params.allowCallsite?.(callsite)) { continue; } violations.push(callsite); } } if (violations.length === 0) { return; } console.error(params.header); const output = params.sortViolations === false ? violations : violations.toSorted(); for (const violation of output) { console.error(`- ${violation}`); } if (params.footer) { console.error(params.footer); } process.exit(1); }