packages/babel-plugin-proposal-pipeline-operator/src/smartVisitor.js
import { types as t } from "@babel/core";
const updateTopicReferenceVisitor = {
PipelinePrimaryTopicReference(path) {
path.replaceWith(this.topicId);
},
PipelineTopicExpression(path) {
path.skip();
},
};
const smartVisitor = {
BinaryExpression(path) {
const { scope } = path;
const { node } = path;
const { operator, left, right } = node;
if (operator !== "|>") return;
const placeholder = scope.generateUidIdentifierBasedOnNode(left);
scope.push({ id: placeholder });
let call;
if (t.isPipelineTopicExpression(right)) {
path
.get("right")
.traverse(updateTopicReferenceVisitor, { topicId: placeholder });
call = right.expression;
} else {
// PipelineBareFunction
let callee = right.callee;
if (t.isIdentifier(callee, { name: "eval" })) {
callee = t.sequenceExpression([t.numericLiteral(0), callee]);
}
call = t.callExpression(callee, [t.cloneNode(placeholder)]);
}
path.replaceWith(
t.sequenceExpression([
t.assignmentExpression("=", t.cloneNode(placeholder), left),
call,
]),
);
},
};
export default smartVisitor;