|  | /** | 
|  | * @fileoverview Rule to check for implicit global variables and functions. | 
|  | * @author Joshua Peek | 
|  | */ | 
|  |  | 
|  | "use strict"; | 
|  |  | 
|  | //------------------------------------------------------------------------------ | 
|  | // Rule Definition | 
|  | //------------------------------------------------------------------------------ | 
|  |  | 
|  | module.exports = { | 
|  | meta: { | 
|  | type: "suggestion", | 
|  |  | 
|  | docs: { | 
|  | description: "disallow variable and `function` declarations in the global scope", | 
|  | category: "Best Practices", | 
|  | recommended: false, | 
|  | url: "https://eslint.org/docs/rules/no-implicit-globals" | 
|  | }, | 
|  |  | 
|  | schema: [] | 
|  | }, | 
|  |  | 
|  | create(context) { | 
|  | return { | 
|  | Program() { | 
|  | const scope = context.getScope(); | 
|  |  | 
|  | scope.variables.forEach(variable => { | 
|  | if (variable.writeable) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | variable.defs.forEach(def => { | 
|  | if (def.type === "FunctionName" || (def.type === "Variable" && def.parent.kind === "var")) { | 
|  | context.report({ node: def.node, message: "Implicit global variable, assign as global property instead." }); | 
|  | } | 
|  | }); | 
|  | }); | 
|  |  | 
|  | scope.implicit.variables.forEach(variable => { | 
|  | const scopeVariable = scope.set.get(variable.name); | 
|  |  | 
|  | if (scopeVariable && scopeVariable.writeable) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | variable.defs.forEach(def => { | 
|  | context.report({ node: def.node, message: "Implicit global variable, assign as global property instead." }); | 
|  | }); | 
|  | }); | 
|  | } | 
|  | }; | 
|  |  | 
|  | } | 
|  | }; |