From cf0e7c2316a229dbe30254d1c3bf3a23bda69492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Reis?= Date: Wed, 8 Aug 2018 03:58:06 +0100 Subject: [PATCH] module: accept Windows relative path Before this change, require('.\\test.js') failed while require('./test.js') succeeded. This changes _resolveLookupPaths so that both ways are accepted on Windows. Fixes: https://github.com/nodejs/node/issues/21918 --- lib/internal/modules/cjs/loader.js | 15 +++++++----- test/parallel/test-module-relative-lookup.js | 24 +++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index c218dc2cac2a50..870d2b5b3f503d 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -80,6 +80,8 @@ const { CHAR_9, } = require('internal/constants'); +const isWindows = process.platform === 'win32'; + function stat(filename) { filename = path.toNamespacedPath(filename); const cache = stat.cache; @@ -310,7 +312,7 @@ Module._findPath = function(request, paths, isMain) { // 'node_modules' character codes reversed var nmChars = [ 115, 101, 108, 117, 100, 111, 109, 95, 101, 100, 111, 110 ]; var nmLen = nmChars.length; -if (process.platform === 'win32') { +if (isWindows) { // 'from' is the __dirname of the module. Module._nodeModulePaths = function(from) { // guarantee that 'from' is absolute. @@ -403,11 +405,12 @@ Module._resolveLookupPaths = function(request, parent, newReturn) { return (newReturn ? null : [request, []]); } - // Check for relative path + // Check for non-relative path if (request.length < 2 || request.charCodeAt(0) !== CHAR_DOT || (request.charCodeAt(1) !== CHAR_DOT && - request.charCodeAt(1) !== CHAR_FORWARD_SLASH)) { + request.charCodeAt(1) !== CHAR_FORWARD_SLASH && + (!isWindows || request.charCodeAt(1) !== CHAR_BACKWARD_SLASH))) { var paths = modulePaths; if (parent) { if (!parent.paths) @@ -480,7 +483,9 @@ Module._resolveLookupPaths = function(request, parent, newReturn) { // make sure require('./path') and require('path') get distinct ids, even // when called from the toplevel js file - if (parentIdPath === '.' && id.indexOf('/') === -1) { + if (parentIdPath === '.' && + id.indexOf('/') === -1 && + (!isWindows || id.indexOf('\\') === -1)) { id = './' + id; } @@ -746,8 +751,6 @@ Module.runMain = function() { }; Module._initPaths = function() { - const isWindows = process.platform === 'win32'; - var homeDir; var nodePath; if (isWindows) { diff --git a/test/parallel/test-module-relative-lookup.js b/test/parallel/test-module-relative-lookup.js index 3e1904dc14fa61..70899d190bef7b 100644 --- a/test/parallel/test-module-relative-lookup.js +++ b/test/parallel/test-module-relative-lookup.js @@ -1,15 +1,23 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const _module = require('module'); // avoid collision with global.module -const lookupResults = _module._resolveLookupPaths('./lodash'); -let paths = lookupResults[1]; -// Current directory gets highest priority for local modules -assert.strictEqual(paths[0], '.'); +function runTest(moduleName) { + const lookupResults = _module._resolveLookupPaths(moduleName); + let paths = lookupResults[1]; -paths = _module._resolveLookupPaths('./lodash', null, true); + // Current directory gets highest priority for local modules + assert.strictEqual(paths[0], '.'); -// Current directory gets highest priority for local modules -assert.strictEqual(paths && paths[0], '.'); + paths = _module._resolveLookupPaths(moduleName, null, true); + + // Current directory gets highest priority for local modules + assert.strictEqual(paths && paths[0], '.'); +} + +runTest('./lodash'); +if (common.isWindows) { + runTest('.\\lodash'); +}