Skip to content

fix: template-no-invalid-aria-attributes — skip custom elements (hyphenated tags)#34

Closed
johanrd wants to merge 3 commits into
masterfrom
fix/aria-props-skip-custom-elements
Closed

fix: template-no-invalid-aria-attributes — skip custom elements (hyphenated tags)#34
johanrd wants to merge 3 commits into
masterfrom
fix/aria-props-skip-custom-elements

Conversation

@johanrd
Copy link
Copy Markdown
Owner

@johanrd johanrd commented Apr 21, 2026

  • Premise: HTML custom elements (tags with a hyphen, per WHATWG valid-custom-element-name) define their own a11y contracts; they may intentionally use aria-* attributes whose validity depends on the component's shadow-DOM-mapped role, which ESLint cannot introspect.
  • Problem: our rule flags aria-* on every tag, including custom elements, producing false positives for patterns that work correctly at runtime.

Fix: skip the check when node.tag is a custom element (lowercase + hyphen). Matches angular-eslint's valid-aria behavior.

Ref: audit tracking PR #28 item G6.

Note: no audit/phase3/aria-props fixture currently exists on master — the tests/audit/aria-props/peer-parity.js audit fixture referenced in the finding (B9 DIVERGENCE #1) will need updating separately on its branch.

…enated tags)

HTML custom elements (tags with a hyphen, per WHATWG valid-custom-element-name)
define their own a11y contracts; they may intentionally use aria-* attributes
whose validity depends on the component's shadow-DOM-mapped role, which ESLint
cannot introspect. Our rule previously flagged aria-* on every tag, producing
false positives for these patterns.

Skip the check when node.tag is a custom element (lowercase + hyphen). Matches
angular-eslint's valid-aria behavior.

Ref: audit tracking PR #28 item G6.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 21, 2026

🏎️ Benchmark Comparison

Benchmark Control (p50) Experiment (p50) Δ
js small 14.31 ms 14.21 ms -0.7%
🟢 js medium 7.32 ms 7.10 ms -3.0%
🟢 js large 2.94 ms 2.84 ms -3.6%
gjs small 1.28 ms 1.25 ms -1.9%
gjs medium 620.17 µs 618.42 µs -0.3%
gjs large 246.95 µs 246.33 µs -0.3%
gts small 1.23 ms 1.24 ms +1.0%
gts medium 621.00 µs 619.37 µs -0.3%
🔴 gts large 245.84 µs 270.58 µs +10.1%

🟢 faster · 🔴 slower · 🟠 slightly slower · ⚪ within 2%

Full mitata output
clk: ~3.09 GHz
cpu: AMD EPYC 7763 64-Core Processor
runtime: node 24.14.1 (x64-linux)

benchmark                   avg (min … max) p75 / p99    (min … top 1%)
------------------------------------------- -------------------------------
js small (control)            16.86 ms/iter  18.80 ms █ ▂                  
                      (12.42 ms … 32.10 ms)  27.13 ms █▅█ ▂                
                    (  5.52 mb …  10.13 mb)   7.24 mb ███▇█▇▄▄▁▄▄▁▄▄▁▁▁▁▇▄▇

js small (experiment)         14.71 ms/iter  15.51 ms   █ █                
                      (12.97 ms … 20.36 ms)  18.76 ms  ▃█▆█▆     ▃         
                    (  6.38 mb …   8.11 mb)   6.83 mb ██████▄▄▄███▄█▁▁▁▁▁▁▄

                             ┌                                            ┐
                             ╷ ┌───────────┬─────┐                        ╷
          js small (control) ├─┤           │     ├────────────────────────┤
                             ╵ └───────────┴─────┘                        ╵
                               ╷ ┌──┬─┐         ╷
       js small (experiment)   ├─┤  │ ├─────────┤
                               ╵ └──┴─┘         ╵
                             └                                            ┘
                             12.42 ms           19.78 ms           27.13 ms

summary
  js small (experiment)
   1.15x faster than js small (control)

------------------------------------------- -------------------------------
js medium (control)            7.90 ms/iter   8.37 ms  █                   
                       (6.68 ms … 13.79 ms)  13.68 ms ▄█▆                  
                    (  2.43 mb …   4.65 mb)   3.55 mb ███▇▄▄▇▂▃▄▁▁▄▁▁▁▁▁▁▂▂

