@@ -12,10 +12,11 @@ import {
1212} from 'vue'
1313import { renderToString } from '@vue/server-renderer'
1414
15- type TestCaseFactory = ( ) => [ App , Promise < any > [ ] ]
15+ type FactoryRes = [ App , Promise < any > [ ] ]
16+ type TestCaseFactory = ( ) => FactoryRes | Promise < FactoryRes >
1617
1718async function runOnClient ( factory : TestCaseFactory ) {
18- const [ app , deps ] = factory ( )
19+ const [ app , deps ] = await factory ( )
1920 const root = document . createElement ( 'div' )
2021 app . mount ( root )
2122 await Promise . all ( deps )
@@ -24,7 +25,7 @@ async function runOnClient(factory: TestCaseFactory) {
2425}
2526
2627async function runOnServer ( factory : TestCaseFactory ) {
27- const [ app , _ ] = factory ( )
28+ const [ app , _ ] = await factory ( )
2829 return ( await renderToString ( app ) )
2930 . replace ( / < ! - - [ \[ \] ] - - > / g, '' ) // remove fragment wrappers
3031 . trim ( )
@@ -95,8 +96,8 @@ describe('useId', () => {
9596 'v:0-0 v:0-1 ' + // inside first async subtree
9697 'v:1-0 v:1-1' // inside second async subtree
9798 // 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 )
100101 } )
101102
102103 test ( 'serverPrefetch' , async ( ) => {
@@ -140,8 +141,8 @@ describe('useId', () => {
140141 'v:0-0 v:0-1 ' + // inside first async subtree
141142 'v:1-0 v:1-1' // inside second async subtree
142143 // 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 )
145146 } )
146147
147148 test ( 'async setup()' , async ( ) => {
@@ -192,8 +193,8 @@ describe('useId', () => {
192193 'v:1-0 v:1-1' + // inside second async subtree
193194 '</div>'
194195 // 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 )
197198 } )
198199
199200 test ( 'deep nested' , async ( ) => {
@@ -239,4 +240,49 @@ describe('useId', () => {
239240 expect ( await getOutput ( ( ) => factory ( ) ) ) . toBe ( expected )
240241 expect ( await getOutput ( ( ) => factory ( ) ) ) . toBe ( expected )
241242 } )
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+ } )
242288} )
0 commit comments