eslint-plugin-react: ESLint v9 contains breaking API changes
Is there an existing issue for this?
- I have searched the existing issues and my issue is unique
- My issue appears in the command-line and not only in the text editor
Description Overview
Upon bumping to the ESLint beta for v9, I was met with several errors in my monorepo during the linting test-run.
Namely:
- Error:
context.getScope is not a function- Rule:
"react/no-string-refs"
- Rule:
- Error:
context.getFirstTokens is not a function- Rule:
"react/display-name"
- Rule:
I get that it’s still only a beta, but these API changes were announced in september 2023.
Additionally, there are some rule structure changes outlined separately that may be worth ensuring are in compliance.
Expected Behavior
Given that ESLint v9 is now in beta, I wasn’t expecting to find any plugins that haven’t yet addressed the API changes
eslint-plugin-react version
v7.34.0
eslint version
v9.0.0-beta.1
node version
v18.12.0
About this issue
- Original URL
- State: open
- Created 4 months ago
- Reactions: 56
- Comments: 20 (8 by maintainers)
Commits related to this issue
- WIP: Upgrade to ESLint v9 flat config and plugins Per this comment, this is work for ~6-9 months from now... https://github.com/jsx-eslint/eslint-plugin-react/issues/3699#issuecomment-2057146289 — committed to stefcameron/react-app-template by stefcameron 2 months ago
- refactor: downgrade eslint until react-hooks supports it Tracking: - https://github.com/eslint/eslint/issues/18391 - https://github.com/jsx-eslint/eslint-plugin-react/issues/3699 Signed-off-by: Chr... — committed to aperturerobotics/common by paralin 2 months ago
Eslint officially released v9.0.0 today. Hope this plugin will support it soon!
Getting
TypeError: context.getScope is not a functionhereNobody’s forcing you to upgrade to eslint 9 right away ¯\_(ツ)_/¯ new eslint majors always take months before everything supports them, and this one will take longer because it’s changing the default config format.
Thanks for your work on this plugin, @ljharb! Seems totally reasonable to take some time to support ESLint 9, and anyone who reeeeeeally needs to be on the latest and greatest should consider hiring you (if you’re available for such work) or volunteering their time to make it happen. Since I’m not able to do that myself at the moment, I’m happy to wait to upgrade ESLint.
That expectation is flawed; the point of it being in beta is for plugins to begin to address the changes - announcements are irrelevant. Thanks for the report.
A fix for this will also need to add eslint 9 into the test matrix.
The same problem occurs with eslint-plugin-solid. fyi.
TypeError: context.getScope is not a function Occurred while linting /data/data/com.termux/files/home/LearnSolidJS/FirstApp/src/FibCounter.tsx:15 Rule: “solid/reactivity” at checkForReactiveAssignment (/data/data/com.termux/files/home/LearnSolidJS/node_modules/eslint-plugin-solid/dist/rules/reactivity.js:445:69) at VariableDeclarator (/data/data/com.termux/files/home/LearnSolidJS/node_modules/eslint-plugin-solid/dist/rules/reactivity.js:768:11) at ruleErrorHandler (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/linter.js:1115:48) at /data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/safe-emitter.js:45:58 at Array.forEach (<anonymous>) at Object.emit (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/safe-emitter.js:45:38) at NodeEventGenerator.applySelector (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/node-event-generator.js:297:26) at NodeEventGenerator.applySelectors (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/node-event-generator.js:326:22) at NodeEventGenerator.enterNode (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/node-event-generator.js:340:14) at runRules (/data/data/com.termux/files/usr/lib/node_modules/eslint/lib/linter/linter.js:1154:40)
Indeed, you simply can’t upgrade to eslint 9 until all of your eslint plugins/configs have explicit peer dep support for it. (this is true for every eslint major)
Awesome, thanks for the pointers.
That will help get us unblocked for eslint 9, but we’ll still have a lot of work to support eslint 10.
Hey, the reason for error (and backward’s compatible implementation) can be found here: https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#context.getscope()
As for
sourceCode.getFirstTokens()it’s here: https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/#from-context-to-sourcecodeScott, that’s a perfect answer 😃 Thanks all!
Having worked on a couple of other plugins, I want to elaborate that I think there’s two parts to this upgrade.
The real breaking change for v9 is the fact that v9 has removed APIs - it looks like this is being covered in #3727.
The second change is flat config compatibility. Consumers can use the plugin as-is (as long as the API issues are resolved). It is slightly more work, but it is possible. Of course, supporting the flat config natively makes it easier, and ESLint has a good migration guide should anyone wanting to upgrade to v9 feel like contributing a patch (I might eventually, but I have several other plugins that I’m focussing on).
I’d like to continue using this plugin, but this bug is unfortunately stopping me.
I hope we get to see a fix soon!
ESLint 9 makes the flat config the default. It renames the ESLintRC style classes to be
LegacyESLintand the Linter requires an option of{configType: "eslintrc"}, and in ESLint 10, they plan on dropping the legacy config altogether.There’s a migration guide that might be a good place to start in terms of compiling a list of required tasks for this