for-await.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = _default;
  6. function _core() {
  7. const data = require("@babel/core");
  8. _core = function () {
  9. return data;
  10. };
  11. return data;
  12. }
  13. const buildForAwait = (0, _core().template)(`
  14. async function wrapper() {
  15. var ITERATOR_COMPLETION = true;
  16. var ITERATOR_HAD_ERROR_KEY = false;
  17. var ITERATOR_ERROR_KEY;
  18. try {
  19. for (
  20. var ITERATOR_KEY = GET_ITERATOR(OBJECT), STEP_KEY, STEP_VALUE;
  21. (
  22. STEP_KEY = await ITERATOR_KEY.next(),
  23. ITERATOR_COMPLETION = STEP_KEY.done,
  24. STEP_VALUE = await STEP_KEY.value,
  25. !ITERATOR_COMPLETION
  26. );
  27. ITERATOR_COMPLETION = true) {
  28. }
  29. } catch (err) {
  30. ITERATOR_HAD_ERROR_KEY = true;
  31. ITERATOR_ERROR_KEY = err;
  32. } finally {
  33. try {
  34. if (!ITERATOR_COMPLETION && ITERATOR_KEY.return != null) {
  35. await ITERATOR_KEY.return();
  36. }
  37. } finally {
  38. if (ITERATOR_HAD_ERROR_KEY) {
  39. throw ITERATOR_ERROR_KEY;
  40. }
  41. }
  42. }
  43. }
  44. `);
  45. function _default(path, {
  46. getAsyncIterator
  47. }) {
  48. const {
  49. node,
  50. scope,
  51. parent
  52. } = path;
  53. const stepKey = scope.generateUidIdentifier("step");
  54. const stepValue = scope.generateUidIdentifier("value");
  55. const left = node.left;
  56. let declar;
  57. if (_core().types.isIdentifier(left) || _core().types.isPattern(left) || _core().types.isMemberExpression(left)) {
  58. declar = _core().types.expressionStatement(_core().types.assignmentExpression("=", left, stepValue));
  59. } else if (_core().types.isVariableDeclaration(left)) {
  60. declar = _core().types.variableDeclaration(left.kind, [_core().types.variableDeclarator(left.declarations[0].id, stepValue)]);
  61. }
  62. let template = buildForAwait({
  63. ITERATOR_HAD_ERROR_KEY: scope.generateUidIdentifier("didIteratorError"),
  64. ITERATOR_COMPLETION: scope.generateUidIdentifier("iteratorNormalCompletion"),
  65. ITERATOR_ERROR_KEY: scope.generateUidIdentifier("iteratorError"),
  66. ITERATOR_KEY: scope.generateUidIdentifier("iterator"),
  67. GET_ITERATOR: getAsyncIterator,
  68. OBJECT: node.right,
  69. STEP_VALUE: stepValue,
  70. STEP_KEY: stepKey
  71. });
  72. template = template.body.body;
  73. const isLabeledParent = _core().types.isLabeledStatement(parent);
  74. const tryBody = template[3].block.body;
  75. const loop = tryBody[0];
  76. if (isLabeledParent) {
  77. tryBody[0] = _core().types.labeledStatement(parent.label, loop);
  78. }
  79. return {
  80. replaceParent: isLabeledParent,
  81. node: template,
  82. declar,
  83. loop
  84. };
  85. }