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