ESLint
Pluggable linting for JavaScript and TypeScript.
Installation
bun add -D eslint @eslint/js typescript-eslint globals
Running ESLint
eslint . # Lint all files
eslint --fix . # Auto-fix issues
eslint src/file.ts # Specific file
eslint --format json . # JSON output
eslint --format stylish . # Styled output
Configuration (Flat Config - ESLint 9+)
eslint.config.js (Recommended)
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import globals from "globals";
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommended,
{
languageOptions: {
globals: {
...globals.node,
...globals.es2022,
},
},
},
{
ignores: ["dist/", "node_modules/", "*.config.js"],
},
);
eslint.config.js (Strict TypeScript)
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import globals from "globals";
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
{
languageOptions: {
globals: {
...globals.node,
...globals.es2022,
},
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
ignores: ["dist/", "node_modules/"],
},
);
Common Rules
TypeScript Rules
{
rules: {
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/consistent-type-imports": ["warn", {
prefer: "type-imports",
fixStyle: "separate-type-imports"
}],
}
}
JavaScript Rules
{
rules: {
"no-console": ["warn", { allow: ["warn", "error"] }],
"no-var": "warn",
"no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
}
}
File-Specific Configuration
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ["src/**/*.ts"],
rules: {
"@typescript-eslint/no-explicit-any": "error",
},
},
{
files: ["tests/**/*.ts"],
rules: {
"@typescript-eslint/no-explicit-any": "off",
},
},
{
ignores: ["dist/", "node_modules/"],
},
);
Ignore Patterns
{
ignores: ["dist/", "node_modules/", "*.config.js", "coverage/", "build/"];
}
React Plugin
bun add -D eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh
import reactPlugin from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
export default tseslint.config(
// ...base config
{
plugins: {
react: reactPlugin,
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...reactPlugin.configs.recommended.rules,
...reactHooks.configs.rules,
"react-refresh/only-export-components": "warn",
},
},
);
CI Integration
GitHub Actions
name: Lint
on: [push, pull_request]
jobs:
eslint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun run lint