mirim-app/frontend/eslint.config.js
AWESOMEDEV 6ba8776e04
Some checks failed
CI / frontend-build (push) Has been cancelled
CI / backend-test (push) Has been cancelled
ci: 10점 향한 빠른 승리 3종 — 브랜치 보호·커버리지·린트/포맷
1) 브랜치 보호(main): CI 두 개 초록불 + 승인 1 없이는 merge 불가,
   학생 직접 push 차단(PR 워크플로), 관리자만 운영·배포용 직접 push (Gitea 설정)
2) 커버리지 측정:
   - 백엔드 JaCoCo — 현재 라인 36.7%, 바닥 30% ratchet(테스트 지우며 후퇴하면 빌드 실패)
   - 프론트 vitest 커버리지 — 채점 로직 runSql.js 라인 40% 바닥
3) 린트/포맷 CI 강제:
   - 프론트 ESLint 9(flat) 신규 — 버그류 에러, 훅 오용 검출 (현재 위반 0)
   - 백엔드 Spotless — 안 쓰는 import·줄끝 공백·파일끝 개행 (기존 코드 이미 clean, 재정렬 없음)
   - ci.yml에 포맷검사·린트·커버리지 단계 추가

백엔드 37개 테스트 + 커버리지 게이트 통과, 프론트 ESLint·커버리지 통과 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:02:08 +09:00

47 lines
2.2 KiB
JavaScript

// 이 파일이 하는 일: 프론트 코드의 "문법·버그 냄새"를 기계가 자동으로 잡는 규칙(ESLint) 설정이다.
//
// 학습 포인트 — 린트(lint)는 "사람이 못 보고 넘긴 실수를 컴파일 전에 잡는 자동 검사"다.
// 예: 안 쓰는 변수, 존재하지 않는 전역 참조, React 훅을 조건문 안에서 잘못 쓰는 것 등.
// npm run lint 로 로컬에서 돌리고, CI에서도 자동으로 돌아 "에러가 있으면 빨간불"이 된다.
// ESLint 9의 "flat config"(배열로 규칙을 겹쳐 쌓는 방식)를 쓴다.
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
export default [
// 검사에서 제외할 폴더 (빌드 산출물·커버리지·의존성)
{ ignores: ['dist', 'coverage', 'node_modules'] },
{
files: ['**/*.{js,jsx}'],
languageOptions: {
ecmaVersion: 2022,
sourceType: 'module',
// 브라우저 전역(window, self, document…) + Node 전역(process 등)을 "정의됨"으로 인정.
globals: { ...globals.browser, ...globals.node },
parserOptions: { ecmaFeatures: { jsx: true } },
},
plugins: { 'react-hooks': reactHooks },
rules: {
...js.configs.recommended.rules, // 존재하지 않는 변수, 중복 선언 등 기본 버그류 = 에러
// React 훅 규칙: 훅을 조건/반복문 안에서 부르는 진짜 버그는 에러, 의존성 배열은 경고.
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
// 안 쓰는 변수는 경고(빌드는 막지 않음). 대문자 시작(컴포넌트/상수)·_prefix 인자는 예외.
'no-unused-vars': ['warn', { varsIgnorePattern: '^[A-Z_]', argsIgnorePattern: '^_' }],
},
},
// 테스트 파일: vitest 전역(describe/it/expect…)을 "정의됨"으로 인정.
{
files: ['**/*.test.{js,jsx}'],
languageOptions: {
globals: {
describe: 'readonly', it: 'readonly', test: 'readonly', expect: 'readonly',
vi: 'readonly', beforeEach: 'readonly', afterEach: 'readonly',
beforeAll: 'readonly', afterAll: 'readonly',
},
},
},
]