Skip to content

Commit

Permalink
module: fix repl require calling the same file again
Browse files Browse the repository at this point in the history
This makes sure multiple require calls will not fail in case a file
was created after the first attempt.

PR-URL: nodejs#26928
Fixes: nodejs#26926
Reviewed-By: Guy Bedford <[email protected]>
Reviewed-By: Jan Krems <[email protected]>
  • Loading branch information
BridgeAR committed Apr 3, 2019
1 parent 1087805 commit 8a6dcd0
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 7 deletions.
16 changes: 9 additions & 7 deletions lib/internal/modules/cjs/loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,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;
}

Expand Down Expand Up @@ -188,7 +189,7 @@ Module._debug = deprecate(debug, 'Module._debug is deprecated.', 'DEP0077');
// -> a.<ext>
// -> a/index.<ext>

// 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) {
Expand Down Expand Up @@ -794,6 +795,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);
Expand Down
25 changes: 25 additions & 0 deletions test/parallel/test-repl-require-after-write.js
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 8a6dcd0

Please sign in to comment.