Skip to content

Commit 340d140

Browse files
committed
test: add tests
1 parent dde7076 commit 340d140

File tree

4 files changed

+176
-7
lines changed

4 files changed

+176
-7
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,97 @@ export function render(_ctx) {
103103
}"
104104
`;
105105

106+
exports[`compiler: transform slot > forwarded slots > <slot w/ nested component> 1`] = `
107+
"import { forwardedSlotCreator as _forwardedSlotCreator, resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
108+
109+
export function render(_ctx) {
110+
const _createForwardedSlot = _forwardedSlotCreator()
111+
const _component_Comp = _resolveComponent("Comp")
112+
const n2 = _createComponentWithFallback(_component_Comp, null, {
113+
"default": () => {
114+
const n1 = _createComponentWithFallback(_component_Comp, null, {
115+
"default": () => {
116+
const n0 = _createForwardedSlot("default", null)
117+
return n0
118+
}
119+
})
120+
return n1
121+
}
122+
}, true)
123+
return n2
124+
}"
125+
`;
126+
127+
exports[`compiler: transform slot > forwarded slots > <slot> tag only 1`] = `
128+
"import { forwardedSlotCreator as _forwardedSlotCreator, resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
129+
130+
export function render(_ctx) {
131+
const _createForwardedSlot = _forwardedSlotCreator()
132+
const _component_Comp = _resolveComponent("Comp")
133+
const n1 = _createComponentWithFallback(_component_Comp, null, {
134+
"default": () => {
135+
const n0 = _createForwardedSlot("default", null)
136+
return n0
137+
}
138+
}, true)
139+
return n1
140+
}"
141+
`;
142+
143+
exports[`compiler: transform slot > forwarded slots > <slot> tag w/ template 1`] = `
144+
"import { forwardedSlotCreator as _forwardedSlotCreator, resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
145+
146+
export function render(_ctx) {
147+
const _createForwardedSlot = _forwardedSlotCreator()
148+
const _component_Comp = _resolveComponent("Comp")
149+
const n2 = _createComponentWithFallback(_component_Comp, null, {
150+
"default": () => {
151+
const n0 = _createForwardedSlot("default", null)
152+
return n0
153+
}
154+
}, true)
155+
return n2
156+
}"
157+
`;
158+
159+
exports[`compiler: transform slot > forwarded slots > <slot> tag w/ v-for 1`] = `
160+
"import { forwardedSlotCreator as _forwardedSlotCreator, resolveComponent as _resolveComponent, createFor as _createFor, createComponentWithFallback as _createComponentWithFallback } from 'vue';
161+
162+
export function render(_ctx) {
163+
const _createForwardedSlot = _forwardedSlotCreator()
164+
const _component_Comp = _resolveComponent("Comp")
165+
const n3 = _createComponentWithFallback(_component_Comp, null, {
166+
"default": () => {
167+
const n0 = _createFor(() => (_ctx.b), (_for_item0) => {
168+
const n2 = _createForwardedSlot("default", null)
169+
return n2
170+
})
171+
return n0
172+
}
173+
}, true)
174+
return n3
175+
}"
176+
`;
177+
178+
exports[`compiler: transform slot > forwarded slots > <slot> tag w/ v-if 1`] = `
179+
"import { forwardedSlotCreator as _forwardedSlotCreator, resolveComponent as _resolveComponent, createIf as _createIf, createComponentWithFallback as _createComponentWithFallback } from 'vue';
180+
181+
export function render(_ctx) {
182+
const _createForwardedSlot = _forwardedSlotCreator()
183+
const _component_Comp = _resolveComponent("Comp")
184+
const n3 = _createComponentWithFallback(_component_Comp, null, {
185+
"default": () => {
186+
const n0 = _createIf(() => (_ctx.ok), () => {
187+
const n2 = _createForwardedSlot("default", null)
188+
return n2
189+
})
190+
return n0
191+
}
192+
}, true)
193+
return n3
194+
}"
195+
`;
196+
106197
exports[`compiler: transform slot > implicit default slot 1`] = `
107198
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
108199
const t0 = _template("<div></div>")

packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,35 @@ describe('compiler: transform slot', () => {
409409
})
410410
})
411411

