My personal & professional linting setup for JS projects.
- Modern ESLint v9+ flat config: Uses the new flat configuration format
- Dynamic feature detection: Automatically configures based on your project's dependencies
- TypeScript support: Full TypeScript linting with modern typescript-eslint parser and rules
- React ecosystem: React, React Hooks, and JSX accessibility rules when React is detected
- Next.js support: Automatically configures Next.js official plugin linting rules when detected
- Test framework agnostic: Supports Jest and Vitest with automatic detection
- Testing Library integration: Automatically includes Testing Library rules for test files
- YAML/YML support: Built-in linting for YAML configuration files
- Prettier integration: Built-in Prettier configuration with conflict resolution via eslint-config-prettier
- ESM architecture: Built with ECMAScript modules and full TypeScript typing
- Docker support: Optional configuration for dockerized applications
- Blockchain/dApp support: Optional configuration for decentralized applications
To understand more, see https://github.com/codfish/eslint-config.
npm i -D eslint@9 \
@codfish/eslint-config@latest \
prettier@3 \
prettier-plugin-tailwindcss \
husky@latest \
lint-staged@latest \
doctoc
# Uninstall plugins or presets you don't need to manage anymore, `@codfish/eslint-config` includes them all.
npm uninstall typescript-eslint \
eslint-config-prettier \
eslint-plugin-jest \
eslint-plugin-jsx-a11y \
eslint-plugin-prettier \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-simple-import-sort \
eslint-plugin-testing-library \
eslint-plugin-yml \
@next/eslint-plugin-next \
eslint-plugin-next \
commitlint \
@commitlint/cli \
@commitlint/config-conventional
# Initialize husky
npx husky init
echo "npx lint-staged" > .husky/pre-commit
Note
Installing prettier & prettier-plugin-tailwindcss is optional. Remove that if you don't have tailwind in your project or you don't care about formatting non-js files.
Full usage: https://github.com/codfish/eslint-config#usage
Create an eslint.config.js
file in your root. Remove any old eslint configs you might have.
// eslint.config.js
import { defineConfig } from 'eslint/config';
import codfish from '@codfish/eslint-config';
import docker from '@codfish/eslint-config/docker';
import dapp from '@codfish/eslint-config/dapp';
export default defineConfig(
codfish,
docker,
dapp,
{
rules: {
// Optionally relax some rules for your project
'react/prop-types': 'off',
'import/prefer-default-export': 'off',
'@typescript-eslint/explicit-function-return-type': 'warn',
},
},
);
Note
Prettier is included and runs automatically through ESLint for JavaScript, TypeScript, JSX, and TSX files using the built-in configuration. You don't need to install or configure Prettier separately for basic usage.
Reasons to install prettier
separately:
- Formatting css, md, json, or other non-js files that eslint doesn't format by default.
Full usage: https://github.com/codfish/eslint-config#prettier
import codfish from '@codfish/eslint-config/prettier';
/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */
export default {
...codfish,
plugins: ['prettier-plugin-tailwindcss'],
tailwindStylesheet: './src/styles/app.css',
tailwindFunctions: ['clsx'], // optional
};
Note to self: Investigate https://github.com/remarkjs/remark