Browse Source

fix(compiler-core): prevent generating invalid code for v-bind with empty expression (#1720)

underfin 5 years ago
parent
commit
d4527230e4

+ 12 - 1
packages/compiler-core/__tests__/transforms/vBind.spec.ts

@@ -83,7 +83,8 @@ describe('compiler: transform v-bind', () => {
 
   test('should error if no expression', () => {
     const onError = jest.fn()
-    parseWithVBind(`<div v-bind:arg />`, { onError })
+    const node = parseWithVBind(`<div v-bind:arg />`, { onError })
+    const props = (node.codegenNode as VNodeCall).props as ObjectExpression
     expect(onError.mock.calls[0][0]).toMatchObject({
       code: ErrorCodes.X_V_BIND_NO_EXPRESSION,
       loc: {
@@ -97,6 +98,16 @@ describe('compiler: transform v-bind', () => {
         }
       }
     })
+    expect(props.properties[0]).toMatchObject({
+      key: {
+        content: `arg`,
+        isStatic: true
+      },
+      value: {
+        content: ``,
+        isStatic: true
+      }
+    })
   })
 
   test('.camel modifier', () => {

+ 12 - 6
packages/compiler-core/src/transforms/vBind.ts

@@ -10,9 +10,6 @@ import { CAMELIZE } from '../runtimeHelpers'
 export const transformBind: DirectiveTransform = (dir, node, context) => {
   const { exp, modifiers, loc } = dir
   const arg = dir.arg!
-  if (!exp || (exp.type === NodeTypes.SIMPLE_EXPRESSION && !exp.content)) {
-    context.onError(createCompilerError(ErrorCodes.X_V_BIND_NO_EXPRESSION, loc))
-  }
   // .prop is no longer necessary due to new patch behavior
   // .sync is replaced by v-model:arg
   if (modifiers.includes('camel')) {
@@ -27,9 +24,18 @@ export const transformBind: DirectiveTransform = (dir, node, context) => {
       arg.children.push(`)`)
     }
   }
+
+  if (
+    !exp ||
+    (exp.type === NodeTypes.SIMPLE_EXPRESSION && !exp.content.trim())
+  ) {
+    context.onError(createCompilerError(ErrorCodes.X_V_BIND_NO_EXPRESSION, loc))
+    return {
+      props: [createObjectProperty(arg!, createSimpleExpression('', true, loc))]
+    }
+  }
+
   return {
-    props: [
-      createObjectProperty(arg!, exp || createSimpleExpression('', true, loc))
-    ]
+    props: [createObjectProperty(arg!, exp)]
   }
 }