sync.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. var core = require('./core');
  2. var fs = require('fs');
  3. var path = require('path');
  4. var caller = require('./caller.js');
  5. var nodeModulesPaths = require('./node-modules-paths.js');
  6. module.exports = function (x, opts) {
  7. if (!opts) opts = {};
  8. var isFile = opts.isFile || function (file) {
  9. try { var stat = fs.statSync(file) }
  10. catch (err) {
  11. if (err && err.code === 'ENOENT') return false;
  12. throw err;
  13. }
  14. return stat.isFile() || stat.isFIFO();
  15. };
  16. var readFileSync = opts.readFileSync || fs.readFileSync;
  17. var extensions = opts.extensions || [ '.js' ];
  18. var y = opts.basedir || path.dirname(caller());
  19. opts.paths = opts.paths || [];
  20. if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {
  21. var res = path.resolve(y, x);
  22. if (x === '..') res += '/';
  23. var m = loadAsFileSync(res) || loadAsDirectorySync(res);
  24. if (m) return m;
  25. } else {
  26. var n = loadNodeModulesSync(x, y);
  27. if (n) return n;
  28. }
  29. if (core[x]) return x;
  30. throw new Error("Cannot find module '" + x + "' from '" + y + "'");
  31. function loadAsFileSync (x) {
  32. if (isFile(x)) {
  33. return x;
  34. }
  35. for (var i = 0; i < extensions.length; i++) {
  36. var file = x + extensions[i];
  37. if (isFile(file)) {
  38. return file;
  39. }
  40. }
  41. }
  42. function loadAsDirectorySync (x) {
  43. var pkgfile = path.join(x, '/package.json');
  44. if (isFile(pkgfile)) {
  45. var body = readFileSync(pkgfile, 'utf8');
  46. try {
  47. var pkg = JSON.parse(body);
  48. if (opts.packageFilter) {
  49. pkg = opts.packageFilter(pkg, x);
  50. }
  51. if (pkg.main) {
  52. var m = loadAsFileSync(path.resolve(x, pkg.main));
  53. if (m) return m;
  54. var n = loadAsDirectorySync(path.resolve(x, pkg.main));
  55. if (n) return n;
  56. }
  57. }
  58. catch (err) {}
  59. }
  60. return loadAsFileSync(path.join( x, '/index'));
  61. }
  62. function loadNodeModulesSync (x, start) {
  63. var dirs = nodeModulesPaths(start, opts);
  64. for (var i = 0; i < dirs.length; i++) {
  65. var dir = dirs[i];
  66. var m = loadAsFileSync(path.join( dir, '/', x));
  67. if (m) return m;
  68. var n = loadAsDirectorySync(path.join( dir, '/', x ));
  69. if (n) return n;
  70. }
  71. }
  72. };