From b6f157176c58f914032d07a13dd076d347b5add4 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 3 May 2020 22:11:33 +0800 Subject: [PATCH] Fix bug --- rules/prefer-string-slice.js | 11 +++++++++-- test/prefer-string-slice.js | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/rules/prefer-string-slice.js b/rules/prefer-string-slice.js index 0767586942..8125b526ae 100644 --- a/rules/prefer-string-slice.js +++ b/rules/prefer-string-slice.js @@ -71,7 +71,14 @@ const create = context => { sliceArguments = [firstArgument]; } else if (argumentNodes.length === 2) { if (firstArgument === '0') { - sliceArguments = [firstArgument, secondArgument]; + sliceArguments = [firstArgument]; + if (isLiteralNumber(secondArgument) || isLengthProperty(argumentNodes[1])) { + sliceArguments.push(secondArgument) + } else if (getNumericValue(argumentNodes[1]) !== undefined) { + sliceArguments.push(Math.max(0, getNumericValue(argumentNodes[1]))) + } else { + sliceArguments.push(`Math.max(0, ${secondArgument})`) + } } else if ( isLiteralNumber(argumentNodes[0]) && isLiteralNumber(argumentNodes[1]) @@ -124,7 +131,7 @@ const create = context => { sliceArguments = [`Math.max(0, ${firstArgument})`]; } } else if (argumentNodes.length === 2) { - const secondNumber = argumentNodes[1] ? getNumericValue(argumentNodes[1]) : undefined; + const secondNumber = getNumericValue(argumentNodes[1]); if (firstNumber !== undefined && secondNumber !== undefined) { sliceArguments = firstNumber > secondNumber ? diff --git a/test/prefer-string-slice.js b/test/prefer-string-slice.js index 3336f7a8bc..c8a8d618f2 100644 --- a/test/prefer-string-slice.js +++ b/test/prefer-string-slice.js @@ -84,7 +84,7 @@ ruleTester.run('prefer-string-slice', rule, { `, output: outdent` const length = 123; - "foo".slice(0, length) + "foo".slice(0, Math.max(0, length)) `, errors }, @@ -99,6 +99,16 @@ ruleTester.run('prefer-string-slice', rule, { `, errors }, + { + code: '"foo".substr(0, -1)', + output: '"foo".slice(0, 0)', + errors + }, + { + code: '"foo".substr(0, "foo".length)', + output: '"foo".slice(0, "foo".length)', + errors + }, { code: outdent` const length = 123; @@ -138,6 +148,18 @@ ruleTester.run('prefer-string-slice', rule, { code: '"foo".substr(1, 2)', errors }, + // Extra arguments + { + code: 'foo.substr(1, 2, 3)', + output: 'foo.substr(1, 2, 3)', + errors + }, + // #700 + { + code: '"Sample".substr(0, "Sample".lastIndexOf("/"))', + output: '"Sample".slice(0, Math.max(0, "Sample".lastIndexOf("/")))', + errors + }, { code: 'foo.substring()', @@ -210,7 +232,13 @@ ruleTester.run('prefer-string-slice', rule, { { code: '"foo".substring(1, 3)', errors - } + }, + // Extra arguments + { + code: 'foo.substring(1, 2, 3)', + output: 'foo.substring(1, 2, 3)', + errors + }, ] });