From a7fd1fd7429e0987256122f6f7c1d8e5bc6e6da6 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Wed, 17 Nov 2021 08:27:49 -0800 Subject: [PATCH] feat: Treat ClassExpressions NewExpression as always truthy in no-constant-condition --- lib/rules/no-constant-condition.js | 4 +++- tests/lib/rules/no-constant-condition.js | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/rules/no-constant-condition.js b/lib/rules/no-constant-condition.js index 3c2d68cbf6ca..f0be8c613ec0 100644 --- a/lib/rules/no-constant-condition.js +++ b/lib/rules/no-constant-condition.js @@ -139,6 +139,7 @@ module.exports = { case "ArrowFunctionExpression": case "FunctionExpression": case "ObjectExpression": + case "ClassExpression": return true; case "TemplateLiteral": return (inBooleanPosition && node.quasis.some(quasi => quasi.value.cooked.length)) || @@ -180,7 +181,8 @@ module.exports = { isLeftShortCircuit || isRightShortCircuit; } - + case "NewExpression": + return true; case "AssignmentExpression": if (node.operator === "=") { return isConstant(node.right, inBooleanPosition); diff --git a/tests/lib/rules/no-constant-condition.js b/tests/lib/rules/no-constant-condition.js index ecb6de534260..a00495bbcae4 100644 --- a/tests/lib/rules/no-constant-condition.js +++ b/tests/lib/rules/no-constant-condition.js @@ -387,6 +387,16 @@ ruleTester.run("no-constant-condition", rule, { { code: "if(0b1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, { code: "if(0o1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, { code: "if(0x1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, - { code: "if(0x1n || foo);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "LogicalExpression" }] } + { code: "if(0x1n || foo);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "LogicalExpression" }] }, + + // Classes and instances are always truthy + { code: "if(class {}) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new Foo()) {}", errors: [{ messageId: "unexpected" }] }, + + // Boxed primitives are always truthy + { code: "if(new Boolean(foo)) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new String(foo)) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new Number(foo)) {}", errors: [{ messageId: "unexpected" }] } + ] });