Skip to content

Commit 8f44d01

Browse files
authored
Fix typegen for routes with a client loader but no server loader (#12117)
1 parent a41323a commit 8f44d01

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
lines changed

.changeset/little-cooks-pull.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-router": patch
3+
---
4+
5+
Fix typegen for routes with a client loader but no server loader

integration/vite-prerender-test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import fs from "node:fs";
22
import path from "node:path";
3+
import { PassThrough } from "node:stream";
34
import { test, expect } from "@playwright/test";
45

56
import {
@@ -153,7 +154,9 @@ test.describe("Prerendering", () => {
153154
});
154155

155156
test("Prerenders known static routes when true is specified", async () => {
157+
let buildStdio = new PassThrough();
156158
fixture = await createFixture({
159+
buildStdio,
157160
prerender: true,
158161
files: {
159162
...files,
@@ -192,6 +195,26 @@ test.describe("Prerendering", () => {
192195
`,
193196
},
194197
});
198+
199+
let buildOutput: string;
200+
let chunks: Buffer[] = [];
201+
buildOutput = await new Promise<string>((resolve, reject) => {
202+
buildStdio.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
203+
buildStdio.on("error", (err) => reject(err));
204+
buildStdio.on("end", () =>
205+
resolve(Buffer.concat(chunks).toString("utf8"))
206+
);
207+
});
208+
209+
expect(buildOutput).toContain(
210+
[
211+
"⚠️ Paths with dynamic/splat params cannot be prerendered when using `prerender: true`.",
212+
"You may want to use the `prerender()` API to prerender the following paths:",
213+
" - :slug",
214+
" - *",
215+
].join("\n")
216+
);
217+
195218
appFixture = await createAppFixture(fixture);
196219

197220
let clientDir = path.join(fixture.projectDir, "build", "client");

packages/react-router-dev/vite/plugin.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,12 +1897,13 @@ function determineStaticPrerenderRoutes(
18971897
}
18981898
recurse(routes);
18991899

1900-
if (isBooleanUsage && paramRoutes) {
1900+
if (isBooleanUsage && paramRoutes.length > 0) {
19011901
viteConfig.logger.warn(
1902-
"The following paths were not prerendered because Dynamic Param and Splat " +
1903-
"routes cannot be prerendered when using `prerender:true`. You may want to " +
1904-
"consider using the `prerender()` API if you wish to prerender slug and " +
1905-
"splat routes."
1902+
[
1903+
"⚠️ Paths with dynamic/splat params cannot be prerendered when using `prerender: true`.",
1904+
"You may want to use the `prerender()` API to prerender the following paths:",
1905+
...paramRoutes.map((p) => " - " + p),
1906+
].join("\n")
19061907
);
19071908
}
19081909

packages/react-router/lib/types.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,12 @@ type _CreateLoaderData<
6666
ClientLoaderHydrate extends boolean,
6767
HasHydrateFallback
6868
> =
69-
[HasHydrateFallback, ClientLoaderHydrate] extends [true, true] ?
69+
[HasHydrateFallback, ClientLoaderHydrate] extends [true, true] ?
7070
IsDefined<ClientLoaderData> extends true ? ClientLoaderData :
7171
undefined
7272
:
7373
[IsDefined<ClientLoaderData>, IsDefined<ServerLoaderData>] extends [true, true] ? ServerLoaderData | ClientLoaderData :
74-
IsDefined<ClientLoaderData> extends true ?
75-
ClientLoaderHydrate extends true ? ClientLoaderData :
76-
ClientLoaderData | undefined
77-
:
74+
IsDefined<ClientLoaderData> extends true ? ClientLoaderData :
7875
IsDefined<ServerLoaderData> extends true ? ServerLoaderData :
7976
undefined
8077

@@ -221,7 +218,7 @@ type __tests = [
221218
CreateLoaderData<{
222219
clientLoader: () => { a: string; b: Date; c: () => boolean };
223220
}>,
224-
undefined | { a: string; b: Date; c: () => boolean }
221+
{ a: string; b: Date; c: () => boolean }
225222
>
226223
>,
227224
Expect<

0 commit comments

Comments
 (0)