Files
wwjcloud/scripts/audit-structure.js

78 lines
2.4 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const repoRoot = path.resolve(__dirname, '..');
const commonRoot = path.join(repoRoot, 'wwjcloud', 'src', 'common');
function listDirs(dir) {
if (!fs.existsSync(dir)) return [];
return fs
.readdirSync(dir, { withFileTypes: true })
.filter(d => d.isDirectory())
.map(d => d.name);
}
function hasAnyTsFiles(dir) {
if (!fs.existsSync(dir)) return false;
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const e of entries) {
const full = path.join(dir, e.name);
if (e.isFile() && e.name.endsWith('.ts') && !e.name.endsWith('.d.ts')) return true;
if (e.isDirectory() && hasAnyTsFiles(full)) return true;
}
return false;
}
function scanModule(moduleName) {
const base = path.join(commonRoot, moduleName);
const result = { module: moduleName };
// controllers
result.controller_admin = hasAnyTsFiles(path.join(base, 'controllers', 'adminapi'));
result.controller_api = hasAnyTsFiles(path.join(base, 'controllers', 'api'));
// services
result.service_admin = hasAnyTsFiles(path.join(base, 'services', 'admin'));
result.service_api = hasAnyTsFiles(path.join(base, 'services', 'api'));
result.service_core = hasAnyTsFiles(path.join(base, 'services', 'core'));
// entities
result.entities = hasAnyTsFiles(path.join(base, 'entities'));
return result;
}
function main() {
if (!fs.existsSync(commonRoot)) {
console.error('common root not found:', commonRoot);
process.exit(1);
}
const modules = listDirs(commonRoot);
const rows = modules.map(scanModule);
console.log('module,controller_admin,controller_api,service_admin,service_api,service_core,entities');
for (const r of rows) {
console.log([
r.module,
r.controller_admin ? 'Y' : 'N',
r.controller_api ? 'Y' : 'N',
r.service_admin ? 'Y' : 'N',
r.service_api ? 'Y' : 'N',
r.service_core ? 'Y' : 'N',
r.entities ? 'Y' : 'N',
].join(','));
}
const problems = rows.filter(r => !r.service_admin || !r.controller_admin || !r.entities);
if (problems.length) {
console.error('\nMissing layers summary:');
for (const p of problems) {
const miss = [];
if (!p.controller_admin) miss.push('controller_admin');
if (!p.service_admin) miss.push('service_admin');
if (!p.entities) miss.push('entities');
console.error(`- ${p.module}: ${miss.join(' | ')}`);
}
}
}
if (require.main === module) {
try { main(); } catch (e) { console.error(e); process.exit(1); }
}