Skip to content

Commit 7dbdb3e

Browse files
authored
fix(compiler-ssr): fix node clone edge case caused by AST reuse (#9983)
close #9981
1 parent d2d8955 commit 7dbdb3e

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

packages/compiler-sfc/__tests__/compileTemplate.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,31 @@ test('prefixing edge case for reused AST', () => {
427427
expect(code).not.toMatch(`_ctx.t`)
428428
})
429429

430+
test('prefixing edge case for reused AST ssr mode', () => {
431+
const src = `
432+
<script setup lang="ts">
433+
import { Foo } from './foo'
434+
</script>
435+
<template>
436+
<Bar>
437+
<template #option="{ foo }"></template>
438+
</Bar>
439+
</template>
440+
`
441+
const { descriptor } = parse(src)
442+
// compileScript triggers importUsageCheck
443+
compileScript(descriptor, { id: 'xxx' })
444+
expect(() =>
445+
compileTemplate({
446+
id: 'xxx',
447+
filename: 'test.vue',
448+
ast: descriptor.template!.ast,
449+
source: descriptor.template!.content,
450+
ssr: true,
451+
}),
452+
).not.toThrowError()
453+
})
454+
430455
interface Pos {
431456
line: number
432457
column: number

packages/compiler-ssr/src/transforms/ssrTransformComponent.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import {
5555
ssrProcessTransitionGroup,
5656
ssrTransformTransitionGroup,
5757
} from './ssrTransformTransitionGroup'
58-
import { extend, isArray, isObject, isSymbol } from '@vue/shared'
58+
import { extend, isArray, isObject, isPlainObject, isSymbol } from '@vue/shared'
5959
import { buildSSRProps } from './ssrTransformElement'
6060
import {
6161
ssrProcessTransition,
@@ -121,6 +121,8 @@ export const ssrTransformComponent: NodeTransform = (node, context) => {
121121
const vnodeBranches: ReturnStatement[] = []
122122
const clonedNode = clone(node)
123123

124+
console.log(clonedNode)
125+
124126
return function ssrPostTransformComponent() {
125127
// Using the cloned node, build the normal VNode-based branches (for
126128
// fallback in case the child is render-fn based). Store them in an array
@@ -371,10 +373,10 @@ function subTransform(
371373
function clone(v: any): any {
372374
if (isArray(v)) {
373375
return v.map(clone)
374-
} else if (isObject(v)) {
376+
} else if (isPlainObject(v)) {
375377
const res: any = {}
376378
for (const key in v) {
377-
res[key] = clone(v[key])
379+
res[key] = clone(v[key as keyof typeof v])
378380
}
379381
return res
380382
} else {

0 commit comments

Comments
 (0)