73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
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`)
|