index.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. var acorn = require('acorn');
  2. var walk = require('acorn/dist/walk');
  3. var defined = require('defined');
  4. var requireRe = /\brequire\b/;
  5. function parse (src, opts) {
  6. if (!opts) opts = {};
  7. return acorn.parse(src, {
  8. ecmaVersion: defined(opts.ecmaVersion, 9),
  9. sourceType: opts.sourceType,
  10. ranges: defined(opts.ranges, opts.range),
  11. locations: defined(opts.locations, opts.loc),
  12. allowReserved: defined(opts.allowReserved, true),
  13. allowReturnOutsideFunction: defined(
  14. opts.allowReturnOutsideFunction, true
  15. ),
  16. allowImportExportEverywhere: defined(
  17. opts.allowImportExportEverywhere, true
  18. ),
  19. allowHashBang: defined(opts.allowHashBang, true)
  20. });
  21. }
  22. var exports = module.exports = function (src, opts) {
  23. return exports.find(src, opts).strings;
  24. };
  25. exports.find = function (src, opts) {
  26. if (!opts) opts = {};
  27. var word = opts.word === undefined ? 'require' : opts.word;
  28. if (typeof src !== 'string') src = String(src);
  29. var isRequire = opts.isRequire || function (node) {
  30. return node.callee.type === 'Identifier'
  31. && node.callee.name === word
  32. ;
  33. };
  34. var modules = { strings : [], expressions : [] };
  35. if (opts.nodes) modules.nodes = [];
  36. var wordRe = word === 'require' ? requireRe : RegExp('\\b' + word + '\\b');
  37. if (!wordRe.test(src)) return modules;
  38. var ast = parse(src, opts.parse);
  39. function visit(node, st, c) {
  40. var hasRequire = wordRe.test(src.slice(node.start, node.end));
  41. if (!hasRequire) return;
  42. walk.base[node.type](node, st, c);
  43. if (node.type !== 'CallExpression') return;
  44. if (isRequire(node)) {
  45. if (node.arguments.length) {
  46. var arg = node.arguments[0];
  47. if (arg.type === 'Literal') {
  48. modules.strings.push(arg.value);
  49. }
  50. else if (arg.type === 'TemplateLiteral'
  51. && arg.quasis.length === 1
  52. && arg.expressions.length === 0) {
  53. modules.strings.push(arg.quasis[0].value.raw);
  54. }
  55. else {
  56. modules.expressions.push(src.slice(arg.start, arg.end));
  57. }
  58. }
  59. if (opts.nodes) modules.nodes.push(node);
  60. }
  61. }
  62. walk.recursive(ast, null, {
  63. Statement: visit,
  64. Expression: visit
  65. });
  66. return modules;
  67. };