• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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