Skip to content

Commit 855d01f

Browse files
committed
[Fix] preserveSymlinks: false ensure that files are realpathed
Fixes #196.
1 parent 017bfe1 commit 855d01f

File tree

11 files changed

+93
-7
lines changed

11 files changed

+93
-7
lines changed

.eslintrc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,13 @@
2727
"object-curly-newline": 0,
2828
"operator-linebreak": [2, "before"],
2929
"sort-keys": 0,
30-
}
30+
},
31+
"overrides": [
32+
{
33+
"files": "test/resolver/nested_symlinks/mylib/*.js",
34+
"rules": {
35+
"no-throw-literal": 0,
36+
},
37+
},
38+
],
3139
}

lib/async.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,15 @@ module.exports = function resolve(x, options, callback) {
8585
} else loadNodeModules(x, basedir, function (err, n, pkg) {
8686
if (err) cb(err);
8787
else if (core[x]) return cb(null, x);
88-
else if (n) cb(null, n, pkg);
89-
else {
88+
else if (n) {
89+
return maybeUnwrapSymlink(n, opts, function (err, realN) {
90+
if (err) {
91+
cb(err);
92+
} else {
93+
cb(null, realN, pkg);
94+
}
95+
});
96+
} else {
9097
var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
9198
moduleError.code = 'MODULE_NOT_FOUND';
9299
cb(moduleError);
@@ -99,8 +106,15 @@ module.exports = function resolve(x, options, callback) {
99106
else if (m) cb(null, m, pkg);
100107
else loadAsDirectory(res, function (err, d, pkg) {
101108
if (err) cb(err);
102-
else if (d) cb(null, d, pkg);
103-
else {
109+
else if (d) {
110+
maybeUnwrapSymlink(d, opts, function (err, realD) {
111+
if (err) {
112+
cb(err);
113+
} else {
114+
cb(null, realD, pkg);
115+
}
116+
});
117+
} else {
104118
var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
105119
moduleError.code = 'MODULE_NOT_FOUND';
106120
cb(moduleError);

lib/sync.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ module.exports = function (x, options) {
6161
var res = path.resolve(absoluteStart, x);
6262
if (x === '..' || x.slice(-1) === '/') res += '/';
6363
var m = loadAsFileSync(res) || loadAsDirectorySync(res);
64-
if (m) return m;
64+
if (m) return maybeUnwrapSymlink(m, opts);
6565
} else if (core[x]) {
6666
return x;
6767
} else {
6868
var n = loadNodeModulesSync(x, absoluteStart);
69-
if (n) return n;
69+
if (n) return maybeUnwrapSymlink(n, opts);
7070
}
7171

7272
if (core[x]) return x;

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"scripts": {
1717
"prepublish": "safe-publish-latest",
1818
"lint": "eslint .",
19+
"pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async",
1920
"tests-only": "tape test/*.js",
2021
"pretest": "npm run lint",
2122
"test": "npm run --silent tests-only",

test/resolver/nested_symlinks/common/node_modules/buffer/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/resolver/nested_symlinks/common/node_modules/buffer/package.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
var a = require.resolve('buffer/').replace(process.cwd(), '$CWD');
2+
var b;
3+
var c;
4+
5+
var test = function test() {
6+
console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false'));
7+
console.log(b, ': preserveSymlinks true');
8+
console.log(c, ': preserveSymlinks false');
9+
10+
if (a !== b && a !== c) {
11+
throw 'async: no match';
12+
}
13+
console.log('async: success! a matched either b or c\n');
14+
};
15+
16+
require('resolve')('buffer/', { preserveSymlinks: true }, function (err, result) {
17+
if (err) { throw err; }
18+
b = result.replace(process.cwd(), '$CWD');
19+
if (b && c) { test(); }
20+
});
21+
require('resolve')('buffer/', { preserveSymlinks: false }, function (err, result) {
22+
if (err) { throw err; }
23+
c = result.replace(process.cwd(), '$CWD');
24+
if (b && c) { test(); }
25+
});
26+

test/resolver/nested_symlinks/mylib/node_modules/buffer

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/resolver/nested_symlinks/mylib/node_modules/resolve

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "mylib",
3+
"version": "0.0.0",
4+
"description": "",
5+
"private": true,
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"author": "",
11+
"license": "ISC",
12+
"dependencies": {
13+
"buffer": "*"
14+
}
15+
}

0 commit comments

Comments
 (0)