iter(g56): ua style 增加单文件 200 行门禁

This commit is contained in:
HIsheR
2026-10-26 12:20:33 +08:00
parent a755758577
commit e6bf801679
4 changed files with 21 additions and 5 deletions
+17 -2
View File
@@ -639,19 +639,34 @@ function styleCheckFile(file, src) {
return issues;
}
/*** 全仓风格检查:有违规退出码 1,全绿输出 OK ***/
// 单文件行数上限:CODING.md「单文件尽量 < 200 行」,只约束包内实现文件
const MAX_LINES = 200;
// 不受行数限制的汇总文件:类型集中文件与导出入口天然会长
const SIZE_EXEMPT = new Set(['types.ts', 'index.ts']);
/*** 行数检查:只查分层包 src 目录下的实现文件,超出上限即违规 ***/
function sizeCheckFile(file) {
const rel = path.relative(ROOT, file).replace(/\\/g, '/');
if (!/^packages\/[^/]+\/[^/]+\/src\//.test(rel)) return []; // 只约束分层包源码
if (SIZE_EXEMPT.has(path.basename(file))) return []; // 类型 / 导出汇总豁免
const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/).length;
return lines > MAX_LINES ? [`${rel} 共 ${lines} 行,超过单文件 ${MAX_LINES} 行上限(CODING.md)`] : [];
}
/*** 全仓风格检查:注释规范 + 单文件行数,有违规退出码 1,全绿输出 OK ***/
function cmdStyle() {
const files = collectSourceFiles();
const issues = [];
for (const f of files) {
issues.push(...styleCheckFile(f, fs.readFileSync(f, 'utf8')));
issues.push(...sizeCheckFile(f));
}
if (issues.length) {
for (const it of issues) console.error('style: ' + it);
console.error(`${issues.length} violation(s)`);
process.exit(1);
}
console.log(`style OK (${files.length} files)`);
console.log(`style OK (${files.length} files, 实现文件 ≤ ${MAX_LINES} 行)`);
}
/*** 皮肤包硬编码颜色检查:#hex 字面量一律禁止,颜色必须走 --ua-* 令牌(rgba 仅限阴影/遮罩的透明度叠加) ***/