chore: Update version for release (pre) #12016
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to release-next, this PR will be updated.
release-nextis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonrelease-next.Releases
react-router@7.0.0-pre.0
Major Changes
Remove the original
deferimplementation in favor of using raw promises via single fetch andturbo-stream. This removes these exports from React Router: (#11744)deferAbortedDeferredErrortype TypedDeferredDataUNSAFE_DeferredDataUNSAFE_DEFERRED_SYMBOL,@remix-run/routerintoreact-router(#11505)react-router-domintoreact-router@remix-run/server-runtimeintoreact-router@remix-run/testingintoreact-routerRemove single_fetch future flag. (#11522)
Drop support for Node 16, React Router SSR now requires Node 18 or higher (#11391)
Remove
future.v7_startTransitionflag (#11696)useNavigate()useSubmituseFetcher().loaduseFetcher().submituseRevalidator.revalidateRemove
future.v7_normalizeFormMethodfuture flag (#11697)For Remix consumers migrating to React Router, the
cryptoglobal from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-routerrather than platform-specific packages: (#11837)createCookiecreateCookieSessionStoragecreateMemorySessionStoragecreateSessionStorageFor consumers running older versions of Node, the
installGlobalsfunction from@remix-run/nodehas been updated to defineglobalThis.crypto, using Node'srequire('node:crypto').webcryptoimplementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactorycreateSessionStorageFactorycreateCookieSessionStorageFactorycreateMemorySessionStorageFactoryImports/Exports cleanup (#11840)
@remix-run/routerAgnosticDataIndexRouteObjectAgnosticDataNonIndexRouteObjectAgnosticDataRouteMatchAgnosticDataRouteObjectAgnosticIndexRouteObjectAgnosticNonIndexRouteObjectAgnosticRouteMatchAgnosticRouteObjectTrackedPromiseunstable_AgnosticPatchRoutesOnMissFunctionAction-> exported asNavigationTypeviareact-routerRouterexported asDataRouterto differentiate from RR's<Router>getToPathname(@private)joinPaths(@private)normalizePathname(@private)resolveTo(@private)stripBasename(@private)createBrowserHistory-> in favor ofcreateBrowserRoutercreateHashHistory-> in favor ofcreateHashRoutercreateMemoryHistory-> in favor ofcreateMemoryRoutercreateRoutercreateStaticHandler-> in favor of wrappercreateStaticHandlerin RR DomgetStaticContextFromErrorreact-routerHashPathnameSearchupdate minimum node version to 18 (#11690)
Remove
future.v7_prependBasenamefrom the ionternalized@remix-run/routerpackage (#11726)Remove
future.v7_throwAbortReasonfrom internalized@remix-run/routerpackage (#11728)Add
exportsfield to all packages (#11675)node package no longer re-exports from react-router (#11702)
renamed RemixContext to FrameworkContext (#11705)
updates the minimum React version to 18 (#11689)
PrefetchPageDescriptor replaced by PageLinkDescriptor (#11960)
future.v7_partialHydrationflag (#11725)<RouterProvider fallbackElement>propfallbackElementto ahydrateFallbackElement/HydrateFallbackon your root routefuture.v7_partialHydration(when usingfallbackElement),state.navigationwas populated during the initial loadfuture.v7_partialHydration,state.navigationremains in an"idle"state during the initial loadRemove
v7_relativeSplatPathfuture flag (#11695)Remove remaining future flags (#11820)
v7_skipActionErrorRevalidationv3_fetcherPersist,v3_relativeSplatPath,v3_throwAbortReasonrename createRemixStub to createRoutesStub (#11692)
Remove
@remix-run/routerdeprecateddetectErrorBoundaryoption in favor ofmapRouteProperties(#11751)Add
react-router/domsubpath export to properly enablereact-domas an optionalpeerDependency(#11851)import ReactDOM from "react-dom"in<RouterProvider>in order to accessReactDOM.flushSync(), since that would breakcreateMemoryRouteruse cases in non-DOM environmentsreact-router/domto get the proper component that makesReactDOM.flushSync()available:entry.client.tsx:import { HydratedRouter } from 'react-router/dom'createBrowserRouter/createHashRouter:import { RouterProvider } from "react-router/dom"Remove
future.v7_fetcherPersistflag (#11731)Minor Changes
prerenderconfig in the React Router vite plugin, to support existing SSG use-cases (#11539)prerenderconfig to pre-render your.htmland.datafiles at build time and then serve them statically at runtime (either from a running server or a CDN)prerendercan either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.[REMOVE] Allow returning undefined from loaders/actions part 2 (#12057)
Params, loader data, and action data as props for route component exports (#11961)
Remove duplicate
RouterProviderimpliementations (#11679)Typesafety improvements (#12019)
React Router now generates types for each of your route modules.
You can access those types by importing them from
./+types/<route filename without extension>.For example:
This initial implementation targets type inference for:
Params: Path parameters from your routing config inroutes.tsincluding file-based routingLoaderData: Loader data fromloaderand/orclientLoaderwithin your route moduleActionData: Action data fromactionand/orclientActionwithin your route moduleThese types are then used to create types for route export args and props:
LoaderArgsClientLoaderArgsActionArgsClientActionArgsHydrateFallbackPropsComponentProps(for thedefaultexport)ErrorBoundaryPropsIn the future, we plan to add types for the rest of the route module exports:
meta,links,headers,shouldRevalidate, etc.We also plan to generate types for typesafe
Links:Setup
React Router will generate types into a
.react-router/directory at the root of your app.This directory is fully managed by React Router and is derived based on your route config (
routes.ts).👉 Add
.react-router/to.gitignoreYou should also ensure that generated types for routes are always present before running typechecking,
especially for running typechecking in CI.
👉 Add
react-router typegento yourtypecheckcommand inpackage.json{ "scripts": { "typecheck": "react-router typegen && tsc" } }To get TypeScript to use those generated types, you'll need to add them to
includeintsconfig.json.And to be able to import them as if they files next to your route modules, you'll also need to configure
rootDirs.👉 Configure
tsconfig.jsonfor generated types{ "include": [".react-router/types/**/*"], "compilerOptions": { "rootDirs": [".", "./.react-router/types"] } }typegencommandYou can manually generate types with the new
typegencommand:However, manual type generation is tedious and types can get out of sync quickly if you ever forget to run
typegen.Instead, we recommend that you setup our new TypeScript plugin which will automatically generate fresh types whenever routes change.
That way, you'll always have up-to-date types.
TypeScript plugin
To get automatic type generation, you can use our new TypeScript plugin.
👉 Add the TypeScript plugin to
tsconfig.json{ "compilerOptions": { "plugins": [{ "name": "@react-router/dev" }] } }We plan to add some other goodies to our TypeScript plugin soon, including:
jsdocfor route exports that include links to official docsVSCode
TypeScript looks for plugins registered in
tsconfig.jsonin the localnode_modules/,but VSCode ships with its own copy of TypeScript that is installed outside of your project.
For TypeScript plugins to work, you'll need to tell VSCode to use the local workspace version of TypeScript.
For security reasons, VSCode won't use the workspace version of TypeScript until you manually opt-in.
Your project should have a
.vscode/settings.jsonwith the following settings:{ "typescript.tsdk": "node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true }That way VSCode will ask you if you want to use the workspace version of TypeScript the first time you open a TS file in that project.
👉 Select "Allow" when VSCode asks if you want to use the workspace version of TypeScript
Otherwise, you can also manually opt-in to the workspace version:
Select TypeScript VersionUse Workspace VersionTroubleshooting
In VSCode, open up any TypeScript file in your project and then use CMD+SHIFT+P to select
Open TS Server log.There should be a log for
[react-router] setupthat indicates that the plugin was resolved correctly.Then look for any errors in the log.
Stabilize
unstable_dataStrategy(#11969)Stabilize
unstable_patchRoutesOnNavigation(#11970)Patch Changes
data()(#12021)react-router@7.0.0-pre.0@react-router/architect@7.0.0-pre.0
Major Changes
For Remix consumers migrating to React Router, the
cryptoglobal from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-routerrather than platform-specific packages: (#11837)createCookiecreateCookieSessionStoragecreateMemorySessionStoragecreateSessionStorageFor consumers running older versions of Node, the
installGlobalsfunction from@remix-run/nodehas been updated to defineglobalThis.crypto, using Node'srequire('node:crypto').webcryptoimplementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactorycreateSessionStorageFactorycreateCookieSessionStorageFactorycreateMemorySessionStorageFactoryPatch Changes
react-router@7.0.0-pre.0@react-router/node@7.0.0-pre.0@react-router/cloudflare@7.0.0-pre.0
Major Changes
For Remix consumers migrating to React Router, all exports from
@remix-run/cloudflare-pagesare now provided for React Router consumers in the@react-router/cloudflarepackage. There is no longer a separate package for Cloudflare Pages. (#11801)For Remix consumers migrating to React Router, the
cryptoglobal from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-routerrather than platform-specific packages: (#11837)createCookiecreateCookieSessionStoragecreateMemorySessionStoragecreateSessionStorageFor consumers running older versions of Node, the
installGlobalsfunction from@remix-run/nodehas been updated to defineglobalThis.crypto, using Node'srequire('node:crypto').webcryptoimplementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactorycreateSessionStorageFactorycreateCookieSessionStorageFactorycreateMemorySessionStorageFactoryMinor Changes
@remix-run/cloudflare-workerspackage has been deprecated. Remix consumers migrating to React Router should use the@react-router/cloudflarepackage directly. For guidance on how to use@react-router/cloudflarewithin a Cloudflare Workers context, refer to the Cloudflare Workers template. (#11801)Patch Changes
react-router@7.0.0-pre.0@react-router/dev@7.0.0-pre.0
Major Changes
For Remix consumers migrating to React Router, the
vitePluginandcloudflareDevProxyVitePluginexports have been renamed and moved. (#11904)Remove single_fetch future flag. (#11522)
update minimum node version to 18 (#11690)
Add
exportsfield to all packages (#11675)node package no longer re-exports from react-router (#11702)
For Remix consumers migrating to React Router who used the Vite plugin's
buildEndhook, the resolvedreactRouterConfigobject no longer contains apublicPathproperty since this belongs to Vite, not React Router. (#11575)For Remix consumers migrating to React Router, the Vite plugin's
manifestoption has been removed. (#11573)The
manifestoption been superseded by the more powerfulbuildEndhook since it's passed thebuildManifestargument. You can still write the build manifest to disk if needed, but you'll most likely find it more convenient to write any logic depending on the build manifest within thebuildEndhook itself.If you were using the
manifestoption, you can replace it with abuildEndhook that writes the manifest to disk like this:Update default
isbotversion to v5 and drop support forisbot@3(#11770)isbot@4orisbot@5in yourpackage.json:isbot@3in yourpackage.jsonand you have your ownentry.server.tsxfile in your repoisbot@5independent of the React Router v7 upgradeisbot@3in yourpackage.jsonand you do not have your ownentry.server.tsxfile in your repoisbot@5in yourpackage.jsonFor Remix consumers migrating to React Router, Vite manifests (i.e.
.vite/manifest.json) are now written within each build subdirectory, e.g.build/client/.vite/manifest.jsonandbuild/server/.vite/manifest.jsoninstead ofbuild/.vite/client-manifest.jsonandbuild/.vite/server-manifest.json. This means that the build output is now much closer to what you'd expect from a typical Vite project. (#11573)Originally the Remix Vite plugin moved all Vite manifests to a root-level
build/.vitedirectory to avoid accidentally serving them in production, particularly from the client build. This was later improved with additional logic that deleted these Vite manifest files at the end of the build process unless Vite'sbuild.manifesthad been enabled within the app's Vite config. This greatly reduced the risk of accidentally serving the Vite manifests in production since they're only present when explicitly asked for. As a result, we can now assume that consumers will know that they need to manage these additional files themselves, and React Router can safely generate a more standard Vite build output.Minor Changes
Params, loader data, and action data as props for route component exports (#11961)
Remove internal entry.server.spa.tsx implementation (#11681)
Typesafety improvements (#12019)
React Router now generates types for each of your route modules.
You can access those types by importing them from
./+types/<route filename without extension>.For example:
This initial implementation targets type inference for:
Params: Path parameters from your routing config inroutes.tsincluding file-based routingLoaderData: Loader data fromloaderand/orclientLoaderwithin your route moduleActionData: Action data fromactionand/orclientActionwithin your route moduleThese types are then used to create types for route export args and props:
LoaderArgsClientLoaderArgsActionArgsClientActionArgsHydrateFallbackPropsComponentProps(for thedefaultexport)ErrorBoundaryPropsIn the future, we plan to add types for the rest of the route module exports:
meta,links,headers,shouldRevalidate, etc.We also plan to generate types for typesafe
Links:Setup
React Router will generate types into a
.react-router/directory at the root of your app.This directory is fully managed by React Router and is derived based on your route config (
routes.ts).👉 Add
.react-router/to.gitignoreYou should also ensure that generated types for routes are always present before running typechecking,
especially for running typechecking in CI.
👉 Add
react-router typegento yourtypecheckcommand inpackage.json{ "scripts": { "typecheck": "react-router typegen && tsc" } }To get TypeScript to use those generated types, you'll need to add them to
includeintsconfig.json.And to be able to import them as if they files next to your route modules, you'll also need to configure
rootDirs.👉 Configure
tsconfig.jsonfor generated types{ "include": [".react-router/types/**/*"], "compilerOptions": { "rootDirs": [".", "./.react-router/types"] } }typegencommandYou can manually generate types with the new
typegencommand:However, manual type generation is tedious and types can get out of sync quickly if you ever forget to run
typegen.Instead, we recommend that you setup our new TypeScript plugin which will automatically generate fresh types whenever routes change.
That way, you'll always have up-to-date types.
TypeScript plugin
To get automatic type generation, you can use our new TypeScript plugin.
👉 Add the TypeScript plugin to
tsconfig.json{ "compilerOptions": { "plugins": [{ "name": "@react-router/dev" }] } }We plan to add some other goodies to our TypeScript plugin soon, including:
jsdocfor route exports that include links to official docsVSCode
TypeScript looks for plugins registered in
tsconfig.jsonin the localnode_modules/,but VSCode ships with its own copy of TypeScript that is installed outside of your project.
For TypeScript plugins to work, you'll need to tell VSCode to use the local workspace version of TypeScript.
For security reasons, VSCode won't use the workspace version of TypeScript until you manually opt-in.
Your project should have a
.vscode/settings.jsonwith the following settings:{ "typescript.tsdk": "node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true }That way VSCode will ask you if you want to use the workspace version of TypeScript the first time you open a TS file in that project.
👉 Select "Allow" when VSCode asks if you want to use the workspace version of TypeScript
Otherwise, you can also manually opt-in to the workspace version:
Select TypeScript VersionUse Workspace VersionTroubleshooting
In VSCode, open up any TypeScript file in your project and then use CMD+SHIFT+P to select
Open TS Server log.There should be a log for
[react-router] setupthat indicates that the plugin was resolved correctly.Then look for any errors in the log.
Patch Changes
react-router@7.0.0-pre.0@react-router/serve@7.0.0-pre.0@react-router/node@7.0.0-pre.0react-router-dom@7.0.0-pre.0
Major Changes
Remove the original
deferimplementation in favor of using raw promises via single fetch andturbo-stream. This removes these exports from React Router: (#11744)deferAbortedDeferredErrortype TypedDeferredDataUNSAFE_DeferredDataUNSAFE_DEFERRED_SYMBOL,Use
createRemixRouter/RouterProviderinentry.clientinstead ofRemixBrowser(#11469)Remove single_fetch future flag. (#11522)
Remove
future.v7_startTransitionflag (#11696)Remove
future.v7_normalizeFormMethodfuture flag (#11697)Allow returning
undefinedfrom actions and loaders (#11680)update minimum node version to 18 (#11690)
Remove
future.v7_prependBasenamefrom the ionternalized@remix-run/routerpackage (#11726)Remove
future.v7_throwAbortReasonfrom internalized@remix-run/routerpackage (#11728)Add
exportsfield to all packages (#11675)node package no longer re-exports from react-router (#11702)
updates the minimum React version to 18 (#11689)
future.v7_partialHydrationflag (#11725)<RouterProvider fallbackElement>propfallbackElementto ahydrateFallbackElement/HydrateFallbackon your root routefuture.v7_partialHydration(when usingfallbackElement),state.navigationwas populated during the initial loadfuture.v7_partialHydration,state.navigationremains in an"idle"state during the initial loadRemove
future.v7_fetcherPersistflag (#11731)Minor Changes
Link/NavLinkwhen using Remix SSR (#11402)ScrollRestorationso it can restore properly on an SSR'd document load (#11401)RouterProvider. When running from a Remix-SSR'd HTML payload with the properwindowvariables (__remixContext,__remixManifest,__remixRouteModules), you don't need to pass arouterprop andRouterProviderwill create therouterfor you internally. (#11396) (#11400)Patch Changes
RouterProviderinternals to reduce uneccesary re-renders (#11817)react-router@7.0.0-pre.0@react-router/express@7.0.0-pre.0
Major Changes
exportsfield to all packages (#11675)Patch Changes
react-router@7.0.0-pre.0@react-router/node@7.0.0-pre.0@react-router/node@7.0.0-pre.0
Major Changes
Remove single_fetch future flag. (#11522)
For Remix consumers migrating to React Router, the
cryptoglobal from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-routerrather than platform-specific packages: (#11837)createCookiecreateCookieSessionStoragecreateMemorySessionStoragecreateSessionStorageFor consumers running older versions of Node, the
installGlobalsfunction from@remix-run/nodehas been updated to defineglobalThis.crypto, using Node'srequire('node:crypto').webcryptoimplementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactorycreateSessionStorageFactorycreateCookieSessionStorageFactorycreateMemorySessionStorageFactoryupdate minimum node version to 18 (#11690)
Add
exportsfield to all packages (#11675)node package no longer re-exports from react-router (#11702)
Patch Changes
react-router@7.0.0-pre.0@react-router/serve@7.0.0-pre.0
Major Changes
exportsfield to all packages (#11675)Patch Changes
Update
express.staticconfigurations to support prerendering (#11547)build/client/assetsfolder are served as before, with a 1-year immutableCache-Controlheader.htmland.datafiles are not served with a specificCache-Controlheader.datafiles are served withContent-Type: text/x-turboexpress.static, it seems to also add aCache-Control: public, max-age=0to.datafilesUpdated dependencies:
react-router@7.0.0-pre.0@react-router/express@7.0.0-pre.0@react-router/node@7.0.0-pre.0@react-router/fs-routes@7.0.0-pre.0
Patch Changes
@react-router/dev@7.0.0-pre.0@react-router/remix-config-routes-adapter@7.0.0-pre.0
Patch Changes
@react-router/dev@7.0.0-pre.0