From 99d26bc275adfa272653d86990fd6c6dba88ef6c Mon Sep 17 00:00:00 2001 From: nissy-dev Date: Wed, 25 Jan 2023 23:18:11 +0900 Subject: [PATCH] feat: no-constant-binary-expression report unnecessary nullish coalescing operator like ?? ?? --- lib/rules/no-constant-binary-expression.js | 6 ++++++ tests/lib/rules/no-constant-binary-expression.js | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/rules/no-constant-binary-expression.js b/lib/rules/no-constant-binary-expression.js index dccfa2f58264..0fa0029c3d7a 100644 --- a/lib/rules/no-constant-binary-expression.js +++ b/lib/rules/no-constant-binary-expression.js @@ -45,6 +45,12 @@ function hasConstantNullishness(scope, node) { return (functionName === "Boolean" || functionName === "String" || functionName === "Number") && isReferenceToGlobalVariable(scope, node.callee); } + case "LogicalExpression": { + const isLeftConstant = hasConstantNullishness(scope, node.left); + const isRightConstant = hasConstantNullishness(scope, node.right); + + return isLeftConstant || isRightConstant; + } case "AssignmentExpression": if (node.operator === "=") { return hasConstantNullishness(scope, node.right); diff --git a/tests/lib/rules/no-constant-binary-expression.js b/tests/lib/rules/no-constant-binary-expression.js index c430c7787fd3..c44fe4991205 100644 --- a/tests/lib/rules/no-constant-binary-expression.js +++ b/tests/lib/rules/no-constant-binary-expression.js @@ -308,6 +308,12 @@ ruleTester.run("no-constant-binary-expression", rule, { { code: "x === /[a-z]/", errors: [{ messageId: "alwaysNew" }] }, // It's not obvious what this does, but it compares the old value of `x` to the new object. - { code: "x === (x = {})", errors: [{ messageId: "alwaysNew" }] } + { code: "x === (x = {})", errors: [{ messageId: "alwaysNew" }] }, + + { code: "window.abc && false && anything", errors: [{ messageId: "constantShortCircuit" }] }, + { code: "window.abc || true || anything", errors: [{ messageId: "constantShortCircuit" }] }, + { code: "window.abc ?? 'non-nullish' ?? 'non-nullish'", errors: [{ messageId: "constantShortCircuit" }] }, + { code: "window.abc ?? undefined ?? 'non-nullish'", errors: [{ messageId: "constantShortCircuit" }] }, + { code: "window.abc ?? null ?? 'non-nullish'", errors: [{ messageId: "constantShortCircuit" }] } ] });