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');
7 module.exports = function (x, opts) {
9 var isFile = opts.isFile || function (file) {
10 try { var stat = fs.statSync(file) }
11 catch (err) { if (err && err.code === 'ENOENT') return false }
12 return stat.isFile() || stat.isFIFO();
14 var readFileSync = opts.readFileSync || fs.readFileSync;
16 var extensions = opts.extensions || [ '.js' ];
17 var y = opts.basedir || path.dirname(caller());
19 opts.paths = opts.paths || [];
21 if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {
22 var res = path.resolve(y, x);
23 if (x === '..') res += '/';
24 var m = loadAsFileSync(res) || loadAsDirectorySync(res);
27 var n = loadNodeModulesSync(x, y);
31 if (core[x]) return x;
33 throw new Error("Cannot find module '" + x + "' from '" + y + "'");
35 function loadAsFileSync (x) {
40 for (var i = 0; i < extensions.length; i++) {
41 var file = x + extensions[i];
48 function loadAsDirectorySync (x) {
49 var pkgfile = path.join(x, '/package.json');
50 if (isFile(pkgfile)) {
51 var body = readFileSync(pkgfile, 'utf8');
53 var pkg = JSON.parse(body);
54 if (opts.packageFilter) {
55 pkg = opts.packageFilter(pkg, x);
59 var m = loadAsFileSync(path.resolve(x, pkg.main));
61 var n = loadAsDirectorySync(path.resolve(x, pkg.main));
68 return loadAsFileSync(path.join( x, '/index'));
71 function loadNodeModulesSync (x, start) {
72 var dirs = nodeModulesPaths(start, opts);
73 for (var i = 0; i < dirs.length; i++) {
75 var m = loadAsFileSync(path.join( dir, '/', x));
77 var n = loadAsDirectorySync(path.join( dir, '/', x ));