Spaces:
Running
Running
| 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; | |
| }; | |