Skip to content

Commit 3ad82c3

Browse files
committed
module: handle NODE_PATH in require('.')
This commit restores the functionality of adding a module's path to NODE_PATH and requiring it with require('.'). As NODE_PATH was never intended to be used as a pointer to a module directory (but instead, to a directory containing directories of modules), this feature is also being deprecated in turn, to be removed at a later point in time. PR-URL: #1363 Fixes: #1356 Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Rod Vagg <rod@vagg.org>
1 parent 431673e commit 3ad82c3

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

lib/module.js

+19-1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ function tryExtensions(p, exts) {
125125
}
126126

127127

128+
const noopDeprecateRequireDot = util.deprecate(function() {},
129+
"warning: require('.') resolved outside the package directory. " +
130+
"This functionality is deprecated and will be removed soon.");
131+
132+
128133
Module._findPath = function(request, paths) {
129134
var exts = Object.keys(Module._extensions);
130135

@@ -169,6 +174,8 @@ Module._findPath = function(request, paths) {
169174
}
170175

171176
if (filename) {
177+
// Warn once if '.' resolved outside the module dir
178+
if (request === '.' && i > 0) noopDeprecateRequireDot();
172179
Module._pathCache[cacheKey] = filename;
173180
return filename;
174181
}
@@ -205,12 +212,23 @@ Module._resolveLookupPaths = function(request, parent) {
205212
}
206213

207214
var start = request.substring(0, 2);
208-
if (start !== '.' && start !== './' && start !== '..') {
215+
if (start !== './' && start !== '..') {
209216
var paths = modulePaths;
210217
if (parent) {
211218
if (!parent.paths) parent.paths = [];
212219
paths = parent.paths.concat(paths);
213220
}
221+
222+
// Maintain backwards compat with certain broken uses of require('.')
223+
// by putting the module's directory in front of the lookup paths.
224+
if (request === '.') {
225+
if (parent && parent.filename) {
226+
paths.splice(0, 0, path.dirname(parent.filename));
227+
} else {
228+
paths.splice(0, 0, path.resolve(request));
229+
}
230+
}
231+
214232
return [request, paths];
215233
}
216234

test/parallel/test-require-dot.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
var common = require('../common');
2+
var assert = require('assert');
3+
var module = require('module');
4+
5+
var a = require(common.fixturesDir + '/module-require/relative/dot.js');
6+
var b = require(common.fixturesDir + '/module-require/relative/dot-slash.js');
7+
8+
assert.equal(a.value, 42);
9+
assert.equal(a, b, 'require(".") should resolve like require("./")');
10+
11+
process.env.NODE_PATH = common.fixturesDir + '/module-require/relative';
12+
module._initPaths();
13+
14+
var c = require('.');
15+
16+
assert.equal(c.value, 42, 'require(".") should honor NODE_PATH');
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
var common = require('../common');
22
var assert = require('assert');
33

4-
require(common.fixturesDir + '/require-bin/bin/req.js');
5-
6-
var a = require(common.fixturesDir + '/module-require/relative/dot.js');
7-
var b = require(common.fixturesDir + '/module-require/relative/dot-slash.js');
8-
9-
assert.equal(a.value, 42);
10-
assert.equal(a, b, 'require(".") should resolve like require("./")');
4+
require(common.fixturesDir + '/require-bin/bin/req.js');

0 commit comments

Comments
 (0)