Files
TREK/server/scripts/eslint-ratchet.mjs
T
Maurice f458278e88 ci(lint): a grown warning count names the file and line that grew it
lint:warnings failed with the total and the files holding the most of the rule, which are old ones the baseline allows; the file that tipped the count was never named, so finding it meant linting by hand. When a rule grows, the ratchet now lints the files that differ from the base twice, as they are and as they were there, and lists every one holding more of the rule, line and message. The base is TREK_LINT_BASE (the CI fetches the pushed-over commit on a push and the target branch on a pull request) or origin/dev; without it the report stays as it was.
2026-10-18 22:46:00 +02:00

36 lines
1.8 KiB
JavaScript

#!/usr/bin/env node
/*
* lint:warnings: ESLint errors fail, warnings may only go down.
*
* Several rules in eslint.config.mjs are warnings (no-explicit-any,
* no-unused-vars, no-require-imports, no-await-in-loop, no-non-null-assertion,
* no-console and a few js.recommended ones), set that way because the code
* had hits when they came in, and a warning never fails a build. So this runs
* ESLint over the server with its own config, as `eslint .` does, and counts
* the warnings per rule, separately for src/ and tests/, plus the messages an
* eslint-disable comment silenced as a third group. Each count may not pass
* its entry in scripts/eslint-baseline.json, and an entry above its count
* fails as well until --update lowers it, so a fixed warning cannot come back
* unseen. Any error fails, so the check stands in for `npm run lint:check`,
* and so does a block comment that configures a rule inline: it leaves no
* message to count, so it would otherwise be the free way past the ratchet.
*
* npm run lint:warnings check against the baseline (CI)
* npm run lint:warnings -- --update lower the baseline to today's counts;
* it never raises an entry
*
* The tally lives in scripts/lib/eslint-warnings.mjs at the repository root;
* ESLint comes from this workspace, so the server lints with the major its
* config was written for.
*/
import { check, lintTextWith, lintWith } from '../../scripts/lib/eslint-warnings.mjs';
import { runCli } from '../../scripts/lib/ratchet.mjs';
import { ESLint } from 'eslint';
import { fileURLToPath } from 'node:url';
const root = fileURLToPath(new URL('..', import.meta.url));
await runCli('lint:warnings', (args) =>
check({ root, update: args.includes('--update'), lint: lintWith(ESLint), lintText: lintTextWith(ESLint) }),
);