Loading...
Loading...
This skill should be used when the user asks to "set up ESLint", "configure ESLint rules", "fix ESLint errors", "migrate to flat config", or needs guidance on JavaScript/TypeScript linting best practices.
npx skill4agent add the-perfect-developer/the-perfect-opencode eslinteslint.config.jseslint.config.js.eslintrc.*"off""warn""error"pluginName/ruleNamenpm init @eslint/config@latesteslint.config.js^20.19.0^22.13.0>=24npm install --save-dev eslint@latest @eslint/js@latesteslint.config.jsimport { defineConfig } from "eslint/config";
import js from "@eslint/js";
export default defineConfig([
{
files: ["**/*.js"],
plugins: { js },
extends: ["js/recommended"],
rules: {
"no-unused-vars": "warn",
"no-undef": "error",
},
},
]);npx eslint src/| Key | Purpose |
|---|---|
| Label for debugging (use |
| Glob patterns this object applies to |
| Glob patterns to exclude (global if no other keys present) |
| Inherit from plugin configs, shareable configs, or objects |
| Register plugins by namespace |
| Rule names mapped to severity or |
| |
| |
| Shared data available to all rules |
| Extracts JS from non-JS files (e.g., Markdown) |
// Apply rules only to source files
{ files: ["src/**/*.{js,ts}"], rules: { ... } }
// Apply rules to all except tests
{ files: ["**/*.js"], ignores: ["**/*.test.js"], rules: { ... } }globalIgnoresimport { defineConfig, globalIgnores } from "eslint/config";
export default defineConfig([
globalIgnores(["dist/", "coverage/", "*.min.js"]),
// other config objects...
]);globalIgnores()ignores.gitignoreimport { includeIgnoreFile } from "@eslint/compat";
import { fileURLToPath } from "node:url";
const gitignorePath = fileURLToPath(new URL(".gitignore", import.meta.url));
export default defineConfig([
includeIgnoreFile(gitignorePath),
// ...
]);"error""error""warn"rules: {
"no-var": "error", // always use const/let
"prefer-const": "error", // enforce immutability where possible
"eqeqeq": ["error", "always"], // ban == in favor of ===
"no-console": "warn", // flag but don't block during development
}// eslint-disable-next-line rule-name -- reason/* eslint-disable */// eslint-disable-next-line no-console -- CLI entrypoint needs output
console.log("Starting server...");linterOptions: {
reportUnusedDisableDirectives: "error",
}{
files: ["**/*.test.{js,ts}", "**/*.spec.{js,ts}"],
rules: {
"no-unused-expressions": "off", // chai/jest assertions
},
}import jsdoc from "eslint-plugin-jsdoc";
import { defineConfig } from "eslint/config";
export default defineConfig([
{
files: ["**/*.js"],
plugins: { jsdoc },
rules: {
"jsdoc/require-description": "error",
"jsdoc/check-values": "error",
},
},
]);pluginseslint-plugin-import react from "eslint-plugin-react";
import { defineConfig } from "eslint/config";
export default defineConfig([
{
files: ["**/*.{jsx,tsx}"],
plugins: { react },
extends: ["react/recommended"],
languageOptions: {
parserOptions: { ecmaFeatures: { jsx: true } },
},
},
]);npm install --save-dev typescript-eslintimport tseslint from "typescript-eslint";
import { defineConfig } from "eslint/config";
export default defineConfig([
...tseslint.configs.recommended,
{
files: ["**/*.ts", "**/*.tsx"],
rules: {
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/explicit-function-return-type": "off",
},
},
]);{
linterOptions: {
noInlineConfig: false, // allow inline eslint comments
reportUnusedDisableDirectives: "error", // fail on stale disables
reportUnusedInlineConfigs: "warn", // warn on redundant inline configs
},
}npx eslint --inspect-config # Opens config inspector UI
npx eslint --print-config file.js # Prints merged config for a filepackage.json{
"scripts": {
"lint": "eslint src/",
"lint:fix": "eslint src/ --fix"
}
}npm run lint1"error"| Value | Meaning |
|---|---|
| Disabled |
| Warning (exit code 0) |
| Error (exit code 1) |
references/configuration-guide.mdreferences/rules-and-plugins.mdexamples/eslint.config.js