-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
71 lines (59 loc) · 2.12 KB
/
index.js
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
var acorn = require('acorn');
var walk = require('acorn/dist/walk');
var defined = require('defined');
var requireRe = /\brequire\b/;
function parse (src, opts) {
if (!opts) opts = {};
return acorn.parse(src, {
ecmaVersion: defined(opts.ecmaVersion, 6),
sourceType: opts.sourceType,
ranges: defined(opts.ranges, opts.range),
locations: defined(opts.locations, opts.loc),
allowReserved: defined(opts.allowReserved, true),
allowReturnOutsideFunction: defined(
opts.allowReturnOutsideFunction, true
),
allowHashBang: defined(opts.allowHashBang, true)
});
}
var exports = module.exports = function (src, opts) {
return exports.find(src, opts).strings;
};
exports.find = function (src, opts) {
if (!opts) opts = {};
var word = opts.word === undefined ? 'require' : opts.word;
if (typeof src !== 'string') src = String(src);
var isRequire = opts.isRequire || function (node) {
return node.callee.type === 'Identifier'
&& node.callee.name === word
;
};
var modules = { strings : [], expressions : [] };
if (opts.nodes) modules.nodes = [];
var wordRe = word === 'require' ? requireRe : RegExp('\\b' + word + '\\b');
if (!wordRe.test(src)) return modules;
var ast = parse(src, opts.parse);
function visit(node, st, c) {
var hasRequire = wordRe.test(src.slice(node.start, node.end));
if (!hasRequire) return;
walk.base[node.type](node, st, c);
if (node.type !== 'CallExpression') return;
if (isRequire(node)) {
if (node.arguments.length) {
var arg = node.arguments[0];
if (arg.type === 'Literal') {
modules.strings.push(arg.value);
}
else {
modules.expressions.push(src.slice(arg.start, arg.end));
}
}
if (opts.nodes) modules.nodes.push(node);
}
}
walk.recursive(ast, null, {
Statement: visit,
Expression: visit
});
return modules;
};