tdd-guard
Version:
TDD Guard enforces Test-Driven Development principles using Claude Code hooks
61 lines (60 loc) • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ESLint = void 0;
const child_process_1 = require("child_process");
const util_1 = require("util");
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
class ESLint {
async lint(filePaths, configPath) {
const timestamp = new Date().toISOString();
const args = buildArgs(filePaths, configPath);
try {
await execFileAsync('npx', args);
return createLintData(timestamp, filePaths, []);
}
catch (error) {
if (!isExecError(error))
throw error;
const results = parseResults(error.stdout);
return createLintData(timestamp, filePaths, results);
}
}
}
exports.ESLint = ESLint;
// Helper functions
const buildArgs = (files, configPath) => {
const args = ['eslint', ...files, '--format', 'json'];
if (configPath) {
args.push('-c', configPath);
}
return args;
};
const isExecError = (error) => error !== null && typeof error === 'object' && 'stdout' in error;
const parseResults = (stdout) => {
try {
return JSON.parse(stdout ?? '[]');
}
catch {
return [];
}
};
const createLintData = (timestamp, files, results) => {
const issues = extractIssues(results);
return {
timestamp,
files,
issues,
errorCount: countBySeverity(issues, 'error'),
warningCount: countBySeverity(issues, 'warning'),
};
};
const extractIssues = (results) => results.flatMap((file) => (file.messages ?? []).map(toIssue(file.filePath)));
const toIssue = (filePath) => (msg) => ({
file: filePath,
line: msg.line ?? 0,
column: msg.column ?? 0,
severity: (msg.severity === 2 ? 'error' : 'warning'),
message: msg.message,
rule: msg.ruleId,
});
const countBySeverity = (issues, severity) => issues.filter((i) => i.severity === severity).length;