Skip to content

Installation

  • Node.js ^20.19.0 || >=22.18.0
  • ESLint 10+
RuntimeSupported VersionNotes
Node.js^20.19.0 || >=22.18.0Required by the published packages and CI matrix.
ESLint^10.0.0The current release line targets ESLint 10 flat config.
TypeScript>=5.0.0Optional unless typescript linting is enabled.
Package managerspnpm, npm, yarn, bunCI validates package artifacts; consumer e2e tests load the built package from outside the repo.

In v2, application projects install one public package:

bash
pnpm add -D @santi020k/eslint-config-basic

That package brings the framework config packages used by the composer. You no longer install @santi020k/eslint-config-react, @santi020k/eslint-config-next, or another framework config package in normal application projects.

The full package intentionally installs the framework config packages and integration plugin set as regular dependencies. This keeps app installs boring: one package, one tested dependency graph, and no peer-dependency puzzle for every framework.

The integration package also carries compatible runtime peers for bundled plugins that can be satisfied safely inside the package, including Tailwind, Zod, and GraphQL. Some third-party ESLint plugins may still publish peer ranges that lag behind ESLint 10 or TypeScript 6; those warnings are upstream compatibility metadata rather than missing project setup.

Unused framework configs are lazy-loaded only when enabled or detected. They still affect disk usage, but not lint-time imports. For dependency-sensitive projects, use @santi020k/eslint-config-lite and install only the framework/integration packages you enable.

If your project needs a smaller install or wants to manage framework config packages manually, use the optional lite entry point:

bash
pnpm add -D @santi020k/eslint-config-lite eslint
import { defineConfig } from '@santi020k/eslint-config-lite'
export default await defineConfig()

With @santi020k/eslint-config-lite, install framework and integration config packages only when you enable them:

bash
pnpm add -D @santi020k/eslint-config-react @santi020k/eslint-config-integrations

The full @santi020k/eslint-config-basic package remains the recommended default. Use lite for dependency-sensitive projects and CI caches where manual package ownership is worth the extra setup.

OptionBest ForDependency Model
@santi020k/eslint-config-basicMost application projectsFull tested stack is installed together.
@santi020k/eslint-config-liteDependency-sensitive projects and tight CI cachesCore composer by default; framework and integration config packages are manual.
Individual @santi020k/eslint-config-* packagesAdvanced custom compositionYou assemble imported configs yourself.

For an existing project, basic-eslint doctor --lite-install prints the lite install command from detected project features.

import { defineConfig } from '@santi020k/eslint-config-basic'
export default await defineConfig()

The composer detects TypeScript, frameworks, runtime, and supported optional tooling from your project. You can keep the config minimal or make any choice explicit.

When auto-detection is not enough, optional configs can be enabled by category arrays or by the simple features map.

import { defineConfig } from '@santi020k/eslint-config-basic'
export default await defineConfig({
features: {
playwright: true,
prettier: true,
tailwind: true,
zod: true
}
})

The category arrays also accept enum values or their matching strings:

import { defineConfig, Library, Tool } from '@santi020k/eslint-config-basic'
export default await defineConfig({
libraries: [Library.Tailwind, 'zod'],
tools: [Tool.Prettier, 'cspell']
})

Use booleans when you want to enable framework configs manually:

import { defineConfig } from '@santi020k/eslint-config-basic'
export default await defineConfig({
frameworks: {
next: true,
react: true
},
typescript: true
})

Next.js, Expo, and Remix automatically include React rules when needed.

Skip linting build artifacts or generated folders by passing ignores on eslintConfig()—same effect as a leading flat-config block that only sets ignores, without wrapping the export in an extra array.

import { defineConfig } from '@santi020k/eslint-config-basic'
export default await defineConfig({
ignores: ['dist/**', 'coverage/**']
})

See Configuration for presets, monorepo projects, and ESLint working-directory notes.

Project TypePackage To InstallEnable With
JavaScript@santi020k/eslint-config-basiceslintConfig()
JavaScript, manual packages@santi020k/eslint-config-liteeslintConfig()
TypeScript@santi020k/eslint-config-basictypescript: true or auto-detection
React@santi020k/eslint-config-basicframeworks.react: true
Next.js@santi020k/eslint-config-basicframeworks.next: true
Astro@santi020k/eslint-config-basicframeworks.astro: true
Vue@santi020k/eslint-config-basicframeworks.vue: true
Svelte@santi020k/eslint-config-basicframeworks.svelte: true
Solid@santi020k/eslint-config-basicframeworks.solid: true
Angular@santi020k/eslint-config-basicframeworks.angular: true
NestJS@santi020k/eslint-config-basicframeworks.nest: true
Hono@santi020k/eslint-config-basicframeworks.hono: true
Preact@santi020k/eslint-config-basicframeworks.preact: true
Qwik@santi020k/eslint-config-basicframeworks.qwik: true
Remix@santi020k/eslint-config-basicframeworks.remix: true
Expo@santi020k/eslint-config-basicframeworks.expo: true
Vite@santi020k/eslint-config-basicframeworks.vite: true
Slidev@santi020k/eslint-config-basicframeworks.slidev: true

Optional integrations still use the same categories:

CategoryConfigure ThroughDocumentation
LibrarieslibrariesLibraries
TestingtestingTesting
FormatsformatsFormats
ToolstoolsTools
ExtensionsextensionsExtensions

Use features or its alias integrations when you prefer one boolean map instead of separate category arrays.

If you are upgrading from v1, read the v1 to v2 migration guide. The short version is: remove extra @santi020k/eslint-config-* framework installs from your app and replace imported framework values with true.

Did this page help?

One click helps us spot documentation that needs another pass. No personal data is sent.