summaryrefslogtreecommitdiff
path: root/lib/module.js
diff options
context:
space:
mode:
authorhefangshi <hefangshi@gmail.com>2016-05-10 16:16:49 +0800
committerEvan Lucas <evanlucas@me.com>2016-08-09 05:46:40 -0500
commit55852e14212f81b3849508e7e8862b3077316a99 (patch)
tree2526a983c4ca4d9236575ed2e7b3c8750f2d88cb /lib/module.js
parent5111e789e62174a72cdbe6963ed5c6e9210a7049 (diff)
downloadandroid-node-v8-55852e14212f81b3849508e7e8862b3077316a99.tar.gz
android-node-v8-55852e14212f81b3849508e7e8862b3077316a99.tar.bz2
android-node-v8-55852e14212f81b3849508e7e8862b3077316a99.zip
module: fix node_modules search path in edge case
The `p < nmLen` condition will fail when a module's name is end with `node_modules` like `foo_node_modules`. The old logic will miss the `foo_node_modules/node_modules` in node_modules paths. TL;TR, a module named like `foo_node_modules` can't require any module in the node_modules folder. Fixes: https://github.com/nodejs/node/issues/6679 PR-URL: https://github.com/nodejs/node/pull/6670 Reviewed-By: Evan Lucas <evanlucas@me.com>
Diffstat (limited to 'lib/module.js')
-rw-r--r--lib/module.js21
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/module.js b/lib/module.js
index b473631780..fe9700f7a6 100644
--- a/lib/module.js
+++ b/lib/module.js
@@ -221,17 +221,29 @@ if (process.platform === 'win32') {
// note: this approach *only* works when the path is guaranteed
// to be absolute. Doing a fully-edge-case-correct path.split
// that works on both Windows and Posix is non-trivial.
+
+ // return root node_modules when path is 'D:\\'.
+ // path.resolve will make sure from.length >=3 in Windows.
+ if (from.charCodeAt(from.length - 1) === 92/*\*/ &&
+ from.charCodeAt(from.length - 2) === 58/*:*/)
+ return [from + 'node_modules'];
+
const paths = [];
var p = 0;
var last = from.length;
for (var i = from.length - 1; i >= 0; --i) {
const code = from.charCodeAt(i);
- if (code === 92/*\*/ || code === 47/*/*/) {
+ // The path segment separator check ('\' and '/') was used to get
+ // node_modules path for every path segment.
+ // Use colon as an extra condition since we can get node_modules
+ // path for dirver root like 'C:\node_modules' and don't need to
+ // parse driver name.
+ if (code === 92/*\*/ || code === 47/*/*/ || code === 58/*:*/) {
if (p !== nmLen)
paths.push(from.slice(0, last) + '\\node_modules');
last = i;
p = 0;
- } else if (p !== -1 && p < nmLen) {
+ } else if (p !== -1) {
if (nmChars[p] === code) {
++p;
} else {
@@ -265,7 +277,7 @@ if (process.platform === 'win32') {
paths.push(from.slice(0, last) + '/node_modules');
last = i;
p = 0;
- } else if (p !== -1 && p < nmLen) {
+ } else if (p !== -1) {
if (nmChars[p] === code) {
++p;
} else {
@@ -274,6 +286,9 @@ if (process.platform === 'win32') {
}
}
+ // Append /node_modules to handle root paths.
+ paths.push('/node_modules');
+
return paths;
};
}