ESLint - Quick Reference
When to Use This Skill
- Configure linting for JavaScript/TypeScript projects
- Create custom rules
- Integrate with Prettier and other tools
When NOT to Use This Skill
- ESLint 9 flat config + Biome - Use
eslint-biomeskill for modern setup - TypeScript-specific rules - Use
typescript-eslintskill - Code quality principles - Use
quality-commonfor SOLID/Clean Code - SonarQube integration - Use
sonarqubeskill
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:eslintfor comprehensive documentation.
Basic Setup
npm install -D eslint @eslint/js
npx eslint --init
Flat Config (ESLint 9+)
eslint.config.js
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
export default [
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ['**/*.ts', '**/*.tsx'],
rules: {
'@typescript-eslint/no-unused-vars': 'error',
'@typescript-eslint/explicit-function-return-type': 'warn',
},
},
{
ignores: ['dist/', 'node_modules/', '*.config.js'],
},
];
With Prettier
import eslintConfigPrettier from 'eslint-config-prettier';
export default [
js.configs.recommended,
...tseslint.configs.recommended,
eslintConfigPrettier, // Must be last
];
Legacy Config (.eslintrc)
{
"root": true,
"env": { "browser": true, "es2021": true, "node": true },
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"rules": {
"no-console": "warn",
"@typescript-eslint/no-explicit-any": "error"
}
}
CLI Usage
# Lint files
npx eslint src/
# Fix auto-fixable issues
npx eslint src/ --fix
# Check specific files
npx eslint "src/**/*.{ts,tsx}"
Anti-Patterns
| Anti-Pattern | Why It's Bad | Correct Approach |
|---|---|---|
| Using legacy .eslintrc in new projects | Deprecated in ESLint 9 | Use flat config (eslint.config.mjs) |
| No TypeScript type checking | Misses type-aware issues | Use recommendedTypeChecked preset |
| Disabling rules with comments everywhere | Code smell, defeats purpose | Fix the issue or adjust rule config |
| Not caching in CI | Slow linting | Use --cache flag |
| Conflicting Prettier rules | Formatting wars | Use eslint-config-prettier |
| Ignoring warnings | Accumulate tech debt | Treat warnings as errors in CI |
Quick Troubleshooting
| Issue | Likely Cause | Solution |
|---|---|---|
| "Failed to load config" error | Wrong config format | Check eslint.config.mjs syntax |
| Type-aware rules not working | Missing parserOptions | Add projectService: true to config |
| Linting very slow | No caching, type checking all files | Enable cache, limit type checking to TS files |
| Rules from plugin not found | Plugin not in flat config format | Check plugin compatibility with ESLint 9 |
| Prettier conflicts | Both formatting same code | Add eslint-config-prettier last |
| File not being linted | In ignores array | Check ignores in config |