#!/usr/bin/env node import path from 'node:path'; // 경로 유틸리티를 사용한다. import { fileURLToPath } from 'node:url'; // 파일 URL 을 실제 경로로 변환한다. import { runGenerator } from './generator.js'; // 생성기 실행 함수를 사용한다. const HELP_TEXT = ` Board Generator CLI Usage: generate-board --table [options] Options: --table DB 테이블명 --module 모듈 경로 예: sample/board --entity Entity 클래스명 예: SampleBoard --menu-name 화면 표시명 예: Sample Board --output 생성 루트 경로 예: . 또는 generated --scope all | backend | xml | frontend --preview 생성 경로만 미리 출력 --force 기존 파일 덮어쓰기 허용 --help 도움말 출력 `; // 도움말 문자열 정의를 종료한다. function parseArgs(argv) { // 명령행 인자를 파싱한다. const parsedOptions = {}; // 파싱 결과 객체를 초기화한다. for (let index = 0; index < argv.length; index += 1) { // 전달된 인자 배열을 순회한다. const currentArg = argv[index]; // 현재 인자를 저장한다. if (currentArg === '--preview' || currentArg === '--force' || currentArg === '--help') { // 불리언 플래그 옵션인지 확인한다. parsedOptions[currentArg.replace(/^--/, '')] = true; // 플래그 값을 true 로 저장한다. continue; // 다음 인자로 이동한다. } // 조건문을 종료한다. if (!currentArg.startsWith('--')) { // 옵션 형식이 아닌 인자인지 확인한다. continue; // 위치 인자는 무시하고 다음으로 이동한다. } // 조건문을 종료한다. const nextValue = argv[index + 1]; // 다음 값을 읽는다. parsedOptions[currentArg.replace(/^--/, '').replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())] = nextValue; // 옵션 이름을 camelCase 키로 저장한다. index += 1; // 값 인자를 소비했으므로 인덱스를 증가시킨다. } // 반복문을 종료한다. return parsedOptions; // 파싱 결과를 반환한다. } // 함수를 종료한다. async function main() { // CLI 메인 흐름을 실행한다. const options = parseArgs(process.argv.slice(2)); // 명령행 인자를 파싱한다. if (options.help || !options.table) { // 도움말 출력 조건인지 확인한다. console.log(HELP_TEXT); // 도움말을 출력한다. return; // 프로그램을 종료한다. } // 조건문을 종료한다. const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..'); // 프로젝트 루트 경로를 계산한다. await runGenerator(projectRoot, options); // 생성기 실행 함수를 호출한다. } // 함수를 종료한다. main().catch(error => { // 메인 실행 중 예외를 처리한다. console.error(error.message); // 원인 중심 오류 메시지를 출력한다. process.exitCode = 1; // 종료 코드를 실패로 설정한다. }); // 예외 처리 구문을 종료한다.