Skip to content

Commit ac861f8

Browse files
Initial React Router support (#11498)
* Initial React Router support * Fix tests * cleanup * Create slow-crabs-punch.md * Handle React Router 7.10.0 changes * Update packages/wrangler/src/autoconfig/frameworks/react-router.ts Co-authored-by: Dario Piotrowicz <[email protected]> * Update packages/wrangler/src/autoconfig/frameworks/react-router.ts Co-authored-by: Dario Piotrowicz <[email protected]> * Update packages/wrangler/src/autoconfig/frameworks/react-router.ts Co-authored-by: Dario Piotrowicz <[email protected]> --------- Co-authored-by: Dario Piotrowicz <[email protected]>
1 parent f1b76f7 commit ac861f8

File tree

13 files changed

+523
-105
lines changed

13 files changed

+523
-105
lines changed

‎.changeset/slow-crabs-punch.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"wrangler": minor
3+
"create-cloudflare": minor
4+
---
5+
6+
Add React Router support in autoconfig

‎packages/create-cloudflare/e2e/tests/cli/cli.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ describe("Create Cloudflare CLI", () => {
555555
npm create cloudflare -- --framework next -- --ts
556556
pnpm create cloudflare --framework next -- --ts
557557
Allowed Values:
558-
gatsby, svelte, docusaurus, astro, tanstack-start, angular, solid, qwik, vue, react
558+
gatsby, svelte, docusaurus, astro, tanstack-start, angular, solid, qwik, vue, react, react-router
559559
--platform=<value>
560560
Whether the application should be deployed to Pages or Workers. This is only applicable for Frameworks templates that support both Pages and Workers.
561561
Allowed Values:

‎packages/create-cloudflare/e2e/tests/frameworks/test-config.ts‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,29 @@ function getExperimentalFrameworkTestConfig(
866866
nodeCompat: false,
867867
verifyTypes: false,
868868
},
869+
{
870+
name: "react-router",
871+
unsupportedOSs: ["win32"],
872+
testCommitMessage: true,
873+
timeout: LONG_TIMEOUT,
874+
verifyDeploy: {
875+
route: "/",
876+
expectedText: "React Router",
877+
},
878+
verifyPreview: {
879+
route: "/",
880+
expectedText: "React Router",
881+
previewArgs: ["--host=127.0.0.1"],
882+
},
883+
verifyDev: {
884+
route: "/",
885+
expectedText: "React Router",
886+
devArgs: ["--host=127.0.0.1"],
887+
},
888+
nodeCompat: false,
889+
flags: ["--no-install", "--no-git-init"],
890+
verifyTypes: false,
891+
},
869892
];
870893
}
871894

‎packages/create-cloudflare/src/templates.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ export function getFrameworkMap({ experimental = false }): TemplateMap {
246246
qwik: qwikTemplate,
247247
vue: vueTemplate,
248248
react: reactTemplate,
249+
"react-router": reactRouterTemplate,
249250
};
250251
} else {
251252
return {

‎packages/create-cloudflare/templates/react-router/c3.ts‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ const { npm } = detectPackageManager();
99
const generate = async (ctx: C3Context) => {
1010
await runFrameworkGenerator(ctx, [
1111
ctx.project.name,
12-
"--template",
13-
// React-router deleted the template here
14-
"https://github.com/remix-run/react-router-templates/tree/29ac272b9532fe26463a2d2693fc73ff3c1e884b/cloudflare",
12+
...(ctx.args.experimental
13+
? []
14+
: [
15+
"--template",
16+
// React-router deleted the template here
17+
"https://github.com/remix-run/react-router-templates/tree/29ac272b9532fe26463a2d2693fc73ff3c1e884b/cloudflare",
18+
]),
1519
// to prevent asking about git twice, just let c3 do it
1620
"--no-git-init",
1721
"--no-install",

‎packages/workers-utils/src/parse.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export function parseTOML<T>(input: string, file?: string): T | never {
112112
*/
113113
export type PackageJSON = {
114114
name?: string;
115+
version?: string;
115116
devDependencies?: Record<string, unknown>;
116117
dependencies?: Record<string, unknown>;
117118
scripts?: Record<string, unknown>;

‎packages/wrangler/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@
148148
"patch-console": "^1.0.0",
149149
"pretty-bytes": "^6.0.0",
150150
"prompts": "^2.4.2",
151-
"recast": "0.22.0",
151+
"recast": "0.23.11",
152152
"resolve": "^1.22.8",
153153
"rimraf": "catalog:default",
154154
"semiver": "^1.1.0",
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { seed } from "@cloudflare/workers-utils/test-helpers";
2+
import { describe, expect, test } from "vitest";
3+
import { getInstalledPackageVersion } from "../../autoconfig/frameworks";
4+
import { runInTempDir } from "../helpers/run-in-tmp";
5+
6+
describe("getInstalledPackageVersion()", () => {
7+
runInTempDir();
8+
test("happy path", async () => {
9+
await seed({
10+
"node_modules/react-router/package.json": JSON.stringify({
11+
name: "react-router",
12+
version: "1.2.3",
13+
main: "index.js",
14+
}),
15+
"node_modules/react-router/index.js": "console.log(1)",
16+
});
17+
expect(getInstalledPackageVersion("react-router", process.cwd())).toBe(
18+
"1.2.3"
19+
);
20+
});
21+
22+
test("no node_modules", async () => {
23+
expect(
24+
getInstalledPackageVersion("react-router", process.cwd())
25+
).toBeUndefined();
26+
});
27+
});

‎packages/wrangler/src/autoconfig/details.ts‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ export async function getDetailsForAutoConfig({
124124

125125
const buildSettings = await project.getBuildSettings();
126126

127+
// Workaround for https://github.com/netlify/build/pull/6806, and can be removed once merged
128+
if (
129+
buildSettings.length === 2 &&
130+
buildSettings[0].framework.id === "react-router" &&
131+
buildSettings[1].framework.id === "vite"
132+
) {
133+
buildSettings.pop();
134+
}
135+
127136
// If we've detected multiple frameworks, it's too complex for us to try and configure—let's just bail
128137
if (buildSettings && buildSettings?.length > 1) {
129138
throw new MultipleFrameworksError(buildSettings.map((b) => b.name));

‎packages/wrangler/src/autoconfig/frameworks/get-framework.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Angular } from "./angular";
22
import { Astro } from "./astro";
33
import { Qwik } from "./qwik";
4+
import { ReactRouter } from "./react-router";
45
import { SolidStart } from "./solid-start";
56
import { Static } from "./static";
67
import { SvelteKit } from "./sveltekit";
@@ -18,6 +19,8 @@ export function getFramework(detectedFramework?: {
1819
return new SvelteKit(detectedFramework.name);
1920
case "tanstack-start":
2021
return new TanstackStart(detectedFramework.name);
22+
case "react-router":
23+
return new ReactRouter(detectedFramework.name);
2124
case "angular":
2225
return new Angular(detectedFramework.name);
2326
case "solid-start":

0 commit comments

Comments
 (0)