@vue-jsx-vapor/babel
Version:
Vue JSX Vapor Babel Plugin
72 lines (70 loc) • 2.69 kB
JavaScript
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 };