Gritql
GritQL이란?
GritQL은 코드베이스에서 특정 패턴을 **검색(Search)**하고 **변환(Transform)**하기 위한 선언적 쿼리 언어입니다. Tree-sitter 기반 AST 매칭을 사용해 코드 구조를 이해하며, 코드 리팩토링, API 마이그레이션, 린트 규칙 자동화에 강력하게 활용됩니다.
“코드 그 자체를 쿼리로 쓴다”는 콘셉트로,
console.log($msg)와 같이 코드 예시 그대로 패턴을 정의할 수 있습니다.
주요 특징
1. 코드 기반 패턴 매칭
- 코드 스니펫을 백틱(“) 으로 감싸 패턴으로 사용
$변수로 메타변수를 지정해 다양한 코드 구조를 매칭 가능
`console.log($msg)`2. 코드 변환 (Rewrite)
=>연산자를 통해 매치된 코드를 새 코드로 대체 가능
`console.log($msg)` => `winston.info($msg)`3. 조건 필터링 (where 절)
- 매칭된 패턴에 조건 추가 가능 (e.g., 특정 블록 내/외부 여부)
`console.log($msg)` => `.` where {
$msg <: not within `if (DEBUG) { $_ }`
}4. 복합 패턴 조합 (or / and)
or {
`console.log($msg)`,
`console.error($msg)`
} => `logger.info($msg)`5. 문맥 한정자 (within, contains, after, before)
- AST 계층 구조를 활용한 문맥 제약 가능
`$call` where {
$call <: within `try { $_ } catch { $_ }`
}6. 다중 언어 지원
- JS/TS, Python, Rust, Go, SQL, JSON, YAML, Terraform 등
- 동일 문법으로 다양한 언어 처리 가능
7. 패턴 라이브러리와 커스터마이징
- 기본 제공되는 수백 개의 표준 패턴 (예:
react_to_hooks) - 사용자 정의 패턴 모듈 작성 및 재사용 가능
설치 방법
npm install --location=global @getgrit/cli또는:
curl -fsSL https://docs.grit.io/install | bash사용 예시
✅ 콘솔 로그를 winston.log로 교체
grit apply '`console.log($msg)` => `winston.log($msg)`'✅ console.log 삭제 (단, try 블록 안은 유지)
`console.log($msg)` => `.` where {
$msg <: not within `try { $_ } catch { $_ }`
}✅ 테스트 함수 안에서는 변경하지 않기
patterns:
- name: replace_log
body: |
`console.log($msg)` => `winston.log($msg)` where {
$msg <: not within or {
`it($_, $_)`, `test($_, $_)`, `describe($_, $_)`
}
}활용 사례
- 대규모 API 변경 및 리팩토링
- 프레임워크 마이그레이션 (예:
react_to_hooks) - 자동 린트 및 코드 품질 검사 (CI에서
grit check사용) - 보안 패턴 탐지 및 자동 수정
- 다국어 코드베이스 구조적 검색