feat(linter/react): implement forbid-component-props rule#20005
feat(linter/react): implement forbid-component-props rule#20005camc314 merged 11 commits intooxc-project:mainfrom
forbid-component-props rule#20005Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds the react/forbid-component-props lint rule to oxc_linter, enabling configurable restrictions on passing certain props (defaulting to className and style) to React components while ignoring DOM nodes.
Changes:
- Implement
react/forbid-component-propswith support for exact and glob-pattern prop names and per-component allow/disallow lists. - Introduce
get_jsx_element_nameutility and corresponding tests to stringify JSX element names consistently (identifiers, member expressions, namespaced names,this.*). - Wire the new rule into the rule registry, runner, and add snapshot-based tests.
Reviewed changes
Copilot reviewed 4 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| crates/oxc_linter/src/utils/react.rs | Adds get_jsx_element_name and tests; refactors get_element_type to reuse the new helper. |
| crates/oxc_linter/src/rules/react/forbid_component_props.rs | New rule implementation + config schema + tests. |
| crates/oxc_linter/src/snapshots/react_forbid_component_props.snap | Snapshot output for the new rule’s diagnostics. |
| crates/oxc_linter/src/rules.rs | Registers the new React rule module. |
| crates/oxc_linter/src/generated/rules_enum.rs | Adds the rule to the generated rule enum + metadata plumbing. |
| crates/oxc_linter/src/generated/rule_runner_impls.rs | Adds runner implementation for the new rule’s AST node type. |
Merging this PR will not alter performance
Comparing Footnotes
|
1daefad to
c634519
Compare
|
Thanks for putting this together @baevm. cc @connorshea |
c634519 to
01aec3a
Compare
react/forbid-component-props ruleforbid-component-props rule
3f13552 to
002a10f
Compare
ready for review cc @camc314 |
# Oxlint ### 💥 BREAKING CHANGES - 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName` (#21711) (overlookmotel) - 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710) (overlookmotel) - c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement` (#21709) (overlookmotel) ### 🚀 Features - b4acdbd linter/vue: Implement no-deprecated-delete-set rule (#21766) (bab) - 613bfef linter: Split jest/prefer-to-contain into a jest and a vitest rule. (#21821) (connorshea) - c629719 linter/vue: Implement no-deprecated-events-api rule (#21793) (Alex Peshkov) - f2a8528 linter: Split jest/require-top-level-describe rule into a Jest and a Vitest rule. (#21822) (connorshea) - ea4b358 linter: Split jest/prefer-todo into a shared rule and a vitest-specific rule. (#21820) (connorshea) - 3a66819 linter: Split jest/no-mocks-import into vitest/no-mocks-import (#21818) (camchenry) - 0b3ffce linter: Split jest/no-large-snapshots into vitest/no-large-snapshots (#21814) (camchenry) - d1cf22e linter: Split jest/no-interpolation-in-snapshots into vitest/no-interpolation-in-snapshots (#21812) (camchenry) - bb0c359 linter: Split jest/no-identical-title into vitest/no-identical-title (#21810) (camchenry) - c26ea41 linter: Split jest/no-hooks into vitest/no-hooks (#21809) (camchenry) - 46b32f2 linter: Split jest/no-focused-tests into vitest/no-focused-tests (#21804) (camchenry) - acf41a8 linter: Split jest/no-duplicate-hooks into vitest/no-duplicate-hooks (#21803) (camchenry) - 54d787f linter: Split jest/no-disabled-tests into vitest/no-disabled-tests (#21802) (camchenry) - 9c9a676 linter/vue: Implement no-deprecated-data-object-declaration rule (#21764) (bab) - 4445855 linter: Split `jest/no-conditional-in-test` into `vitest/no-conditional-in-test` (#21763) (camchenry) - b8604de linter: Split `jest/no-conditional-expect` into `vitest/no-conditional-expect` (#21762) (camchenry) - 0dbd650 linter: Split `jest/no-commented-out-tests` into `vitest/no-commented-out-tests` (#21761) (camchenry) - 7f1a97c linter: Split `jest/no-alias-methods` into `vitest/no-alias-methods` (#21760) (camchenry) - eb97c49 linter: Split `jest/max-nested-describe` into `vitest/max-nested-describe` (#21759) (camchenry) - d870cad linter: Split `jest/max-expects` into `vitest/max-expects` (#21758) (camchenry) - 1b97124 linter/vue: Implement no-deprecated-vue-config-keycodes rule (#21699) (bab) - 5f81883 linter/eslint: Implement `func-name-matching` rule (#21708) (Mikhail Baev) - 348f46c linter: Add `respectEslintDisableDirectives` option (#21384) (Christian Vuerings) - 63ec351 linter: Support nested vite+ config discovery (#21638) (camc314) - 560feb4 linter: Introduce `Vite` variant to `DiscoveredConfigFile` (#21637) (camc314) - 07dc41e linter/eslint: Implement `no-underscore-dangle` rule (#21630) (Paul-Arthur THIERY) - e270d54 linter/react: Impl react/no-did-update-set-state (#17322) (Kenzo Wada) - ca81199 linter/react: Implement `forbid-component-props` rule (#20005) (Mikhail Baev) - 6776403 linter/branches-sharing-code: Move rule from nursery to pedantic (#21621) (camc314) - ce7a4dc linter/no-unreachable: Move rule from nursery to correctness (#21618) (camc314) - e3b5e78 linter/getter-return: Move rule from nursery to correctness (#21617) (camc314) - d3a7e9a linter/unicorn: Implement suggestion for `no-useless-iterator-to-array` rule (#21610) (Mikhail Baev) - a0c883c oxlint/lsp: Add vite plus version to server info (#21587) (Sysix) - 67ff860 linter/no-unknown-property: Support React 19 `precedence` prop (#21590) (João Pedro Schmitz) ### 🐛 Bug Fixes - aace797 linter: Detect Svelte TS and module scripts correctly (#20819) (mustafa0x) - 3612db1 linter/prefer-default-parameters: Skip reporting on object/class setters (#21836) (camc314) - 28c3521 oxlint/lsp: Remove overlapping edits for `source.fixAllDangerous.oxc` code action (#21785) (Sysix) - 705a82c linter/no-non-null-asserted-nullish-coalescing: Add fixer (#21827) (yyh) - 33f5535 linter: Add checks that `Program` is in current allocator chunk before JS plugins linting (#21774) (overlookmotel) - d122877 linter/no-extra-non-null-assertions: Add fixer (#21744) (yyh) - 37f0731 linter: `with_plugin_vitest(true)` working realiable in test mode (#21769) (Said Atrahouch) - e42e6a6 linter/role-supports-aria-props: False positive with `combobox` and `haspopup` (#21725) (Leonabcd123) - e24324f linter: Iframe-has-title false positive for template literals (#21714) (Leonabcd123) - 41a6510 linter/vitest/hoisted-apis-on-top: Only check first member (#20068) (Sidharth Vinod) - 98ed888 linter: Check initializer for allowConstantExport in only-export-components (#20608) (Eyüp Can Akman) - 1946e8b linter: Avoid applying override plugin categories to eslint rules (#21521) (bab) - 3d1e83a linter: Parse `<script>` tag attributes with curly braces in Svelte files (#21089) (bab) - bc6ade5 linter: Report actual disable directive prefix (#21682) (camc314) - bf84466 linter: Respect category settings in overrides (#19411) (Connor Shea) - 52ecb45 linter/vitest: Don't treat `test.extend` or `it.extend` as test functions (#21668) (Said Atrahouch) - aa1a00c linter: Support jsx-a11y attributes setting in anchor-is-valid rule (#21665) (camchenry) - 30e0ad3 linter/prefer-default-parameters: Preserve TS annotations in fixer (#21655) (camc314) - 8c425db linter: Allow string for jest version in config schema (#21649) (camc314) - 3617864 linter/react/display-name: Fix false positive for named default class (#21643) (Mikhail Baev) - f3a02cc linter/no-non-null-assertion: Improve diagnostic message (#21616) (Cameron) - c2ada2c linter: Make `--fix-dangerously` fix dangerous fixes and suggestions as documented (#13366) (Ulrich Stark) - 8265ed9 linter/sort-keys: Handle CRLF separated groups (#21608) (camc314) - 96c559e linter/no-shadow: Add note explaining enum member shadowing (#21607) (camc314) - 3b49389 linter: No-irregular-whitespace: add config options (#21559) (camchenry) ### ⚡ Performance - cdc9eae oxlint/lsp: Avoid clones on lsp options deserializion (#21748) (Sysix) - be2db80 linter/sort-keys: Reduce allocations (#21560) (camchenry) ### 📚 Documentation - 453d647 linter: Remove now-unnecessary compatibility notes from shared Jest/Vitest rules. (#21826) (connorshea) - b1574a2 linter: Fix the configuration docs for no-underscore-dangle rule. (#21801) (connorshea) - 6946aee linter: Remove no-longer-relevant documentation about vitest compatibility from shared Jest/Vitest rules. (#21799) (connorshea) - 0652ea2 linter: Misc grammar cleanup for Vitest rules. (#21755) (connorshea) - 99f0b68 linter: Improve docs for `vitest/require-mock-type-parameters` rule. (#21754) (connorshea) - 9e2796b linter: Improve the docs for the `vitest/hoisted-apis-on-top` rule. (#21753) (connorshea) - 2ccede2 linter: Improve function usage examples in doc comments (#21718) (overlookmotel) - 43adae9 linter: Add version section to rules page (#21601) (camchenry) - d15dad2 linter: Export rule version metadata (#21588) (Old Autumn) # Oxfmt ### 💥 BREAKING CHANGES - 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName` (#21711) (overlookmotel) - 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710) (overlookmotel) - c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement` (#21709) (overlookmotel) ### 🚀 Features - 3bc54a9 oxfmt: Respect nested config for `--stdin-filepath` (#21627) (leaysgur) - 144f27a oxfmt: Respect ignore settings for `--stdin-filepath` (#21625) (leaysgur) - 81c7ae4 oxfmt/lsp: Add vite plus version to server info (#21586) (Sysix) ### 🐛 Bug Fixes - 477435b formatter/sort_imports: Keep leading blank line when decreasing group transitions (#21835) (leaysgur) - 38d1e82 oxfmt/lsp: Format non `file://` URIs without a authority (#21647) (Sysix) - 5eb8e2b formatter/sort_imports: Preserve blank lines around ignored side-effect imports (#21692) (leaysgur) - 0dce3c6 oxfmt: Handle invalid `overrides` config without panic (#21661) (Yuji Sugiura) - 9f82ed4 formatter: Escape backticks in JSDoc inline code spans (#21577) (bab) ### ⚡ Performance - db6c603 oxfmt/lsp: Avoid clones on lsp options deserializion (#21749) (Sysix) - 6a96c76 formatter: Avoid heap alloc for jsdoc delimiter (#21597) (leaysgur) --------- Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com> Co-authored-by: Cameron Clark <cameron.clark@hey.com>
this PR adds
react/forbid-component-propsruleissue #1022