import { JSXSpreadAttribute, objectProperty, ObjectProperty, identifier, Expression, SpreadElement, spreadElement, objectExpression, booleanLiteral, } from "@babel/types"; import { transformJSXElement } from "./transformJSXElement"; import { transformJSXFragment } from "./transformJSXFragment"; import Template from "../template"; import { TransformJSXChildrenOptions } from "../types"; import { anchorIdentifier, targetIdentifier } from "../constants"; import { isEvent } from "@velto/shared"; export function transformJSXComponentProps({ path, template, }: TransformJSXChildrenOptions) { const properties: (ObjectProperty | SpreadElement)[] = []; path.forEach((attribute) => { // JSXAttribute if (attribute.isJSXAttribute()) { const nameLiteral = attribute.get("name").getSource(); const value = attribute.get("value"); // JSXFragment
>
if (value.isJSXFragment()) { const subRender = new Template(template.helper); transformJSXFragment({ path: value, template: subRender, target: targetIdentifier, anchor: anchorIdentifier, }); properties.push( objectProperty(identifier(nameLiteral), subRender.generate()) ); // JSXElement
> } else if (value.isJSXElement()) { const subRender = new Template(template.helper); transformJSXElement({ path: value, template: subRender, target: targetIdentifier, anchor: anchorIdentifier, }); properties.push( objectProperty(identifier(nameLiteral), subRender.generate()) ); // JSXExpressionContainer // {expression} } else if (value.isJSXExpressionContainer()) { const expression = value.get("expression"); if (isEvent(nameLiteral) && (expression.isFunctionExpression() || expression.isArrowFunctionExpression())) { const eventName = template.hoistHandle(expression.node); properties.push( objectProperty( identifier(nameLiteral), eventName, ) ); // JSXFragment
>
} else if (expression.isJSXFragment()) { const subRender = new Template(template.helper); transformJSXFragment({ path: expression, template: subRender, target: targetIdentifier, anchor: anchorIdentifier, }); properties.push( objectProperty(identifier(nameLiteral), subRender.generate()) ); // JSXElement
> } else if (expression.isJSXElement()) { const subRender = new Template(template.helper); transformJSXElement({ path: expression, template: subRender, target: targetIdentifier, anchor: anchorIdentifier, }); properties.push( objectProperty(identifier(nameLiteral), subRender.generate()) ); } else { properties.push( objectProperty( identifier(nameLiteral), expression.node as Expression ) ); } } else if (!value.type) { properties.push( objectProperty(identifier(nameLiteral), booleanLiteral(true)) ); } else if (value) { properties.push( objectProperty(identifier(nameLiteral), value.node as Expression) ); } // JSXSpreadAttribute } else { properties.push( spreadElement((attribute.node as JSXSpreadAttribute).argument) ); } }); return objectExpression(properties); }