]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): compilation of slot v-if/else pikax/fix_perserve_whitespace 9448/head
authorCarlos Rodrigues <carlos@hypermob.co.uk>
Fri, 20 Oct 2023 13:29:42 +0000 (14:29 +0100)
committerCarlos Rodrigues <carlos@hypermob.co.uk>
Fri, 20 Oct 2023 13:29:42 +0000 (14:29 +0100)
packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap
packages/compiler-core/__tests__/transforms/vSlot.spec.ts
packages/compiler-core/src/transforms/vSlot.ts

index 0c8e061f9eff48fc083c7b212b80fe1617348b76..7c8837dd6b3723e19b211430c44cf4f15868d083 100644 (file)
@@ -215,6 +215,34 @@ return function render(_ctx, _cache) {
 }"
 `;
 
+exports[`compiler: transform component slots > template named v-if/else and whitespace preserve 1`] = `
+"const { toDisplayString: _toDisplayString, createTextVNode: _createTextVNode, resolveComponent: _resolveComponent, withCtx: _withCtx, createSlots: _createSlots, openBlock: _openBlock, createBlock: _createBlock } = Vue
+
+return function render(_ctx, _cache) {
+  const _component_Comp = _resolveComponent(\\"Comp\\")
+
+  return (_openBlock(), _createBlock(_component_Comp, null, _createSlots({ _: 2 /* DYNAMIC */ }, [
+    true
+      ? {
+          name: \\"one\\",
+          fn: _withCtx(() => [
+            _createTextVNode(_toDisplayString(_ctx.foo) + _toDisplayString(_ctx.bar), 1 /* TEXT */)
+          ]),
+          key: \\"0\\"
+        }
+      : true
+        ? {
+            name: \\"one\\",
+            fn: _withCtx(() => [
+              _createTextVNode(_toDisplayString(_ctx.foo) + _toDisplayString(_ctx.bar), 1 /* TEXT */)
+            ]),
+            key: \\"1\\"
+          }
+        : undefined
+  ]), 1024 /* DYNAMIC_SLOTS */))
+}"
+`;
+
 exports[`compiler: transform component slots > with whitespace: 'preserve' > implicit default slot 1`] = `
 "const { createElementVNode: _createElementVNode, resolveComponent: _resolveComponent, withCtx: _withCtx, openBlock: _openBlock, createBlock: _createBlock } = Vue
 
index bb3d9d2cfa3ad46bc7d51f9e46fa799c2a853ce8..f9cc50dd6cf663ab02886c53e91b5fb171dce054 100644 (file)
@@ -28,8 +28,14 @@ import { createObjectMatcher, genFlagText } from '../testUtils'
 import { PatchFlags } from '@vue/shared'
 import { transformFor } from '../../src/transforms/vFor'
 import { transformIf } from '../../src/transforms/vIf'
+import { transformText } from '../../src/transforms/transformText'
 
-function parseWithSlots(template: string, options: CompilerOptions = {}) {
+function parseWithSlots(
+  template: string,
+  options: CompilerOptions & {
+    appendNodeTransforms?: CompilerOptions['nodeTransforms']
+  } = {}
+) {
   const ast = parse(template, {
     whitespace: options.whitespace
   })
@@ -42,7 +48,8 @@ function parseWithSlots(template: string, options: CompilerOptions = {}) {
         : []),
       transformSlotOutlet,
       transformElement,
-      trackSlotScopes
+      trackSlotScopes,
+      ...(options.appendNodeTransforms ?? [])
     ],
     directiveTransforms: {
       on: transformOn,
@@ -234,6 +241,27 @@ describe('compiler: transform component slots', () => {
     expect(generate(root, { prefixIdentifiers: true }).code).toMatchSnapshot()
   })
 
+  // #6063 should not throw error
+  test('template named v-if/else and whitespace preserve', () => {
+    const { root } = parseWithSlots(
+      `<Comp>
+        <template v-if="true" #one>
+            {{ foo }}{{ bar }}
+        </template>
+        <template v-else="true" #one>
+            {{ foo }}{{ bar }}
+        </template>
+      </Comp>`,
+      {
+        whitespace: 'preserve',
+        prefixIdentifiers: true,
+        appendNodeTransforms: [transformText]
+      }
+    )
+
+    expect(generate(root, { prefixIdentifiers: true }).code).toMatchSnapshot()
+  })
+
   test('on component dynamically named slot', () => {
     const { root, slots } = parseWithSlots(
       `<Comp v-slot:[named]="{ foo }">{{ foo }}{{ bar }}</Comp>`,
index c4416dd45f77d188d67660635c5ae8427dba876d..ce71c8ff1484e3c03cd27680ac40ce8ac6d480f1 100644 (file)
@@ -223,6 +223,13 @@ export function buildSlots(
       let prev
       while (j--) {
         prev = children[j]
+        if (
+          prev.type === NodeTypes.TEXT_CALL &&
+          prev.content.type === NodeTypes.TEXT &&
+          prev.content.content === ' '
+        ) {
+          continue
+        }
         if (prev.type !== NodeTypes.COMMENT) {
           break
         }