Skip to content

base

npm version License: MIT Node.js ESLint

> Strict ESLint flat config for TypeScript projects. Extends @jmlweb/eslint-config-base-js with strict type-checked rules.

> ๐Ÿ”ง Maintenance mode: only dependency and security updates, no new rules. For new projects use @jmlweb/oxlint-config-base. To move an existing project, see the migration guide.

  • ๐Ÿ”’ Strict type checking: strictTypeChecked and stylisticTypeChecked from typescript-eslint, with projectService
  • ๐Ÿ›ก๏ธ No any: no-explicit-any is an error
  • ๐Ÿ“ฆ Type-only imports: inline type style, plus automatic import and export sorting
  • ๐ŸŽฏ Opinionated: no enums (use const maps), no default exports, no parameter mutation
  • ๐ŸŽจ Prettier compatible: disables rules that conflict with Prettier
Terminal window
npm install --save-dev @jmlweb/eslint-config-base eslint @eslint/js typescript-eslint eslint-config-prettier eslint-plugin-simple-import-sort

@jmlweb/eslint-config-base-js is a regular dependency and installs automatically.

> ๐Ÿ’ก Upgrading? See the Migration Guide.

eslint.config.js
import baseConfig from '@jmlweb/eslint-config-base';
export default [
...baseConfig,
// Project-specific overrides
];
eslint.config.js
import baseConfig from '@jmlweb/eslint-config-base';
export default [
...baseConfig,
{
files: ['**/*.test.ts', '**/*.test.tsx'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'no-console': 'off',
},
},
{
ignores: ['dist/', 'build/', 'node_modules/'],
},
];
eslint.config.js
import baseConfig from '@jmlweb/eslint-config-base';
export default [
...baseConfig,
{
files: ['*.config.ts', '*.config.js'],
rules: {
'no-restricted-exports': 'off',
},
},
];
eslint.config.js
import baseConfig from '@jmlweb/eslint-config-base';
export default [
...baseConfig,
{
files: ['**/*.ts', '**/*.tsx'],
rules: {
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/consistent-type-imports': 'off',
},
},
];

Applied to **/*.ts and **/*.tsx (plus the JavaScript rules from base-js for .js, .mjs and .cjs).

  • โœ… typescript-eslint recommended, strictTypeChecked and stylisticTypeChecked
  • โœ… parserOptions.projectService: true (requires a tsconfig.json)
  • โœ… Import and export sorting, Prettier conflict resolution
  • โœ… All rules from @jmlweb/eslint-config-base-js
Rule Setting
@typescript-eslint/no-explicit-any error
@typescript-eslint/explicit-function-return-type off (return types are inferred)
@typescript-eslint/no-unused-vars error, _-prefixed args and variables ignored
@typescript-eslint/consistent-type-imports error, type-imports with inline fix
@typescript-eslint/consistent-type-definitions error, prefer type
@typescript-eslint/no-require-imports error
@typescript-eslint/naming-convention error, see below
no-restricted-syntax (TSEnumDeclaration) error, use const maps
no-restricted-exports error, no default exports
no-param-reassign error, including properties

Naming: types PascalCase; variables camelCase or UPPER_CASE (exported consts may also be PascalCase); functions camelCase.

Imports are sorted and type-only imports are enforced.

Before:

import { Component } from './component';
import React, { useState } from 'react';
import { User } from './types';
import fs from 'fs';

After eslint --fix:

import fs from 'fs';
import React, { useState } from 'react';
import { type User } from './types';
import { Component } from './component';
  • โœ… TypeScript projects that want strict, type-aware linting
  • โœ… Teams that want one consistent style (named exports, const maps, immutability)
  • โœ… A base for the React, Node.js and Astro configs

For JavaScript-only projects use @jmlweb/eslint-config-base-js. For React, Node.js or Astro use -react, -node or -astro. For new projects prefer @jmlweb/oxlint-config-base.

Spread the config, then add objects after it. Later entries win.

eslint.config.js
import baseConfig from '@jmlweb/eslint-config-base';
export default [
...baseConfig,
{
files: ['**/*.ts'],
rules: {
'@typescript-eslint/explicit-function-return-type': 'error',
},
},
];
{
"scripts": {
"lint": "eslint .",
"lint:fix": "eslint . --fix"
}
}
Terminal window
npm run lint
  • Node.js >= 22.12.0
  • ESLint ^9.0.0 || ^10.0.0 (flat config)
  • TypeScript project with a tsconfig.json (versions supported by typescript-eslint 8)
  • eslint (^9.0.0 || ^10.0.0)
  • @eslint/js (^9.0.0 || ^10.0.0)
  • typescript-eslint (^8.0.0)
  • eslint-config-prettier (^9.1.0 || ^10.0.0)
  • eslint-plugin-simple-import-sort (^12.0.0 || ^13.0.0 || ^14.0.0)

Node.js 18 and 20 are end-of-life. Node.js >= 22.12.0 is now required: it is the first Node.js 22 release that can require() ES modules without a flag, which the CommonJS build needs to load ESM-only plugins. Peer ranges were also widened (eslint-plugin-simple-import-sort 13 and 14).

  1. Upgrade Node.js to 22.12.0 or later.
  2. Update the package: npm install --save-dev @jmlweb/eslint-config-base@latest.

See the Changelog.

MIT