Files
siftlode/scripts/fe_complexity.mjs
T
peter 7e681e112e test(gates)!: the size/complexity ratchet leaves the gate; audit_metrics reports it
sourceSize.contract.test.ts, its test kit and backend/tests/test_source_size.py
held 13 FE / 9 BE file ceilings and 64 FE / 32 BE function ceilings. No real
hit (E34 S2/S4): its history is its own birth (751e1ae5), two rounds of
fixes to its own logic (e432dc27, d1df76e8), the snapshot move (182ec311)
and ceiling edits inside feature fixes (5806adda, df4a79a1, and the S2/S3
cuts here). It caught no defect, went red 8 times on its own limits and drew
5 review findings about itself. The numbers stay visible: audit_metrics
reports file size and complexity, and an epic compares before and after.
docs/gates.md: the two size rows go; the C901 row says where it is read now.
2026-10-05 00:19:38 +02:00

46 lines
1.7 KiB
JavaScript

// Frontend functions over a cyclomatic-complexity limit, counted for scripts/audit_metrics.py: a bare
// `complexity` rule run (no type info, no other rules), so it takes seconds, not a full lint. Prints
// one JSON object: {"limit": N, "over": count, "max": highest}. Shipped code only — tests and test
// kits are lists of cases, not logic anyone has to change.
//
// node scripts/fe_complexity.mjs [limit] (default 20, the frontend's line since E32)
import { readdirSync, readFileSync } from "node:fs";
import { createRequire } from "node:module";
import { join } from "node:path";
import { fileURLToPath } from "node:url";
const SRC = fileURLToPath(new URL("../frontend/src/", import.meta.url));
const require = createRequire(new URL("../frontend/package.json", import.meta.url));
const { Linter } = require("eslint");
const tseslint = require("typescript-eslint");
const limit = Number(process.argv[2] ?? 20);
const files = readdirSync(SRC, { recursive: true })
.map((p) => p.split("\\").join("/"))
.filter(
(p) => /\.(ts|tsx)$/.test(p) && !/\.(test|testkit)\.tsx?$/.test(p) && !p.endsWith(".d.ts"),
);
const linter = new Linter();
const config = [
{
files: ["**/*.{ts,tsx}"],
languageOptions: {
parser: tseslint.parser,
parserOptions: { ecmaFeatures: { jsx: true } },
},
rules: { complexity: ["error", limit] },
},
];
let over = 0;
let max = 0;
for (const f of files) {
for (const m of linter.verify(readFileSync(join(SRC, f), "utf8"), config, f)) {
const n = Number(/complexity of (\d+)/.exec(m.message)?.[1]);
if (!n) continue;
over += 1;
max = Math.max(max, n);
}
}
console.log(JSON.stringify({ limit, over, max }));