import { createApp, defineAsyncComponent, h } from 'vue'
import { renderToString } from '../src/renderToString'
const components = {
one: {
template: `
`,
},
}
describe('ssr: slot', () => {
test('text slot', async () => {
expect(
await renderToString(
createApp({
components,
template: `hello`,
}),
),
).toBe(`hello
`)
})
test('element slot', async () => {
expect(
await renderToString(
createApp({
components,
template: `hi
`,
}),
),
).toBe(``)
})
test('empty slot', async () => {
expect(
await renderToString(
createApp({
components: {
one: {
template: `
`,
},
},
template: ``,
}),
),
).toBe(``)
})
test('empty slot (manual comments)', async () => {
expect(
await renderToString(
createApp({
components: {
one: {
template: `
`,
},
},
template: ``,
}),
),
).toBe(``)
})
test('empty slot (multi-line comments)', async () => {
expect(
await renderToString(
createApp({
components: {
one: {
template: `
`,
},
},
template: ``,
}),
),
).toBe(``)
})
test('multiple elements', async () => {
expect(
await renderToString(
createApp({
components,
template: `one
two
`,
}),
),
).toBe(``)
})
test('fragment slot (template v-if)', async () => {
expect(
await renderToString(
createApp({
components,
template: `hello`,
}),
),
).toBe(`hello
`)
})
test('fragment slot (template v-if + multiple elements)', async () => {
expect(
await renderToString(
createApp({
components,
template: `one
two
`,
}),
),
).toBe(
``,
)
})
test('transition slot', async () => {
const ReusableTransition = {
template: ``,
}
const ReusableTransitionWithAppear = {
template: ``,
}
expect(
await renderToString(
createApp({
components: {
one: ReusableTransition,
},
template: `foo
`,
}),
),
).toBe(``)
expect(await renderToString(createApp(ReusableTransition))).toBe(``)
expect(await renderToString(createApp(ReusableTransitionWithAppear))).toBe(
``,
)
expect(
await renderToString(
createApp({
components: {
one: ReusableTransition,
},
template: ``,
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
components: {
one: ReusableTransitionWithAppear,
},
template: ``,
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransition, null, {
default: () => null,
})
},
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransitionWithAppear, null, {
default: () => null,
})
},
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransitionWithAppear, null, {
default: () => [],
})
},
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransition, null, {
default: () => [],
})
},
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
components: {
one: ReusableTransition,
},
template: `foo
`,
}),
),
).toBe(`foo
`)
})
// #9933
test('transition-group slot', async () => {
expect(
await renderToString(
createApp({
components: {
one: {
template: ``,
},
},
template: `{{i}}
`,
}),
),
).toBe(``)
})
// #12438
test('async component slot with v-if true', async () => {
const Layout = defineAsyncComponent(() =>
Promise.resolve({
template: `default header
`,
}),
)
const LayoutLoader = {
setup(_: any, context: any) {
return () => h(Layout, {}, context.slots)
},
}
expect(
await renderToString(
createApp({
components: {
LayoutLoader,
},
template: `
new header
`,
}),
),
).toBe(` new header
`)
})
// #11326
test('dynamic component slot', async () => {
expect(
await renderToString(
createApp({
components: {
ButtonComp: {
template: ``,
},
Wrap: {
template: `
`,
},
},
template: `hello
`,
}),
),
).toBe(``)
expect(
await renderToString(
createApp({
components: {
ButtonComp: {
template: ``,
},
Wrap: {
template: `
`,
},
},
template: `hello
`,
}),
),
).toBe(
``,
)
expect(
await renderToString(
createApp({
components: {
ButtonComp: {
template: ``,
},
},
template: `hello`,
}),
),
).toBe(``)
})
})