"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.genElementProps = exports.genNode = exports.generate = void 0; const shared_1 = require("@vue/shared"); const uni_shared_1 = require("@dcloudio/uni-shared"); const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared"); const compiler_core_1 = require("@vue/compiler-core"); const codegen_1 = require("../codegen"); const vFor_1 = require("../transforms/vFor"); const vIf_1 = require("../transforms/vIf"); const vSlot_1 = require("../transforms/vSlot"); const utils_1 = require("../transforms/utils"); function generate({ children }, { slot, event, scopeId, emitFile, filename, directive, lazyElement, isBuiltInComponent, isMiniProgramComponent, component, }) { const context = { slot, event, code: '', scopeId, directive, lazyElement, component, isBuiltInComponent, isMiniProgramComponent, push(code) { context.code += code; }, }; children.forEach((node) => { genNode(node, context); }); emitFile({ type: 'asset', fileName: filename, source: context.code }); } exports.generate = generate; function genNode(node, context) { switch (node.type) { case 9 /* NodeTypes.IF */: return node.branches.forEach((node) => { genNode(node, context); }); case 2 /* NodeTypes.TEXT */: return genText(node, context); case 5 /* NodeTypes.INTERPOLATION */: return genExpression(node.content, context); case 1 /* NodeTypes.ELEMENT */: if (node.tagType === 2 /* ElementTypes.SLOT */) { return genSlot(node, context); } else if (node.tagType === 1 /* ElementTypes.COMPONENT */) { return genComponent(node, context); } else if (node.tagType === 3 /* ElementTypes.TEMPLATE */) { return genTemplate(node, context); } else if (isLazyElement(node, context)) { return genLazyElement(node, context); } return genElement(node, context); } } exports.genNode = genNode; function genText(node, { push }) { push(node.content); } function genExpression(node, { push }) { push(`{{${(0, codegen_1.genExpr)(node)}}}`); } function genVIf(exp, { push, directive }) { push(` ${directive}if="{{${exp}}}"`); } function genVElseIf(exp, { push, directive }) { push(` ${directive}elif="{{${exp}}}"`); } function genVElse({ push, directive }) { push(` ${directive}else`); } function genVFor(node, { push, directive }) { const { sourceCode, valueAlias, indexAlias } = node.vFor; push(` ${directive}for="${sourceCode}"`); if (valueAlias) { push(` ${directive}for-item="${valueAlias}"`); } if (valueAlias === 'index') { push(` ${directive}for-index="${indexAlias}"`); } const keyProp = (0, compiler_core_1.findProp)(node, 'key', true); if (keyProp) { const key = keyProp.exp.content; push(` ${directive}key="${key.includes('.') ? key.split('.')[1] : key}"`); node.props.splice(node.props.indexOf(keyProp), 1); } } function genSlot(node, context) { // 移除掉所有非name属性,即移除作用域插槽的绑定指令 node.props = node.props.filter((prop) => { if (prop.type === 6 /* NodeTypes.ATTRIBUTE */) { return prop.name === 'name'; } else if (prop.arg?.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) { return prop.arg.content === 'name'; } }); if (!node.children.length || context.slot.fallbackContent) { // 无后备内容或支持后备内容 return genElement(node, context); } const { push } = context; const isVIfSlot = (0, vIf_1.isIfElementNode)(node); if (isVIfSlot) { push(``); delete node.vIf; } const children = node.children.slice(); node.children.length = 0; push(``); genElement(node, context); push(``); push(``); children.forEach((node) => { genNode(node, context); }); push(``); if (isVIfSlot) { push(``); } } function genTemplate(node, context) { const slotProp = node.props.find((prop) => prop.type === 7 /* NodeTypes.DIRECTIVE */ && (prop.name === 'slot' || (prop.name === 'bind' && prop.arg?.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && prop.arg.content === 'slot'))); // 为 bind 时,通常是作用域插槽生成的 vSlot.ts:197 createBindDirectiveNode('slot',...) if (slotProp && (slotProp.name === 'bind' || (0, vSlot_1.findSlotName)(slotProp))) { /** * 仅百度、字节支持使用 block 作为命名插槽根节点 * 此处为了统一仅默认替换为view *