diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 39f9766d3e595d..86ed3ac1a96fba 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..c5350e11facda4 100644 --- a/test/parallel/test-module-relative-lookup.js +++ b/test/parallel/test-module-relative-lookup.js @@ -1,15 +1,25 @@ '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 testFirstInPath(moduleName, isLocalModule) { + const assertFunction = isLocalModule ? + assert.strictEqual : + assert.notStrictEqual; -paths = _module._resolveLookupPaths('./lodash', null, true); + const lookupResults = _module._resolveLookupPaths(moduleName); -// Current directory gets highest priority for local modules -assert.strictEqual(paths && paths[0], '.'); + let paths = lookupResults[1]; + assertFunction(paths[0], '.'); + + paths = _module._resolveLookupPaths(moduleName, null, true); + assertFunction(paths && paths[0], '.'); +} + +testFirstInPath('./lodash', true); + +// Relative path on Windows, but a regular file name elsewhere +testFirstInPath('.\\lodash', common.isWindows); diff --git a/test/parallel/test-preload.js b/test/parallel/test-preload.js index 5941c0b96bc602..8a2b56666d6bf0 100644 --- a/test/parallel/test-preload.js +++ b/test/parallel/test-preload.js @@ -132,6 +132,26 @@ childProcess.exec( } ); +// test that preloading with a relative path works +process.chdir(fixtures.fixturesDir); +childProcess.exec( + `"${nodeBinary}" ${preloadOption(['./printA.js'])} "${fixtureB}"`, + common.mustCall(function(err, stdout, stderr) { + assert.ifError(err); + assert.strictEqual(stdout, 'A\nB\n'); + }) +); +if (common.isWindows) { + // https://github.com/nodejs/node/issues/21918 + childProcess.exec( + `"${nodeBinary}" ${preloadOption(['.\\printA.js'])} "${fixtureB}"`, + common.mustCall(function(err, stdout, stderr) { + assert.ifError(err); + assert.strictEqual(stdout, 'A\nB\n'); + }) + ); +} + // https://github.com/nodejs/node/issues/1691 process.chdir(fixtures.fixturesDir); childProcess.exec(