diff --git a/lib/internal/modules/cjs/helpers.js b/lib/internal/modules/cjs/helpers.js index 874805beccd39c..df727ff3c88a45 100644 --- a/lib/internal/modules/cjs/helpers.js +++ b/lib/internal/modules/cjs/helpers.js @@ -11,12 +11,7 @@ function makeRequireFunction(mod) { const Module = mod.constructor; function require(path) { - try { - exports.requireDepth += 1; - return mod.require(path); - } finally { - exports.requireDepth -= 1; - } + return mod.require(path); } function resolve(request, options) { @@ -139,7 +134,6 @@ module.exports = exports = { builtinLibs, makeRequireFunction, normalizeReferrerURL, - requireDepth: 0, stripBOM, stripShebang }; diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index fd592be8ea4c7e..b7ded66157d565 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -37,7 +37,6 @@ const { safeGetenv } = internalBinding('credentials'); const { makeRequireFunction, normalizeReferrerURL, - requireDepth, stripBOM, stripShebang } = require('internal/modules/cjs/helpers'); @@ -85,18 +84,17 @@ const { const isWindows = process.platform === 'win32'; +let requireDepth = 0; +let statCache = new Map(); function stat(filename) { filename = path.toNamespacedPath(filename); - const cache = stat.cache; - if (cache !== null) { - const result = cache.get(filename); - if (result !== undefined) return result; - } - const result = internalModuleStat(filename); - if (cache !== null) cache.set(filename, result); + if (statCache === null) statCache = new Map(); + let result = statCache.get(filename); + if (result !== undefined) return result; + result = internalModuleStat(filename); + statCache.set(filename, result); return result; } -stat.cache = null; function updateChildren(parent, child, scan) { var children = parent && parent.children; @@ -702,7 +700,12 @@ Module.prototype.require = function(id) { throw new ERR_INVALID_ARG_VALUE('id', id, 'must be a non-empty string'); } - return Module._load(id, this, /* isMain */ false); + requireDepth++; + try { + return Module._load(id, this, /* isMain */ false); + } finally { + requireDepth--; + } }; @@ -785,8 +788,6 @@ Module.prototype._compile = function(content, filename) { } var dirname = path.dirname(filename); var require = makeRequireFunction(this); - var depth = requireDepth; - if (depth === 0) stat.cache = new Map(); var result; var exports = this.exports; var thisValue = exports; @@ -798,7 +799,7 @@ Module.prototype._compile = function(content, filename) { result = compiledWrapper.call(thisValue, exports, require, module, filename, dirname); } - if (depth === 0) stat.cache = null; + if (requireDepth === 0) statCache = null; return result; }; diff --git a/test/fixtures/module-require-depth/one.js b/test/fixtures/module-require-depth/one.js deleted file mode 100644 index 02b451465bb76c..00000000000000 --- a/test/fixtures/module-require-depth/one.js +++ /dev/null @@ -1,11 +0,0 @@ -// Flags: --expose_internals -'use strict'; -const assert = require('assert'); -const { - requireDepth -} = require('internal/modules/cjs/helpers'); - -exports.requireDepth = requireDepth; -assert.strictEqual(requireDepth, 1); -assert.deepStrictEqual(require('./two'), { requireDepth: 2 }); -assert.strictEqual(requireDepth, 1); diff --git a/test/fixtures/module-require-depth/two.js b/test/fixtures/module-require-depth/two.js deleted file mode 100644 index 5c94c4c89aa9ef..00000000000000 --- a/test/fixtures/module-require-depth/two.js +++ /dev/null @@ -1,11 +0,0 @@ -// Flags: --expose_internals -'use strict'; -const assert = require('assert'); -const { - requireDepth -} = require('internal/modules/cjs/helpers'); - -exports.requireDepth = requireDepth; -assert.strictEqual(requireDepth, 2); -assert.deepStrictEqual(require('./one'), { requireDepth: 1 }); -assert.strictEqual(requireDepth, 2); diff --git a/test/parallel/test-module-require-depth.js b/test/parallel/test-module-require-depth.js deleted file mode 100644 index 0a3fc2826c71f4..00000000000000 --- a/test/parallel/test-module-require-depth.js +++ /dev/null @@ -1,16 +0,0 @@ -// Flags: --expose_internals -'use strict'; -require('../common'); -const fixtures = require('../common/fixtures'); -const assert = require('assert'); -const { - requireDepth -} = require('internal/modules/cjs/helpers'); - -// Module one loads two too so the expected depth for two is, well, two. -assert.strictEqual(requireDepth, 0); -const one = require(fixtures.path('module-require-depth', 'one')); -const two = require(fixtures.path('module-require-depth', 'two')); -assert.deepStrictEqual(one, { requireDepth: 1 }); -assert.deepStrictEqual(two, { requireDepth: 2 }); -assert.strictEqual(requireDepth, 0);