]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): add check when v-else-if is behind v-else (#4603)
author就是喜欢陈粒 <cheng_deeplove@163.com>
Tue, 21 Sep 2021 16:59:38 +0000 (00:59 +0800)
committerGitHub <noreply@github.com>
Tue, 21 Sep 2021 16:59:38 +0000 (12:59 -0400)
packages/compiler-core/__tests__/transforms/vIf.spec.ts
packages/compiler-core/src/errors.ts
packages/compiler-core/src/transforms/vIf.ts

index dcf8d1860017966cd0830eb11b823fcf49d2049f..5c36885670fa70a0c213bcea418f48f3d86262b9 100644 (file)
@@ -248,7 +248,7 @@ describe('compiler: v-if', () => {
       ])
     })
 
-    test('error on v-else-if missing adjacent v-if', () => {
+    test('error on v-else-if missing adjacent v-if or v-else-if', () => {
       const onError = jest.fn()
 
       const { node: node1 } = parseWithIfTransform(`<div v-else-if="foo"/>`, {
@@ -284,6 +284,21 @@ describe('compiler: v-if', () => {
           loc: node3.loc
         }
       ])
+
+      const {
+        node: { branches }
+      } = parseWithIfTransform(
+        `<div v-if="notOk"/><div v-else/><div v-else-if="ok"/>`,
+        { onError },
+        0
+      )
+
+      expect(onError.mock.calls[3]).toMatchObject([
+        {
+          code: ErrorCodes.X_V_ELSE_NO_ADJACENT_IF,
+          loc: branches[branches.length - 1].loc
+        }
+      ])
     })
 
     test('error on user key', () => {
index 1f2afac7e668e8020d4bd48ccd094c0f98f98999..a6f2f3f8566456928eb6c5dac91e2f9b10891686 100644 (file)
@@ -149,7 +149,7 @@ export const errorMessages: Record<ErrorCodes, string> = {
   // transform errors
   [ErrorCodes.X_V_IF_NO_EXPRESSION]: `v-if/v-else-if is missing expression.`,
   [ErrorCodes.X_V_IF_SAME_KEY]: `v-if/else branches must use unique keys.`,
-  [ErrorCodes.X_V_ELSE_NO_ADJACENT_IF]: `v-else/v-else-if has no adjacent v-if.`,
+  [ErrorCodes.X_V_ELSE_NO_ADJACENT_IF]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
   [ErrorCodes.X_V_FOR_NO_EXPRESSION]: `v-for is missing expression.`,
   [ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION]: `v-for has invalid expression.`,
   [ErrorCodes.X_V_FOR_TEMPLATE_KEY_PLACEMENT]: `<template v-for> key should be placed on the <template> tag.`,
index 0c18597d2ebb75e80b7121b7be33f7e52f38c34e..71050a856435209542e86ea4eaf3d254da976294 100644 (file)
@@ -145,6 +145,16 @@ export function processIf(
       }
 
       if (sibling && sibling.type === NodeTypes.IF) {
+        // Check if v-else was followed by v-else-if
+        if (
+          dir.name === 'else-if' &&
+          sibling.branches[sibling.branches.length - 1].condition === undefined
+        ) {
+          context.onError(
+            createCompilerError(ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, node.loc)
+          )
+        }
+
         // move the node to the if node's branches
         context.removeNode()
         const branch = createIfBranch(node, dir)