-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcheck-suppressions.ts
More file actions
77 lines (68 loc) · 1.79 KB
/
check-suppressions.ts
File metadata and controls
77 lines (68 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env tsx
/**
* TweetClaw - Error Suppression Detector
*
* Scans all source files for banned error suppressions.
* CRITICAL: Error suppressions are NEVER allowed. Fix the underlying issues instead.
*
* Exits with code 1 if any suppressions are found.
*/
import { reportViolations, walkSourceFiles } from './check-common';
const SUPPRESSION_PATTERNS = [
/eslint-disable-next-line/,
/eslint-disable-line/,
/eslint-disable/,
/@ts-ignore/,
/@ts-expect-error/,
/@ts-nocheck/,
/v8 ignore/,
/istanbul ignore/,
/c8 ignore/,
/jscpd:ignore/,
];
const IGNORED_FILES = new Set([
'check-suppressions.ts',
'check-em-dash.ts',
'eslint.config.ts',
]);
const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
interface SuppressionViolation {
readonly content: string;
readonly file: string;
readonly line: number;
readonly pattern: string;
}
function findFirstMatchingPattern(line: string): RegExp | undefined {
for (const pattern of SUPPRESSION_PATTERNS) {
if (pattern.test(line)) {
return pattern;
}
}
return undefined;
}
const violations = walkSourceFiles<SuppressionViolation>(
process.cwd(),
{
extensions: SOURCE_EXTENSIONS,
ignoredFiles: IGNORED_FILES,
scanLine: (line: string): boolean => findFirstMatchingPattern(line) !== undefined,
},
(file: string, line: number, content: string): SuppressionViolation => ({
file,
line,
content,
pattern: findFirstMatchingPattern(content)?.source ?? '',
}),
);
if (violations.length > 0) {
reportViolations(
violations,
'Error suppressions detected!',
[
'NEVER use error suppressions (eslint-disable, @ts-ignore, etc.)',
'Fix the underlying issues instead.',
],
);
process.exit(1);
}
globalThis.console.log('No error suppressions found!');