# Setup a monorepo

To lint a monorepo solution (multiple projects per repository), ESLint must be setuped to lint the files at the root of the solution (the monorepo workspace) and the files of every project of the monorepo. Execute the following steps to setup ESLint for a monorepo solution 👇

# Setup the workspace

# Install the packages

Open a terminal at the root of the solution workspace (the root of the repository) and install the following packages:

pnpm add -D @workleap/eslint-plugin eslint typescript @typescript-eslint/parser
yarn add -D @workleap/eslint-plugin eslint typescript @typescript-eslint/parser
npm install -D @workleap/eslint-plugin eslint typescript @typescript-eslint/parser

# Configure ESLint

First, create a configuration file named .eslintrc.json at the root of the solution workspace:

workspace
├── packages
├──── app
├────── src
├──────── ...
├────── package.json
├── package.json
├── .eslintrc.json

Then, open the newly created file and extend the default configuration with the monorepo-workspace shared configurations:

.eslintrc.json
{
    "$schema": "https://json.schemastore.org/eslintrc",
    "root": true,
    "extends": "plugin:@workleap/monorepo-workspace"
}

# .eslintignore

ESLint can be configured to ignore certain files and directories while linting by specifying one or more glob patterns.

To do so, first, create a .eslintignore file at the root of the solution workspace:

workspace
├── packages
├──── app
├────── src
├──────── ...
├────── package.json
├── package.json
├── .eslintrc.json
├── .eslintignore

Then, open the newly created file and paste the following ignore rules:

.eslintignore
**/dist/*
node_modules
__snapshots__
storybook-static
pnpm-lock.yaml
package-lock.json
*.md
!.storybook

# Configure indent style

ESLint offers built-in rules for configuring the indentation style of a codebase. However, there's a catch: when VS Code auto-formatting feature is enabled, it might conflict with the configured indentation rules if they are set differently.

To guarantee a consistent indentation, we recommend using EditorConfig on the consumer side. With EditorConfig, the indent style can be configured in a single file and be applied consistently across various formatting tools, including ESlint and VS Code.

First, create a .editorconfig file at the root of the solution workspace:

workspace
├── packages
├──── app
├────── src
├──────── ...
├────── package.json
├── package.json
├── .eslintrc.json
├── .eslintignore
├── .editorconfig

Then, open the newly created file and paste the following configuration:

.editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4

[*.md]
trim_trailing_whitespace = false

# Add a CLI script

At times, especially when running the CI build, it's useful to lint the entire solution using a single command. To do so, add the following script to your solution's workspace package.json file:

workspace
├── packages
├──── app
├────── src
├──────── ...
├────── package.json
├── package.json    <------- (this one!)
├── .eslintrc.json
├── .eslintignore
├── .editorconfig
package.json
{
    "lint:eslint:": "eslint . --max-warnings=0 --cache --cache-location node_modules/.cache/eslint"
}

The script definition may vary depending of your needs and your application configuration. For example, you might want to specify specific file extensions such as --ext .js,.ts,.tsx.

# Setup a project

# Install the package

Open a terminal at the root of the project (packages/app for this example) and install the following package:

pnpm add -D @workleap/eslint-plugin
yarn add -D @workleap/eslint-plugin
npm install -D @workleap/eslint-plugin

# Configure ESLint

First, create a configuration file named .eslintrc.json at the root of the project:

workspace
├── packages
├──── app
├────── src
├──────── ...
├────── package.json
├────── .eslintrc.json
├── package.json
├── .eslintrc.json
├── .eslintignore
├── .editorconfig

Then, open the newly created file and extend the default configuration with one of the shared configurations provided by @workleap/eslint-plugin 👇

# web-application

For an application developed with TypeScript and React, use the following configuration:

packages/app/.eslintrc.json
{
    "$schema": "https://json.schemastore.org/eslintrc",
    "root": true,
    "extends": "plugin:@workleap/web-application"
}

# react-library

For a TypeScript library developed with React, use the following configuration:

packages/app/.eslintrc.json
{
    "$schema": "https://json.schemastore.org/eslintrc",
    "root": true,
    "extends": "plugin:@workleap/react-library"
}

# typescript-library

For a TypeScript library developed without React, use the following configuration:

packages/app/.eslintrc.json
{
    "$schema": "https://json.schemastore.org/eslintrc",
    "root": true,
    "extends": "plugin:@workleap/typescript-library"
}

# Custom configuration

New projects shouldn't have to customize the default configurations offered by @workleap/eslint-plugin. However, if you are in the process of migrating an existing project to use this library or encountering a challenging situation, refer to the custom configuration page to understand how to override or extend the default configurations. Remember, no locked in ❤️✌️.

# Try it 🚀

To test your new ESLint setup, open a JavaScript file, type invalid code (e.g. var x = 0;), then save. Open a terminal at the root of the solution and execute the CLI script added earlier:

pnpm lint:eslint
yarn lint:eslint
npm run lint:eslint

The terminal should output a linting error.