js medium (experiment)         7.69 ms/iter   8.10 ms █▆                   
                       (6.75 ms … 14.54 ms)  12.74 ms ██▂                  
                    (  2.73 mb …   4.27 mb)   3.52 mb ███▇▄▇▆▄▃▂▁▁▁▂▂▂▁▁▁▁▂

                             ┌                                            ┐
                             ╷ ┌─────┬──┐                                 ╷
         js medium (control) ├─┤     │  ├─────────────────────────────────┤
                             ╵ └─────┴──┘                                 ╵
                             ╷┌────┬──┐                             ╷
      js medium (experiment) ├┤    │  ├─────────────────────────────┤
                             ╵└────┴──┘                             ╵
                             └                                            ┘
                             6.68 ms           10.18 ms            13.68 ms

summary
  js medium (experiment)
   1.03x faster than js medium (control)

------------------------------------------- -------------------------------
js large (control)             3.68 ms/iter   3.90 ms █                    
                       (2.75 ms … 13.73 ms)  12.42 ms █                    
                    ( 20.70 kb …   2.89 mb)   1.44 mb █▅▃▃▃▂▂▂▁▁▂▁▁▁▁▁▁▁▁▁▁

js large (experiment)          3.10 ms/iter   2.92 ms  █                   
                        (2.63 ms … 7.89 ms)   6.13 ms  █                   
                    (850.20 kb …   2.28 mb)   1.43 mb ▅█▆▂▂▂▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                              ┌───┬┐                                      ╷
          js large (control)  │   │├──────────────────────────────────────┤
                              └───┴┘                                      ╵
                             ╷┌┬             ╷
       js large (experiment) ├┤│─────────────┤
                             ╵└┴             ╵
                             └                                            ┘
                             2.63 ms            7.52 ms            12.42 ms

summary
  js large (experiment)
   1.19x faster than js large (control)

------------------------------------------- -------------------------------
gjs small (control)            1.44 ms/iter   1.36 ms █                    
                        (1.21 ms … 8.42 ms)   5.79 ms █▃                   
                    (320.43 kb …   1.63 mb)   1.06 mb ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs small (experiment)         1.43 ms/iter   1.30 ms █                    
                        (1.21 ms … 6.98 ms)   5.32 ms █                    
                    (216.05 kb …   1.63 mb)   1.06 mb █▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌─┬                                          ╷
         gjs small (control) │ │──────────────────────────────────────────┤
                             └─┴                                          ╵
                             ┌─┬                                     ╷
      gjs small (experiment) │ │─────────────────────────────────────┤
                             └─┴                                     ╵
                             └                                            ┘
                             1.21 ms            3.50 ms             5.79 ms

summary
  gjs small (experiment)
   1.01x faster than gjs small (control)

------------------------------------------- -------------------------------
gjs medium (control)         679.27 µs/iter 634.83 µs █                    
                      (586.49 µs … 6.07 ms)   3.61 ms █                    
                    (  5.82 kb …   1.08 mb) 540.43 kb █▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs medium (experiment)      664.62 µs/iter 636.46 µs  █                   
                      (585.60 µs … 6.00 ms)   1.71 ms ▆█                   
                    (265.93 kb …   1.28 mb) 541.46 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌┬                                           ╷
        gjs medium (control) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             ┌┬               ╷
     gjs medium (experiment) ││───────────────┤
                             └┴               ╵
                             └                                            ┘
                             585.60 µs           2.10 ms            3.61 ms

summary
  gjs medium (experiment)
   1.02x faster than gjs medium (control)

------------------------------------------- -------------------------------
gjs large (control)          277.64 µs/iter 264.94 µs ██                   
                      (235.53 µs … 5.89 ms) 508.62 µs ██▂                  
                    ( 57.63 kb … 966.14 kb) 217.42 kb ████▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs large (experiment)       271.15 µs/iter 263.85 µs  █                   
                      (236.88 µs … 5.51 ms) 386.28 µs ▃█                   
                    (143.37 kb … 970.98 kb) 216.63 kb ██▆▃▇▆▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ╷┌─────┬                                     ╷
         gjs large (control) ├┤     │─────────────────────────────────────┤
                             ╵└─────┴                                     ╵
                             ╷┌────┬                  ╷
      gjs large (experiment) ├┤    │──────────────────┤
                             ╵└────┴                  ╵
                             └                                            ┘
                             235.53 µs         372.07 µs          508.62 µs

