feat(linter/jsx-a11y/): implement no-interactive-element-to-noninteractive-role#22332
Conversation
3944c95 to
efc89ef
Compare
There was a problem hiding this comment.
Pull request overview
Implements the jsx-a11y/no-interactive-element-to-noninteractive-role rule in oxc_linter, flagging interactive HTML elements that are assigned non-interactive ARIA roles (with support for component mapping via settings.jsx-a11y.components and configurable per-element allowed role overrides), and adds snapshot-backed tests.
Changes:
- Added a new
jsx_a11yrule implementation forno-interactive-element-to-noninteractive-rolewith configurable allowed-role overrides. - Added unit tests and an insta snapshot for pass/fail cases (including component mapping settings).
- Registered the new rule in the rule module tree and generated rule enum/runner plumbing.
Reviewed changes
Copilot reviewed 3 out of 5 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| crates/oxc_linter/src/rules/jsx_a11y/no_interactive_element_to_noninteractive_role.rs | New rule implementation + tests for interactive elements assigned non-interactive roles. |
| crates/oxc_linter/src/snapshots/jsx_a11y_no_interactive_element_to_noninteractive_role.snap | New snapshot output covering the rule’s diagnostics on failing cases. |
| crates/oxc_linter/src/rules.rs | Exposes the new rule module under jsx_a11y. |
| crates/oxc_linter/src/generated/rules_enum.rs | Registers the rule in the generated rule enum and metadata dispatch. |
| crates/oxc_linter/src/generated/rule_runner_impls.rs | Hooks the rule into the runner with JSXOpeningElement node filtering. |
Merging this PR will not alter performance
Comparing Footnotes
|
# Oxlint ### 🚀 Features - 5478fb5 linter/jsdoc: Implement `require-throws-description` rule (#22386) (Mikhail Baev) - b46d4de linter: Add `--debug` options and add per-rule timing info (#22282) (camchenry) - c73225e linter/eslint: Implement `prefer-arrow-callback` rule (#22312) (박천(Cheon Park)) - de82b59 linter: Add support for `eslint-plugin-jsx-a11y-x` (#22356) (mehm8128) - b170da3 linter: Implement no-implicit-globals (#22249) (Jovi De Croock) - f44b6c8 linter: Fill schemas `DummyRuleMap` with built-in rules (#22288) (Sysix) - 5cdb80d linter/jsx-a11y/: Implement no-interactive-element-to-noninteractive-role (#22332) (anarefolio) - 2749422 linter/jsx-a11y: Add no-noninteractive-element-interactions (#22337) (Pablo Tovar) - ba2a1d3 linter/jsdoc: Implement `require-throws-type` rule (#22358) (Mikhail Baev) - d90729d linter/jsx-a11y: Implement control-has-associated-label (#21985) (mehm8128) - 1d04903 linter/jsdoc: Implement `require-yields-type` rule (#22331) (Mikhail Baev) ### 🐛 Bug Fixes - 04c4609 linter/no-nullable-type-assertion-style: Mark as suggestion (#22450) (camc314) - 1c2b7ec linter/no-unused-vars: Handle shadowed self assignments (#22387) (camc314) - 9faa1d5 linter/no-noninteractive-tabindex: Check conditional expressions (#22435) (camc314) - 0854b3a linter/prefer-arrow-callback: Preserve TSX generic arrows in fixer (#22434) (camc314) - 410b814 linter: Supply `source_type` to codegen fixer (#22433) (camc314) - 3c1bb6f linter: Skip per-node dispatch for run_once-only rules in large files (#22398) (Connor Shea) - 5206cde linter/no-unused-vars: Improve type-only rest parameters diagnostic (#22385) (camc314) - c9a22b5 linter/consistent-function-scoping: Allow imported bindings (#22384) (camc314) - c1e966d linter: Report type-only unused parameters in no-unused-vars (#22368) (camchenry) - 4818d98 linter: Check whether path is under root before ignoring it (#20101) (Leonabcd123) - 41fcdcf linter: Fix rule count not including override rules (#19898) (Daniel Osmond) - 59b4f0e linter: Fix 'explicit-module-boundary-types' false positive with 'allowOverloadFunctions' (#22341) (camchenry) ### ⚡ Performance - 6d42395 linter: Narrow no-unsafe-optional-chaining dispatch (#22437) (camchenry) - 08595fb linter: Optimize no-unreachable (#22397) (camchenry) - 3b46a8d linter: Optimize `no-loss-of-precision` (#22395) (camchenry) - b3e2dc9 linter: Optimize `oxc/bad-array-method-on-arguments` (#22393) (camchenry) ### 📚 Documentation - dcbf62c linter: Remove some duplicate spaces (#22359) (camc314) # Oxfmt ### 💥 BREAKING CHANGES - 21bb5d1 oxfmt: [**BREAKING**] Avoid config pre-scan (#22258) (leaysgur) ### 🐛 Bug Fixes - 441d724 oxfmt: Fix "race probe" logic with unit tests (#22378) (leaysgur) - e49ee26 formatter: Respect `singleQuote` for jsdoc `import()` type paths (#22353) (Colin Lienard) - 43b9978 formatter/sort_imports: Treat subpath imports as internal (#22440) (leaysgur) - 7c5cfa0 formatter: Handle jsx trailing comment with parens (#22370) (leaysgur) - ac5f120 formatter: Fix erroneous formatting inside a template literal with parentheses (#22262) (Jovi De Croock) - 3c53a95 formatter/sort_imports: Handle ignore comment as boundary (#22369) (leaysgur) - 4dd83dd oxfmt: Send expandedStates variants as shared refs (#22366) (leaysgur) - 055cc61 formatter: Expand JSX logical chain with leading line comment (#22346) (leaysgur) - 8046222 formatter: Preserve type alias comment break (#22261) (Jovi De Croock) ### ⚡ Performance - 123c493 oxfmt: Reduce more syscalls (#22380) (leaysgur) Co-authored-by: overlookmotel <557937+overlookmotel@users.noreply.github.com>
Implements the jsx-a11y/no-interactive-element-to-noninteractive-role rule.
Summary
This rule prevents assigning non-interactive ARIA roles to interactive HTML elements such as button, a[href], and input.
Features
Detects interactive elements with invalid non-interactive roles
Supports component mapping via settings.jsx-a11y.components
Handles anchors with and without href
Supports configurable allowed roles per element
Includes default support for tr + presentation/none
Full test coverage with pass/fail cases and snapshots
Testing
Added unit tests for valid and invalid cases
Snapshot updated with insta
part of #1141