You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.9 KiB
JavaScript
71 lines
1.9 KiB
JavaScript
7 years ago
|
var esprima = require('esprima-fb');
|
||
|
var escodegen = require('escodegen');
|
||
|
|
||
|
var traverse = function (node, cb) {
|
||
|
if (Array.isArray(node)) {
|
||
|
node.forEach(function (x) {
|
||
|
if(x != null) {
|
||
|
x.parent = node;
|
||
|
traverse(x, cb);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
else if (node && typeof node === 'object') {
|
||
|
cb(node);
|
||
|
|
||
|
Object.keys(node).forEach(function (key) {
|
||
|
if (key === 'parent' || !node[key]) return;
|
||
|
node[key].parent = node;
|
||
|
traverse(node[key], cb);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var walk = function (src, opts, cb) {
|
||
|
var ast = esprima.parse(src, opts);
|
||
|
traverse(ast, cb);
|
||
|
};
|
||
|
|
||
|
var exports = module.exports = function (src, opts) {
|
||
|
return exports.find(src, opts).strings;
|
||
|
};
|
||
|
|
||
|
exports.find = function (src, opts) {
|
||
|
if (!opts) opts = {};
|
||
|
opts.parse = opts.parse || {};
|
||
|
opts.parse.tolerant = true;
|
||
|
|
||
|
var word = opts.word === undefined ? 'require' : opts.word;
|
||
|
if (typeof src !== 'string') src = String(src);
|
||
|
src = src.replace(/^#![^\n]*\n/, '');
|
||
|
|
||
|
var isRequire = opts.isRequire || function (node) {
|
||
|
var c = node.callee;
|
||
|
return c
|
||
|
&& node.type === 'CallExpression'
|
||
|
&& c.type === 'Identifier'
|
||
|
&& c.name === word
|
||
|
;
|
||
|
}
|
||
|
|
||
|
var modules = { strings : [], expressions : [] };
|
||
|
if (opts.nodes) modules.nodes = [];
|
||
|
|
||
|
if (src.indexOf(word) == -1) return modules;
|
||
|
|
||
|
walk(src, opts.parse, function (node) {
|
||
|
if (!isRequire(node)) return;
|
||
|
if (node.arguments.length) {
|
||
|
if (node.arguments[0].type === 'Literal') {
|
||
|
modules.strings.push(node.arguments[0].value);
|
||
|
}
|
||
|
else {
|
||
|
modules.expressions.push(escodegen.generate(node.arguments[0]));
|
||
|
}
|
||
|
}
|
||
|
if (opts.nodes) modules.nodes.push(node);
|
||
|
});
|
||
|
|
||
|
return modules;
|
||
|
};
|