cangku/backend/scripts/check-syntax.js

62 lines
1.5 KiB
JavaScript

const { spawnSync } = require('child_process');
const fs = require('fs');
const path = require('path');
const rootDir = path.resolve(__dirname, '..');
const scanDirs = ['src', 'model', 'cubejs'].map((dir) => path.join(rootDir, dir));
const ignoredDirs = new Set(['node_modules', '.cubestore', 'dist', 'coverage']);
function collectJavaScriptFiles(dir, files = []) {
if (!fs.existsSync(dir)) {
return files;
}
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
if (entry.isDirectory()) {
if (!ignoredDirs.has(entry.name)) {
collectJavaScriptFiles(path.join(dir, entry.name), files);
}
continue;
}
if (entry.isFile() && /\.(c?m?js)$/.test(entry.name)) {
files.push(path.join(dir, entry.name));
}
}
return files;
}
const files = scanDirs.flatMap((dir) => collectJavaScriptFiles(dir)).sort();
if (!files.length) {
console.log('No JavaScript files found for syntax check.');
process.exit(0);
}
let failed = false;
for (const file of files) {
const result = spawnSync(process.execPath, ['--check', file], {
cwd: rootDir,
encoding: 'utf8',
});
if (result.status !== 0) {
failed = true;
console.error(`\nSyntax check failed: ${path.relative(rootDir, file)}`);
if (result.stderr) {
console.error(result.stderr.trim());
}
if (result.stdout) {
console.error(result.stdout.trim());
}
}
}
if (failed) {
process.exit(1);
}
console.log(`Syntax check passed for ${files.length} JavaScript files.`);