aboutsummaryrefslogtreecommitdiff
path: root/node_modules/resolve/lib/sync.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/resolve/lib/sync.js')
-rw-r--r--node_modules/resolve/lib/sync.js65
1 files changed, 52 insertions, 13 deletions
diff --git a/node_modules/resolve/lib/sync.js b/node_modules/resolve/lib/sync.js
index bc9e287a1..51e58f02e 100644
--- a/node_modules/resolve/lib/sync.js
+++ b/node_modules/resolve/lib/sync.js
@@ -4,44 +4,57 @@ var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
+var defaultIsFile = function isFile(file) {
+ try {
+ var stat = fs.statSync(file);
+ } catch (e) {
+ if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
+ throw e;
+ }
+ return stat.isFile() || stat.isFIFO();
+};
+
module.exports = function (x, options) {
if (typeof x !== 'string') {
throw new TypeError('Path must be a string.');
}
var opts = options || {};
- var isFile = opts.isFile || function (file) {
- try {
- var stat = fs.statSync(file);
- } catch (e) {
- if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
- throw e;
- }
- return stat.isFile() || stat.isFIFO();
- };
+ var isFile = opts.isFile || defaultIsFile;
var readFileSync = opts.readFileSync || fs.readFileSync;
var extensions = opts.extensions || ['.js'];
- var y = opts.basedir || path.dirname(caller());
+ var basedir = opts.basedir || path.dirname(caller());
+ var parent = opts.filename || basedir;
opts.paths = opts.paths || [];
if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/.test(x)) {
- var res = path.resolve(y, x);
+ var res = path.resolve(basedir, x);
if (x === '..' || x.slice(-1) === '/') res += '/';
var m = loadAsFileSync(res) || loadAsDirectorySync(res);
if (m) return m;
} else {
- var n = loadNodeModulesSync(x, y);
+ var n = loadNodeModulesSync(x, basedir);
if (n) return n;
}
if (core[x]) return x;
- var err = new Error("Cannot find module '" + x + "' from '" + y + "'");
+ var err = new Error("Cannot find module '" + x + "' from '" + parent + "'");
err.code = 'MODULE_NOT_FOUND';
throw err;
function loadAsFileSync(x) {
+ var pkg = loadpkg(path.dirname(x));
+
+ if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {
+ var rfile = path.relative(pkg.dir, x);
+ var r = opts.pathFilter(pkg.pkg, x, rfile);
+ if (r) {
+ x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign
+ }
+ }
+
if (isFile(x)) {
return x;
}
@@ -54,6 +67,32 @@ module.exports = function (x, options) {
}
}
+ function loadpkg(dir) {
+ if (dir === '' || dir === '/') return;
+ if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
+ return;
+ }
+ if (/[/\\]node_modules[/\\]*$/.test(dir)) return;
+
+ var pkgfile = path.join(dir, 'package.json');
+
+ if (!isFile(pkgfile)) {
+ return loadpkg(path.dirname(dir));
+ }
+
+ var body = readFileSync(pkgfile);
+
+ try {
+ var pkg = JSON.parse(body);
+ } catch (jsonErr) {}
+
+ if (pkg && opts.packageFilter) {
+ pkg = opts.packageFilter(pkg, dir);
+ }
+
+ return { pkg: pkg, dir: dir };
+ }
+
function loadAsDirectorySync(x) {
var pkgfile = path.join(x, '/package.json');
if (isFile(pkgfile)) {