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: nodejs#1803
  • Loading branch information
ofrobots committed May 27, 2015
1 parent 98649fd commit 8c9320e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 4 deletions.
13 changes: 13 additions & 0 deletions lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,19 @@ Module.requireRepl = function() {
return Module._load('internal/repl', '.');
};

Module._preloadModules = function(requests) {
if (requests) {
// 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 @@ -858,10 +858,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
12 changes: 12 additions & 0 deletions test/fixtures/cluster-preload.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
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.ok(module.parent.paths.length === expectedPaths.length &&
module.parent.paths.every(function(e,i) {
return e === expectedPaths[i];
}));

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 8c9320e

Please sign in to comment.