Skip to content

Commit

Permalink
module: check file ext before dir as documented
Browse files Browse the repository at this point in the history
The documented resolution algorithm started to search for package.json
files prior to searching for file extensions when searching for a
specifier. Oddly, it did not search for index files at same time it
searched for package.json. This restores the documented behavior of
searching for file extensions prior to searching directories.

PR-URL: #15015
Fixes: #14990
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Khaidi Chu <i@2333.moe>
  • Loading branch information
bmeck authored and BridgeAR committed Mar 11, 2018
1 parent 8b69d4a commit 1ed36ae
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 7 deletions.
15 changes: 8 additions & 7 deletions lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ Module._findPath = function(request, paths, isMain) {
var exts;
var trailingSlash = request.length > 0 &&
request.charCodeAt(request.length - 1) === CHAR_FORWARD_SLASH;
if (!trailingSlash) {
trailingSlash = /(?:^|\/)\.?\.$/.test(request);
}

// For each path
for (var i = 0; i < paths.length; i++) {
Expand All @@ -236,10 +239,6 @@ Module._findPath = function(request, paths, isMain) {
} else {
filename = toRealPath(basePath);
}
} else if (rc === 1) { // Directory.
if (exts === undefined)
exts = Object.keys(Module._extensions);
filename = tryPackage(basePath, exts, isMain);
}

if (!filename) {
Expand All @@ -251,11 +250,13 @@ Module._findPath = function(request, paths, isMain) {
}

if (!filename && rc === 1) { // Directory.
// try it with each of the extensions at "index"
if (exts === undefined)
exts = Object.keys(Module._extensions);
filename = tryPackage(basePath, exts, isMain) ||
// try it with each of the extensions at "index"
tryExtensions(path.resolve(basePath, 'index'), exts, isMain);
filename = tryPackage(basePath, exts, isMain);
if (!filename) {
filename = tryExtensions(path.resolve(basePath, 'index'), exts, isMain);
}
}

if (filename) {
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/module-extension-over-directory/inner.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {};
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"main": "./package.json"
}
30 changes: 30 additions & 0 deletions test/parallel/test-require-extension-over-directory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';
// fixes regression from v4
require('../common');
const assert = require('assert');
const fixtures = require('../common/fixtures');
const path = require('path');

const fixturesRequire = require(
fixtures.path('module-extension-over-directory', 'inner'));

assert.strictEqual(
fixturesRequire,
require(fixtures.path('module-extension-over-directory', 'inner.js')),
'test-require-extension-over-directory failed to import fixture' +
' requirements'
);

const fakePath = [
fixtures.path('module-extension-over-directory', 'inner'),
'fake',
'..'
].join(path.sep);
const fixturesRequireDir = require(fakePath);

assert.strictEqual(
fixturesRequireDir,
require(fixtures.path('module-extension-over-directory', 'inner/')),
'test-require-extension-over-directory failed to import fixture' +
' requirements'
);

0 comments on commit 1ed36ae

Please sign in to comment.