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, options) {
8 var opts = options || {};
9 var isFile = opts.isFile || function (file) {
11 var stat = fs.statSync(file);
13 if (e && e.code === 'ENOENT') return false;
16 return stat.isFile() || stat.isFIFO();
18 var readFileSync = opts.readFileSync || fs.readFileSync;
20 var extensions = opts.extensions || ['.js'];
21 var y = opts.basedir || path.dirname(caller());
23 opts.paths = opts.paths || [];
25 if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {
26 var res = path.resolve(y, x);
27 if (x === '..') res += '/';
28 var m = loadAsFileSync(res) || loadAsDirectorySync(res);
31 var n = loadNodeModulesSync(x, y);
35 if (core[x]) return x;
37 var err = new Error("Cannot find module '" + x + "' from '" + y + "'");
38 err.code = 'MODULE_NOT_FOUND';
41 function loadAsFileSync(x) {
46 for (var i = 0; i < extensions.length; i++) {
47 var file = x + extensions[i];
54 function loadAsDirectorySync(x) {
55 var pkgfile = path.join(x, '/package.json');
56 if (isFile(pkgfile)) {
57 var body = readFileSync(pkgfile, 'utf8');
59 var pkg = JSON.parse(body);
60 if (opts.packageFilter) {
61 pkg = opts.packageFilter(pkg, x);
65 var m = loadAsFileSync(path.resolve(x, pkg.main));
67 var n = loadAsDirectorySync(path.resolve(x, pkg.main));
73 return loadAsFileSync(path.join(x, '/index'));
76 function loadNodeModulesSync(x, start) {
77 var dirs = nodeModulesPaths(start, opts);
78 for (var i = 0; i < dirs.length; i++) {
80 var m = loadAsFileSync(path.join(dir, '/', x));
82 var n = loadAsDirectorySync(path.join(dir, '/', x));