File tree Expand file tree Collapse file tree 3 files changed +37
-1
lines changed Expand file tree Collapse file tree 3 files changed +37
-1
lines changed Original file line number Diff line number Diff line change 4
4
5
5
import { createApp , h , Teleport } from 'vue'
6
6
import { renderToString } from '../src/renderToString'
7
+ import { renderToSimpleStream } from '../src/renderToStream'
7
8
import { SSRContext } from '../src/render'
8
9
import { ssrRenderTeleport } from '../src/helpers/ssrRenderTeleport'
9
10
@@ -134,4 +135,37 @@ describe('ssrRenderTeleport', () => {
134
135
expect ( html ) . toBe ( '<!--teleport start--><!--teleport end-->' )
135
136
expect ( ctx . teleports ! [ '#target' ] ) . toBe ( `<div>content</div><!---->` )
136
137
} )
138
+
139
+ test ( 'teleport inside async component (stream)' , async ( ) => {
140
+ const ctx : SSRContext = { }
141
+ const asyncComponent = {
142
+ template : '<teleport to="#target"><div>content</div></teleport>' ,
143
+ async setup ( ) { }
144
+ }
145
+ let html = ''
146
+ let resolve : any
147
+ const p = new Promise ( r => ( resolve = r ) )
148
+ renderToSimpleStream (
149
+ h ( {
150
+ template : '<async-component />' ,
151
+ components : { asyncComponent }
152
+ } ) ,
153
+ ctx ,
154
+ {
155
+ push ( chunk ) {
156
+ if ( chunk === null ) {
157
+ resolve ( )
158
+ } else {
159
+ html += chunk
160
+ }
161
+ } ,
162
+ destroy ( err ) {
163
+ throw err
164
+ }
165
+ }
166
+ )
167
+ await p
168
+ expect ( html ) . toBe ( '<!--teleport start--><!--teleport end-->' )
169
+ expect ( ctx . teleports ! [ '#target' ] ) . toBe ( `<div>content</div><!---->` )
170
+ } )
137
171
} )
Original file line number Diff line number Diff line change 9
9
import { isString , isPromise } from '@vue/shared'
10
10
import { renderComponentVNode , SSRBuffer , SSRContext } from './render'
11
11
import { Readable , Writable } from 'stream'
12
+ import { resolveTeleports } from './renderToString'
12
13
13
14
const { isVNode } = ssrUtils
14
15
@@ -74,6 +75,7 @@ export function renderToSimpleStream<T extends SimpleReadable>(
74
75
75
76
Promise . resolve ( renderComponentVNode ( vnode ) )
76
77
. then ( buffer => unrollBuffer ( buffer , stream ) )
78
+ . then ( ( ) => resolveTeleports ( context ) )
77
79
. then ( ( ) => stream . push ( null ) )
78
80
. catch ( error => {
79
81
stream . destroy ( error )
Original file line number Diff line number Diff line change @@ -70,7 +70,7 @@ export async function renderToString(
70
70
return result
71
71
}
72
72
73
- async function resolveTeleports ( context : SSRContext ) {
73
+ export async function resolveTeleports ( context : SSRContext ) {
74
74
if ( context . __teleportBuffers ) {
75
75
context . teleports = context . teleports || { }
76
76
for ( const key in context . __teleportBuffers ) {
You can’t perform that action at this time.
0 commit comments