index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. const crequire = require('crequire');
  5. const debug = require('debug')('resolve-files');
  6. const defaults = {
  7. cwd: process.cwd(),
  8. entry: [],
  9. ignoreModules: false,
  10. };
  11. module.exports = options => {
  12. options = Object.assign({}, defaults, options);
  13. const entries = new Set(options.entry || []);
  14. try {
  15. entries.add(require.resolve(options.cwd));
  16. } catch (err) {
  17. debug('require %s error: %s', options.cwd, err.message);
  18. }
  19. if (!entries.size) return [];
  20. const files = new Set();
  21. for (const entry of entries) {
  22. if (fs.existsSync(entry) && fs.statSync(entry).isFile()) {
  23. resolveFile(entry, files, options);
  24. }
  25. }
  26. return Array.from(files);
  27. };
  28. function resolveFile(entry, files, options) {
  29. if (files.has(entry)) return;
  30. files.add(entry);
  31. debug('resolve entry %s', entry);
  32. const body = fs.readFileSync(entry, 'utf8');
  33. const rfiles = crequire(body, true).map(o => o.path);
  34. for (let file of rfiles) {
  35. // only resolve relative path
  36. if (file[0] === '.') {
  37. // ./foo.js > foo.js
  38. file = path.join(path.dirname(entry), file);
  39. if (isFile(file)) {
  40. resolveFile(file, files, options);
  41. continue;
  42. }
  43. // ./foo > foo.js
  44. const filejs = file + '.js';
  45. if (isFile(filejs)) {
  46. resolveFile(filejs, files, options);
  47. continue;
  48. }
  49. // ./foo > foo/index.js
  50. const filedir = path.join(file, 'index.js');
  51. if (isFile(filedir)) {
  52. resolveFile(filedir, files, options);
  53. continue;
  54. }
  55. // otherwise ignore
  56. // should throw?
  57. debug('don\' find %s from %s', file, entry);
  58. continue;
  59. }
  60. // resolve modules
  61. if (options.ignoreModules) continue;
  62. files.add(file);
  63. }
  64. return files;
  65. }
  66. function isFile(file) {
  67. return fs.existsSync(file) && fs.statSync(file).isFile();
  68. }