@@ -3175,9 +3175,130 @@ describe('Vapor Mode hydration', () => {
31753175 expect ( teleport . targetAnchor ) . toBe ( teleportContainer . childNodes [ 2 ] )
31763176 } )
31773177
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+ )
31793249
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+ } )
31813302
31823303 test ( 'unmount (mismatch + full integration)' , async ( ) => { } )
31833304
0 commit comments