code: function wrapExpressionFromAst(ast: Object): string {
    // Transform let and var declarations into assignments, and get back an array
    // of variable declarations.
    let { newAst, declarations } = translateDeclarationsIntoAssignment(ast);
    const body = addReturnNode(newAst);
  
    // Create the async iife.
    newAst = t.expressionStatement(
      t.callExpression(
        t.arrowFunctionExpression([], t.blockStatement(body), true),
        []
      )
    );
  
    // Now let's put all the variable declarations at the top of the async iife.
    newAst = addTopDeclarationNodes(newAst, declarations);
  
    return generate(newAst).code;
  }
docs: Given an AST, wrap its body in an async iife, transform variable declarations
  in assignments and move the variable declarations outside of the async iife.
  Example: With the AST for the following expression: `let a = await 123`, the
  function will return:
  let a;
  (async => {
  return a = await 123;
  })();