index.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperPluginUtils = require("@babel/helper-plugin-utils");
  7. var _helperRemapAsyncToGenerator = require("@babel/helper-remap-async-to-generator");
  8. var _core = require("@babel/core");
  9. var _forAwait = require("./for-await.js");
  10. var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor");
  11. var _default = (0, _helperPluginUtils.declare)(api => {
  12. api.assertVersion(7);
  13. const yieldStarVisitor = _core.traverse.visitors.merge([{
  14. ArrowFunctionExpression(path) {
  15. path.skip();
  16. },
  17. YieldExpression({
  18. node
  19. }, state) {
  20. if (!node.delegate) return;
  21. const asyncIter = _core.types.callExpression(state.addHelper("asyncIterator"), [node.argument]);
  22. node.argument = _core.types.callExpression(state.addHelper("asyncGeneratorDelegate"), [asyncIter, state.addHelper("awaitAsyncGenerator")]);
  23. }
  24. }, _helperEnvironmentVisitor.default]);
  25. const forAwaitVisitor = _core.traverse.visitors.merge([{
  26. ArrowFunctionExpression(path) {
  27. path.skip();
  28. },
  29. ForOfStatement(path, {
  30. file
  31. }) {
  32. const {
  33. node
  34. } = path;
  35. if (!node.await) return;
  36. const build = (0, _forAwait.default)(path, {
  37. getAsyncIterator: file.addHelper("asyncIterator")
  38. });
  39. const {
  40. declar,
  41. loop
  42. } = build;
  43. const block = loop.body;
  44. path.ensureBlock();
  45. if (declar) {
  46. block.body.push(declar);
  47. if (path.node.body.body.length) {
  48. block.body.push(_core.types.blockStatement(path.node.body.body));
  49. }
  50. } else {
  51. block.body.push(...path.node.body.body);
  52. }
  53. _core.types.inherits(loop, node);
  54. _core.types.inherits(loop.body, node.body);
  55. const p = build.replaceParent ? path.parentPath : path;
  56. p.replaceWithMultiple(build.node);
  57. p.scope.parent.crawl();
  58. }
  59. }, _helperEnvironmentVisitor.default]);
  60. const visitor = {
  61. Function(path, state) {
  62. if (!path.node.async) return;
  63. path.traverse(forAwaitVisitor, state);
  64. if (!path.node.generator) return;
  65. path.traverse(yieldStarVisitor, state);
  66. (0, _helperRemapAsyncToGenerator.default)(path, {
  67. wrapAsync: state.addHelper("wrapAsyncGenerator"),
  68. wrapAwait: state.addHelper("awaitAsyncGenerator")
  69. });
  70. }
  71. };
  72. return {
  73. name: "transform-async-generator-functions",
  74. inherits: require("@babel/plugin-syntax-async-generators").default,
  75. visitor: {
  76. Program(path, state) {
  77. path.traverse(visitor, state);
  78. }
  79. }
  80. };
  81. });
  82. exports.default = _default;
  83. //# sourceMappingURL=index.js.map