From 860d826e106e6bae6e326f122cc9ab3478564d30 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 27 Nov 2019 10:00:04 +0800 Subject: [PATCH 1/6] Update: make `radix` rule stricter --- docs/rules/radix.md | 2 ++ lib/rules/radix.js | 7 +++++-- tests/lib/rules/radix.js | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 2 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..6cde887237b 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 validRadixNumbers = 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. @@ -42,19 +44,20 @@ function isParseIntMethod(node) { ); } + /** * Checks whether a given node is a valid value of radix or not. * * 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" && !validRadixNumbers.has(radix.value)) || (radix.type === "Identifier" && radix.name === "undefined") ); } diff --git a/tests/lib/rules/radix.js b/tests/lib/rules/radix.js index 0acb063a347..18e74f37138 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -107,6 +107,13 @@ ruleTester.run("radix", rule, { type: "CallExpression" }] }, + { + code: "parseInt(\"10\", 37);", + errors: [{ + message: "Invalid radix parameter.", + type: "CallExpression" + }] + }, { code: "Number.parseInt();", errors: [{ @@ -129,6 +136,13 @@ ruleTester.run("radix", rule, { type: "CallExpression" }] }, + { + code: "Number.parseInt(\"10\", 37);", + errors: [{ + message: "Invalid radix parameter.", + type: "CallExpression" + }] + }, { code: "parseInt(\"10\", 10);", options: ["as-needed"], From 92a597efb331cc1ddcd5977c4fcf670328ba3076 Mon Sep 17 00:00:00 2001 From: fisker Date: Mon, 23 Dec 2019 09:09:11 +0800 Subject: [PATCH 2/6] style: remove extra blank line --- lib/rules/radix.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rules/radix.js b/lib/rules/radix.js index 6cde887237b..46a7107f9ad 100644 --- a/lib/rules/radix.js +++ b/lib/rules/radix.js @@ -44,7 +44,6 @@ function isParseIntMethod(node) { ); } - /** * Checks whether a given node is a valid value of radix or not. * From 62b76458818796d0247b4033c4809804b4e6e390 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 18 Jan 2020 18:49:56 +0800 Subject: [PATCH 3/6] Update message, more tests --- lib/rules/radix.js | 2 +- tests/lib/rules/radix.js | 29 ++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/rules/radix.js b/lib/rules/radix.js index 46a7107f9ad..39d2e839eaa 100644 --- a/lib/rules/radix.js +++ b/lib/rules/radix.js @@ -130,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 18e74f37138..9396785d802 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -18,6 +18,7 @@ ruleTester.run("radix", rule, { valid: [ "parseInt(\"10\", 10);", + "parseInt(\"10\", 0x10);", "parseInt(\"10\", foo);", "Number.parseInt(\"10\", foo);", { @@ -75,42 +76,49 @@ 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\", 37);", errors: [{ - message: "Invalid radix parameter.", + 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" }] }, @@ -139,7 +147,14 @@ ruleTester.run("radix", rule, { { code: "Number.parseInt(\"10\", 37);", errors: [{ - message: "Invalid radix parameter.", + 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" }] }, From 6d9cb4e2531646ab8ec3947b0c0b385912bb7112 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 18 Jan 2020 18:59:41 +0800 Subject: [PATCH 4/6] Variable name & exponential notation test --- lib/rules/radix.js | 4 ++-- tests/lib/rules/radix.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/rules/radix.js b/lib/rules/radix.js index 39d2e839eaa..2174e7d0339 100644 --- a/lib/rules/radix.js +++ b/lib/rules/radix.js @@ -18,7 +18,7 @@ const astUtils = require("./utils/ast-utils"); const MODE_ALWAYS = "always", MODE_AS_NEEDED = "as-needed"; -const validRadixNumbers = new Set(Array.from({ length: 37 - 2 }, (_, index) => index + 2)); +const validRadixValues = new Set(Array.from({ length: 37 - 2 }, (_, index) => index + 2)); /** * Checks whether a given variable is shadowed or not. @@ -56,7 +56,7 @@ function isParseIntMethod(node) { */ function isValidRadix(radix) { return !( - (radix.type === "Literal" && !validRadixNumbers.has(radix.value)) || + (radix.type === "Literal" && !validRadixValues.has(radix.value)) || (radix.type === "Identifier" && radix.name === "undefined") ); } diff --git a/tests/lib/rules/radix.js b/tests/lib/rules/radix.js index 9396785d802..b4e64e62c1f 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -19,6 +19,7 @@ ruleTester.run("radix", rule, { valid: [ "parseInt(\"10\", 10);", "parseInt(\"10\", 0x10);", + "parseInt(\"10\", 1.6e1);", "parseInt(\"10\", foo);", "Number.parseInt(\"10\", foo);", { From c078e1206a903f7aefce601c31c46e9ac45b0385 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 18 Jan 2020 19:01:17 +0800 Subject: [PATCH 5/6] test `10.0` --- tests/lib/rules/radix.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lib/rules/radix.js b/tests/lib/rules/radix.js index b4e64e62c1f..2b6a485f178 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -20,6 +20,7 @@ ruleTester.run("radix", rule, { "parseInt(\"10\", 10);", "parseInt(\"10\", 0x10);", "parseInt(\"10\", 1.6e1);", + "parseInt(\"10\", 10.0);", "parseInt(\"10\", foo);", "Number.parseInt(\"10\", foo);", { From 72ef36f25572e5d79a5d7da7ce4c9b7b3c19be6f Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 19 Jan 2020 09:52:38 +0800 Subject: [PATCH 6/6] Add tests `1` `2` `36` --- tests/lib/rules/radix.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/lib/rules/radix.js b/tests/lib/rules/radix.js index 2b6a485f178..5e27c9c135b 100644 --- a/tests/lib/rules/radix.js +++ b/tests/lib/rules/radix.js @@ -18,6 +18,8 @@ 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);", @@ -110,6 +112,13 @@ ruleTester.run("radix", rule, { 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: [{ @@ -146,6 +155,13 @@ 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: [{