412+
describe('forwarded slots', () => {
413+
test('<slot> tag only', () => {
414+
const { code } = compileWithSlots(`<Comp><slot/></Comp>`)
415+
expect(code).toMatchSnapshot()
416+
})
417+
418+
test('<slot> tag w/ v-if', () => {
419+
const { code } = compileWithSlots(`<Comp><slot v-if="ok"/></Comp>`)
420+
expect(code).toMatchSnapshot()
421+
})
422+
423+
test('<slot> tag w/ v-for', () => {
424+
const { code } = compileWithSlots(`<Comp><slot v-for="a in b"/></Comp>`)
425+
expect(code).toMatchSnapshot()
426+
})
427+
428+
test('<slot> tag w/ template', () => {
429+
const { code } = compileWithSlots(
430+
`<Comp><template #default><slot/></template></Comp>`,
431+
)
432+
expect(code).toMatchSnapshot()
433+
})
434+
435+
test('<slot w/ nested component>', () => {
436+
const { code } = compileWithSlots(`<Comp><Comp><slot/></Comp></Comp>`)
437+
expect(code).toMatchSnapshot()
438+
})
439+
})
440+
412441
describe('errors', () => {
413442
test('error on extraneous children w/ named default slot', () => {
414443
const onError = vi.fn()

packages/compiler-vapor/src/transforms/transformSlotOutlet.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,9 @@ export const transformSlotOutlet: NodeTransform = (node, context) => {
100100
}
101101

102102
return () => {
103-
let forwarded = false
104-
const slotNode = context.block.node
105-
if (slotNode.type === NodeTypes.ELEMENT) {
106-
forwarded = hasForwardedSlots(slotNode.children)
107-
}
103+
const { node } = context.block
104+
const forwarded =
105+
node.type === NodeTypes.ELEMENT ? hasForwardedSlots(node.children) : false
108106
if (forwarded) context.ir.hasForwardedSlot = true
109107

110108
exitBlock && exitBlock()
@@ -141,7 +139,6 @@ function createFallback(
141139
return [fallback, exitBlock]
142140
}
143141

144-
// TODO
145142
function hasForwardedSlots(children: TemplateChildNode[]): boolean {
146143
for (let i = 0; i < children.length; i++) {
147144
const child = children[i]

packages/runtime-vapor/__tests__/componentSlots.spec.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
createSlot,
88
createVaporApp,
99
defineVaporComponent,
10+
forwardedSlotCreator,
1011
insert,
1112
prepend,
1213
renderEffect,
@@ -15,7 +16,7 @@ import {
1516
import { currentInstance, nextTick, ref } from '@vue/runtime-dom'
1617
import { makeRender } from './_utils'
1718
import type { DynamicSlot } from '../src/componentSlots'
18-
import { setElementText } from '../src/dom/prop'
19+
import { setElementText, setText } from '../src/dom/prop'
1920

2021
const define = makeRender<any>()
2122

@@ -503,4 +504,55 @@ describe('component: slots', () => {
503504
expect(host.innerHTML).toBe('<div><h1></h1><!--slot--></div>')
504505
})
505506
})
507+
508+
describe('forwarded slot', () => {
509+
test('should work', async () => {
510+
const Child = defineVaporComponent({
511+
setup() {
512+
return createSlot('foo', null)
513+
},
514+
})
515+
const Parent = defineVaporComponent({
516+
setup() {
517+
const createForwardedSlot = forwardedSlotCreator()
518+
const n2 = createComponent(
519+
Child,
520+
null,
521+
{
522+
foo: () => {
523+
return createForwardedSlot('foo', null)
524+
},
525+
},
526+
true,
527+
)
528+
return n2
529+
},
530+
})
531+
532+
const foo = ref('foo')
533+
const { host } = define({
534+
setup() {
535+
const n2 = createComponent(
536+
Parent,
537+
null,
538+
{
539+
foo: () => {
540+
const n0 = template(' ')() as any
541+
renderEffect(() => setText(n0, foo.value))
542+
return n0
543+
},
544+
},
545+
true,
546+
)
547+
return n2
548+
},
549+
}).render()
550+
551+
expect(host.innerHTML).toBe('foo<!--slot--><!--slot-->')
552+
553+
foo.value = 'bar'
554+
await nextTick()
555+
expect(host.innerHTML).toBe('bar<!--slot--><!--slot-->')
556+
})
557+
})
506558
})

0 commit comments

Comments
 (0)