1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- /**
- * @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: {
- type: "problem",
-
- 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
- });
- });
- }
- };
- }
- };
|