index.js 2.7 KB

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