Skip to content

Commit

Permalink
fix: use phf::Set to store the required properties for each role as…
Browse files Browse the repository at this point in the history
… a string at compile time
  • Loading branch information
yossydev committed Jan 8, 2024
1 parent bf1b96c commit 7a2f75c
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use oxc_diagnostics::{
};
use oxc_macros::declare_oxc_lint;
use oxc_span::Span;
use phf::phf_map;
use phf::{phf_map, phf_set};

#[derive(Debug, Error, Diagnostic)]
#[error(
Expand Down Expand Up @@ -47,15 +47,15 @@ declare_oxc_lint!(
correctness
);

static ROLE_TO_REQUIRED_ARIA_PROPS: phf::Map<&'static str, &'static str> = phf_map! {
"checkbox" => "aria-checked",
"radio" => "aria-checked",
"combobox" => "aria-controls, aria-expanded",
"tab" => "aria-selected",
"slider" => "aria-valuemax, aria-valuemin, aria-valuenow",
"scrollbar" => "aria-valuemax, aria-valuemin, aria-valuenow, aria-orientation, aria-controls",
"heading" => "aria-level",
"option" => "aria-selected",
static ROLE_TO_REQUIRED_ARIA_PROPS: phf::Map<&'static str, phf::Set<&'static str>> = phf_map! {
"checkbox" => phf_set!{"aria-checked"},
"radio" => phf_set!{"aria-checked"},
"combobox" => phf_set!{"aria-controls", "aria-expanded"},
"tab" => phf_set!{"aria-selected"},
"slider" => phf_set!{"aria-valuemax", "aria-valuemin", "aria-valuenow"},
"scrollbar" => phf_set!{"aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-orientation", "aria-controls"},
"heading" => phf_set!{"aria-level"},
"option" => phf_set!{"aria-selected"},
};

impl Rule for RoleHasRequiredAriaProps {
Expand All @@ -66,17 +66,15 @@ impl Rule for RoleHasRequiredAriaProps {
let Some(JSXAttributeValue::StringLiteral(role_values)) = &attr.value else { return };
let roles = role_values.value.split_whitespace();
for role in roles {
let required_props = match ROLE_TO_REQUIRED_ARIA_PROPS.get(role) {
Some(required_props) => required_props,
None => continue,
};
for prop in required_props.split(',').map(str::trim) {
if has_jsx_prop_lowercase(jsx_el, prop).is_none() {
ctx.diagnostic(RoleHasRequiredAriaPropsDiagnostic {
span: attr.span,
role: role.into(),
props: prop.into(),
});
if let Some(props) = ROLE_TO_REQUIRED_ARIA_PROPS.get(role) {
for prop in props {
if has_jsx_prop_lowercase(jsx_el, *prop).is_none() {
ctx.diagnostic(RoleHasRequiredAriaPropsDiagnostic {
span: attr.span,
role: role.into(),
props: (*prop).into(),
});
}
}
}
}
Expand Down
70 changes: 35 additions & 35 deletions crates/oxc_linter/src/snapshots/role_has_required_aria_props.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
source: crates/oxc_linter/src/tester.rs
expression: role_has_required_aria_props
---
eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuemax`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuenow`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='slider' />
· ─────────────
╰────
help: Add missing aria props `aria-valuemax` to the element with `slider` role.
help: Add missing aria props `aria-valuenow` to the element with `slider` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuemin`.
╭─[role_has_required_aria_props.tsx:1:1]
Expand All @@ -16,26 +16,26 @@ expression: role_has_required_aria_props
╰────
help: Add missing aria props `aria-valuemin` to the element with `slider` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuenow`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuemax`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='slider' />
· ─────────────
╰────
help: Add missing aria props `aria-valuenow` to the element with `slider` role.
help: Add missing aria props `aria-valuemax` to the element with `slider` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuemin`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuenow`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='slider' aria-valuemax />
· ─────────────
╰────
help: Add missing aria props `aria-valuemin` to the element with `slider` role.
help: Add missing aria props `aria-valuenow` to the element with `slider` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuenow`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuemin`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='slider' aria-valuemax />
· ─────────────
╰────
help: Add missing aria props `aria-valuenow` to the element with `slider` role.
help: Add missing aria props `aria-valuemin` to the element with `slider` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `slider` role is missing required aria props `aria-valuenow`.
╭─[role_has_required_aria_props.tsx:1:1]
Expand Down Expand Up @@ -114,6 +114,13 @@ expression: role_has_required_aria_props
╰────
help: Add missing aria props `aria-expanded` to the element with `combobox` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemax`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
Expand All @@ -128,6 +135,13 @@ expression: role_has_required_aria_props
╰────
help: Add missing aria props `aria-valuemin` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
· ────────────────
╰────
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuenow`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
Expand All @@ -137,24 +151,24 @@ expression: role_has_required_aria_props

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
1<div role='scrollbar' aria-valuemax />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemin`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' />
1<div role='scrollbar' aria-valuemax />
· ────────────────
╰────
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.
help: Add missing aria props `aria-valuemin` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemin`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax />
· ────────────────
╰────
help: Add missing aria props `aria-valuemin` to the element with `scrollbar` role.
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuenow`.
╭─[role_has_required_aria_props.tsx:1:1]
Expand All @@ -165,14 +179,14 @@ expression: role_has_required_aria_props

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax />
1<div role='scrollbar' aria-valuemax aria-valuemin />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax />
1<div role='scrollbar' aria-valuemax aria-valuemin />
· ────────────────
╰────
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.
Expand All @@ -186,52 +200,38 @@ expression: role_has_required_aria_props

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax aria-valuemin />
1<div role='scrollbar' aria-valuemax aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax aria-valuemin />
· ────────────────
╰────
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemin`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-valuemin` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemax aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-controls` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemax`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemin aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-valuemax` to the element with `scrollbar` role.
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-orientation`.
eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-valuemax`.
╭─[role_has_required_aria_props.tsx:1:1]
1<div role='scrollbar' aria-valuemin aria-valuenow />
· ────────────────
╰────
help: Add missing aria props `aria-orientation` to the element with `scrollbar` role.
help: Add missing aria props `aria-valuemax` to the element with `scrollbar` role.

eslint-plugin-jsx-a11y(role-has-required-aria-props): `scrollbar` role is missing required aria props `aria-controls`.
╭─[role_has_required_aria_props.tsx:1:1]
Expand Down

0 comments on commit 7a2f75c

Please sign in to comment.