| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | /** * @fileoverview Rule to flag references to the undefined variable. * @author Michael Ficarra */"use strict";//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------/** @type {import('../shared/types').Rule} */module.exports = {    meta: {        type: "suggestion",        docs: {            description: "Disallow the use of `undefined` as an identifier",            recommended: false,            url: "https://eslint.org/docs/rules/no-undefined"        },        schema: [],        messages: {            unexpectedUndefined: "Unexpected use of undefined."        }    },    create(context) {        /**         * Report an invalid "undefined" identifier node.         * @param {ASTNode} node The node to report.         * @returns {void}         */        function report(node) {            context.report({                node,                messageId: "unexpectedUndefined"            });        }        /**         * Checks the given scope for references to `undefined` and reports         * all references found.         * @param {eslint-scope.Scope} scope The scope to check.         * @returns {void}         */        function checkScope(scope) {            const undefinedVar = scope.set.get("undefined");            if (!undefinedVar) {                return;            }            const references = undefinedVar.references;            const defs = undefinedVar.defs;            // Report non-initializing references (those are covered in defs below)            references                .filter(ref => !ref.init)                .forEach(ref => report(ref.identifier));            defs.forEach(def => report(def.name));        }        return {            "Program:exit"() {                const globalScope = context.getScope();                const stack = [globalScope];                while (stack.length) {                    const scope = stack.pop();                    stack.push(...scope.childScopes);                    checkScope(scope);                }            }        };    }};
 |