| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | /** * @fileoverview Rule to flag references to undeclared variables. * @author Mark Macdonald */"use strict";//------------------------------------------------------------------------------// Helpers//------------------------------------------------------------------------------/** * Checks if the given node is the argument of a typeof operator. * @param {ASTNode} node The AST node being checked. * @returns {boolean} Whether or not the node is the argument of a typeof operator. */function hasTypeOfOperator(node) {    const parent = node.parent;    return parent.type === "UnaryExpression" && parent.operator === "typeof";}//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------module.exports = {    meta: {        docs: {            description: "disallow the use of undeclared variables unless mentioned in `/*global */` comments",            category: "Variables",            recommended: true,            url: "https://eslint.org/docs/rules/no-undef"        },        schema: [            {                type: "object",                properties: {                    typeof: {                        type: "boolean"                    }                },                additionalProperties: false            }        ]    },    create(context) {        const options = context.options[0];        const considerTypeOf = options && options.typeof === true || false;        return {            "Program:exit"(/* node */) {                const globalScope = context.getScope();                globalScope.through.forEach(ref => {                    const identifier = ref.identifier;                    if (!considerTypeOf && hasTypeOfOperator(identifier)) {                        return;                    }                    context.report({                        node: identifier,                        message: "'{{name}}' is not defined.",                        data: identifier                    });                });            }        };    }};
 |