Add code quality gates

Add ESLint/quality gates, per-file ratchet budgets, and regression tests for code quality checks.
This commit is contained in:
Eyejoker
2026-04-28 01:19:06 +09:00
committed by GitHub
parent e2dd12a235
commit 79efa6b37c
8 changed files with 888 additions and 6 deletions

View File

@@ -0,0 +1,64 @@
import { describe, expect, it } from 'vitest';
import { analyzeCodeQuality, evaluateCodeQuality } from './code-quality.js';
describe('code quality evaluator', () => {
it('measures line count and function metrics from TypeScript source', () => {
const metrics = analyzeCodeQuality(
'sample.ts',
[
'export function choose(value: number) {',
' if (value > 10) {',
' return value;',
' }',
' return value > 0 ? value : 0;',
'}',
].join('\n'),
);
expect(metrics.lineCount).toBe(6);
expect(metrics.nonEmptyLineCount).toBe(6);
expect(metrics.maxFunctionLines).toBe(6);
expect(metrics.maxComplexity).toBeGreaterThanOrEqual(3);
expect(metrics.maxNesting).toBeGreaterThanOrEqual(1);
});
it('does not let nested functions inflate the parent function budget', () => {
const metrics = analyzeCodeQuality(
'nested.ts',
[
'export function outer() {',
' const inner = () => {',
' if (true) return 1;',
' return 0;',
' };',
' return inner();',
'}',
].join('\n'),
);
expect(metrics.maxComplexity).toBe(2);
});
it('returns budget findings for metrics over the configured limit', () => {
const metrics = analyzeCodeQuality(
'oversized.ts',
['export function f() {', ' return 1;', '}'].join('\n'),
);
expect(
evaluateCodeQuality(metrics, {
maxComplexity: 1,
maxFunctionLines: 2,
maxLines: 2,
maxNesting: 0,
owner: 'test',
}),
).toEqual(
expect.arrayContaining([
expect.objectContaining({ metric: 'lineCount' }),
expect.objectContaining({ metric: 'maxFunctionLines' }),
]),
);
});
});