12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394 |
- /**
- * @vue/compiler-ssr v3.5.12
- * (c) 2018-present Yuxi (Evan) You and Vue contributors
- * @license MIT
- **/
- 'use strict';
- Object.defineProperty(exports, '__esModule', { value: true });
- var compilerDom = require('@vue/compiler-dom');
- var shared = require('@vue/shared');
- const SSR_INTERPOLATE = Symbol(`ssrInterpolate`);
- const SSR_RENDER_VNODE = Symbol(`ssrRenderVNode`);
- const SSR_RENDER_COMPONENT = Symbol(`ssrRenderComponent`);
- const SSR_RENDER_SLOT = Symbol(`ssrRenderSlot`);
- const SSR_RENDER_SLOT_INNER = Symbol(`ssrRenderSlotInner`);
- const SSR_RENDER_CLASS = Symbol(`ssrRenderClass`);
- const SSR_RENDER_STYLE = Symbol(`ssrRenderStyle`);
- const SSR_RENDER_ATTRS = Symbol(`ssrRenderAttrs`);
- const SSR_RENDER_ATTR = Symbol(`ssrRenderAttr`);
- const SSR_RENDER_DYNAMIC_ATTR = Symbol(`ssrRenderDynamicAttr`);
- const SSR_RENDER_LIST = Symbol(`ssrRenderList`);
- const SSR_INCLUDE_BOOLEAN_ATTR = Symbol(
- `ssrIncludeBooleanAttr`
- );
- const SSR_LOOSE_EQUAL = Symbol(`ssrLooseEqual`);
- const SSR_LOOSE_CONTAIN = Symbol(`ssrLooseContain`);
- const SSR_RENDER_DYNAMIC_MODEL = Symbol(
- `ssrRenderDynamicModel`
- );
- const SSR_GET_DYNAMIC_MODEL_PROPS = Symbol(
- `ssrGetDynamicModelProps`
- );
- const SSR_RENDER_TELEPORT = Symbol(`ssrRenderTeleport`);
- const SSR_RENDER_SUSPENSE = Symbol(`ssrRenderSuspense`);
- const SSR_GET_DIRECTIVE_PROPS = Symbol(`ssrGetDirectiveProps`);
- const ssrHelpers = {
- [SSR_INTERPOLATE]: `ssrInterpolate`,
- [SSR_RENDER_VNODE]: `ssrRenderVNode`,
- [SSR_RENDER_COMPONENT]: `ssrRenderComponent`,
- [SSR_RENDER_SLOT]: `ssrRenderSlot`,
- [SSR_RENDER_SLOT_INNER]: `ssrRenderSlotInner`,
- [SSR_RENDER_CLASS]: `ssrRenderClass`,
- [SSR_RENDER_STYLE]: `ssrRenderStyle`,
- [SSR_RENDER_ATTRS]: `ssrRenderAttrs`,
- [SSR_RENDER_ATTR]: `ssrRenderAttr`,
- [SSR_RENDER_DYNAMIC_ATTR]: `ssrRenderDynamicAttr`,
- [SSR_RENDER_LIST]: `ssrRenderList`,
- [SSR_INCLUDE_BOOLEAN_ATTR]: `ssrIncludeBooleanAttr`,
- [SSR_LOOSE_EQUAL]: `ssrLooseEqual`,
- [SSR_LOOSE_CONTAIN]: `ssrLooseContain`,
- [SSR_RENDER_DYNAMIC_MODEL]: `ssrRenderDynamicModel`,
- [SSR_GET_DYNAMIC_MODEL_PROPS]: `ssrGetDynamicModelProps`,
- [SSR_RENDER_TELEPORT]: `ssrRenderTeleport`,
- [SSR_RENDER_SUSPENSE]: `ssrRenderSuspense`,
- [SSR_GET_DIRECTIVE_PROPS]: `ssrGetDirectiveProps`
- };
- compilerDom.registerRuntimeHelpers(ssrHelpers);
- const ssrTransformIf = compilerDom.createStructuralDirectiveTransform(
- /^(if|else|else-if)$/,
- compilerDom.processIf
- );
- function ssrProcessIf(node, context, disableNestedFragments = false, disableComment = false) {
- const [rootBranch] = node.branches;
- const ifStatement = compilerDom.createIfStatement(
- rootBranch.condition,
- processIfBranch(rootBranch, context, disableNestedFragments)
- );
- context.pushStatement(ifStatement);
- let currentIf = ifStatement;
- for (let i = 1; i < node.branches.length; i++) {
- const branch = node.branches[i];
- const branchBlockStatement = processIfBranch(
- branch,
- context,
- disableNestedFragments
- );
- if (branch.condition) {
- currentIf = currentIf.alternate = compilerDom.createIfStatement(
- branch.condition,
- branchBlockStatement
- );
- } else {
- currentIf.alternate = branchBlockStatement;
- }
- }
- if (!currentIf.alternate && !disableComment) {
- currentIf.alternate = compilerDom.createBlockStatement([
- compilerDom.createCallExpression(`_push`, ["`<!---->`"])
- ]);
- }
- }
- function processIfBranch(branch, context, disableNestedFragments = false) {
- const { children } = branch;
- const needFragmentWrapper = !disableNestedFragments && (children.length !== 1 || children[0].type !== 1) && // optimize away nested fragments when the only child is a ForNode
- !(children.length === 1 && children[0].type === 11);
- return processChildrenAsStatement(branch, context, needFragmentWrapper);
- }
- const ssrTransformFor = compilerDom.createStructuralDirectiveTransform("for", compilerDom.processFor);
- function ssrProcessFor(node, context, disableNestedFragments = false) {
- const needFragmentWrapper = !disableNestedFragments && (node.children.length !== 1 || node.children[0].type !== 1);
- const renderLoop = compilerDom.createFunctionExpression(
- compilerDom.createForLoopParams(node.parseResult)
- );
- renderLoop.body = processChildrenAsStatement(
- node,
- context,
- needFragmentWrapper
- );
- if (!disableNestedFragments) {
- context.pushStringPart(`<!--[-->`);
- }
- context.pushStatement(
- compilerDom.createCallExpression(context.helper(SSR_RENDER_LIST), [
- node.source,
- renderLoop
- ])
- );
- if (!disableNestedFragments) {
- context.pushStringPart(`<!--]-->`);
- }
- }
- const ssrTransformSlotOutlet = (node, context) => {
- if (compilerDom.isSlotOutlet(node)) {
- const { slotName, slotProps } = compilerDom.processSlotOutlet(node, context);
- const args = [
- `_ctx.$slots`,
- slotName,
- slotProps || `{}`,
- // fallback content placeholder. will be replaced in the process phase
- `null`,
- `_push`,
- `_parent`
- ];
- if (context.scopeId && context.slotted !== false) {
- args.push(`"${context.scopeId}-s"`);
- }
- let method = SSR_RENDER_SLOT;
- let parent = context.parent;
- if (parent) {
- const children = parent.children;
- if (parent.type === 10) {
- parent = context.grandParent;
- }
- let componentType;
- if (parent.type === 1 && parent.tagType === 1 && ((componentType = compilerDom.resolveComponentType(parent, context, true)) === compilerDom.TRANSITION || componentType === compilerDom.TRANSITION_GROUP) && children.filter((c) => c.type === 1).length === 1) {
- method = SSR_RENDER_SLOT_INNER;
- if (!(context.scopeId && context.slotted !== false)) {
- args.push("null");
- }
- args.push("true");
- }
- }
- node.ssrCodegenNode = compilerDom.createCallExpression(context.helper(method), args);
- }
- };
- function ssrProcessSlotOutlet(node, context) {
- const renderCall = node.ssrCodegenNode;
- if (node.children.length) {
- const fallbackRenderFn = compilerDom.createFunctionExpression([]);
- fallbackRenderFn.body = processChildrenAsStatement(node, context);
- renderCall.arguments[3] = fallbackRenderFn;
- }
- if (context.withSlotScopeId) {
- const slotScopeId = renderCall.arguments[6];
- renderCall.arguments[6] = slotScopeId ? `${slotScopeId} + _scopeId` : `_scopeId`;
- }
- context.pushStatement(node.ssrCodegenNode);
- }
- function createSSRCompilerError(code, loc) {
- return compilerDom.createCompilerError(code, loc, SSRErrorMessages);
- }
- const SSRErrorMessages = {
- [65]: `Unsafe attribute name for SSR.`,
- [66]: `Missing the 'to' prop on teleport element.`,
- [67]: `Invalid AST node during SSR transform.`
- };
- function ssrProcessTeleport(node, context) {
- const targetProp = compilerDom.findProp(node, "to");
- if (!targetProp) {
- context.onError(
- createSSRCompilerError(66, node.loc)
- );
- return;
- }
- let target;
- if (targetProp.type === 6) {
- target = targetProp.value && compilerDom.createSimpleExpression(targetProp.value.content, true);
- } else {
- target = targetProp.exp;
- }
- if (!target) {
- context.onError(
- createSSRCompilerError(
- 66,
- targetProp.loc
- )
- );
- return;
- }
- const disabledProp = compilerDom.findProp(
- node,
- "disabled",
- false,
- true
- /* allow empty */
- );
- const disabled = disabledProp ? disabledProp.type === 6 ? `true` : disabledProp.exp || `false` : `false`;
- const contentRenderFn = compilerDom.createFunctionExpression(
- [`_push`],
- void 0,
- // Body is added later
- true,
- // newline
- false,
- // isSlot
- node.loc
- );
- contentRenderFn.body = processChildrenAsStatement(node, context);
- context.pushStatement(
- compilerDom.createCallExpression(context.helper(SSR_RENDER_TELEPORT), [
- `_push`,
- contentRenderFn,
- target,
- disabled,
- `_parent`
- ])
- );
- }
- const wipMap$3 = /* @__PURE__ */ new WeakMap();
- function ssrTransformSuspense(node, context) {
- return () => {
- if (node.children.length) {
- const wipEntry = {
- slotsExp: null,
- // to be immediately set
- wipSlots: []
- };
- wipMap$3.set(node, wipEntry);
- wipEntry.slotsExp = compilerDom.buildSlots(
- node,
- context,
- (_props, _vForExp, children, loc) => {
- const fn = compilerDom.createFunctionExpression(
- [],
- void 0,
- // no return, assign body later
- true,
- // newline
- false,
- // suspense slots are not treated as normal slots
- loc
- );
- wipEntry.wipSlots.push({
- fn,
- children
- });
- return fn;
- }
- ).slots;
- }
- };
- }
- function ssrProcessSuspense(node, context) {
- const wipEntry = wipMap$3.get(node);
- if (!wipEntry) {
- return;
- }
- const { slotsExp, wipSlots } = wipEntry;
- for (let i = 0; i < wipSlots.length; i++) {
- const slot = wipSlots[i];
- slot.fn.body = processChildrenAsStatement(slot, context);
- }
- context.pushStatement(
- compilerDom.createCallExpression(context.helper(SSR_RENDER_SUSPENSE), [
- `_push`,
- slotsExp
- ])
- );
- }
- const rawChildrenMap = /* @__PURE__ */ new WeakMap();
- const ssrTransformElement = (node, context) => {
- if (node.type !== 1 || node.tagType !== 0) {
- return;
- }
- return function ssrPostTransformElement() {
- const openTag = [`<${node.tag}`];
- const needTagForRuntime = node.tag === "textarea" || node.tag.indexOf("-") > 0;
- const hasDynamicVBind = compilerDom.hasDynamicKeyVBind(node);
- const hasCustomDir = node.props.some(
- (p) => p.type === 7 && !shared.isBuiltInDirective(p.name)
- );
- const needMergeProps = hasDynamicVBind || hasCustomDir;
- if (needMergeProps) {
- const { props, directives } = compilerDom.buildProps(
- node,
- context,
- node.props,
- false,
- false,
- true
- );
- if (props || directives.length) {
- const mergedProps = buildSSRProps(props, directives, context);
- const propsExp = compilerDom.createCallExpression(
- context.helper(SSR_RENDER_ATTRS),
- [mergedProps]
- );
- if (node.tag === "textarea") {
- const existingText = node.children[0];
- if (!existingText || existingText.type !== 5) {
- const tempId = `_temp${context.temps++}`;
- propsExp.arguments = [
- compilerDom.createAssignmentExpression(
- compilerDom.createSimpleExpression(tempId, false),
- mergedProps
- )
- ];
- rawChildrenMap.set(
- node,
- compilerDom.createCallExpression(context.helper(SSR_INTERPOLATE), [
- compilerDom.createConditionalExpression(
- compilerDom.createSimpleExpression(`"value" in ${tempId}`, false),
- compilerDom.createSimpleExpression(`${tempId}.value`, false),
- compilerDom.createSimpleExpression(
- existingText ? existingText.content : ``,
- true
- ),
- false
- )
- ])
- );
- }
- } else if (node.tag === "input") {
- const vModel = findVModel(node);
- if (vModel) {
- const tempId = `_temp${context.temps++}`;
- const tempExp = compilerDom.createSimpleExpression(tempId, false);
- propsExp.arguments = [
- compilerDom.createSequenceExpression([
- compilerDom.createAssignmentExpression(tempExp, mergedProps),
- compilerDom.createCallExpression(context.helper(compilerDom.MERGE_PROPS), [
- tempExp,
- compilerDom.createCallExpression(
- context.helper(SSR_GET_DYNAMIC_MODEL_PROPS),
- [
- tempExp,
- // existing props
- vModel.exp
- // model
- ]
- )
- ])
- ])
- ];
- }
- } else if (directives.length && !node.children.length) {
- const tempId = `_temp${context.temps++}`;
- propsExp.arguments = [
- compilerDom.createAssignmentExpression(
- compilerDom.createSimpleExpression(tempId, false),
- mergedProps
- )
- ];
- rawChildrenMap.set(
- node,
- compilerDom.createConditionalExpression(
- compilerDom.createSimpleExpression(`"textContent" in ${tempId}`, false),
- compilerDom.createCallExpression(context.helper(SSR_INTERPOLATE), [
- compilerDom.createSimpleExpression(`${tempId}.textContent`, false)
- ]),
- compilerDom.createSimpleExpression(`${tempId}.innerHTML ?? ''`, false),
- false
- )
- );
- }
- if (needTagForRuntime) {
- propsExp.arguments.push(`"${node.tag}"`);
- }
- openTag.push(propsExp);
- }
- }
- let dynamicClassBinding = void 0;
- let staticClassBinding = void 0;
- let dynamicStyleBinding = void 0;
- for (let i = 0; i < node.props.length; i++) {
- const prop = node.props[i];
- if (node.tag === "input" && isTrueFalseValue(prop)) {
- continue;
- }
- if (prop.type === 7) {
- if (prop.name === "html" && prop.exp) {
- rawChildrenMap.set(
- node,
- compilerDom.createCompoundExpression([`(`, prop.exp, `) ?? ''`])
- );
- } else if (prop.name === "text" && prop.exp) {
- node.children = [compilerDom.createInterpolation(prop.exp, prop.loc)];
- } else if (prop.name === "slot") {
- context.onError(
- compilerDom.createCompilerError(40, prop.loc)
- );
- } else if (isTextareaWithValue(node, prop) && prop.exp) {
- if (!needMergeProps) {
- node.children = [compilerDom.createInterpolation(prop.exp, prop.loc)];
- }
- } else if (!needMergeProps && prop.name !== "on") {
- const directiveTransform = context.directiveTransforms[prop.name];
- if (directiveTransform) {
- const { props, ssrTagParts } = directiveTransform(
- prop,
- node,
- context
- );
- if (ssrTagParts) {
- openTag.push(...ssrTagParts);
- }
- for (let j = 0; j < props.length; j++) {
- const { key, value } = props[j];
- if (compilerDom.isStaticExp(key)) {
- let attrName = key.content;
- if (attrName === "key" || attrName === "ref") {
- continue;
- }
- if (attrName === "class") {
- openTag.push(
- ` class="`,
- dynamicClassBinding = compilerDom.createCallExpression(
- context.helper(SSR_RENDER_CLASS),
- [value]
- ),
- `"`
- );
- } else if (attrName === "style") {
- if (dynamicStyleBinding) {
- mergeCall(dynamicStyleBinding, value);
- } else {
- openTag.push(
- ` style="`,
- dynamicStyleBinding = compilerDom.createCallExpression(
- context.helper(SSR_RENDER_STYLE),
- [value]
- ),
- `"`
- );
- }
- } else {
- attrName = node.tag.indexOf("-") > 0 ? attrName : shared.propsToAttrMap[attrName] || attrName.toLowerCase();
- if (shared.isBooleanAttr(attrName)) {
- openTag.push(
- compilerDom.createConditionalExpression(
- compilerDom.createCallExpression(
- context.helper(SSR_INCLUDE_BOOLEAN_ATTR),
- [value]
- ),
- compilerDom.createSimpleExpression(" " + attrName, true),
- compilerDom.createSimpleExpression("", true),
- false
- )
- );
- } else if (shared.isSSRSafeAttrName(attrName)) {
- openTag.push(
- compilerDom.createCallExpression(context.helper(SSR_RENDER_ATTR), [
- key,
- value
- ])
- );
- } else {
- context.onError(
- createSSRCompilerError(
- 65,
- key.loc
- )
- );
- }
- }
- } else {
- const args = [key, value];
- if (needTagForRuntime) {
- args.push(`"${node.tag}"`);
- }
- openTag.push(
- compilerDom.createCallExpression(
- context.helper(SSR_RENDER_DYNAMIC_ATTR),
- args
- )
- );
- }
- }
- }
- }
- } else {
- const name = prop.name;
- if (node.tag === "textarea" && name === "value" && prop.value) {
- rawChildrenMap.set(node, shared.escapeHtml(prop.value.content));
- } else if (!needMergeProps) {
- if (name === "key" || name === "ref") {
- continue;
- }
- if (name === "class" && prop.value) {
- staticClassBinding = JSON.stringify(prop.value.content);
- }
- openTag.push(
- ` ${prop.name}` + (prop.value ? `="${shared.escapeHtml(prop.value.content)}"` : ``)
- );
- }
- }
- }
- if (dynamicClassBinding && staticClassBinding) {
- mergeCall(dynamicClassBinding, staticClassBinding);
- removeStaticBinding(openTag, "class");
- }
- if (context.scopeId) {
- openTag.push(` ${context.scopeId}`);
- }
- node.ssrCodegenNode = compilerDom.createTemplateLiteral(openTag);
- };
- };
- function buildSSRProps(props, directives, context) {
- let mergePropsArgs = [];
- if (props) {
- if (props.type === 14) {
- mergePropsArgs = props.arguments;
- } else {
- mergePropsArgs.push(props);
- }
- }
- if (directives.length) {
- for (const dir of directives) {
- mergePropsArgs.push(
- compilerDom.createCallExpression(context.helper(SSR_GET_DIRECTIVE_PROPS), [
- `_ctx`,
- ...compilerDom.buildDirectiveArgs(dir, context).elements
- ])
- );
- }
- }
- return mergePropsArgs.length > 1 ? compilerDom.createCallExpression(context.helper(compilerDom.MERGE_PROPS), mergePropsArgs) : mergePropsArgs[0];
- }
- function isTrueFalseValue(prop) {
- if (prop.type === 7) {
- return prop.name === "bind" && prop.arg && compilerDom.isStaticExp(prop.arg) && (prop.arg.content === "true-value" || prop.arg.content === "false-value");
- } else {
- return prop.name === "true-value" || prop.name === "false-value";
- }
- }
- function isTextareaWithValue(node, prop) {
- return !!(node.tag === "textarea" && prop.name === "bind" && compilerDom.isStaticArgOf(prop.arg, "value"));
- }
- function mergeCall(call, arg) {
- const existing = call.arguments[0];
- if (existing.type === 17) {
- existing.elements.push(arg);
- } else {
- call.arguments[0] = compilerDom.createArrayExpression([existing, arg]);
- }
- }
- function removeStaticBinding(tag, binding) {
- const regExp = new RegExp(`^ ${binding}=".+"$`);
- const i = tag.findIndex((e) => typeof e === "string" && regExp.test(e));
- if (i > -1) {
- tag.splice(i, 1);
- }
- }
- function findVModel(node) {
- return node.props.find(
- (p) => p.type === 7 && p.name === "model" && p.exp
- );
- }
- function ssrProcessElement(node, context) {
- const isVoidTag = context.options.isVoidTag || shared.NO;
- const elementsToAdd = node.ssrCodegenNode.elements;
- for (let j = 0; j < elementsToAdd.length; j++) {
- context.pushStringPart(elementsToAdd[j]);
- }
- if (context.withSlotScopeId) {
- context.pushStringPart(compilerDom.createSimpleExpression(`_scopeId`, false));
- }
- context.pushStringPart(`>`);
- const rawChildren = rawChildrenMap.get(node);
- if (rawChildren) {
- context.pushStringPart(rawChildren);
- } else if (node.children.length) {
- processChildren(node, context);
- }
- if (!isVoidTag(node.tag)) {
- context.pushStringPart(`</${node.tag}>`);
- }
- }
- const wipMap$2 = /* @__PURE__ */ new WeakMap();
- function ssrTransformTransitionGroup(node, context) {
- return () => {
- const tag = compilerDom.findProp(node, "tag");
- if (tag) {
- const otherProps = node.props.filter((p) => p !== tag);
- const { props, directives } = compilerDom.buildProps(
- node,
- context,
- otherProps,
- true,
- false,
- true
- );
- let propsExp = null;
- if (props || directives.length) {
- propsExp = compilerDom.createCallExpression(context.helper(SSR_RENDER_ATTRS), [
- buildSSRProps(props, directives, context)
- ]);
- }
- wipMap$2.set(node, {
- tag,
- propsExp,
- scopeId: context.scopeId || null
- });
- }
- };
- }
- function ssrProcessTransitionGroup(node, context) {
- const entry = wipMap$2.get(node);
- if (entry) {
- const { tag, propsExp, scopeId } = entry;
- if (tag.type === 7) {
- context.pushStringPart(`<`);
- context.pushStringPart(tag.exp);
- if (propsExp) {
- context.pushStringPart(propsExp);
- }
- if (scopeId) {
- context.pushStringPart(` ${scopeId}`);
- }
- context.pushStringPart(`>`);
- processChildren(
- node,
- context,
- false,
- /**
- * TransitionGroup has the special runtime behavior of flattening and
- * concatenating all children into a single fragment (in order for them to
- * be patched using the same key map) so we need to account for that here
- * by disabling nested fragment wrappers from being generated.
- */
- true,
- /**
- * TransitionGroup filters out comment children at runtime and thus
- * doesn't expect comments to be present during hydration. We need to
- * account for that by disabling the empty comment that is otherwise
- * rendered for a falsy v-if that has no v-else specified. (#6715)
- */
- true
- );
- context.pushStringPart(`</`);
- context.pushStringPart(tag.exp);
- context.pushStringPart(`>`);
- } else {
- context.pushStringPart(`<${tag.value.content}`);
- if (propsExp) {
- context.pushStringPart(propsExp);
- }
- if (scopeId) {
- context.pushStringPart(` ${scopeId}`);
- }
- context.pushStringPart(`>`);
- processChildren(node, context, false, true, true);
- context.pushStringPart(`</${tag.value.content}>`);
- }
- } else {
- processChildren(node, context, true, true, true);
- }
- }
- const wipMap$1 = /* @__PURE__ */ new WeakMap();
- function ssrTransformTransition(node, context) {
- return () => {
- const appear = compilerDom.findProp(node, "appear", false, true);
- wipMap$1.set(node, !!appear);
- };
- }
- function ssrProcessTransition(node, context) {
- node.children = node.children.filter((c) => c.type !== 3);
- const appear = wipMap$1.get(node);
- if (appear) {
- context.pushStringPart(`<template>`);
- processChildren(node, context, false, true);
- context.pushStringPart(`</template>`);
- } else {
- processChildren(node, context, false, true);
- }
- }
- const wipMap = /* @__PURE__ */ new WeakMap();
- const WIP_SLOT = Symbol();
- const componentTypeMap = /* @__PURE__ */ new WeakMap();
- const ssrTransformComponent = (node, context) => {
- if (node.type !== 1 || node.tagType !== 1) {
- return;
- }
- const component = compilerDom.resolveComponentType(
- node,
- context,
- true
- /* ssr */
- );
- const isDynamicComponent = shared.isObject(component) && component.callee === compilerDom.RESOLVE_DYNAMIC_COMPONENT;
- componentTypeMap.set(node, component);
- if (shared.isSymbol(component)) {
- if (component === compilerDom.SUSPENSE) {
- return ssrTransformSuspense(node, context);
- } else if (component === compilerDom.TRANSITION_GROUP) {
- return ssrTransformTransitionGroup(node, context);
- } else if (component === compilerDom.TRANSITION) {
- return ssrTransformTransition(node);
- }
- return;
- }
- const vnodeBranches = [];
- const clonedNode = clone(node);
- return function ssrPostTransformComponent() {
- if (clonedNode.children.length) {
- compilerDom.buildSlots(clonedNode, context, (props, vFor, children) => {
- vnodeBranches.push(
- createVNodeSlotBranch(props, vFor, children, context)
- );
- return compilerDom.createFunctionExpression(void 0);
- });
- }
- let propsExp = `null`;
- if (node.props.length) {
- const { props, directives } = compilerDom.buildProps(
- node,
- context,
- void 0,
- true,
- isDynamicComponent
- );
- if (props || directives.length) {
- propsExp = buildSSRProps(props, directives, context);
- }
- }
- const wipEntries = [];
- wipMap.set(node, wipEntries);
- const buildSSRSlotFn = (props, _vForExp, children, loc) => {
- const param0 = props && compilerDom.stringifyExpression(props) || `_`;
- const fn = compilerDom.createFunctionExpression(
- [param0, `_push`, `_parent`, `_scopeId`],
- void 0,
- // no return, assign body later
- true,
- // newline
- true,
- // isSlot
- loc
- );
- wipEntries.push({
- type: WIP_SLOT,
- fn,
- children,
- // also collect the corresponding vnode branch built earlier
- vnodeBranch: vnodeBranches[wipEntries.length]
- });
- return fn;
- };
- const slots = node.children.length ? compilerDom.buildSlots(node, context, buildSSRSlotFn).slots : `null`;
- if (typeof component !== "string") {
- node.ssrCodegenNode = compilerDom.createCallExpression(
- context.helper(SSR_RENDER_VNODE),
- [
- `_push`,
- compilerDom.createCallExpression(context.helper(compilerDom.CREATE_VNODE), [
- component,
- propsExp,
- slots
- ]),
- `_parent`
- ]
- );
- } else {
- node.ssrCodegenNode = compilerDom.createCallExpression(
- context.helper(SSR_RENDER_COMPONENT),
- [component, propsExp, slots, `_parent`]
- );
- }
- };
- };
- function ssrProcessComponent(node, context, parent) {
- const component = componentTypeMap.get(node);
- if (!node.ssrCodegenNode) {
- if (component === compilerDom.TELEPORT) {
- return ssrProcessTeleport(node, context);
- } else if (component === compilerDom.SUSPENSE) {
- return ssrProcessSuspense(node, context);
- } else if (component === compilerDom.TRANSITION_GROUP) {
- return ssrProcessTransitionGroup(node, context);
- } else {
- if (parent.type === WIP_SLOT) {
- context.pushStringPart(``);
- }
- if (component === compilerDom.TRANSITION) {
- return ssrProcessTransition(node, context);
- }
- processChildren(node, context);
- }
- } else {
- const wipEntries = wipMap.get(node) || [];
- for (let i = 0; i < wipEntries.length; i++) {
- const { fn, vnodeBranch } = wipEntries[i];
- fn.body = compilerDom.createIfStatement(
- compilerDom.createSimpleExpression(`_push`, false),
- processChildrenAsStatement(
- wipEntries[i],
- context,
- false,
- true
- ),
- vnodeBranch
- );
- }
- if (context.withSlotScopeId) {
- node.ssrCodegenNode.arguments.push(`_scopeId`);
- }
- if (typeof component === "string") {
- context.pushStatement(
- compilerDom.createCallExpression(`_push`, [node.ssrCodegenNode])
- );
- } else {
- context.pushStatement(node.ssrCodegenNode);
- }
- }
- }
- const rawOptionsMap = /* @__PURE__ */ new WeakMap();
- const [baseNodeTransforms, baseDirectiveTransforms] = compilerDom.getBaseTransformPreset(true);
- const vnodeNodeTransforms = [...baseNodeTransforms, ...compilerDom.DOMNodeTransforms];
- const vnodeDirectiveTransforms = {
- ...baseDirectiveTransforms,
- ...compilerDom.DOMDirectiveTransforms
- };
- function createVNodeSlotBranch(slotProps, vFor, children, parentContext) {
- const rawOptions = rawOptionsMap.get(parentContext.root);
- const subOptions = {
- ...rawOptions,
- // overwrite with vnode-based transforms
- nodeTransforms: [
- ...vnodeNodeTransforms,
- ...rawOptions.nodeTransforms || []
- ],
- directiveTransforms: {
- ...vnodeDirectiveTransforms,
- ...rawOptions.directiveTransforms || {}
- }
- };
- const wrapperProps = [];
- if (slotProps) {
- wrapperProps.push({
- type: 7,
- name: "slot",
- exp: slotProps,
- arg: void 0,
- modifiers: [],
- loc: compilerDom.locStub
- });
- }
- if (vFor) {
- wrapperProps.push(shared.extend({}, vFor));
- }
- const wrapperNode = {
- type: 1,
- ns: 0,
- tag: "template",
- tagType: 3,
- props: wrapperProps,
- children,
- loc: compilerDom.locStub,
- codegenNode: void 0
- };
- subTransform(wrapperNode, subOptions, parentContext);
- return compilerDom.createReturnStatement(children);
- }
- function subTransform(node, options, parentContext) {
- const childRoot = compilerDom.createRoot([node]);
- const childContext = compilerDom.createTransformContext(childRoot, options);
- childContext.ssr = false;
- childContext.scopes = { ...parentContext.scopes };
- childContext.identifiers = { ...parentContext.identifiers };
- childContext.imports = parentContext.imports;
- compilerDom.traverseNode(childRoot, childContext);
- ["helpers", "components", "directives"].forEach((key) => {
- childContext[key].forEach((value, helperKey) => {
- if (key === "helpers") {
- const parentCount = parentContext.helpers.get(helperKey);
- if (parentCount === void 0) {
- parentContext.helpers.set(helperKey, value);
- } else {
- parentContext.helpers.set(helperKey, value + parentCount);
- }
- } else {
- parentContext[key].add(value);
- }
- });
- });
- }
- function clone(v) {
- if (shared.isArray(v)) {
- return v.map(clone);
- } else if (shared.isPlainObject(v)) {
- const res = {};
- for (const key in v) {
- res[key] = clone(v[key]);
- }
- return res;
- } else {
- return v;
- }
- }
- function ssrCodegenTransform(ast, options) {
- const context = createSSRTransformContext(ast, options);
- if (options.ssrCssVars) {
- const cssContext = compilerDom.createTransformContext(compilerDom.createRoot([]), options);
- const varsExp = compilerDom.processExpression(
- compilerDom.createSimpleExpression(options.ssrCssVars, false),
- cssContext
- );
- context.body.push(
- compilerDom.createCompoundExpression([`const _cssVars = { style: `, varsExp, `}`])
- );
- Array.from(cssContext.helpers.keys()).forEach((helper) => {
- ast.helpers.add(helper);
- });
- }
- const isFragment = ast.children.length > 1 && ast.children.some((c) => !compilerDom.isText(c));
- processChildren(ast, context, isFragment);
- ast.codegenNode = compilerDom.createBlockStatement(context.body);
- ast.ssrHelpers = Array.from(
- /* @__PURE__ */ new Set([
- ...Array.from(ast.helpers).filter((h) => h in ssrHelpers),
- ...context.helpers
- ])
- );
- ast.helpers = new Set(Array.from(ast.helpers).filter((h) => !(h in ssrHelpers)));
- }
- function createSSRTransformContext(root, options, helpers = /* @__PURE__ */ new Set(), withSlotScopeId = false) {
- const body = [];
- let currentString = null;
- return {
- root,
- options,
- body,
- helpers,
- withSlotScopeId,
- onError: options.onError || ((e) => {
- throw e;
- }),
- helper(name) {
- helpers.add(name);
- return name;
- },
- pushStringPart(part) {
- if (!currentString) {
- const currentCall = compilerDom.createCallExpression(`_push`);
- body.push(currentCall);
- currentString = compilerDom.createTemplateLiteral([]);
- currentCall.arguments.push(currentString);
- }
- const bufferedElements = currentString.elements;
- const lastItem = bufferedElements[bufferedElements.length - 1];
- if (shared.isString(part) && shared.isString(lastItem)) {
- bufferedElements[bufferedElements.length - 1] += part;
- } else {
- bufferedElements.push(part);
- }
- },
- pushStatement(statement) {
- currentString = null;
- body.push(statement);
- }
- };
- }
- function createChildContext(parent, withSlotScopeId = parent.withSlotScopeId) {
- return createSSRTransformContext(
- parent.root,
- parent.options,
- parent.helpers,
- withSlotScopeId
- );
- }
- function processChildren(parent, context, asFragment = false, disableNestedFragments = false, disableComment = false) {
- if (asFragment) {
- context.pushStringPart(`<!--[-->`);
- }
- const { children } = parent;
- for (let i = 0; i < children.length; i++) {
- const child = children[i];
- switch (child.type) {
- case 1:
- switch (child.tagType) {
- case 0:
- ssrProcessElement(child, context);
- break;
- case 1:
- ssrProcessComponent(child, context, parent);
- break;
- case 2:
- ssrProcessSlotOutlet(child, context);
- break;
- case 3:
- break;
- default:
- context.onError(
- createSSRCompilerError(
- 67,
- child.loc
- )
- );
- const exhaustiveCheck2 = child;
- return exhaustiveCheck2;
- }
- break;
- case 2:
- context.pushStringPart(shared.escapeHtml(child.content));
- break;
- case 3:
- if (!disableComment) {
- context.pushStringPart(`<!--${child.content}-->`);
- }
- break;
- case 5:
- context.pushStringPart(
- compilerDom.createCallExpression(context.helper(SSR_INTERPOLATE), [
- child.content
- ])
- );
- break;
- case 9:
- ssrProcessIf(child, context, disableNestedFragments, disableComment);
- break;
- case 11:
- ssrProcessFor(child, context, disableNestedFragments);
- break;
- case 10:
- break;
- case 12:
- case 8:
- break;
- default:
- context.onError(
- createSSRCompilerError(
- 67,
- child.loc
- )
- );
- const exhaustiveCheck = child;
- return exhaustiveCheck;
- }
- }
- if (asFragment) {
- context.pushStringPart(`<!--]-->`);
- }
- }
- function processChildrenAsStatement(parent, parentContext, asFragment = false, withSlotScopeId = parentContext.withSlotScopeId) {
- const childContext = createChildContext(parentContext, withSlotScopeId);
- processChildren(parent, childContext, asFragment);
- return compilerDom.createBlockStatement(childContext.body);
- }
- const ssrTransformModel = (dir, node, context) => {
- const model = dir.exp;
- function checkDuplicatedValue() {
- const value = compilerDom.findProp(node, "value");
- if (value) {
- context.onError(
- compilerDom.createDOMCompilerError(
- 60,
- value.loc
- )
- );
- }
- }
- function processOption(plainNode) {
- if (plainNode.tag === "option") {
- if (plainNode.props.findIndex((p) => p.name === "selected") === -1) {
- const value = findValueBinding(plainNode);
- plainNode.ssrCodegenNode.elements.push(
- compilerDom.createConditionalExpression(
- compilerDom.createCallExpression(context.helper(SSR_INCLUDE_BOOLEAN_ATTR), [
- compilerDom.createConditionalExpression(
- compilerDom.createCallExpression(`Array.isArray`, [model]),
- compilerDom.createCallExpression(context.helper(SSR_LOOSE_CONTAIN), [
- model,
- value
- ]),
- compilerDom.createCallExpression(context.helper(SSR_LOOSE_EQUAL), [
- model,
- value
- ])
- )
- ]),
- compilerDom.createSimpleExpression(" selected", true),
- compilerDom.createSimpleExpression("", true),
- false
- )
- );
- }
- } else if (plainNode.tag === "optgroup") {
- plainNode.children.forEach(
- (option) => processOption(option)
- );
- }
- }
- if (node.tagType === 0) {
- const res = { props: [] };
- const defaultProps = [
- // default value binding for text type inputs
- compilerDom.createObjectProperty(`value`, model)
- ];
- if (node.tag === "input") {
- const type = compilerDom.findProp(node, "type");
- if (type) {
- const value = findValueBinding(node);
- if (type.type === 7) {
- res.ssrTagParts = [
- compilerDom.createCallExpression(context.helper(SSR_RENDER_DYNAMIC_MODEL), [
- type.exp,
- model,
- value
- ])
- ];
- } else if (type.value) {
- switch (type.value.content) {
- case "radio":
- res.props = [
- compilerDom.createObjectProperty(
- `checked`,
- compilerDom.createCallExpression(context.helper(SSR_LOOSE_EQUAL), [
- model,
- value
- ])
- )
- ];
- break;
- case "checkbox":
- const trueValueBinding = compilerDom.findProp(node, "true-value");
- if (trueValueBinding) {
- const trueValue = trueValueBinding.type === 6 ? JSON.stringify(trueValueBinding.value.content) : trueValueBinding.exp;
- res.props = [
- compilerDom.createObjectProperty(
- `checked`,
- compilerDom.createCallExpression(context.helper(SSR_LOOSE_EQUAL), [
- model,
- trueValue
- ])
- )
- ];
- } else {
- res.props = [
- compilerDom.createObjectProperty(
- `checked`,
- compilerDom.createConditionalExpression(
- compilerDom.createCallExpression(`Array.isArray`, [model]),
- compilerDom.createCallExpression(context.helper(SSR_LOOSE_CONTAIN), [
- model,
- value
- ]),
- model
- )
- )
- ];
- }
- break;
- case "file":
- context.onError(
- compilerDom.createDOMCompilerError(
- 59,
- dir.loc
- )
- );
- break;
- default:
- checkDuplicatedValue();
- res.props = defaultProps;
- break;
- }
- }
- } else if (compilerDom.hasDynamicKeyVBind(node)) ; else {
- checkDuplicatedValue();
- res.props = defaultProps;
- }
- } else if (node.tag === "textarea") {
- checkDuplicatedValue();
- node.children = [compilerDom.createInterpolation(model, model.loc)];
- } else if (node.tag === "select") {
- node.children.forEach((child) => {
- if (child.type === 1) {
- processOption(child);
- }
- });
- } else {
- context.onError(
- compilerDom.createDOMCompilerError(
- 57,
- dir.loc
- )
- );
- }
- return res;
- } else {
- return compilerDom.transformModel(dir, node, context);
- }
- };
- function findValueBinding(node) {
- const valueBinding = compilerDom.findProp(node, "value");
- return valueBinding ? valueBinding.type === 7 ? valueBinding.exp : compilerDom.createSimpleExpression(valueBinding.value.content, true) : compilerDom.createSimpleExpression(`null`, false);
- }
- const ssrTransformShow = (dir, node, context) => {
- if (!dir.exp) {
- context.onError(
- compilerDom.createDOMCompilerError(61)
- );
- }
- return {
- props: [
- compilerDom.createObjectProperty(
- `style`,
- compilerDom.createConditionalExpression(
- dir.exp,
- compilerDom.createSimpleExpression(`null`, false),
- compilerDom.createObjectExpression([
- compilerDom.createObjectProperty(
- `display`,
- compilerDom.createSimpleExpression(`none`, true)
- )
- ]),
- false
- )
- )
- ]
- };
- };
- const filterChild = (node) => node.children.filter((n) => n.type !== 3);
- const hasSingleChild = (node) => filterChild(node).length === 1;
- const ssrInjectFallthroughAttrs = (node, context) => {
- if (node.type === 0) {
- context.identifiers._attrs = 1;
- }
- if (node.type === 1 && node.tagType === 1 && (node.tag === "transition" || node.tag === "Transition" || node.tag === "KeepAlive" || node.tag === "keep-alive")) {
- const rootChildren = filterChild(context.root);
- if (rootChildren.length === 1 && rootChildren[0] === node) {
- if (hasSingleChild(node)) {
- injectFallthroughAttrs(node.children[0]);
- }
- return;
- }
- }
- const parent = context.parent;
- if (!parent || parent.type !== 0) {
- return;
- }
- if (node.type === 10 && hasSingleChild(node)) {
- let hasEncounteredIf = false;
- for (const c of filterChild(parent)) {
- if (c.type === 9 || c.type === 1 && compilerDom.findDir(c, "if")) {
- if (hasEncounteredIf) return;
- hasEncounteredIf = true;
- } else if (
- // node before v-if
- !hasEncounteredIf || // non else nodes
- !(c.type === 1 && compilerDom.findDir(c, /else/, true))
- ) {
- return;
- }
- }
- injectFallthroughAttrs(node.children[0]);
- } else if (hasSingleChild(parent)) {
- injectFallthroughAttrs(node);
- }
- };
- function injectFallthroughAttrs(node) {
- if (node.type === 1 && (node.tagType === 0 || node.tagType === 1) && !compilerDom.findDir(node, "for")) {
- node.props.push({
- type: 7,
- name: "bind",
- arg: void 0,
- exp: compilerDom.createSimpleExpression(`_attrs`, false),
- modifiers: [],
- loc: compilerDom.locStub
- });
- }
- }
- const ssrInjectCssVars = (node, context) => {
- if (!context.ssrCssVars) {
- return;
- }
- if (node.type === 0) {
- context.identifiers._cssVars = 1;
- }
- const parent = context.parent;
- if (!parent || parent.type !== 0) {
- return;
- }
- if (node.type === 10) {
- for (const child of node.children) {
- injectCssVars(child);
- }
- } else {
- injectCssVars(node);
- }
- };
- function injectCssVars(node) {
- if (node.type === 1 && (node.tagType === 0 || node.tagType === 1) && !compilerDom.findDir(node, "for")) {
- if (node.tag === "suspense" || node.tag === "Suspense") {
- for (const child of node.children) {
- if (child.type === 1 && child.tagType === 3) {
- child.children.forEach(injectCssVars);
- } else {
- injectCssVars(child);
- }
- }
- } else {
- node.props.push({
- type: 7,
- name: "bind",
- arg: void 0,
- exp: compilerDom.createSimpleExpression(`_cssVars`, false),
- modifiers: [],
- loc: compilerDom.locStub
- });
- }
- }
- }
- function compile(source, options = {}) {
- options = {
- ...options,
- ...compilerDom.parserOptions,
- ssr: true,
- inSSR: true,
- scopeId: options.mode === "function" ? null : options.scopeId,
- // always prefix since compiler-ssr doesn't have size concern
- prefixIdentifiers: true,
- // disable optimizations that are unnecessary for ssr
- cacheHandlers: false,
- hoistStatic: false
- };
- const ast = typeof source === "string" ? compilerDom.baseParse(source, options) : source;
- rawOptionsMap.set(ast, options);
- compilerDom.transform(ast, {
- ...options,
- hoistStatic: false,
- nodeTransforms: [
- ssrTransformIf,
- ssrTransformFor,
- compilerDom.trackVForSlotScopes,
- compilerDom.transformExpression,
- ssrTransformSlotOutlet,
- ssrInjectFallthroughAttrs,
- ssrInjectCssVars,
- ssrTransformElement,
- ssrTransformComponent,
- compilerDom.trackSlotScopes,
- compilerDom.transformStyle,
- ...options.nodeTransforms || []
- // user transforms
- ],
- directiveTransforms: {
- // reusing core v-bind
- bind: compilerDom.transformBind,
- on: compilerDom.transformOn,
- // model and show have dedicated SSR handling
- model: ssrTransformModel,
- show: ssrTransformShow,
- // the following are ignored during SSR
- // on: noopDirectiveTransform,
- cloak: compilerDom.noopDirectiveTransform,
- once: compilerDom.noopDirectiveTransform,
- memo: compilerDom.noopDirectiveTransform,
- ...options.directiveTransforms || {}
- // user transforms
- }
- });
- ssrCodegenTransform(ast, options);
- return compilerDom.generate(ast, options);
- }
- exports.compile = compile;
|