"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _helperPluginUtils = require("@babel/helper-plugin-utils"); var _helperRemapAsyncToGenerator = require("@babel/helper-remap-async-to-generator"); var _core = require("@babel/core"); var _traverse = require("@babel/traverse"); var _forAwait = require("./for-await.js"); var _default = exports.default = (0, _helperPluginUtils.declare)(api => { api.assertVersion("^7.0.0-0 || >8.0.0-alpha <8.0.0-beta"); const yieldStarVisitor = _traverse.visitors.environmentVisitor({ ArrowFunctionExpression(path) { path.skip(); }, YieldExpression({ node }, state) { if (!node.delegate) return; const asyncIter = _core.types.callExpression(state.addHelper("asyncIterator"), [node.argument]); node.argument = _core.types.callExpression(state.addHelper("asyncGeneratorDelegate"), [asyncIter, state.addHelper("awaitAsyncGenerator")]); } }); const forAwaitVisitor = _traverse.visitors.environmentVisitor({ ArrowFunctionExpression(path) { path.skip(); }, ForOfStatement(path, { file }) { const { node } = path; if (!node.await) return; const build = (0, _forAwait.default)(path, { getAsyncIterator: file.addHelper("asyncIterator") }); const { declar, loop } = build; const block = loop.body; path.ensureBlock(); if (declar) { block.body.push(declar); if (path.node.body.body.length) { block.body.push(_core.types.blockStatement(path.node.body.body)); } } else { block.body.push(...path.node.body.body); } _core.types.inherits(loop, node); _core.types.inherits(loop.body, node.body); const p = build.replaceParent ? path.parentPath : path; p.replaceWithMultiple(build.node); p.scope.parent.crawl(); } }); const visitor = { Function(path, state) { if (!path.node.async) return; path.traverse(forAwaitVisitor, state); if (!path.node.generator) return; path.traverse(yieldStarVisitor, state); path.setData("@babel/plugin-transform-async-generator-functions/async_generator_function", true); (0, _helperRemapAsyncToGenerator.default)(path, { wrapAsync: state.addHelper("wrapAsyncGenerator"), wrapAwait: state.addHelper("awaitAsyncGenerator") }); } }; return { name: "transform-async-generator-functions", manipulateOptions: (_, parser) => parser.plugins.push("asyncGenerators"), visitor: { Program(path, state) { path.traverse(visitor, state); } } }; }); //# sourceMappingURL=index.js.map