UNPKG

@vue-jsx-vapor/babel

Version:
72 lines (70 loc) 2.69 kB
import { isConditionalExpression, isJSXElement } from "./utils-CInUWtxo.js"; import { transformJSX } from "./transform-D6irx7cE.js"; import { parse } from "@babel/parser"; import _SyntaxJSX from "@babel/plugin-syntax-jsx"; //#region src/index.ts const SyntaxJSX = _SyntaxJSX.default || _SyntaxJSX; var src_default = () => { return { name: "Vue JSX Vapor", inherits: SyntaxJSX, visitor: { JSXElement: transformJSX, JSXFragment: transformJSX, Program: { enter: (path, state) => { state.importSet = /* @__PURE__ */ new Set(); state.delegateEventSet = /* @__PURE__ */ new Set(); state.templates = []; state.roots = []; const collectRoot = (path$1) => { if (!isJSXElement(path$1.parent) && !isConditionalExpression(path$1.parentPath)) state.roots.push({ node: path$1.node, source: path$1.getSource(), inVaporComponent: !state.opts.interop ? true : path$1.findParent(({ node }) => node.type === "CallExpression" && node.callee.type === "Identifier" && ["defineVaporComponent", "defineComponent"].includes(node.callee.name))?.node.callee.name === "defineVaporComponent" }); }; path.traverse({ JSXElement: collectRoot, JSXFragment: collectRoot }); }, exit: (path, state) => { const { delegateEventSet, importSet, templates } = state; const statements = []; if (delegateEventSet.size) statements.unshift(`_delegateEvents("${Array.from(delegateEventSet).join("\", \"")}");`); if (templates.length) { let preambleResult = "const "; const definedTemplates = {}; templates.forEach((template, index) => { preambleResult += `t${index} = ${definedTemplates[template] || template}${templates.length - 1 === index ? ";" : ","}\n`; definedTemplates[template] = `t${index}`; }); statements.unshift(preambleResult); } const helpers = [ "setNodes", "createNodes", "createComponent", "createComponentWithFallback" ].filter((helper) => { const result = importSet.has(helper); result && importSet.delete(helper); return result; }); if (helpers.length) statements.unshift(`import { ${helpers.map((i) => `${i} as _${i}`).join(", ")} } from 'vue-jsx-vapor';\n`); if (importSet.size) { const importResult = Array.from(importSet).map((i) => `${i} as _${i}`).join(", "); statements.unshift(`import { ${importResult} } from 'vue';\n`); } path.node.body.unshift(...parse(statements.join("\n"), { sourceType: "module", plugins: ["typescript"] }).program.body); } } } }; }; //#endregion export { src_default as default };