From: edison Date: Thu, 4 Jan 2024 02:52:09 +0000 (+0800) Subject: fix(compiler-ssr): fix node clone edge case caused by AST reuse (#9983) X-Git-Tag: v3.4.5~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7dbdb3edf0ab648965331ca42f069387c97a1c8a;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-ssr): fix node clone edge case caused by AST reuse (#9983) close #9981 --- diff --git a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts index 7ab64bb266..45dc54a69d 100644 --- a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts +++ b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts @@ -427,6 +427,31 @@ test('prefixing edge case for reused AST', () => { expect(code).not.toMatch(`_ctx.t`) }) +test('prefixing edge case for reused AST ssr mode', () => { + const src = ` + + + ` + const { descriptor } = parse(src) + // compileScript triggers importUsageCheck + compileScript(descriptor, { id: 'xxx' }) + expect(() => + compileTemplate({ + id: 'xxx', + filename: 'test.vue', + ast: descriptor.template!.ast, + source: descriptor.template!.content, + ssr: true, + }), + ).not.toThrowError() +}) + interface Pos { line: number column: number diff --git a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts index c179cd50cf..3146a90a2d 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts @@ -55,7 +55,7 @@ import { ssrProcessTransitionGroup, ssrTransformTransitionGroup, } from './ssrTransformTransitionGroup' -import { extend, isArray, isObject, isSymbol } from '@vue/shared' +import { extend, isArray, isObject, isPlainObject, isSymbol } from '@vue/shared' import { buildSSRProps } from './ssrTransformElement' import { ssrProcessTransition, @@ -121,6 +121,8 @@ export const ssrTransformComponent: NodeTransform = (node, context) => { const vnodeBranches: ReturnStatement[] = [] const clonedNode = clone(node) + console.log(clonedNode) + return function ssrPostTransformComponent() { // Using the cloned node, build the normal VNode-based branches (for // fallback in case the child is render-fn based). Store them in an array @@ -371,10 +373,10 @@ function subTransform( function clone(v: any): any { if (isArray(v)) { return v.map(clone) - } else if (isObject(v)) { + } else if (isPlainObject(v)) { const res: any = {} for (const key in v) { - res[key] = clone(v[key]) + res[key] = clone(v[key as keyof typeof v]) } return res } else {