From aca21f2aac500f9473990fd3999a2abc2f2ec3b4 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 8 Nov 2022 23:30:25 +0800 Subject: [PATCH] `prefer-add-event-listener`: Only fix `ExpressionStatement`, check `operator` (#1955) --- rules/prefer-add-event-listener.js | 8 ++- test/prefer-add-event-listener.mjs | 11 ++-- .../prefer-add-event-listener.mjs.md | 53 ++++++++++++++++++ .../prefer-add-event-listener.mjs.snap | Bin 1728 -> 1913 bytes 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/rules/prefer-add-event-listener.js b/rules/prefer-add-event-listener.js index 8573bce3e1..1cba8982e6 100644 --- a/rules/prefer-add-event-listener.js +++ b/rules/prefer-add-event-listener.js @@ -94,7 +94,7 @@ const create = context => { return; } - const {left: memberExpression, right: assignedExpression} = node; + const {left: memberExpression, right: assignedExpression, operator} = node; if ( memberExpression.type !== 'MemberExpression' @@ -132,7 +132,11 @@ const create = context => { } else if (eventTypeName === 'error') { // Disable `onerror` fix, see #1493 extra = extraMessages.error; - } else { + } else if ( + operator === '=' + && node.parent.type === 'ExpressionStatement' + && node.parent.expression === node + ) { fix = fixer => fixCode(fixer, context.getSourceCode(), node, memberExpression); } diff --git a/test/prefer-add-event-listener.mjs b/test/prefer-add-event-listener.mjs index 609e86cccc..a28475f211 100644 --- a/test/prefer-add-event-listener.mjs +++ b/test/prefer-add-event-listener.mjs @@ -5,7 +5,7 @@ const {test} = getTester(import.meta); const excludeFooOptions = [{excludedPackages: ['foo']}]; -test({ +test.snapshot({ valid: [ 'foo.addEventListener(\'click\', () => {})', 'foo.removeEventListener(\'click\', onClick)', @@ -64,11 +64,6 @@ test({ options: excludeFooOptions, }, ], - invalid: [], -}); - -test.snapshot({ - valid: [], invalid: [ 'foo.onclick = () => {}', 'foo.onclick = 1', @@ -166,6 +161,10 @@ test.snapshot({ }, 'myWorker.port.onmessage = function(e) {}', '((foo)).onclick = ((0, listener))', + 'window.onload = window.onunload = function() {};', + 'window.onunload ??= function() {};', + 'window.onunload ||= function() {};', + 'window.onunload += function() {};', ], }); diff --git a/test/snapshots/prefer-add-event-listener.mjs.md b/test/snapshots/prefer-add-event-listener.mjs.md index 09a8e03efd..b3d711f9b2 100644 --- a/test/snapshots/prefer-add-event-listener.mjs.md +++ b/test/snapshots/prefer-add-event-listener.mjs.md @@ -441,3 +441,56 @@ Generated by [AVA](https://avajs.dev). > 1 | ((foo)).onclick = ((0, listener))␊ | ^^^^^^^ Prefer \`addEventListener\` over \`onclick\`.␊ ` + +## Invalid #27 + 1 | window.onload = window.onunload = function() {}; + +> Output + + `␊ + 1 | window.addEventListener('load', window.onunload = function() {});␊ + ` + +> Error 1/2 + + `␊ + > 1 | window.onload = window.onunload = function() {};␊ + | ^^^^^^ Prefer \`addEventListener\` over \`onload\`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | window.onload = window.onunload = function() {};␊ + | ^^^^^^^^ Prefer \`addEventListener\` over \`onunload\`.␊ + ` + +## Invalid #28 + 1 | window.onunload ??= function() {}; + +> Error 1/1 + + `␊ + > 1 | window.onunload ??= function() {};␊ + | ^^^^^^^^ Prefer \`addEventListener\` over \`onunload\`.␊ + ` + +## Invalid #29 + 1 | window.onunload ||= function() {}; + +> Error 1/1 + + `␊ + > 1 | window.onunload ||= function() {};␊ + | ^^^^^^^^ Prefer \`addEventListener\` over \`onunload\`.␊ + ` + +## Invalid #30 + 1 | window.onunload += function() {}; + +> Error 1/1 + + `␊ + > 1 | window.onunload += function() {};␊ + | ^^^^^^^^ Prefer \`addEventListener\` over \`onunload\`.␊ + ` diff --git a/test/snapshots/prefer-add-event-listener.mjs.snap b/test/snapshots/prefer-add-event-listener.mjs.snap index 9875badfd38ba0bf65690081d4ad9cdae8215389..ddf58857ff9f485893e70d9ed2ae77761728cdec 100644 GIT binary patch literal 1913 zcmV-<2Zs1TRzV567V_Ei|JnlJP+k7-^X^I@xG1%Pf0XsYU0WdltBtU3O8N((cR;yWc(cKi~g4 z|9`hS1c2e7Px!9$ulCQD{;J!yBRkDf!T|Z&ho$e|QK#P>-}cPlqR?Fhd0Xljg1&?o zgf;$@HETWJSa)h_+mscnBN>8T&jJu0Q_Dw=ac@g}VNO(T^WMi9f)?YQB1Yf8gN=?{ z`fzeh%c1^U2usipsO0wnU{Lj_t?RRX9UMO`X^-*71I-LU8?nSr&lip_2hNo*o}IVH zQdG|nbaN;GH;q{|bja(IXQaT?Z{L3Yx`_-yH}(aSbs%~ zR{`*#@#*c2iH7%%lr2IZ9-b(&1hrB*gyrFlccOP{7p~YnH#GUqPn&BPf*u+GfNAZP zGRftLsLEuj5_O|jsZopz6W?l2gxetfU z`+oLPYj{*DL(t)o06e*Aj!;oIp{;3V&Ab^Sk7cn0MN}3=0r1o}xkt@UhW|WlqkU^e z>H32VK|`VeSQh*4_W2{*cIeJN{!#1lQF|DIK80o7h93%B$Nwn4X4n~(6xU>83HmXW zwt)b=v0-60vVYKUNA|3`5<_$?OVEsK6xoDjXP-KA-hDX-SEVeTKYQ_kGM1nxsN6dU zfab$@eb;oh?&HtKl_|?QLII>{v zvM+CL*_Sex`;#GP^iTlKA6#l_dbR$y)~4o@g>@sgvji=m@)ed45Jswx2?bGX1JGr_ zL|6$+tpYEWCWt~2vWOCL3pSDCVLG&kq7LG#64I+sb-}3;vLFeXIG&&MC=y)vSe-5; zAjt&9M`c{C(3Al4oCunbyfncfk^d8sg>&0n24fmja0$8Gl912Y+z2z!V+wi`bcxU< zS&NIYQrAob9g=8wxDs?KYxV}R#$bf$8H&cs#ww;nYZNu7vJ!{KEtp+aQNV^(c+z~^ z6ofTiJJjw>W9ZJ9E8Z4Kk|?!1QN3O8TM;eTV>zM=VVgOZY`BD=)d_j41wV`gGlE6P zRf>=RO%;mO@yLekSf9ts!vr~j_iy6kr2$NtX{+leDL>&iEw!0 zr;w9~d(>8IjSs?ZsyO(9oi>w`5U;Qs(eb=euBw||3xO^s#i~lEd|E#=#$BK693EUr z$Q$zDD~PQQlt`%e^Qb3P#eN;ISGQNY@v_QyJx+MNpQGgNK#`{r*EUB@Ys5ZPsdZ~z zNgoQJ#%G5O!kfOj>%uPKydVzR>tee;lh|#qDnaF#oPa&R}$WWt| z_CLi>`%h|L!8sgwg@8)swFYm+V$y#Gq z^BrRWU9ZXNo)0LhfSv}FuhlMhNO@am!H17>F40(GO37EwbgOcAc@G<=wsnx>+0ZdM z$$skBeqMWhNG4{F(cqnpyY$p;|6a?w2qV<4bOkU$aNBG_G4FP^)sPSB1#tZMOZx)Y zTc>Lbqb|k@`F!P^FiR9Yv?}Ez*53(>m;E13*jav}e9I*ca(RIK_VwC!36i{*a_t6n zCwFpXojW=Hs_o4k6f{7>U6wi5{jA4J*!Kb-?5szZU;L~`6=}(i z4(dk~KU5#|`ICfyq8B)LFc0|LN7EyER5U)f$?J{&u5?0w@55F9e(%;0RJ*_sR5~PT z@?e_J_$2mT0*s}!40s1)cX>J{9@;2s)R44Nk_Mv0*g0V}kM-)%dN2KM&GJBf=Yky^Z!!c^SJ&44}+a{cO3u#H#N2m literal 1728 zcmV;x20!^hRzVa$t!NUV21;q~(X=)e~LGuG|xqXKh$L_VaClH>flMRlV zf?7^$*@x3mY8IJ;X^f62OumeZA_n6>m$a?<`~FM_P0;BfviyK0x_abi zZ)aW^9G{bT#Q5ZiCW@fX^Z_7tRvveLJ#cM&@5b^Ywt_l}pedmMj2N}*u}43dwjdd% z{<`m-$EQ#PHT4C+xOvHi4rFm1@1i(w5ddDp6DQ^(Km zuuudw^aCJ!>V>n-n?9}|Q(sqhv~L4T6SPo~Q&@5{DjQSZs;P*b^yW_|vtAiW6Le^} zEa^G`<``ewd&q3~vbA&-`ufZio+juLMJ{2P_rXN;Ma{|$4a-84CZ1~AMiKNmX3zu`AChIv007viLkG>Rx0*M4@}iUS$DE`Hx(~~%J1V&H+R1H= z3%4y_F#KF5O;9RA7X8BjtcyLccg66w{kj`VziC-N@(4xHU0Akmzm(rH;SYY7;b3H9 zT%(01=v76AMFQ~Y_LW(v_^bM{SufTW8KP=vf)*&!g5_YJT5Imi?9;C&uU@fa^@&oN zpaY_0absyZGwHX+8@1nV`n&BTIQn=YMbK6($HGQz2|JgaQ+GUK+=|K72{b_`43gz6 zmJ^wY83X@H->|jd`7j$+MH4jo5m^>tY1N$%ZAe>?7nwREdGomIYiNS*Q^Xt%z!eKs z*;=_}-Oo=oA4^`wT&D<{G8llHr`OsVch+5PX>7WfUps6sP0(eEgvS670>VfYP@y1_ zt_QkwXoibniJfEl5);oAAR8|rH|O9P7LJEDp4UNqEr!aKue#uL0ojlMEey*}U4%IC zIlD_l91<*$UnJpbg%%Ucbs=a$(o&OCApfTz8{>9}24fnOaRG^Lfy-kYZiE@=F$KK^ ziaZnrdto6~DlSCODe%Qk(WFyZb2N}O1|uAwE^EAhtV*L4tMC?V5)uSnXt$-@ljdVd z@cfAuOgx(x5q>lyO3xP%w7Vc{x8co*vm#i4#1e!!XepOH8jl>P80+(Rc~~IBv3_oA zA8gQ*<$9yVgy|;2#rSWMWRjb+iguoZ1&n|VD#vg#hQqBq=MrHN&tO9Z^pe{yAcG!% z)f**qN0a?2(n5@N;ghHFZI8;6)JzO}9odEk;%8Ia5<(aVT;Ad`bH#CV#* z-(yrip+XfZqERX$t;U|mi>UHCuS+&+GWmYVxH%Tt>>Ogd;US=6{NMmoR7v_{aHUs% zPnVtITzQL>lKve_U+@}RTsDgrijZJ(@`8wME=DdFQ;2**P9pA6Tdg%d2)h-Ue6 zOTdxYUhT&FD&O@u;q_g#5_7kmvj~-8PjEQm-Uh5`ixyQUQkMJl>&~qxDDNnWv}rn4 zHy10ET_1-^tqwPf*y)V52q(2GE)~wz$0S zdp<5z0lf?qzV>3NUrUdLHe3pFl_;^ql#(8tvzE%;Wj$=)+D1m2g`s1ROMVJ(?;c(s zlJlF#Xz-rYI(7Ixcdvoofe~s~iUCaE+zv-j%)32lX~_Q|{7j4vKG(h0* z%h-2+^kD_;dyWnE=%XyZ^P`WVNJ};$s5jg$sLt{GzSuR<+nmGH3x1!YX_?FvZ) zQDXE>Sk1OxJwsjts@^FbA$@wMbbK&A_y@`HDj(pJyHdVs0TK