1/** 2 * @fileoverview Rule to flag when initializing to undefined 3 * @author Ilya Volodin 4 */ 5 6"use strict"; 7 8const astUtils = require("./utils/ast-utils"); 9 10//------------------------------------------------------------------------------ 11// Rule Definition 12//------------------------------------------------------------------------------ 13 14module.exports = { 15 meta: { 16 type: "suggestion", 17 18 docs: { 19 description: "disallow initializing variables to `undefined`", 20 category: "Variables", 21 recommended: false, 22 url: "https://eslint.org/docs/rules/no-undef-init" 23 }, 24 25 schema: [], 26 fixable: "code", 27 28 messages: { 29 unnecessaryUndefinedInit: "It's not necessary to initialize '{{name}}' to undefined." 30 } 31 }, 32 33 create(context) { 34 35 const sourceCode = context.getSourceCode(); 36 37 return { 38 39 VariableDeclarator(node) { 40 const name = sourceCode.getText(node.id), 41 init = node.init && node.init.name, 42 scope = context.getScope(), 43 undefinedVar = astUtils.getVariableByName(scope, "undefined"), 44 shadowed = undefinedVar && undefinedVar.defs.length > 0, 45 lastToken = sourceCode.getLastToken(node); 46 47 if (init === "undefined" && node.parent.kind !== "const" && !shadowed) { 48 context.report({ 49 node, 50 messageId: "unnecessaryUndefinedInit", 51 data: { name }, 52 fix(fixer) { 53 if (node.parent.kind === "var") { 54 return null; 55 } 56 57 if (node.id.type === "ArrayPattern" || node.id.type === "ObjectPattern") { 58 59 // Don't fix destructuring assignment to `undefined`. 60 return null; 61 } 62 63 if (sourceCode.commentsExistBetween(node.id, lastToken)) { 64 return null; 65 } 66 67 return fixer.removeRange([node.id.range[1], node.range[1]]); 68 } 69 }); 70 } 71 } 72 }; 73 74 } 75}; 76