react / wstein / node_modules / browserify / node_modules / module-deps / node_modules / detective / index.js
80540 viewsvar aparse = require('acorn').parse;1var escodegen = require('escodegen');2var defined = require('defined');34var requireRe = /\brequire\b/;56function parse (src, opts) {7if (!opts) opts = {};8return aparse(src, {9ecmaVersion: defined(opts.ecmaVersion, 6),10ranges: defined(opts.ranges, opts.range),11locations: defined(opts.locations, opts.loc),12allowReserved: defined(opts.allowReserved, true),13allowReturnOutsideFunction: defined(14opts.allowReturnOutsideFunction, true15),16allowHashBang: defined(opts.allowHashBang, true)17});18}1920var traverse = function (node, cb) {21if (Array.isArray(node)) {22for (var i = 0; i < node.length; i++) {23if (node[i] != null) {24node[i].parent = node;25traverse(node[i], cb);26}27}28}29else if (node && typeof node === 'object') {30cb(node);31for (var key in node) {32if (!node.hasOwnProperty(key)) continue;33if (key === 'parent' || !node[key]) continue;34node[key].parent = node;35traverse(node[key], cb);36}37}38};3940var walk = function (src, opts, cb) {41var ast = parse(src, opts);42traverse(ast, cb);43};4445var exports = module.exports = function (src, opts) {46return exports.find(src, opts).strings;47};4849exports.find = function (src, opts) {50if (!opts) opts = {};5152var word = opts.word === undefined ? 'require' : opts.word;53if (typeof src !== 'string') src = String(src);5455var isRequire = opts.isRequire || function (node) {56var c = node.callee;57return c58&& node.type === 'CallExpression'59&& c.type === 'Identifier'60&& c.name === word61;62}6364var modules = { strings : [], expressions : [] };65if (opts.nodes) modules.nodes = [];6667var wordRe = word === 'require' ? requireRe : RegExp('\\b' + word + '\\b');68if (!wordRe.test(src)) return modules;6970walk(src, opts.parse, function (node) {71if (!isRequire(node)) return;72if (node.arguments.length) {73if (node.arguments[0].type === 'Literal') {74modules.strings.push(node.arguments[0].value);75}76else {77modules.expressions.push(escodegen.generate(node.arguments[0]));78}79}80if (opts.nodes) modules.nodes.push(node);81});8283return modules;84};858687