diff options
author | hefangshi <hefangshi@gmail.com> | 2016-05-10 16:16:49 +0800 |
---|---|---|
committer | Evan Lucas <evanlucas@me.com> | 2016-08-09 05:46:40 -0500 |
commit | 55852e14212f81b3849508e7e8862b3077316a99 (patch) | |
tree | 2526a983c4ca4d9236575ed2e7b3c8750f2d88cb /lib/module.js | |
parent | 5111e789e62174a72cdbe6963ed5c6e9210a7049 (diff) | |
download | android-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.js | 21 |
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; }; } |