Skip to content

Commit b94731a

Browse files
committedMay 3, 2019
💥 no-*-require rules check require.resolve calls as well
1 parent 528282a commit b94731a

File tree

2 files changed

+26
-39
lines changed

2 files changed

+26
-39
lines changed
 

‎lib/util/get-require-targets.js

+11-38
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,13 @@
55
"use strict"
66

77
const path = require("path")
8-
const { getStringIfConstant } = require("eslint-utils")
8+
const { CALL, ReferenceTracker, getStringIfConstant } = require("eslint-utils")
99
const resolve = require("resolve")
1010
const getResolvePaths = require("./get-resolve-paths")
1111
const getTryExtensions = require("./get-try-extensions")
1212
const ImportTarget = require("./import-target")
1313
const stripImportPathParams = require("./strip-import-path-params")
1414

15-
/**
16-
* Checks whether or not a given node is a callee.
17-
*
18-
* @param {ASTNode} node - A node to check.
19-
* @returns {boolean} `true` if the node is a callee.
20-
*/
21-
function isCallee(node) {
22-
return node.parent.type === "CallExpression" && node.parent.callee === node
23-
}
24-
25-
/**
26-
* Gets references of "require".
27-
*
28-
* @param {escope.Scope} scope - The global scope.
29-
* @returns {escope.Reference[]} References of "require".
30-
*/
31-
function getReferencesOfRequire(scope) {
32-
const variable = scope.set.get("require")
33-
if (!variable) {
34-
// Not found.
35-
return []
36-
}
37-
return variable.references
38-
}
39-
4015
/**
4116
* Gets a list of `require()` targets.
4217
*
@@ -50,20 +25,18 @@ module.exports = function getRequireTargets(context, includeCore) {
5025
const retv = []
5126
const basedir = path.dirname(path.resolve(context.getFilename()))
5227
const paths = getResolvePaths(context)
53-
const references = getReferencesOfRequire(context.getScope())
5428
const extensions = getTryExtensions(context)
5529
const options = { basedir, paths, extensions }
56-
57-
for (const reference of references) {
58-
const node = reference.identifier
59-
60-
// Skips if it's not a call of `require`.
61-
if (!isCallee(node)) {
62-
continue
63-
}
64-
65-
// Gets the target module.
66-
const targetNode = node.parent.arguments[0]
30+
const tracker = new ReferenceTracker(context.getScope())
31+
const references = tracker.iterateGlobalReferences({
32+
require: {
33+
[CALL]: true,
34+
resolve: { [CALL]: true },
35+
},
36+
})
37+
38+
for (const { node } of references) {
39+
const targetNode = node.arguments[0]
6740
const rawName = getStringIfConstant(targetNode)
6841
const name = rawName && stripImportPathParams(rawName)
6942
if (name && (includeCore || !resolve.isCore(name))) {

‎tests/lib/rules/no-missing-require.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,13 @@ ruleTester.run("no-missing-require", rule, {
209209
options: [{ allowModules: ["jquery.cookie"] }],
210210
env: { node: true },
211211
},
212+
213+
// require.resolve
214+
{
215+
filename: fixture("test.js"),
216+
code: "require.resolve('eslint');",
217+
env: { node: true },
218+
},
212219
],
213220
invalid: [
214221
{
@@ -277,10 +284,17 @@ ruleTester.run("no-missing-require", rule, {
277284
env: { node: true },
278285
errors: ['"./A" is not found.'],
279286
},
287+
288+
// require.resolve
289+
{
290+
filename: fixture("test.js"),
291+
code: "require.resolve('no-exist-package-0');",
292+
env: { node: true },
293+
errors: ['"no-exist-package-0" is not found.'],
294+
},
280295
],
281296
})
282297

283-
/*eslint-env mocha */
284298
describe("On specific working directory:", () => {
285299
const filename = fixture("test.js")
286300
let originalDir = null

0 commit comments

Comments
 (0)
Please sign in to comment.