]> git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/global-require.js
import 8.4.0 source
[pve-eslint.git] / eslint / lib / rules / global-require.js
1 /**
2 * @fileoverview Rule for disallowing require() outside of the top-level module context
3 * @author Jamund Ferguson
4 * @deprecated in ESLint v7.0.0
5 */
6
7 "use strict";
8
9 const ACCEPTABLE_PARENTS = [
10 "AssignmentExpression",
11 "VariableDeclarator",
12 "MemberExpression",
13 "ExpressionStatement",
14 "CallExpression",
15 "ConditionalExpression",
16 "Program",
17 "VariableDeclaration",
18 "ChainExpression"
19 ];
20
21 /**
22 * Finds the eslint-scope reference in the given scope.
23 * @param {Object} scope The scope to search.
24 * @param {ASTNode} node The identifier node.
25 * @returns {Reference|null} Returns the found reference or null if none were found.
26 */
27 function findReference(scope, node) {
28 const references = scope.references.filter(reference => reference.identifier.range[0] === node.range[0] &&
29 reference.identifier.range[1] === node.range[1]);
30
31 /* istanbul ignore else: correctly returns null */
32 if (references.length === 1) {
33 return references[0];
34 }
35 return null;
36
37 }
38
39 /**
40 * Checks if the given identifier node is shadowed in the given scope.
41 * @param {Object} scope The current scope.
42 * @param {ASTNode} node The identifier node to check.
43 * @returns {boolean} Whether or not the name is shadowed.
44 */
45 function isShadowed(scope, node) {
46 const reference = findReference(scope, node);
47
48 return reference && reference.resolved && reference.resolved.defs.length > 0;
49 }
50
51 /** @type {import('../shared/types').Rule} */
52 module.exports = {
53 meta: {
54 deprecated: true,
55
56 replacedBy: [],
57
58 type: "suggestion",
59
60 docs: {
61 description: "require `require()` calls to be placed at top-level module scope",
62 recommended: false,
63 url: "https://eslint.org/docs/rules/global-require"
64 },
65
66 schema: [],
67 messages: {
68 unexpected: "Unexpected require()."
69 }
70 },
71
72 create(context) {
73 return {
74 CallExpression(node) {
75 const currentScope = context.getScope();
76
77 if (node.callee.name === "require" && !isShadowed(currentScope, node.callee)) {
78 const isGoodRequire = context.getAncestors().every(parent => ACCEPTABLE_PARENTS.indexOf(parent.type) > -1);
79
80 if (!isGoodRequire) {
81 context.report({ node, messageId: "unexpected" });
82 }
83 }
84 }
85 };
86 }
87 };