Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

eslint-plugin-react-hooks & "Flat Config" (ESLint 9) #28313

Open
Tracked by #18093 ...
JoshuaKGoldberg opened this issue Feb 13, 2024 · 62 comments · May be fixed by #30774
Open
Tracked by #18093 ...

eslint-plugin-react-hooks & "Flat Config" (ESLint 9) #28313

JoshuaKGoldberg opened this issue Feb 13, 2024 · 62 comments · May be fixed by #30774

Comments

@JoshuaKGoldberg
Copy link

JoshuaKGoldberg commented Feb 13, 2024

👋 Coming over from eslint/eslint#18093: ESLint is migrating to a new "flat config" format that will be the default in ESLint v9.

It doesn't look like eslint-plugin-react-hooks has documented support yet. But, based on searching around (e.g. vercel/next.js#49337), ESLint v9 is basically supported if you wire it up manually in your config:

// eslint.config.js
import eslint from "@eslint/js";
import hooksPlugin from "eslint-plugin-react-hooks";

export default [
  eslint.configs.recommended,
  {
    plugins: {
      "react-hooks": hooksPlugin,
    },
    rules: hooksPlugin.configs.recommended.rules,
  },
];

Most community plugins provide a more convenient wrapper. For example, eslint-plugin-jsdoc provides a jsdoc.configs['flat/recommended'] object:

// eslint.config.js
import jsdoc from 'eslint-plugin-jsdoc';

export default [
  jsdoc.configs['flat/recommended'],
];

Would the React team be open to a PR adding in a preset object like that? And either way, updating the docs on https://www.npmjs.com/package/eslint-plugin-react-hooks?

Note: this was also filed as reactjs/react.dev#6430.

I'm posting this issue here as a reference & cross-linking it to the table in eslint/eslint#18093. If there's anything technical blocking the extension from working with flat configs, please let us know - we'd be happy to try to help! 💜

Additional resources:

