"매 JS/TS 의 pluggable AST-based linter". Nicholas Zakas 가 2013 시작 — 매 ESTree AST 의 traverse 후 매 rule 의 emit. 2024 v9 의 flat config (eslint.config.js) 의 default — 2026 매 typescript-eslint v8, Stylistic plugin, Biome 의 competition 안에서 매 still ecosystem default.
// rules/no-raw-console.js
exportdefault{meta:{type:'problem',fixable:'code',schema:[]},create(context){return{'CallExpression[callee.object.name="console"][callee.property.name="log"]'(node){context.report({node,message:'Use logger.info instead of console.log',fix:(fixer)=>fixer.replaceText(node.callee,'logger.info'),});},};},};
Autofix rule — sort imports
create(context){return{Program(node){constimports=node.body.filter(n=>n.type==='ImportDeclaration');constsorted=[...imports].sort((a,b)=>a.source.value.localeCompare(b.source.value));if(imports.some((n,i)=>n!==sorted[i])){context.report({node:imports[0],message:'Imports must be sorted',fix:(fixer)=>fixer.replaceTextRange([imports[0].range[0],imports.at(-1).range[1]],sorted.map(n=>context.sourceCode.getText(n)).join('\n')),});}},};}
{languageOptions:{parserOptions:{projectService:true,// 매 v8+ — auto tsconfig discovery
tsconfigRootDir:import.meta.dirname,},},rules:{'@typescript-eslint/no-misused-promises':'error','@typescript-eslint/await-thenable':'error',},}
언제: rule lookup, flat config 의 migrate, custom rule scaffolding, AST selector 의 craft.
언제 X: 매 specific plugin 의 latest API — version churn 매 빠름, docs 의 cross-check.
❌ 안티패턴
.eslintrc 의 still 의 use (2026): v9 의 deprecate — flat config 의 migrate.
Prettier rule 의 ESLint 안에서 enforce: 매 conflict — separate run.
extends chaining of unrelated configs: 매 cascade 의 의 hard to debug — explicit imports 의 use.
No --cache: 매 large repo 의 slow — .eslintcache 의 enable.
type-aware rule 의 large monorepo 의 enable: parser overhead — 매 critical 의 만.