index.js 2.7 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 _traverse = require("@babel/traverse");
  10. var _forAwait = require("./for-await.js");
  11. var _default = exports.default = (0, _helperPluginUtils.declare)(api => {
  12. api.assertVersion("^7.0.0-0 || >8.0.0-alpha <8.0.0-beta");
  13. const yieldStarVisitor = _traverse.visitors.environmentVisitor({
  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. });
  25. const forAwaitVisitor = _traverse.visitors.environmentVisitor({
  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. });
  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. path.setData("@babel/plugin-transform-async-generator-functions/async_generator_function", true);
  67. (0, _helperRemapAsyncToGenerator.default)(path, {
  68. wrapAsync: state.addHelper("wrapAsyncGenerator"),
  69. wrapAwait: state.addHelper("awaitAsyncGenerator")
  70. });
  71. }
  72. };
  73. return {
  74. name: "transform-async-generator-functions",
  75. manipulateOptions: (_, parser) => parser.plugins.push("asyncGenerators"),
  76. visitor: {
  77. Program(path, state) {
  78. path.traverse(visitor, state);
  79. }
  80. }
  81. };
  82. });
  83. //# sourceMappingURL=index.js.map