Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80540 views
1
var aparse = require('acorn').parse;
2
var escodegen = require('escodegen');
3
var defined = require('defined');
4
5
var requireRe = /\brequire\b/;
6
7
function parse (src, opts) {
8
if (!opts) opts = {};
9
return aparse(src, {
10
ecmaVersion: defined(opts.ecmaVersion, 6),
11
ranges: defined(opts.ranges, opts.range),
12
locations: defined(opts.locations, opts.loc),
13
allowReserved: defined(opts.allowReserved, true),
14
allowReturnOutsideFunction: defined(
15
opts.allowReturnOutsideFunction, true
16
),
17
allowHashBang: defined(opts.allowHashBang, true)
18
});
19
}
20
21
var traverse = function (node, cb) {
22
if (Array.isArray(node)) {
23
for (var i = 0; i < node.length; i++) {
24
if (node[i] != null) {
25
node[i].parent = node;
26
traverse(node[i], cb);
27
}
28
}
29
}
30
else if (node && typeof node === 'object') {
31
cb(node);
32
for (var key in node) {
33
if (!node.hasOwnProperty(key)) continue;
34
if (key === 'parent' || !node[key]) continue;
35
node[key].parent = node;
36
traverse(node[key], cb);
37
}
38
}
39
};
40
41
var walk = function (src, opts, cb) {
42
var ast = parse(src, opts);
43
traverse(ast, cb);
44
};
45
46
var exports = module.exports = function (src, opts) {
47
return exports.find(src, opts).strings;
48
};
49
50
exports.find = function (src, opts) {
51
if (!opts) opts = {};
52
53
var word = opts.word === undefined ? 'require' : opts.word;
54
if (typeof src !== 'string') src = String(src);
55
56
var isRequire = opts.isRequire || function (node) {
57
var c = node.callee;
58
return c
59
&& node.type === 'CallExpression'
60
&& c.type === 'Identifier'
61
&& c.name === word
62
;
63
}
64
65
var modules = { strings : [], expressions : [] };
66
if (opts.nodes) modules.nodes = [];
67
68
var wordRe = word === 'require' ? requireRe : RegExp('\\b' + word + '\\b');
69
if (!wordRe.test(src)) return modules;
70
71
walk(src, opts.parse, function (node) {
72
if (!isRequire(node)) return;
73
if (node.arguments.length) {
74
if (node.arguments[0].type === 'Literal') {
75
modules.strings.push(node.arguments[0].value);
76
}
77
else {
78
modules.expressions.push(escodegen.generate(node.arguments[0]));
79
}
80
}
81
if (opts.nodes) modules.nodes.push(node);
82
});
83
84
return modules;
85
};
86
87