var acorn = require('acorn-node'); var walk = require('acorn-node/walk'); var defined = require('defined'); var requireRe = /\brequire\b/; function parse (src, opts) { if (!opts) opts = {}; var acornOpts = { ranges: defined(opts.ranges, opts.range), locations: defined(opts.locations, opts.loc), allowReserved: defined(opts.allowReserved, true), allowImportExportEverywhere: defined(opts.allowImportExportEverywhere, false) }; // Use acorn-node's defaults for the rest. if (opts.ecmaVersion != null) acornOpts.ecmaVersion = opts.ecmaVersion; if (opts.sourceType != null) acornOpts.sourceType = opts.sourceType; if (opts.allowHashBang != null) acornOpts.allowHashBang = opts.allowHashBang; if (opts.allowReturnOutsideFunction != null) acornOpts.allowReturnOutsideFunction = opts.allowReturnOutsideFunction; return acorn.parse(src, acornOpts); } var exports = module.exports = function (src, opts) { return exports.find(src, opts).strings; }; exports.find = function (src, opts) { if (!opts) opts = {}; var word = opts.word === undefined ? 'require' : opts.word; if (typeof src !== 'string') src = String(src); var isRequire = opts.isRequire || function (node) { return node.callee.type === 'Identifier' && node.callee.name === word ; }; var modules = { strings : [], expressions : [] }; if (opts.nodes) modules.nodes = []; var wordRe = word === 'require' ? requireRe : RegExp('\\b' + word + '\\b'); if (!wordRe.test(src)) return modules; var ast = parse(src, opts.parse); function visit(node, st, c) { var hasRequire = wordRe.test(src.slice(node.start, node.end)); if (!hasRequire) return; walk.base[node.type](node, st, c); if (node.type !== 'CallExpression') return; if (isRequire(node)) { if (node.arguments.length) { var arg = node.arguments[0]; if (arg.type === 'Literal') { modules.strings.push(arg.value); } else if (arg.type === 'TemplateLiteral' && arg.quasis.length === 1 && arg.expressions.length === 0) { modules.strings.push(arg.quasis[0].value.raw); } else { modules.expressions.push(src.slice(arg.start, arg.end)); } } if (opts.nodes) modules.nodes.push(node); } } walk.recursive(ast, null, { Statement: visit, Expression: visit }); return modules; };