From 88018caaaf87536db8e2132e2f8740ea8bd96f49 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 19 Jan 2021 14:50:08 +0800 Subject: [PATCH] `prefer-query-selector`: Fix crash on unexpected selector (#1034) --- rules/prefer-query-selector.js | 2 +- test/integration/projects.js | 4 +- test/prefer-query-selector.js | 64 +++++++++---------- test/snapshots/prefer-query-selector.js.md | 10 +++ test/snapshots/prefer-query-selector.js.snap | Bin 1263 -> 1300 bytes 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/rules/prefer-query-selector.js b/rules/prefer-query-selector.js index b1e2d5b2aa..cb0c659532 100644 --- a/rules/prefer-query-selector.js +++ b/rules/prefer-query-selector.js @@ -67,7 +67,7 @@ function * getTemplateLiteralFix(fixer, node, identifierName) { const canBeFixed = node => { if (node.type === 'Literal') { - return node.value === null || Boolean(node.value.trim()); + return node.raw === 'null' || (typeof node.value === 'string' && Boolean(node.value.trim())); } if (node.type === 'TemplateLiteral') { diff --git a/test/integration/projects.js b/test/integration/projects.js index 35c7f19dc8..d909b3a1c4 100644 --- a/test/integration/projects.js +++ b/test/integration/projects.js @@ -158,7 +158,9 @@ module.exports = [ ] }, // #903 - 'https://github.com/mattermost/mattermost-webapp' + 'https://github.com/mattermost/mattermost-webapp', + // #1030 + 'https://github.com/astrofox-io/astrofox' ].map(project => { if (typeof project === 'string') { project = {repository: project}; diff --git a/test/prefer-query-selector.js b/test/prefer-query-selector.js index 5db0c69f2c..c0dd0d6095 100644 --- a/test/prefer-query-selector.js +++ b/test/prefer-query-selector.js @@ -2,7 +2,7 @@ import {outdent} from 'outdent'; import {test} from './utils/test.js'; import notDomNodeTypes from './utils/not-dom-node-types.js'; -test({ +test.snapshot({ valid: [ // Not `CallExpression` 'new document.getElementById(foo);', @@ -29,35 +29,35 @@ test({ 'document.querySelectorAll("li a");', 'document.querySelector("li").querySelectorAll("a");' ], - invalid: [] + invalid: [ + 'document.getElementById("foo");', + 'document.getElementsByClassName("foo");', + 'document.getElementsByClassName("foo bar");', + 'document.getElementsByTagName("foo");', + 'document.getElementById("");', + 'document.getElementById(\'foo\');', + 'document.getElementsByClassName(\'foo\');', + 'document.getElementsByClassName(\'foo bar\');', + 'document.getElementsByTagName(\'foo\');', + 'document.getElementsByClassName(\'\');', + 'document.getElementById(`foo`);', + 'document.getElementsByClassName(`foo`);', + 'document.getElementsByClassName(`foo bar`);', + 'document.getElementsByTagName(`foo`);', + 'document.getElementsByTagName(``);', + 'document.getElementsByClassName(`${fn()}`);', // eslint-disable-line no-template-curly-in-string + 'document.getElementsByClassName(`foo ${undefined}`);', // eslint-disable-line no-template-curly-in-string + 'document.getElementsByClassName(null);', + 'document.getElementsByTagName(null);', + 'document.getElementsByClassName(fn());', + 'document.getElementsByClassName("foo" + fn());', + 'document.getElementsByClassName(foo + "bar");', + outdent` + for (const div of document.body.getElementById("id").getElementsByClassName("class")) { + console.log(div.getElementsByTagName("div")); + } + `, + // #1030 + 'e.getElementById(3)' + ] }); - -test.snapshot([ - 'document.getElementById("foo");', - 'document.getElementsByClassName("foo");', - 'document.getElementsByClassName("foo bar");', - 'document.getElementsByTagName("foo");', - 'document.getElementById("");', - 'document.getElementById(\'foo\');', - 'document.getElementsByClassName(\'foo\');', - 'document.getElementsByClassName(\'foo bar\');', - 'document.getElementsByTagName(\'foo\');', - 'document.getElementsByClassName(\'\');', - 'document.getElementById(`foo`);', - 'document.getElementsByClassName(`foo`);', - 'document.getElementsByClassName(`foo bar`);', - 'document.getElementsByTagName(`foo`);', - 'document.getElementsByTagName(``);', - 'document.getElementsByClassName(`${fn()}`);', // eslint-disable-line no-template-curly-in-string - 'document.getElementsByClassName(`foo ${undefined}`);', // eslint-disable-line no-template-curly-in-string - 'document.getElementsByClassName(null);', - 'document.getElementsByTagName(null);', - 'document.getElementsByClassName(fn());', - 'document.getElementsByClassName("foo" + fn());', - 'document.getElementsByClassName(foo + "bar");', - outdent` - for (const div of document.body.getElementById("id").getElementsByClassName("class")) { - console.log(div.getElementsByTagName("div")); - } - ` -]); diff --git a/test/snapshots/prefer-query-selector.js.md b/test/snapshots/prefer-query-selector.js.md index d7f42df9c2..0d33fe3462 100644 --- a/test/snapshots/prefer-query-selector.js.md +++ b/test/snapshots/prefer-query-selector.js.md @@ -347,3 +347,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^ Prefer `.querySelectorAll()` over `.getElementsByTagName()`.␊ 3 | }␊ ` + +## Invalid #24 + 1 | e.getElementById(3) + +> Error 1/1 + + `␊ + > 1 | e.getElementById(3)␊ + | ^^^^^^^^^^^^^^ Prefer `.querySelector()` over `.getElementById()`.␊ + ` diff --git a/test/snapshots/prefer-query-selector.js.snap b/test/snapshots/prefer-query-selector.js.snap index 48afb050e899009dc177a24c77f89e650006d79e..730405e15a5e129f5a09fc805bdb624ecc435349 100644 GIT binary patch delta 1118 zcmV-k1fl!y36u&lK~_N^Q*L2!b7*gLAa*he0sv~4`%7W?8hfmI?l@6d(w85L2mk;8 z00003`^Ut)V9^jZ1_rB3v6aU^t%>VllDwQ2 zQ`5%+7X1drTpSSW#tFeuTnr2jdq2%l5@V??Hgw-rf8x({MzAOsHv@y;4Aq0W%nsLs z7iS;vXMgvW2`uUW#dm->&rDTqk$vC2UMJNyy`U{oOkhzF9)Ael4#X7`H9u{fcXH~U zoBwqVsZ8F?1QvY@#r?bt3~f_gU)x*#+*5LeHMmYl;sqmERG*K5p_6fb!R4v^Y%|^+ zjL_n`*vtqPJqg6qmp;7J@T4y1s{XXlhim`bVgidY@@29uFo<{ zAJ1n3i{6If3V#6xhNTLM7Kd-f1xVX1;C?i{wVMenx*m#s1Q{51rFkw>s$KkYMaPR2 z`3pTCnZTkQP^>S+z;IM`>$TW6pM@OBe(%3c_~66{7QF_^1#vwna1$c+2zn^TO8 zOkmMcD3%aqU|?oo2d8vKRt7;vJuU?WLxmcJl>Fq<+|;}hy~5JeqRQaZoYdr!{36Gk z9E}9MwETR%q{N~GO=~V>y-YJ0xa?3hr>B;<=A?p{#ZHyZIf=!^eu=rM8VNuX6rd(3 z06~oc9Dl@N1quO0scET23JI9b(M(XtF9S>AuuL;S55<{`>Uh1Vk)RB89lGBbD{*_x zsnRnA>?MNU!Ql<8egK<_;dV`e(W3-(h!T3t^x==0ki>LwP{H&P5htX_2+R_6KQT=v zHrb@*X=o0{6r-e!CCmw?7@`83;uOO)i|Eh==6^|T1tnm%Br*w5H;|cT6YEfLzyX~) zSd)V~C^@K;njF-jnrK{rq(PmLimuXF6K*xNlOQmILjo)gD98YXFVLq6sLf1W7K& zKz|Ljs4iq>ga!*C7oz83unTdeQxs>S#3~Lzg@DHq9@vX}ykVj{IKqU8fTC6=r(W0r z(-Uzip4_mrBhRUz0OuqoFe$6vv4+V)l3Ir<)unkUscD&csVTJs(@fML*wo4^&B;M; zY4sA<(t>Iw!dKL5XfbLLZanH?YduaOsefi3LXkyu%ai!%qH?2XBC#%1C)jqNiTk>V zOYR9oW?{M}c5p`)qZ3PXVkfG{N0Y=(xD%Lw&1Xb*0!i=}6{Cx=pVYCms)_XzQH^V= z`-$*aiaKm81;b-RkEN(X$5I9+{}Vstqf!m(uMJRLUPh=dPWz5H5vf55mKrc>U?ZY~ kSqYjN2BsD!T;_rkJVs(Cy38dZA5-o%0Aw7(#}*g>0BcbGZU6uP delta 1065 zcmV+^1lIeM3hxOrK~_N^Q*L2!b7*gLAa*he0stC~z2~a0bL{{pVpBI*PnaKz2mk;8 z00003d&0!PAkL98$CD8O6Mt=DgWzfG5PXRPf}e3RFgWb}G)GB{rMB46eOLX7Khqh( zqSLq-82o0a9@J%axE{PX`+z_DySGeW(KAq-!Og&sXQryQ$iDAhuajzG7d8Sf58XmMR^W(13d@-Z+>U;6M?!;`w4tNPPIAFlm#iwP{+3&jTf z3=E6AS<5+hziF=b+x1yy>EroKV9|6aW)WauSgN3CarkCjfVABL?nl#GyP3eE)=+!{ zho&q{BlLdi+>dP3q2p1z@j385WE|RkE(9H7Te~tkR#de{kI7poEX8PNkR+^ zR}&XJssrE^YV zaj{=wZmLEC&;$jj2?{_^qW}kSSb;)7QEFOhkwOBdb2Jka^2@+dI4sjl&_i)1qdHzM zY9uHFU5D;B#(zrOUURDSOaXg|pm%V11FIjvree5VlVJ2H0Ue@*9y5LTVX?Yr&gE7S@DPsw9f+>cmz@|9GFwG)5bb)zNTR{n!Es0D5 z)D2{&*~B^&9B@FV4%XzL4oVK{q$US-s3saG2ViD{IDbAZzeqtNIX|zsL?I=!Od&rF z;j*OsluC>wo|&SgiKVpBO9q9LlBT9YHPB!qpuwCVL-TV|^>XslHGoEA(F7D#f<&D$ zP(v-M3t1VVAw|fA==llkLR@JE#hEA}i~~?1;BkZp_M#VWnCK3UFd-tKsFmTU7k0q( zL|lp|H-GHx$a5+vz&VKtOvTbf8vK