Просмотр исходного кода

fix(compiler-sfc): fix defineProps() call on imported identifier

Evan You 5 лет назад
Родитель
Сommit
691d354af9

+ 17 - 0
packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap

@@ -73,6 +73,23 @@ return {  }
 }"
 `;
 
+exports[`SFC compile <script setup> defineProps w/ external definition 1`] = `
+"import { propsModel } from './props'
+    
+export default {
+  props: propsModel,
+  setup(__props, { expose }) {
+  expose()
+
+const props = __props
+    
+    
+return { props, propsModel }
+}
+
+}"
+`;
+
 exports[`SFC compile <script setup> defineProps() 1`] = `
 "export default {
   props: {

+ 13 - 0
packages/compiler-sfc/__tests__/compileScript.spec.ts

@@ -48,6 +48,19 @@ const bar = 1
 },`)
   })
 
+  test('defineProps w/ external definition', () => {
+    const { content } = compile(`
+    <script setup>
+    import { defineProps } from 'vue'
+    import { propsModel } from './props'
+    const props = defineProps(propsModel)
+    </script>
+      `)
+    assertCode(content)
+    expect(content).toMatch(`export default {
+  props: propsModel,`)
+  })
+
   test('defineEmit() (deprecated)', () => {
     const { content, bindings } = compile(`
 <script setup>

+ 9 - 1
packages/compiler-sfc/src/compileScript.ts

@@ -1492,7 +1492,15 @@ export function walkIdentifiers(
   })
 }
 
-function isRefIdentifier(id: Identifier, parent: Node, parentStack: Node[]) {
+function isRefIdentifier(
+  id: Identifier,
+  parent: Node | null,
+  parentStack: Node[]
+) {
+  if (!parent) {
+    return true
+  }
+
   // declaration id
   if (
     (parent.type === 'VariableDeclarator' ||