(sorry for not using the issue templates - I wasn't sure whether this would count as a bug)

@eps1lon
Copy link
Collaborator

eps1lon commented Feb 13, 2024

Thank you for reaching out. What would be involved in creating such a wrapper? Does it make more sense to file a PR and then see how it'll look?

We're only on ESLint 7 though so I guess we need to upgrade that first to test.

@JoshuaKGoldberg
Copy link
Author

What would be involved in creating such a wrapper?

It's not too much work (famous last words, I know). In theory the plugin should be able to get away with exporting an object containing configs, meta, and rules. https://eslint.org/docs/latest/extend/plugin-migration-flat-config#adding-plugin-meta-information shows a very minimal object.

make more sense to file a PR and then see how it'll look?

👍

We're only on ESLint 7 though so I guess we need to upgrade that first to test.

Yeah it feels like it'd probably be cleanest to upgrade to ESLint 8 first, just in case any breaking changes impact the plugin.

@RoystonS
Copy link

RoystonS commented Apr 5, 2024

Note that even wiring up the plugin manually doesn't enable it to work with the now-released ESLint 9: the plugin currently uses APIs like context.getSource which don't exist any more (eslint/eslint#17520), so there'll need to be some upgrade work.

e.g.

`${context.getSource(reactiveHook)} will be lost after each ` +

@JstnMcBrd
Copy link

Eslint officially released v9.0.0 today. However, the eslint-plugin-react-hooks plugin still restricts eslint to v8 in the peerDependencies list, so nobody who uses the plugin can download v9 without breaking dependency resolution.

Hope you'll add support for v9 soon!

@RoystonS
Copy link

RoystonS commented Apr 6, 2024

Should we raise a separate issue for v9 API support?

@yhx-12243
Copy link

yhx-12243 commented Apr 6, 2024

Should we raise a separate issue for v9 API support?

Currently under discussion in jsx-eslint/eslint-plugin-react#3699.

@eps1lon
Copy link
Collaborator

eps1lon commented Apr 6, 2024

ESLint v9 support will be done in #28773

@josiahgallen
Copy link

@eps1lon how far away from merge/release is this update to support eslint v9?

@virtuallyunknown
Copy link

ESLint v9 support will be done in #28773

Hey @eps1lon, greetings!

I just wanted to ask, is #28773 part of the 4.6.0 release that was published on npm 3 days ago or it's planned for a future release?

I am currently in the process of migrating to flat config, and the plugin is giving me an error.

Oops! Something went wrong! :(

ESLint: 9.1.0

TypeError: context.getSource is not a function
Occurred while linting /home/user/projects/eslint-flat-config-migration/src/index.tsx:8
Rule: "react-hooks/exhaustive-deps"
    at visitFunctionWithDependencies (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint-plugin-react-hooks@4.6.0_eslint@9.1.0/node_modules/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js:1704:42)
    at visitCallExpression (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint-plugin-react-hooks@4.6.0_eslint@9.1.0/node_modules/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js:1759:11)
    at ruleErrorHandler (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/linter.js:1115:48)
    at /home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/safe-emitter.js:45:58
    at Array.forEach (<anonymous>)
    at Object.emit (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/safe-emitter.js:45:38)
    at NodeEventGenerator.applySelector (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:297:26)
    at NodeEventGenerator.applySelectors (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:326:22)
    at NodeEventGenerator.enterNode (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:340:14)
    at runRules (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/linter.js:1154:40)

If needed, here is a my repository where the issue can be reproduced by running npx eslint src/index.tsx

https://github.com/virtuallyunknown/eslint-flat-config-migration

Relevant files:
https://github.com/virtuallyunknown/eslint-flat-config-migration/blob/master/eslint.config.js
https://github.com/virtuallyunknown/eslint-flat-config-migration/blob/master/configs/react.js

Cheers!

@JacobZyy
Copy link

ESLint v9 support will be done in #28773

Hey @eps1lon, greetings!

I just wanted to ask, is #28773 part of the 4.6.0 release that was published on npm 3 days ago or it's planned for a future release?

I am currently in the process of migrating to flat config, and the plugin is giving me an error.

Oops! Something went wrong! :(

ESLint: 9.1.0

TypeError: context.getSource is not a function
Occurred while linting /home/user/projects/eslint-flat-config-migration/src/index.tsx:8
Rule: "react-hooks/exhaustive-deps"
    at visitFunctionWithDependencies (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint-plugin-react-hooks@4.6.0_eslint@9.1.0/node_modules/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js:1704:42)
    at visitCallExpression (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint-plugin-react-hooks@4.6.0_eslint@9.1.0/node_modules/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js:1759:11)
    at ruleErrorHandler (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/linter.js:1115:48)
    at /home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/safe-emitter.js:45:58
    at Array.forEach (<anonymous>)
    at Object.emit (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/safe-emitter.js:45:38)
    at NodeEventGenerator.applySelector (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:297:26)
    at NodeEventGenerator.applySelectors (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:326:22)
    at NodeEventGenerator.enterNode (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/node-event-generator.js:340:14)
    at runRules (/home/user/projects/eslint-flat-config-migration/node_modules/.pnpm/eslint@9.1.0/node_modules/eslint/lib/linter/linter.js:1154:40)

If needed, here is a my repository where the issue can be reproduced by running npx eslint src/index.tsx

https://github.com/virtuallyunknown/eslint-flat-config-migration

Relevant files: https://github.com/virtuallyunknown/eslint-flat-config-migration/blob/master/eslint.config.js https://github.com/virtuallyunknown/eslint-flat-config-migration/blob/master/configs/react.js

Cheers!

got the same error and I turn off the rules about react-hooks...

@smaven
Copy link

smaven commented Apr 25, 2024

The issue seems to have been resolved in the canary release.

If you are using eslint-plugin-react, some rules such as react/display-name or other recommended ones don't work: jsx-eslint/eslint-plugin-react#3699.

@eps1lon
Copy link
Collaborator

eps1lon commented Apr 25, 2024

If you are using eslint-plugin-react

eslint-plugin-react is not authored by the React team. Please file an issue for this plugin in https://github.com/jsx-eslint/eslint-plugin-react instead.

ESLint v9 support is available in the Canary release channel (earliest version 5.1.0-canary-cb151849e1-20240424) and will be released as stable with the stable release of React 19.

@virtuallyunknown
Copy link

virtuallyunknown commented Apr 25, 2024

I am not sure if this feedback is of any value, but it looks like the types from eslint and typescript-eslint are signaling about potential issues.

// @ts-check

// @typescript-eslint/utils: 7.7.1
// eslint-plugin-react-hooks: 5.1.0-canary-cb151849e1-20240424

import eslintPluginReactHooks from 'eslint-plugin-react-hooks';

/** @type {import('eslint').Linter.FlatConfig[]} */
export const configuration1 = [
    {
        plugins: {
            'react-hooks': eslintPluginReactHooks
        }
    }
];

/** @type {import('@typescript-eslint/utils').TSESLint.FlatConfig.ConfigFile} */
export const configuration2 = [
    {
        plugins: {
            'react-hooks': eslintPluginReactHooks
        }
    }
];

I don't want to paste the error message because it's a giant wall of text, but feel free to try it on your own.

This appears to be a type error only, and as far as I can tell the plugin is working as expected, so thanks for the updates, much appreciated!

@michaelfaith
Copy link

I just submitted a PR that adds support for flat config, if anyone wants to take a look / provide feedback

@axetroy
Copy link

axetroy commented Aug 29, 2024

Perfect compatibility and resolve context.getSource is not a function

const react = require('eslint-plugin-react')
const { FlatCompat } = require('@eslint/eslintrc')

const eslintConfigs = require('../../eslint.config')

const compat = new FlatCompat()

/**
 * @type {Array<import('eslint').Linter.FlatConfig>}
 */
module.exports = [
    ...eslintConfigs,

    react.configs.flat.recommended,
    react.configs.flat['jsx-runtime'],

    ...compat.config({
        extends: ['plugin:react-hooks/recommended'],
        rules: {
            'react-hooks/exhaustive-deps': 'error'
        }
    })
]

Then apply this patch with patch-package

eslint-plugin-react-hooks+4.6.2.patch

@DAcodedBEAT
Copy link

ESLint v9 support is available in the Canary release channel (earliest version 5.1.0-canary-cb151849e1-20240424) and will be released as stable with the stable release of React 19.

ESLint v9 has been available for some time now and it is unclear when React 19 will be released. Can the dev team please consider releasing just this the eslint-plugin-react-hooks package (with ESLint v9 support) to unblock the dependency chain?

@jbouder
Copy link

jbouder commented Sep 6, 2024

ESLint v9 support is available in the Canary release channel (earliest version 5.1.0-canary-cb151849e1-20240424) and will be released as stable with the stable release of React 19.

ESLint v9 has been available for some time now and it is unclear when React 19 will be released. Can the dev team please consider releasing just this the eslint-plugin-react-hooks package (with ESLint v9 support) to unblock the dependency chain?

Pretty please 🙏

@bricss
Copy link

bricss commented Sep 7, 2024

The amount of time ⏳ it takes to solve this problem 👾 is already beyond ridiculous 🫠

@eifr
Copy link

eifr commented Sep 7, 2024

ESLint v8.x end-of-life is 2024-10-05
from ESLint website

image

@nikischin
Copy link

ESLint v8.x end-of-life is 2024-10-05

from ESLint website

image

We cannot blame the React team for the fact that ESLint provides support for the previous version 8 for only 6 months since release of the new version 9 although including big breaking changes not so easy to adapt by all parties. Seems like they want to sell their ESLint LTS Support service to me tbh.

I would really appreciate a new official release though for this package so let's hope we soon get some updates.

@pauliesnug
Copy link

We cannot blame the React team for the fact that ESLint provides support for the previous version 8 for only 6 months since release of the new version 9 although including big breaking changes not so easy to adapt by all parties. Seems like they want to sell their ESLint LTS Support service to me tbh.

While ESLint v9 provides some major breaking changes, they have been really good about community outreach, so most of all v8 plugins can safely and easily update to v9 at this point.
ESLint is pushing projects to update to ESLint v9, because ESLint is planning to basically rewrite the program from the ground up, with new infrastructure and objectives.
eslint-plugin-react-hooks has already been updated to support ESLint v9/Flat Config to some extent, but it just hasn't been published as a full release on npm, with no explanation provided.

@caribou-code
Copy link

The heck is going on here? eslint-plugin-react-hooks is the 2nd most downloaded ESLint plugin in the npm ecosystem, and is maintained by one of the biggest tech companies in the world. It's been 6 months since ESLint 9 was released and this package is still out of date. I can see the support is merged so can't we just get a release?

@jbouder
Copy link

jbouder commented Sep 11, 2024

The heck is going on here? eslint-plugin-react-hooks is the 2nd most downloaded ESLint plugin in the npm ecosystem, and is maintained by one of the biggest tech companies in the world. It's been 6 months since ESLint 9 was released and this package is still out of date. I can see the support is merged so can't we just get a release?

Word 👍

@syedmaazsaeed
Copy link

Can I fix this Issue? I am a Full-Stack Software Developer and work with various Tech Stack like MERN , NEXT , REACT , FLUTTER, C#.

@michaelfaith
Copy link

michaelfaith commented Sep 11, 2024

Can I fix this Issue? I am a Full-Stack Software Developer and work with various Tech Stack like MERN , NEXT , REACT , FLUTTER, C#.

There're multiple PRs already opened (including mine here: #30774). They just need to be reviewed by the team. Rather than opening another PR, I'd suggest reviewing one of the existing ones and providing feedback there.

@bricss
Copy link

bricss commented Sep 11, 2024

Don't @ me 😅
orly-generator

@ljharb
Copy link
Contributor

ljharb commented Sep 11, 2024

@caribou-code 3rd, and 6 months is not unreasonable for a very disruptive breaking change - historically it takes 4-6 months for the eslint ecosystem to entirely adapt to an eslint major, and eslint 9 will likely take much longer.

@jessupjn
Copy link

Perfect compatibility and resolve context.getSource is not a function

const react = require('eslint-plugin-react')
const { FlatCompat } = require('@eslint/eslintrc')

const eslintConfigs = require('../../eslint.config')

const compat = new FlatCompat()

/**
 * @type {Array<import('eslint').Linter.FlatConfig>}
 */
module.exports = [
    ...eslintConfigs,

    react.configs.flat.recommended,
    react.configs.flat['jsx-runtime'],

    ...compat.config({
        extends: ['plugin:react-hooks/recommended'],
        rules: {
            'react-hooks/exhaustive-deps': 'error'
        }
    })
]

Then apply this patch with patch-package

eslint-plugin-react-hooks+4.6.2.patch

FWIW this works for me in the interim (wanted to reshare in case anyone didnt read the full thread)

@elliottAtTreatment
Copy link

Perfect compatibility and resolve context.getSource is not a function

const react = require('eslint-plugin-react')
const { FlatCompat } = require('@eslint/eslintrc')

const eslintConfigs = require('../../eslint.config')

const compat = new FlatCompat()

/**
 * @type {Array<import('eslint').Linter.FlatConfig>}
 */
module.exports = [
    ...eslintConfigs,

    react.configs.flat.recommended,
    react.configs.flat['jsx-runtime'],

    ...compat.config({
        extends: ['plugin:react-hooks/recommended'],
        rules: {
            'react-hooks/exhaustive-deps': 'error'
        }
    })
]

Then apply this patch with patch-package
eslint-plugin-react-hooks+4.6.2.patch

FWIW this works for me in the interim (wanted to reshare in case anyone didnt read the full thread)

Can you not switch to the new version of eslint with the beta release of react-hooks? @controversial kindly pointed out to me that you don't need to patch 4.6.2. The beta release (5.1.0) has support. I might be confused again as I didn't read the whole issue. However, I can tell you that my setup is now working fine without any patches on v5.1.0.

@bricss
Copy link

bricss commented Sep 11, 2024

@caribou-code 3rd, and 6 months is not unreasonable for a very disruptive breaking change - historically it takes 4-6 months for the eslint ecosystem to entirely adapt to an eslint major, and eslint 9 will likely take much longer.

Surprisingly, new major already supported by vast majority of ecosystem: Tracking: ESLint v9 support

And those who for any reason don't want to migrate to the new major, simply should not bump the version 🚫

@ljharb
Copy link
Contributor

ljharb commented Sep 11, 2024

@bricss that's still missing a lot of entries, unfortunately.

@slk333
Copy link

slk333 commented Sep 20, 2024

The release candidate works!

npm i --save-dev eslint-plugin-react-hooks@rc

make sure to have a flat-config

mine looks like that

import mantine from "eslint-config-mantine"
import tseslint from "typescript-eslint"
import reactHooks from "eslint-plugin-react-hooks"

export default tseslint.config(
    ...mantine,

    { ignores: ["**/*.{mjs,cjs,js,d.ts,d.mts}", "./.storybook/main.ts"] },
    {
        plugins: {
            "react-hooks": reactHooks,
        },
        rules: {
            ...reactHooks.configs.recommended.rules
        }
    }
)

karlhorky added a commit to upleveled/eslint-config-upleveled that referenced this issue Sep 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.