#!/bin/bash #============================================================================== # pre-commit hook (Monorepo: frontend + backend) # 변경된 영역만 선택적으로 검증 #============================================================================== # 스테이징된 파일 목록 STAGED=$(git diff --cached --name-only --diff-filter=ACM) # frontend 변경 확인 FRONTEND_CHANGED=$(echo "$STAGED" | grep -E '^frontend/' || true) # backend 변경 확인 BACKEND_CHANGED=$(echo "$STAGED" | grep -E '^backend/' || true) # === Frontend 검증 === if [ -n "$FRONTEND_CHANGED" ] && [ -d "frontend" ]; then echo "pre-commit: frontend TypeScript 타입 체크 중..." if ! command -v npx &>/dev/null; then echo "경고: npx가 설치되지 않았습니다. 검증을 건너뜁니다." elif [ ! -d "frontend/node_modules" ]; then echo "경고: frontend/node_modules가 없습니다. 'cd frontend && npm install' 후 다시 시도하세요." exit 1 else (cd frontend && npx tsc --noEmit --pretty 2>&1) TSC_RESULT=$? if [ $TSC_RESULT -ne 0 ]; then echo "" echo "╔══════════════════════════════════════════════════════════╗" echo "║ TypeScript 타입 에러! 커밋이 차단되었습니다. ║" echo "╚══════════════════════════════════════════════════════════╝" exit 1 fi echo "pre-commit: 타입 체크 성공" # ESLint if [ -f "frontend/eslint.config.js" ] || [ -f "frontend/eslint.config.mjs" ]; then echo "pre-commit: frontend ESLint 검증 중..." (cd frontend && npx eslint src/ --quiet 2>&1) LINT_RESULT=$? if [ $LINT_RESULT -ne 0 ]; then echo "" echo "╔══════════════════════════════════════════════════════════╗" echo "║ ESLint 에러! 커밋이 차단되었습니다. ║" echo "║ 'cd frontend && npm run lint:fix'로 자동 수정 시도. ║" echo "╚══════════════════════════════════════════════════════════╝" exit 1 fi echo "pre-commit: ESLint 통과" fi fi fi # === Backend 검증 === if [ -n "$BACKEND_CHANGED" ] && [ -d "backend" ] && [ -f "backend/pom.xml" ]; then echo "pre-commit: backend 컴파일 체크 중..." (cd backend && ./mvnw compile -q 2>&1) MVN_RESULT=$? if [ $MVN_RESULT -ne 0 ]; then echo "" echo "╔══════════════════════════════════════════════════════════╗" echo "║ Backend 컴파일 에러! 커밋이 차단되었습니다. ║" echo "╚══════════════════════════════════════════════════════════╝" exit 1 fi echo "pre-commit: backend 컴파일 성공" fi exit 0