Improve code quality and write tests
This commit is contained in:
+133
@@ -0,0 +1,133 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
|
||||
function _helperPluginUtils() {
|
||||
const data = require("@babel/helper-plugin-utils");
|
||||
|
||||
_helperPluginUtils = function () {
|
||||
return data;
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function _helperRemapAsyncToGenerator() {
|
||||
const data = _interopRequireDefault(require("@babel/helper-remap-async-to-generator"));
|
||||
|
||||
_helperRemapAsyncToGenerator = function () {
|
||||
return data;
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function _pluginSyntaxAsyncGenerators() {
|
||||
const data = _interopRequireDefault(require("@babel/plugin-syntax-async-generators"));
|
||||
|
||||
_pluginSyntaxAsyncGenerators = function () {
|
||||
return data;
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function _core() {
|
||||
const data = require("@babel/core");
|
||||
|
||||
_core = function () {
|
||||
return data;
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
var _forAwait = _interopRequireDefault(require("./for-await"));
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
var _default = (0, _helperPluginUtils().declare)(api => {
|
||||
api.assertVersion(7);
|
||||
const yieldStarVisitor = {
|
||||
Function(path) {
|
||||
path.skip();
|
||||
},
|
||||
|
||||
YieldExpression({
|
||||
node
|
||||
}, state) {
|
||||
if (!node.delegate) return;
|
||||
const callee = state.addHelper("asyncGeneratorDelegate");
|
||||
node.argument = _core().types.callExpression(callee, [_core().types.callExpression(state.addHelper("asyncIterator"), [node.argument]), state.addHelper("awaitAsyncGenerator")]);
|
||||
}
|
||||
|
||||
};
|
||||
const forAwaitVisitor = {
|
||||
Function(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);
|
||||
}
|
||||
|
||||
block.body = block.body.concat(node.body.body);
|
||||
|
||||
_core().types.inherits(loop, node);
|
||||
|
||||
_core().types.inherits(loop.body, node.body);
|
||||
|
||||
if (build.replaceParent) {
|
||||
path.parentPath.replaceWithMultiple(build.node);
|
||||
} else {
|
||||
path.replaceWithMultiple(build.node);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
const visitor = {
|
||||
Function(path, state) {
|
||||
if (!path.node.async) return;
|
||||
path.traverse(forAwaitVisitor, state);
|
||||
if (!path.node.generator) return;
|
||||
path.traverse(yieldStarVisitor, state);
|
||||
(0, _helperRemapAsyncToGenerator().default)(path, {
|
||||
wrapAsync: state.addHelper("wrapAsyncGenerator"),
|
||||
wrapAwait: state.addHelper("awaitAsyncGenerator")
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
return {
|
||||
name: "proposal-async-generator-functions",
|
||||
inherits: _pluginSyntaxAsyncGenerators().default,
|
||||
visitor: {
|
||||
Program(path, state) {
|
||||
path.traverse(visitor, state);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
exports.default = _default;
|
||||
Reference in New Issue
Block a user