You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.6 KiB
80 lines
2.6 KiB
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; |
|
};
|
|
|