51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
// 用途:确保每个 HLI 路由文件都有对应的 JSON Schema 且格式合法
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const ROUTE_DIR = 'src/routes/hli';
|
|
const SCHEMA_DIR = 'src/schemas/hli';
|
|
const errors = [];
|
|
|
|
// 获取所有业务域目录
|
|
const domains = fs.readdirSync(ROUTE_DIR).filter(f => {
|
|
return fs.statSync(path.join(ROUTE_DIR, f)).isDirectory();
|
|
});
|
|
|
|
domains.forEach(domain => {
|
|
const routeDir = path.join(ROUTE_DIR, domain);
|
|
const schemaDir = path.join(SCHEMA_DIR, domain);
|
|
|
|
// 扫描路由文件(排除 index.js 路由聚合文件)
|
|
const routeFiles = fs.readdirSync(routeDir).filter(f => f.endsWith('.js') && f !== 'index.js');
|
|
|
|
routeFiles.forEach(routeFile => {
|
|
const name = path.basename(routeFile, '.js');
|
|
const schemaPath = path.join(schemaDir, name + '.schema.json');
|
|
|
|
if (!fs.existsSync(schemaPath)) {
|
|
errors.push('❌ [MISSING] ' + routeFile + ' → 缺少 ' + schemaPath);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8'));
|
|
if (!schema.input || !schema.output) {
|
|
errors.push('❌ [INVALID] ' + schemaPath + ' → 缺少 input/output');
|
|
}
|
|
if (!schema.hli_id) {
|
|
errors.push('❌ [NO ID] ' + schemaPath + ' → 缺少 hli_id');
|
|
}
|
|
} catch (e) {
|
|
errors.push('❌ [PARSE] ' + schemaPath + ' → ' + e.message);
|
|
}
|
|
});
|
|
});
|
|
|
|
if (errors.length > 0) {
|
|
console.error('\n❌ HLI Contract Check FAILED:\n');
|
|
errors.forEach(e => console.error(e));
|
|
process.exit(1);
|
|
} else {
|
|
console.log('✅ HLI Contract Check PASSED');
|
|
}
|