@@ -50,7 +50,15 @@ const files = {
50
50
export const inSplittableMainChunk = () => console.log() || true;
51
51
52
52
export const clientLoader = async () => {
53
- await new Promise((resolve) => setTimeout(resolve, 100));
53
+ const pollingPromise = (async () => {
54
+ while (globalThis.blockClientLoader !== false) {
55
+ await new Promise((resolve) => setTimeout(resolve, 0));
56
+ }
57
+ })();
58
+ const timeoutPromise = new Promise((_, reject) => {
59
+ setTimeout(() => reject(new Error("Client loader wasn't unblocked after 2s")), 2000);
60
+ });
61
+ await Promise.race([pollingPromise, timeoutPromise]);
54
62
return {
55
63
message: "clientLoader in main chunk: " + eval("typeof inSplittableMainChunk === 'function'"),
56
64
className: clientLoaderStyles.root,
@@ -117,7 +125,15 @@ const files = {
117
125
118
126
export const clientLoader = async () => {
119
127
inUnsplittableMainChunk();
120
- await new Promise((resolve) => setTimeout(resolve, 100));
128
+ const pollingPromise = (async () => {
129
+ while (globalThis.blockClientLoader !== false) {
130
+ await new Promise((resolve) => setTimeout(resolve, 0));
131
+ }
132
+ })();
133
+ const timeoutPromise = new Promise((_, reject) => {
134
+ setTimeout(() => reject(new Error("Client loader wasn't unblocked after 2s")), 2000);
135
+ });
136
+ await Promise.race([pollingPromise, timeoutPromise]);
121
137
return "clientLoader in main chunk: " + eval("typeof inUnsplittableMainChunk === 'function'");
122
138
};
123
139
@@ -165,7 +181,15 @@ const files = {
165
181
166
182
export const clientLoader = async () => {
167
183
inMixedMainChunk();
168
- await new Promise((resolve) => setTimeout(resolve, 100));
184
+ const pollingPromise = (async () => {
185
+ while (globalThis.blockClientLoader !== false) {
186
+ await new Promise((resolve) => setTimeout(resolve, 0));
187
+ }
188
+ })();
189
+ const timeoutPromise = new Promise((_, reject) => {
190
+ setTimeout(() => reject(new Error("Client loader wasn't unblocked after 2s")), 2000);
191
+ });
192
+ await Promise.race([pollingPromise, timeoutPromise]);
169
193
return "clientLoader in main chunk: " + eval("typeof inMixedMainChunk === 'function'");
170
194
};
171
195
@@ -218,6 +242,12 @@ async function mixedHydrateFallbackDownloaded(page: Page) {
218
242
) ;
219
243
}
220
244
245
+ async function unblockClientLoader ( page : Page ) {
246
+ await page . evaluate ( ( ) => {
247
+ ( globalThis as any ) . blockClientLoader = false ;
248
+ } ) ;
249
+ }
250
+
221
251
test . describe ( "Split route modules" , async ( ) => {
222
252
test . describe ( "enabled" , ( ) => {
223
253
let splitRouteModules = true ;
@@ -245,6 +275,7 @@ test.describe("Split route modules", async () => {
245
275
page . on ( "pageerror" , ( error ) => pageErrors . push ( error ) ) ;
246
276
247
277
await page . goto ( `http://localhost:${ port } ` , { waitUntil : "networkidle" } ) ;
278
+ await unblockClientLoader ( page ) ;
248
279
expect ( pageErrors ) . toEqual ( [ ] ) ;
249
280
250
281
// Ensure splittable exports are not in main chunk
@@ -301,6 +332,7 @@ test.describe("Split route modules", async () => {
301
332
"20px"
302
333
) ;
303
334
expect ( await splittableHydrateFallbackDownloaded ( page ) ) . toBe ( true ) ;
335
+ await unblockClientLoader ( page ) ;
304
336
await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
305
337
`loaderData = "clientLoader in main chunk: false"`
306
338
) ;
@@ -315,6 +347,7 @@ test.describe("Split route modules", async () => {
315
347
"Loading..."
316
348
) ;
317
349
expect ( await unsplittableHydrateFallbackDownloaded ( page ) ) . toBe ( true ) ;
350
+ await unblockClientLoader ( page ) ;
318
351
await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
319
352
`loaderData = "clientLoader in main chunk: true"`
320
353
) ;
@@ -347,6 +380,7 @@ test.describe("Split route modules", async () => {
347
380
page . on ( "pageerror" , ( error ) => pageErrors . push ( error ) ) ;
348
381
349
382
await page . goto ( `http://localhost:${ port } ` , { waitUntil : "networkidle" } ) ;
383
+ await unblockClientLoader ( page ) ;
350
384
expect ( pageErrors ) . toEqual ( [ ] ) ;
351
385
352
386
// Ensure splittable exports are kept in main chunk
@@ -390,13 +424,15 @@ test.describe("Split route modules", async () => {
390
424
"padding" ,
391
425
"20px"
392
426
) ;
427
+ await unblockClientLoader ( page ) ;
393
428
await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
394
429
`loaderData = "clientLoader in main chunk: true"`
395
430
) ;
396
431
397
432
// Ensure unsplittable client loader works during SSR
398
433
await page . goto ( `http://localhost:${ port } /unsplittable` ) ;
399
434
expect ( page . locator ( "[data-hydrate-fallback]" ) ) . toHaveText ( "Loading..." ) ;
435
+ await unblockClientLoader ( page ) ;
400
436
await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
401
437
`loaderData = "clientLoader in main chunk: true"`
402
438
) ;
0 commit comments