| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import { Teleport, createApp, h } from 'vue'
- import { renderToString } from '../src/renderToString'
- import { renderToSimpleStream } from '../src/renderToStream'
- import type { SSRContext } from '../src/render'
- import { ssrRenderTeleport } from '../src/helpers/ssrRenderTeleport'
- describe('ssrRenderTeleport', () => {
- test('teleport rendering (compiled)', async () => {
- const ctx: SSRContext = {}
- const html = await renderToString(
- createApp({
- data() {
- return { msg: 'hello' }
- },
- ssrRender(_ctx, _push, _parent) {
- ssrRenderTeleport(
- _push,
- _push => {
- _push(`<div>content</div>`)
- },
- '#target',
- false,
- _parent,
- )
- },
- }),
- ctx,
- )
- expect(html).toBe('<!--teleport start--><!--teleport end-->')
- expect(ctx.teleports!['#target']).toBe(
- `<!--teleport start anchor--><div>content</div><!--teleport anchor-->`,
- )
- })
- test('teleport rendering (compiled + disabled)', async () => {
- const ctx: SSRContext = {}
- const html = await renderToString(
- createApp({
- data() {
- return { msg: 'hello' }
- },
- ssrRender(_ctx, _push, _parent) {
- ssrRenderTeleport(
- _push,
- _push => {
- _push(`<div>content</div>`)
- },
- '#target',
- true,
- _parent,
- )
- },
- }),
- ctx,
- )
- expect(html).toBe(
- '<!--teleport start--><div>content</div><!--teleport end-->',
- )
- expect(ctx.teleports!['#target']).toBe(
- `<!--teleport start anchor--><!--teleport anchor-->`,
- )
- })
- test('teleport rendering (vnode)', async () => {
- const ctx: SSRContext = {}
- const html = await renderToString(
- h(
- Teleport,
- {
- to: `#target`,
- },
- h('span', 'hello'),
- ),
- ctx,
- )
- expect(html).toBe('<!--teleport start--><!--teleport end-->')
- expect(ctx.teleports!['#target']).toBe(
- '<!--teleport start anchor--><span>hello</span><!--teleport anchor-->',
- )
- })
- test('teleport rendering (vnode + disabled)', async () => {
- const ctx: SSRContext = {}
- const html = await renderToString(
- h(
- Teleport,
- {
- to: `#target`,
- disabled: true,
- },
- h('span', 'hello'),
- ),
- ctx,
- )
- expect(html).toBe(
- '<!--teleport start--><span>hello</span><!--teleport end-->',
- )
- expect(ctx.teleports!['#target']).toBe(
- `<!--teleport start anchor--><!--teleport anchor-->`,
- )
- })
- test('multiple teleports with same target', async () => {
- const ctx: SSRContext = {}
- const html = await renderToString(
- h('div', [
- h(
- Teleport,
- {
- to: `#target`,
- },
- h('span', 'hello'),
- ),
- h(Teleport, { to: `#target` }, 'world'),
- ]),
- ctx,
- )
- expect(html).toBe(
- '<div><!--teleport start--><!--teleport end--><!--teleport start--><!--teleport end--></div>',
- )
- expect(ctx.teleports!['#target']).toBe(
- '<!--teleport start anchor--><span>hello</span><!--teleport anchor-->' +
- '<!--teleport start anchor-->world<!--teleport anchor-->',
- )
- })
- test('teleport inside async component', async () => {
- const ctx: SSRContext = {}
- const asyncComponent = {
- template: '<teleport to="#target"><div>content</div></teleport>',
- async setup() {},
- }
- const html = await renderToString(
- h({
- template: '<async-component />',
- components: { asyncComponent },
- }),
- ctx,
- )
- expect(html).toBe('<!--teleport start--><!--teleport end-->')
- expect(ctx.teleports!['#target']).toBe(
- `<!--teleport start anchor--><div>content</div><!--teleport anchor-->`,
- )
- })
- test('teleport inside async component (stream)', async () => {
- const ctx: SSRContext = {}
- const asyncComponent = {
- template: '<teleport to="#target"><div>content</div></teleport>',
- async setup() {},
- }
- let html = ''
- let resolve: any
- const p = new Promise(r => (resolve = r))
- renderToSimpleStream(
- h({
- template: '<async-component />',
- components: { asyncComponent },
- }),
- ctx,
- {
- push(chunk) {
- if (chunk === null) {
- resolve()
- } else {
- html += chunk
- }
- },
- destroy(err) {
- throw err
- },
- },
- )
- await p
- expect(html).toBe('<!--teleport start--><!--teleport end-->')
- expect(ctx.teleports!['#target']).toBe(
- `<!--teleport start anchor--><div>content</div><!--teleport anchor-->`,
- )
- })
- })
|