The eslint config that we use at Etch
npm i -D eslint@^9.0.0 prettier @etchteam/eslint-config eslint-plugin-react eslint-plugin-jsx-a11y eslint-plugin-storybookCreate an eslint.config.js file in your project root:
importetchConfigfrom'@etchteam/eslint-config';exportdefaultetchConfig;For projects that don't need the full config, use environment-specific imports to reduce dependencies:
npm i -D eslint prettier @etchteam/eslint-config eslint-plugin-react eslint-plugin-jsx-a11y eslint-plugin-storybook @next/eslint-plugin-next eslint-plugin-react-hooksimportnextjsfrom'@etchteam/eslint-config/nextjs';exportdefaultnextjs;npm i -D eslint prettier @etchteam/eslint-configimportnodejsfrom'@etchteam/eslint-config/nodejs';exportdefaultnodejs;npm i -D eslint prettier @etchteam/eslint-config eslint-plugin-storybook angular-eslintimportangularfrom'@etchteam/eslint-config/angular';exportdefaultangular;npm i -D eslint prettier @etchteam/eslint-config eslint-plugin-react eslint-plugin-jsx-a11y eslint-plugin-storybookimportpreactfrom'@etchteam/eslint-config/preact';exportdefaultpreact;npm i -D eslint prettier @etchteam/eslint-config eslint-plugin-storybook eslint-plugin-litimportwebComponentsfrom'@etchteam/eslint-config/web-components';exportdefaultwebComponents;npm i -D eslint prettier @etchteam/eslint-config @darraghor/eslint-plugin-nestjs-typedimportnestjsfrom'@etchteam/eslint-config/nestjs';exportdefaultnestjs;Build custom configs by combining individual modules:
import{base,json,yaml,react}from'@etchteam/eslint-config';exportdefault[
...base,
...json,
...yaml,
...react,{// Your custom overridesrules: {'react/prefer-read-only-props': 'warn',},},];| Module | Description |
|---|---|
base | Core rules: JS, TypeScript, security, imports, prettier |
json | JSON file linting |
yaml | YAML file linting |
storybook | Storybook best practices |
react | React + JSX accessibility |
| Config | Includes |
|---|---|
nextjs | base + json + yaml + storybook + react + Next.js rules |
nodejs | base + json + yaml + Node.js globals |
angular | base + json + yaml + storybook + Angular rules |
preact | base + json + yaml + storybook + react (Preact settings) |
web-components | base + json + yaml + storybook + Lit rules |
nestjs | base + json + yaml + NestJS rules + Jest globals |
The base, json, and yaml modules have all their plugins included as package dependencies — no extra installs needed.
Other configs require additional plugins to be installed as peer dependencies:
| Config | Additional plugins to install |
|---|---|
Default (@etchteam/eslint-config) | eslint-plugin-reacteslint-plugin-jsx-a11yeslint-plugin-storybook |
react | eslint-plugin-reacteslint-plugin-jsx-a11y |
storybook | eslint-plugin-storybook |
nextjs | eslint-plugin-reacteslint-plugin-jsx-a11yeslint-plugin-storybook@next/eslint-plugin-nexteslint-plugin-react-hooks |
nodejs | None |
preact | eslint-plugin-reacteslint-plugin-jsx-a11yeslint-plugin-storybook |
angular | eslint-plugin-storybookangular-eslint |
web-components | eslint-plugin-storybookeslint-plugin-lit |
nestjs | @darraghor/eslint-plugin-nestjs-typed |
Run the following:
npm i -D husky lint-staged
echo"module.exports = { '*.{ts,tsx,js,jsx,yml,yaml,json}': 'eslint --fix' };"> lint-staged.config.cjs
npx husky init
echo"npx --no-install -- lint-staged"> .husky/pre-commit
Add the following to your lint-staged config:
'*.{ts,tsx,js,jsx,yml,yaml,json}': 'eslint --fix'
Run the following:
mkdir .vscode
echo"{ \"editor.formatOnSave\": false, \"editor.codeActionsOnSave\": { \"source.fixAll.eslint\": \"explicit\" } }"> .vscode/settings.json
# The VSCode prettier extension doesn't read the eslint config, so specific# prettier overrides need to go in a prettier config for format on saveecho"export default { singleQuote: true };"> prettier.config.js
Add the following to .vscode/settings.json:
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}Run the following:
# The VSCode prettier extension doesn't read the eslint config, so specific# prettier overrides need to go in a prettier config for format on saveecho"export default { singleQuote: true };"> prettier.config.jsIf you're upgrading from ESLint 8, follow these steps:
npm install eslint@^9.0.0 @etchteam/eslint-config@^1.0.0Remove your old .eslintrc.* files and create a new eslint.config.js:
importetchConfigfrom'@etchteam/eslint-config';exportdefaultetchConfig;ESLint 9 uses flat config by default, so your existing npm scripts should work without changes.
- Flat config format - More explicit and performant
- ESLint 9 compatibility - Latest features and fixes
- Updated plugins - All plugins updated to latest versions
- Modular configs - Import only what you need for your environment