Standalone util function from Node.js core to process await statements in REPL.
Since v10.0.0, Node.js introduced a new experimental feature to support await
keyword in the REPL by using the argument --experimental-repl-await
, however,
if a user wants to implement a custom REPL console, there would be no
await-support at all, to achieve such a goal, this package clones the internal
module of await-support to form a standalone version, allowing users share the
benefits of await-support in their own REPL environments.
See Node.js docs for more details, and contribute to the original source.
const repl = require("repl");
const vm = require("vm");
const { processTopLevelAwait } = require("node-repl-await");
function isRecoverableError(error) {
if (error.name === 'SyntaxError') {
return /^(Unexpected end of input|Unexpected token)/.test(error.message);
}
return false;
}
async function myEval(code, context, filename, callback) {
code = processTopLevelAwait(code) || code;
try {
let result = await vm.runInNewContext(code, context);
callback(null, result);
} catch (e) {
if (isRecoverableError(e)) {
callback(new repl.Recoverable(e));
} else {
console.log(e);
}
}
}
repl.start({ prompt: '> ', eval: myEval });
function processTopLevelAwait(src: string): string | void
Tries to wrap the given source code to an immediately-invoked function if it
contains any top level await
statement in the form of
(async () => { /* source code */ })()
If no await
presents or processing failed, the function returns null
.