Skip to content

Commit d898d75

Browse files
committed
Manually control HydrateFallback timing
1 parent d055f17 commit d898d75

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

integration/split-route-modules-test.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
221251
test.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

Comments
 (0)