Skip to content

node

npm version License: MIT Node.js ESLint

> ESLint flat config for Node.js with TypeScript. Extends @jmlweb/eslint-config-base with eslint-plugin-n rules and Node.js globals.

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

  • ๐ŸŸข Node.js rules: eslint-plugin-n recommended plus stricter module, process and API rules
  • ๐ŸŒ Node.js globals: process, Buffer, __dirname and friends
  • ๐Ÿ”’ Strict TypeScript: everything from @jmlweb/eslint-config-base
  • ๐Ÿ“ฆ node: protocol: built-in modules must use the node: prefix
  • ๐ŸŽจ Prettier compatible: disables rules that conflict with Prettier
Terminal window
npm install --save-dev @jmlweb/eslint-config-node @jmlweb/eslint-config-base eslint @eslint/js typescript-eslint eslint-config-prettier eslint-plugin-simple-import-sort eslint-plugin-n globals

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

eslint.config.js
import nodeConfig from '@jmlweb/eslint-config-node';
export default [
...nodeConfig,
// Project-specific overrides
];
eslint.config.js
import nodeConfig from '@jmlweb/eslint-config-node';
export default [
...nodeConfig,
{
files: ['**/*.test.ts', '**/*.spec.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'n/no-process-exit': 'off',
},
},
{
ignores: ['dist/', 'build/', 'node_modules/'],
},
];
eslint.config.js
import nodeConfig from '@jmlweb/eslint-config-node';
export default [
...nodeConfig,
{
files: ['**/*.ts', '**/*.js'],
rules: {
'n/no-process-exit': 'warn',
'n/no-unpublished-import': 'off',
},
},
];

Applied to **/*.ts, **/*.js, **/*.mjs and **/*.cjs, with globals.node enabled.

  • โœ… Everything from @jmlweb/eslint-config-base
  • โœ… eslint-plugin-n flat/recommended
  • โœ… Import and export sorting, Prettier conflict resolution
Rule Level
n/no-process-exit, n/process-exit-as-throw error
n/no-missing-import, n/no-missing-require error
n/no-unpublished-import, n/no-unpublished-require error
n/no-extraneous-import, n/no-extraneous-require error
n/no-deprecated-api warn
n/no-callback-literal, n/no-new-require, n/no-path-concat error
n/prefer-global/* (buffer, console, process, url, url-search-params) error (always)
n/prefer-promises/dns, n/prefer-promises/fs error
n/prefer-node-protocol error

Imports are sorted and type-only imports are enforced.

Before:

import { Component } from './component';
import express from 'express';
import fs from 'node:fs';
import { User } from './types';

After eslint --fix:

import express from 'express';
import fs from 'node:fs';
import { type User } from './types';
import { Component } from './component';
  • โœ… Node.js libraries, CLIs and services written in TypeScript
  • โœ… Catching missing or unpublished imports and deprecated APIs
  • โœ… Strict type-aware linting for backend code

For non-Node.js TypeScript use @jmlweb/eslint-config-base. For new projects prefer @jmlweb/oxlint-config-node.

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

eslint.config.js
import nodeConfig from '@jmlweb/eslint-config-node';
export default [
...nodeConfig,
{
files: ['scripts/**/*.js'],
rules: {
'n/no-process-exit': 'off',
},
},
];
{
"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-n (^17.0.0 || ^18.0.0)
  • eslint-plugin-simple-import-sort (^12.0.0 || ^13.0.0 || ^14.0.0)
  • globals (^15.0.0 || ^16.0.0 || ^17.0.0)
  • @jmlweb/eslint-config-base (^3.0.3)

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-n 18, 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-node@latest.

See the Changelog.

MIT