module: replace default paths in require.resolve()

Prior to this commit, the default search paths would be included
in the require.resolve() process, even if user specified paths
were provided. This commit causes the default paths to be
omitted by using a fake parent module.

Refs: https://github.com/nodejs/node/issues/5963
PR-URL: https://github.com/nodejs/node/pull/17113
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
cjihrig 2017-11-18 01:39:02 -05:00
parent 4b34e6fef1
commit 8578e81b2b
No known key found for this signature in database
GPG Key ID: 7434390BDBE9B9C5
5 changed files with 26 additions and 1 deletions

View File

@ -521,11 +521,14 @@ Module._resolveFilename = function(request, parent, isMain, options) {
if (typeof options === 'object' && options !== null &&
Array.isArray(options.paths)) {
const fakeParent = new Module('', null);
paths = [];
for (var i = 0; i < options.paths.length; i++) {
const path = options.paths[i];
const lookupPaths = Module._resolveLookupPaths(path, parent, true);
fakeParent.paths = Module._nodeModulePaths(path);
const lookupPaths = Module._resolveLookupPaths(request, fakeParent, true);
if (!paths.includes(path))
paths.push(path);

View File

View File

@ -0,0 +1,21 @@
'use strict';
require('../../../common');
const assert = require('assert');
const path = require('path');
// By default, resolving 'dep' should return
// fixturesDir/resolve-paths/default/node_modules/dep/index.js. By setting
// the path to fixturesDir/resolve-paths/default, the 'default' directory
// structure should be ignored.
assert.strictEqual(
require.resolve('dep'),
path.join(__dirname, 'node_modules', 'dep', 'index.js')
);
const paths = [path.resolve(__dirname, '..', 'defined')];
assert.strictEqual(
require.resolve('dep', { paths }),
path.join(paths[0], 'node_modules', 'dep', 'index.js')
);

View File

View File

@ -37,3 +37,4 @@ assert.strictEqual('path', require.resolve('path'));
// Test configurable resolve() paths.
require(fixtures.path('require-resolve.js'));
require(fixtures.path('resolve-paths', 'default', 'verify-paths.js'));