@@ -3175,9 +3175,130 @@ describe('Vapor Mode hydration', () => {
3175
3175
expect ( teleport . targetAnchor ) . toBe ( teleportContainer . childNodes [ 2 ] )
3176
3176
} )
3177
3177
3178
- test ( 'nested' , async ( ) => { } )
3178
+ test ( 'nested' , async ( ) => {
3179
+ const teleportContainer = document . createElement ( 'div' )
3180
+ teleportContainer . id = 'teleport5'
3181
+ teleportContainer . innerHTML = `<!--teleport start anchor--><!--teleport start--><!--teleport end--><!--teleport anchor--><!--teleport start anchor--><div>child</div><!--teleport anchor-->`
3182
+ document . body . appendChild ( teleportContainer )
3183
+
3184
+ const { block, container } = await mountWithHydration (
3185
+ '<!--teleport start--><!--teleport end-->' ,
3186
+ `<teleport to="#teleport5">
3187
+ <teleport to="#teleport5"><div>child</div></teleport>
3188
+ </teleport>` ,
3189
+ )
3190
+
3191
+ const teleport = block as TeleportFragment
3192
+ expect ( teleport . anchor ) . toBe ( container . childNodes [ 1 ] )
3193
+ expect ( teleport . targetStart ) . toBe ( teleportContainer . childNodes [ 0 ] )
3194
+ expect ( teleport . targetAnchor ) . toBe ( teleportContainer . childNodes [ 3 ] )
3195
+
3196
+ const childTeleport = teleport . nodes as TeleportFragment
3197
+ expect ( childTeleport . anchor ) . toBe ( teleportContainer . childNodes [ 2 ] )
3198
+ expect ( childTeleport . targetStart ) . toBe ( teleportContainer . childNodes [ 4 ] )
3199
+ expect ( childTeleport . targetAnchor ) . toBe ( teleportContainer . childNodes [ 6 ] )
3200
+ expect ( childTeleport . nodes ) . toBe ( teleportContainer . childNodes [ 5 ] )
3201
+ } )
3202
+
3203
+ test ( 'unmount (full integration)' , async ( ) => {
3204
+ const data = ref ( {
3205
+ toggle : ref ( true ) ,
3206
+ } )
3207
+
3208
+ const comp1Code = `<Teleport to="#target">
3209
+ <span>Teleported Comp1</span>
3210
+ </Teleport>`
3211
+ const Comp1 = compile (
3212
+ `<template>${ comp1Code } </template>` ,
3213
+ data ,
3214
+ undefined ,
3215
+ {
3216
+ vapor : true ,
3217
+ ssr : false ,
3218
+ } ,
3219
+ )
3220
+ const ssrComp1 = compile (
3221
+ `<template>${ comp1Code } </template>` ,
3222
+ data ,
3223
+ undefined ,
3224
+ {
3225
+ vapor : true ,
3226
+ ssr : true ,
3227
+ } ,
3228
+ )
3229
+
3230
+ const comp2Code = `<div>Comp2</div>`
3231
+ const Comp2 = compile (
3232
+ `<template>${ comp2Code } </template>` ,
3233
+ data ,
3234
+ undefined ,
3235
+ {
3236
+ vapor : true ,
3237
+ ssr : false ,
3238
+ } ,
3239
+ )
3240
+ const ssrComp2 = compile (
3241
+ `<template>${ comp2Code } </template>` ,
3242
+ data ,
3243
+ undefined ,
3244
+ {
3245
+ vapor : true ,
3246
+ ssr : true ,
3247
+ } ,
3248
+ )
3179
3249
3180
- test ( 'unmount (full integration)' , async ( ) => { } )
3250
+ const appCode = `<div>
3251
+ <components.Comp1 v-if="data.toggle"/>
3252
+ <components.Comp2 v-else/>
3253
+ </div>`
3254
+
3255
+ const ssrApp = compile (
3256
+ `<template>${ appCode } </template>` ,
3257
+ data ,
3258
+ {
3259
+ Comp1 : ssrComp1 ,
3260
+ Comp2 : ssrComp2 ,
3261
+ } ,
3262
+ {
3263
+ vapor : true ,
3264
+ ssr : true ,
3265
+ } ,
3266
+ )
3267
+
3268
+ const teleportContainer = document . createElement ( 'div' )
3269
+ teleportContainer . id = 'target'
3270
+ document . body . appendChild ( teleportContainer )
3271
+
3272
+ const ctx = { } as any
3273
+ const mainHtml = await VueServerRenderer . renderToString (
3274
+ runtimeDom . createSSRApp ( ssrApp ) ,
3275
+ ctx ,
3276
+ )
3277
+ expect ( mainHtml ) . toBe (
3278
+ '<div><!--teleport start--><!--teleport end--></div>' ,
3279
+ )
3280
+ teleportContainer . innerHTML = ctx . teleports ! [ '#target' ]
3281
+
3282
+ const { container } = await mountWithHydration ( mainHtml , appCode , data , {
3283
+ Comp1,
3284
+ Comp2,
3285
+ } )
3286
+
3287
+ expect ( container . innerHTML ) . toBe (
3288
+ '<div><!--teleport start--><!--teleport end--><!--if--></div>' ,
3289
+ )
3290
+ expect ( teleportContainer . innerHTML ) . toBe (
3291
+ `<!--teleport start anchor-->` +
3292
+ `<span>Teleported Comp1</span>` +
3293
+ `<!--teleport anchor-->` ,
3294
+ )
3295
+ expect ( `Hydration children mismatch` ) . not . toHaveBeenWarned ( )
3296
+
3297
+ data . value . toggle = false
3298
+ await nextTick ( )
3299
+ expect ( container . innerHTML ) . toBe ( '<div><div>Comp2</div><!--if--></div>' )
3300
+ expect ( teleportContainer . innerHTML ) . toBe ( '' )
3301
+ } )
3181
3302
3182
3303
test ( 'unmount (mismatch + full integration)' , async ( ) => { } )
3183
3304
0 commit comments