sync.js 2.8 KB

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