|  | 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; | 
|  | } | 
|  | } | 
|  | }; |