Skip to content

Add no-modifier-without-element-usage rule - #2839

Merged
NullVoxPopuli merged 2 commits into
masterfrom
nvp/discourage-modifiers-without-using-the-element
Aug 17, 2026
Merged

Add no-modifier-without-element-usage rule#2839
NullVoxPopuli merged 2 commits into
masterfrom
nvp/discourage-modifiers-without-using-the-element

Conversation

@NullVoxPopuli

Copy link
Copy Markdown
Contributor

New rule: report a modifier that never references its element.

A modifier that ignores its element is an effect scheduled by render, which is the data flow no-at-ember-render-modifiers exists to remove. That rule only bans an import, so the same pattern is reachable with three lines of ember-modifier.

Both styles are checked:

Style Element source
modifier(fn) from ember-modifier first param of the callback
class extending the default export or ClassBasedModifier first param of modify(), or this.element anywhere in the class

Any reference counts as usage, including destructuring and passing the element to something else. A missing first param is a violation. modify = someHelper is skipped, since the function is not visible here.

Not added to recommended. That is proposed for v14 in emberjs/rfcs#1217.

🤖 Generated with Claude Code

Reports modifiers that never reference their element, for both
`modifier()` callbacks and class modifiers (`modify(element)` or
`this.element`). Any reference counts as usage, including destructuring
and passing the element along.

Not in `recommended`; that is proposed for v14 in emberjs/rfcs#1217.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

🏎️ Benchmark Comparison

Benchmark Control (p50) Experiment (p50) Δ
js small 14.27 ms 14.20 ms -0.5%
🟢 js medium 7.11 ms 6.96 ms -2.1%
🟢 js large 2.81 ms 2.72 ms -3.3%
gjs small 1.12 ms 1.12 ms +0.1%
gjs medium 557.57 µs 558.48 µs +0.2%
gjs large 221.67 µs 219.22 µs -1.1%
gts small 1.11 ms 1.11 ms +0.0%
gts medium 555.31 µs 552.68 µs -0.5%
gts large 219.71 µs 220.17 µs +0.2%

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

Full mitata output
clk: ~2.70 GHz
cpu: AMD EPYC 9V74 80-Core Processor
runtime: node 24.19.0 (x64-linux)

benchmark                   avg (min … max) p75 / p99    (min … top 1%)
------------------------------------------- -------------------------------
js small (control)            17.50 ms/iter  18.47 ms █                    
                      (12.27 ms … 34.28 ms)  32.39 ms █ █                  
                    (  5.41 mb …  10.53 mb)   7.38 mb █▆█▃▆▃█▁▃▁▃▁▃▃▁▆▁▃▁▁▃

js small (experiment)         15.87 ms/iter  16.40 ms  █                   
                      (12.89 ms … 23.84 ms)  23.72 ms  █▂ ▂                
                    (  6.18 mb …   8.36 mb)   6.89 mb ▅██▁█▆▃▃▃▁▃▁▁▃▁▃▃▁▁▃▅

                             ┌                                            ┐
                             ╷┌──────────┬─┐                              ╷
          js small (control) ├┤          │ ├──────────────────────────────┤
                             ╵└──────────┴─┘                              ╵
                              ╷ ┌────┬┐                ╷
       js small (experiment)  ├─┤    │├────────────────┤
                              ╵ └────┴┘                ╵
                             └                                            ┘
                             12.27 ms           22.33 ms           32.39 ms

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

------------------------------------------- -------------------------------
js medium (control)            7.94 ms/iter   8.37 ms ▃█                   
                       (6.64 ms … 16.11 ms)  15.74 ms ██                   
                    (  2.70 mb …   5.01 mb)   3.58 mb ██▇▄▅▄▄▂▂▁▁▄▂▁▁▂▁▁▁▁▂

js medium (experiment)         7.60 ms/iter   8.10 ms ▂█                   
                       (6.41 ms … 14.25 ms)  13.18 ms ███                  
                    (  1.87 mb …   5.16 mb)   3.57 mb ███▇▄▆▆▄▂▂▂▂▁▁▄▁▁▁▂▁▂

                             ┌                                            ┐
                              ╷┌────┬─┐                                   ╷
         js medium (control)  ├┤    │ ├───────────────────────────────────┤
                              ╵└────┴─┘                                   ╵
                             ╷┌────┬─┐                        ╷
      js medium (experiment) ├┤    │ ├────────────────────────┤
                             ╵└────┴─┘                        ╵
                             └                                            ┘
                             6.41 ms           11.08 ms            15.74 ms

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

------------------------------------------- -------------------------------
js large (control)             3.32 ms/iter   3.02 ms  █                   
                       (2.63 ms … 11.48 ms)   7.98 ms ▅█                   
                    (223.09 kb …   3.23 mb)   1.46 mb ██▂▃▂▁▁▂▂▁▁▁▂▂▁▁▁▁▁▁▁

