From: daiwei Date: Mon, 27 Jan 2025 01:15:51 +0000 (+0800) Subject: chore: update X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2328f91ef76d2cb95e9cfd1cba5e7b8bbef4c5db;p=thirdparty%2Fvuejs%2Fcore.git chore: update --- diff --git a/packages/compiler-core/src/transforms/vSkip.ts b/packages/compiler-core/src/transforms/vSkip.ts index 569e04958f..9d0f11763b 100644 --- a/packages/compiler-core/src/transforms/vSkip.ts +++ b/packages/compiler-core/src/transforms/vSkip.ts @@ -1,4 +1,5 @@ import { + type ComponentNode, type DirectiveNode, type ElementNode, ElementTypes, @@ -7,6 +8,7 @@ import { NodeTypes, type SimpleExpressionNode, type SkipNode, + type SourceLocation, type TemplateChildNode, type VNodeCall, createCallExpression, @@ -60,14 +62,11 @@ export const transformSkip: NodeTransform = createStructuralDirectiveTransform( } } else { const { consequent, alternate, test } = skipNode! - const consequentNode = - consequent.type === NodeTypes.IF_BRANCH - ? createCodegenNodeForBranch(consequent, 0, context) - : consequent - skipNode!.codegenNode = createConditionalExpression( test, - consequentNode, + consequent.type === NodeTypes.IF_BRANCH + ? createCodegenNodeForBranch(consequent, 0, context) + : consequent, createCodegenNodeForBranch(alternate, 1, context), ) } @@ -129,32 +128,13 @@ export function processSkip( processAsSkipNode = true children = node.children } else if (isComponent) { - const { slots, hasDynamicSlots } = buildSlots( + ;({ processAsSkipNode, children } = resolveDefaultSlot( node, context, - undefined, - true, - ) - // find default slot without slot props if not has dynamic slots - if (!hasDynamicSlots && slots.type === NodeTypes.JS_OBJECT_EXPRESSION) { - processAsSkipNode = true - const prop = slots.properties.find( - p => - p.type === NodeTypes.JS_PROPERTY && - p.key.type === NodeTypes.SIMPLE_EXPRESSION && - p.key.content === 'default' && - p.value.params === undefined, - ) - if (prop) { - const slotNode = prop.value.returns as TemplateChildNode[] - // using the cloned node for ssr VNode-based slot - children = context.inSSR ? clone(slotNode) : slotNode - } else { - context.onError( - createCompilerError(ErrorCodes.X_V_SKIP_UNEXPECTED_SLOT, loc), - ) - } - } + processAsSkipNode, + children, + loc, + )) } let skipNode: SkipNode | undefined @@ -162,40 +142,73 @@ export function processSkip( // if children is empty, create comment node const consequent = children.length !== 0 - ? ({ - type: NodeTypes.IF_BRANCH, - loc: node.loc, - condition: undefined, - children, - userKey: findProp(node, `key`), - } as IfBranchNode) + ? createBranchNode(node, node.loc, children) : createCallExpression(context.helper(CREATE_COMMENT), [ __DEV__ ? '"v-skip"' : '""', 'true', ]) - const alternate: IfBranchNode = { - type: NodeTypes.IF_BRANCH, - loc: node.loc, - condition: undefined, - children: [node], - userKey: findProp(node, `key`), - } - skipNode = { type: NodeTypes.SKIP, loc: cloneLoc(node.loc), test: dir.exp, consequent, - alternate, + alternate: createBranchNode(node, node.loc, [node]), newline: true, } + context.replaceNode(skipNode) } if (processCodegen) return processCodegen(skipNode) } +function resolveDefaultSlot( + node: ComponentNode, + context: TransformContext, + processAsSkipNode: boolean, + children: TemplateChildNode[], + loc: SourceLocation, +) { + const { slots, hasDynamicSlots } = buildSlots(node, context, undefined, true) + // find default slot without slot props if not has dynamic slots + if (!hasDynamicSlots && slots.type === NodeTypes.JS_OBJECT_EXPRESSION) { + processAsSkipNode = true + const prop = slots.properties.find( + p => + p.type === NodeTypes.JS_PROPERTY && + p.key.type === NodeTypes.SIMPLE_EXPRESSION && + p.key.content === 'default' && + p.value.params === undefined, + ) + if (prop) { + const slotNode = prop.value.returns as TemplateChildNode[] + // using the cloned node for ssr VNode-based slot + children = context.inSSR ? clone(slotNode) : slotNode + } else { + context.onError( + createCompilerError(ErrorCodes.X_V_SKIP_UNEXPECTED_SLOT, loc), + ) + } + } + + return { processAsSkipNode, children } +} + +function createBranchNode( + node: ElementNode, + loc: SourceLocation, + children: TemplateChildNode[], +): IfBranchNode { + return { + type: NodeTypes.IF_BRANCH, + loc, + condition: undefined, + children, + userKey: findProp(node, `key`), + } +} + function getVNodeTag( context: TransformContext, exp: ExpressionNode, diff --git a/packages/compiler-ssr/src/transforms/ssrVSkip.ts b/packages/compiler-ssr/src/transforms/ssrVSkip.ts index 7f6d101ee8..c6e53d66eb 100644 --- a/packages/compiler-ssr/src/transforms/ssrVSkip.ts +++ b/packages/compiler-ssr/src/transforms/ssrVSkip.ts @@ -53,16 +53,11 @@ export function ssrProcessSkip( context: SSRTransformContext, ): void { const { consequent, alternate, test } = node - - // if consequent is an if branch, process it as well - const consequentNode = - consequent.type === NodeTypes.IF_BRANCH - ? processIfBranch(consequent, context) - : consequent - const ifStatement = createIfStatement( test, - consequentNode, + consequent.type === NodeTypes.IF_BRANCH + ? processIfBranch(consequent, context) + : consequent, processIfBranch(alternate, context), ) context.pushStatement(ifStatement)