@@ -12,10 +12,11 @@ import {
12
12
} from 'vue'
13
13
import { renderToString } from '@vue/server-renderer'
14
14
15
- type TestCaseFactory = ( ) => [ App , Promise < any > [ ] ]
15
+ type FactoryRes = [ App , Promise < any > [ ] ]
16
+ type TestCaseFactory = ( ) => FactoryRes | Promise < FactoryRes >
16
17
17
18
async function runOnClient ( factory : TestCaseFactory ) {
18
- const [ app , deps ] = factory ( )
19
+ const [ app , deps ] = await factory ( )
19
20
const root = document . createElement ( 'div' )
20
21
app . mount ( root )
21
22
await Promise . all ( deps )
@@ -24,7 +25,7 @@ async function runOnClient(factory: TestCaseFactory) {
24
25
}
25
26
26
27
async function runOnServer ( factory : TestCaseFactory ) {
27
- const [ app , _ ] = factory ( )
28
+ const [ app , _ ] = await factory ( )
28
29
return ( await renderToString ( app ) )
29
30
. replace ( / < ! - - [ \[ \] ] - - > / g, '' ) // remove fragment wrappers
30
31
. trim ( )
@@ -95,8 +96,8 @@ describe('useId', () => {
95
96
'v:0-0 v:0-1 ' + // inside first async subtree
96
97
'v:1-0 v:1-1' // inside second async subtree
97
98
// assert different async resolution order does not affect id stable-ness
98
- expect ( await getOutput ( ( ) => factory ( 10 , 20 ) ) ) . toBe ( expected )
99
- expect ( await getOutput ( ( ) => factory ( 20 , 10 ) ) ) . toBe ( expected )
99
+ expect ( await getOutput ( ( ) => factory ( 0 , 16 ) ) ) . toBe ( expected )
100
+ expect ( await getOutput ( ( ) => factory ( 16 , 0 ) ) ) . toBe ( expected )
100
101
} )
101
102
102
103
test ( 'serverPrefetch' , async ( ) => {
@@ -140,8 +141,8 @@ describe('useId', () => {
140
141
'v:0-0 v:0-1 ' + // inside first async subtree
141
142
'v:1-0 v:1-1' // inside second async subtree
142
143
// assert different async resolution order does not affect id stable-ness
143
- expect ( await getOutput ( ( ) => factory ( 10 , 20 ) ) ) . toBe ( expected )
144
- expect ( await getOutput ( ( ) => factory ( 20 , 10 ) ) ) . toBe ( expected )
144
+ expect ( await getOutput ( ( ) => factory ( 0 , 16 ) ) ) . toBe ( expected )
145
+ expect ( await getOutput ( ( ) => factory ( 16 , 0 ) ) ) . toBe ( expected )
145
146
} )
146
147
147
148
test ( 'async setup()' , async ( ) => {
@@ -192,8 +193,8 @@ describe('useId', () => {
192
193
'v:1-0 v:1-1' + // inside second async subtree
193
194
'</div>'
194
195
// assert different async resolution order does not affect id stable-ness
195
- expect ( await getOutput ( ( ) => factory ( 10 , 20 ) ) ) . toBe ( expected )
196
- expect ( await getOutput ( ( ) => factory ( 20 , 10 ) ) ) . toBe ( expected )
196
+ expect ( await getOutput ( ( ) => factory ( 0 , 16 ) ) ) . toBe ( expected )
197
+ expect ( await getOutput ( ( ) => factory ( 16 , 0 ) ) ) . toBe ( expected )
197
198
} )
198
199
199
200
test ( 'deep nested' , async ( ) => {
@@ -239,4 +240,49 @@ describe('useId', () => {
239
240
expect ( await getOutput ( ( ) => factory ( ) ) ) . toBe ( expected )
240
241
expect ( await getOutput ( ( ) => factory ( ) ) ) . toBe ( expected )
241
242
} )
243
+
244
+ test ( 'async component inside async setup, already resolved' , async ( ) => {
245
+ const factory = async (
246
+ delay1 : number ,
247
+ delay2 : number ,
248
+ ) : Promise < FactoryRes > => {
249
+ const p1 = promiseWithDelay ( null , delay1 )
250
+ const p2 = promiseWithDelay ( BasicComponentWithUseId , delay2 )
251
+ const AsyncInner = defineAsyncComponent ( ( ) => p2 )
252
+
253
+ const AsyncSetup = defineComponent ( {
254
+ async setup ( ) {
255
+ await p1
256
+ return { }
257
+ } ,
258
+ render ( ) {
259
+ return h ( AsyncInner )
260
+ } ,
261
+ } )
262
+
263
+ const app = createApp ( {
264
+ setup ( ) {
265
+ const id1 = useId ( )
266
+ const id2 = useId ( )
267
+ return ( ) =>
268
+ h ( Suspense , null , {
269
+ default : h ( 'div' , [ id1 , ' ' , id2 , ' ' , h ( AsyncSetup ) ] ) ,
270
+ } )
271
+ } ,
272
+ } )
273
+
274
+ // the async component may have already been resolved
275
+ await AsyncInner . __asyncLoader ( )
276
+ return [ app , [ p1 , p2 ] ]
277
+ }
278
+
279
+ const expected =
280
+ '<div>' +
281
+ 'v:0 v:1 ' + // root
282
+ 'v:0-0-0 v:0-0-1' + // async component inside async setup
283
+ '</div>'
284
+ // assert different async resolution order does not affect id stable-ness
285
+ expect ( await getOutput ( async ( ) => factory ( 0 , 16 ) ) ) . toBe ( expected )
286
+ expect ( await getOutput ( ( ) => factory ( 16 , 0 ) ) ) . toBe ( expected )
287
+ } )
242
288
} )
0 commit comments