A collection of modular ESLint configs β import only what you need and compose them with defineConfig().
- JavaScript β base rules, import sorting, unicorn, promise, ESLint comments
- TypeScript β type-aware linting via XO TypeScript config
- React β JSX, hooks, and import rules
- Node.js β Node globals and
eslint-plugin-nrules - Browser β browser globals and restricted globals
- JSON β
.json,.jsonc,.json5linting - Markdown β Markdown linting
- Svelte β Svelte component and runes module linting
- Vitest β test file rules
- Prettier β formatting integration
yarn add -D @ver0/eslint-config eslintEach config requires its own peer dependencies β see Available Configs below.
Import the configs you need and compose them with defineConfig():
// eslint.config.js
import {defineConfig} from 'eslint/config';
import javascript from '@ver0/eslint-config/javascript.js';
import node from '@ver0/eslint-config/node.js';
import json from '@ver0/eslint-config/json.js';
import markdown from '@ver0/eslint-config/markdown.js';
import prettier from '@ver0/eslint-config/prettier.js';
export default defineConfig(javascript, node, ...json, markdown, prettier);Note: The JSON config exports an array of 3 configs (JSON, JSONC, JSON5), so spread it with
...json.
Each config is a standalone module. Import it to enable, skip it to disable β no options object needed. If the required peer dependencies are not installed, you'll get a clear error listing exactly what's missing.
-
JavaScript β base rules, import sorting, unicorn, promise, ESLint comments. Always include this one β other configs build on top of it.
yarn add -D @eslint/js @eslint-community/eslint-plugin-eslint-comments eslint-plugin-import eslint-plugin-promise eslint-plugin-unicorn eslint-plugin-no-use-extend-native eslint-config-xo
-
TypeScript β type-aware linting rules. Also exports
typescriptUnsafeto disable strict type-safety rules.yarn add -D eslint-config-xo-typescript typescript
-
React β React, JSX, and hooks rules.
yarn add -D eslint-plugin-import eslint-config-xo-react
-
Node.js β Node.js globals and
eslint-plugin-nrules.yarn add -D globals eslint-plugin-n
-
Browser β browser globals and restricted globals (prevents accidental use of confusing browser globals like
event,name, etc.).yarn add -D globals confusing-browser-globals
-
JSON β linting for
.json,.jsonc, and.json5files. Exports an array of 3 configs β spread it with...jsonindefineConfig().yarn add -D @eslint/json
-
Markdown β Markdown linting.
yarn add -D @eslint/markdown
-
Svelte β Svelte component and runes module linting via
eslint-plugin-svelte. Exports an array of configs β spread it with...svelteindefineConfig().yarn add -D eslint-plugin-svelte
-
Vitest β rules for test and benchmark files (
*.test.*,*.benchmark.*).yarn add -D @vitest/eslint-plugin
-
Prettier β formatting integration. Include this last so it overrides conflicting rules.
yarn add -D eslint-plugin-prettier eslint-config-prettier prettier
Node.js API project:
// eslint.config.js
import {defineConfig} from 'eslint/config';
import javascript from '@ver0/eslint-config/javascript.js';
import typescript from '@ver0/eslint-config/typescript.js';
import node from '@ver0/eslint-config/node.js';
import json from '@ver0/eslint-config/json.js';
import markdown from '@ver0/eslint-config/markdown.js';
import vitest from '@ver0/eslint-config/vitest.js';
import prettier from '@ver0/eslint-config/prettier.js';
export default defineConfig(javascript, typescript, node, ...json, markdown, vitest, prettier);React web application:
// eslint.config.js
import {defineConfig} from 'eslint/config';
import javascript from '@ver0/eslint-config/javascript.js';
import typescript from '@ver0/eslint-config/typescript.js';
import react from '@ver0/eslint-config/react.js';
import browser from '@ver0/eslint-config/browser.js';
import json from '@ver0/eslint-config/json.js';
import vitest from '@ver0/eslint-config/vitest.js';
import prettier from '@ver0/eslint-config/prettier.js';
export default defineConfig(javascript, typescript, react, browser, ...json, vitest, prettier);SvelteKit application:
// eslint.config.js
import {defineConfig} from 'eslint/config';
import javascript from '@ver0/eslint-config/javascript.js';
import typescript from '@ver0/eslint-config/typescript.js';
import svelte from '@ver0/eslint-config/svelte.js';
import browser from '@ver0/eslint-config/browser.js';
import json from '@ver0/eslint-config/json.js';
import vitest from '@ver0/eslint-config/vitest.js';
import prettier from '@ver0/eslint-config/prettier.js';
export default defineConfig(javascript, typescript, ...svelte, browser, ...json, vitest, prettier);This package also provides an opinionated default Prettier configuration that you can extend from.
// .prettierrc.js
import ver0Config from '@ver0/eslint-config/.prettierrc.js';
export default {
...ver0Config,
// Override any settings if needed
// printWidth: 100,
};For consistent formatting across different editors, you can copy our .editorconfig that is aligned with our Prettier
configuration:
# .editorconfig
[*]
indent_style = tab
tab_width = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
[*.yml]
indent_style = space
indent_size = 2Rules conflicting with your existing setup? You can override specific rules by adding a config after ours:
// eslint.config.js
import {defineConfig} from 'eslint/config';
import javascript from '@ver0/eslint-config/javascript.js';
import node from '@ver0/eslint-config/node.js';
import prettier from '@ver0/eslint-config/prettier.js';
export default defineConfig(javascript, node, prettier, {
rules: {
'some-rule': 'off', // Override any rule
},
});