Blog>
Snippets

Optimizing ESLint for a multi-package monorepo

Detail the configuration steps for setting ESLint in a Next.js monorepo environment using Yarn workspaces or Lerna for package management.
module.exports = {
  root: true,
  ignorePatterns: ['node_modules/', 'build/', 'dist/', '.next/'],
  overrides: [
    {
      files: ['*.js', '*.jsx', '*.ts', '*.tsx'],
      parserOptions: {
        project: './packages/*/tsconfig.json',
        tsconfigRootDir: __dirname,
      },
      settings: {
        react: {
          version: 'detect',
        },
      },
      extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:react/recommended',
        'plugin:react-hooks/recommended',
      ],
      rules: {},
    },
  ],
};
This code sets up a root ESLint configuration for a monorepo. It ignores common directories that don't need linting, applies the configuration to all JavaScript and TypeScript files in the packages, and sets up parser options with a wildcard path for tsconfig.json files within the packages. The React version is automatically detected, and recommended rule sets for TypeScript and React are extended.
// In package.json at the monorepo root
{
  "scripts": {
    "lint": "eslint --ext .js,.jsx,.ts,.tsx packages/"
  },
  "workspaces": [
    "packages/*"
  ]
}
Adds a lint script to the root package.json, enabling the 'lint' command to run ESLint across all packages. Also defines Yarn workspaces configuration to manage multiple packages within the monorepo.
// In lerna.json (if using Lerna)
{
  "packages": ["packages/*"],
  "version": "independent",
  "npmClient": "yarn",
  "useWorkspaces": true
}
If using Lerna, this configures Lerna to use Yarn workspaces for package management, allowing Lerna to operate on multiple packages defined in the 'packages' directory.