Parcourir la source

fix(compiler-sfc): fix local var access check for bindings in normal script

fix #4644
Evan You il y a 4 ans
Parent
commit
6d6cc90912

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

@@ -1181,6 +1181,19 @@ const emit = defineEmits(['a', 'b'])
         defineEmits([bar])
         defineEmits([bar])
         </script>`)
         </script>`)
       ).toThrow(`cannot reference locally declared variables`)
       ).toThrow(`cannot reference locally declared variables`)
+
+      // #4644
+      expect(() =>
+        compile(`
+        <script>const bar = 1</script>
+        <script setup>
+        defineProps({
+          foo: {
+            default: () => bar
+          }
+        })
+        </script>`)
+      ).not.toThrow(`cannot reference locally declared variables`)
     })
     })
 
 
     test('should allow defineProps/Emit() referencing scope var', () => {
     test('should allow defineProps/Emit() referencing scope var', () => {

+ 11 - 4
packages/compiler-sfc/src/compileScript.ts

@@ -239,6 +239,7 @@ export function compileScript(
   const helperImports: Set<string> = new Set()
   const helperImports: Set<string> = new Set()
   const userImports: Record<string, ImportBinding> = Object.create(null)
   const userImports: Record<string, ImportBinding> = Object.create(null)
   const userImportAlias: Record<string, string> = Object.create(null)
   const userImportAlias: Record<string, string> = Object.create(null)
+  const scriptBindings: Record<string, BindingTypes> = Object.create(null)
   const setupBindings: Record<string, BindingTypes> = Object.create(null)
   const setupBindings: Record<string, BindingTypes> = Object.create(null)
 
 
   let defaultExport: Node | undefined
   let defaultExport: Node | undefined
@@ -739,7 +740,7 @@ export function compileScript(
           }
           }
         }
         }
         if (node.declaration) {
         if (node.declaration) {
-          walkDeclaration(node.declaration, setupBindings, userImportAlias)
+          walkDeclaration(node.declaration, scriptBindings, userImportAlias)
         }
         }
       } else if (
       } else if (
         (node.type === 'VariableDeclaration' ||
         (node.type === 'VariableDeclaration' ||
@@ -747,7 +748,7 @@ export function compileScript(
           node.type === 'ClassDeclaration') &&
           node.type === 'ClassDeclaration') &&
         !node.declare
         !node.declare
       ) {
       ) {
-        walkDeclaration(node, setupBindings, userImportAlias)
+        walkDeclaration(node, scriptBindings, userImportAlias)
       }
       }
     }
     }
 
 
@@ -1070,6 +1071,9 @@ export function compileScript(
         ? BindingTypes.SETUP_CONST
         ? BindingTypes.SETUP_CONST
         : BindingTypes.SETUP_MAYBE_REF
         : BindingTypes.SETUP_MAYBE_REF
   }
   }
+  for (const key in scriptBindings) {
+    bindingMetadata[key] = scriptBindings[key]
+  }
   for (const key in setupBindings) {
   for (const key in setupBindings) {
     bindingMetadata[key] = setupBindings[key]
     bindingMetadata[key] = setupBindings[key]
   }
   }
@@ -1198,8 +1202,11 @@ export function compileScript(
       returned = `() => {}`
       returned = `() => {}`
     }
     }
   } else {
   } else {
-    // return bindings from setup
-    const allBindings: Record<string, any> = { ...setupBindings }
+    // return bindings from script and script setup
+    const allBindings: Record<string, any> = {
+      ...scriptBindings,
+      ...setupBindings
+    }
     for (const key in userImports) {
     for (const key in userImports) {
       if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
       if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
         allBindings[key] = true
         allBindings[key] = true