diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 5b0a1cf3f57a8f..0e832db8f291b6 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -86,14 +86,15 @@ const { const isWindows = process.platform === 'win32'; let requireDepth = 0; -let statCache = new Map(); +let statCache = null; function stat(filename) { filename = path.toNamespacedPath(filename); - if (statCache === null) statCache = new Map(); - let result = statCache.get(filename); - if (result !== undefined) return result; - result = internalModuleStat(filename); - statCache.set(filename, result); + if (statCache !== null) { + const result = statCache.get(filename); + if (result !== undefined) return result; + } + const result = internalModuleStat(filename); + if (statCache !== null) statCache.set(filename, result); return result; } @@ -196,7 +197,7 @@ Module._debug = deprecate(debug, 'Module._debug is deprecated.', 'DEP0077'); // -> a. // -> a/index. -// check if the directory is a package.json dir +// Check if the directory is a package.json dir. const packageMainCache = Object.create(null); function readPackage(requestPath) { @@ -830,6 +831,7 @@ Module.prototype._compile = function(content, filename) { const exports = this.exports; const thisValue = exports; const module = this; + if (requireDepth === 0) statCache = new Map(); if (inspectorWrapper) { result = inspectorWrapper(compiledWrapper, thisValue, exports, require, module, filename, dirname); diff --git a/test/parallel/test-repl-require-after-write.js b/test/parallel/test-repl-require-after-write.js new file mode 100644 index 00000000000000..e4d9b2f5a024dc --- /dev/null +++ b/test/parallel/test-repl-require-after-write.js @@ -0,0 +1,25 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const spawn = require('child_process').spawn; +// Use -i to force node into interactive mode, despite stdout not being a TTY +const child = spawn(process.execPath, ['-i']); + +let out = ''; +const input = "try { require('./non-existent.json'); } catch {} " + + "require('fs').writeFileSync('./non-existent.json', '1');" + + "require('./non-existent.json');"; + +child.stderr.on('data', common.mustNotCall()); + +child.stdout.setEncoding('utf8'); +child.stdout.on('data', (c) => { + out += c; +}); +child.stdout.on('end', common.mustCall(() => { + assert.strictEqual(out, '> 1\n> '); +})); + +child.stdin.end(input);