js large (experiment)          3.07 ms/iter   2.84 ms  █                   
                        (2.52 ms … 8.00 ms)   6.45 ms  █                   
                    (164.08 kb …   2.73 mb)   1.44 mb ▇█▄▁▂▂▂▂▁▂▁▂▁▁▁▁▂▁▁▁▁

                             ┌                                            ┐
                              ╷┌────┬                                     ╷
          js large (control)  ├┤    │─────────────────────────────────────┤
                              ╵└────┴                                     ╵
                             ╷┌───┬                          ╷
       js large (experiment) ├┤   │──────────────────────────┤
                             ╵└───┴                          ╵
                             └                                            ┘
                             2.52 ms            5.25 ms             7.98 ms

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

------------------------------------------- -------------------------------
gjs small (control)            1.26 ms/iter   1.15 ms █                    
                        (1.09 ms … 7.04 ms)   6.11 ms █                    
                    (196.31 kb …   1.66 mb)   1.06 mb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs small (experiment)         1.25 ms/iter   1.13 ms █                    
                        (1.10 ms … 7.08 ms)   6.13 ms █                    
                    (354.58 kb …   1.60 mb)   1.06 mb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌─┬                                          ╷
         gjs small (control) │ │──────────────────────────────────────────┤
                             └─┴                                          ╵
                             ┌┬                                           ╷
      gjs small (experiment) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             └                                            ┘
                             1.09 ms            3.61 ms             6.13 ms

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

------------------------------------------- -------------------------------
gjs medium (control)         612.49 µs/iter 566.01 µs █                    
                      (537.54 µs … 6.58 ms)   3.30 ms █                    
                    ( 74.88 kb …   1.12 mb) 540.05 kb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs medium (experiment)      609.27 µs/iter 566.30 µs █                    
                      (538.84 µs … 5.98 ms)   1.65 ms █                    
                    ( 54.62 kb …   1.13 mb) 541.26 kb █▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌┬                                           ╷
        gjs medium (control) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             ┌┬                ╷
     gjs medium (experiment) ││────────────────┤
                             └┴                ╵
                             └                                            ┘
                             537.54 µs           1.92 ms            3.30 ms

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

------------------------------------------- -------------------------------
gjs large (control)          249.35 µs/iter 229.46 µs  █                   
                      (214.50 µs … 6.09 ms) 354.33 µs  █▂                  
                    (180.23 kb …   1.37 mb) 217.27 kb ███▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gjs large (experiment)       241.34 µs/iter 226.54 µs  █                   
                      (212.98 µs … 5.76 ms) 299.31 µs  █▃                  
                    (170.18 kb … 933.98 kb) 216.66 kb ▃██▃▇▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ╷ ┌─────────┬                                ╷
         gjs large (control) ├─┤         │────────────────────────────────┤
                             ╵ └─────────┴                                ╵
                             ╷┌───────┬                 ╷
      gjs large (experiment) ├┤       │─────────────────┤
                             ╵└───────┴                 ╵
                             └                                            ┘
                             212.98 µs         283.66 µs          354.33 µs

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

------------------------------------------- -------------------------------
gts small (control)            1.21 ms/iter   1.12 ms █                    
                        (1.09 ms … 6.73 ms)   6.12 ms █                    
                    (182.22 kb …   1.57 mb)   1.06 mb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gts small (experiment)         1.22 ms/iter   1.12 ms █                    
                        (1.09 ms … 7.24 ms)   6.10 ms █                    
                    (220.07 kb …   1.50 mb)   1.05 mb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌┬                                           ╷
         gts small (control) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             ┌┬                                           ╷
      gts small (experiment) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             └                                            ┘
                             1.09 ms            3.60 ms             6.12 ms

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

------------------------------------------- -------------------------------
gts medium (control)         609.35 µs/iter 560.96 µs █                    
                      (537.27 µs … 6.41 ms)   1.64 ms █                    
                    (171.29 kb …   1.26 mb) 542.33 kb █▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gts medium (experiment)      610.67 µs/iter 559.43 µs █                    
                      (534.78 µs … 6.68 ms)   2.96 ms █                    
                    ( 85.02 kb …   1.04 mb) 540.74 kb █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌┬                  ╷
        gts medium (control) ││──────────────────┤
                             └┴                  ╵
                             ┌┬                                           ╷
     gts medium (experiment) ││───────────────────────────────────────────┤
                             └┴                                           ╵
                             └                                            ┘
                             534.78 µs           1.75 ms            2.96 ms

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

------------------------------------------- -------------------------------
gts large (control)          244.45 µs/iter 226.50 µs  █                   
                      (213.02 µs … 6.39 ms) 310.08 µs  █                   
                    ( 85.52 kb …   1.00 mb) 217.19 kb ▄██▅▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

gts large (experiment)       253.65 µs/iter 228.13 µs █                    
                      (212.89 µs … 5.78 ms) 682.12 µs █                    
                    (183.88 kb …   1.37 mb) 216.96 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

                             ┌                                            ┐
                             ┌──┬     ╷
         gts large (control) │  │─────┤
                             └──┴     ╵
                             ┌───┬                                        ╷
      gts large (experiment) │   │────────────────────────────────────────┤
                             └───┴                                        ╵
                             └                                            ┘
                             212.89 µs         447.50 µs          682.12 µs

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

@NullVoxPopuli
NullVoxPopuli merged commit 7eb15a7 into master Aug 17, 2026
10 checks passed
@NullVoxPopuli
NullVoxPopuli deleted the nvp/discourage-modifiers-without-using-the-element branch August 17, 2026 20:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants