Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [eprh] Fix `recommended` config for flat config compatibility by poteto · Pull Request #34700 · react/react · GitHub
Skip to content

[eprh] Fix recommended config for flat config compatibility - #34700

Merged
poteto merged 1 commit into
mainfrom
pr34700
Oct 2, 2025
Merged

[eprh] Fix recommended config for flat config compatibility#34700
poteto merged 1 commit into
mainfrom
pr34700

Conversation

@poteto

@potetopoteto commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

Previously, the recommended config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's defineConfig() helper. This was following eslint's own docs:

With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.

However, isLegacyConfig() (also see eslintrcKeys) function doesn't check for the plugins key, so our config was incorrectly treated as flat config despite being in legacy format.

This PR fixes the issue, along with a few other fixes combined:

  1. Convert recommended to flat config format
  2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
  3. Add recommended-latest-legacy config for non-flat config users who want all recommended rules (including compiler rules)
  4. Adding more types for the exported config

Our shipped presets in 6.x.x will essentially be:

  • recommended-legacy: legacy (non-flat), with basic rules only
  • recommended-latest-legacy: legacy (non-flat), all rules (basic + compiler)
  • flat/recommended: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
  • recommended-latest: flat, all rules (basic + compiler)
  • recommended: flat, basic rules only

In the next breaking release 7.x.x, we will collapse down the presets into three:

  • recommended-legacy: all recommended rules
  • recommended: all recommended rules
  • recommended-experimental: all recommended rules + new bleeding edge experimental rules

Closes#34679


Stack created with Sapling. Best reviewed with ReviewStack.

@josephsavonajosephsavona left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough debugging on this. It's incredibly frustrating that we were following ESLint's docs, and this worked in 9.20 or so, and seems to break in more recent minors of ESLint. The new setup here is more tedious, but from your/our investigation seems to be the only reasonable compromise. Other plugins (eslint-plugin-react for example) also define separate sets of configs for legacy and flat mode too.

@poteto
poteto marked this pull request as ready for review October 2, 2025 21:37
@hernan-yadiel

Copy link
Copy Markdown

Hi! I know working with ESLint is messier than it should be. Quick naming idea: -latest feels a bit opaque since it actually means “includes compiler rules.” Would recommended-compiler or recommended-extended be clearer?
Super excited for react conf!

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 2, 2025
@react-sizebot

react-sizebot commented Oct 2, 2025

Copy link
Copy Markdown

Comparing: 056a586...846e132

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=536.14 kB536.14 kB=94.81 kB94.81 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=663.96 kB663.96 kB=117.04 kB117.04 kB
facebook-www/ReactDOM-prod.classic.js=687.83 kB687.83 kB=121.08 kB121.08 kB
facebook-www/ReactDOM-prod.modern.js=678.26 kB678.26 kB=119.44 kB119.43 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 846e132

poteto added a commit that referenced this pull request Oct 2, 2025
Adds back the compiler rules to the recommended preset, intended for the
next release.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34675).
* #34703
* #34700
* #34699
* __->__ #34675
poteto added a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
@poteto

Copy link
Copy Markdown
CollaboratorAuthor

@hernan-yadiel the latest suffix is going to be short-lived :) In 7.x we'll go back down to 3 presets:

recommended-legacy: legacy config, all recommended rules
recommended: flat config, all recommended rules
recommended-experimental: all recommended rules + new bleeding edge experimental rules

