@@ -50,7 +50,15 @@ const files = {
5050 export const inSplittableMainChunk = () => console.log() || true;
5151
5252 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]);
5462 return {
5563 message: "clientLoader in main chunk: " + eval("typeof inSplittableMainChunk === 'function'"),
5664 className: clientLoaderStyles.root,
@@ -117,7 +125,15 @@ const files = {
117125
118126 export const clientLoader = async () => {
119127 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]);
121137 return "clientLoader in main chunk: " + eval("typeof inUnsplittableMainChunk === 'function'");
122138 };
123139
@@ -165,7 +181,15 @@ const files = {
165181
166182 export const clientLoader = async () => {
167183 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]);
169193 return "clientLoader in main chunk: " + eval("typeof inMixedMainChunk === 'function'");
170194 };
171195
@@ -218,6 +242,12 @@ async function mixedHydrateFallbackDownloaded(page: Page) {
218242 ) ;
219243}
220244
245+ async function unblockClientLoader ( page : Page ) {
246+ await page . evaluate ( ( ) => {
247+ ( globalThis as any ) . blockClientLoader = false ;
248+ } ) ;
249+ }
250+
221251test . describe ( "Split route modules" , async ( ) => {
222252 test . describe ( "enabled" , ( ) => {
223253 let splitRouteModules = true ;
@@ -245,6 +275,7 @@ test.describe("Split route modules", async () => {
245275 page . on ( "pageerror" , ( error ) => pageErrors . push ( error ) ) ;
246276
247277 await page . goto ( `http://localhost:${ port } ` , { waitUntil : "networkidle" } ) ;
278+ await unblockClientLoader ( page ) ;
248279 expect ( pageErrors ) . toEqual ( [ ] ) ;
249280
250281 // Ensure splittable exports are not in main chunk
@@ -301,6 +332,7 @@ test.describe("Split route modules", async () => {
301332 "20px"
302333 ) ;
303334 expect ( await splittableHydrateFallbackDownloaded ( page ) ) . toBe ( true ) ;
335+ await unblockClientLoader ( page ) ;
304336 await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
305337 `loaderData = "clientLoader in main chunk: false"`
306338 ) ;
@@ -315,6 +347,7 @@ test.describe("Split route modules", async () => {
315347 "Loading..."
316348 ) ;
317349 expect ( await unsplittableHydrateFallbackDownloaded ( page ) ) . toBe ( true ) ;
350+ await unblockClientLoader ( page ) ;
318351 await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
319352 `loaderData = "clientLoader in main chunk: true"`
320353 ) ;
@@ -347,6 +380,7 @@ test.describe("Split route modules", async () => {
347380 page . on ( "pageerror" , ( error ) => pageErrors . push ( error ) ) ;
348381
349382 await page . goto ( `http://localhost:${ port } ` , { waitUntil : "networkidle" } ) ;
383+ await unblockClientLoader ( page ) ;
350384 expect ( pageErrors ) . toEqual ( [ ] ) ;
351385
352386 // Ensure splittable exports are kept in main chunk
@@ -390,13 +424,15 @@ test.describe("Split route modules", async () => {
390424 "padding" ,
391425 "20px"
392426 ) ;
427+ await unblockClientLoader ( page ) ;
393428 await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
394429 `loaderData = "clientLoader in main chunk: true"`
395430 ) ;
396431
397432 // Ensure unsplittable client loader works during SSR
398433 await page . goto ( `http://localhost:${ port } /unsplittable` ) ;
399434 expect ( page . locator ( "[data-hydrate-fallback]" ) ) . toHaveText ( "Loading..." ) ;
435+ await unblockClientLoader ( page ) ;
400436 await expect ( page . locator ( "[data-loader-data]" ) ) . toHaveText (
401437 `loaderData = "clientLoader in main chunk: true"`
402438 ) ;
0 commit comments