]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: update directive scope variable mapping
authorEvan You <yyx990803@gmail.com>
Wed, 25 Nov 2020 00:04:03 +0000 (19:04 -0500)
committerEvan You <yyx990803@gmail.com>
Wed, 25 Nov 2020 00:04:21 +0000 (19:04 -0500)
packages/compiler-core/src/transforms/transformElement.ts
packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript.spec.ts

index c9d1a3ee40502843453d5185eec46fa6fb1210b3..ca1ae9d1be32158e1cd00a2a1ab0e4769b73b9d8 100644 (file)
@@ -257,11 +257,7 @@ export function resolveComponentType(
   // this is skipped in browser build since browser builds do not perform
   // binding analysis.
   if (!__BROWSER__) {
-    const fromSetup = resolveSetupReference(
-      tag,
-      capitalize(camelize(tag)),
-      context
-    )
+    const fromSetup = resolveSetupReference(tag, context)
     if (fromSetup) {
       return fromSetup
     }
@@ -273,22 +269,23 @@ export function resolveComponentType(
   return toValidAssetId(tag, `component`)
 }
 
-function resolveSetupReference(
-  name: string,
-  interopName: string,
-  context: TransformContext
-) {
+function resolveSetupReference(name: string, context: TransformContext) {
   const bindings = context.bindingMetadata
   if (!bindings) {
     return
   }
 
+  const camelName = camelize(name)
+  const PascalName = capitalize(camelName)
   const checkType = (type: BindingTypes) => {
     if (bindings[name] === type) {
       return name
     }
-    if (bindings[interopName] === type) {
-      return interopName
+    if (bindings[camelName] === type) {
+      return camelName
+    }
+    if (bindings[PascalName] === type) {
+      return PascalName
     }
   }
 
@@ -615,15 +612,7 @@ function buildDirectiveArgs(
   } else {
     // user directive.
     // see if we have directives exposed via <script setup>
-    const fromSetup =
-      !__BROWSER__ &&
-      resolveSetupReference(
-        dir.name,
-        // v-my-dir -> vMyDir
-        'v' + capitalize(camelize(dir.name)),
-        context
-      )
-
+    const fromSetup = !__BROWSER__ && resolveSetupReference(dir.name, context)
     if (fromSetup) {
       dirArgs.push(fromSetup)
     } else {
index f925826c56b17f860acd0fc1639d4fd77f8a7e44..662693d243d86109d25b42791cf2b88ce553a5f3 100644 (file)
@@ -224,7 +224,7 @@ exports[`SFC compile <script setup> inlineTemplate mode referencing scope compon
 
 import ChildComp from './Child.vue'
         import SomeOtherComp from './Other.vue'
-        import vMyDir from './my-dir'
+        import myDir from './my-dir'
         
 export default {
   expose: [],
@@ -234,7 +234,7 @@ export default {
 return (_ctx, _cache) => {
   return (_openBlock(), _createBlock(_Fragment, null, [
     _withDirectives(_createVNode(\\"div\\", null, null, 512 /* NEED_PATCH */), [
-      [_unref(vMyDir)]
+      [_unref(myDir)]
     ]),
     _createVNode(ChildComp),
     _createVNode(SomeOtherComp)
index 624ae425c1e6d178f66c1963e9ff7606dcbe29e8..66b46b7dcfd556e4bb6e589b72f7f6c22eb21b9d 100644 (file)
@@ -192,7 +192,7 @@ const myEmit = defineEmit(['foo', 'bar'])
         <script setup>
         import ChildComp from './Child.vue'
         import SomeOtherComp from './Other.vue'
-        import vMyDir from './my-dir'
+        import myDir from './my-dir'
         </script>
         <template>
           <div v-my-dir></div>
@@ -202,7 +202,7 @@ const myEmit = defineEmit(['foo', 'bar'])
         `,
         { inlineTemplate: true }
       )
-      expect(content).toMatch('[_unref(vMyDir)]')
+      expect(content).toMatch('[_unref(myDir)]')
       expect(content).toMatch('_createVNode(ChildComp)')
       // kebab-case component support
       expect(content).toMatch('_createVNode(SomeOtherComp)')