1/** 2 * @fileoverview Rule to disallow a negated condition 3 * @author Alberto Rodríguez 4 */ 5"use strict"; 6 7//------------------------------------------------------------------------------ 8// Rule Definition 9//------------------------------------------------------------------------------ 10 11module.exports = { 12 meta: { 13 type: "suggestion", 14 15 docs: { 16 description: "disallow negated conditions", 17 category: "Stylistic Issues", 18 recommended: false, 19 url: "https://eslint.org/docs/rules/no-negated-condition" 20 }, 21 22 schema: [], 23 24 messages: { 25 unexpectedNegated: "Unexpected negated condition." 26 } 27 }, 28 29 create(context) { 30 31 /** 32 * Determines if a given node is an if-else without a condition on the else 33 * @param {ASTNode} node The node to check. 34 * @returns {boolean} True if the node has an else without an if. 35 * @private 36 */ 37 function hasElseWithoutCondition(node) { 38 return node.alternate && node.alternate.type !== "IfStatement"; 39 } 40 41 /** 42 * Determines if a given node is a negated unary expression 43 * @param {Object} test The test object to check. 44 * @returns {boolean} True if the node is a negated unary expression. 45 * @private 46 */ 47 function isNegatedUnaryExpression(test) { 48 return test.type === "UnaryExpression" && test.operator === "!"; 49 } 50 51 /** 52 * Determines if a given node is a negated binary expression 53 * @param {Test} test The test to check. 54 * @returns {boolean} True if the node is a negated binary expression. 55 * @private 56 */ 57 function isNegatedBinaryExpression(test) { 58 return test.type === "BinaryExpression" && 59 (test.operator === "!=" || test.operator === "!=="); 60 } 61 62 /** 63 * Determines if a given node has a negated if expression 64 * @param {ASTNode} node The node to check. 65 * @returns {boolean} True if the node has a negated if expression. 66 * @private 67 */ 68 function isNegatedIf(node) { 69 return isNegatedUnaryExpression(node.test) || isNegatedBinaryExpression(node.test); 70 } 71 72 return { 73 IfStatement(node) { 74 if (!hasElseWithoutCondition(node)) { 75 return; 76 } 77 78 if (isNegatedIf(node)) { 79 context.report({ 80 node, 81 messageId: "unexpectedNegated" 82 }); 83 } 84 }, 85 ConditionalExpression(node) { 86 if (isNegatedIf(node)) { 87 context.report({ 88 node, 89 messageId: "unexpectedNegated" 90 }); 91 } 92 } 93 }; 94 } 95}; 96