diff --git a/lib/repl.js b/lib/repl.js index 60ea4457ab1bf6..5a5b4acdd5e860 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -250,7 +250,12 @@ writer.options = { ...inspect.defaultOptions, showProxy: true }; // Converts static import statement to dynamic import statement const toDynamicImport = (codeLine) => { let dynamicImportStatement = ''; - const ast = acornParse(codeLine, { __proto__: null, sourceType: 'module', ecmaVersion: 'latest' }); + let ast; + try { + ast = acornParse(codeLine, { __proto__: null, sourceType: 'module', ecmaVersion: 'latest' }); + } catch { + return codeLine; + } acornWalk.ancestor(ast, { ImportDeclaration(node) { const awaitDynamicImport = `await import(${JSONStringify(node.source.value)});`; diff --git a/test/parallel/test-repl-import-incomplete-crash.js b/test/parallel/test-repl-import-incomplete-crash.js new file mode 100644 index 00000000000000..0959a0cef5c34d --- /dev/null +++ b/test/parallel/test-repl-import-incomplete-crash.js @@ -0,0 +1,10 @@ +'use strict'; +require('../common'); +const repl = require('repl'); + +// Regression test for https://github.com/nodejs/node/issues/63551: +// Typing a bare `import` keyword in the REPL must not crash the process. +const replserver = new repl.REPLServer(); + +replserver.emit('line', 'import'); +replserver.emit('line', '.exit');