From c2217c04d6c82b160a21b00fca39c8acec543403 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 20 Jan 2020 10:14:30 +0800 Subject: [PATCH] Breaking: make `radix` rule stricter (#12608) * Update: make `radix` rule stricter * style: remove extra blank line * Update message, more tests * Variable name & exponential notation test * test `10.0` * Add tests `1` `2` `36` --- docs/rules/radix.md | 2 ++ lib/rules/radix.js | 8 +++--- tests/lib/rules/radix.js | 57 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/docs/rules/radix.md b/docs/rules/radix.md index 64466ab6843..da3196c85f0 100644 --- a/docs/rules/radix.md +++ b/docs/rules/radix.md @@ -43,6 +43,8 @@ var num = parseInt(someValue); var num = parseInt("071", "abc"); +var num = parseInt("071", 37); + var num = parseInt(); ``` diff --git a/lib/rules/radix.js b/lib/rules/radix.js index ed3c5cb66b8..2174e7d0339 100644 --- a/lib/rules/radix.js +++ b/lib/rules/radix.js @@ -18,6 +18,8 @@ const astUtils = require("./utils/ast-utils"); const MODE_ALWAYS = "always", MODE_AS_NEEDED = "as-needed"; +const validRadixValues = new Set(Array.from({ length: 37 - 2 }, (_, index) => index + 2)); + /** * Checks whether a given variable is shadowed or not. * @param {eslint-scope.Variable} variable A variable to check. @@ -47,14 +49,14 @@ function isParseIntMethod(node) { * * The following values are invalid. * - * - A literal except numbers. + * - A literal except integers between 2 and 36. * - undefined. * @param {ASTNode} radix A node of radix to check. * @returns {boolean} `true` if the node is valid. */ function isValidRadix(radix) { return !( - (radix.type === "Literal" && typeof radix.value !== "number") || + (radix.type === "Literal" && !validRadixValues.has(radix.value)) || (radix.type === "Identifier" && radix.name === "undefined") ); } @@ -128,7 +130,7 @@ module.exports = { } else if (!isValidRadix(args[1])) { context.report({ node, - message: "Invalid radix parameter." + message: "Invalid radix parameter, must be an integer between 2 and 36." }); } break; diff --git a/tests/lib/rules/radix.js b/tests/lib/rules/radix.js index 0acb063a347..5e27c9c135b 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -18,6 +18,11 @@ ruleTester.run("radix", rule, { valid: [ "parseInt(\"10\", 10);", + "parseInt(\"10\", 2);", + "parseInt(\"10\", 36);", + "parseInt(\"10\", 0x10);", + "parseInt(\"10\", 1.6e1);", + "parseInt(\"10\", 10.0);", "parseInt(\"10\", foo);", "Number.parseInt(\"10\", foo);", { @@ -75,35 +80,56 @@ ruleTester.run("radix", rule, { { code: "parseInt(\"10\", null);", errors: [{ - message: "Invalid radix parameter.", + message: "Invalid radix parameter, must be an integer between 2 and 36.", type: "CallExpression" }] }, { code: "parseInt(\"10\", undefined);", errors: [{ - message: "Invalid radix parameter.", + message: "Invalid radix parameter, must be an integer between 2 and 36.", type: "CallExpression" }] }, { code: "parseInt(\"10\", true);", errors: [{ - message: "Invalid radix parameter.", + message: "Invalid radix parameter, must be an integer between 2 and 36.", type: "CallExpression" }] }, { code: "parseInt(\"10\", \"foo\");", errors: [{ - message: "Invalid radix parameter.", + message: "Invalid radix parameter, must be an integer between 2 and 36.", type: "CallExpression" }] }, { code: "parseInt(\"10\", \"123\");", errors: [{ - message: "Invalid radix parameter.", + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, + { + code: "parseInt(\"10\", 1);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, + { + code: "parseInt(\"10\", 37);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, + { + code: "parseInt(\"10\", 10.5);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", type: "CallExpression" }] }, @@ -129,6 +155,27 @@ ruleTester.run("radix", rule, { type: "CallExpression" }] }, + { + code: "Number.parseInt(\"10\", 1);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, + { + code: "Number.parseInt(\"10\", 37);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, + { + code: "Number.parseInt(\"10\", 10.5);", + errors: [{ + message: "Invalid radix parameter, must be an integer between 2 and 36.", + type: "CallExpression" + }] + }, { code: "parseInt(\"10\", 10);", options: ["as-needed"],