Files
OmniRoute/scripts/quality/run-eslint-json.mjs
2026-08-29 08:10:21 -03:00

68 lines
2.1 KiB
JavaScript

#!/usr/bin/env node
/**
* Single ESLint pass that always writes a JSON report for quality:collect.
*
* Existence reason: one inventory of net-new issues (vs suppressions) should
* feed both the blocking lint gate and the eslintWarnings ratchet — not two
* cold full-tree walks on different runners.
*
* Exit code: ESLint's own (0 = clean, 1 = errors). Warnings do not fail by
* default (same as `npm run lint`); pass --max-warnings=0 for lint-guard.
*/
import { spawnSync } from "node:child_process";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const outFile = path.resolve(
root,
process.env.ESLINT_RESULTS_JSON || path.join(".artifacts", "eslint-results.json")
);
fs.mkdirSync(path.dirname(outFile), { recursive: true });
const extra = process.argv.slice(2);
const eslintBin = path.join(
root,
"node_modules",
".bin",
process.platform === "win32" ? "eslint.cmd" : "eslint"
);
const args = [
".",
"--cache",
"--cache-location",
".eslintcache",
"--suppressions-location",
"config/quality/eslint-suppressions.json",
// An "unpruned" suppression means a previously-frozen violation was legitimately
// fixed — release-time housekeeping (same bucket as ratchet drift), never a
// contributor-blocking defect. Without this flag ESLint 9.x exits 2 for that
// reason alone, which would fail this script's own JSON pass on a clean tree
// (same failure class already fixed in validate-release-green.mjs — #7837 / #11600).
"--pass-on-unpruned-suppressions",
"--format",
"json",
"--output-file",
outFile,
...extra,
];
const result = spawnSync(eslintBin, args, {
cwd: root,
encoding: "utf8",
shell: process.platform === "win32",
maxBuffer: 256 * 1024 * 1024,
});
if (result.stdout) process.stdout.write(result.stdout);
if (result.stderr) process.stderr.write(result.stderr);
if (!fs.existsSync(outFile)) {
// ESLint may crash before writing; leave an empty array so collectors don't explode.
fs.writeFileSync(outFile, "[]\n");
}
process.exit(result.status === null ? 1 : result.status);