summary
  gjs large (experiment)
   1.02x faster than gjs large (control)

------------------------------------------- -------------------------------
gts small (control)            1.33 ms/iter   1.26 ms █                    
                        (1.19 ms … 6.62 ms)   5.32 ms █                    
                    (648.80 kb …   1.73 mb)   1.06 mb █▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gts small (experiment)         1.32 ms/iter   1.26 ms █                    
                        (1.21 ms … 6.07 ms)   4.32 ms █                    
                    (336.71 kb …   1.79 mb)   1.05 mb █▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌─┬                                          ╷
         gts small (control) │ │──────────────────────────────────────────┤
                             └─┴                                          ╵
                             ┌┬                                ╷
      gts small (experiment) ││────────────────────────────────┤
                             └┴                                ╵
                             └                                            ┘
                             1.19 ms            3.26 ms             5.32 ms

summary
  gts small (experiment)
   1.01x faster than gts small (control)

------------------------------------------- -------------------------------
gts medium (control)         669.85 µs/iter 636.72 µs  █                   
                      (588.41 µs … 5.90 ms)   1.65 ms ▆█                   
                    (303.56 kb …   1.19 mb) 542.02 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gts medium (experiment)      680.31 µs/iter 639.76 µs ▅█                   
                      (587.34 µs … 5.42 ms)   1.76 ms ██                   
                    ( 97.10 kb …   1.28 mb) 540.41 kb ██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ╷┌─┬                                     ╷
        gts medium (control) ├┤ │─────────────────────────────────────┤
                             ╵└─┴                                     ╵
                             ╷┌──┬                                        ╷
     gts medium (experiment) ├┤  │────────────────────────────────────────┤
                             ╵└──┴                                        ╵
                             └                                            ┘
                             587.34 µs           1.17 ms            1.76 ms

summary
  gts medium (control)
   1.02x faster than gts medium (experiment)

------------------------------------------- -------------------------------
gts large (control)          271.27 µs/iter 261.56 µs  █▄                  
                      (233.53 µs … 5.54 ms) 361.41 µs  ██                  
                    (170.59 kb … 957.70 kb) 216.91 kb ▄██▄▅▇▆▂▂▂▁▁▁▁▁▁▁▁▁▁▁

gts large (experiment)       364.76 µs/iter 455.94 µs █                    
                      (240.05 µs … 8.86 ms) 619.50 µs █                    
                    (215.75 kb … 965.81 kb) 217.08 kb ███▃▁▁▁▁▁▂▂█▅█▂▁▁▁▁▁▁

                             ┌                                            ┐
                             ╷┌──┬          ╷
         gts large (control) ├┤  │──────────┤
                             ╵└──┴          ╵
                              ╷┌────────────┬──────────┐                  ╷
      gts large (experiment)  ├┤            │          ├──────────────────┤
                              ╵└────────────┴──────────┘                  ╵
                             └                                            ┘
                             233.53 µs         426.51 µs          619.50 µs

summary
  gts large (control)
   1.34x faster than gts large (experiment)

johanrd and others added 2 commits April 21, 2026 16:28
Translates 94 cases from peer-plugin rules:
  - jsx-a11y aria-props
  - vuejs-accessibility aria-props
  - lit-a11y aria-unsupported-elements / valid-aria-*
  - @angular-eslint/template valid-aria

Fixture documents parity after this fix: custom elements (hyphenated
tags) now skip the check. jsx-a11y has no equivalent concept and
would still flag `<app-custom aria-x="text">`, which is documented
inline.
@johanrd
Copy link
Copy Markdown
Owner Author

johanrd commented Apr 21, 2026

Moved upstream to ember-cli#2732. See that PR.

@johanrd johanrd closed this Apr 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant