11import {
22 type LooseRawProps ,
33 type VaporComponent ,
4- createComponent as originalCreateComponent ,
4+ createComponent as createComp ,
55} from '../../src/component'
66import {
77 type VaporDirective ,
@@ -12,7 +12,6 @@ import {
1212 template ,
1313 withVaporDirectives ,
1414} from '@vue/runtime-vapor'
15-
1615import { makeRender } from '../_utils'
1716import {
1817 nextTick ,
@@ -23,6 +22,10 @@ import {
2322 shallowRef ,
2423} from 'vue'
2524
25+ import type { HMRRuntime } from '@vue/runtime-dom'
26+ declare var __VUE_HMR_RUNTIME__ : HMRRuntime
27+ const { createRecord, rerender, reload } = __VUE_HMR_RUNTIME__
28+
2629const define = makeRender ( )
2730
2831describe ( 'renderer: VaporTeleport' , ( ) => {
@@ -33,6 +36,141 @@ describe('renderer: VaporTeleport', () => {
3336 describe ( 'defer mode' , ( ) => {
3437 runSharedTests ( true )
3538 } )
39+
40+ describe ( 'HMR' , ( ) => {
41+ test ( 'rerender' , async ( ) => {
42+ const target = document . createElement ( 'div' )
43+ const root = document . createElement ( 'div' )
44+ const childId = 'test1-child'
45+ const parentId = 'test1-parent'
46+
47+ const { component : Child } = define ( {
48+ __hmrId : childId ,
49+ render ( ) {
50+ return template ( '<div>teleported</div>' ) ( )
51+ } ,
52+ } )
53+ createRecord ( childId , Child as any )
54+
55+ const { mount, component : Parent } = define ( {
56+ __hmrId : parentId ,
57+ render ( ) {
58+ const n0 = createComp (
59+ VaporTeleport ,
60+ {
61+ to : ( ) => target ,
62+ } ,
63+ {
64+ default : ( ) => createComp ( Child ) ,
65+ } ,
66+ )
67+ const n1 = template ( '<div>root</div>' ) ( )
68+ return [ n0 , n1 ]
69+ } ,
70+ } ) . create ( )
71+ createRecord ( parentId , Parent as any )
72+ mount ( root )
73+
74+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
75+ expect ( target . innerHTML ) . toBe ( '<div>teleported</div>' )
76+
77+ // rerender child
78+ rerender ( childId , ( ) => {
79+ return template ( '<div>teleported 2</div>' ) ( )
80+ } )
81+
82+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
83+ expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
84+
85+ // rerender parent
86+ rerender ( parentId , ( ) => {
87+ const n0 = createComp (
88+ VaporTeleport ,
89+ {
90+ to : ( ) => target ,
91+ } ,
92+ {
93+ default : ( ) => createComp ( Child ) ,
94+ } ,
95+ )
96+ const n1 = template ( '<div>root 2</div>' ) ( )
97+ return [ n0 , n1 ]
98+ } )
99+
100+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root 2</div>' )
101+ expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
102+ } )
103+
104+ test ( 'reload' , async ( ) => {
105+ const target = document . createElement ( 'div' )
106+ const root = document . createElement ( 'div' )
107+ const childId = 'test2-child'
108+ const parentId = 'test2-parent'
109+
110+ const { component : Child } = define ( {
111+ __hmrId : childId ,
112+ render ( ) {
113+ return template ( '<div>teleported</div>' ) ( )
114+ } ,
115+ } )
116+ createRecord ( childId , Child as any )
117+
118+ const { mount, component : Parent } = define ( {
119+ __hmrId : parentId ,
120+ render ( ) {
121+ const n0 = createComp (
122+ VaporTeleport ,
123+ {
124+ to : ( ) => target ,
125+ } ,
126+ {
127+ default : ( ) => createComp ( Child ) ,
128+ } ,
129+ )
130+ const n1 = template ( '<div>root</div>' ) ( )
131+ return [ n0 , n1 ]
132+ } ,
133+ } ) . create ( )
134+ createRecord ( parentId , Parent as any )
135+ mount ( root )
136+
137+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
138+ expect ( target . innerHTML ) . toBe ( '<div>teleported</div>' )
139+
140+ // reload child
141+ reload ( childId , {
142+ __hmrId : childId ,
143+ __vapor : true ,
144+ render ( ) {
145+ return template ( '<div>teleported 2</div>' ) ( )
146+ } ,
147+ } )
148+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
149+ expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
150+
151+ // reload parent
152+ reload ( parentId , {
153+ __hmrId : parentId ,
154+ __vapor : true ,
155+ render ( ) {
156+ const n0 = createComp (
157+ VaporTeleport ,
158+ {
159+ to : ( ) => target ,
160+ } ,
161+ {
162+ default : ( ) => createComp ( Child ) ,
163+ } ,
164+ )
165+ const n1 = template ( '<div>root 2</div>' ) ( )
166+ return [ n0 , n1 ]
167+ } ,
168+ } )
169+
170+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root 2</div>' )
171+ expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
172+ } )
173+ } )
36174} )
37175
38176function runSharedTests ( deferMode : boolean ) : void {
@@ -45,9 +183,9 @@ function runSharedTests(deferMode: boolean): void {
45183 if ( component === VaporTeleport ) {
46184 rawProps ! . defer = ( ) => true
47185 }
48- return originalCreateComponent ( component , rawProps , ...args )
186+ return createComp ( component , rawProps , ...args )
49187 }
50- : originalCreateComponent
188+ : createComp
51189
52190 test ( 'should work' , ( ) => {
53191 const target = document . createElement ( 'div' )
0 commit comments