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.
typesetting/pitfall/pdfkit/node_modules/detective/index.js

71 lines
1.9 KiB
JavaScript

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;
};