Skip to content

[eslint-plugin-react-hooks] Add ESLint v10 support#35720

Merged
josephsavona merged 2 commits intofacebook:mainfrom
azat-io:feat/eslint-10
Feb 13, 2026
Merged

[eslint-plugin-react-hooks] Add ESLint v10 support#35720
josephsavona merged 2 commits intofacebook:mainfrom
azat-io:feat/eslint-10

Conversation

@azat-io
Copy link
Copy Markdown
Contributor

@azat-io azat-io commented Feb 8, 2026

Summary

ESLint v10.0.0 was released on February 7, 2026. The current peerDependencies for eslint-plugin-react-hooks only allows up to ^9.0.0, which causes peer dependency warnings when installing with ESLint v10.

This PR:

  • Adds ^10.0.0 to the eslint peer dependency range
  • Adds eslint-v10 to devDependencies for testing
  • Adds an eslint-v10 e2e fixture (based on the existing eslint-v9 fixture)

ESLint v10's main breaking changes (removal of legacy eslintrc config, deprecated context methods) don't affect this plugin - flat config is already supported since v7.0.0, and the deprecated APIs already have fallbacks in place.

How did you test this change?

Ran the existing unit test suite:

cd packages/eslint-plugin-react-hooks && yarn test

All 5082 tests passed.

@meta-cla
Copy link
Copy Markdown

meta-cla Bot commented Feb 8, 2026

Hi @azat-io!

Thank you for your pull request and welcome to our community.

Action Required

In order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you.

Process

In order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA.

Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with CLA signed. The tagging process may take up to 1 hour after signing. Please give it that time before contacting us about it.

If you have received this in error or have any questions, please contact us at cla@meta.com. Thanks!

Copy link
Copy Markdown
Member

@josephsavona josephsavona left a comment

Choose a reason for hiding this comment

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

Awesome, thanks!

Copy link
Copy Markdown
Member

@josephsavona josephsavona left a comment

Choose a reason for hiding this comment

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

@react-sizebot
Copy link
Copy Markdown

react-sizebot commented Feb 12, 2026

Comparing: 65db100...9867b67

Critical size changes

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

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB +0.05% 1.88 kB 1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 610.35 kB 610.35 kB = 107.89 kB 107.89 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB +0.05% 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 676.28 kB 676.28 kB = 118.85 kB 118.85 kB
facebook-www/ReactDOM-prod.classic.js = 696.77 kB 696.77 kB = 122.49 kB 122.49 kB
facebook-www/ReactDOM-prod.modern.js = 687.15 kB 687.15 kB = 120.89 kB 120.89 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against 9867b67

@azat-io
Copy link
Copy Markdown
Contributor Author

azat-io commented Feb 13, 2026

@josephsavona Done ✅

@josephsavona josephsavona merged commit e8c6362 into facebook:main Feb 13, 2026
235 checks passed
@josephsavona
Copy link
Copy Markdown
Member

Thanks!

@controversial
Copy link
Copy Markdown

Any plans to cut a new release with this change soon? @josephsavona

KaushikGarkoti added a commit to KaushikGarkoti/react that referenced this pull request Feb 22, 2026
## Summary

ESLint v10.0.0 was released on February 7, 2026. The current
`peerDependencies` for `eslint-plugin-react-hooks` only allows up to
`^9.0.0`, which causes peer dependency warnings when installing with
ESLint v10.

This PR:

- Adds `^10.0.0` to the eslint peer dependency range
- Adds `eslint-v10` to devDependencies for testing
- Adds an `eslint-v10` e2e fixture (based on the existing `eslint-v9`
fixture)

ESLint v10's main breaking changes (removal of legacy eslintrc config,
deprecated context methods) don't affect this plugin - flat config is
already supported since v7.0.0, and the deprecated APIs already have
fallbacks in place.

## How did you test this change?

Ran the existing unit test suite:

```
cd packages/eslint-plugin-react-hooks && yarn test
```

All 5082 tests passed.
dgdavid added a commit to agama-project/agama that referenced this pull request Mar 2, 2026
Because facebook/react#35720 hasn't been
released to npm yet.
@rstar327
Copy link
Copy Markdown

rstar327 commented Mar 2, 2026

