From 8578e81b2b41eac6aea7a812b8e5f35a7362a6df 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 cc8d5097bb83b2..77e5e3fef66f29 100644 --- a/lib/module.js +++ b/lib/module.js @@ -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); 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'));