Blame view
node_modules/eslint/lib/rules/no-console.js
4.01 KB
f7563de62
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
/** * @fileoverview Rule to flag use of console object * @author Nicholas C. Zakas */ "use strict"; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const astUtils = require("../ast-utils"); //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: "disallow the use of `console`", category: "Possible Errors", recommended: true }, schema: [ { type: "object", properties: { allow: { type: "array", items: { type: "string" }, minItems: 1, uniqueItems: true } }, additionalProperties: false } ] }, create(context) { const options = context.options[0] || {}; const allowed = options.allow || []; /** * Checks whether the given reference is 'console' or not. * * @param {escope.Reference} reference - The reference to check. * @returns {boolean} `true` if the reference is 'console'. */ function isConsole(reference) { const id = reference.identifier; return id && id.name === "console"; } /** * Checks whether the property name of the given MemberExpression node * is allowed by options or not. * * @param {ASTNode} node - The MemberExpression node to check. * @returns {boolean} `true` if the property name of the node is allowed. */ function isAllowed(node) { const propertyName = astUtils.getStaticPropertyName(node); return propertyName && allowed.indexOf(propertyName) !== -1; } /** * Checks whether the given reference is a member access which is not * allowed by options or not. * * @param {escope.Reference} reference - The reference to check. * @returns {boolean} `true` if the reference is a member access which * is not allowed by options. */ function isMemberAccessExceptAllowed(reference) { const node = reference.identifier; const parent = node.parent; return ( parent.type === "MemberExpression" && parent.object === node && !isAllowed(parent) ); } /** * Reports the given reference as a violation. * * @param {escope.Reference} reference - The reference to report. * @returns {void} */ function report(reference) { const node = reference.identifier.parent; context.report({ node, loc: node.loc, message: "Unexpected console statement." }); } return { "Program:exit"() { const scope = context.getScope(); const consoleVar = astUtils.getVariableByName(scope, "console"); const shadowed = consoleVar && consoleVar.defs.length > 0; /* 'scope.through' includes all references to undefined * variables. If the variable 'console' is not defined, it uses * 'scope.through'. */ const references = consoleVar ? consoleVar.references : scope.through.filter(isConsole); if (!shadowed) { references .filter(isMemberAccessExceptAllowed) .forEach(report); } } }; } }; |