The ESLint v10 support was merged in #35720 2 weeks ago, but it hasn't been published to npm yet.
The latest eslint-plugin-react-hooks@7.0.1 still only declares eslint ^9.0.0 in peerDependencies.
Could a new release be published to unblock ESLint 10 upgrades?

@FrankBurmo
Copy link
Copy Markdown

@josephsavona why has there not yet been a eslint-plugin-react-hooks@7.1.0 release? You surely know this is a blocker for thousands of projects?

@jomonty
Copy link
Copy Markdown

jomonty commented Mar 16, 2026

@josephsavona why has there not yet been a eslint-plugin-react-hooks@7.1.0 release? You surely know this is a blocker for thousands of projects?

Also including @poteto as someone else that has approved PRs for eslint-plugin-react-hooks in the last 6 months.

SheetMetalConnect added a commit to SheetMetalConnect/eryxon-flow that referenced this pull request Mar 22, 2026
eslint-plugin-react-hooks@7.0.1 only declares eslint ^9.0.0 in
peerDependencies. The eslint 10 support PR (facebook/react#35720) is
merged but not yet published to npm. Revert to eslint 9.x until the
plugin ships an update.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
lolopop01 added a commit to LibreCommunications/Librecord that referenced this pull request Mar 23, 2026
- Upgrade eslint-plugin-react-hooks to 7.1.0-canary (includes ^10.0.0
  peer dep, facebook/react#35720)
- Fix new set-state-in-effect lint errors by moving state resets from
  effects into render phase using previous-value state tracking

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@aweebit
Copy link
Copy Markdown

aweebit commented Mar 25, 2026

A temporary way to unblock migration to ESLint 10 is to add this to your package.json:

"overrides": {
  "eslint-plugin-react-hooks": {
    "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
  }
}

@controversial
Copy link
Copy Markdown

You can also update to eslint-plugin-react-hooks@canary

@pReya
Copy link
Copy Markdown

pReya commented Apr 1, 2026

@jackpope Can you help to get a new release out the door?

yuman07 pushed a commit to yuman07/WenjianSkill that referenced this pull request Apr 11, 2026
eslint-plugin-react-hooks@7.0.1 declares peer eslint@"^3-9" but works
fine with ESLint 10 (facebook/react#35720 merged, not yet released).
This unblocks CI npm install until a new release lands.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
736-c41-2c1-e464fc974 pushed a commit to Swiss-Armed-Forces/Loom that referenced this pull request Apr 27, 2026
This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | devDependencies | minor | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.58.2/8.59.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | devDependencies | minor | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.58.2/8.59.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [ajv](https://ajv.js.org) ([source](https://github.com/ajv-validator/ajv)) | dependencies | minor | [`8.18.0` → `8.20.0`](https://renovatebot.com/diffs/npm/ajv/8.18.0/8.20.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/ajv-validator/ajv/badge)](https://securityscorecards.dev/viewer/?uri=github.com/ajv-validator/ajv) |
| [eslint-plugin-react-hooks](https://react.dev/) ([source](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks)) | devDependencies | minor | [`7.0.1` → `7.1.1`](https://renovatebot.com/diffs/npm/eslint-plugin-react-hooks/7.0.1/7.1.1) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/facebook/react/badge)](https://securityscorecards.dev/viewer/?uri=github.com/facebook/react) |
| [react-toastify](https://github.com/fkhadra/react-toastify) | dependencies | minor | [`11.0.5` → `11.1.0`](https://renovatebot.com/diffs/npm/react-toastify/11.0.5/11.1.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fkhadra/react-toastify/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fkhadra/react-toastify) |
| [typescript-eslint](https://typescript-eslint.io/packages/typescript-eslint) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)) | devDependencies | minor | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/typescript-eslint/8.58.2/8.59.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) | devDependencies | minor | [`4.0.1` → `4.1.0`](https://renovatebot.com/diffs/npm/vite-plugin-static-copy/4.0.1/4.1.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sapphi-red/vite-plugin-static-copy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/sapphi-red/vite-plugin-static-copy) |

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/eslint-plugin)</summary>

### [`v8.59.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8590-2026-04-20)

[Compare Source](typescript-eslint/typescript-eslint@v8.58.2...v8.59.0)

##### 🚀 Features

- **eslint-plugin:** \[no-unnecessary-type-assertion] report more cases based on assignability ([#&#8203;11789](typescript-eslint/typescript-eslint#11789))

##### ❤️ Thank You

- Ulrich Stark

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/parser)</summary>

### [`v8.59.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8590-2026-04-20)

[Compare Source](typescript-eslint/typescript-eslint@v8.58.2...v8.59.0)

This was a version bump only for parser to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>ajv-validator/ajv (ajv)</summary>

### [`v8.20.0`](https://github.com/ajv-validator/ajv/releases/tag/v8.20.0)

[Compare Source](ajv-validator/ajv@v8.18.0...v8.20.0)

#### What's Changed

- fix: add support for node 22/24, drop node 16/21 by [@&#8203;jasoniangreen](https://github.com/jasoniangreen) in [#&#8203;2580](ajv-validator/ajv#2580)
- fix: add ES2022.RegExp for RegExpIndicesArray by [@&#8203;SignpostMarv](https://github.com/SignpostMarv) in [#&#8203;2604](ajv-validator/ajv#2604)

**Full Changelog**: <ajv-validator/ajv@v8.19.0...v8.20.0>

</details>

<details>
<summary>facebook/react (eslint-plugin-react-hooks)</summary>

### [`v7.1.1`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#711)

[Compare Source](https://github.com/facebook/react/compare/eslint-plugin-react-hooks@7.1.0...eslint-plugin-react-hooks@7.1.1)

**Note:** 7.1.0 accidentally removed the `component-hook-factories` rule, causing errors for users who referenced it in their ESLint config. This is now fixed.

- Add deprecated no-op `component-hook-factories` rule for backwards compatibility. ([@&#8203;mofeiZ](https://github.com/mofeiZ) in [#&#8203;36307](facebook/react#36307))

### [`v7.1.0`](https://github.com/facebook/react/blob/HEAD/packages/eslint-plugin-react-hooks/CHANGELOG.md#710)

[Compare Source](https://github.com/facebook/react/compare/408b38ef7304faf022d2a37110c57efce12c6bad...eslint-plugin-react-hooks@7.1.0)

This release adds ESLint v10 support, improves performance by skipping compilation for non-React files, and includes compiler lint improvements including better `set-state-in-effect` detection, improved ref validation, and more helpful error reporting.

- Add ESLint v10 support. ([@&#8203;azat-io](https://github.com/azat-io) in [#&#8203;35720](facebook/react#35720))
- Skip compilation for non-React files to improve performance. ([@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;35589](facebook/react#35589))
- Fix exhaustive deps bug with Flow type casting. ([@&#8203;jorge-cab](https://github.com/jorge-cab) in [#&#8203;35691](facebook/react#35691))
- Fix `useEffectEvent` checks in component syntax. ([@&#8203;jbrown215](https://github.com/jbrown215) in [#&#8203;35041](facebook/react#35041))
- Improved `set-state-in-effect` validation with fewer false negatives. ([@&#8203;jorge-cab](https://github.com/jorge-cab) in [#&#8203;35134](facebook/react#35134), [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;35147](facebook/react#35147), [@&#8203;jackpope](https://github.com/jackpope) in [#&#8203;35214](facebook/react#35214), [@&#8203;chesnokov-tony](https://github.com/chesnokov-tony) in [#&#8203;35419](facebook/react#35419), [@&#8203;jsleitor](https://github.com/jsleitor) in [#&#8203;36107](facebook/react#36107))
- Improved ref validation for non-mutating functions and event handler props. ([@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;35893](facebook/react#35893), [@&#8203;kolvian](https://github.com/kolvian) in [#&#8203;35062](facebook/react#35062))
- Compiler now reports all errors instead of stopping at the first. ([@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;35873](https://github.com/facebook/react/pull/35873)–[#&#8203;35884](https://github.com/facebook/react/pull/35884))
- Improved source locations and error display in compiler diagnostics. ([@&#8203;nathanmarks](https://github.com/nathanmarks) in [#&#8203;35348](facebook/react#35348), [@&#8203;josephsavona](https://github.com/josephsavona) in [#&#8203;34963](facebook/react#34963))

</details>

<details>
<summary>fkhadra/react-toastify (react-toastify)</summary>

### [`v11.1.0`](https://github.com/fkhadra/react-toastify/releases/tag/v11.1.0)

[Compare Source](fkhadra/react-toastify@v11.0.5...v11.1.0)

### Release Notes

#### Features

- **CSP nonce support.** `<ToastContainer nonce={...}>` applies the nonce to the
  injected `<style>` tag. Closes [#&#8203;1209](fkhadra/react-toastify#1209).

#### Fixes

- `onChange` fires `status: 'removed'` synchronously on `toast.dismiss()` instead
  of after the exit animation — observers (incl. `useNotificationCenter`) now
  see correctly ordered events. Also guards against double-`onClose`. Closes [#&#8203;1275](fkhadra/react-toastify#1275).
- Touch drag no longer re-pauses the toast on release — the old check compared a
  PointerEvent against `'touchend'`, which never matched. Closes [#&#8203;1217](fkhadra/react-toastify#1217).
- Vertical drag now visually moves the toast (`--y` gets a unit). Thanks
  [@&#8203;janpaepke](https://github.com/janpaepke), [#&#8203;1277](fkhadra/react-toastify#1277).
- Stacked scale is clamped at 0.5, preventing zero/negative scale in deep
  stacks. Closes [#&#8203;1171](fkhadra/react-toastify#1171), [#&#8203;1174](fkhadra/react-toastify#1174).
- Stacked container respects mobile `100vw` again. Closes [#&#8203;1234](fkhadra/react-toastify#1234).

#### Accessibility

- `role="progressbar"` now includes `aria-valuenow`, `aria-valuemin`, `aria-valuemax`.
  Thanks [@&#8203;singhankit001](https://github.com/singhankit001), [#&#8203;1283](fkhadra/react-toastify#1283). Closes [#&#8203;1259](fkhadra/react-toastify#1259).

#### Internal

- Migrated to a pnpm workspace (`pnpm link .` no longer required for contributors).
  Publish layout unchanged — addon still ships inside the main package.
- CSS now injected at mount via `useStyleSheet` (prerequisite for `nonce`).
- Dep bumps: TypeScript 6, Vite 8, Cypress 15, React 19.2, plus the rest.
- CI: `upload-artifact` v3 → v4.

Thanks to [@&#8203;janpaepke](https://github.com/janpaepke), [@&#8203;singhankit001](https://github.com/singhankit001), and reporters of the fixed issues.

</details>

<details>
<summary>typescript-eslint/typescript-eslint (typescript-eslint)</summary>

### [`v8.59.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8590-2026-04-20)

[Compare Source](typescript-eslint/typescript-eslint@v8.58.2...v8.59.0)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>sapphi-red/vite-plugin-static-copy (vite-plugin-static-copy)</summary>

### [`v4.1.0`](https://github.com/sapphi-red/vite-plugin-static-copy/blob/HEAD/CHANGELOG.md#410)

[Compare Source](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@4.0.1...vite-plugin-static-copy@4.1.0)

##### Minor Changes

- [#&#8203;251](sapphi-red/vite-plugin-static-copy#251) [`7672842`](sapphi-red/vite-plugin-static-copy@7672842) Thanks [@&#8203;sapphi-red](https://github.com/sapphi-red)! - Add `name` property to the `rename` object form and allow rename functions to return a `RenameObject`. The `name` property replaces the file's basename (filename + extension), and can be combined with `stripBase` to both flatten directory structure and rename the file in one step. Rename functions can now return `{ name, stripBase }` objects instead of only strings, making it easier to declaratively control output paths from dynamic rename logic.

  ```js
  // node_modules/lib/dist/index.js → vendor/lib.js
  { src: 'node_modules/lib/dist/index.js', dest: 'vendor', rename: { name: 'lib.js', stripBase: true } }

  // src/pages/events/test.html → dist/events/index.html
  { src: 'src/pages/**/*.html', dest: 'dist/', rename: { stripBase: 2, name: 'index.html' } }
  ```

</details>

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMjkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE0MS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==-->

See merge request swiss-armed-forces/cyber-command/cea/loom!480

Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.