Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs(linter): add recipe for flat config converter #18614

Merged
merged 4 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions docs/generated/manifests/menus.json
Original file line number Diff line number Diff line change
Expand Up @@ -2188,6 +2188,14 @@
"isExternal": false,
"children": [],
"disableCollapsible": false
},
{
"name": "Switching to ESLint's flat config format",
"path": "/recipes/tips-n-tricks/flat-config",
"id": "flat-config",
"isExternal": false,
"children": [],
"disableCollapsible": false
}
],
"disableCollapsible": false
Expand Down Expand Up @@ -3252,6 +3260,14 @@
"isExternal": false,
"children": [],
"disableCollapsible": false
},
{
"name": "Switching to ESLint's flat config format",
"path": "/recipes/tips-n-tricks/flat-config",
"id": "flat-config",
"isExternal": false,
"children": [],
"disableCollapsible": false
}
],
"disableCollapsible": false
Expand Down Expand Up @@ -3400,6 +3416,14 @@
"children": [],
"disableCollapsible": false
},
{
"name": "Switching to ESLint's flat config format",
"path": "/recipes/tips-n-tricks/flat-config",
"id": "flat-config",
"isExternal": false,
"children": [],
"disableCollapsible": false
},
{
"name": "Troubleshooting",
"path": "/recipes/troubleshooting",
Expand Down
30 changes: 30 additions & 0 deletions docs/generated/manifests/nx.json
Original file line number Diff line number Diff line change
Expand Up @@ -2728,6 +2728,16 @@
"isExternal": false,
"path": "/recipes/tips-n-tricks/yarn-pnp",
"tags": ["yarn", "Plug and Play"]
},
{
"id": "flat-config",
"name": "Switching to ESLint's flat config format",
"description": "",
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint",
"itemList": [],
"isExternal": false,
"path": "/recipes/tips-n-tricks/flat-config",
"tags": ["eslint", "flat config"]
}
],
"isExternal": false,
Expand Down Expand Up @@ -4056,6 +4066,16 @@
"isExternal": false,
"path": "/recipes/tips-n-tricks/yarn-pnp",
"tags": ["yarn", "Plug and Play"]
},
{
"id": "flat-config",
"name": "Switching to ESLint's flat config format",
"description": "",
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint",
"itemList": [],
"isExternal": false,
"path": "/recipes/tips-n-tricks/flat-config",
"tags": ["eslint", "flat config"]
}
],
"isExternal": false,
Expand Down Expand Up @@ -4242,6 +4262,16 @@
"path": "/recipes/tips-n-tricks/yarn-pnp",
"tags": ["yarn", "Plug and Play"]
},
"/recipes/tips-n-tricks/flat-config": {
"id": "flat-config",
"name": "Switching to ESLint's flat config format",
"description": "",
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint",
"itemList": [],
"isExternal": false,
"path": "/recipes/tips-n-tricks/flat-config",
"tags": ["eslint", "flat config"]
},
"/recipes/troubleshooting": {
"id": "troubleshooting",
"name": "Troubleshooting",
Expand Down
2 changes: 1 addition & 1 deletion docs/generated/manifests/packages.json
Original file line number Diff line number Diff line change
Expand Up @@ -1142,7 +1142,7 @@
"type": "generator"
},
"/packages/linter/generators/convert-to-flat-config": {
"description": "Convert an Nx workspace to a Flat ESLint config.",
"description": "Convert an Nx workspace's ESLint configs to use Flat Config.",
"file": "generated/packages/linter/generators/convert-to-flat-config.json",
"hidden": false,
"name": "convert-to-flat-config",
Expand Down
18 changes: 18 additions & 0 deletions docs/generated/manifests/tags.json
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,24 @@
"path": "/recipes/tips-n-tricks/yarn-pnp"
}
],
"eslint": [
{
"description": "",
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint",
"id": "flat-config",
"name": "Switching to ESLint's flat config format",
"path": "/recipes/tips-n-tricks/flat-config"
}
],
"flat config": [
{
"description": "",
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint",
"id": "flat-config",
"name": "Switching to ESLint's flat config format",
"path": "/recipes/tips-n-tricks/flat-config"
}
],
"deno": [
{
"description": "",
Expand Down
2 changes: 1 addition & 1 deletion docs/generated/packages-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -1125,7 +1125,7 @@
"type": "generator"
},
{
"description": "Convert an Nx workspace to a Flat ESLint config.",
"description": "Convert an Nx workspace's ESLint configs to use Flat Config.",
"file": "generated/packages/linter/generators/convert-to-flat-config.json",
"hidden": false,
"name": "convert-to-flat-config",
Expand Down
1 change: 1 addition & 0 deletions docs/generated/packages/linter/documents/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ nx lint my-lib

## Utils

- [convert-to-flat-config](/packages/linter/generators/convert-to-flat-config) - Converts the workspace's [ESLint](https://eslint.org/) configs to the new [Flat Config](https://eslint.org/blog/2022/08/new-config-system-part-2)
- **Deprecated** [convert-tslint-to-eslint](/packages/angular/generators/convert-tslint-to-eslint) - Converts a project linter from [TSLint](https://palantir.github.io/tslint/) to [ESLint](https://eslint.org/)

## ESLint plugin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"$schema": "http://json-schema.org/schema",
"$id": "ConvertToFlatConfig",
"cli": "nx",
"description": "Convert an Nx workspace to a Flat ESLint config.",
"description": "Convert an Nx workspace's ESLint configs to use Flat Config.",
"type": "object",
"properties": {
"skipFormat": {
Expand All @@ -19,7 +19,7 @@
"required": [],
"presets": []
},
"description": "Convert an Nx workspace to a Flat ESLint config.",
"description": "Convert an Nx workspace's ESLint configs to use Flat Config.",
"implementation": "/packages/linter/src/generators/convert-to-flat-config/generator.ts",
"aliases": [],
"hidden": false,
Expand Down
6 changes: 6 additions & 0 deletions docs/map.json
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,12 @@
"id": "yarn-pnp",
"tags": ["yarn", "Plug and Play"],
"file": "shared/recipes/yarn-pnp"
},
{
"name": "Switching to ESLint's flat config format",
"id": "flat-config",
"tags": ["eslint", "flat config"],
"file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint"
}
]
},
Expand Down
1 change: 1 addition & 0 deletions docs/shared/packages/linter/linter-plugin.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ nx lint my-lib

## Utils

- [convert-to-flat-config](/packages/linter/generators/convert-to-flat-config) - Converts the workspace's [ESLint](https://eslint.org/) configs to the new [Flat Config](https://eslint.org/blog/2022/08/new-config-system-part-2)
- **Deprecated** [convert-tslint-to-eslint](/packages/angular/generators/convert-tslint-to-eslint) - Converts a project linter from [TSLint](https://palantir.github.io/tslint/) to [ESLint](https://eslint.org/)

## ESLint plugin
Expand Down
173 changes: 173 additions & 0 deletions docs/shared/recipes/tips-n-tricks/migrating-to-flat-eslint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# Switching to ESLint's flat config format

Version 8 of ESLint introduced a new configuration format called [Flat Config](https://eslint.org/docs/latest/use/configure/configuration-files-new). The next major version will use this config format by default. The purpose of this format is to:

- push towards a single configuration format (in contrast to the existing `JSON`, `Yaml` and `JS`-based configs)
- enforce explicit native loading (instead of the implicit imports in `JSON` and `Yaml`)
- use a flat cascading of rules (instead of a mix of rules and overrides)

See below a direct comparison between `JSON`, `JS` and `Flat` config:
{% tabs %}
{% tab label="Flat" %}

```js {% fileName="eslint.config.js" %}
// the older versions were magically interpreting all the imports
// in flat config we do it explicitly
const nxPlugin = require('@nx/eslint-plugin');
const js = require('@eslint/js');
const baseConfig = require('./eslint.base.config.js');
const globals = require('globals');
const jsoncParser = require('jsonc-eslint-parser');
const tsParser = require('@typescript-eslint/parser');

module.exports = [
js.configs.recommended,
// this will spread the export blocks from the base config
...baseConfig,
{ plugins: { '@nx': nxPlugin } },
{
languageOptions: {
parser: tsParser,
globals: {
...globals.node,
},
},
rules: {
'@typescript-eslint/explicit-module-boundary-types': ['error'],
},
},
// there are no overrides, all the config blocks are "flat"
{
files: ['*.json'],
languageOptions: {
parser: jsoncParser,
},
rules: {},
},
{
files: ['*.ts', '*.tsx', '*.js', '*.jsx'],
rules: {
'@nx/enforce-module-boundaries': [
'error',
{
enforceBuildableLibDependency: true,
allow: [],
depConstraints: [
{
sourceTag: '*',
onlyDependOnLibsWithTags: ['*'],
},
],
},
],
},
},
];
```

{% /tab %}
{% tab label="JSON" %}

```json {% fileName=".eslintrc.json" %}
{
"root": true,
"parser": "@typescript-eslint/parser",
"env": {
"node": true
},
"extends": ["eslint:recommended", "./.eslintrc.base.json"],
"plugins": ["@nx"],
"rules": {
"@typescript-eslint/explicit-module-boundary-types": "error"
},
"overrides": [
{
"files": ["*.json"],
"parser": "jsonc-eslint-parser",
"rules": {}
},
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {
"@nx/enforce-module-boundaries": [
"error",
{
"enforceBuildableLibDependency": true,
"allow": [],
"depConstraints": [
{
"sourceTag": "*",
"onlyDependOnLibsWithTags": ["*"]
}
]
}
]
}
}
]
}
```

{% /tab %}
{% tab label="JS" %}

```js {% fileName=".eslintrc.js" %}
module.exports = {
root: true,
env: {
node: true,
},
parser: '@typescript-eslint/parser',
extends: ['eslint:recommended', './.eslintrc.base.js'],
plugins: ['@nx'],
rules: {
'@typescript-eslint/explicit-module-boundary-types': ['error'],
},
overrides: [
{
files: ['*.json'],
parser: 'jsonc-eslint-parser',
rules: {},
},
{
files: ['*.ts', '*.tsx', '*.js', '*.jsx'],
rules: {
'@nx/enforce-module-boundaries': [
'error',
{
enforceBuildableLibDependency: true,
allow: [],
depConstraints: [
{
sourceTag: '*',
onlyDependOnLibsWithTags: ['*'],
},
],
},
],
},
},
],
};
```

{% /tab %}
{% /tabs %}

For additional details, head over to [ESLint's official blog post](https://eslint.org/blog/2022/08/new-config-system-part-2/).

Since version 16.7.0, Nx supports the usage of flat config in the [@nx/linter:eslint](/packages/linter/executors/eslint) executor and `@nx/*` generators, and provides an automated config conversion from `.eslintrc.json` config files.

## Converting workspace from .eslintrc.json to flat config

To convert workspace ESLint configurations from the default `.eslintrc.json` to the new flat config you need to run:

```shell
nx g @nx/linter:convert-to-flat-config
```

The generator will go through all the projects and convert their configurations to the new format. It will also convert the base `.eslintrc.json` and `.eslintignore`.

## Correctness and best practices

The purpose of this generator is to create a flat config that works the same way as the original `JSON` config did. Depending on the complexity of your original config, it may be using the `FlatCompat` utility to provide a compatibility wrapper around parts of the original config. You can improve those by following the [official migration guide](https://eslint.org/docs/latest/use/configure/migration-guide).
1 change: 1 addition & 0 deletions docs/shared/reference/sitemap.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@
- [Altering Migration Process](/recipes/tips-n-tricks/advanced-update)
- [Running Custom Commands](/recipes/tips-n-tricks/run-commands-executor)
- [Using Yarn PnP](/recipes/tips-n-tricks/yarn-pnp)
- [Switching to ESLint's flat config format](/recipes/tips-n-tricks/flat-config)
- [Troubleshooting](/recipes/troubleshooting)
- [Resolve Circular Dependencies](/recipes/troubleshooting/resolve-circular-dependencies)
- [Troubleshooting Nx Install Issues](/recipes/troubleshooting/troubleshoot-nx-install-issues)
Expand Down
2 changes: 1 addition & 1 deletion packages/linter/generators.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"convert-to-flat-config": {
"factory": "./src/generators/convert-to-flat-config/generator",
"schema": "./src/generators/convert-to-flat-config/schema.json",
"description": "Convert an Nx workspace to a Flat ESLint config."
"description": "Convert an Nx workspace's ESLint configs to use Flat Config."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "http://json-schema.org/schema",
"$id": "ConvertToFlatConfig",
"cli": "nx",
"description": "Convert an Nx workspace to a Flat ESLint config.",
"description": "Convert an Nx workspace's ESLint configs to use Flat Config.",
"type": "object",
"properties": {
"skipFormat": {
Expand Down