Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80762 views
1
var core = require('./core');
2
var fs = require('fs');
3
var path = require('path');
4
5
module.exports = function resolve (x, opts, cb) {
6
if (core[x]) return cb(null, x);
7
8
if (typeof opts === 'function') {
9
cb = opts;
10
opts = {};
11
}
12
if (!opts) opts = {};
13
14
var isFile = opts.isFile || function (file, cb) {
15
fs.stat(file, function (err, stat) {
16
if (err && err.code === 'ENOENT') cb(null, false)
17
else if (err) cb(err)
18
else cb(null, stat.isFile() || stat.isFIFO())
19
});
20
};
21
var readFile = opts.readFile || fs.readFile;
22
23
var extensions = opts.extensions || [ '.js' ];
24
var y = opts.basedir
25
|| path.dirname(require.cache[__filename].parent.filename)
26
;
27
28
opts.paths = opts.paths || [];
29
30
if (x.match(/^(?:\.\.?\/|\/|([A-Za-z]:)?\\)/)) {
31
loadAsFile(path.resolve(y, x), function (err, m) {
32
if (err) cb(err)
33
else if (m) cb(null, m)
34
else loadAsDirectory(path.resolve(y, x), function (err, d) {
35
if (err) cb(err)
36
else if (d) cb(null, d)
37
else cb(new Error("Cannot find module '" + x + "'"))
38
})
39
});
40
}
41
else loadNodeModules(x, y, function (err, n) {
42
if (err) cb(err)
43
else if (n) cb(null, n)
44
else cb(new Error("Cannot find module '" + x + "'"))
45
});
46
47
function loadAsFile (x, cb) {
48
(function load (exts) {
49
if (exts.length === 0) return cb(null, undefined);
50
var file = x + exts[0];
51
52
isFile(file, function (err, ex) {
53
if (err) cb(err)
54
else if (ex) cb(null, file)
55
else load(exts.slice(1))
56
});
57
})([''].concat(extensions));
58
}
59
60
function loadAsDirectory (x, cb) {
61
var pkgfile = path.join(x, '/package.json');
62
isFile(pkgfile, function (err, ex) {
63
if (err) return cb(err);
64
if (!ex) return loadAsFile(path.join(x, '/index'), cb);
65
66
readFile(pkgfile, function (err, body) {
67
if (err) return cb(err);
68
try {
69
var pkg = JSON.parse(body);
70
}
71
catch (err) {}
72
73
if (opts.packageFilter) {
74
pkg = opts.packageFilter(pkg, x);
75
}
76
77
if (pkg.main) {
78
loadAsFile(path.resolve(x, pkg.main), function (err, m) {
79
if (err) return cb(err);
80
if (m) return cb(null, m);
81
var dir = path.resolve(x, pkg.main);
82
loadAsDirectory(dir, function (err, n) {
83
if (err) return cb(err);
84
if (n) return cb(null, n);
85
loadAsFile(path.join(x, '/index'), cb);
86
});
87
});
88
return;
89
}
90
91
loadAsFile(path.join(x, '/index'), cb);
92
});
93
});
94
}
95
96
function loadNodeModules (x, start, cb) {
97
(function process (dirs) {
98
if (dirs.length === 0) return cb(null, undefined);
99
var dir = dirs[0];
100
101
loadAsFile(path.join(dir, '/', x), function (err, m) {
102
if (err) return cb(err);
103
if (m) return cb(null, m);
104
loadAsDirectory(path.join(dir, '/', x), function (err, n) {
105
if (err) return cb(err);
106
if (n) return cb(null, n);
107
process(dirs.slice(1));
108
});
109
});
110
})(nodeModulesPaths(start));
111
}
112
113
function nodeModulesPaths (start, cb) {
114
var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\/+/;
115
var parts = start.split(splitRe);
116
117
var dirs = [];
118
for (var i = parts.length - 1; i >= 0; i--) {
119
if (parts[i] === 'node_modules') continue;
120
var dir = path.join(
121
path.join.apply(path, parts.slice(0, i + 1)),
122
'node_modules'
123
);
124
if (!parts[0].match(/([A-Za-z]:)/)) {
125
dir = '/' + dir;
126
}
127
dirs.push(dir);
128
}
129
return dirs.concat(opts.paths);
130
}
131
};
132
133