From 4ff14c53bd1721d869abed5c9e197e752f7fbb71 Mon Sep 17 00:00:00 2001 From: Mikhail Baev Date: Mon, 20 Oct 2025 21:39:00 +0500 Subject: [PATCH 1/3] fix (prefer-bigint-literals): fix add support for numbers/strings with +/- operators --- rules/prefer-bigint-literals.js | 25 ++++-- test/prefer-bigint-literals.js | 6 ++ test/snapshots/prefer-bigint-literals.js.md | 84 ++++++++++++++++++ test/snapshots/prefer-bigint-literals.js.snap | Bin 1161 -> 1265 bytes 4 files changed, 108 insertions(+), 7 deletions(-) diff --git a/rules/prefer-bigint-literals.js b/rules/prefer-bigint-literals.js index aaca442415..915c0b2080 100644 --- a/rules/prefer-bigint-literals.js +++ b/rules/prefer-bigint-literals.js @@ -10,15 +10,13 @@ const messages = { [MESSAGE_ID_SUGGESTION]: 'Replace with {{replacement}}.', }; -const canUseNumericLiteralRaw = numericLiteral => { - const raw = numericLiteral.raw.replaceAll('_', '').toLowerCase(); +const canUseNumericLiteralRaw = (value, nodeRaw) => { + const raw = nodeRaw.replaceAll('_', '').toLowerCase(); if (raw.includes('.')) { return false; } - const {value} = numericLiteral; - for (const {prefix, base} of [ {prefix: '0b', base: 2}, {prefix: '0o', base: 8}, @@ -36,19 +34,32 @@ const canUseNumericLiteralRaw = numericLiteral => { return raw === String(value); }; +function getValueOfNode(valueNode) { + if (valueNode.type === 'UnaryExpression' && (valueNode.operator === '+' || valueNode.operator === '-')) { + return valueNode.operator === '+' ? {value: valueNode.argument.value, raw: valueNode.argument.raw} : {value: -valueNode.argument.value, raw: `-${valueNode.argument.raw}`}; + } + + return {value: valueNode.value, raw: valueNode.raw}; +} + function getReplacement(valueNode) { if (isStringLiteral(valueNode)) { - const raw = valueNode.raw.slice(1, -1); + let raw = valueNode.raw.slice(1, -1); try { BigInt(raw); } catch { return; } + // BigInt("+1") -> 1n + if (raw[0] === '+') { + raw = raw.slice(1); + } + return {shouldUseSuggestion: false, text: `${raw.trimEnd()}n`}; } - const {value, raw} = valueNode; + const {value, raw} = getValueOfNode(valueNode); if (!Number.isInteger(value)) { return; @@ -61,7 +72,7 @@ function getReplacement(valueNode) { return; } - const shouldUseSuggestion = !canUseNumericLiteralRaw(valueNode); + const shouldUseSuggestion = !canUseNumericLiteralRaw(value, raw); const text = shouldUseSuggestion ? `${bigint}n` : `${raw}n`; return {shouldUseSuggestion, text}; } diff --git a/test/prefer-bigint-literals.js b/test/prefer-bigint-literals.js index 2fe1faedbb..35427dd886 100644 --- a/test/prefer-bigint-literals.js +++ b/test/prefer-bigint-literals.js @@ -25,6 +25,8 @@ test.snapshot({ 'BigInt("1_2")', 'BigInt("1\\\n2")', String.raw`BigInt("\u{31}")`, + 'BigInt(!1)', + 'BigInt(~1)', ], invalid: [ 'BigInt("0")', @@ -52,5 +54,9 @@ test.snapshot({ 'BigInt(1e2)', 'BigInt(/* comment */1)', `BigInt(${'9'.repeat(100)})`, + 'BigInt("-1")', + 'BigInt("+1")', + 'BigInt(-1)', + 'BigInt(+1)', ], }); diff --git a/test/snapshots/prefer-bigint-literals.js.md b/test/snapshots/prefer-bigint-literals.js.md index 347d367c98..94c8a8409f 100644 --- a/test/snapshots/prefer-bigint-literals.js.md +++ b/test/snapshots/prefer-bigint-literals.js.md @@ -424,3 +424,87 @@ Generated by [AVA](https://avajs.dev). Suggestion 1/1: Replace with a bigint literal.␊ 1 | 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104n␊ ` + +## invalid(22): BigInt("-1") + +> Input + + `␊ + 1 | BigInt("-1")␊ + ` + +> Output + + `␊ + 1 | -1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt("-1")␊ + | ^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(23): BigInt("+1") + +> Input + + `␊ + 1 | BigInt("+1")␊ + ` + +> Output + + `␊ + 1 | 1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt("+1")␊ + | ^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(24): BigInt(-1) + +> Input + + `␊ + 1 | BigInt(-1)␊ + ` + +> Output + + `␊ + 1 | -1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt(-1)␊ + | ^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(25): BigInt(+1) + +> Input + + `␊ + 1 | BigInt(+1)␊ + ` + +> Output + + `␊ + 1 | 1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt(+1)␊ + | ^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` diff --git a/test/snapshots/prefer-bigint-literals.js.snap b/test/snapshots/prefer-bigint-literals.js.snap index acf4a24eb22fdbf1bffd80d0388ab0b729ec44bf..19750ef53ef9dee7da806e53b51fc0807dac85b8 100644 GIT binary patch literal 1265 zcmV$GZmLH1<00000000B+n$K?=MHI(lqYBBTh(b%7rV2wKX%pjQW`B5Qd*BeMm3k^r zAyOf_*(4ixRc9U9>okQPpzudt_(Xr28rZ}zR_b-b%o?I@Qh^PQRf zy!YnKo5^qcJKf&y-c7c8i)?zGyMAzUi7u^r1K&9uJn995 zpI_|lIf1kF@mq6m&xNgaZti03g9agtJd-62x9jYFXgc6LzGFayog#;m#5S+#}Abckhk~|)dLHF+z9`QUG zCNt%-5_8cdE*7PnS(auR+@O}FV~{9V{E`AGI|9b*1{h;L8bj6M@O}c?fdUViALUpE z(rYnNLk_u3#xRVZg3tI+jk=KvL$?5Q7vjL%WDLjUf&SmBv3D{LhG=G37Gf->jO8BZ zym$;oG7QXhAbd9l6AGq@!g!`~qcCxqw#;Vhjyr|Rj8p|&X6ueSmCKyWQ>x2+A7kP2 z=2St$u>S&Z9H|>#C9A^B`U6*;#(pnS zzo&>xegsT^5xOKj{ejH}oxg;Jq#4GuPZgH*{hN&0j1^54u?%Ce2!!uRIn>Teqhpgr zGFQ3DVlg?=QwdL)r)s68NZ6iDfOIUzbTP}dVsQt=b! zEqniVVLysw1^nnlF^wO^bCv5yNlC<{nutOddLFHJ39R>$!Y0pq{sEcbuQ}y2bDW^? z2R2$WZjJlHPRAVtUe6DK-6CJPhh1maB~QHI5!p5w^S9R{24=cdj6*DyS5yd57;&hX z0`W-p3L+Llq=>^`auF{lh^2B%E&mYQ>i{=_xHEbL{ev1P_v`1CgHCpg@kf#~ZxiK% zwA4VEzf52)sS2dW8kHI=YORcZ3TtJ@cw?>OwZvLdU255sa+_I}t(k_+4Qk^7rUR2L zD*=WMg4zv~yY|rBK zQo_9!R=k>6Q7Q=8Iz>!2_7*>sV26m8z&w8_hlr8t^f&WWgO|=|V@_x(TB+7#u2vYW ztD$KB25A3O(T1v55G|z=TuSrtev&-9NVV$58rkg~9Jqc!);6$x=QBWh5t3Ha81(-D z^nVrT>Hy=mnX_+-iM;%2Vg{)auHqsNG469<+(0=ORIw&3Mb$3>pE*}ojv1A#tNJ_3 zv+m!HvL-Heok(oFMMO``jH0P!sdbMe57jSTuZv3_czLodkcTt zE8%Tjenf6gL8F;N1HZMN3P!VB7|H)zXwr2=3%j<)uU1pV>Ak`Mz3)R1EhO{J9)eWm bHw!~(;t&cs!&nB*G8p_1YmY@ZgChU{7fn^F literal 1161 zcmV;41a|vDRzVR>XqbSBYICg$zgQe^Ep^{H6b$oY-*0N zk-ebu#UG0Z00000000B+nayq-MG(imiz1|jAOZ>baAX>To!Ah&dOo(hbKqbpk#Y(j zisT59@z@@3Mp@5VyR(jg93b!tJODZHLL3m+91y$#M>O`#Y*$b1YG<=Ma+I`uu{{6o zp5MQ!yK4N~-gdjQ^Qiahvmg%RcJMfi4*hnxd!4V`WE)}YP845XgvFJx7x@Rhhn=|h z^RwMuKlV32dSmX*xn$JN%$=*f-(ZZhC%U8&wEgX%9o&fy`f)0{ghY*01X23z-rasY zcz6dre6R6&VFkt*d%_+J2K%BL>;+xc?}br|ZHKKeidj31gRb9Zox`BZwo?7`AAeuj zT1(drZ*{w!F5~Mw#c*^v<6vnV7%+;&658iQg9Ky17)|2}626@Z*)SfD(Bt14JhF8P zOs2|ZIpbn$Toi!dN?EQW98k)pAOYI^q5-Km1I6nan&WahhpDCE{e-kV10JzH$#E7) zuVhFaJ>@nyr!ankUgHBZ>yA|vx_P8KnDvdU< zNVI<=w11jt6V*$I7C?gwFdXm4`M+JXUUhwy?R56{gD7UJ>(sgP86v%aNgHYk`hN)e zzXo)3f>FoJ>9=C6DE}_ELF Date: Mon, 27 Oct 2025 13:27:56 +0500 Subject: [PATCH 2/3] fix (prefer-bigint-literals): fix unaryexpression case --- rules/prefer-bigint-literals.js | 38 +++-- test/prefer-bigint-literals.js | 8 ++ test/snapshots/prefer-bigint-literals.js.md | 136 ++++++++++++++++-- test/snapshots/prefer-bigint-literals.js.snap | Bin 1265 -> 1451 bytes 4 files changed, 164 insertions(+), 18 deletions(-) diff --git a/rules/prefer-bigint-literals.js b/rules/prefer-bigint-literals.js index 915c0b2080..673de327f4 100644 --- a/rules/prefer-bigint-literals.js +++ b/rules/prefer-bigint-literals.js @@ -36,10 +36,12 @@ const canUseNumericLiteralRaw = (value, nodeRaw) => { function getValueOfNode(valueNode) { if (valueNode.type === 'UnaryExpression' && (valueNode.operator === '+' || valueNode.operator === '-')) { - return valueNode.operator === '+' ? {value: valueNode.argument.value, raw: valueNode.argument.raw} : {value: -valueNode.argument.value, raw: `-${valueNode.argument.raw}`}; + return valueNode.operator === '+' + ? {value: valueNode.argument.value, raw: valueNode.argument.raw, isPlusSignUnary: true} + : {value: -valueNode.argument.value, raw: `-${valueNode.argument.raw}`, isPlusSignUnary: false}; } - return {value: valueNode.value, raw: valueNode.raw}; + return {value: valueNode.value, raw: valueNode.raw, isPlusSignUnary: false}; } function getReplacement(valueNode) { @@ -52,14 +54,17 @@ function getReplacement(valueNode) { } // BigInt("+1") -> 1n - if (raw[0] === '+') { - raw = raw.slice(1); + const plusSignIndex = raw.indexOf('+'); + + if (plusSignIndex !== -1) { + raw = raw.slice(0, plusSignIndex) + raw.slice(plusSignIndex + 1); + return {shouldUseSuggestion: true, text: `${raw.trimEnd()}n`}; } return {shouldUseSuggestion: false, text: `${raw.trimEnd()}n`}; } - const {value, raw} = getValueOfNode(valueNode); + const {value, raw, isPlusSignUnary} = getValueOfNode(valueNode); if (!Number.isInteger(value)) { return; @@ -72,7 +77,7 @@ function getReplacement(valueNode) { return; } - const shouldUseSuggestion = !canUseNumericLiteralRaw(value, raw); + const shouldUseSuggestion = isPlusSignUnary ? true : !canUseNumericLiteralRaw(value, raw); const text = shouldUseSuggestion ? `${bigint}n` : `${raw}n`; return {shouldUseSuggestion, text}; } @@ -94,15 +99,28 @@ const create = context => ({ return; } + let {shouldUseSuggestion, text} = replacement; + let nodeToReplace = callExpression; + + const {parent} = callExpression; + + // -BigInt(-1) -> 1n + if ( + parent.type === 'UnaryExpression' + && parent.operator === '-' + && text.startsWith('-') + ) { + nodeToReplace = parent; + text = text.slice(1); + } + const problem = { - node: callExpression, + node: nodeToReplace, messageId: MESSAGE_ID_ERROR, }; - const {shouldUseSuggestion, text} = replacement; - /** @param {import('eslint').Rule.RuleFixer} fixer */ - const fix = fixer => fixer.replaceText(callExpression, text); + const fix = fixer => fixer.replaceText(nodeToReplace, text); if (shouldUseSuggestion || context.sourceCode.getCommentsInside(callExpression).length > 0) { problem.suggest = [ diff --git a/test/prefer-bigint-literals.js b/test/prefer-bigint-literals.js index 35427dd886..52a2282383 100644 --- a/test/prefer-bigint-literals.js +++ b/test/prefer-bigint-literals.js @@ -27,6 +27,8 @@ test.snapshot({ String.raw`BigInt("\u{31}")`, 'BigInt(!1)', 'BigInt(~1)', + 'BigInt("++1")', + 'BigInt("+ 1")', ], invalid: [ 'BigInt("0")', @@ -58,5 +60,11 @@ test.snapshot({ 'BigInt("+1")', 'BigInt(-1)', 'BigInt(+1)', + '-BigInt(-1)', + '-BigInt("-1")', + '-BigInt(1)', + '-BigInt("1")', + 'BigInt(" +1 ")', + 'BigInt(" -1 ")', ], }); diff --git a/test/snapshots/prefer-bigint-literals.js.md b/test/snapshots/prefer-bigint-literals.js.md index 94c8a8409f..7eea2af270 100644 --- a/test/snapshots/prefer-bigint-literals.js.md +++ b/test/snapshots/prefer-bigint-literals.js.md @@ -454,17 +454,15 @@ Generated by [AVA](https://avajs.dev). 1 | BigInt("+1")␊ ` -> Output - - `␊ - 1 | 1n␊ - ` - > Error 1/1 `␊ > 1 | BigInt("+1")␊ | ^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Replace with \`1n\`.␊ + 1 | 1n␊ ` ## invalid(24): BigInt(-1) @@ -496,6 +494,25 @@ Generated by [AVA](https://avajs.dev). 1 | BigInt(+1)␊ ` +> Error 1/1 + + `␊ + > 1 | BigInt(+1)␊ + | ^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Replace with \`1n\`.␊ + 1 | 1n␊ + ` + +## invalid(26): -BigInt(-1) + +> Input + + `␊ + 1 | -BigInt(-1)␊ + ` + > Output `␊ @@ -505,6 +522,109 @@ Generated by [AVA](https://avajs.dev). > Error 1/1 `␊ - > 1 | BigInt(+1)␊ - | ^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + > 1 | -BigInt(-1)␊ + | ^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(27): -BigInt("-1") + +> Input + + `␊ + 1 | -BigInt("-1")␊ + ` + +> Output + + `␊ + 1 | 1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | -BigInt("-1")␊ + | ^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(28): -BigInt(1) + +> Input + + `␊ + 1 | -BigInt(1)␊ + ` + +> Output + + `␊ + 1 | -1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | -BigInt(1)␊ + | ^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(29): -BigInt("1") + +> Input + + `␊ + 1 | -BigInt("1")␊ + ` + +> Output + + `␊ + 1 | -1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | -BigInt("1")␊ + | ^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` + +## invalid(30): BigInt(" +1 ") + +> Input + + `␊ + 1 | BigInt(" +1 ")␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt(" +1 ")␊ + | ^^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Replace with \` 1n\`.␊ + 1 | 1n␊ + ` + +## invalid(31): BigInt(" -1 ") + +> Input + + `␊ + 1 | BigInt(" -1 ")␊ + ` + +> Output + + `␊ + 1 | -1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | BigInt(" -1 ")␊ + | ^^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ ` diff --git a/test/snapshots/prefer-bigint-literals.js.snap b/test/snapshots/prefer-bigint-literals.js.snap index 19750ef53ef9dee7da806e53b51fc0807dac85b8..f4d6b24ff4a6b25ae38eb1175552332849e57f1b 100644 GIT binary patch literal 1451 zcmV;c1yuS$RzV8;nLKCye%>MAq_P`-hEA>>M zLL@@4agvR@s$)m?It|bR6#fXV^uYgv5JHFxst^MH0*+|y{V{L$?c#O3R-!V>CGvb{ zWrY+Z^IPsCuYJ^Ld3!h6$}O_tHSf0ln~QXD#p|^jhrI_K zzxVaiy}gFt*nIPanHOh*QaLwsq4Ii_5Jn!$lB(Nk?6@uWZu_wBhoUP$R1HP69oF5y z*Y}gkyP)!i)pt`p5JJdf@@Z1YdtGp z)K7}ZM7bUjc1Tfrs>u zax4Ss)d;C6Pq_`oFpO`3&v-+fbpsWKZXW1fjwap)V>m7k)c;tWd&7P(L=(d@A7Qa% zEcZC)#phrs!@yhv!dD_Nfnc0j81+={ER0>IF0_?%jfFBJNh3SGj%^Z;6<+C!)}Wo`mCF1mnG^u*veCKS3t=Wk&hT z3@0f3fmLn7rFy^LY`Q()>$C%4x5x+XVXLw0l1HBZfNWcgwYS$o238U(@(@egD=LI2 zj5yGYfp{Q0gNTI?3F6?NOvFnuVrjdjZvPP6YXCQaxKnxr{Z<8R_h-*53!QWu`Ad>h zZxiK%^u$1^Uq-N&vrb9 zFawxuNts}1BdFcLc6auYI?M2eMp*qn7Z$9=7UXcgIaK+>W}OL4xSXDKNGqrfmw^p0 zBXbXHX_PJ8b793Ru@$8aAzPz}$#PHe0|~Z>cm~Y#qq2w?s7`(|KW*^R8ZBpqmY|jP zn#|P;qjhx@?H>T`&nntLbq3K=D#4{R8}E(y+C|!{uCJ2a&cT7(_Q~ox7I)qOq!%D* zMU6rK2SEQzfvz@?7iLbsDMs@0&tfx3JK<>@#39Cg0*vb`>w;;F2}@D47lF^5n^l$> zQyJIv&n!>7e>apdNkIn|X4zC1He=N0mTfaZ&AKq^R8V2n4coMI!3<$@!3>>S7Uw1x zhTvRhoEn1BIu*$WW{Vbuk*7&S-O*X#0ivWDL9D-`(tsQb9)NlyD0r&braj)7WzUx%FRx$x&fT8?*>Z~?D#2}DLjzX1k%NkNer(hI?8g34P8jI5Ae!h91FkI{op zq9`lqNIeWWlyDE3BsN?2iUMg~)|8dzK_4oMGHzuJD!-wtF@h!f{8uVN6-MN55Q~3R zQ++6$$g`7a$7CV}<-DkzfR-O^5{;p+75@XYmIXTFv0|3*<-Z0ByD8;0(7(_Xhf~xl F0019@!vO#Q literal 1265 zcmV$GZmLH1<00000000B+n$K?=MHI(lqYBBTh(b%7rV2wKX%pjQW`B5Qd*BeMm3k^r zAyOf_*(4ixRc9U9>okQPpzudt_(Xr28rZ}zR_b-b%o?I@Qh^PQRf zy!YnKo5^qcJKf&y-c7c8i)?zGyMAzUi7u^r1K&9uJn995 zpI_|lIf1kF@mq6m&xNgaZti03g9agtJd-62x9jYFXgc6LzGFayog#;m#5S+#}Abckhk~|)dLHF+z9`QUG zCNt%-5_8cdE*7PnS(auR+@O}FV~{9V{E`AGI|9b*1{h;L8bj6M@O}c?fdUViALUpE z(rYnNLk_u3#xRVZg3tI+jk=KvL$?5Q7vjL%WDLjUf&SmBv3D{LhG=G37Gf->jO8BZ zym$;oG7QXhAbd9l6AGq@!g!`~qcCxqw#;Vhjyr|Rj8p|&X6ueSmCKyWQ>x2+A7kP2 z=2St$u>S&Z9H|>#C9A^B`U6*;#(pnS zzo&>xegsT^5xOKj{ejH}oxg;Jq#4GuPZgH*{hN&0j1^54u?%Ce2!!uRIn>Teqhpgr zGFQ3DVlg?=QwdL)r)s68NZ6iDfOIUzbTP}dVsQt=b! zEqniVVLysw1^nnlF^wO^bCv5yNlC<{nutOddLFHJ39R>$!Y0pq{sEcbuQ}y2bDW^? z2R2$WZjJlHPRAVtUe6DK-6CJPhh1maB~QHI5!p5w^S9R{24=cdj6*DyS5yd57;&hX z0`W-p3L+Llq=>^`auF{lh^2B%E&mYQ>i{=_xHEbL{ev1P_v`1CgHCpg@kf#~ZxiK% zwA4VEzf52)sS2dW8kHI=YORcZ3TtJ@cw?>OwZvLdU255sa+_I}t(k_+4Qk^7rUR2L zD*=WMg4zv~yY|rBK zQo_9!R=k>6Q7Q=8Iz>!2_7*>sV26m8z&w8_hlr8t^f&WWgO|=|V@_x(TB+7#u2vYW ztD$KB25A3O(T1v55G|z=TuSrtev&-9NVV$58rkg~9Jqc!);6$x=QBWh5t3Ha81(-D z^nVrT>Hy=mnX_+-iM;%2Vg{)auHqsNG469<+(0=ORIw&3Mb$3>pE*}ojv1A#tNJ_3 zv+m!HvL-Heok(oFMMO``jH0P!sdbMe57jSTuZv3_czLodkcTt zE8%Tjenf6gL8F;N1HZMN3P!VB7|H)zXwr2=3%j<)uU1pV>Ak`Mz3)R1EhO{J9)eWm bHw!~(;t&cs!&nB*G8p_1YmY@ZgChU{7fn^F From 561af0730c73fec8494b37900e534c786ee6bda0 Mon Sep 17 00:00:00 2001 From: Mikhail Baev Date: Mon, 27 Oct 2025 18:41:54 +0500 Subject: [PATCH 3/3] test (prefer-bigint-literals): add extra tests --- rules/prefer-bigint-literals.js | 3 +- test/prefer-bigint-literals.js | 7 ++ test/snapshots/prefer-bigint-literals.js.md | 89 ++++++++++++++++++ test/snapshots/prefer-bigint-literals.js.snap | Bin 1451 -> 1610 bytes 4 files changed, 98 insertions(+), 1 deletion(-) diff --git a/rules/prefer-bigint-literals.js b/rules/prefer-bigint-literals.js index 673de327f4..34adca3c41 100644 --- a/rules/prefer-bigint-literals.js +++ b/rules/prefer-bigint-literals.js @@ -35,6 +35,7 @@ const canUseNumericLiteralRaw = (value, nodeRaw) => { }; function getValueOfNode(valueNode) { + // -BigInt(1) if (valueNode.type === 'UnaryExpression' && (valueNode.operator === '+' || valueNode.operator === '-')) { return valueNode.operator === '+' ? {value: valueNode.argument.value, raw: valueNode.argument.raw, isPlusSignUnary: true} @@ -122,7 +123,7 @@ const create = context => ({ /** @param {import('eslint').Rule.RuleFixer} fixer */ const fix = fixer => fixer.replaceText(nodeToReplace, text); - if (shouldUseSuggestion || context.sourceCode.getCommentsInside(callExpression).length > 0) { + if (shouldUseSuggestion || context.sourceCode.getCommentsInside(nodeToReplace).length > 0) { problem.suggest = [ { messageId: MESSAGE_ID_SUGGESTION, diff --git a/test/prefer-bigint-literals.js b/test/prefer-bigint-literals.js index 52a2282383..dc18b1a246 100644 --- a/test/prefer-bigint-literals.js +++ b/test/prefer-bigint-literals.js @@ -66,5 +66,12 @@ test.snapshot({ '-BigInt("1")', 'BigInt(" +1 ")', 'BigInt(" -1 ")', + ` + foo + BigInt("-1") + `, + '-BigInt("+1")', + '-BigInt(/* comment */-1)', + '-(BigInt(-1))', ], }); diff --git a/test/snapshots/prefer-bigint-literals.js.md b/test/snapshots/prefer-bigint-literals.js.md index 7eea2af270..27029a0b19 100644 --- a/test/snapshots/prefer-bigint-literals.js.md +++ b/test/snapshots/prefer-bigint-literals.js.md @@ -628,3 +628,92 @@ Generated by [AVA](https://avajs.dev). > 1 | BigInt(" -1 ")␊ | ^^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ ` + +## invalid(32): foo BigInt("-1") + +> Input + + `␊ + 1 |␊ + 2 | foo␊ + 3 | BigInt("-1")␊ + 4 | ␊ + ` + +> Output + + `␊ + 1 |␊ + 2 | foo␊ + 3 | -1n␊ + 4 | ␊ + ` + +> Error 1/1 + + `␊ + 1 |␊ + 2 | foo␊ + > 3 | BigInt("-1")␊ + | ^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + 4 | ␊ + ` + +## invalid(33): -BigInt("+1") + +> Input + + `␊ + 1 | -BigInt("+1")␊ + ` + +> Error 1/1 + + `␊ + > 1 | -BigInt("+1")␊ + | ^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Replace with \`1n\`.␊ + 1 | -1n␊ + ` + +## invalid(34): -BigInt(/* comment */-1) + +> Input + + `␊ + 1 | -BigInt(/* comment */-1)␊ + ` + +> Error 1/1 + + `␊ + > 1 | -BigInt(/* comment */-1)␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Replace with \`1n\`.␊ + 1 | 1n␊ + ` + +## invalid(35): -(BigInt(-1)) + +> Input + + `␊ + 1 | -(BigInt(-1))␊ + ` + +> Output + + `␊ + 1 | 1n␊ + ` + +> Error 1/1 + + `␊ + > 1 | -(BigInt(-1))␊ + | ^^^^^^^^^^^^^ Prefer using bigint literal over \`BigInt(…)\`.␊ + ` diff --git a/test/snapshots/prefer-bigint-literals.js.snap b/test/snapshots/prefer-bigint-literals.js.snap index f4d6b24ff4a6b25ae38eb1175552332849e57f1b..0870a6c1e71231f807a5181008709dda4d86d987 100644 GIT binary patch literal 1610 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 F0019@!vO#Q