import { readdirSync, statSync } from 'node:fs' import { join, relative } from 'node:path' import { spawnSync } from 'node:child_process' const ignoredDirectories = new Set([ '.git', '.nuxt', '.output', 'node_modules' ]) const checkedExtensions = new Set(['.js', '.mjs', '.cjs']) /** * 점검 대상 JavaScript 파일인지 확인한다. * @param {string} filePath - 파일 경로 * @returns {boolean} 점검 대상 여부 */ const isCheckedFile = (filePath) => { const extension = filePath.slice(filePath.lastIndexOf('.')) return checkedExtensions.has(extension) } /** * 디렉터리에서 JavaScript 파일 목록을 재귀적으로 수집한다. * @param {string} directory - 탐색할 디렉터리 * @returns {string[]} JavaScript 파일 경로 목록 */ const collectJavaScriptFiles = (directory) => { const entries = readdirSync(directory) const files = [] for (const entry of entries) { if (ignoredDirectories.has(entry)) { continue } const fullPath = join(directory, entry) const stat = statSync(fullPath) if (stat.isDirectory()) { files.push(...collectJavaScriptFiles(fullPath)) continue } if (stat.isFile() && isCheckedFile(fullPath)) { files.push(fullPath) } } return files } const rootDirectory = process.cwd() const files = collectJavaScriptFiles(rootDirectory) for (const file of files) { const result = spawnSync(process.execPath, ['--check', file], { encoding: 'utf8' }) if (result.status !== 0) { const displayPath = relative(rootDirectory, file) process.stderr.write(`JavaScript 문법 오류: ${displayPath}\n`) if (result.stderr) { process.stderr.write(result.stderr) } process.exit(result.status || 1) } } process.stdout.write(`JavaScript 문법 점검 완료: ${files.length}개 파일\n`)