From 582035467f34645521a2b272c3ec52906a495da4 Mon Sep 17 00:00:00 2001 From: Remix Run Bot Date: Thu, 28 May 2026 18:45:52 +0000 Subject: [PATCH 01/14] chore: format --- CHANGELOG.md | 5 ----- packages/react-router-dev/CHANGELOG.md | 2 -- packages/react-router-express/CHANGELOG.md | 2 +- packages/react-router-node/CHANGELOG.md | 2 +- packages/react-router/CHANGELOG.md | 1 - 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 011c9cc339..79e3566b6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -183,11 +183,9 @@ Date: 2026-05-28 - `react-router` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/15098)) - `@react-router/dev` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/15098)) - - The unstable flag is no longer supported and will error during config resolution - `@react-router/dev` - Log future flag warnings for upcoming React Router v8 flags ([#15029](https://github.com/remix-run/react-router/pull/15029)) - - `v8_middleware`, `v8_splitRouteModules`, `v8_viteEnvironmentApi`, `v8_passThroughRequests`, `v8_trailingSlashAwareDataRequests` ### Patch Changes @@ -195,7 +193,6 @@ Date: 2026-05-28 - `react-router` - Disable manifest path when lazy route dicovery is disabled ([#15068](https://github.com/remix-run/react-router/pull/15068)) - `react-router` - Fix browser URL creation to use the configured history window instead of the global window. ([#15066](https://github.com/remix-run/react-router/pull/15066)) - - Pass the history/router window through to `createBrowserURLImpl` so custom window contexts keep the correct URL origin. - `react-router` - Fix `useNavigation()` return type to preserve discriminated union across navigation states ([#15095](https://github.com/remix-run/react-router/pull/15095)) @@ -205,11 +202,9 @@ Date: 2026-05-28 - `react-router-dom` - Remove stale/invalid `unpkg` field from `package.json`. This was removed from other packages with the release of v7 but missed in the `react-router-dom` re-export package ([#15075](https://github.com/remix-run/react-router/pull/15075)) - `@react-router/express` - Ignore writes after Express responses close ([#15107](https://github.com/remix-run/react-router/pull/15107)) - - Avoid surfacing client disconnects as adapter errors when the response stream has already been destroyed or ended. - `@react-router/node` - Honor Node writable backpressure in `writeReadableStreamToWritable` and `writeAsyncIterableToWritable` ([#15071](https://github.com/remix-run/react-router/pull/15071)) - - Await `'drain'` when `writable.write()` returns `false` instead of letting chunks accumulate in the writable's internal buffer. - Reject (rather than hang) if the writable errors or closes mid-stream. diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index 26857b9036..47d75c2079 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -5,11 +5,9 @@ ### Minor Changes - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/15098)) - - The unstable flag is no longer supported and will error during config resolution - Log future flag warnings for upcoming React Router v8 flags ([#15029](https://github.com/remix-run/react-router/pull/15029)) - - `v8_middleware`, `v8_splitRouteModules`, `v8_viteEnvironmentApi`, `v8_passThroughRequests`, `v8_trailingSlashAwareDataRequests` ### Patch Changes diff --git a/packages/react-router-express/CHANGELOG.md b/packages/react-router-express/CHANGELOG.md index c41a46e233..3e33abf188 100644 --- a/packages/react-router-express/CHANGELOG.md +++ b/packages/react-router-express/CHANGELOG.md @@ -5,8 +5,8 @@ ### Patch Changes - Ignore writes after Express responses close ([#15107](https://github.com/remix-run/react-router/pull/15107)) - - Avoid surfacing client disconnects as adapter errors when the response stream has already been destroyed or ended. + - Updated dependencies: - [`react-router@7.16.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.16.0) - [`@react-router/node@7.16.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.16.0) diff --git a/packages/react-router-node/CHANGELOG.md b/packages/react-router-node/CHANGELOG.md index 60247bf374..530222ab0c 100644 --- a/packages/react-router-node/CHANGELOG.md +++ b/packages/react-router-node/CHANGELOG.md @@ -5,9 +5,9 @@ ### Patch Changes - Honor Node writable backpressure in `writeReadableStreamToWritable` and `writeAsyncIterableToWritable` ([#15071](https://github.com/remix-run/react-router/pull/15071)) - - Await `'drain'` when `writable.write()` returns `false` instead of letting chunks accumulate in the writable's internal buffer. - Reject (rather than hang) if the writable errors or closes mid-stream. + - Updated dependencies: - [`react-router@7.16.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.16.0) diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index d44d829ff5..f257fda000 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -11,7 +11,6 @@ - Disable manifest path when lazy route dicovery is disabled ([#15068](https://github.com/remix-run/react-router/pull/15068)) - Fix browser URL creation to use the configured history window instead of the global window. ([#15066](https://github.com/remix-run/react-router/pull/15066)) - - Pass the history/router window through to `createBrowserURLImpl` so custom window contexts keep the correct URL origin. - Fix `useNavigation()` return type to preserve discriminated union across navigation states ([#15095](https://github.com/remix-run/react-router/pull/15095)) From aaeb5ce6400cc07f5d1d53e78d3231d0a435e830 Mon Sep 17 00:00:00 2001 From: palkim Date: Sat, 30 May 2026 04:22:31 +0900 Subject: [PATCH 02/14] rsc: strip server route exports from optimizeDeps scan (#15005) --- contributors.yml | 1 + integration/vite-dev-test.ts | 61 ++++++++++++++++ .../unstable.rsc-optimize-deps-route-scan.md | 1 + .../rsc-virtual-route-modules-test.ts | 45 +++++++++++- packages/react-router-dev/vite/rsc/plugin.ts | 73 +++++++++++++++++-- .../vite/rsc/virtual-route-modules.ts | 8 ++ packages/react-router-dev/vite/vite.ts | 14 ++-- 7 files changed, 191 insertions(+), 12 deletions(-) create mode 100644 packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md diff --git a/contributors.yml b/contributors.yml index 66160fc8dc..1151f8c562 100644 --- a/contributors.yml +++ b/contributors.yml @@ -239,6 +239,7 @@ - kigawas - kilavvy - kiliman +- KimHyeongRae0 - kirillgroshkov - kkirsche - kno-raziel diff --git a/integration/vite-dev-test.ts b/integration/vite-dev-test.ts index de9d1c7fe2..b3f749fcc8 100644 --- a/integration/vite-dev-test.ts +++ b/integration/vite-dev-test.ts @@ -511,4 +511,65 @@ test.describe("Vite dev", () => { }); }); } + + test("does not prebundle RSC server-only route imports in the client optimizer", async ({ + page, + dev, + }) => { + let files: Files = async ({ port }) => ({ + "react-router.config.ts": reactRouterConfig({ + future: { unstable_optimizeDeps: true }, + }), + "vite.config.ts": await viteConfig.basic({ + port, + templateName: "rsc-vite-framework", + }), + "app/routes/_index.tsx": tsx` + import { readServerSecret } from "rsc-server-only-package"; + + export async function loader() { + return { secret: readServerSecret() }; + } + + export default function IndexRoute() { + return

Index route

; + } + `, + "node_modules/rsc-server-only-package/package.json": JSON.stringify({ + name: "rsc-server-only-package", + version: "1.0.0", + type: "module", + main: "index.js", + }), + "node_modules/rsc-server-only-package/index.js": tsx` + export function readServerSecret() { + return "server-only"; + } + `, + }); + + let { cwd, port } = await dev(files, "rsc-vite-framework"); + + await page.goto(`http://localhost:${port}/`); + await expect(page.locator("[data-route]")).toHaveText("Index route"); + + let metadataPath = path.join(cwd, "node_modules/.vite/deps/_metadata.json"); + + await expect + .poll(async () => { + try { + return await fs.readFile(metadataPath, "utf8"); + } catch { + return ""; + } + }) + .not.toBe(""); + + let clientDeps = [ + await fs.readFile(metadataPath, "utf8"), + ...(await fs.readdir(path.dirname(metadataPath))), + ].join("\n"); + + expect(clientDeps).not.toMatch(/rsc[-_]server[-_]only[-_]package/); + }); }); diff --git a/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md b/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md new file mode 100644 index 0000000000..bff7bf5569 --- /dev/null +++ b/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md @@ -0,0 +1 @@ +Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. diff --git a/packages/react-router-dev/__tests__/rsc-virtual-route-modules-test.ts b/packages/react-router-dev/__tests__/rsc-virtual-route-modules-test.ts index 0d46cab2f0..01086932bc 100644 --- a/packages/react-router-dev/__tests__/rsc-virtual-route-modules-test.ts +++ b/packages/react-router-dev/__tests__/rsc-virtual-route-modules-test.ts @@ -1,7 +1,10 @@ import * as assert from "node:assert"; import * as ts from "typescript"; -import { virtualRouteModulesPlugin } from "../vite/rsc/virtual-route-modules"; +import { + createClientRouteModuleForOptimizeDepsScan, + virtualRouteModulesPlugin, +} from "../vite/rsc/virtual-route-modules"; const plugin = virtualRouteModulesPlugin({ enforceSplitRouteModules: () => false, @@ -587,3 +590,43 @@ describe("client-route-module=HydrateFallback", () => { ); }); }); + +describe("optimizeDeps scan", () => { + it("removes server-only route exports before scanning client deps", () => { + let transformed = createClientRouteModuleForOptimizeDepsScan(js` + import { clientOnly } from "./client"; + import { serverOnly } from "server-only-package"; + import { shared } from "./shared"; + + export async function loader() { + return serverOnly(); + } + + export async function action() { + return serverOnly(); + } + + export function ServerComponent() { + return serverOnly(); + } + + export const meta = () => [{ title: shared }]; + + export default function Route() { + return clientOnly(shared); + } + `); + + expect(transformed.code).toContain( + 'import { clientOnly } from "./client";', + ); + expect(transformed.code).toContain('import { shared } from "./shared";'); + expect(transformed.code).toContain("export const meta"); + expect(transformed.code).toContain("export default function Route"); + expect(transformed.code).not.toContain("server-only-package"); + expect(transformed.code).not.toContain("serverOnly"); + expect(transformed.code).not.toContain("loader"); + expect(transformed.code).not.toContain("action"); + expect(transformed.code).not.toContain("ServerComponent"); + }); +}); diff --git a/packages/react-router-dev/vite/rsc/plugin.ts b/packages/react-router-dev/vite/rsc/plugin.ts index cc32a3a281..723f3f3e0a 100644 --- a/packages/react-router-dev/vite/rsc/plugin.ts +++ b/packages/react-router-dev/vite/rsc/plugin.ts @@ -23,8 +23,12 @@ import { } from "../vite"; import { hasDependency } from "../has-dependency"; import { getOptimizeDepsEntries } from "../optimize-deps-entries"; +import { resolveRelativeRouteFilePath } from "../resolve-relative-route-file-path"; import { createVirtualRouteConfig } from "./virtual-route-config"; -import { virtualRouteModulesPlugin } from "./virtual-route-modules"; +import { + createClientRouteModuleForOptimizeDepsScan, + virtualRouteModulesPlugin, +} from "./virtual-route-modules"; import { loadDotenv } from "../load-dotenv"; import { validatePluginOrder } from "../plugins/validate-plugin-order"; import { warnOnClientSourceMaps } from "../plugins/warn-on-client-source-maps"; @@ -199,6 +203,15 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { // Async import here to avoid CJS warnings on the console let viteNormalizePath = (await import("vite")).normalizePath; + let optimizeDepsEntries = getOptimizeDepsEntries({ + entryClientFilePath: entries.client, + reactRouterConfig: config, + }); + let routeFiles = new Set( + Object.values(config.routes).map((route) => + resolveRelativeRouteFilePath(route, config), + ), + ); return { resolve: { @@ -226,15 +239,20 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { ], }, optimizeDeps: { - entries: getOptimizeDepsEntries({ - entryClientFilePath: entries.client, - reactRouterConfig: config, - }), + entries: optimizeDepsEntries, ...defineOptimizeDepsCompilerOptions({ rolldown: { transform: { jsx: "react-jsx", }, + plugins: config.future.unstable_optimizeDeps + ? [ + createRSCOptimizeDepsRouteModulesPlugin({ + routeFiles, + transformToJs, + }), + ] + : [], }, esbuild: { jsx: "automatic", @@ -791,6 +809,51 @@ function getRootDirectory(viteUserConfig: Vite.UserConfig) { return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd(); } +type RSCOptimizeDepsRouteModulesPlugin = { + name: string; + transform: { + filter: { id: RegExp }; + handler( + code: string, + id: string, + ): Promise<{ code: string; map: null; moduleType: "js" } | undefined>; + }; +}; + +const jsRouteModuleRE = /\.[cm]?[jt]sx?$/; + +function createRSCOptimizeDepsRouteModulesPlugin({ + routeFiles, + transformToJs, +}: { + routeFiles: Set; + transformToJs: (code: string, filename: string) => Promise; +}): RSCOptimizeDepsRouteModulesPlugin { + return { + name: "react-router:rsc-optimize-deps-route-modules", + transform: { + filter: { id: jsRouteModuleRE }, + async handler(code, id) { + let filename = id.split("?")[0]; + let normalizedFilename = getVite().normalizePath(filename); + + if (!routeFiles.has(normalizedFilename)) { + return; + } + + let js = await transformToJs(code, filename); + let generated = createClientRouteModuleForOptimizeDepsScan(js); + + return { + code: generated.code, + map: null, + moduleType: "js", + }; + }, + }, + }; +} + const getClientBuildDirectory = ( reactRouterConfig: ResolvedReactRouterConfig, ) => path.join(reactRouterConfig.buildDirectory, "client"); diff --git a/packages/react-router-dev/vite/rsc/virtual-route-modules.ts b/packages/react-router-dev/vite/rsc/virtual-route-modules.ts index b6382ed55f..16edad9baa 100644 --- a/packages/react-router-dev/vite/rsc/virtual-route-modules.ts +++ b/packages/react-router-dev/vite/rsc/virtual-route-modules.ts @@ -365,6 +365,14 @@ ${result}`; } satisfies Vite.Plugin; } +export function createClientRouteModuleForOptimizeDepsScan(code: string) { + const ast = babel.parse(code, { + sourceType: "module", + }); + removeExports(ast, SERVER_ROUTE_EXPORTS); + return babel.generate(ast); +} + function createId( id: string, type: "client-route-module", diff --git a/packages/react-router-dev/vite/vite.ts b/packages/react-router-dev/vite/vite.ts index 71874a3d1a..77cfbf8ff7 100644 --- a/packages/react-router-dev/vite/vite.ts +++ b/packages/react-router-dev/vite/vite.ts @@ -38,6 +38,12 @@ type OxcCompilerOptions = { }; type RolldownJsxOptions = "react-jsx"; +type RolldownOptimizeDepsOptions = { + transform: { + jsx: RolldownJsxOptions; + }; + plugins?: unknown[]; +}; type OptimizeDepsESBuildOptions = NonNullable< DepOptimizationConfig["esbuildOptions"] @@ -54,14 +60,10 @@ export function defineCompilerOptions(options: { } export function defineOptimizeDepsCompilerOptions(options: { - rolldown: { - transform: { - jsx: RolldownJsxOptions; - }; - }; + rolldown: RolldownOptimizeDepsOptions; esbuild: OptimizeDepsESBuildOptions; }): - | { rolldownOptions: { transform: { jsx: RolldownJsxOptions } } } + | { rolldownOptions: RolldownOptimizeDepsOptions } | { esbuildOptions: OptimizeDepsESBuildOptions } { let vite = getVite(); return parseInt(vite.version.split(".")[0], 10) >= 8 From 0952bbbbaf7f73301bbae0bf8041bea8c9e01094 Mon Sep 17 00:00:00 2001 From: dfedoryshchev <64079946+dfedoryshchev@users.noreply.github.com> Date: Sat, 30 May 2026 01:03:32 +0100 Subject: [PATCH 03/14] test: fix duplicate "when" in vite-basename test description (#15122) --- integration/vite-basename-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/vite-basename-test.ts b/integration/vite-basename-test.ts index da77e4e36d..35dd7e6e1d 100644 --- a/integration/vite-basename-test.ts +++ b/integration/vite-basename-test.ts @@ -521,7 +521,7 @@ test.describe("Vite base + React Router basename", () => { await workflowBuild({ page, port, basename: "/notmybase/" }); }); - test("works when when base is an absolute external URL", async ({ + test("works when base is an absolute external URL", async ({ page, }) => { test.skip( From d635f1b1b331427daef33a7177c13dd3550f0de6 Mon Sep 17 00:00:00 2001 From: Kentaro Suzuki <71284054+sushichan044@users.noreply.github.com> Date: Sun, 31 May 2026 06:37:22 +0900 Subject: [PATCH 04/14] docs(dev): fix future flag warning link (#15125) --- contributors.yml | 1 + integration/cli-test.ts | 2 +- packages/react-router-dev/config/config.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/contributors.yml b/contributors.yml index 1151f8c562..d93e2c0695 100644 --- a/contributors.yml +++ b/contributors.yml @@ -501,3 +501,4 @@ - zeroqs - zheng-chuang - zxTomw +- sushichan044 diff --git a/integration/cli-test.ts b/integration/cli-test.ts index 77b99c5eae..7024592007 100644 --- a/integration/cli-test.ts +++ b/integration/cli-test.ts @@ -116,7 +116,7 @@ test.describe("cli", () => { // Filter out future flag warnings for the format: // ⚠️ Future Flag Warning: Route module splitting behavior is changing in React Router v8. // You can use the `future.v8_splitRouteModules` flag to opt in early. - // -> https://reactrouter.com/upgrading/future-flags#v8_splitRouteModules + // -> https://reactrouter.com/upgrading/future#futurev8_splitroutemodules let filteredStdOut = stdout.toString().split("\n"); while (filteredStdOut[0]?.includes("Future Flag Warning:")) { filteredStdOut.splice(0, 3); diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index 104fdf2551..7f11db066a 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -767,7 +767,7 @@ function logFutureFlagWarning(flag: string, message: string): void { colors.yellow( ` ⚠️ Future Flag Warning: ${message}\n` + ` You can use the \`future.${flag}\` flag to opt in early.\n` + - ` -> https://reactrouter.com/upgrading/future-flags#${flag}`, + ` -> https://reactrouter.com/upgrading/future#future${flag.toLowerCase()}`, ), ); } From 8fae751d9d3942cf8c5cea3ca299ff30d28bb180 Mon Sep 17 00:00:00 2001 From: Remix Run Bot Date: Sat, 30 May 2026 21:37:54 +0000 Subject: [PATCH 05/14] chore: format --- contributors.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors.yml b/contributors.yml index d93e2c0695..029269d4f5 100644 --- a/contributors.yml +++ b/contributors.yml @@ -425,6 +425,7 @@ - stmtk1 - sukvvon - sunnyraindy +- sushichan044 - swalker326 - szhsin - tanayv @@ -501,4 +502,3 @@ - zeroqs - zheng-chuang - zxTomw -- sushichan044 From c509c160d4258961ca0156ec083e35f3cf2bf97e Mon Sep 17 00:00:00 2001 From: Brooks Lybrand Date: Mon, 1 Jun 2026 11:53:49 -0500 Subject: [PATCH 06/14] Publish React Router docs in package (#15121) * Publish docs with react-router package * Updates * Remove exports * Move docs copy to a prepublishOnly script * Apply suggestions from code review Co-authored-by: Matt Brophy --------- Co-authored-by: Matt Brophy --- .gitignore | 1 + .../.changes/minor.ship-docs-in-package.md | 3 + packages/react-router/package.json | 2 + packages/react-router/scripts/copy-docs.mjs | 63 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 packages/react-router/.changes/minor.ship-docs-in-package.md create mode 100644 packages/react-router/scripts/copy-docs.mjs diff --git a/.gitignore b/.gitignore index 212db6e711..c4c5ec46ea 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ build.utils.d.ts worker-configuration.d.ts /.env /NOTES.md +/packages/react-router/docs/ # v7 reference docs /public diff --git a/packages/react-router/.changes/minor.ship-docs-in-package.md b/packages/react-router/.changes/minor.ship-docs-in-package.md new file mode 100644 index 0000000000..6a047a1808 --- /dev/null +++ b/packages/react-router/.changes/minor.ship-docs-in-package.md @@ -0,0 +1,3 @@ +Ship a subset of the official documentation inside the `react-router` package +- Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally +- Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 8b0708645a..a93f7b1690 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -105,6 +105,7 @@ }, "scripts": { "build": "wireit", + "prepublishOnly": "node ./scripts/copy-docs.mjs", "watch": "tsup --watch & tsup --config tsup.config.rsc.ts --watch", "typecheck": "tsc" }, @@ -153,6 +154,7 @@ }, "files": [ "dist/", + "docs/", "CHANGELOG.md", "LICENSE.md", "README.md" diff --git a/packages/react-router/scripts/copy-docs.mjs b/packages/react-router/scripts/copy-docs.mjs new file mode 100644 index 0000000000..ea68443eb6 --- /dev/null +++ b/packages/react-router/scripts/copy-docs.mjs @@ -0,0 +1,63 @@ +// Copies a subset of the repo's `docs/` into this package so it ships to npm and +// is available via `react-router/docs/...` package exports for AI coding agents +// and the React Router agent skills. +// +// This runs as part of the package build (see `wireit.build` in package.json). + +/* eslint-disable import/no-nodejs-modules -- This package build script runs in Node. */ +import * as fs from "node:fs"; +import * as path from "node:path"; +import { fileURLToPath } from "node:url"; + +const PACKAGE_DIR = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "..", +); +const SOURCE_DOCS_DIR = path.resolve(PACKAGE_DIR, "../../docs"); +const TARGET_DOCS_DIR = path.resolve(PACKAGE_DIR, "docs"); + +const EXCLUDED_TOP_LEVEL_DIRS = new Set(["api", "community", "tutorials"]); +const EXCLUDED_FILES = new Set(["elements.md", "prettier.config.js"]); + +function copyDocs(relativeDir = "") { + let copied = 0; + let sourceDir = path.join(SOURCE_DOCS_DIR, relativeDir); + + for (let entry of fs.readdirSync(sourceDir, { withFileTypes: true })) { + let relativePath = relativeDir + ? `${relativeDir}/${entry.name}` + : entry.name; + + if (entry.isDirectory()) { + if (relativeDir === "" && EXCLUDED_TOP_LEVEL_DIRS.has(entry.name)) { + continue; + } + + copied += copyDocs(relativePath); + continue; + } + + if (EXCLUDED_FILES.has(relativePath)) continue; + if (!entry.isFile() || !entry.name.endsWith(".md")) continue; + + let source = path.join(SOURCE_DOCS_DIR, relativePath); + let target = path.join(TARGET_DOCS_DIR, relativePath); + + fs.mkdirSync(path.dirname(target), { recursive: true }); + fs.copyFileSync(source, target); + copied++; + } + + return copied; +} + +if (!fs.existsSync(SOURCE_DOCS_DIR)) { + throw new Error(`Could not find docs directory at ${SOURCE_DOCS_DIR}`); +} + +fs.rmSync(TARGET_DOCS_DIR, { recursive: true, force: true }); + +let copied = copyDocs(); +let relativeTargetDocsDir = path.relative(PACKAGE_DIR, TARGET_DOCS_DIR); + +console.log(`Copied ${copied} doc file(s) to ${relativeTargetDocsDir}/`); From 97ef91d6f97e883d2d830fd1aef35ed3ae55e3a1 Mon Sep 17 00:00:00 2001 From: Remix Run Bot Date: Mon, 1 Jun 2026 16:54:41 +0000 Subject: [PATCH 07/14] chore: format --- packages/react-router/.changes/minor.ship-docs-in-package.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-router/.changes/minor.ship-docs-in-package.md b/packages/react-router/.changes/minor.ship-docs-in-package.md index 6a047a1808..77bc235fb6 100644 --- a/packages/react-router/.changes/minor.ship-docs-in-package.md +++ b/packages/react-router/.changes/minor.ship-docs-in-package.md @@ -1,3 +1,4 @@ Ship a subset of the official documentation inside the `react-router` package + - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) From 533fe2842ee1886b94408f66993e93fc4e5eb312 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 3 Jun 2026 17:27:07 -0400 Subject: [PATCH 08/14] Only log future flag warnings once (#15138) * Only log future flag warnings once * Update --- .../.changes/patch.log-future-flags-once.md | 1 + packages/react-router-dev/config/config.ts | 24 ++++++++++++++----- packages/react-router-dev/vite/plugin.ts | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 packages/react-router-dev/.changes/patch.log-future-flags-once.md diff --git a/packages/react-router-dev/.changes/patch.log-future-flags-once.md b/packages/react-router-dev/.changes/patch.log-future-flags-once.md new file mode 100644 index 0000000000..72cb03880e --- /dev/null +++ b/packages/react-router-dev/.changes/patch.log-future-flags-once.md @@ -0,0 +1 @@ +Fix future flag warning URLs and only log each future flag warning one time diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index 7f11db066a..85021b95ff 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -435,12 +435,14 @@ async function resolveConfig({ reactRouterConfigFile, skipRoutes, validateConfig, + shouldLogFutureFlagWarnings, }: { root: string; viteNodeContext: ViteNode.Context; reactRouterConfigFile?: string; skipRoutes?: boolean; validateConfig?: ValidateConfigFunction; + shouldLogFutureFlagWarnings?: boolean; }): Promise { let reactRouterUserConfig: ReactRouterConfig = {}; @@ -757,7 +759,9 @@ async function resolveConfig({ await preset.reactRouterConfigResolved?.({ reactRouterConfig }); } - logFutureFlagWarnings(userAndPresetConfigs.future || {}); + if (shouldLogFutureFlagWarnings) { + logFutureFlagWarnings(userAndPresetConfigs.future || {}); + } return ok(reactRouterConfig); } @@ -767,7 +771,7 @@ function logFutureFlagWarning(flag: string, message: string): void { colors.yellow( ` ⚠️ Future Flag Warning: ${message}\n` + ` You can use the \`future.${flag}\` flag to opt in early.\n` + - ` -> https://reactrouter.com/upgrading/future#future${flag.toLowerCase()}`, + ` -> https://reactrouter.com/7.16.0/upgrading/future#future${flag.toLowerCase()}`, ), ); } @@ -829,12 +833,14 @@ export async function createConfigLoader({ mode, skipRoutes, validateConfig, + shouldLogFutureFlagWarnings, }: { watch: boolean; rootDirectory?: string; mode: string; skipRoutes?: boolean; validateConfig?: ValidateConfigFunction; + shouldLogFutureFlagWarnings?: boolean; }): Promise { root = Path.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd()); @@ -865,11 +871,18 @@ export async function createConfigLoader({ reactRouterConfigFile, skipRoutes, validateConfig, + shouldLogFutureFlagWarnings, }); let appDirectory: string; - let initialConfigResult = await getConfig(); + let initialConfigResult = await resolveConfig({ + root, + viteNodeContext, + reactRouterConfigFile, + skipRoutes, + validateConfig, + }); if (!initialConfigResult.ok) { throw new Error(initialConfigResult.error); @@ -1069,9 +1082,8 @@ export async function resolveEntryFiles({ } // TODO(v8): Remove - only required for Node 20.18 and below - let { readPackageJSON, sortPackage, updatePackage } = await import( - "pkg-types" - ); + let { readPackageJSON, sortPackage, updatePackage } = + await import("pkg-types"); let packageJsonDirectory = Path.dirname(packageJsonPath); let pkgJson = await readPackageJSON(packageJsonDirectory); let deps = pkgJson.dependencies ?? {}; diff --git a/packages/react-router-dev/vite/plugin.ts b/packages/react-router-dev/vite/plugin.ts index 25281a6a50..0d785a8a67 100644 --- a/packages/react-router-dev/vite/plugin.ts +++ b/packages/react-router-dev/vite/plugin.ts @@ -1306,6 +1306,8 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { rootDirectory, mode, watch: viteCommand === "serve", + shouldLogFutureFlagWarnings: + viteCommand !== "build" || viteConfigEnv.isSsrBuild === true, }); await updatePluginContext(); From 63fd291adc6a63db74d55cdb492d6ee62067298f Mon Sep 17 00:00:00 2001 From: Remix Run Bot Date: Wed, 3 Jun 2026 21:27:48 +0000 Subject: [PATCH 09/14] chore: format --- packages/react-router-dev/config/config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index 85021b95ff..15d0ca274a 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -1082,8 +1082,9 @@ export async function resolveEntryFiles({ } // TODO(v8): Remove - only required for Node 20.18 and below - let { readPackageJSON, sortPackage, updatePackage } = - await import("pkg-types"); + let { readPackageJSON, sortPackage, updatePackage } = await import( + "pkg-types" + ); let packageJsonDirectory = Path.dirname(packageJsonPath); let pkgJson = await readPackageJSON(packageJsonDirectory); let deps = pkgJson.dependencies ?? {}; From bc26320107d042457be3f6f709c0406295735bb1 Mon Sep 17 00:00:00 2001 From: Arpit Jain <3242828+arpitjain099@users.noreply.github.com> Date: Thu, 4 Jun 2026 22:40:26 +0900 Subject: [PATCH 10/14] ci: restrict test workflow permissions to read-only (#15133) --- .github/workflows/test.yml | 3 +++ contributors.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 830e6120be..6e5c621aa8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,6 +19,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: test: name: "🧪 Test: (Node: ${{ matrix.node }})" diff --git a/contributors.yml b/contributors.yml index 61aae02e3c..afc0abb6d3 100644 --- a/contributors.yml +++ b/contributors.yml @@ -43,6 +43,7 @@ - Armanio - arnassavickas - aroyan +- arpitjain099 - Artur- - ashusnapx - avipatel97 From 7965e50072eb7d3a28b770a5e131c45ed9367926 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Thu, 4 Jun 2026 10:17:03 -0400 Subject: [PATCH 11/14] Update link to v7 instead of a specific version (#15147) --- packages/react-router-dev/config/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index 15d0ca274a..bc3148d355 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -771,7 +771,7 @@ function logFutureFlagWarning(flag: string, message: string): void { colors.yellow( ` ⚠️ Future Flag Warning: ${message}\n` + ` You can use the \`future.${flag}\` flag to opt in early.\n` + - ` -> https://reactrouter.com/7.16.0/upgrading/future#future${flag.toLowerCase()}`, + ` -> https://reactrouter.com/v7/upgrading/future#future${flag.toLowerCase()}`, ), ); } From 195a0d03c1417127ccee73853058c8521beb4fce Mon Sep 17 00:00:00 2001 From: Ryan Florence Date: Thu, 4 Jun 2026 08:19:00 -0600 Subject: [PATCH 12/14] Release v7.17.0 (#15145) Co-authored-by: Remix Run Bot --- CHANGELOG.md | 26 +++++++++++++++++++ packages/create-react-router/CHANGELOG.md | 6 +++++ packages/create-react-router/package.json | 2 +- packages/react-router-architect/CHANGELOG.md | 8 ++++++ packages/react-router-architect/package.json | 2 +- packages/react-router-cloudflare/CHANGELOG.md | 7 +++++ packages/react-router-cloudflare/package.json | 2 +- .../.changes/patch.log-future-flags-once.md | 1 - .../unstable.rsc-optimize-deps-route-scan.md | 1 - packages/react-router-dev/CHANGELOG.md | 16 ++++++++++++ packages/react-router-dev/package.json | 2 +- packages/react-router-dom/CHANGELOG.md | 7 +++++ packages/react-router-dom/package.json | 2 +- packages/react-router-express/CHANGELOG.md | 8 ++++++ packages/react-router-express/package.json | 2 +- packages/react-router-fs-routes/CHANGELOG.md | 7 +++++ packages/react-router-fs-routes/package.json | 2 +- packages/react-router-node/CHANGELOG.md | 7 +++++ packages/react-router-node/package.json | 2 +- .../CHANGELOG.md | 7 +++++ .../package.json | 2 +- packages/react-router-serve/CHANGELOG.md | 9 +++++++ packages/react-router-serve/package.json | 2 +- .../.changes/minor.ship-docs-in-package.md | 4 --- packages/react-router/CHANGELOG.md | 9 +++++++ packages/react-router/package.json | 2 +- 26 files changed, 128 insertions(+), 17 deletions(-) delete mode 100644 packages/react-router-dev/.changes/patch.log-future-flags-once.md delete mode 100644 packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md delete mode 100644 packages/react-router/.changes/minor.ship-docs-in-package.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d84e14521..5003b54fb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,10 @@ We manage release notes in this file instead of the paginated Github Releases Pa Table of Contents - [React Router Releases](#react-router-releases) + - [v7.17.0](#v7170) - [v7.16.0](#v7160) + - [Stabilized `future.v8_trailingSlashAwareDataRequests`](#stabilized-futurev8_trailingslashawaredatarequests) + - [Pre-v8 Future Flag Warnings](#pre-v8-future-flag-warnings) - [v7.15.1](#v7151) - [v7.15.0](#v7150) - [Stabilizations](#stabilizations) @@ -174,6 +177,29 @@ We manage release notes in this file instead of the paginated Github Releases Pa +## v7.17.0 + +Date: 2026-06-04 + +### Minor Changes + +- `react-router` - Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/15121)) + + - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally + - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) + +### Patch Changes + +- `@react-router/dev` - Fix future flag warning URLs and only log each future flag warning one time ([#15138](https://github.com/remix-run/react-router/pull/15138)) + +### Unstable Changes + +⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ + +- `@react-router/dev` - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005)) + +**Full Changelog**: [`v7.16.0...v7.17.0`](https://github.com/remix-run/react-router/compare/react-router@7.16.0...react-router@7.17.0) + ## v7.16.0 Date: 2026-05-28 diff --git a/packages/create-react-router/CHANGELOG.md b/packages/create-react-router/CHANGELOG.md index d6f143fbd4..7f3ada89a8 100644 --- a/packages/create-react-router/CHANGELOG.md +++ b/packages/create-react-router/CHANGELOG.md @@ -1,5 +1,11 @@ # `create-react-router` +## v7.17.0 + +### Patch Changes + +- _No changes_ + ## v7.16.0 ### Patch Changes diff --git a/packages/create-react-router/package.json b/packages/create-react-router/package.json index 0028d930f1..78d6fbebd4 100644 --- a/packages/create-react-router/package.json +++ b/packages/create-react-router/package.json @@ -1,6 +1,6 @@ { "name": "create-react-router", - "version": "7.16.0", + "version": "7.17.0", "description": "Create a new React Router app", "homepage": "https://reactrouter.com", "bugs": { diff --git a/packages/react-router-architect/CHANGELOG.md b/packages/react-router-architect/CHANGELOG.md index e3acd09f5e..9c89a75012 100644 --- a/packages/react-router-architect/CHANGELOG.md +++ b/packages/react-router-architect/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/architect` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + - [`@react-router/node@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-architect/package.json b/packages/react-router-architect/package.json index 5b39f8953b..708b810292 100644 --- a/packages/react-router-architect/package.json +++ b/packages/react-router-architect/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/architect", - "version": "7.16.0", + "version": "7.17.0", "description": "Architect server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-cloudflare/CHANGELOG.md b/packages/react-router-cloudflare/CHANGELOG.md index 73fe51a5d1..88deb9e892 100644 --- a/packages/react-router-cloudflare/CHANGELOG.md +++ b/packages/react-router-cloudflare/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/cloudflare` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-cloudflare/package.json b/packages/react-router-cloudflare/package.json index 400e2c8e84..dbd0171557 100644 --- a/packages/react-router-cloudflare/package.json +++ b/packages/react-router-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/cloudflare", - "version": "7.16.0", + "version": "7.17.0", "description": "Cloudflare platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-dev/.changes/patch.log-future-flags-once.md b/packages/react-router-dev/.changes/patch.log-future-flags-once.md deleted file mode 100644 index 72cb03880e..0000000000 --- a/packages/react-router-dev/.changes/patch.log-future-flags-once.md +++ /dev/null @@ -1 +0,0 @@ -Fix future flag warning URLs and only log each future flag warning one time diff --git a/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md b/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md deleted file mode 100644 index bff7bf5569..0000000000 --- a/packages/react-router-dev/.changes/unstable.rsc-optimize-deps-route-scan.md +++ /dev/null @@ -1 +0,0 @@ -Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index 47d75c2079..8d3d35dae9 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -1,5 +1,21 @@ # `@react-router/dev` +## v7.17.0 + +### Patch Changes + +- Fix future flag warning URLs and only log each future flag warning one time ([#15138](https://github.com/remix-run/react-router/pull/15138)) + +### Unstable Changes + +⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ + +- Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005)) +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + - [`@react-router/node@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.17.0) + - [`@react-router/serve@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@7.17.0) + ## v7.16.0 ### Minor Changes diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json index 48c2a4e782..aeea7810e0 100644 --- a/packages/react-router-dev/package.json +++ b/packages/react-router-dev/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/dev", - "version": "7.16.0", + "version": "7.17.0", "description": "Dev tools and CLI for React Router", "homepage": "https://reactrouter.com", "bugs": { diff --git a/packages/react-router-dom/CHANGELOG.md b/packages/react-router-dom/CHANGELOG.md index a1bda8bdee..d04fa8edf6 100644 --- a/packages/react-router-dom/CHANGELOG.md +++ b/packages/react-router-dom/CHANGELOG.md @@ -1,5 +1,12 @@ # react-router-dom +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-dom/package.json b/packages/react-router-dom/package.json index 1a6f69a153..8fcfe94b32 100644 --- a/packages/react-router-dom/package.json +++ b/packages/react-router-dom/package.json @@ -1,6 +1,6 @@ { "name": "react-router-dom", - "version": "7.16.0", + "version": "7.17.0", "description": "Declarative routing for React web applications", "keywords": [ "react", diff --git a/packages/react-router-express/CHANGELOG.md b/packages/react-router-express/CHANGELOG.md index 3e33abf188..1ec75e54c5 100644 --- a/packages/react-router-express/CHANGELOG.md +++ b/packages/react-router-express/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/express` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + - [`@react-router/node@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-express/package.json b/packages/react-router-express/package.json index 108111516d..5fd240c30d 100644 --- a/packages/react-router-express/package.json +++ b/packages/react-router-express/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/express", - "version": "7.16.0", + "version": "7.17.0", "description": "Express server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-fs-routes/CHANGELOG.md b/packages/react-router-fs-routes/CHANGELOG.md index 3053e177b2..1a6c0ab458 100644 --- a/packages/react-router-fs-routes/CHANGELOG.md +++ b/packages/react-router-fs-routes/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/fs-routes` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`@react-router/dev@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/dev@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-fs-routes/package.json b/packages/react-router-fs-routes/package.json index 015656d848..0df39edb3d 100644 --- a/packages/react-router-fs-routes/package.json +++ b/packages/react-router-fs-routes/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/fs-routes", - "version": "7.16.0", + "version": "7.17.0", "description": "File system routing conventions for React Router, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-node/CHANGELOG.md b/packages/react-router-node/CHANGELOG.md index 530222ab0c..00c05e6b74 100644 --- a/packages/react-router-node/CHANGELOG.md +++ b/packages/react-router-node/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/node` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json index 9125ff2ca8..b8199c7375 100644 --- a/packages/react-router-node/package.json +++ b/packages/react-router-node/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/node", - "version": "7.16.0", + "version": "7.17.0", "description": "Node.js platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md index f2a02f3a79..74899f70af 100644 --- a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md +++ b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/remix-config-routes-adapter` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`@react-router/dev@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/dev@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-remix-routes-option-adapter/package.json b/packages/react-router-remix-routes-option-adapter/package.json index 6bfecb2d2f..51760df1d8 100644 --- a/packages/react-router-remix-routes-option-adapter/package.json +++ b/packages/react-router-remix-routes-option-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/remix-routes-option-adapter", - "version": "7.16.0", + "version": "7.17.0", "description": "Adapter for Remix's \"routes\" config option, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-serve/CHANGELOG.md b/packages/react-router-serve/CHANGELOG.md index df8197c2c3..cb1a1077e7 100644 --- a/packages/react-router-serve/CHANGELOG.md +++ b/packages/react-router-serve/CHANGELOG.md @@ -1,5 +1,14 @@ # `@react-router/serve` +## v7.17.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@7.17.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.17.0) + - [`@react-router/express@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/express@7.17.0) + - [`@react-router/node@7.17.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@7.17.0) + ## v7.16.0 ### Patch Changes diff --git a/packages/react-router-serve/package.json b/packages/react-router-serve/package.json index 1bff505da3..9683e06c03 100644 --- a/packages/react-router-serve/package.json +++ b/packages/react-router-serve/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/serve", - "version": "7.16.0", + "version": "7.17.0", "description": "Production application server for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router/.changes/minor.ship-docs-in-package.md b/packages/react-router/.changes/minor.ship-docs-in-package.md deleted file mode 100644 index 77bc235fb6..0000000000 --- a/packages/react-router/.changes/minor.ship-docs-in-package.md +++ /dev/null @@ -1,4 +0,0 @@ -Ship a subset of the official documentation inside the `react-router` package - -- Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally -- Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index f257fda000..8934fc05c7 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,14 @@ # `react-router` +## v7.17.0 + +### Minor Changes + +- Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/15121)) + + - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally + - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) + ## v7.16.0 ### Minor Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index a93f7b1690..ad52ea6fe1 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "react-router", - "version": "7.16.0", + "version": "7.17.0", "description": "Declarative routing for React", "keywords": [ "react", From 54f5904653ea8427c62219d092a81181a361f893 Mon Sep 17 00:00:00 2001 From: Remix Run Bot Date: Thu, 4 Jun 2026 14:30:01 +0000 Subject: [PATCH 13/14] chore: format --- CHANGELOG.md | 3 +-- packages/react-router-dev/CHANGELOG.md | 2 +- packages/react-router/CHANGELOG.md | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5003b54fb9..a80254e96f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -184,7 +184,6 @@ Date: 2026-06-04 ### Minor Changes - `react-router` - Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/15121)) - - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) @@ -194,7 +193,7 @@ Date: 2026-06-04 ### Unstable Changes -⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ +⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ - `@react-router/dev` - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005)) diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index 8d3d35dae9..41db76061e 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -8,7 +8,7 @@ ### Unstable Changes -⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ +⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005)) - Updated dependencies: diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 8934fc05c7..8837cfcd7b 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -5,7 +5,6 @@ ### Minor Changes - Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/15121)) - - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) From d6f3a05d4124ae9c1f2f74c599f80d091268ce0c Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Thu, 4 Jun 2026 12:06:27 -0400 Subject: [PATCH 14/14] Drop dev branch from workflows/docs (#15148) * chore: remove dev branch references * chore: run releases from main * chore: simplify release publish check * chore: update agent skill branch guidance --- .agents/skills/fix-bug/SKILL.md | 6 +- .agents/skills/implement-rfc/SKILL.md | 10 +- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/workflows/deduplicate-lock-file.yml | 2 +- .github/workflows/docs.yml | 1 - .github/workflows/format.yml | 1 - .github/workflows/integration-full.yml | 3 +- .github/workflows/preview.yml | 16 +-- .github/workflows/release.yml | 25 ++++- .github/workflows/test.yml | 1 - AGENTS.md | 5 +- DEVELOPMENT.md | 34 +++---- README.md | 2 +- .../framework-conventions/entry.server.tsx.md | 2 +- docs/community/contributing.md | 11 +-- docs/explanation/type-safety.md | 2 +- scripts/changes/pr.ts | 8 +- scripts/changes/release.sh | 98 ------------------- scripts/previews/branch.ts | 8 +- 19 files changed, 68 insertions(+), 169 deletions(-) delete mode 100755 scripts/changes/release.sh diff --git a/.agents/skills/fix-bug/SKILL.md b/.agents/skills/fix-bug/SKILL.md index 5134491b27..e1c4b3c4b8 100644 --- a/.agents/skills/fix-bug/SKILL.md +++ b/.agents/skills/fix-bug/SKILL.md @@ -12,10 +12,10 @@ Fix the bug reported in the following GitHub issue: $ARGUMENTS Bug fixes should start from a clean working tree. If there are changes, prompt me to resolve them before continuing. -Bugs should be fixed from the `dev` branch in in a new branch using the format `{author}/{semantic-branch-name}` (i.e., `brophdawg11/fix-navigation`): +Bugs should be fixed from the `main` branch in a new branch using the format `{author}/{semantic-branch-name}` (i.e., `brophdawg11/fix-navigation`): ```sh -git branch {author}/{semantic-branch-name} dev +git branch {author}/{semantic-branch-name} main git checkout {author}/{semantic-branch-name} ``` @@ -144,4 +144,4 @@ Ask me to review the changes and iterate based on any feedback. ### 8. Open PR -Once I approve the fix, commit the changes and open a PR to `dev`. Include a `Closes #NNNN` in the description to link the PR to the original issue. Also link the issue in the `Development` sidebar +Once I approve the fix, commit the changes and open a PR to `main`. Include a `Closes #NNNN` in the description to link the PR to the original issue. Also link the issue in the `Development` sidebar diff --git a/.agents/skills/implement-rfc/SKILL.md b/.agents/skills/implement-rfc/SKILL.md index f73552ae33..aec439d3ec 100644 --- a/.agents/skills/implement-rfc/SKILL.md +++ b/.agents/skills/implement-rfc/SKILL.md @@ -12,10 +12,10 @@ Implement the RFC from the following GitHub discussion: $ARGUMENTS RFC implementations should start from a clean working tree. If there are uncommitted changes, stop and ask me to resolve them before continuing. -- If you are already on a named branch that is at the same HEAD as `dev`, use that branch. -- Otherwise, create a branch from `dev` using the format `{author}/rfc-{semantic-name}`: +- If you are already on a named branch that is at the same HEAD as `main`, use that branch. +- Otherwise, create a branch from `main` using the format `{author}/rfc-{semantic-name}`: ```sh - git branch {author}/rfc-{semantic-name} dev + git branch {author}/rfc-{semantic-name} main git checkout {author}/rfc-{semantic-name} ``` @@ -224,10 +224,10 @@ Ask me to review and iterate before opening a PR. ### 12. Commit -Once I approve, commit and open a PR to `dev`: +Once I approve, commit and open a PR to `main`: ```sh -gh pr create --base dev --title "feat: " --body "..." +gh pr create --base main --title "feat: " --body "..." ``` PR body should include: diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4ef4cbaa8e..2219542e43 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -17,7 +17,7 @@ body: 🏆 The most helpful reproduction is to use our _bug report integration test_ template: 1. [Fork `remix-run/react-router`](https://github.com/remix-run/react-router/fork) - 2. Open [`integration/bug-report-test.ts`](https://github.com/remix-run/react-router/blob/dev/integration/bug-report-test.ts) in your editor + 2. Open [`integration/bug-report-test.ts`](https://github.com/remix-run/react-router/blob/main/integration/bug-report-test.ts) in your editor 3. Follow the instructions to create a failing bug report test 4. Link to your forked branch with the failing test in this issue diff --git a/.github/workflows/deduplicate-lock-file.yml b/.github/workflows/deduplicate-lock-file.yml index ae862582c8..f36f572900 100644 --- a/.github/workflows/deduplicate-lock-file.yml +++ b/.github/workflows/deduplicate-lock-file.yml @@ -3,7 +3,7 @@ name: ⚙️ Deduplicate lock file on: push: branches: - - dev + - main paths: - pnpm-lock.yaml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index cb4e2ad2c5..6438bee719 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - dev paths: - "packages/**/*.ts" - "packages/**/*.tsx" diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 490c785090..e25bcde3cc 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - dev concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/integration-full.yml b/.github/workflows/integration-full.yml index 91633ebe83..d34ce8ad3d 100644 --- a/.github/workflows/integration-full.yml +++ b/.github/workflows/integration-full.yml @@ -1,13 +1,12 @@ name: Branch -# main/dev branches will get the full run across +# The main branch gets the full run across # all OS/browsers for multiple node versions on: push: branches: - main - - dev paths-ignore: - "packages/*/.changes/**" - "decisions/**" diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index d5d44d74d4..58ed9e5819 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -1,7 +1,7 @@ # Create "installable" preview branches # -# Commits to `dev` push builds to a `preview/dev` branch: -# pnpm install "remix-run/react-router#preview/dev&path:packages/react-router" +# Commits to `main` push builds to a `preview/main` branch: +# pnpm install "remix-run/react-router#preview/main&path:packages/react-router" # # Pull Requests create `preview/pr-{number}` branches: # pnpm install "remix-run/react-router#preview/pr-12345&path:packages/react-router" @@ -14,7 +14,7 @@ name: Preview Build on: push: branches: - - dev + - main workflow_dispatch: inputs: baseBranch: @@ -28,8 +28,8 @@ on: concurrency: # Include `event_name` here because when a pull_request is merged (closed), the - # `github.ref` goes back to `ref/heads/dev` which will conflict with the run on - # `dev` from the merged PR + # `github.ref` goes back to `ref/heads/main` which will conflict with the run on + # `main` from the merged PR group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} cancel-in-progress: true @@ -72,12 +72,12 @@ jobs: git config --local user.email "hello@remix.run" git config --local user.name "Remix Run Bot" - # Build and force push over the preview/dev branch + # Build and force push over the preview/main branch - name: Build/push branch (push) if: github.event_name == 'push' run: | - pnpm run previews:branch preview/dev - git push --force --set-upstream origin preview/dev + pnpm run previews:branch preview/main + git push --force --set-upstream origin preview/main echo "💿 pushed installable branch: https://github.com/$GITHUB_REPOSITORY/commit/$(git rev-parse HEAD)" # Build and force push over the PR preview/pr-{number} branch + comment on the PR diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 61419cf109..49d25fe4be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,7 @@ # # Specific jobs only run on the proper trigger: # -# - Change file driven stable releases (push to release/hotfix branches) +# - Change file driven stable releases (push to main/hotfix branches) # - Experimental releases (from a workflow_dispatch trigger) name: 🚢 Release/Publish @@ -12,7 +12,7 @@ name: 🚢 Release/Publish on: push: branches: - - "release" + - "main" - "hotfix" workflow_dispatch: inputs: @@ -31,6 +31,7 @@ jobs: runs-on: ubuntu-latest outputs: has_change_files: ${{ steps.check.outputs.has_change_files }} + should_publish: ${{ steps.needs-publish.outputs.should_publish }} steps: - name: Checkout uses: actions/checkout@v6 @@ -45,10 +46,25 @@ jobs: echo "$change_files" echo "has_change_files=true" >> $GITHUB_OUTPUT else - echo "No change files found, proceeding to publish." + echo "No change files found." echo "has_change_files=false" >> $GITHUB_OUTPUT fi + - name: needs-publish + id: needs-publish + if: steps.check.outputs.has_change_files == 'false' + run: | + version=$(node -p "require('./packages/react-router/package.json').version") + published_version=$(npm view "react-router@$version" version || true) + + if [ "$published_version" = "$version" ]; then + echo "react-router@$version is already published. Skipping publish." + echo "should_publish=false" >> $GITHUB_OUTPUT + else + echo "react-router@$version is not published yet. Publishing is needed." + echo "should_publish=true" >> $GITHUB_OUTPUT + fi + pull_request: name: Open pull request needs: check @@ -61,6 +77,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 with: + ref: ${{ github.ref_name }} fetch-depth: 0 token: ${{ secrets.FORMAT_PAT }} @@ -84,7 +101,7 @@ jobs: publish: name: Publish needs: check - if: needs.check.outputs.has_change_files == 'false' + if: needs.check.outputs.should_publish == 'true' runs-on: ubuntu-latest permissions: contents: write # enable pushing changes to the origin diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6e5c621aa8..ffd903f3cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - dev tags-ignore: - v* paths-ignore: diff --git a/AGENTS.md b/AGENTS.md index 7ba6f50fc6..61fa0db792 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -136,10 +136,9 @@ Brief description of the change ## Branching -- **`main`**: Latest stable release -- **`dev`**: Active development (branch from here for code changes) +- **`main`**: Active Development - **`v6`**: v6.x maintenance -- Branch from `main` for docs-only changes +- Branch from `main` for code and docs changes ## Key Files diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 30bd9d967b..f61da82a27 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -4,44 +4,36 @@ Releases are handled by a mostly automated process consisting of: -- Manual [`release.sh`](./scripts/changes/release.sh) scripts to start/finish releases - Typescript scripts in [`scripts/changes/`](./scripts/changes/) - The [release.yml](./.github/workflows/release.yml) Github workflow When you are ready to begin the release process: -- Start with a clean git working directory on the `dev` branch -- Pull latest `dev` -- Manually run `./scripts/changes/release.sh start` - - creates the `release` branch from `dev` - - merges in latest `main` - - pushes to `origin/release` -- The `release.yml` workflow will see the `release` branch with change files in it: +- Merge all release-bound changes to `main` with their change files +- The `release.yml` workflow will see the `main` branch with change files in it: - This triggers the "PR" step and runs `scripts/changes/pr.ts` - - This will create a new `release-pr` branch from `release` + - This will create or update a `release-pr` branch from `main` - Runs `scripts/changes/version.ts` - Updates versions - Generate changelogs - Deletes change files - - Opens a PR to the `release` branch -- Once that PR is merged, the `release.yml` workflow will run again against `release` and see no change files: - - This triggers the "publish" step and runs `scripts/changes/publish.ts` + - Opens a PR from `release-pr` to `main` +- Once that PR is merged, the `release.yml` workflow will run again against `main` and see no change files: + - This triggers the `needs-publish` step, which checks npm to see if the current `react-router` version is already published + - If publishing is needed, this triggers the "publish" step and runs `scripts/changes/publish.ts` - Publishes all packages to npm - Tags the commits and pushes tags to the origin - Creates a github release -- Pull latest `release` branch -- Manually run `./scripts/changes/release.sh finish` - - Merges the `release` branch into `dev` and `main` and pushes to origin - - Deletes the `release` branch +- The `release-pr` branch can be deleted after the PR is merged -### Iterating a release branch +### Iterating a release PR You may need to make changes to a release while the release PR is open - to do so: -- Branch off of `release` and make whatever changes you need +- Branch off of `main` and make whatever changes you need - Add changes files as needed -- Push your branch to GitHub and PR it to `release` -- Once reviewed/approved, merge the PR to the `release` branch +- Push your branch to GitHub and PR it to `main` +- Once reviewed/approved, merge the PR to `main` - This will trigger an update of the release PR created above ## Hotfix releases @@ -66,5 +58,5 @@ Hotfix releases operate like the above but off of a hotfix branch that is create - Publishes all packages to npm - Tags the commits and pushes tags to the origin - Creates a github release -- Merge the `hotfix` branch into `dev` and `main` and push to origin +- Merge the `hotfix` branch into `main` and push to origin - Deletes the `hotfix` branch diff --git a/README.md b/README.md index 898d09db68..e7249cc3b2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [npm-badge]: https://img.shields.io/npm/v/react-router-dom.svg [npm]: https://www.npmjs.org/package/react-router-dom -[build-badge]: https://img.shields.io/github/actions/workflow/status/remix-run/react-router/test.yml?branch=dev&style=square +[build-badge]: https://img.shields.io/github/actions/workflow/status/remix-run/react-router/test.yml?branch=main&style=square [build]: https://github.com/remix-run/react-router/actions/workflows/test.yml React Router is a multi-strategy router for React bridging the gap from React 18 to React 19. You can use it maximally as a React framework or minimally as a library with your own architecture. diff --git a/docs/api/framework-conventions/entry.server.tsx.md b/docs/api/framework-conventions/entry.server.tsx.md index 14d107dd65..aa9e854162 100644 --- a/docs/api/framework-conventions/entry.server.tsx.md +++ b/docs/api/framework-conventions/entry.server.tsx.md @@ -160,5 +160,5 @@ Note that this does not handle thrown `Response` instances from your `loader`/`a [streaming]: ../../how-to/suspense [rendertopipeablestream]: https://react.dev/reference/react-dom/server/renderToPipeableStream [rendertoreadablestream]: https://react.dev/reference/react-dom/server/renderToReadableStream -[node-streaming-entry-server]: https://github.com/remix-run/react-router/blob/dev/packages/react-router-dev/config/defaults/entry.server.node.tsx +[node-streaming-entry-server]: https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/config/defaults/entry.server.node.tsx [templates-repo]: https://github.com/remix-run/react-router-templates diff --git a/docs/community/contributing.md b/docs/community/contributing.md index 115e374ea8..474ee6a108 100644 --- a/docs/community/contributing.md +++ b/docs/community/contributing.md @@ -16,8 +16,7 @@ Before going any further, please read the Open Governance [blog post](https://re Before you can contribute to the codebase, you will need to fork the repo. This will look a bit different depending on what type of contribution you are making: -- All new features, bug-fixes, or **anything that touches `react-router` code** should be branched off of and merged into the `dev` branch -- Changes that only touch documentation can be branched off of and merged into the `main` branch +- All new features, bug-fixes, documentation updates, or **anything that touches `react-router` code** should be branched off of and merged into the `main` branch The following steps will get you set up to contribute changes to this repo: @@ -28,16 +27,13 @@ The following steps will get you set up to contribute changes to this repo: # in a terminal, cd to parent directory where you want your clone to be, then git clone https://github.com//react-router.git cd react-router - - # if you are making *any* code changes, make sure to checkout the dev branch - git checkout dev ``` 3. Install dependencies and build. React Router uses [pnpm](https://pnpm.io), so you should too. If you install using `npm`, unnecessary `package-lock.json` files will be generated. ## Think You Found a Bug? -Please conform to the issue template and provide a **minimal** and **runnable** reproduction. Best is a pull request with a [failing test](https://github.com/remix-run/react-router/blob/dev/integration/bug-report-test.ts). Next best is a link to [StackBlitz](https://reactrouter.com/new), CodeSandbox, or GitHub repository that illustrates the bug. +Please conform to the issue template and provide a **minimal** and **runnable** reproduction. Best is a pull request with a [failing test](https://github.com/remix-run/react-router/blob/main/integration/bug-report-test.ts). Next best is a link to [StackBlitz](https://reactrouter.com/new), CodeSandbox, or GitHub repository that illustrates the bug. ## Issue Not Getting Attention? @@ -59,7 +55,7 @@ Examples can be added directly to the `main` branch. Create a branch off of your Pull requests need only the approval of two or more collaborators to be merged; when the PR author is a collaborator, that counts as one. -When creating the PR in GitHub, make sure that you set the base to the correct branch. If you are submitting a PR that touches any code, this should be the `dev` branch. You set the base in GitHub when authoring the PR with the dropdown below the "Compare changes" heading: +When creating the PR in GitHub, make sure that you set the base to the `main` branch. You set the base in GitHub when authoring the PR with the dropdown below the "Compare changes" heading: ### Tests @@ -118,7 +114,6 @@ This repo maintains separate branches for different purposes. They will look som ``` - main > the most recent release and current docs -- dev > code under active development between stable releases - v6 > the most recent code for a specific major release ``` diff --git a/docs/explanation/type-safety.md b/docs/explanation/type-safety.md index 734a24a033..0ee95fd1ed 100644 --- a/docs/explanation/type-safety.md +++ b/docs/explanation/type-safety.md @@ -50,7 +50,7 @@ React Router's type generation executes your route config (`app/routes.ts` by de It then generates a `+types/.d.ts` for each route within a special `.react-router/types/` directory. With [`rootDirs` configured][route-module-type-safety], TypeScript can import these generated files as if they were right next to their corresponding route modules. -For a deeper dive into some of the design decisions, check out our [type inference decision doc](https://github.com/remix-run/react-router/blob/dev/decisions/0012-type-inference.md). +For a deeper dive into some of the design decisions, check out our [type inference decision doc](https://github.com/remix-run/react-router/blob/main/decisions/0012-type-inference.md). [route-module-type-safety]: ../how-to/route-module-type-safety diff --git a/scripts/changes/pr.ts b/scripts/changes/pr.ts index 00468478f2..875032e908 100644 --- a/scripts/changes/pr.ts +++ b/scripts/changes/pr.ts @@ -20,10 +20,8 @@ let args = process.argv.slice(2); let preview = args.includes("--preview"); let baseBranch = logAndExec("git rev-parse --abbrev-ref HEAD", true).trim(); -if (!preview && !["release", "hotfix"].includes(baseBranch)) { - throw new Error( - "Error: script must be run from the hotfix or release branch", - ); +if (!preview && !["main", "hotfix"].includes(baseBranch)) { + throw new Error("Error: script must be run from the main or hotfix branch"); } let prBranch = baseBranch === "hotfix" ? "hotfix-pr" : "release-pr"; @@ -79,7 +77,7 @@ async function main() { // Generate content let commitMessage = generateCommitMessage(releases); - let prTitle = `${baseBranch === "hotfix" ? "Hotfix Release" : "Release"} ${releases[0].nextVersion}`; + let prTitle = `${baseBranch === "hotfix" ? "Hotfix Release" : "Release"} v${releases[0].nextVersion}`; let prBody = generatePrBody(releases); if (preview) { diff --git a/scripts/changes/release.sh b/scripts/changes/release.sh deleted file mode 100755 index 9fc01ad15a..0000000000 --- a/scripts/changes/release.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -set -x -set -e - -COMMAND=$1 - -if [[ "${COMMAND}" != "start" && "${COMMAND}" != "finish" ]]; then - echo "Usage: $0 " - exit 1 -fi - -if [[ "${COMMAND}" == "start" ]]; then - - if [[ -n $(git status --porcelain) ]]; then - echo "Error: Your git working directory is not clean. Please commit or stash your changes." - exit 1 - fi - - set +e - git ls-remote --exit-code --heads origin release - EXIT_CODE=$? - if [[ $EXIT_CODE == '0' ]]; then - echo "Error: Remote branch 'release' already exists." - exit 1 - fi - set -e - - git checkout main - git pull - git checkout dev - git pull - git checkout -b release - git merge main --no-edit - - if [[ -n $(git status --porcelain) ]]; then - echo "Error: Your git working directory is not clean after merging main into release." - exit 1 - fi - - git push --set-upstream origin release - -elif [[ "${COMMAND}" == "finish" ]]; then - - CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) - if [[ "${CURRENT_BRANCH}" != "release" ]]; then - echo "Error: Script must be run from the 'release' branch." - exit 1 - fi - - if [[ -n $(git status --porcelain) ]]; then - echo "Error: Your git working directory is not clean. Please commit or stash your changes." - exit 1 - fi - - git pull - git checkout main - git pull - git merge release --no-edit - - if [[ -n $(git status --porcelain) ]]; then - echo "Error: Your git working directory is not clean after the merge to main." - exit 1 - fi - - git push - - git checkout dev - git pull - git merge release --no-edit - - if [[ -n $(git status --porcelain) ]]; then - echo "Error: Your git working directory is not clean after the merge to dev." - exit 1 - fi - - git push - - git branch -d release-pr &> /dev/null || true - git branch -d release - - set +e - git ls-remote --exit-code --heads origin release-pr - EXIT_CODE=$? - if [[ $EXIT_CODE == '0' ]]; then - git push origin --delete release-pr - fi - - git ls-remote --exit-code --heads origin release - EXIT_CODE=$? - if [[ $EXIT_CODE == '0' ]]; then - git push origin --delete release - fi - set -e -fi - -set +e -set +x diff --git a/scripts/previews/branch.ts b/scripts/previews/branch.ts index 44653e0403..f6e0558dc6 100644 --- a/scripts/previews/branch.ts +++ b/scripts/previews/branch.ts @@ -4,10 +4,10 @@ import * as util from "node:util"; import { logAndExec } from "../utils/process.ts"; /** - * This script prepares a base branch (usually `dev`) to be PNPM-installable - * directly from GitHub via a new branch (usually `preview/dev`): + * This script prepares a base branch (usually `main`) to be PNPM-installable + * directly from GitHub via a new branch (usually `preview/main`): * - * pnpm install "remix-run/react-router#preview/dev&path:packages/react-router" + * pnpm install "remix-run/react-router#preview/main&path:packages/react-router" * * To do this, we can run a build, make some minor changes to the repo, and * commit the build + changes to the new branch. These changes would never be @@ -22,7 +22,7 @@ import { logAndExec } from "../utils/process.ts"; * - Copies all `publishConfig`'s down so we get `exports` from `dist/` instead of `src/` * - Commits the changes * - * Then, after pushing, `pnpm install "remix-run/react-router#preview/dev&path:packages/react-router"` + * Then, after pushing, `pnpm install "remix-run/react-router#preview/main&path:packages/react-router"` * sees the `react-router` nested deps and they all point to github with similar URLs so * they install as nested deps the same way. */