Previously, the `recommended` config used the legacy ESLint format (plugins as an array of strings). This causes errors when used with ESLint v9's `defineConfig()` helper. This was following [eslint's own docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize "recommended". The old config system uses the recommended key while the current config system uses the flat/recommended key. The defineConfig() helper first looks at the recommended key, and if that is not in the correct format, it looks for the flat/recommended key. This allows you an upgrade path if you’d later like to rename flat/recommended to recommended when you no longer need to support the old config system.
However, [`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81) (also see [`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35)) function doesn't check for the `plugins` key, so our config was incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler rules
3. Add `recommended-latest-legacy` config for non-flat config users who want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic + compiler)
- `flat/recommended`: flat, basic rules only (now the same as recommended, but to avoid making a breaking change we'll just keep it around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge experimental rules
Closes#34679
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Updates the eslint fixture lockfiles.
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34699).
* #34703
* #34700
* __->__ #34699
* #34675
DiffTrain build for [056a586](056a586)
@poteto
poteto merged commit 26b177b into mainOct 2, 2025
241 checks passed
@poteto
poteto deleted the pr34700 branch October 2, 2025 22:52
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
Previously, the `recommended` config used the legacy ESLint format
(plugins as an array of strings). This causes errors when used with
ESLint v9's `defineConfig()` helper. This was following [eslint's own
docs](https://eslint.org/docs/latest/extend/plugins#backwards-compatibility-for-legacy-configs):
> With this approach, both configuration systems recognize
"recommended". The old config system uses the recommended key while the
current config system uses the flat/recommended key. The defineConfig()
helper first looks at the recommended key, and if that is not in the
correct format, it looks for the flat/recommended key. This allows you
an upgrade path if you’d later like to rename flat/recommended to
recommended when you no longer need to support the old config system.
However,
[`isLegacyConfig()`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L73-L81)
(also see
[`eslintrcKeys`](https://github.com/eslint/rewrite/blob/main/packages/config-helpers/src/define-config.js#L24-L35))
function doesn't check for the `plugins` key, so our config was
incorrectly treated as flat config despite being in legacy format.
This PR fixes the issue, along with a few other fixes combined:
1. Convert `recommended` to flat config format
2. Separate basic rules (exhaustive-deps, rules-of-hooks) from compiler
rules
3. Add `recommended-latest-legacy` config for non-flat config users who
want all recommended rules (including compiler rules)
4. Adding more types for the exported config
Our shipped presets in 6.x.x will essentially be:
- `recommended-legacy`: legacy (non-flat), with basic rules only
- `recommended-latest-legacy`: legacy (non-flat), all rules (basic +
compiler)
- `flat/recommended`: flat, basic rules only (now the same as
recommended, but to avoid making a breaking change we'll just keep it
around in 6.x.x)
- `recommended-latest`: flat, all rules (basic + compiler)
- `recommended`: flat, basic rules only
In the next breaking release 7.x.x, we will collapse down the presets
into three:
- `recommended-legacy`: all recommended rules
- `recommended`: all recommended rules
- `recommended-experimental`: all recommended rules + new bleeding edge
experimental rules
Closes#34679
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34700).
* #34703
* __->__ #34700
DiffTrain build for [26b177b](26b177b)
poteto added a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit that referenced this pull request Oct 2, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixes#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ #34703
* #34700
DiffTrain build for [19f65ff](19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 5, 2025
This rule was a leftover from a while ago and doesn't actually lint
anything useful. Specifically, you get a lint error if you try to opt
out a component that isn't already bailing out. If there's a bailout the
compiler already safely skips over it, so adding `'use no memo'` there
is unnecessary.
Fixesreact#31407
---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34703).
* __->__ react#34703
* react#34700
DiffTrain build for [19f65ff](react@19f65ff)
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
chore(deps): update eslint-plugin-react-hooks (major)
This MR contains the following updates:
| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | major | [`^5.2.0` → `^6.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/5.2.0/6.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
---
### Release Notes
<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>
### [`v6.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#611)
[Compare Source](react/react@8618113...a2329c1)
**Note:** 6.1.0 accidentally allowed use of `recommended` without flat config, causing errors when used with ESLint v9's `defineConfig()` helper. This has been fixed in 6.1.1.
- Fix `recommended` config for flat config compatibility. The `recommended` config has been converted to flat config format. Non-flat config users should use `recommended-legacy` instead. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34700](react/react#34700))
- Add `recommended-latest` and `recommended-latest-legacy` configs that include React Compiler rules. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34675](react/react#34675))
- Remove unused `NoUnusedOptOutDirectives` rule. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34703](react/react#34703))
- Remove `hermes-parser` and dependency. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34719](react/react#34719))
- Remove `@babel/plugin-proposal-private-methods` dependency. ([@&#8203;ArnaudBarre](https://github.com/ArnaudBarre) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34715](react/react#34715))
- Update for Zod v3/v4 compatibility. ([@&#8203;kolian](https://github.com/kolvian) and [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34717](react/react#34717))
### [`v6.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#610)
[Compare Source](react/react@fea92d8...8618113)
**Note:** Version 6.0.0 was mistakenly released and immediately deprecated and untagged on npm. This is the first official 6.x major release and includes breaking changes.
- **Breaking:** Require Node.js 18 or newer. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32458](react/react#32458))
- **Breaking:** Flat config is now the default `recommended` preset. Legacy config moved to `recommended-legacy`. ([@&#8203;michaelfaith](https://github.com/michaelfaith) in [#&#8203;32457](react/react#32457))
- **New Violations:** Disallow calling `use` within try/catch blocks. ([@&#8203;poteto](https://github.com/poteto) in [#&#8203;34040](react/react#34040))
- **New Violations:** Disallow calling `useEffectEvent` functions in arbitrary closures. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;33544](react/react#33544))
- Handle `React.useEffect` in addition to `useEffect` in rules-of-hooks. ([@&#8203;Ayc0](https://github.com/Ayc0) in [#&#8203;34076](react/react#34076))
- Added `react-hooks` settings config option that to accept `additionalEffectHooks` that are used across exhaustive-deps and rules-of-hooks rules. ([@&#8203;jbrown215](https://github.com/jbrown215)) in [#&#8203;34497](react/react#34497)
### [`v6.0.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#600)
[Compare Source](react/react@3607f48...fea92d8)
Accidentally released. See 6.1.0 for the actual changes.
</details>
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->
See merge request swiss-armed-forces/cyber-command/cea/loom!241
Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: eslint-plugin-react-hooks v.6.1.0 recommended config uses array instead of object

4 participants

@poteto@hernan-yadiel@react-sizebot@josephsavona