diff --git a/.changeset/pre.json b/.changeset/pre.json index 237e90f9c7..6baba370c0 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -28,5 +28,19 @@ "@playground/split-route-modules-spa": "0.0.0", "@playground/vite-plugin-cloudflare": "0.0.0" }, - "changesets": [] + "changesets": [ + "big-ladybugs-brush", + "flat-seas-own", + "funny-paws-divide", + "gold-baboons-roll", + "gold-socks-attack", + "loud-actors-shop", + "neat-candles-stare", + "odd-hounds-ring", + "purple-boats-bake", + "rude-lobsters-design", + "small-rocks-grab", + "sweet-parents-hug", + "unlucky-pigs-chew" + ] } diff --git a/packages/create-react-router/CHANGELOG.md b/packages/create-react-router/CHANGELOG.md index 85040a474a..929d409504 100644 --- a/packages/create-react-router/CHANGELOG.md +++ b/packages/create-react-router/CHANGELOG.md @@ -1,5 +1,7 @@ # `create-react-router` +## 7.6.1-pre.0 + ## 7.6.0 _No changes_ diff --git a/packages/create-react-router/package.json b/packages/create-react-router/package.json index c5587c879f..00b3bb85f5 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.6.0", + "version": "7.6.1-pre.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 a7d1626957..15d13e6d2a 100644 --- a/packages/react-router-architect/CHANGELOG.md +++ b/packages/react-router-architect/CHANGELOG.md @@ -1,5 +1,14 @@ # `@react-router/architect` +## 7.6.1-pre.0 + +### Patch Changes + +- Update `@architect/functions` from `^5.2.0` to `^7.0.0` ([#13556](https://github.com/remix-run/react-router/pull/13556)) +- Updated dependencies: + - `react-router@7.6.1-pre.0` + - `@react-router/node@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-architect/package.json b/packages/react-router-architect/package.json index 8b5831bafd..a9cbebc90a 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.6.0", + "version": "7.6.1-pre.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 a1676a6975..d829b2544a 100644 --- a/packages/react-router-cloudflare/CHANGELOG.md +++ b/packages/react-router-cloudflare/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/cloudflare` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-cloudflare/package.json b/packages/react-router-cloudflare/package.json index 9349c573b8..348a3b3cfe 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.6.0", + "version": "7.6.1-pre.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/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index 89b7f678f5..122d0ec339 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -1,5 +1,117 @@ # `@react-router/dev` +## 7.6.1-pre.0 + +### Patch Changes + +- Prevent typegen with route files are outside the app directory ([#12996](https://github.com/remix-run/react-router/pull/12996)) +- Fix typegen when same route is used at multiple paths ([#13574](https://github.com/remix-run/react-router/pull/13574)) + + For example, `routes/route.tsx` is used at 4 different paths here: + + ```ts + import { type RouteConfig, route } from "@react-router/dev/routes"; + export default [ + route("base/:base", "routes/base.tsx", [ + route("home/:home", "routes/route.tsx", { id: "home" }), + route("changelog/:changelog", "routes/route.tsx", { id: "changelog" }), + route("splat/*", "routes/route.tsx", { id: "splat" }), + ]), + route("other/:other", "routes/route.tsx", { id: "other" }), + ] satisfies RouteConfig; + ``` + + Previously, typegen would arbitrarily pick one of these paths to be the "winner" and generate types for the route module based on that path. + Now, typegen creates unions as necessary for alternate paths for the same route file. + +- Add additional logging to `build` command output when cleaning assets from server build ([#13547](https://github.com/remix-run/react-router/pull/13547)) +- Better types for `params` ([#13543](https://github.com/remix-run/react-router/pull/13543)) + + For example: + + ```ts + // routes.ts + import { type RouteConfig, route } from "@react-router/dev/routes"; + + export default [ + route("parent/:p", "routes/parent.tsx", [ + route("route/:r", "routes/route.tsx", [ + route("child1/:c1a/:c1b", "routes/child1.tsx"), + route("child2/:c2a/:c2b", "routes/child2.tsx"), + ]), + ]), + ] satisfies RouteConfig; + ``` + + Previously, `params` for `routes/route` were calculated as `{ p: string, r: string }`. + This incorrectly ignores params that could come from child routes. + If visiting `/parent/1/route/2/child1/3/4`, the actual params passed to `routes/route` will have a type of `{ p: string, r: string, c1a: string, c1b: string }`. + + Now, `params` are aware of child routes and autocompletion will include child params as optionals: + + ```ts + params.| + // ^ cursor is here and you ask for autocompletion + // p: string + // r: string + // c1a?: string + // c1b?: string + // c2a?: string + // c2b?: string + ``` + + You can also narrow the types for `params` as it is implemented as a normalized union of params for each page that includes `routes/route`: + + ```ts + if (typeof params.c1a === 'string') { + params.| + // ^ cursor is here and you ask for autocompletion + // p: string + // r: string + // c1a: string + // c1b: string + } + ``` + + *** + + UNSTABLE: renamed internal `react-router/route-module` export to `react-router/internal` + UNSTABLE: removed `Info` export from generated `+types/*` files + +- [UNSTABLE] Normalize dirent entry path across node versions when generating SRI manifest ([#13591](https://github.com/remix-run/react-router/pull/13591)) +- Don't clean assets from server build when `build.ssrEmitAssets` has been enabled in Vite config ([#13547](https://github.com/remix-run/react-router/pull/13547)) +- Fix `href` for optional segments ([#13595](https://github.com/remix-run/react-router/pull/13595)) + + Type generation now expands paths with optionals into their corresponding non-optional paths. + For example, the path `/user/:id?` gets expanded into `/user` and `/user/:id` to more closely model visitable URLs. + `href` then uses these expanded (non-optional) paths to construct type-safe paths for your app: + + ```ts + // original: /user/:id? + // expanded: /user & /user/:id + href("/user"); // ✅ + href("/user/:id", { id: 1 }); // ✅ + ``` + + This becomes even more important for static optional paths where there wasn't a good way to indicate whether the optional should be included in the resulting path: + + ```ts + // original: /products/:id/detail? + + // before + href("/products/:id/detail?"); // ❌ How can we tell `href` to include or omit `detail?` segment with a complex API? + + // now + // expanded: /products/:id & /products/:id/detail + href("/product/:id"); // ✅ + href("/product/:id/detail"); // ✅ + ``` + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + - `@react-router/node@7.6.1-pre.0` + - `@react-router/serve@7.6.1-pre.0` + ## 7.6.0 ### Minor Changes diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json index 2f868a322a..930ea44ec7 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.6.0", + "version": "7.6.1-pre.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 3956f78efa..9a0f7220d4 100644 --- a/packages/react-router-dom/CHANGELOG.md +++ b/packages/react-router-dom/CHANGELOG.md @@ -1,5 +1,12 @@ # react-router-dom +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-dom/package.json b/packages/react-router-dom/package.json index 92bd7b3f8f..fa85be778c 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.6.0", + "version": "7.6.1-pre.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 e2152ec50f..c1a1dfa28d 100644 --- a/packages/react-router-express/CHANGELOG.md +++ b/packages/react-router-express/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/express` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + - `@react-router/node@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-express/package.json b/packages/react-router-express/package.json index 1e16a11343..5a87eed064 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.6.0", + "version": "7.6.1-pre.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 a83919bcfe..da9aaf181b 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` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `@react-router/dev@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-fs-routes/package.json b/packages/react-router-fs-routes/package.json index 090a3e8990..98f2aa8631 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.6.0", + "version": "7.6.1-pre.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 a45ad8ded2..6c8e0d4d22 100644 --- a/packages/react-router-node/CHANGELOG.md +++ b/packages/react-router-node/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/node` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json index cf8da88288..ac2448c7db 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.6.0", + "version": "7.6.1-pre.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 a5184a450c..494a73b02d 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` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `@react-router/dev@7.6.1-pre.0` + ## 7.6.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 f927a97c87..6c163f71a8 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.6.0", + "version": "7.6.1-pre.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 001f856b2e..a7e4f7fe4d 100644 --- a/packages/react-router-serve/CHANGELOG.md +++ b/packages/react-router-serve/CHANGELOG.md @@ -1,5 +1,14 @@ # `@react-router/serve` +## 7.6.1-pre.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.6.1-pre.0` + - `@react-router/node@7.6.1-pre.0` + - `@react-router/express@7.6.1-pre.0` + ## 7.6.0 ### Patch Changes diff --git a/packages/react-router-serve/package.json b/packages/react-router-serve/package.json index b99aa29097..034f66bb30 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.6.0", + "version": "7.6.1-pre.0", "description": "Production application server for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 54d89abc9b..706e409a5b 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,95 @@ # `react-router` +## 7.6.1-pre.0 + +### Patch Changes + +- Update `Route.MetaArgs` to reflect that `data` can be potentially `undefined` ([#13563](https://github.com/remix-run/react-router/pull/13563)) + + This is primarily for cases where a route `loader` threw an error to it's own `ErrorBoundary`. but it also arises in the case of a 404 which renders the root `ErrorBoundary`/`meta` but the root loader did not run because not routes matched. + +- Partially revert optimization added in `7.1.4` to reduce calls to `matchRoutes` because it surfaced other issues ([#13562](https://github.com/remix-run/react-router/pull/13562)) +- Fix typegen when same route is used at multiple paths ([#13574](https://github.com/remix-run/react-router/pull/13574)) + + For example, `routes/route.tsx` is used at 4 different paths here: + + ```ts + import { type RouteConfig, route } from "@react-router/dev/routes"; + export default [ + route("base/:base", "routes/base.tsx", [ + route("home/:home", "routes/route.tsx", { id: "home" }), + route("changelog/:changelog", "routes/route.tsx", { id: "changelog" }), + route("splat/*", "routes/route.tsx", { id: "splat" }), + ]), + route("other/:other", "routes/route.tsx", { id: "other" }), + ] satisfies RouteConfig; + ``` + + Previously, typegen would arbitrarily pick one of these paths to be the "winner" and generate types for the route module based on that path. + Now, typegen creates unions as necessary for alternate paths for the same route file. + +- Better types for `params` ([#13543](https://github.com/remix-run/react-router/pull/13543)) + + For example: + + ```ts + // routes.ts + import { type RouteConfig, route } from "@react-router/dev/routes"; + + export default [ + route("parent/:p", "routes/parent.tsx", [ + route("route/:r", "routes/route.tsx", [ + route("child1/:c1a/:c1b", "routes/child1.tsx"), + route("child2/:c2a/:c2b", "routes/child2.tsx"), + ]), + ]), + ] satisfies RouteConfig; + ``` + + Previously, `params` for `routes/route` were calculated as `{ p: string, r: string }`. + This incorrectly ignores params that could come from child routes. + If visiting `/parent/1/route/2/child1/3/4`, the actual params passed to `routes/route` will have a type of `{ p: string, r: string, c1a: string, c1b: string }`. + + Now, `params` are aware of child routes and autocompletion will include child params as optionals: + + ```ts + params.| + // ^ cursor is here and you ask for autocompletion + // p: string + // r: string + // c1a?: string + // c1b?: string + // c2a?: string + // c2b?: string + ``` + + You can also narrow the types for `params` as it is implemented as a normalized union of params for each page that includes `routes/route`: + + ```ts + if (typeof params.c1a === 'string') { + params.| + // ^ cursor is here and you ask for autocompletion + // p: string + // r: string + // c1a: string + // c1b: string + } + ``` + + *** + + UNSTABLE: renamed internal `react-router/route-module` export to `react-router/internal` + UNSTABLE: removed `Info` export from generated `+types/*` files + +- Avoid initial fetcher execution 404 error when Lazy Route Discovery is interrupted by a navigation ([#13564](https://github.com/remix-run/react-router/pull/13564)) +- Remove hashes from files in `dist/` for easier usage with `patch-package` ([#13567](https://github.com/remix-run/react-router/pull/13567)) +- href replaces splats `*` ([#13593](https://github.com/remix-run/react-router/pull/13593)) + + ```ts + const a = href("/products/*", { "*": "/1/edit" }); + // -> /products/1/edit + ``` + ## 7.6.0 ### Minor Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index a4979b3f23..e56afd8460 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "react-router", - "version": "7.6.0", + "version": "7.6.1-pre.0", "description": "Declarative routing for React", "keywords": [ "react",