docs(linter): Mark some react rules as unsupported, misc docs improvements #18617
docs(linter): Mark some react rules as unsupported, misc docs improvements #18617graphite-app[bot] merged 1 commit intomainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This PR marks 10 React rules from eslint-plugin-react as unsupported in oxlint, based on the rationale that React 19 and TypeScript have made them obsolete. The rules primarily apply to legacy class components, PropTypes, and defaultProps - patterns that are discouraged in modern React development.
Changes:
- Added 10 React rules to the unsupported rules list with explanations
- Enhanced documentation for
no_string_refsrule with React 19 removal information - Added TypeScript-specific note to
jsx_no_undefrule documentation
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| tasks/lint_rules/src/unsupported-rules.json | Adds 10 React rules to unsupported list with rationale explaining their obsolescence in modern React |
| crates/oxc_linter/src/rules/react/no_string_refs.rs | Updates documentation to clarify deprecation timeline and React 19 removal of string refs |
| crates/oxc_linter/src/rules/react/jsx_no_undef.rs | Adds note about rule being unnecessary when using TypeScript |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@connorshea I'll leave this for you to merge in case you want to wait for @ baevm to review |
|
@connorshea I'll leave this for you to merge in case you want to wait for @ baevm to review |
ddbba89 to
8ce2455
Compare
|
i think its fine, there is also no-typos rule only for class components/prop types and no-arrow-function-lifecycle for class components, maybe also add it? |
|
I'm going to merge this as-is for now since I have to wake up early tomorrow, if anyone wants to follow up with those two extra rules feel free :) |
Merge activity
|
…ments (#18617) Marks the following rules from eslint-plugin-react as unsupported: - [react/default-props-match-prop-types](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/default-props-match-prop-types.md) - [react/forbid-foreign-prop-types](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-foreign-prop-types.md) - [react/forbid-prop-types](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-prop-types.md) - [react/no-access-state-in-setstate](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-access-state-in-setstate.md) - [react/no-unused-class-component-methods](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unused-class-component-methods.md) - [react/no-unused-state](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unused-state.md) - [react/no-unused-prop-types](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unused-prop-types.md) - [react/prefer-exact-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-exact-props.md) - [react/sort-comp](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-comp.md) - [react/sort-default-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-default-props.md) - [react/sort-prop-types](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-prop-types.md) - [react/static-property-placement](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/static-property-placement.md) I also considered adding [`react/require-optimization`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/require-optimization.md) to the unsupported list, but there's an open PR for it right now, so I'll leave it be. These rules are not necessary to support, as React 19 and/or TypeScript have basically eliminated their usefulness entirely. Some are also arguably stylistic. See https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-proptypes-and-defaultprops for notes on the defaultProps/propTypes removal. Basically, modern React for >7 years has been primarily about function components `createReactClass` has been removed entirely from React core, it was moved into a separate package: ```js var Component = createReactClass({ propTypes: { a: PropTypes.any, r: PropTypes.array, o: PropTypes.object }, ... }); ``` Class-based components are discouraged and marked as legacy [in the React docs](https://react.dev/reference/react/Component) ```js class Greeting extends Component { render() { return <h1>Hello, {this.props.name}!</h1>; } } ``` And these rules mostly - or exclusively - cover behaviors relating to these older component patterns. I'm actually curious to hear @baevm's opinion on dropping these as rules we want to add support for, in case he has any opinion on the matter.
8ce2455 to
cd86347
Compare
# Oxlint ### 💥 BREAKING CHANGES - b34a155 linter/plugins: [**BREAKING**] `RuleTester` set `context.filename` to absolute path (#18702) (overlookmotel) ### 🚀 Features - 1753209 linter/vscode: Run extension when JS configs are detected (#18832) (camc314) - c962dd2 linter/lsp: Implement support for oxlint.config.ts (#18826) (camc314) - da32203 linter: Auto generate oxlint.config.ts types (#18597) (camc314) - 19b4df7 oxlint: Introduce `defineConfig` helper (#18596) (camc314) - ea97231 linter: Implement `oxlint.config.ts` support (#17563) (camc314) - 17ca42d linter: Implement `react/no-multi-comp` rule. (#18794) (connorshea) - 88f30e0 linter/plugins: Move eslint compatible plugin conversion to `eslintCompatPlugin` function (#18791) (overlookmotel) - 2a72794 linter/plugins: `RuleTester` take `cwd` property (#18756) (overlookmotel) - 9f533db linter: Add `find_prev_token_within` method for token search (#18769) (camc314) - 772ea70 linter: Introduce `load_js_configs` napi callback (#18767) (camc314) - e9690c1 linter: Introduce `DiscoveredConfig` in preparation for JS configs (#18674) (camc314) - 558b588 linter/prefer-namespace-keyword: Move to correctness (#18733) (camc314) - 7a5c268 oxlint/lsp: Support `jsPlugins` (#17840) (Sysix) - c07497c linter/prefer-modern-dom-apis: Implement suggestion (#17965) (Mikhail Baev) - 8531bc9 linter: Implement `prefer-const` (#18687) (camchenry) - 8670b18 parser: Error on ambient class accessor implementations (#18592) (camc314) - 6b8a5ae linter: Add `eslint-plugin-import/no-nodejs-modules` rule (#18006) (Mikhail Baev) - 04f400d linter/no-duplicates: Add support for `considerQueryString` option (#18657) (camc314) - 3b7f260 linter/consistent-generic-constructor: Implement fixer (#18616) (camc314) - 794f9e4 linter/prefer-exponentation-operator: Implement suggestion (#18602) (camc314) - 773d916 linter: `eslint/sort_keys` ignore leading and trailing spreads in auto-fix (#18485) (Lonami) - 20d4ede linter: Implement `import/no-relative-parent-imports` rule (#18513) (Valentin Maerten) - 0da45ef vscode: Fallback to globally installed oxlint/oxfmt packages (#18007) (Sysix) ### 🐛 Bug Fixes - a3417b1 linter/plugins: Clear state when reloading workspace (#18837) (overlookmotel) - c879992 linter: Error on arrays passed in as config (#18822) (camc314) - 5c80422 linter/tsdown: Ensure relative path for globals import starts with `./` (#18820) (camc314) - 7419dfb linter: Remove invalid debug assersion, add test (#18819) (camc314) - 0ca6269 ci: Fix the repo path normalization logic for tests on Windows. (#18815) (connorshea) - c7b0a65 linter: Fix config option docs for `react/jsx-boolean-value` rule. (#18811) (connorshea) - cce374e linter/prefer-const: Replace entire declaration over just the `let` kw (#18814) (camc314) - 41f92d1 linter: Error when given config options for a lint rule that has no config options defined. (#18809) (connorshea) - 0867a36 linter/consistent-index-object-style: False positive with mapped + generic types (#18801) (camc314) - 1d34b42 linter: Fix 32 bit build (#18783) (camc314) - 95df577 linter/plugins: Handle error from `destroyWorkspace` (#18763) (overlookmotel) - b3261dc linter: Fix the curly rule config to enforce the shape of the config and emit correct docs (#18743) (connorshea) - d981978 linter/plugins: Use non-blocking mode when calling `destroyWorkspace` (#18762) (overlookmotel) - 3f43d4c linter: Accept bools as valid values for `fixable` (#18772) (camc314) - 005910a linter/plugins: Support plugins outside of workspace (#18755) (overlookmotel) - fd92711 vscode: Use `fsPath` for workspace mapping (#18728) (Sysix) - 358b2c1 linter/consistent-generic-constructors: Check bounds when searching for `:` token (#18745) (connorshea) - abd0c28 linter/capitalized-comments: Fix generated rule option docs (#18748) (connorshea) - d90a9f6 linter: Add more tests for `prefer-const`'s fixer and fix its invalid behavior. (#18747) (connorshea) - f82011b oxlint/lsp: Disable JS plugins support in LSP except in tests (#18727) (overlookmotel) - 94505c8 linter/jest: Change `prefer-spy-on` autofix to suggestion (#18152) (Ben Lowery) - 6ec1112 linter: Mark unused disable directive fix as suggestion (#18703) (ddmoney420) - 49609ec linter/no-useless-constructor: Consider argument transformation as used (#18706) (ddmoney420) - 40218de linter: Fix behavior of jsx-a11y/no-static-element-interactions rule. (#17817) (connorshea) - db9751d linter/no-html-link-for-pages: Handle `target=_blank` correctly (#18693) (camc314) - e440b78 linter/plugins: Pass all args to CFG event handlers when 2 rules use same handler (#18683) (overlookmotel) - b393430 linter/curly: Fix multi-or-nest and consistent conflict (#18660) (camc314) - 2e1fbc2 linter/plugins: Implement `context.parserPath` (#18644) (overlookmotel) - 34951ed linter/plugins: `filename` option takes precedence over `parserOptions.lang` in `RuleTester` (#18643) (overlookmotel) - 28df160 linter/plugins: Allow line number passed to `report` to be 0 (#18642) (overlookmotel) - 14fabec vscode: Use built-in `getWorkspaceFolder` for detecting the right workspace of a given uri (#18583) (Sysix) - 0ff4cea oxlint/cli: Report error when nested config could not be parsed (#18504) (Sysix) ### ⚡ Performance - 9862224 linter/plugins: Reduce cost of workspaces (#18758) (overlookmotel) - 6bc0bde linter: Remove string allocation (#18725) (overlookmotel) - 3a6b41e linter/plugins: Replace ESLint Traverser with lightweight traverseNode (#18529) (Rintaro Itokawa) ### 📚 Documentation - dd1a653 linter: Fix doc comment for ignoreStateless config option. (#18808) (connorshea) - 5909085 linter/plugins: Add doc comments (#18753) (overlookmotel) - ffe53a3 linter: Update lint function docs (#18766) (camc314) - b82faec linter: Glob for any css module for no-unassigned-import (#18713) (Ben Stickley) - cd86347 linter: Mark some react rules as unsupported, misc docs improvements (#18617) (connorshea) - 23401d8 linter: Update fixes and suggestions status for tsgolint rules (#18619) (camchenry) # Oxfmt ### 🚀 Features - ee30de9 oxfmt: Add config migration from biome (#18638) (Luca Fischer) ### 🐛 Bug Fixes - e754b18 oxfmt/migrate-prettier: Set `experimentalSortPackagejson: false` by default (#18831) (leaysgur) - a83c266 formatter: Keep decorated function pattern hugged when params break (#18830) (Dunqing) - 0c8efe1 formatter: Quote numeric property keys with `quoteProps: consistent` (#18803) (Dunqing) - 9c14c3e formatter: Ignore comment does not work for sequence expressions in arrow function body (#18799) (Dunqing) - 54984ae formatter: Handle leading comments in arrow function sequence expressions (#18798) (Dunqing) - 61bb2b5 formatter: Correctly expand JSX returned from arrow callbacks in JSX expression containers (#18797) (Dunqing) - 34ee194 formatter: Tailwindcss sorting doesn't work for object property keys (#18773) (Dunqing) - 48f1e35 oxfmt: Prevent ThreadsafeFunction crash on Node.js exit (#18723) (Boshen) - e96adca formatter: Follow Prettier's approach for for-in initializer parentheses (#18695) (Dunqing) - 1215a6f formatter: Preserve quote for class property key in TypeScript (#18692) (Dunqing) - 059acae formatter: Incorrect comments placement for union type in `TSTypeIntersection` (#18690) (Dunqing) - c3d05c1 formatter,oxfmt: Handle CRLF with embedded formatting (#18686) (leaysgur) - 7cb3085 formatter: Preserve comments on rest elements (#18649) (Dunqing) - 21984dd formatter: Preserve type cast comments on rest parameters (#18648) (Dunqing) - 2f70254 formatter: Don't add extra semicolon on suppressed class properties (#18631) (Dunqing) - ac1ff4e oxfmt: Use `empty_line` IR for empty xxx-in-js line (#18623) (leaysgur) - 8f76900 oxfmt: Dedent xxx-in-js templates before calling prettier (#18622) (leaysgur) - 6b726ef oxfmt: Trim whitespace only xxx-in-js templates (#18621) (leaysgur) Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Marks the following rules from eslint-plugin-react as unsupported:
I also considered adding
react/require-optimizationto the unsupported list, but there's an open PR for it right now, so I'll leave it be.These rules are not necessary to support, as React 19 and/or TypeScript have basically eliminated their usefulness entirely. Some are also arguably stylistic.
See https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-proptypes-and-defaultprops for notes on the defaultProps/propTypes removal.
Basically, modern React for >7 years has been primarily about function components
createReactClasshas been removed entirely from React core, it was moved into a separate package:Class-based components are discouraged and marked as legacy in the React docs
And these rules mostly - or exclusively - cover behaviors relating to these older component patterns.
I'm actually curious to hear @baevm's opinion on dropping these as rules we want to add support for, in case he has any opinion on the matter.