From 59b5ff0fe677480b0d1cee887003d7cc21d75c1e Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Thu, 17 Nov 2022 18:54:59 +0800 Subject: [PATCH 01/10] Add test --- test/prefer-string-replace-all.mjs | 1 + .../prefer-string-replace-all.mjs.md | 24 +++++++++++++++--- .../prefer-string-replace-all.mjs.snap | Bin 1069 -> 1115 bytes 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/test/prefer-string-replace-all.mjs b/test/prefer-string-replace-all.mjs index b0a0ffa423..0f174bc82b 100644 --- a/test/prefer-string-replace-all.mjs +++ b/test/prefer-string-replace-all.mjs @@ -68,6 +68,7 @@ test.snapshot({ 'foo.replace(/\\W/g, bar)', 'foo.replace(/\\u{61}/g, bar)', 'foo.replace(/\\u{61}/gu, bar)', + 'foo.replace(/]/g, "bar")', // Extra flag 'foo.replace(/a/gi, bar)', 'foo.replace(/a/gui, bar)', diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index 32a94728f2..f17ec3391e 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -263,6 +263,22 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #16 + 1 | foo.replace(/]/g, "bar") + +> Output + + `␊ + 1 | foo.replaceAll(/]/g, "bar")␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/]/g, "bar")␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #17 1 | foo.replace(/a/gi, bar) > Output @@ -278,7 +294,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #17 +## Invalid #18 1 | foo.replace(/a/gui, bar) > Output @@ -294,7 +310,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #18 +## Invalid #19 1 | foo.replace(/a/uig, bar) > Output @@ -310,7 +326,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #19 +## Invalid #20 1 | const pattern = new RegExp("foo", "g"); foo.replace(pattern, bar) > Output @@ -326,7 +342,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #20 +## Invalid #21 1 | foo.replace(new RegExp("foo", "g"), bar) > Output diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index 903934852e68d07e9979881270c3e406406b5975..fbade48924f0538efb9a72017e3a35bbf1079cae 100644 GIT binary patch delta 978 zcmV;@11$WG_ad@&9ZKAU7Cj$}2mk;8 z00003yTHW2Aj*+4nSVz5)1{L>&3R}i7C2>%dOy$|AkimK9LdVS;Nqz*CsKTxP4?HU zUe4l+Tuflmb}0S>#6A+aOPD5q`F`6(!&Y-|*(D~hs1_Rp&j;eztYae5vQvWA=|9Q7 z#PBSO2`u^(iVw0gFjUOC{QN4rU#wD~%NYZm<19>I(N9pE!GFQP(CAyid8jL$_qIX5 zxPQC56cbo~#${4h&qpzVMLVGQ9}urFT-hzEyL8hAHr9Jn zoK7<^fko}PA%FNN5bvrhU4FIa-HIn0R!y5Kx#lkuSo9|p7x6GK94bHKd3t~DcI|&* z0(Bp1rZRy=7elcmF9XAi^xWN?pW^Nvt7$5m)A6~F2`uUd#V3IHmEH~xrwu)S{rZZ7 z7(J4Bn82bxpg5P0f#K^R<&DSYy;D6VULt(5bM-YQuz%=0C>G&oU|?oo2d7;|Rt7;v zWiAB;LxmcJwETR%qSS(%#N<@RoE!~xr5JT}9R+nDsmX<+A%n{fU4w?clDd96Otk_K z)PM+uI0#S(C`wIBEmBAbE-A{)OIJp+Ml(SnzYJ3fD6WTMD^o86!kzkB3d#Aoxv6<2 zKoKo{pnrrBP=XW5`A8~^fGRYAN{m5DIFTfbAzDqq;_8X&3i|qRITN6SDOf@W$T9=7 zk`jx6Y;zDBHAI*$;&GcDs@t$Q3=~+L6b2O`@98J%r<3hJMg<&6qz0HkfV$9Br(;VW zF*Ts{0ai?liUXNkhLhlZ2#!q?#tq zR3{LorP!RBgD+5Nn&EJ^fc4X{)&jUng%<&-1fmmTNhlSNRa48E0CkR0>Esar0DUgJ AFaQ7m delta 931 zcmV;U16=&u2(1V*K~_N^Q*L2!b7*gLAa*he0s!QYq*lalY81GP&H3zi+~XgM2mk;8 z00003TgSw}Ai|L{nSZL8AFkdx#5{M){-`Onw{NsCfkpXPA@~{)8|hD%PWm+Gp`BRZ zlr`%8K$n6<+1Mbs8i-vywdF*LPqWGXn$^o$e36R@EV>ek<=7b*ydMVcxL2OHK(9nu zt+v3rkO?g62gQeh*heCF3De{+-*1~}*lO-AyTk+*{RqWr9DfW9osSl%EZH{m=fZiG z&)JG|OPIi-)1a7}lYwEOX~Mhy_LAy^`8L8+T&10vz@nB=ybg#L$(+{cSzXDqEUR&u z)YbD*OkmObP#ns|z_6>XboteucPpN3ST${`O^=TSb2+u;?o&F5qEcc#)pFoAXoLy<;^^ zWpg?{_c4J*mqM{TF9XBZL&_VE&3mVMOuR(+WasK@OkmLfC_Vo@ zxBc3#O-x|X?@*k}$H2hMzz$BCjI0cTjLKXJ3Wf?b3V&(&`FcgE1v!bysg5~08tO_h z>gqZQ>OfMH3q?Z)mmRtW4Sgkb{dAaW1t6#a5ejh-pb$`$nwDCmkPuu_l$n>VjAV^w zfS2*EGbDX%2Tja$V)9( z2ue+Nttik?0=h>@M?ooFNz)qLCr}Moe8aSp0qPwxj7BpT;d5dE9rA;o776(QNikg$ z8ur|Py5{@z9B&0_q#e+8-(@SaTL>#R({luCi z>}UarwY7$ Date: Fri, 18 Nov 2022 16:35:19 +0800 Subject: [PATCH 02/10] Improve fix --- package.json | 1 + rules/prefer-string-replace-all.js | 41 +++++++++++++----- .../prefer-string-replace-all.mjs.md | 10 ++--- .../prefer-string-replace-all.mjs.snap | Bin 1115 -> 1097 bytes 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 4633734a08..91a272f057 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.24", + "regjsparser": "0.9.1", "safe-regex": "^2.1.1", "semver": "^7.3.7", "strip-indent": "^3.0.0" diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index 04e18a5054..1a6753d3ac 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -1,5 +1,6 @@ 'use strict'; const {getStaticValue} = require('eslint-utils'); +const {parse: parseRegExp} = require('regjsparser') const quoteString = require('./utils/quote-string.js'); const {methodCallSelector} = require('./selectors/index.js'); const {isRegexLiteral, isNewExpression} = require('./ast/index.js'); @@ -14,10 +15,33 @@ const selector = methodCallSelector({ argumentsLength: 2, }); -const canReplacePatternWithString = node => - isRegexLiteral(node) - && node.regex.flags.replace('u', '') === 'g' - && !/[$()*+.?[\\\]^{|}]/.test(node.regex.pattern.replace(/\\[$()*+.?[\\\]^{|}]/g, '')); +function * convertRegExpToString(node, fixer) { + if (!isRegexLiteral(node)) { + return; + } + + const {pattern, flags} = node.regex; + + const tree = parseRegExp(pattern, flags, { + unicodePropertyEscape: true, + namedGroups: true, + lookbehind: true, + }); + + if ( + !( + tree.type == 'value' + || (tree.type == 'alternative' && tree.body.every(part => part.type === 'value')) + ) + ) { + return; + } + + const parts = tree.type == 'alternative' ? tree.body : [tree]; + const string = String.fromCharCode(...parts.map(part => part.codePoint)); + + yield fixer.replaceText(node, quoteString(string)); +} const isRegExpWithGlobalFlag = (node, scope) => { if (isRegexLiteral(node)) { @@ -80,14 +104,7 @@ const create = context => ({ /** @param {import('eslint').Rule.RuleFixer} fixer */ * fix(fixer) { yield fixer.insertTextAfter(property, 'All'); - - if (!canReplacePatternWithString(pattern)) { - return; - } - - const string = removeEscapeCharacters(pattern.regex.pattern); - - yield fixer.replaceText(pattern, quoteString(string)); + yield * convertRegExpToString(pattern, fixer); }, }; }, diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index f17ec3391e..6fee327427 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -252,7 +252,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll(/\\u{61}/gu, bar)␊ + 1 | foo.replaceAll('a', bar)␊ ` > Error 1/1 @@ -268,7 +268,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll(/]/g, "bar")␊ + 1 | foo.replaceAll(']', "bar")␊ ` > Error 1/1 @@ -284,7 +284,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll(/a/gi, bar)␊ + 1 | foo.replaceAll('a', bar)␊ ` > Error 1/1 @@ -300,7 +300,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll(/a/gui, bar)␊ + 1 | foo.replaceAll('a', bar)␊ ` > Error 1/1 @@ -316,7 +316,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll(/a/uig, bar)␊ + 1 | foo.replaceAll('a', bar)␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index fbade48924f0538efb9a72017e3a35bbf1079cae..45a25e17c3bd177b725f26bb9336f5062dd933c9 100644 GIT binary patch delta 785 zcmV+s1Md9W2+0T{K~_N^Q*L2!b7*gLAa*he0sth)teWs}y?qtK7-4|Bg+j3+Bmryp zP@Kxaz|iPh!Fi}Fo%gmuzqo(9yA%^xbSe~cb22b=K3br%WZTT23+GurXDiMvVFHU< zL-7V6UTB)|uD`vcI$^$z@Dx{RXC|=dJtz+5VqjP#b6TTkbtTWTtj1+hSIQEEX>Vsffu zPL77UQjEH~j)FRn)Z{|Zkilh#u0cazNnJl3rdk0AYCwcS90Vu?e-x#rr4}h91eX+L z=A|nmS)-YtkY9!=1r*mqv6ZQp0pU)4ErsO#+}zZ>5}=5dK2X94D8Y&3d?Xb{KouH5 zCB`5noJbPJ5UnO)arH!X1$}+EoC#3E6fB_wWSN0kNr^>3wmFE68X`;=@wm+n)ooZD z1_~@r3WJJ}_w*C>f78kKAEN?}BvJ!RAV6Jcs?)KhkC+-z`T#4YMe<-&!tO-cs zgdK^bn4XSQkBQO48j_h0tcf>P66e=7^DEVT6Zd3wVt3-?|V?mh#s+z9F zN=!Hj#R`(*!JB8(OKIsu98F67#F`}R0f{|PBB`c{GmWu36MOc@=IjbA&c>^oCf-oP zm1;|?%?xX?HwSn&)|88?VGyKV9EDYB<{)xo4!)qIX*Q!yNkG$bA6H2bofu0(Nr0@H PTFwLjNQ3%K)DZvxkZE9X delta 796 zcmV+%1LOS32-^rEK~_N^Q*L2!b7*gLAa*he0szst)>$WG_ad@&9ZKAU7Co^dBmrwr zP@KWRz|iPh!Fi}Fo%gmuzqo(9yA%^xbS4z@b22b=K3br%WZTT23+GurXDiMvVFHWV zL-7_MUTB)|uD`vcI$^$z@Dx{RXC|=dBPb5%VqjP#b6TTkbtTWTtj1+hSImlWh z$L76LJtkfve6n-(H72m=JSZ07XJBAvUI(Y$a5)p8geh1;2gou5vyu{vfNXOR8#P3jF5+>U9je=~ zI1Ch6oD>EXA@AuYf9j``?LS5Z97&`Gm_UHK&{U^mOCK>cp!5M&OpD~fsD#~#`ib^% zdkH%dNijVgsU8!fhczTKv4$j2HEo@VE4mZ0Ix-DwNDfSF>uHe?+enJ(8jRTE8hfr8 zR56V`&*+!Z)QLV&Cno3T6_+R!B$kw<7Ue0}D&(b>D+Hycf4f!`Xea?4q@<&ul&+*{ zjqVkw1}xrT+Q|U*4;e^o zCf-oPm1;|?lMVz6K7qbTL%%eWgrtF_nkLRvClIEk*qoY!FHmWk;c&Kq_0zG|0=P Date: Fri, 18 Nov 2022 17:00:52 +0800 Subject: [PATCH 03/10] More tests --- rules/prefer-string-replace-all.js | 9 +- test/prefer-string-replace-all.mjs | 10 ++ .../prefer-string-replace-all.mjs.md | 144 ++++++++++++++++++ .../prefer-string-replace-all.mjs.snap | Bin 1097 -> 1464 bytes 4 files changed, 156 insertions(+), 7 deletions(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index 1a6753d3ac..93d9963ef7 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -28,16 +28,11 @@ function * convertRegExpToString(node, fixer) { lookbehind: true, }); - if ( - !( - tree.type == 'value' - || (tree.type == 'alternative' && tree.body.every(part => part.type === 'value')) - ) - ) { + const parts = tree.type == 'alternative' ? tree.body : [tree]; + if (parts.some(part => part.type !== 'value')) { return; } - const parts = tree.type == 'alternative' ? tree.body : [tree]; const string = String.fromCharCode(...parts.map(part => part.codePoint)); yield fixer.replaceText(node, quoteString(string)); diff --git a/test/prefer-string-replace-all.mjs b/test/prefer-string-replace-all.mjs index 0f174bc82b..ce8c89b87f 100644 --- a/test/prefer-string-replace-all.mjs +++ b/test/prefer-string-replace-all.mjs @@ -76,5 +76,15 @@ test.snapshot({ // Variables 'const pattern = new RegExp("foo", "g"); foo.replace(pattern, bar)', 'foo.replace(new RegExp("foo", "g"), bar)', + + 'foo.replace(/a]/g, _)', + 'foo.replace(/[a]/g, _)', + 'foo.replace(/a{1/g, _)', + 'foo.replace(/a{1}/g, _)', + 'foo.replace(/\\u0022/g, _)', + 'foo.replace(/\\u0027/g, _)', + 'foo.replace(/\\x22/g, _)', + 'foo.replace(/\\x27/g, _)', + 'foo.replace(/\\uD83D\\uDE00/g, _)', ], }); diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index 6fee327427..f50a91e8d1 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -357,3 +357,147 @@ Generated by [AVA](https://avajs.dev). > 1 | foo.replace(new RegExp("foo", "g"), bar)␊ | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` + +## Invalid #22 + 1 | foo.replace(/a]/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('a]', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/a]/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #23 + 1 | foo.replace(/[a]/g, _) + +> Output + + `␊ + 1 | foo.replaceAll(/[a]/g, _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/[a]/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #24 + 1 | foo.replace(/a{1/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('a{1', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/a{1/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #25 + 1 | foo.replace(/a{1}/g, _) + +> Output + + `␊ + 1 | foo.replaceAll(/a{1}/g, _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/a{1}/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #26 + 1 | foo.replace(/\u0022/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('"', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\u0022/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #27 + 1 | foo.replace(/\u0027/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('\\'', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\u0027/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #28 + 1 | foo.replace(/\x22/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('"', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\x22/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #29 + 1 | foo.replace(/\x27/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('\\'', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\x27/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #30 + 1 | foo.replace(/\uD83D\uDE00/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('😀', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\uD83D\\uDE00/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index 45a25e17c3bd177b725f26bb9336f5062dd933c9..ff0a173b6eaa7672e7adcb2dbdc486c7f1027ff3 100644 GIT binary patch delta 1377 zcmV-n1)loJ2)GMIK~_N^Q*L2!b7*gLAa*he0szaZYka)Kv%EO8kE1fn;?5t72mk;8 z00003V`5=okYivx(6YwP-K|aGCTml|niu9w3?Pw4YJWhtDyJ3{&G9;Kcktu_?Uj`Z zlbFDw4p6)Wh>he-Hcr@_e0W{%8-W~Nj~*tl=tC$DVFjwtpDvyBY0g7CvA`*7)cb)h z1&Ovm@lPOj@zj)gcOH5$Vd?Qc+zQ08S;s`AWv2wK(|?kEiQ!om6Ik><6ffswV5pdN`T13LzgVR}moo-B$61)b zqF15Vn~Q;=(YJ#0P**zdZG(Ps|8{pNCa`EV6n}pN;?744RF-U;`E%hs%jayxxg|_s zQAKVDo(9AVO%vYrx0h5W%(oGq;wtUT1QtC4#g;q_42xt=YxJzHHm`6wo^ zXciPd0OBRtB?A26$KtQex}aV%a|$qVfJAwDA-DyIR~WAB7S&z4X#*SUy(vzo8JNJL zM}MK%n~#BErI+7zy)vfPzh@|~Q#6`7mkBId4#n?4D!NSfMo6ufKeFd~cwR0;EE8B% zmLGyA0`ac8(&bls-mQ4DVb!#$l574lfklr(v7G<|!~TlZifqsL;%I0)@?qdRr zZh~SRAqIw5dOJ9rHuU`U>njdo^hn}i0*gjL@p&MAFX^(JFQ@X!=iPrlTWj0}h6hOW z4-^*)17ok@*SFm*w{|mHKb^GF&;b~xAkhU-EGxpm@b!@L#$)r|sU8zA5kA?u`hOY| zSkw=Sj{q?<13NgkGqN%WGAeT^C>Sc#D5T}*>lLLI3;(yjDQlHNX|!6VFXm60aRiPQo@NOVGPk~0v1`>i?#bKbp;-oOB2zgIGQ9qq* z|1m1yNFp`B1On8BraB#4`iQ9kr4O)TS|krfCG1YrPqc^IOW2V}is|V{^?#TcJ***_ zi8UmFs%h&?T+y9~)sbmfLz1>Gl*i@5SfCT*(HxkH)q$}f7sk^$HR@@RkQ$K`(>0p0 zr$y|!n#L&+XRfX`tcAuO5xE+nco1Y4>`v4#rD-_I;i}`YWEboaU14NI%P{nTIxsmu zued~^AhDz*wJ1-)Rv|C7Tz?@bHQlwMKtl=WASE3IrF11tYjlr5HDC#ErkxB>|Bzuc znz;y{6AK0`m0@k80So2Q%z>!iK&7%0&{`#8TnR3ip{nUxsKkVmP&gwg9=wH0dMPcP zh@<16pIDQGJs`0sN+i{EZ7YDgH|T{Q_7+#Efq{`ZEsH;6>~6$fM1Nrm+6pZ0#;be4 zs~OxOP1A}-5l5nphBpWaH*TY8+jvyNRX&wgn?YJKnDL*DJv31?(6^kbHpCL?*!v3A zhJ&YhhNI#v%^XCfeGb0JrfHE+omz>eZ4i=*dt7Z@nilpriXin5^Jg?*abrIA*mkin jb^(&E1_rcrE3P^oS`q{jnSYQ~Q_GnES?gNQ#uxwq=Q4c+ delta 1007 zcmVT2mk;8 z00003yTHW2Aj-gapkVFjUOC{QN4rU#wD~%NYZm<19>I(f3fC%E7?U=v%>gs4JcKwn4wRf4jRB z6IgUA6mxSjFmygzpt5A!%%2PASw3eg&MjdAi&{hR1|VK&n((f_y`(x}zK!q{S7~P^ zu;@J~4(4KDSR`{=qi1y`&$6t>Wl~qqM=^m#TYsSV7Z9&7T-hzEyL8hAHr9JnoK7<^ zfkmykA^0E=@2V?ZezoV_iYFUZO`9sY<}VXi^eYtS@h~tPDnH|SdVlVA?SEkcbsuV` zGJ!?sK(P=n1H+5-+})g?;_e-*X)2r3@wtx)Eb0KoyMXwW-VP3@4LyJT`ig@XJ(75s zz<;7Ipg5KfXxky>jmPG_Q#~eLB7CxQ^))82Xde`_@G~$lGq8ixE+Z?0Afqyuf`Xw! zjY3*}zFtvkK~7?Fs$))$hPqOWy1I^nI*`=lLeY@HWrwaoLtjZaQ|Oc(LE%?{OVSR4ilEKUl8ijep86ZO-{_8+4HjwDh8OdvpAXsXk(rH_~zP=ERW zE2c&AU{u2HMEyj2xV?lOiKLjGj#Q6{(Zd>&nOH*-sG7FU#1-9%SRI*$H6#Znw)M0~ zh;1arbPY!Aag9CK462yMo@ew+Y3f8Ds1uX(^NLFp3KC07Qj78wY!&iS%N2rB(_JeH zG?ai2QqoaSN>|dfM)wL-0~YTv?SEu|`iBgo(ac5ooLDemk%+bS24>gN%z-HRVu5Z{ z0$Qs?j4NY7nE|SruEk1BI0?lHlH$ReXVXh*=|mh&O8vx|B Date: Fri, 18 Nov 2022 17:06:31 +0800 Subject: [PATCH 04/10] `\n` --- test/prefer-string-replace-all.mjs | 1 + .../prefer-string-replace-all.mjs.md | 16 ++++++++++++++++ .../prefer-string-replace-all.mjs.snap | Bin 1464 -> 1500 bytes 3 files changed, 17 insertions(+) diff --git a/test/prefer-string-replace-all.mjs b/test/prefer-string-replace-all.mjs index ce8c89b87f..5739037d63 100644 --- a/test/prefer-string-replace-all.mjs +++ b/test/prefer-string-replace-all.mjs @@ -86,5 +86,6 @@ test.snapshot({ 'foo.replace(/\\x22/g, _)', 'foo.replace(/\\x27/g, _)', 'foo.replace(/\\uD83D\\uDE00/g, _)', + 'foo.replace(/\\n/g, _)', ], }); diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index f50a91e8d1..4b9eaf507e 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -501,3 +501,19 @@ Generated by [AVA](https://avajs.dev). > 1 | foo.replace(/\\uD83D\\uDE00/g, _)␊ | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` + +## Invalid #31 + 1 | foo.replace(/\n/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('\\n', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\n/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index ff0a173b6eaa7672e7adcb2dbdc486c7f1027ff3..a25b8643bd12d0faf083b60d6cf034adb8d16625 100644 GIT binary patch literal 1500 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 Se~?vE%b5UK>srso7ytkd@38j( From d3eb6e99afafd798efb7e1a344a16ba20963a49a Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 18 Nov 2022 17:37:08 +0800 Subject: [PATCH 05/10] Fix --- rules/prefer-string-replace-all.js | 2 +- test/prefer-string-replace-all.mjs | 5 +- .../prefer-string-replace-all.mjs.md | 58 ++++++++++++++++-- .../prefer-string-replace-all.mjs.snap | Bin 1500 -> 1615 bytes 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index 93d9963ef7..212550f679 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -33,7 +33,7 @@ function * convertRegExpToString(node, fixer) { return; } - const string = String.fromCharCode(...parts.map(part => part.codePoint)); + const string = String.fromCodePoint(...parts.map(part => part.codePoint)); yield fixer.replaceText(node, quoteString(string)); } diff --git a/test/prefer-string-replace-all.mjs b/test/prefer-string-replace-all.mjs index 5739037d63..508a672a16 100644 --- a/test/prefer-string-replace-all.mjs +++ b/test/prefer-string-replace-all.mjs @@ -83,9 +83,12 @@ test.snapshot({ 'foo.replace(/a{1}/g, _)', 'foo.replace(/\\u0022/g, _)', 'foo.replace(/\\u0027/g, _)', + 'foo.replace(/\\cM\\cj/g, _)', 'foo.replace(/\\x22/g, _)', 'foo.replace(/\\x27/g, _)', - 'foo.replace(/\\uD83D\\uDE00/g, _)', + 'foo.replace(/\\uD83D\\ude00/g, _)', + 'foo.replace(/\\u{1f600}/gu, _)', 'foo.replace(/\\n/g, _)', + 'foo.replace(/\\u{20}/gu, _)', ], }); diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index 4b9eaf507e..d48c31ccd6 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -455,6 +455,22 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #28 + 1 | foo.replace(/\cM\cj/g, _) + +> Output + + `␊ + 1 | foo.replaceAll('\\r\\n', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\cM\\cj/g, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #29 1 | foo.replace(/\x22/g, _) > Output @@ -470,7 +486,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #29 +## Invalid #30 1 | foo.replace(/\x27/g, _) > Output @@ -486,8 +502,8 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #30 - 1 | foo.replace(/\uD83D\uDE00/g, _) +## Invalid #31 + 1 | foo.replace(/\uD83D\ude00/g, _) > Output @@ -498,11 +514,27 @@ Generated by [AVA](https://avajs.dev). > Error 1/1 `␊ - > 1 | foo.replace(/\\uD83D\\uDE00/g, _)␊ + > 1 | foo.replace(/\\uD83D\\ude00/g, _)␊ | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` -## Invalid #31 +## Invalid #32 + 1 | foo.replace(/\u{1f600}/gu, _) + +> Output + + `␊ + 1 | foo.replaceAll('😀', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\u{1f600}/gu, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` + +## Invalid #33 1 | foo.replace(/\n/g, _) > Output @@ -517,3 +549,19 @@ Generated by [AVA](https://avajs.dev). > 1 | foo.replace(/\\n/g, _)␊ | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ ` + +## Invalid #34 + 1 | foo.replace(/\u{20}/gu, _) + +> Output + + `␊ + 1 | foo.replaceAll(' ', _)␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.replace(/\\u{20}/gu, _)␊ + | ^^^^^^^ Prefer \`String#replaceAll()\` over \`String#replace()\`.␊ + ` diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index a25b8643bd12d0faf083b60d6cf034adb8d16625..6c0a18e71610d059a89c6848cc159b3e5674461a 100644 GIT binary patch literal 1615 zcmV-V2C(@-RzV=4jMuAKB(F&~Qv00000000Bc zm~mFZ@))qwjHtS|Cre$1Qy`!?^tyWj5j zmUT7&2m$ZZ>hi$wsUI@m+pdZ&ZwY|FbomnYBJ8H-TE&{!eRNg^M?Zt?ig5m=lYq1C^f|D142?C02t|3 zBX2>$h~T+@w8wPZxd*Yjl`sT(byub6OCrt(esy+-*ZvIVV~EwsgwGJNQT~TMI-)#X zq50h*dBC(>h}CAoTw4?&+2k76R?-|eY<6L}r~o-NsjCSO5uww)MmeR{+Kv3XIFFxt zQ2?Nhs98FzNGsJ2gA-FF9Gn_SLaKoQ}HTjDtc~qsOsb>3nS4ZaVvUpQ$ik=!$&I9Xa5E8NwS`d02SCx% z^pBw(7P&OV3yx)XL_n-wB}54T(6))Azi}IR%=Ur9WSeTiO^DT%gbqZ?@k3XBlwP=U zIr8?q6R(v{gIM+IXQmX9UVQ0RL*K|~;q1^lsrMNhh}AkmNPqNOGt>Fi>(m39qy@ug z<%GLHtm+9Zh_yfMc&+T{mWMk_-@Ij)sxd&UIu9_DhbWBU4N=-BoZQ{GJor+{i7<%O z;{>090Bj0~*51;dmQ{J*4r<%z91XF$kWi11<(Ud`gh;tL|fmO_-qCUrXD6k?z6{`Eu0 z?LJ&-XM3$Mq!vJ|@&=p9LF|u+yzG+(e{0|DUNJ^iv<+hQ2*Gm*idZ+kYQD?C(O;jq zJWs0us4pgU0pUBu7um+W4Y{rRZd87*xejB`gW4Hxc&Z; zVu;m!1UDxDs+ZPHuRW6 zh63=b&*%0bmAQ{1^HZaE)8hI=tZpRq8wSArYWG7mrLALYh8rBuu07BQu{x1(7|}8I zVSdHASt0kv^$XM_*0(~eHWTI#2cQq=i+3HKEf~ym7ch)3lf}gAbUu1jO0q(!3QkTI zi-dBK$eR(NzaD~44VDN3yEYI@gd&Ohzi0+sS*AZsjQL{T(W~NBdM0*`L7$*iyIZ`* zBbL#nJ^cvjKAqkQ^S~3I5>G~{(`Zy$15!LC=z$D9;9J)QOF$(cBh43vN_?esf zV_l>WF%rq+Xa4BHc>KT{-A%xEaSA=U4=~+#9uau)8Quard!raL4Ho}@4%PFzCs9b$ zFWf&K!;&IdC_zxGF41aQe#o;-`GJGENDrQnZc(BLdi>t!o3seFrb&@p?n52P1nNkl zXl`w?O}Bz-GM+k;+&Uc1<}eyrT-?Q=ifS<0&7VmD~yn?b~G}O5^X8OiYkV?^58o3+H8N{hl zr%g35DGGx@rPnf(7_Dk46QxpzrKgC6$d=HX5vqkAZ+GnxX+RlxcpQ*ky}(a*`Q0Zy z@9t%Vy$^q`b!$P$(`5l%E{Gmxn~t7sp>Ozw%8l=J#da9$!P=H_nU8D+8H&L~mNFva zxQ4uxf^0I#-8{1#x+RLNIC?hHSGGm8b$3Tvt)ZV*j8ZAL)y9wRkzUnlLz_bAtI4@bvsAv20V84XnFQW%^Pkoqo>F z^zHRuAI5}U^xul)XH7PzTmH+bN}PVku~j9qXuCP%meE!{U&!^;uXg%wshlZSCcfmg N^Dh%LiC^Ly002osBd7oX literal 1500 zcmV<21ta=FRzV$*5EkMm^SK|qlWo4QJ|t$GBVwF_l67Jr)WOl&HUcH`QLN*oqNu? z=iT)i41f=ie3x4t5i{ch=A6UYgz6h%5b&3hup8kxqoDA;gOP3>ug44>6db=qgEP-$>ti-~L9EUrG$348Z#i)wY+r>-W7}`Xl4G?HtM>>gg8=Zz ztm2kkYxCZ+pdw0tDYO$}wS+JX`N}9hvq;`8@|?QhR>zXgwswfsaKZtEuO`)0KKn$( zk>eE;Dl?gl5Ualu7B~Q)8XL0zqc4-buhIYEsvABtA7XV4;SO)Xed?8XySzE##d*cm zY!O-uulhOKC`ClgnlRQqtM_EkA;_XEV4Ea(hkN#=oIHKglxB!k z9ibU9=Oz74xarPc=R@R^{p-_DL9C7#Y9kl1s5!iI%%RA#zumU3`|Zr@*z95UZ;RF-`zvl>L1D^pLsnvUyQWioj!oAyzGf7Q~u2GNea0 zXosIy6nVUv7c&}S)oYlIj}hxHSNQEbSo+WQt*>2oOw*eoR*w)uodMWBF`>06&zzO8 zZIWAYwAXZq)n$Zph#g}Z<@r^a&bwBw*){s~iA4~rPQz{FAa>2B$+ql1o!`3WO6?b)Z1${v0I{keTtpns zs2b;Z&Bf=>lt6jM-4$gJtIi{B`youCqAlNoF1naDtWjL;DECdZq!~=oo zDHJ~?s!ixQjDPMP5qR=3zD0ERjp7&|Eb0FY)svRTsX6U4uTR1Vl!z4-2%6QyT1%^s zI4fTt*jSA6kjUsRa_T8v?|rh9cE+MO=_3%wI0Fjg(jFdas9`kl9xmECWMC#U2F)ra zR-=v1NR`WwL$W|drj_}J_gn~>K#4c}8j$ro!%z44-G?jh?bUBpMmhwaMp zU0H@+E9;GyxG@v!K5Z&-3!kDn+ZhksrlPfo>7u|N8%}Laqz95-ly=sAdnjZn&5wTK zvM3a)FfrR-Fx^Lbi=u@#gW~sNXZQPOMmW- Date: Fri, 18 Nov 2022 17:39:43 +0800 Subject: [PATCH 06/10] Remove `removeEscapeCharacters` --- rules/prefer-string-replace-all.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index 212550f679..b4a0799bf7 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -66,21 +66,6 @@ const isRegExpWithGlobalFlag = (node, scope) => { ); }; -function removeEscapeCharacters(regexString) { - let fixedString = regexString; - let index = 0; - do { - index = fixedString.indexOf('\\', index); - - if (index >= 0) { - fixedString = fixedString.slice(0, index) + fixedString.slice(index + 1); - index++; - } - } while (index >= 0); - - return fixedString; -} - /** @param {import('eslint').Rule.RuleContext} context */ const create = context => ({ [selector](node) { From e1e6cc275f5eba4e8ec8cb38db44730d2751625f Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 18 Nov 2022 17:41:51 +0800 Subject: [PATCH 07/10] Check flags --- rules/prefer-string-replace-all.js | 3 +++ .../prefer-string-replace-all.mjs.md | 6 +++--- .../prefer-string-replace-all.mjs.snap | Bin 1615 -> 1628 bytes 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index b4a0799bf7..f06c0b52e5 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -21,6 +21,9 @@ function * convertRegExpToString(node, fixer) { } const {pattern, flags} = node.regex; + if (flags.replace('u', '') !== 'g') { + return; + } const tree = parseRegExp(pattern, flags, { unicodePropertyEscape: true, diff --git a/test/snapshots/prefer-string-replace-all.mjs.md b/test/snapshots/prefer-string-replace-all.mjs.md index d48c31ccd6..a10963392c 100644 --- a/test/snapshots/prefer-string-replace-all.mjs.md +++ b/test/snapshots/prefer-string-replace-all.mjs.md @@ -284,7 +284,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll('a', bar)␊ + 1 | foo.replaceAll(/a/gi, bar)␊ ` > Error 1/1 @@ -300,7 +300,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll('a', bar)␊ + 1 | foo.replaceAll(/a/gui, bar)␊ ` > Error 1/1 @@ -316,7 +316,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | foo.replaceAll('a', bar)␊ + 1 | foo.replaceAll(/a/uig, bar)␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-string-replace-all.mjs.snap b/test/snapshots/prefer-string-replace-all.mjs.snap index 6c0a18e71610d059a89c6848cc159b3e5674461a..2acc7296e3e0e290bff534022038dbfa90de658d 100644 GIT binary patch literal 1628 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 N^Dh%LiC^Ly002osBd7oX From ef2875a5775aef6088856584db805e41f62d525a Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 18 Nov 2022 17:44:06 +0800 Subject: [PATCH 08/10] Lint --- rules/prefer-string-replace-all.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index f06c0b52e5..96579f6d85 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -1,6 +1,6 @@ 'use strict'; const {getStaticValue} = require('eslint-utils'); -const {parse: parseRegExp} = require('regjsparser') +const {parse: parseRegExp} = require('regjsparser'); const quoteString = require('./utils/quote-string.js'); const {methodCallSelector} = require('./selectors/index.js'); const {isRegexLiteral, isNewExpression} = require('./ast/index.js'); @@ -31,7 +31,7 @@ function * convertRegExpToString(node, fixer) { lookbehind: true, }); - const parts = tree.type == 'alternative' ? tree.body : [tree]; + const parts = tree.type === 'alternative' ? tree.body : [tree]; if (parts.some(part => part.type !== 'value')) { return; } From 083b9273acdddb511165dadfa26f7c6c483a8c74 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 14:30:03 +0800 Subject: [PATCH 09/10] Add a TODO --- rules/prefer-string-replace-all.js | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index 2667a178cd..fc7fa431ab 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -36,6 +36,7 @@ function * convertRegExpToString(node, fixer) { return; } + // TODO: persevere escape const string = String.fromCodePoint(...parts.map(part => part.codePoint)); yield fixer.replaceText(node, escapeString(string)); From 6f99afc5cdbb271224198b05378eefa482dcf132 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sat, 19 Nov 2022 14:49:12 +0700 Subject: [PATCH 10/10] Update prefer-string-replace-all.js --- rules/prefer-string-replace-all.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/prefer-string-replace-all.js b/rules/prefer-string-replace-all.js index fc7fa431ab..09a22a617a 100644 --- a/rules/prefer-string-replace-all.js +++ b/rules/prefer-string-replace-all.js @@ -36,7 +36,7 @@ function * convertRegExpToString(node, fixer) { return; } - // TODO: persevere escape + // TODO: Preserve escape const string = String.fromCodePoint(...parts.map(part => part.codePoint)); yield fixer.replaceText(node, escapeString(string));