Skip to content

Commit f7da566

Browse files
committed
[Fix] preserveSymlinks: false ensure that files are realpathed
Fixes #196.
1 parent cc0f4e4 commit f7da566

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
@@ -99,8 +99,15 @@ module.exports = function resolve(x, options, callback) {
9999
} else loadNodeModules(x, basedir, function (err, n, pkg) {
100100
if (err) cb(err);
101101
else if (core[x]) return cb(null, x);
102-
else if (n) return cb(null, n, pkg);
103-
else {
102+
else if (n) {
103+
return maybeUnwrapSymlink(n, opts, function (err, realN) {
104+
if (err) {
105+
cb(err);
106+
} else {
107+
cb(null, realN, pkg);
108+
}
109+
});
110+
} else {
104111
var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
105112
moduleError.code = 'MODULE_NOT_FOUND';
106113
cb(moduleError);
@@ -113,8 +120,15 @@ module.exports = function resolve(x, options, callback) {
113120
else if (m) cb(null, m, pkg);
114121
else loadAsDirectory(res, function (err, d, pkg) {
115122
if (err) cb(err);
116-
else if (d) cb(null, d, pkg);
117-
else {
123+
else if (d) {
124+
maybeUnwrapSymlink(d, opts, function (err, realD) {
125+
if (err) {
126+
cb(err);
127+
} else {
128+
cb(null, realD, pkg);
129+
}
130+
});
131+
} else {
118132
var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
119133
moduleError.code = 'MODULE_NOT_FOUND';
120134
cb(moduleError);

lib/sync.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ module.exports = function (x, options) {
6767
var res = path.resolve(absoluteStart, x);
6868
if (x === '..' || x.slice(-1) === '/') res += '/';
6969
var m = loadAsFileSync(res) || loadAsDirectorySync(res);
70-
if (m) return m;
70+
if (m) return maybeUnwrapSymlink(m, opts);
7171
} else if (core[x]) {
7272
return x;
7373
} else {
7474
var n = loadNodeModulesSync(x, absoluteStart);
75-
if (n) return n;
75+
if (n) return maybeUnwrapSymlink(n, opts);
7676
}
7777

7878
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+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var a = require.resolve('buffer/').replace(process.cwd(), '$CWD');
2+
var b = require('resolve').sync('buffer/', { preserveSymlinks: true }).replace(process.cwd(), '$CWD');
3+
var c = require('resolve').sync('buffer/', { preserveSymlinks: false }).replace(process.cwd(), '$CWD');
4+
5+
console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false'));
6+
console.log(b, ': preserveSymlinks true');
7+
console.log(c, ': preserveSymlinks false');
8+
9+
if (a !== b && a !== c) {
10+
throw 'sync: no match';
11+
}
12+
console.log('sync: success! a matched either b or c\n');

0 commit comments

Comments
 (0)