/**
							 | 
						|
								 * @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
							 | 
						|
								//------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								/** @type {import('../shared/types').Rule} */
							 | 
						|
								module.exports = {
							 | 
						|
								    meta: {
							 | 
						|
								        type: "problem",
							 | 
						|
								
							 | 
						|
								        docs: {
							 | 
						|
								            description: "Disallow the use of undeclared variables unless mentioned in `/*global */` comments",
							 | 
						|
								            recommended: true,
							 | 
						|
								            url: "https://eslint.org/docs/latest/rules/no-undef"
							 | 
						|
								        },
							 | 
						|
								
							 | 
						|
								        schema: [
							 | 
						|
								            {
							 | 
						|
								                type: "object",
							 | 
						|
								                properties: {
							 | 
						|
								                    typeof: {
							 | 
						|
								                        type: "boolean",
							 | 
						|
								                        default: false
							 | 
						|
								                    }
							 | 
						|
								                },
							 | 
						|
								                additionalProperties: false
							 | 
						|
								            }
							 | 
						|
								        ],
							 | 
						|
								        messages: {
							 | 
						|
								            undef: "'{{name}}' is not defined."
							 | 
						|
								        }
							 | 
						|
								    },
							 | 
						|
								
							 | 
						|
								    create(context) {
							 | 
						|
								        const options = context.options[0];
							 | 
						|
								        const considerTypeOf = options && options.typeof === true || false;
							 | 
						|
								        const sourceCode = context.sourceCode;
							 | 
						|
								
							 | 
						|
								        return {
							 | 
						|
								            "Program:exit"(node) {
							 | 
						|
								                const globalScope = sourceCode.getScope(node);
							 | 
						|
								
							 | 
						|
								                globalScope.through.forEach(ref => {
							 | 
						|
								                    const identifier = ref.identifier;
							 | 
						|
								
							 | 
						|
								                    if (!considerTypeOf && hasTypeOfOperator(identifier)) {
							 | 
						|
								                        return;
							 | 
						|
								                    }
							 | 
						|
								
							 | 
						|
								                    context.report({
							 | 
						|
								                        node: identifier,
							 | 
						|
								                        messageId: "undef",
							 | 
						|
								                        data: identifier
							 | 
						|
								                    });
							 | 
						|
								                });
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								    }
							 | 
						|
								};
							 |