]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-ssr): fix node clone edge case caused by AST reuse (#9983)
authoredison <daiwei521@126.com>
Thu, 4 Jan 2024 02:52:09 +0000 (10:52 +0800)
committerGitHub <noreply@github.com>
Thu, 4 Jan 2024 02:52:09 +0000 (10:52 +0800)
close #9981

packages/compiler-sfc/__tests__/compileTemplate.spec.ts
packages/compiler-ssr/src/transforms/ssrTransformComponent.ts

index 7ab64bb26673bccddc1fdb2c8db5bb19ad621683..45dc54a69db6e6bcbaace9850dd43f9fa2cd66d5 100644 (file)
@@ -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 = `
+  <script setup lang="ts">
+    import { Foo } from './foo'
+  </script>
+  <template>
+    <Bar>
+      <template #option="{ foo }"></template>
+    </Bar>
+  </template>
+  `
+  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
index c179cd50cf7c7bef12543a3a1c648d06dbad0246..3146a90a2d6caea3a7ad8bd564ed9192fed9b31b 100644 (file)
@@ -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 {