From 685d6e5e00c4dcc5839ff1e20aadfaa727105b34 Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Tue, 7 Apr 2015 16:30:28 +0200 Subject: [PATCH 1/6] module: search NODE_PATH in require('.') --- lib/module.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/module.js b/lib/module.js index 719f8bd50c5716..d65b0c724369df 100644 --- a/lib/module.js +++ b/lib/module.js @@ -205,11 +205,16 @@ Module._resolveLookupPaths = function(request, parent) { } var start = request.substring(0, 2); - if (start !== '.' && start !== './' && start !== '..') { + if (start !== './' && start !== '..') { var paths = modulePaths; if (parent) { if (!parent.paths) parent.paths = []; paths = parent.paths.concat(paths); + // For '.', put PWD at the front of the resolve paths + // TODO(silverwind): Treat '.' exactly the same as './' + if (request === '.') { + paths.splice(0, 0, path.resolve(request)); + } } return [request, paths]; } From 712e75ce495d1abda1cc399fc653cb58f30dc385 Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Tue, 7 Apr 2015 23:32:54 +0200 Subject: [PATCH 2/6] Better module dir detection, add warning --- lib/module.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/module.js b/lib/module.js index d65b0c724369df..dfbf25f99971ea 100644 --- a/lib/module.js +++ b/lib/module.js @@ -169,6 +169,9 @@ Module._findPath = function(request, paths) { } if (filename) { + if (request === '.' && i > 0) { + console.error(`(node) warning: require('.') resolved to ${filename}`); + } Module._pathCache[cacheKey] = filename; return filename; } @@ -210,12 +213,15 @@ Module._resolveLookupPaths = function(request, parent) { if (parent) { if (!parent.paths) parent.paths = []; paths = parent.paths.concat(paths); - // For '.', put PWD at the front of the resolve paths - // TODO(silverwind): Treat '.' exactly the same as './' - if (request === '.') { - paths.splice(0, 0, path.resolve(request)); - } } + + // For '.', put the module's dir at the front of the resolve paths + // TODO(silverwind): Treat '.' exactly the same as './' + if (request === '.') { + paths.splice(0, 0, parent && parent.filename ? + path.dirname(parent.filename) : path.resolve(request)); + } + return [request, paths]; } From 9a2e88513cedcfefe30f8222a32a40cf3b9986d0 Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Sat, 11 Apr 2015 17:18:09 +0200 Subject: [PATCH 3/6] Warn once through util.deprecate, refactor --- lib/module.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/module.js b/lib/module.js index dfbf25f99971ea..6ffb6088940429 100644 --- a/lib/module.js +++ b/lib/module.js @@ -125,6 +125,11 @@ function tryExtensions(p, exts) { } +const noopDeprecateRequireDot = util.deprecate(function() {}, + `warning: require('.') did resolve outside the package directory. ` + + `This functionality will be deprecated soon.`); + + Module._findPath = function(request, paths) { var exts = Object.keys(Module._extensions); @@ -169,9 +174,8 @@ Module._findPath = function(request, paths) { } if (filename) { - if (request === '.' && i > 0) { - console.error(`(node) warning: require('.') resolved to ${filename}`); - } + // Warn once if '.' resolved outside the module dir + if (request === '.' && i > 0) noopDeprecateRequireDot(); Module._pathCache[cacheKey] = filename; return filename; } @@ -215,11 +219,14 @@ Module._resolveLookupPaths = function(request, parent) { paths = parent.paths.concat(paths); } - // For '.', put the module's dir at the front of the resolve paths - // TODO(silverwind): Treat '.' exactly the same as './' + // Maintain backwards compat with certain broken uses of require('.') + // by putting the module's directory in front of the lookup paths. if (request === '.') { - paths.splice(0, 0, parent && parent.filename ? - path.dirname(parent.filename) : path.resolve(request)); + if (parent && parent.filename) { + paths.splice(0, 0, path.dirname(parent.filename)); + } else { + paths.splice(0, 0, path.resolve(request)); + } } return [request, paths]; From affc1f5e9d978c862e99537c41d48668a28dabb2 Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Thu, 16 Apr 2015 18:41:31 +0200 Subject: [PATCH 4/6] Move dot tests to own file --- test/parallel/test-require-dot.js | 15 +++++++++++++++ test/parallel/test-require-extensions-main.js | 8 +------- 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 test/parallel/test-require-dot.js diff --git a/test/parallel/test-require-dot.js b/test/parallel/test-require-dot.js new file mode 100644 index 00000000000000..0df284db7bca1b --- /dev/null +++ b/test/parallel/test-require-dot.js @@ -0,0 +1,15 @@ +var common = require('../common'); +var assert = require('assert'); + +var a = require(common.fixturesDir + '/module-require/relative/dot.js'); +var b = require(common.fixturesDir + '/module-require/relative/dot-slash.js'); + +assert.equal(a.value, 42); +assert.equal(a, b, 'require(".") should resolve like require("./")'); + +process.env.NODE_PATH = common.fixturesDir + '/module-require/relative'; +module._initPaths(); + +var c = require('.'); + +assert.equal(c, 42, 'require(".") should honor NODE_PATH'); \ No newline at end of file diff --git a/test/parallel/test-require-extensions-main.js b/test/parallel/test-require-extensions-main.js index 2a102afc950f77..06d28ab30bddcf 100644 --- a/test/parallel/test-require-extensions-main.js +++ b/test/parallel/test-require-extensions-main.js @@ -1,10 +1,4 @@ var common = require('../common'); var assert = require('assert'); -require(common.fixturesDir + '/require-bin/bin/req.js'); - -var a = require(common.fixturesDir + '/module-require/relative/dot.js'); -var b = require(common.fixturesDir + '/module-require/relative/dot-slash.js'); - -assert.equal(a.value, 42); -assert.equal(a, b, 'require(".") should resolve like require("./")'); +require(common.fixturesDir + '/require-bin/bin/req.js'); \ No newline at end of file From 5e842104515dc1d560f14c1931e6aeccc2a5fa2a Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Thu, 16 Apr 2015 19:50:52 +0200 Subject: [PATCH 5/6] Fix test and nits --- lib/module.js | 4 ++-- test/parallel/test-require-dot.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/module.js b/lib/module.js index 6ffb6088940429..d5e196e01f7ee8 100644 --- a/lib/module.js +++ b/lib/module.js @@ -126,8 +126,8 @@ function tryExtensions(p, exts) { const noopDeprecateRequireDot = util.deprecate(function() {}, - `warning: require('.') did resolve outside the package directory. ` + - `This functionality will be deprecated soon.`); + "warning: require('.') resolved outside the package directory. " + + "This functionality will be deprecated soon."); Module._findPath = function(request, paths) { diff --git a/test/parallel/test-require-dot.js b/test/parallel/test-require-dot.js index 0df284db7bca1b..2551d88d2204e8 100644 --- a/test/parallel/test-require-dot.js +++ b/test/parallel/test-require-dot.js @@ -1,5 +1,6 @@ var common = require('../common'); var assert = require('assert'); +var module = require('module'); var a = require(common.fixturesDir + '/module-require/relative/dot.js'); var b = require(common.fixturesDir + '/module-require/relative/dot-slash.js'); @@ -12,4 +13,4 @@ module._initPaths(); var c = require('.'); -assert.equal(c, 42, 'require(".") should honor NODE_PATH'); \ No newline at end of file +assert.equal(c.value, 42, 'require(".") should honor NODE_PATH'); \ No newline at end of file From 7a73480366c729a0ede04063b90a93acbce30609 Mon Sep 17 00:00:00 2001 From: Roman Reiss Date: Thu, 16 Apr 2015 23:02:06 +0200 Subject: [PATCH 6/6] Fix deprecation message --- lib/module.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/module.js b/lib/module.js index d5e196e01f7ee8..a89f544e51f619 100644 --- a/lib/module.js +++ b/lib/module.js @@ -127,7 +127,7 @@ function tryExtensions(p, exts) { const noopDeprecateRequireDot = util.deprecate(function() {}, "warning: require('.') resolved outside the package directory. " + - "This functionality will be deprecated soon."); + "This functionality is deprecated and will be removed soon."); Module._findPath = function(request, paths) {