| var core = require('./core'); |
| var fs = require('fs'); |
| var path = require('path'); |
| var caller = require('./caller.js'); |
| var nodeModulesPaths = require('./node-modules-paths.js'); |
| |
| module.exports = function (x, opts) { |
| if (!opts) opts = {}; |
| var isFile = opts.isFile || function (file) { |
| try { var stat = fs.statSync(file) } |
| catch (err) { if (err && err.code === 'ENOENT') return false } |
| return stat.isFile() || stat.isFIFO(); |
| }; |
| var readFileSync = opts.readFileSync || fs.readFileSync; |
| |
| var extensions = opts.extensions || [ '.js' ]; |
| var y = opts.basedir || path.dirname(caller()); |
| |
| opts.paths = opts.paths || []; |
| |
| if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) { |
| var res = path.resolve(y, x); |
| if (x === '..') res += '/'; |
| var m = loadAsFileSync(res) || loadAsDirectorySync(res); |
| if (m) return m; |
| } else { |
| var n = loadNodeModulesSync(x, y); |
| if (n) return n; |
| } |
| |
| if (core[x]) return x; |
| |
| throw new Error("Cannot find module '" + x + "' from '" + y + "'"); |
| |
| function loadAsFileSync (x) { |
| if (isFile(x)) { |
| return x; |
| } |
| |
| for (var i = 0; i < extensions.length; i++) { |
| var file = x + extensions[i]; |
| if (isFile(file)) { |
| return file; |
| } |
| } |
| } |
| |
| function loadAsDirectorySync (x) { |
| var pkgfile = path.join(x, '/package.json'); |
| if (isFile(pkgfile)) { |
| var body = readFileSync(pkgfile, 'utf8'); |
| try { |
| var pkg = JSON.parse(body); |
| if (opts.packageFilter) { |
| pkg = opts.packageFilter(pkg, x); |
| } |
| |
| if (pkg.main) { |
| var m = loadAsFileSync(path.resolve(x, pkg.main)); |
| if (m) return m; |
| var n = loadAsDirectorySync(path.resolve(x, pkg.main)); |
| if (n) return n; |
| } |
| } |
| catch (err) {} |
| } |
| |
| return loadAsFileSync(path.join( x, '/index')); |
| } |
| |
| function loadNodeModulesSync (x, start) { |
| var dirs = nodeModulesPaths(start, opts); |
| for (var i = 0; i < dirs.length; i++) { |
| var dir = dirs[i]; |
| var m = loadAsFileSync(path.join( dir, '/', x)); |
| if (m) return m; |
| var n = loadAsDirectorySync(path.join( dir, '/', x )); |
| if (n) return n; |
| } |
| } |
| }; |