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