@nx/eslint - Migrations
For an overview of the plugin and setup instructions, see the @nx/eslint introduction.
The @nx/eslint plugin provides various migrations to help you migrate to newer versions of eslint projects within your Nx workspace. Below is a complete reference for all available migrations.
24.0.x
Section titled “24.0.x”remove-deprecated-executors
Section titled “remove-deprecated-executors”Version: 24.0.0-beta.3
Converts targets using the removed @nx/eslint executors to inferred tasks; an AI prompt finishes the targets the converter cannot convert safely and validates the project graph.
Convert @nx/eslint:lint targets to inferred tasks
Section titled “Convert @nx/eslint:lint targets to inferred tasks”Nx 24 removes the @nx/eslint:lint executor and its @nrwl/linter:eslint alias. The migration registers @nx/eslint/plugin in nx.json and converts the targets that use those executors to inferred tasks. Options the plugin does not infer stay on the target. A target with nothing left to override is removed from project configuration. When several projects share the same remaining options, those options move to a targetDefaults entry scoped to the plugin. targetDefaults entries keyed by a removed executor are removed once no target uses that executor.
The migration lists the targets the converter cannot convert safely. In agentic runs, an AI prompt finishes them and validates the project graph.
Sample code changes
Section titled “Sample code changes”Before
Section titled “Before”{ "name": "myapp", "targets": { "lint": { "executor": "@nx/eslint:lint", "options": { "eslintConfig": "myapp/.eslintrc.json" } } }}{ "plugins": [ { "plugin": "@nx/eslint/plugin", "options": { "targetName": "lint" } } ]}update-24-0-0-replace-set-parser-options-project
Section titled “update-24-0-0-replace-set-parser-options-project”Version: 24.0.0-beta.5
Replaces the removed setParserOptionsProject generator option with enableTypedLinting in the generator defaults of nx.json and project configuration, so generators resolve typed linting as before.
Replace setParserOptionsProject with enableTypedLinting in generator defaults
Section titled “Replace setParserOptionsProject with enableTypedLinting in generator defaults”Nx 24 removes the deprecated setParserOptionsProject generator option, which enableTypedLinting replaces. The migration rewrites the generator defaults in nx.json, in angular.json projects, in project.json files and in the nx key of project package.json files. It handles both the flat form (@nx/react:library) and the nested form (@nx/react -> library).
It covers every generator that accepted the option and still exists in Nx 24:
application:@nx/angular,@nx/detox,@nx/expo,@nx/express,@nx/nest,@nx/next,@nx/node,@nx/nuxt,@nx/react,@nx/react-native,@nx/vueand@nx/weblibrary:@nx/angular,@nx/expo,@nx/js,@nx/nest,@nx/next,@nx/node,@nx/react,@nx/react-nativeand@nx/vueconfiguration:@nx/cypressand@nx/playwright@nx/angular:add-lintingand@nx/plugin:plugin
Generators enabled typed linting when either option was true, and the migrated defaults keep that result. setParserOptionsProject: true becomes enableTypedLinting: true, and setParserOptionsProject: false is dropped. When the options are set in several places (nested and flat keys, nx.json, angular.json, project.json and package.json), the migration rewrites each one so the merged default doesn’t change.
The migration doesn’t update scripts that pass --setParserOptionsProject to nx g. Pass --enableTypedLinting instead. Most generators ignore the removed flag without an error, so an unchanged script generates projects without typed linting.
Sample code changes
Section titled “Sample code changes”Before
Section titled “Before”{ "generators": { "@nx/react:library": { "setParserOptionsProject": true }, "@nx/node": { "application": { "setParserOptionsProject": false, "framework": "express" } } }}{ "generators": { "@nx/react:library": { "enableTypedLinting": true }, "@nx/node": { "application": { "framework": "express" } } }}A project default of enableTypedLinting: false didn’t turn typed linting off while nx.json set setParserOptionsProject: true, so the migration sets it to true:
Before
Section titled “Before”{ "generators": { "@nx/react:library": { "enableTypedLinting": false } }}{ "generators": { "@nx/react:library": { "enableTypedLinting": true } }}23.1.x
Section titled “23.1.x”update-23-1-0-convert-to-flat-config
Section titled “update-23-1-0-convert-to-flat-config”Version: 23.1.0-beta.0
Convert remaining ESLint configs to flat config for ESLint v9 and keep the workspace lint-passing, disabling rules whose preset defaults changed.
Requires
Section titled “Requires”| Name | Version |
|---|---|
eslint | >=9.0.0 |
update-23-1-0-remove-removed-typescript-eslint-extension-rules
Section titled “update-23-1-0-remove-removed-typescript-eslint-extension-rules”Version: 23.1.0-beta.5
Handle typescript-eslint rules removed in v8 in ESLint flat configs, since referencing a removed rule stops the config from loading. Deletes the removed formatting/extension rules (e.g. @typescript-eslint/no-extra-semi) and rewrites the safe 1:1 renames (no-throw-literal -> only-throw-error, no-useless-template-literals -> no-unnecessary-template-expression) to preserve enforcement.
update-23-1-0-migrate-ban-types-rule
Section titled “update-23-1-0-migrate-ban-types-rule”Version: 23.1.0-beta.5
Migrate the removed @typescript-eslint/ban-types rule to its v8 successors (no-empty-object-type, no-unsafe-function-type, no-wrapper-object-types), whose options do not map 1:1 - so it is driven by an AI prompt rather than a deterministic codemod.
23.1.0-package-updates
Section titled “23.1.0-package-updates”Version: 23.1.0-beta.0
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
eslint | ^9.8.0 | Updated only |
typescript-eslint | ^8.40.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.40.0 | Updated only |
@typescript-eslint/parser | ^8.40.0 | Updated only |
@typescript-eslint/utils | ^8.40.0 | Updated only |
@typescript-eslint/type-utils | ^8.40.0 | Updated only |
@typescript-eslint/rule-tester | ^8.40.0 | Updated only |
@typescript-eslint/scope-manager | ^8.40.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.40.0 | Updated only |
eslint-config-prettier | ^10.0.0 | Updated only |
23.1.0-typescript-eslint-package-updates
Section titled “23.1.0-typescript-eslint-package-updates”Version: 23.1.0-beta.0
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.58.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.58.0 | Updated only |
@typescript-eslint/parser | ^8.58.0 | Updated only |
@typescript-eslint/utils | ^8.58.0 | Updated only |
@typescript-eslint/rule-tester | ^8.58.0 | Updated only |
@typescript-eslint/scope-manager | ^8.58.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.58.0 | Updated only |
23.1.0-@typescript-eslint-package-updates
Section titled “23.1.0-@typescript-eslint-package-updates”Version: 23.1.0-beta.0
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.58.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.58.0 | Updated only |
@typescript-eslint/parser | ^8.58.0 | Updated only |
@typescript-eslint/utils | ^8.58.0 | Updated only |
@typescript-eslint/rule-tester | ^8.58.0 | Updated only |
@typescript-eslint/scope-manager | ^8.58.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.58.0 | Updated only |
23.0.x
Section titled “23.0.x”rewrite-eslint-internal-subpath-imports
Section titled “rewrite-eslint-internal-subpath-imports”Version: 23.0.0-beta.17
Rewrites @nx/eslint/src/* subpath imports now that the ./src/* subpath is no longer exposed by @nx/eslint’s exports map. Named imports/exports of public symbols are routed to @nx/eslint and the rest to the new @nx/eslint/internal entry; require, dynamic import and jest.mock calls reference the whole module and are routed to @nx/eslint/internal.
update-23-0-0-migrate-create-nodes-v2-import
Section titled “update-23-0-0-migrate-create-nodes-v2-import”Version: 23.0.0-beta.24
Rename imports of createNodesV2 from @nx/eslint/plugin to the canonical createNodes export.
Rename createNodesV2 imports to createNodes
Section titled “Rename createNodesV2 imports to createNodes”@nx/eslint renamed its primary inferred-plugin export from createNodesV2 to createNodes. The createNodesV2 name is preserved as a deprecated alias for now, but new code should use createNodes.
This migration scans every .ts, .tsx, .cts, and .mts file in your workspace and rewrites named imports and re-exports of createNodesV2 from @nx/eslint/plugin to createNodes.
Sample Code Changes
Section titled “Sample Code Changes”Before
Section titled “Before”import { createNodesV2 } from '@nx/eslint/plugin';import { createNodes } from '@nx/eslint/plugin';Aliases are preserved (createNodesV2 as cn becomes createNodes as cn), and if a file already imports both names ({ createNodes, createNodesV2 }) the redundant binding is dropped.
What is not rewritten
Section titled “What is not rewritten”Only static import/export named bindings from @nx/eslint/plugin are rewritten. Namespace imports, dynamic import(...), require(...) destructuring, and property access such as plugin.createNodesV2 are left untouched — they keep working through the createNodesV2 runtime alias. Update those by hand if you want to drop the deprecated name everywhere.
22.7.x
Section titled “22.7.x”update-executor-lint-inputs
Section titled “update-executor-lint-inputs”Version: 22.7.0-beta.12
Add missing inputs to @nx/eslint:lint executor target defaults
21.5.x
Section titled “21.5.x”21.5.0-typescript-eslint-package-updates
Section titled “21.5.0-typescript-eslint-package-updates”Version: 21.5.0-beta.2
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.40.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.40.0 | Updated only |
@typescript-eslint/parser | ^8.40.0 | Updated only |
@typescript-eslint/utils | ^8.40.0 | Updated only |
@typescript-eslint/rule-tester | ^8.40.0 | Updated only |
@typescript-eslint/scope-manager | ^8.40.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.40.0 | Updated only |
21.5.0-@typescript-eslint-package-updates
Section titled “21.5.0-@typescript-eslint-package-updates”Version: 21.5.0-beta.2
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.40.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.40.0 | Updated only |
@typescript-eslint/parser | ^8.40.0 | Updated only |
@typescript-eslint/utils | ^8.40.0 | Updated only |
@typescript-eslint/rule-tester | ^8.40.0 | Updated only |
@typescript-eslint/scope-manager | ^8.40.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.40.0 | Updated only |
21.2.x
Section titled “21.2.x”21.2.0-typescript-eslint-package-updates
Section titled “21.2.0-typescript-eslint-package-updates”Version: 21.2.0-beta.0
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.29.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.29.0 | Updated only |
@typescript-eslint/parser | ^8.29.0 | Updated only |
@typescript-eslint/utils | ^8.29.0 | Updated only |
@typescript-eslint/rule-tester | ^8.29.0 | Updated only |
@typescript-eslint/scope-manager | ^8.29.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.29.0 | Updated only |
21.2.0-@typescript-eslint-package-updates
Section titled “21.2.0-@typescript-eslint-package-updates”Version: 21.2.0-beta.0
Packages
Section titled “Packages”The following packages will be updated:
| Name | Version | Always add to package.json |
|---|---|---|
typescript-eslint | ^8.29.0 | Updated only |
@typescript-eslint/eslint-plugin | ^8.29.0 | Updated only |
@typescript-eslint/parser | ^8.29.0 | Updated only |
@typescript-eslint/utils | ^8.29.0 | Updated only |
@typescript-eslint/rule-tester | ^8.29.0 | Updated only |
@typescript-eslint/scope-manager | ^8.29.0 | Updated only |
@typescript-eslint/typescript-estree | ^8.29.0 | Updated only |