-
Notifications
You must be signed in to change notification settings - Fork 152
Expand file tree
/
Copy pathrisk-label.mjs
More file actions
96 lines (80 loc) · 2.49 KB
/
risk-label.mjs
File metadata and controls
96 lines (80 loc) · 2.49 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { readFileSync } from 'node:fs';
// --- Path Classification ---
// Order matters: critical is checked first, then sensitive, then low.
// When in doubt, a path is classified higher (critical > sensitive > low).
const CRITICAL_PATHS = [
'packages/layout-engine/style-engine/',
'packages/layout-engine/layout-engine/',
'packages/pm-adapter/',
'packages/layout-engine/layout-bridge/',
'packages/layout-engine/measuring/',
'packages/layout-engine/painters/',
'packages/super-editor/src/editors/v1/core/super-converter/',
'packages/super-editor/src/editors/v1/core/presentation-editor/',
'packages/superdoc/src/core/',
'packages/word-layout/',
];
const SENSITIVE_PATHS = [
'packages/super-editor/src/editors/v1/extensions/',
'packages/super-editor/src/editors/v1/core/',
'packages/superdoc/src/',
'packages/layout-engine/contracts/',
'packages/esign/',
'shared/',
];
const TEST_PATTERNS = [
/__tests__\//,
/\/test-fixtures\//,
/\.(test|spec)\.[^/]+$/,
/^tests\//,
/^e2e-tests\//,
];
// --- Helpers ---
function isTestFile(file) {
return TEST_PATTERNS.some((p) => p.test(file));
}
function classifyFile(file) {
for (const prefix of CRITICAL_PATHS) {
if (file.startsWith(prefix)) return 'critical';
}
for (const prefix of SENSITIVE_PATHS) {
if (file.startsWith(prefix)) return 'sensitive';
}
return 'low';
}
// --- Main Classification ---
export function classify(files) {
if (!files.length) {
return { level: 'low', downgraded: false };
}
const entries = files.map((file) => ({
file,
risk: classifyFile(file),
test: isTestFile(file),
}));
// Highest risk wins
let level = 'low';
if (entries.some((e) => e.risk === 'critical')) level = 'critical';
else if (entries.some((e) => e.risk === 'sensitive')) level = 'sensitive';
// Downgrade if ALL risky files are test-only
const riskyFiles = entries.filter((e) => e.risk !== 'low');
let downgraded = false;
if (riskyFiles.length > 0 && riskyFiles.every((e) => e.test)) {
if (level === 'critical') level = 'sensitive';
else if (level === 'sensitive') level = 'low';
downgraded = true;
}
return { level, downgraded };
}
// --- CLI ---
if (process.argv[1]?.endsWith('risk-label.mjs')) {
let files;
if (process.argv.length > 2) {
files = process.argv.slice(2);
} else {
const input = readFileSync('/dev/stdin', 'utf-8');
files = input.trim().split('\n').filter(Boolean);
}
const result = classify(files);
console.log(JSON.stringify(result, null, 2));
}