From caff930d47eb722096634b3d074bfb0afce867b1 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 18 Nov 2017 01:39:02 -0500 Subject: [PATCH] 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 Reviewed-By: James M Snell --- lib/module.js | 5 ++++- .../default/node_modules/dep/index.js | 0 .../resolve-paths/default/verify-paths.js | 21 +++++++++++++++++++ .../defined/node_modules/dep/index.js | 0 test/parallel/test-require-resolve.js | 1 + 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/resolve-paths/default/node_modules/dep/index.js create mode 100644 test/fixtures/resolve-paths/default/verify-paths.js create mode 100644 test/fixtures/resolve-paths/defined/node_modules/dep/index.js diff --git a/lib/module.js b/lib/module.js index e418a1a3e08440..0f63fe9a2ca2f5 100644 --- a/lib/module.js +++ b/lib/module.js @@ -518,11 +518,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); diff --git a/test/fixtures/resolve-paths/default/node_modules/dep/index.js b/test/fixtures/resolve-paths/default/node_modules/dep/index.js new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/test/fixtures/resolve-paths/default/verify-paths.js b/test/fixtures/resolve-paths/default/verify-paths.js new file mode 100644 index 00000000000000..dee03fbfe3b6b4 --- /dev/null +++ b/test/fixtures/resolve-paths/default/verify-paths.js @@ -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') +); diff --git a/test/fixtures/resolve-paths/defined/node_modules/dep/index.js b/test/fixtures/resolve-paths/defined/node_modules/dep/index.js new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/test/parallel/test-require-resolve.js b/test/parallel/test-require-resolve.js index 6f2253a4e27083..4fbf697faf51b6 100644 --- a/test/parallel/test-require-resolve.js +++ b/test/parallel/test-require-resolve.js @@ -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'));