Skip to content

Commit

Permalink
src: fix module search path for preload modules
Browse files Browse the repository at this point in the history
When the preload module is not a abs/relative path, we should use
the standard search mechanism of looking into the node_modules folders
outwards. The current working directory is deemed to be the 'requiring
module', i.e. parent. The search path starts from cwd outwards.

Fixes: #1803
PR-URL: #1812
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Jeremiah Senkpiel <[email protected]>
  • Loading branch information
ofrobots authored and Fishrock123 committed May 30, 2015
1 parent 53e98cc commit 5759722
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 4 deletions.
14 changes: 14 additions & 0 deletions lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,20 @@ Module.requireRepl = function() {
return Module._load('internal/repl', '.');
};

Module._preloadModules = function(requests) {
if (!Array.isArray(requests))
return;

// Preloaded modules have a dummy parent module which is deemed to exist
// in the current working directory. This seeds the search path for
// preloaded modules.
var parent = new Module('internal/preload', null);
parent.paths = Module._nodeModulePaths(process.cwd());
requests.forEach(function(request) {
Module._load(request, parent, false);
});
};

Module._initPaths();

// backwards compatibility
Expand Down
5 changes: 1 addition & 4 deletions src/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -839,10 +839,7 @@
// Load preload modules
startup.preloadModules = function() {
if (process._preload_modules) {
var Module = NativeModule.require('module');
process._preload_modules.forEach(function(module) {
Module._load(module);
});
NativeModule.require('module')._preloadModules(process._preload_modules);
}
};

Expand Down
9 changes: 9 additions & 0 deletions test/fixtures/cluster-preload.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
var assert = require('assert');

// https://github.com/nodejs/io.js/issues/1803
// this module is used as a preload module. It should have a parent with the
// module search paths initialized from the current working directory
assert.ok(module.parent);
var expectedPaths = require('module')._nodeModulePaths(process.cwd());
assert.deepEqual(module.parent.paths, expectedPaths);

var cluster = require('cluster');
cluster.isMaster || process.exit(42 + cluster.worker.id); // +42 to distinguish
// from exit(1) for other random reasons

0 comments on commit 5759722

Please sign in to comment.