feat(board-generator): add board code generator and sample CRUD artifacts
Add Node.js CLI tool with Handlebars templates for generating standard CRUD artifacts: Java entity, service, DAO, controller, MyBatis mapper XML, and Vue frontend pages. Also generate the full SampleTableBoard CRUD reference implementation, update README with backend execution instructions, and add project plan documentation.
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
#!/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 <table_name> [options]
|
||||
|
||||
Options:
|
||||
--table <name> DB 테이블명
|
||||
--module <path> 모듈 경로 예: sample/board
|
||||
--entity <name> Entity 클래스명 예: SampleBoard
|
||||
--menu-name <name> 화면 표시명 예: Sample Board
|
||||
--output <path> 생성 루트 경로 예: . 또는 generated
|
||||
--scope <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; // 종료 코드를 실패로 설정한다.
|
||||
}); // 예외 처리 구문을 종료한다.
|
||||
Reference in New Issue
Block a user