Skip to main content

ESLint

About

  • ESLint is a static code analyser for Javasvcript code. It lets you find and fix problems in your JavaScript code
  • ESLint statically analyzes your code to quickly find problems. It is built into most text editors and you can run ESLint as part of your continuous integration pipeline.

ESLint Plugins

Depending upon the project need or whether you are using React or Angular or Node, you may use different ESLint plugins:

For TypeScript based projects:

For TypeScript based Nestjs (Nodejs) - projects

  • eslint-plugin-jsdoc: JSDoc linting rules for ESLint
  • eslint-plugin-security: ESLint rules for Node Security, helps identify potential security hotspots, but finds a lot of false positives which need triage by a human.
  • eslint-plugin-sonarjs: eslint-plugin-sonarjs is an ESLint plugin maintained by Sonar, designed to help developers write Clean Code. This plugin exposes to ESLint users all original JS/TS rules from SonarJS, an analyzer for JavaScript and TypeScript within the Sonar ecosystem.

For React based projects:

For projects using prettier as formatting tool:

Prettier
  • prettier: Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary.
ESLint plugins for Prettier

Prerequisites

  • Node.js (^18.18.0, ^20.9.0, or >=21.1.0) built with SSL support. (If you are using an official Node.js distribution, SSL is always built in.)

Installation

Installation for Angular projects

@TODO

Installation for Nodejs - Expressjs projects

@TODO

Installation for Nodejs - Nestjs projects

Navigate to your project directory and install npm packages required for ESLint, ESLint plugins and configurations.

  • If using npm
npm install globals \
eslint \
@eslint/js \
@eslint/eslintrc \
typescript-eslint \
eslint-plugin-jsdoc \
eslint-plugin-security \
eslint-plugin-sonarjs \
prettier \
eslint-config-prettier \
eslint-plugin-prettier \
--save-dev

Installation for React projects using TypeScript

Navigate to your project directory and install npm packages required for ESLint, ESLint plugins and configurations.

  • If using npm
npm install globals \
eslint @eslint/js typescript-eslint \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-react-refresh \
eslint-plugin-jsx-a11y \
prettier eslint-config-prettier eslint-plugin-prettier \
--save-dev
  • Or if using yarn
yarn add globals \
eslint @eslint/js typescript-eslint \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-react-refresh \
eslint-plugin-jsx-a11y
prettier eslint-config-prettier eslint-plugin-prettier \
--dev
warning

Remember to save these as devDependencies in your project.

Config file for eslint.config.js

@TODO
@TODO
// @ts-check
import eslint from '@eslint/js';
import jsdoc from 'eslint-plugin-jsdoc';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import securityPlugin from 'eslint-plugin-security';
import sonarjs from 'eslint-plugin-sonarjs';
import globals from 'globals';
import tseslint from 'typescript-eslint';
const { configs: securityConfigs } = securityPlugin;

export default tseslint.config(
{
ignores: [
'eslint.config.mjs',
'node_modules',
'**/node_modules/**',
'**/*.js',
'**/*.d.ts',
],
},
// ESLint Configs
eslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,

// ESLint Plugins
// Prettier plugin
eslintPluginPrettierRecommended,

// JSdoc plugin
jsdoc.configs['flat/recommended'],

// Security plugin
securityConfigs.recommended,

// Sonar plugin
sonarjs.configs.recommended,

// Globals
{
languageOptions: {
globals: {
...globals.node,
...globals.jest,
},
ecmaVersion: 5,
sourceType: 'module',
parserOptions: {
project: ['tsconfig.json', 'tsconfig.spec.json'],
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
plugins: {},
rules: {
// TypeScript Rules
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-floating-promises': 'warn',
'@typescript-eslint/no-unsafe-argument': 'warn',

// JSdoc Rules
'jsdoc/require-jsdoc': 'off',

// EOL, Linebreak, and Indentation Rules
'eol-last': ['error', 'always'],
'linebreak-style': ['error', 'unix'],
'no-trailing-spaces': 'error',
indent: ['error', 'tab', { SwitchCase: 1 }],

// Prettier and Indentation Rules
'prettier/prettier': [
'error',
{
arrowParens: 'always',
endOfLine: 'lf',
semi: true,
singleQuote: true,
tabWidth: 4,
trailingComma: 'es5',
useTabs: true,
},
],

// Security Rules
'security/detect-object-injection': 'warn',

// Sonar Rules
'sonarjs/no-duplicate-string': 'warn',
},
},
);
import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';
import pluginReact from 'eslint-plugin-react';
import pluginReactHooks from 'eslint-plugin-react-hooks';
import pluginReactRefresh from 'eslint-plugin-react-refresh';
import pluginJsxA11y from 'eslint-plugin-jsx-a11y';
import pluginEslintPrettieRecommendedConfig from 'eslint-plugin-prettier/recommended';

/** @type {import('eslint').Linter.Config[]} */
export default [
{
files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'],
},
{
languageOptions: {
globals: {
...globals.browser,
},
},
},
pluginJs.configs.recommended,
...tseslint.configs.recommended,
pluginReact.configs.flat.recommended,
pluginJsxA11y.flatConfigs.recommended,
pluginEslintPrettieRecommendedConfig,
{
plugins: {
'react-hooks': pluginReactHooks,
'react-refresh': pluginReactRefresh,
},
settings: {
react: {
version: 'detect',
},
},
rules: {
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
'react-refresh/only-export-components': 'warn',
// Prettier and Indentation Rules
'prettier/prettier': [
'error',
{
arrowParens: 'always',
endOfLine: 'lf',
semi: true,
singleQuote: true,
tabWidth: 4,
trailingComma: 'es5',
useTabs: true,
},
],
indent: ['error', 'tab', { SwitchCase: 1 }],
},
},
{
// Optional: ignore specific files or patterns
ignores: ['**/node_modules/**', 'dist/**', 'build/**'],
},
];
@TODO