Node repl with async await
Asked Answered
G

3

45

I would like to add support to async/await to node repl

Following this issue: https://github.com/nodejs/node/issues/8382

I've tried to use this one https://github.com/paulserraino/babel-repl but it is missing async await suppport

I would like to use this snippet

const awaitMatcher = /^(?:\s*(?:(?:let|var|const)\s)?\s*([^=]+)=\s*|^\s*)(await\s[\s\S]*)/;
const asyncWrapper = (code, binder) => {
  let assign = binder ? `root.${binder} = ` : '';
  return `(function(){ async function _wrap() { return ${assign}${code} } return _wrap();})()`;
};

// match & transform
const match = input.match(awaitMatcher);
if(match) {
  input = `${asyncWrapper(match[2], match[1])}`;
}

How can I add this snippet to a custom eval on node repl?

Example in node repl:

> const user = await User.findOne();
Grissom answered 5/1, 2017 at 12:22 Comment(5)
What about using ordinary Node 7 REPL with --harmony?Landel
node --harmony-async-await on Node 7 REPL do not workGrissom
Well, it should. I would suggest to check Node version. Obviously, await should be inside async function.Landel
Are you asking how to write a patch that solves github.com/nodejs/node/issues/13209?Illyricum
See also #44170042Illyricum
M
88

As of node ^10, you can use the following flag when starting the repl:

node --experimental-repl-await
$ await myPromise()
Manta answered 26/10, 2018 at 14:47 Comment(2)
Working great in node 10 and 12, and can be set in bashrc/zshrc with export NODE_OPTIONS="--experimental-repl-await" (so you always have it while debugging).Ulster
Starting with node v16.6.0 (Jul 29, 2021. changelog & commit a082a705b), async-await in repl is enabled by default. You can opt out by passing --no-experimental-repl-await .Layla
N
8

There is the project https://github.com/ef4/async-repl:

$ async-repl
async> 1 + 2
3
async> 1 + await new Promise(r => setTimeout(() => r(2), 1000))
3
async> let x = 1 + await new Promise(r => setTimeout(() => r(2), 1000))
undefined
async> x
3
async>

Another option, slightly onerous to start but with a great UI, is to use the Chrome Devtools:

$ node --inspect -r esm
Debugger listening on ws://127.0.0.1:9229/b4fb341e-da9d-4276-986a-46bb81bdd989
For help see https://nodejs.org/en/docs/inspector
> Debugger attached.

(I am using the esm package here to allow Node to parse import statements.)

Then you go to chrome://inspect in Chrome and you will be able to connect to the node instance. Chrome Devtools has top-level await, great tab-completion etc.

Nail answered 17/3, 2018 at 19:6 Comment(1)
it's possible to see a demo?.Joellenjoelly
G
2

The idea is to preprocess the command and wrap it in a async function if there is an await syntax outside async function

this https://gist.github.com/princejwesley/a66d514d86ea174270210561c44b71ba is the final solution

Grissom answered 6/1, 2017 at 9:42 Comment(1)
Should we expect a promise or the result? The REPL does not hang until it gets the result you need to pause and resume it somehow, but afaik. that is not supported, at least repl.pause() exited by me. Another issue here: github.com/nodejs/node/issues/13209Refractory

© 2022 - 2024 — McMap. All rights reserved.