Files
Devour/devour_data/docs/changelog.md---remix.json
Tomas Dvorak 898a3c303f update
2026-02-24 10:33:59 +01:00

1419 lines
693 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"id": "425c440d86c454002f3af5ca",
"source": "remix:does",
"type": "html",
"title": "CHANGELOG.md | Remix",
"content": "DocsBlogResourcesReact Router v7 has been released. View the docsDocsBlogResourcesView code on GitHubChat on DiscordReact Router v7 has been released. View the docsCHANGELOG.mdGetting StartedQuick Start (5m) Tutorial (30m) Upgrading to v2 Community Future Flags Changelog Discussion TopicsIntroduction, Technical Explanation Runtimes, Adapters, Templates, and Deployment Route Configuration Fullstack Data Flow Server vs. Client Code Execution React Router Progressive Enhancement Pending UI State Management Network Concurrency Management Form vs. fetcher Hot Module Replacement Form Resubmissions File Conventions.client modules .server modules Asset Imports entry.client entry.server root Route File Naming vite.config.ts Route Moduleaction clientAction clientLoader Component ErrorBoundary handle headers HydrateFallback links loader meta shouldRevalidate ComponentsAwait Form Link Links LiveReload Meta NavLink Outlet PrefetchPageLinks Scripts ScrollRestoration HooksuseActionData useAsyncError 🆕useAsyncValue 🆕useBeforeUnload useBlocker useFetcher useFetchers useFormAction useHref useLoaderData useLocation useMatches useNavigate useNavigation useNavigationType useOutlet useOutletContext useParams unstable_usePrompt useResolvedPath useRevalidator 🆕useRouteError 🆕useRouteLoaderData useSearchParams useSubmit useViewTransitionState UtilitiesCookies createRemixStub data defer isRouteErrorResponse json unstable_parseMultipartFormData redirect redirectDocument replace Sessions unstable_createFileUploadHandler unstable_createMemoryUploadHandler StylingCSS Bundling Regular CSS CSS Imports CSS in JS CSS Modules PostCSS Tailwind Vanilla Extract Other API@remix-run/dev CLI 🆕@remix-run/{adapter} @remix-run/serve create-remix (CLI) @remix-run/node @remix-run/testing GuidesAccessibility Development Strategy API Routes Backend For Frontend Breadcrumbs Guide Browser Support Client Data Module Constraints Contributing CSS Files Data Loading Data Writes Dependency optimization Deployment Disabling JavaScript Environment Variables Error Handling FAQs File Uploads Form Validation Gotchas Index Query Param Lazy Route Discovery Local TLS Manual Dev Server MDX Migrating from React Router Not Found Handling Performance Presets Resource Routes Server Bundles Single Fetch SPA Mode Streaming Templates TypeScript Vite Getting StartedQuick Start (5m) Tutorial (30m) Upgrading to v2 Community Future Flags Changelog Discussion TopicsIntroduction, Technical Explanation Runtimes, Adapters, Templates, and Deployment Route Configuration Fullstack Data Flow Server vs. Client Code Execution React Router Progressive Enhancement Pending UI State Management Network Concurrency Management Form vs. fetcher Hot Module Replacement Form Resubmissions File Conventions.client modules .server modules Asset Imports entry.client entry.server root Route File Naming vite.config.ts Route Moduleaction clientAction clientLoader Component ErrorBoundary handle headers HydrateFallback links loader meta shouldRevalidate ComponentsAwait Form Link Links LiveReload Meta NavLink Outlet PrefetchPageLinks Scripts ScrollRestoration HooksuseActionData useAsyncError 🆕useAsyncValue 🆕useBeforeUnload useBlocker useFetcher useFetchers useFormAction useHref useLoaderData useLocation useMatches useNavigate useNavigation useNavigationType useOutlet useOutletContext useParams unstable_usePrompt useResolvedPath useRevalidator 🆕useRouteError 🆕useRouteLoaderData useSearchParams useSubmit useViewTransitionState UtilitiesCookies createRemixStub data defer isRouteErrorResponse json unstable_parseMultipartFormData redirect redirectDocument replace Sessions unstable_createFileUploadHandler unstable_createMemoryUploadHandler StylingCSS Bundling Regular CSS CSS Imports CSS in JS CSS Modules PostCSS Tailwind Vanilla Extract Other API@remix-run/dev CLI 🆕@remix-run/{adapter} @remix-run/serve create-remix (CLI) @remix-run/node @remix-run/testing GuidesAccessibility Development Strategy API Routes Backend For Frontend Breadcrumbs Guide Browser Support Client Data Module Constraints Contributing CSS Files Data Loading Data Writes Dependency optimization Deployment Disabling JavaScript Environment Variables Error Handling FAQs File Uploads Form Validation Gotchas Index Query Param Lazy Route Discovery Local TLS Manual Dev Server MDX Migrating from React Router Not Found Handling Performance Presets Resource Routes Server Bundles Single Fetch SPA Mode Streaming Templates TypeScript Vite On this pagev2.17.0Minor ChangesChanges by Packagev2.16.8Patch Changesv2.16.7Patch Changesv2.16.6Patch Changesv2.16.5Patch Changesv2.16.4Patch Changesv2.16.3Security NoticePatch Changesv2.16.2Patch Changesv2.16.1Patch Changesv2.16.0Minor ChangesPatch ChangesUpdated Dependenciesv2.15.3Patch ChangesUpdated Dependenciesv2.15.2Patch ChangesUpdated Dependenciesv2.15.1Patch Changesv2.15.0Patch Changesv2.14.0Minor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.13.1Patch Changesv2.13.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.12.1Patch ChangesChanges by Packagev2.12.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.11.2Patch ChangesUpdated DependenciesChanges by Packagev2.11.1Patch ChangesChanges by Packagev2.11.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.10.3Patch ChangesUpdated DependenciesChanges by Packagev2.10.2Patch ChangesChanges by Packagev2.10.1Patch ChangesUpdated DependenciesChanges by Packagev2.10.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.9.2What's ChangedPatch ChangesUpdated DependenciesChanges by Packagev2.9.1Patch ChangesChanges by Packagev2.9.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.8.1Patch ChangesUpdated DependenciesChanges by Packagev2.8.0Minor ChangesPatch ChangesUpdated DependenciesChanges by Package2.7.2Patch Changes2.7.1Patch Changesv2.7.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.6.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.5.1Patch ChangesUpdated DependenciesChanges by Packagev2.5.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.4.1Patch ChangesUpdated DependenciesChanges by Packagev2.4.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.3.1Patch ChangesUpdated DependenciesChanges by Packagev2.3.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.2.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.1.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.0.1Patch ChangesChanges by Package 🔗v2.0.0Breaking ChangesNew FeaturesOther Notable ChangesUpdated DependenciesChanges by PackageOn this pagev2.17.0Minor ChangesChanges by Packagev2.16.8Patch Changesv2.16.7Patch Changesv2.16.6Patch Changesv2.16.5Patch Changesv2.16.4Patch Changesv2.16.3Security NoticePatch Changesv2.16.2Patch Changesv2.16.1Patch Changesv2.16.0Minor ChangesPatch ChangesUpdated Dependenciesv2.15.3Patch ChangesUpdated Dependenciesv2.15.2Patch ChangesUpdated Dependenciesv2.15.1Patch Changesv2.15.0Patch Changesv2.14.0Minor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.13.1Patch Changesv2.13.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.12.1Patch ChangesChanges by Packagev2.12.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.11.2Patch ChangesUpdated DependenciesChanges by Packagev2.11.1Patch ChangesChanges by Packagev2.11.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.10.3Patch ChangesUpdated DependenciesChanges by Packagev2.10.2Patch ChangesChanges by Packagev2.10.1Patch ChangesUpdated DependenciesChanges by Packagev2.10.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.9.2What's ChangedPatch ChangesUpdated DependenciesChanges by Packagev2.9.1Patch ChangesChanges by Packagev2.9.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.8.1Patch ChangesUpdated DependenciesChanges by Packagev2.8.0Minor ChangesPatch ChangesUpdated DependenciesChanges by Package2.7.2Patch Changes2.7.1Patch Changesv2.7.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.6.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.5.1Patch ChangesUpdated DependenciesChanges by Packagev2.5.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.4.1Patch ChangesUpdated DependenciesChanges by Packagev2.4.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.3.1Patch ChangesUpdated DependenciesChanges by Packagev2.3.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.2.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.1.0What's ChangedMinor ChangesPatch ChangesUpdated DependenciesChanges by Packagev2.0.1Patch ChangesChanges by Package 🔗v2.0.0Breaking ChangesNew FeaturesOther Notable ChangesUpdated DependenciesChanges by Package Remix Releases This page lists all releases/release notes for Remix back to v2.0.0. For releases prior to v2, please refer to the GitHub Releases Page. We manage release notes in this file instead of the paginated GitHub Releases Page for 2 reasons: Pagination in the GitHub UI means that you cannot easily search release notes for a large span of releases at once The paginated GitHub interface also cuts off longer releases notes without indication in list view, and you need to click into the detail view to see the full set of release notes Remix Releases v2.17.0 Minor Changes Changes by Package v2.16.8 Patch Changes v2.16.7 Patch Changes v2.16.6 Patch Changes v2.16.5 Patch Changes v2.16.4 Patch Changes v2.16.3 Security Notice Patch Changes v2.16.2 Patch Changes v2.16.1 Patch Changes v2.16.0 Minor Changes Patch Changes Updated Dependencies v2.15.3 Patch Changes Updated Dependencies v2.15.2 Patch Changes Updated Dependencies v2.15.1 Patch Changes v2.15.0 Patch Changes v2.14.0 Minor Changes Patch Changes Updated Dependencies Changes by Package v2.13.1 Patch Changes v2.13.0 What's Changed Stabilized APIs Minor Changes Patch Changes Updated Dependencies Changes by Package v2.12.1 Patch Changes Changes by Package v2.12.0 What's Changed Future Flag for Automatic Dependency Optimization (unstable) Improved Single Fetch Type Safety (unstable) Updates to Single Fetch Revalidation Behavior (unstable) Minor Changes Patch Changes Updated Dependencies Changes by Package v2.11.2 Patch Changes Updated Dependencies Changes by Package v2.11.1 Patch Changes Changes by Package v2.11.0 What's Changed Renamed unstable_fogOfWar future flag to unstable_lazyRouteDiscovery (unstable) Removed response stub in Single Fetch (unstable) Minor Changes Patch Changes Updated Dependencies Changes by Package v2.10.3 Patch Changes Updated Dependencies Changes by Package v2.10.2 Patch Changes Changes by Package v2.10.1 Patch Changes Updated Dependencies Changes by Package v2.10.0 What's Changed Lazy Route Discovery (a.k.a. \"Fog of War\") Minor Changes Patch Changes Updated Dependencies Changes by Package v2.9.2 What's Changed Updated Type-Safety for Single Fetch Patch Changes Updated Dependencies Changes by Package v2.9.1 Patch Changes Changes by Package v2.9.0 What's Changed Single Fetch (unstable) Undici Minor Changes Patch Changes Updated Dependencies Changes by Package v2.8.1 Patch Changes Updated Dependencies Changes by Package v2.8.0 Minor Changes Patch Changes Updated Dependencies Changes by Package 2.7.2 Patch Changes 2.7.1 Patch Changes v2.7.0 What's Changed Stabilized Vite Plugin New Layout Export Basename support Cloudflare Proxy as a Vite Plugin Minor Changes Patch Changes Updated Dependencies Changes by Package v2.6.0 What's Changed Unstable Vite Plugin updates Minor Changes Patch Changes Updated Dependencies Changes by Package v2.5.1 Patch Changes Updated Dependencies Changes by Package v2.5.0 What's Changed SPA Mode (unstable) Server Bundles (unstable) Minor Changes Patch Changes Updated Dependencies Changes by Package v2.4.1 Patch Changes Updated Dependencies Changes by Package v2.4.0 What's Changed Client Data future.v3_relativeSplatPath Vite Updates (Unstable) Minor Changes Patch Changes Updated Dependencies Changes by Package v2.3.1 Patch Changes Updated Dependencies Changes by Package v2.3.0 What's Changed Stabilized useBlocker unstable_flushSync API Minor Changes Patch Changes Updated Dependencies Changes by Package v2.2.0 What's Changed Vite! New Fetcher APIs Persistence Future Flag Minor Changes Patch Changes Updated Dependencies Changes by Package v2.1.0 What's Changed View Transitions Stable createRemixStub Minor Changes Patch Changes Updated Dependencies Changes by Package v2.0.1 Patch Changes Changes by Package 🔗 v2.0.0 Breaking Changes Upgraded Dependency Requirements Removed Future Flags Breaking Changes/API Removals With deprecation warnings Without deprecation warnings Breaking Type Changes New Features Other Notable Changes Updated Dependencies Changes by Package v2.17.0 Date: 2025-07-25 Minor Changes create-remix - Redirect users to create-react-router instead of create-remix (#10686, #10688) Remix v2 is in maintenance mode so we don't want new Remix apps to be created Changes by Package create-remix Full Changelog: v2.16.8...v2.17.0 v2.16.8 Date: 2025-05-29 Patch Changes create-remix - Update tar-fs (#10638) Full Changelog: v2.16.7...v2.16.8 v2.16.7 Date: 2025-05-19 Patch Changes @remix-run/dev - Update vite-node (#10611) Full Changelog: v2.16.6...v2.16.7 v2.16.6 Date: 2025-05-08 Patch Changes @remix-run/react - Upgrade turbo-stream to 2.4.1 (#9973) @remix-run/react - Fix window is not defined error in Single Fetch when server-rendering \u003cPrefetchPageLinks\u003e (#10601) @remix-run/serve - Remove redundant @remix-run/node/install import from remix-serve because it manually calls installGlobals separately (#10306) Full Changelog: v2.16.5...v2.16.6 v2.16.5 Date: 2025-04-09 Patch Changes @remix-run/node - Bump undici to version 6.21.2 to address a security advisory (#10562) Full Changelog: v2.16.4...v2.16.5 v2.16.4 Date: 2025-03-31 Patch Changes @remix-run/server-runtime - Bump cookie dependency from ^0.6.0 -\u003e ^0.7.2 to fix security advisory (#10547) Full Changelog: v2.16.3...v2.16.4 v2.16.3 Date: 2025-03-28 Security Notice Fixed a security vulnerability that allowed URL manipulation and potential cache pollution via the Host and X-Forwarded-Host headers due to inadequate port sanitization. Patch Changes @remix-run/express - Better validation of x-forwarded-host header to prevent potential security issues (#10553) Full Changelog: v2.16.2...v2.16.3 v2.16.2 Date: 2025-03-19 Patch Changes @remix-run/react - Fix shouldRevalidate behavior for clientLoader-only routes in ssr:true apps (#10527) @remix-run/server-runtime - Load ancestor pathless/index routes in lazy route discovery for upwards non-eager-discovery routing (#10535) Full Changelog: v2.16.1...v2.16.2 v2.16.1 Date: 2025-03-17 Patch Changes @remix-run/dev - Remove unused Vite file system watcher (#10510) @remix-run/dev - When future.v3_routeConfig is enabled, fix errors evaluating routes.ts when multiple copies of @remix-run/dev are present (#10524) @remix-run/dev - Fix Vite import analysis of @remix-run/react failing when the package is not marked as external (#10528) Full Changelog: v2.16.0...v2.16.1 v2.16.0 Date: 2025-02-27 Minor Changes @remix-run/dev - Add Vite v6 support (#10351) Patch Changes @remix-run/dev - Clean up vite-node dev server when build finishes (#10477) @remix-run/react - Don't apply Single Fetch revalidation de-optimization when in SPA mode since there is no server HTTP request (#10479) @remix-run/react - When using Lazy Route Discovery (future.v3_lazyRouteDiscovery), Remix will now detect manifest version mismatches after a new deploy and trigger a document reload to sync up any active client sessions with the newly deployed version (#10498) On navigations to undiscovered routes, this mismatch will trigger a document reload of the destination path On fetcher calls to undiscovered routes, this mismatch will trigger a document reload of the current path While performing Eager Route Discovery on rendered \u003cLink\u003e components, mismatches will result in a no-op Updated Dependencies react-router-dom@6.30.0 @remix-run/router@1.23.0 Full Changelog: v2.15.3...v2.16.0 v2.15.3 Date: 2025-01-30 Patch Changes @remix-run/react - Properly handle interrupted manifest requests in lazy route discovery (#10447) @remix-run/server-runtime - Avoid duplication of Set-Cookie headers if also returned from headers (#10424) @remix-run/server-runtime - Properly handle status codes that cannot have a body in single fetch responses (204, etc.) (#10410) Updated Dependencies react-router-dom@6.29.0 @remix-run/router@1.22.0 Full Changelog: v2.15.2...v2.15.3 v2.15.2 Date: 2024-12-20 Patch Changes @remix-run/dev - Allow suppression of future flag warnings by setting them to false (#10358) @remix-run/react - Throw unwrapped Single Fetch redirect to align with pre-Single Fetch behavior (#10317) Updated Dependencies react-router-dom@6.28.1 Full Changelog: v2.15.1...v2.15.2 v2.15.1 Date: 2024-12-09 Patch Changes create-remix - Move fs-extra from devDependencies to dependencies (#10300) Full Changelog: v2.15.0...v2.15.1 v2.15.0 Date: 2024-11-19 Patch Changes Stabilize the future.v3_routeConfig future flag, replacing future.unstable_routeConfig. This enables support for routes.ts to assist with the migration to React Router v7. (#10236) Note that if you had already enabled the future.unstable_routeConfig flag, your route config in app/routes.ts is no longer defined via the routes export and must now be defined via the default export. import { type RouteConfig } from \"@remix-run/route-config\"; -export const routes: RouteConfig = []; +export default [] satisfies RouteConfig; v2.14.0 Date: 2024-11-08 Minor Changes Deprecate SerializeFrom in favor of generics because it will be removed in React Router v7 (#10173) Add deprecation warning to @remix-run/eslint-config (#10174) Add support for routes.ts behind future.unstable_routeConfig flag to assist with the migration to React Router v7. (#10107) Config-based routing is the new default in React Router v7, configured via the routes.ts file in the app directory. Support for routes.ts and its related APIs in Remix are designed as a migration path to help minimize the number of changes required when moving your Remix project over to React Router v7. While some new packages have been introduced within the @remix-run scope, these new packages only exist to keep the code in routes.ts as similar as possible to the equivalent code for React Router v7. When the unstable_routeConfig future flag is enabled, Remix's built-in file system routing will be disabled and your project will opted into React Router v7's config-based routing. To enable the flag, in your vite.config.ts file: remix({ future: { unstable_routeConfig: true, }, }); A minimal routes.ts file to support Remix's built-in file system routing looks like this: // app/routes.ts import { flatRoutes } from \"@remix-run/fs-routes\"; import type { RouteConfig } from \"@remix-run/route-config\"; export const routes: RouteConfig = flatRoutes(); Log deprecation warnings for v3 future flags (#10126) Add @deprecated annotations to json/defer utilities Patch Changes @remix-run/react - Fix defaultShouldRevalidate value when using Single Fetch (#10139) @remix-run/server-runtime - Update externally-accessed resource routes warning to cover null usage as well (#10145) Updated Dependencies react-router-dom@6.28.0 @remix-run/router@1.21.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/fs-routes @remix-run/node @remix-run/react @remix-run/route-config @remix-run/routes-option-adapter @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.13.1...v2.14.0 v2.13.1 Date: 2024-10-11 Patch Changes @remix-run/dev - Revert future.v3_optimizeDeps back to future.unstable_optimizeDeps as it was not intended to stabilize in Remix v2 (#10099) Full Changelog: v2.13.0...v2.13.1 v2.13.0 Date: 2024-10-11 What's Changed Stabilized APIs This release stabilizes a handful of \"unstable\" APIs in preparation for the pending React Router v7 release (see these posts for more info): unstable_data → data (for use with Single Fetch) unstable_flushSync → flushSync (useSubmit, fetcher.load, fetcher.submit) unstable_viewTransition → viewTransition (\u003cLink\u003e, \u003cForm\u003e, useNavigate, useSubmit) future.unstable_optimizeDeps → future.v3_optimizeDeps (Docs) ⚠️ This flag was not intended to stabilize in Remix v2 and was reverted back to future.unstable_optimizeDeps in 2.13.1 future.unstable_lazyRouteDiscovery → future.v3_lazyRouteDiscovery (Docs) future.unstable_singleFetch → future.v3_singleFetch (Docs) Minor Changes Stabilize React Router APIs in Remix (#9980) Adopt stabilized React Router APIs internally Single Fetch: unstable_dataStrategy -\u003e dataStrategy Lazy Route Discovery: unstable_patchRoutesOnNavigation -\u003e patchRoutesOnNavigation Stabilize public-facing APIs Single Fetch: unstable_data() -\u003e data() unstable_viewTransition -\u003e viewTransition (Link, Form, navigate, submit) unstable_flushSync\u003e -\u003e \u003cLink viewTransition\u003e (Link, Form, navigate, submit, useFetcher) Stabilize future flags (#10072, #10092) future.unstable_lazyRouteDiscovery -\u003e future.v3_lazyRouteDiscovery future.unstable_optimizeDeps -\u003e future.v3_optimizeDeps future.unstable_singleFetch -\u003e future.v3_singleFetch Patch Changes @remix-run/dev - Stop passing request.signal as the renderToReadableStream signal to abort server rendering for cloudflare/deno runtimes because by the time that request is aborted, aborting the rendering is useless because there's no way for React to flush down the unresolved boundaries (#10047) This has been incorrect for some time, but only recently exposed due to a bug in how we were aborting requests when running via remix vite:dev because we were incorrectly aborting requests after successful renders - which was causing us to abort a completed React render, and try to close an already closed ReadableStream This has likely not shown up in any production scenarios because cloudflare/deno production runtimes are (correctly) not aborting the request.signal on successful renders The built-in entry.server files no longer pass a signal to renderToReadableStream because adding a timeout-based abort signal to the default behavior would constitute a breaking change Users can configure this abort behavior via their own entry.server via remix reveal entry.server, and the template entry.server files have been updated with an example approach for newly created Remix apps @remix-run/express - Fix adapter logic for aborting request.signal so we don't incorrectly abort on the close event for successful requests (#10046) @remix-run/react - Fix bug with clientLoader.hydrate in a layout route when hydrating with bubbled errors (#10063) Updated Dependencies react-router-dom@6.27.0 @remix-run/router@1.20.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.12.1...v2.13.0 v2.12.1 Date: 2024-09-19 Patch Changes @remix-run/dev - Properly abort request.signal during vite dev when the node response is closed (#9976) @remix-run/dev - CSS imports with ?inline, ?inline-css and ?raw are no longer incorrectly injected during SSR in development (#9910) @remix-run/server-runtime: Single Fetch: Fix types when loader, action, clientLoader, or clientAction return a mixture of bare objects, json(...), defer(...), and unstable_data(...). (#9999) @remix-run/node/@remix-run/cloudflare/@remix-run/deno - Single Fetch: Re-export interface Future through runtime packages so that pnpm doesn't complain about @remix-run/server-runtime not being a dependency (#9982) If you've already opted into Single Fetch, you can change your Single Fetch type augmentation in vite.config.ts to augment @remix-run/node (or cloudflare/deno) instead of @remix-run/server-runtime Changes by Package @remix-run/cloudflare @remix-run/deno @remix-run/dev @remix-run/node @remix-run/server-runtime Full Changelog: v2.12.0...v2.12.1 v2.12.0 Date: 2024-09-09 What's Changed Future Flag for Automatic Dependency Optimization (unstable) You can now opt-in to automatic dependency optimization during development by using the future.unstable_optimizeDeps future flag. For details, check out the docs at Guides \u003e Dependency optimization. For users who were previously working around this limitation, you no longer need to explicitly add routes to Vite's optimizeDeps.entries nor do you need to disable the remix-dot-server plugin. Improved Single Fetch Type Safety (unstable) If you were already using single-fetch types: Remove the \"@remix-run/react/future/single-fetch.d.ts\" override from tsconfig.json \u003e compilerOptions \u003e types Remove defineLoader, defineAction, defineClientLoader, defineClientAction helpers from your route modules Replace UIMatch_SingleFetch type helper with the original UIMatch Replace MetaArgs_SingleFetch type helper with the original MetaArgs Then you are ready for the new type safety setup: // vite.config.ts declare module \"@remix-run/server-runtime\" { interface Future { unstable_singleFetch: true; // 👈 enable _types_ for single-fetch } } export default defineConfig({ plugins: [ remix({ future: { unstable_singleFetch: true, // 👈 enable single-fetch }, }), ], }); For more information, see Guides \u003e Single Fetch in our docs. Updates to Single Fetch Revalidation Behavior (unstable) With Single Fetch, re-used routes will now revalidate by default on GET navigations. This is aimed at improving caching of Single Fetch calls in the simple case while still allowing users to opt-into the previous behavior for more advanced use cases. With this new behavior, requests do not need special query params for granular route revalidations out of the box - i.e., GET /a/b/c.data There are two conditions that will trigger granular revalidation and will exclude certain routes from the single fetch call: If a route opts out of revalidation via shouldRevalidate If a route defines a clientLoader If you call serverLoader() from your clientLoader, that will make a separate HTTP call for just that route loader - i.e., GET /a/b/c.data?_routes=routes/a for a clientLoader in routes/a.tsx When one or more routes are excluded from the Single Fetch call, the remaining routes that have loaders are included as query params. For example, when navigating to /a/b/c, if A was excluded, and the root route and routes/b had a loader but routes/c did not, the Single Fetch request would be GET /a/b/c.data?_routes=root,routes/b. For more information, see Guides \u003e Single Fetch in our docs. Minor Changes @remix-run/dev - New future.unstable_optimizeDeps flag for automatic dependency optimization (#9921) Patch Changes @remix-run/dev - Handle circular dependencies in modulepreload manifest generation (#9917) @remix-run/dev - Fix dest already exists build errors by only moving SSR assets to the client build directory when they're not already present on disk (#9901) @remix-run/react - Clarify wording in default HydrateFallback console warning (#9899) @remix-run/react - Remove hydration URL check that was originally added for React 17 hydration issues and we no longer support React 17 (#9890) Reverts the logic originally added in Remix v1.18.0 via #6409 This was added to resolve an issue that could arise when doing quick back/forward history navigations while JS was loading which would cause a mismatch between the server matches and client matches: #1757 This specific hydration issue would then cause this React v17 only looping issue: #1678 The URL comparison that we added in 1.18.0 turned out to be subject to false positives of it's own which could also put the user in looping scenarios Remix v2 upgraded it's minimal React version to v18 which eliminated the v17 hydration error loop React v18 handles this hydration error like any other error and does not result in a loop So we can remove our check and thus avoid the false-positive scenarios in which it may also trigger a loop @remix-run/react - Lazy Route Discovery: Sort /__manifest query parameters for better caching (#9888) @remix-run/react - Single Fetch: Improved type safety (#9893) @remix-run/react - Single Fetch: Fix revalidation behavior bugs (#9938) @remix-run/server-runtime - Do not render or try to include a body for 304 responses on document requests (#9955) @remix-run/server-runtime - Single Fetch: Do not try to encode a turbo-stream body into 304 responses (#9941) @remix-run/server-runtime - Single Fetch: Change content type on .data requests to text/x-script to allow Cloudflare compression (#9889) Updated Dependencies react-router-dom@6.26.2 @remix-run/router@1.19.2 Changes by Package @remix-run/dev @remix-run/react @remix-run/server-runtime Full Changelog: v2.11.2...v2.12.0 v2.11.2 Date: 2024-08-15 Patch Changes @remix-run/react - Fog of War: Simplify implementation now that React Router handles slug/splat edge cases and tracks previously discovered routes (see https://github.com/remix-run/react-router/pull/11883) (#9860) ⚠️ This changes the return signature of the internal /__manifest endpoint since we no longer need the notFoundPaths field @remix-run/react - Fog of War: Update to use renamed unstable_patchRoutesOnNavigation function in RR (see https://github.com/remix-run/react-router/pull/11888) (#9860) @remix-run/server-runtime - Single Fetch: Fix redirects when a basename is present (#9848) @remix-run/server-runtime - Single Fetch: Update turbo-stream to v2.3.0 (#9856) Stabilize object key order for serialized payloads Remove memory limitations payloads sizes Updated Dependencies react-router-dom@6.26.1 @remix-run/router@1.19.1 Changes by Package @remix-run/react @remix-run/server-runtime Full Changelog: v2.11.1...v2.11.2 v2.11.1 Date: 2024-08-05 Patch Changes @remix-run/react - Revert #9695, stop infinite reload (a7cffe57) Changes by Package @remix-run/react Full Changelog: v2.11.0...v2.11.1 v2.11.0 Date: 2024-08-01 What's Changed Renamed unstable_fogOfWar future flag to unstable_lazyRouteDiscovery (unstable) We found that the future.unstable_fogOfWar flag name could be a bit confusing without the proper context (notably, the blog post), so we've renamed the flag to future.unstable_lazyRouteDiscovery for clarity. If you had opted into this feature already, please update the name of the flag in your vite.config.ts file (or remix.config.js). Removed response stub in Single Fetch (unstable) The original Single Fetch approach was based on an assumption that an eventual middleware implementation would require something like the ResponseStub API so users could mutate status/headers in middleware before/after handlers as well as during handlers. As part of Single Fetch, we wanted to align how response headers would be merged between document and data requests. Thinking response was the future API, we aligned document requests to use the response stub that data requests were using, and we stopped using the headers() function. However, the realization/alignment between Michael and Ryan on the recent roadmap planning made us realize that the original assumption was incorrect. middleware won't need a response stub - as users can just mutate the Response they get from await next() directly. Removing that assumption, and still wanting to align how headers get merged between document and data requests, it makes more sense to stick with the current headers() API and align Single Fetch data requests to use that existing API. This was we don't need to introduce any new header-related APIs which will make the adoption of Single Fetch much easier. With this change: The headers() function will let you control header merging for both document and data requests In most cases, if you were returning json()/defer() without setting a custom status or headers, you can just remove those utility functions and return the raw data ❌ return json({ data: \"whatever\" }); ✅ return { data: \"whatever\" }; If you were returning a custom status or headers via json/defer: We've added a new API-compatible unstable_data utility that will let you send back status/headers alongside your raw data without having to encode it into a Response We will be removing both json and defer in the next major version, but both should still work in Single Fetch in v2 to allow for incremental adoption of the new behavior ⚠️ If you've already adopted Single Fetch in it's unstable state and converted to response stub, you'll need to move those changes back to leveraging the headers() API. Minor Changes @remix-run/dev - Fog of War: Rename future.unstable_fogOfWar to future.unstable_lazyRouteDiscovery for clarity (#9763) @remix-run/server-runtime - Add a new replace(url, init?) alternative to redirect(url, init?) that performs a history.replaceState instead of a history.pushState on client-side navigation redirects (#9764) @remix-run/server-runtime - Single Fetch: Add a new unstable_data() API as a replacement for json/defer when custom status/headers are needed (#9769) @remix-run/server-runtime - Single Fetch: Remove responseStub in favor of headers (#9769) Patch Changes @remix-run/dev - Handle absolute Vite base URLs (#9700) @remix-run/react - Change initial hydration route mismatch from a URL check to a matches check to be resistant to URL inconsistencies (#9695) @remix-run/react - Single Fetch: Ensure calls don't include any trailing slash from the pathname (i.e., /path/.data) (#9792) @remix-run/react - Single Fetch: Add undefined to the useRouteLoaderData type override (#9796) Updated Dependencies react-router-dom@6.26.0 @remix-run/router@1.19.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.10.3...v2.11.0 v2.10.3 Date: 2024-07-16 Patch Changes @remix-run/architect - Manually joining headers with semi-colons to avoid differences in Remix and node/undici Headers implementation (#9664) @remix-run/react - Log any errors encountered loading a route module prior to reloading the page (#8932) @remix-run/react - Single Fetch (unstable): Proxy request.signal through dataStrategy for loader calls to fix cancellation (#9738) @remix-run/react - Single Fetch (unstable): Adopt React Router's stabilized future.v7_skipActionErrorRevalidation under the hood (#9706) This stabilizes the shouldRevalidate parameter from unstable_actionStatus to actionStatus ⚠️ This might be a breaking change for your app if you have opted into single fetch and the unstable_actionStatus parameter Updated Dependencies react-router-dom@6.25.0 @remix-run/router@1.18.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.10.2...v2.10.3 v2.10.2 Date: 2024-07-04 Patch Changes @remix-run/react - Forward ref to Form (bdd04217) @remix-run/server-runtime - Fix bug with immutable headers on raw native fetch responses returned from loaders (#9693) Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.10.1...v2.10.2 v2.10.1 Date: 2024-07-03 Patch Changes @remix-run/react - Fog of War (unstable): Support route discovery from \u003cForm\u003e components (#9665) @remix-run/react - Fog of War (unstable): Don't discover links/forms with reloadDocument (#9686) Updated Dependencies react-router-dom@6.24.1 @remix-run/router@1.17.1 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.10.0...v2.10.1 v2.10.0 Date: 2024-06-25 What's Changed Lazy Route Discovery (a.k.a. \"Fog of War\") The \"Fog of War\" feature in Remix, now available through the future.unstable_fogOfWar flag, is an optimization to reduce the up front size of the Remix route manifest. In most scenarios the Remix route manifest isn't prohibitively large so as to impact initial perf metrics, but at scale we've found that some apps can generate large manifests that are expensive to download and execute on app startup. When Fog of War is enabled, Remix will only include the initially server-rendered routes in the manifest and then it will fetch manifest \"patches\" for outgoing links as the user navigates around. By default, to avoid waterfalls Remix fetches patches for all rendered links, so that in the ideal case they've already been patched in prior to being clicked. If a user clicks a link before this eager discovery completes, then a small waterfall will occur to first \"discover\" the route, and then navigate to the route. Enabling this flag should require no application code changes. For more information, please see the documentation. Minor Changes Add support for Lazy Route Discovery (a.k.a. Fog of War) (#9600, #9619) Patch Changes @remix-run/{dev|express|serve} - Upgrade express dependency to ^4.19.2 (#9184) @remix-run/react - Don't prefetch server loader data when clientLoader exists (#9580) @remix-run/react - Avoid hydration loops when Layout/ErrorBoundary renders also throw (#9566) @remix-run/react - Fix a hydration bug when using child routes and HydrateFallback components with a basename (#9584) @remix-run/{server-runtime|react} - Single Fetch: Update to turbo-stream@2.2.0 (#9562) @remix-run/server-runtime - Single Fetch: Properly handle thrown 4xx/5xx response stubs (#9501) @remix-run/server-runtime - Single Fetch: Change redirects to use a 202 status to avoid automatic caching (#9564) @remix-run/server-runtime - Single Fetch: Fix issues with returning or throwing a response stub from a resource route in single fetch (#9488) @remix-run/server-runtime - Single Fetch: Fix error when returning null from a resource route (#9488) Updated Dependencies react-router-dom@6.24.0 @remix-run/router@1.17.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.9.2...v2.10.0 v2.9.2 Date: 2024-05-10 What's Changed Updated Type-Safety for Single Fetch In 2.9.2 we've enhanced the type-safety when opting into the future.unstable_singleFetch feature. Previously, we added the response stub to LoaderFunctionArgs and used type overrides for inference on useLoaderData, etc., but we found that it wasn't quite enough. With this release we're introducing new functions to assist the type-inference when using single fetch - defineLoader/defineAction and their client-side counterparts defineClientLoader and nd defineClientAction. These are identity functions; they don't modify your loader or action at runtime. Rather, they exist solely for type-safety by providing types for args and by ensuring valid return types. export const loader = defineLoader(({ request }) =\u003e { // ^? Request return { a: 1, b: () =\u003e 2 }; // ^ type error: `b` is not serializable }); Note that defineLoader and defineAction are not technically necessary for defining loaders and actions if you aren't concerned with type-safety: // this totally works! and typechecking is happy too! export const loader = () =\u003e { return { a: 1 }; }; This means that you can opt-in to defineLoader incrementally, one loader at a time. Please see the Single Fetch docs for more information. Patch Changes @remix-run/dev - Vite: Fix dest already exists error when running remix vite:build (#9305) @remix-run/dev - Vite: Fix issue resolving critical CSS during development when route files are located outside of the app directory (#9194) @remix-run/dev - Vite: Remove @remix-run/node from Vite plugin's optimizeDeps.include list since it was unnecessary and resulted in Vite warnings when not depending on this package (#9287) @remix-run/dev - Vite: Clean up redundant ?client-route=1 imports in development (#9395) @remix-run/dev - Vite: Ensure Babel config files are not referenced when applying the react-refresh Babel transform within the Remix Vite plugin (#9241) @remix-run/react - Type-safety for single-fetch: defineLoader, defineClientLoader, defineAction, defineClientAction (#9372) @remix-run/react - Single Fetch: Add undefined to useActionData type override (#9322) @remix-run/react - Single Fetch: Allow a nonce to be set on single fetch stream transfer inline scripts via \u003cRemixServer\u003e (#9364) @remix-run/server-runtime - Single Fetch: Don't log thrown response stubs via handleError (#9369) @remix-run/server-runtime - Single Fetch: Automatically wrap resource route naked object returns in json() for back-compat in v2 (and log deprecation warning) (#9349) @remix-run/server-runtime - Single Fetch: Pass response stub to resource route handlers (#9349) Updated Dependencies react-router-dom@6.23.1 @remix-run/router@1.16.1 Changes by Package @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.9.1...v2.9.2 v2.9.1 Date: 2024-04-24 Patch Changes @remix-run/dev - Fix issue where consumers who had added Remix packages to Vite's ssr.noExternal option were being overridden by the Remix Vite plugin adding Remix packages to Vite's ssr.external option (#9301) @remix-run/react - Ignore future/*.d.ts files from TS build (#9299) Changes by Package @remix-run/dev @remix-run/react Full Changelog: v2.9.0...v2.9.1 v2.9.0 Date: 2024-04-23 What's Changed Single Fetch (unstable) 2.9.0 introduces a future.unstable_singleFetch flag to enable to Single Fetch behavior (RFC) in your Remix application. Please refer to the docs for the full detail but the high-level changes to be aware of include: Naked objects returned from loader/action functions are no longer automatically serialized to JSON responses Instead, they'll be streamed as-is via turbo-stream which allows direct serialization of more complex types such as Promise, Date, Map instances, and more You will need to modify your tsconfig.json's compilerOptions.types array to infer types properly when using Single Fetch The headers export is no longer used when Single Fetch is enabled in favor of a new response stub passed to your loader/action functions The json/defer/redirect utilities are deprecated when using Single Fetch (but still work mostly the same) Actions no longer automatically revalidate on 4xx/5xx responses - you can return a 2xx to opt-into revalidation or use shouldRevalidate [!IMPORTANT] Single Fetch requires using undici as your fetch polyfill, or using the built-in fetch on Node 20+, because it relies on APIs available there but not in the @remix-run/web-fetch polyfill. Please refer to the Undici section below for more details. If you are managing your own server and calling installGlobals(), you will need to call installGlobals({ nativeFetch: true }) to avoid runtime errors when using Single Fetch If you are using remix-serve, it will use undici automatically if Single Fetch is enabled Undici Remix 2.9.0 adds a new installGlobals({ nativeFetch: true }) flag to opt into using undici for the Web Fetch polyfills instead of the @remix-run/web-* packages. This change has a few primary benefits: It will allow us to stop maintaining our own web-std-io fork in future versions of Remix It should bring us more in-line with spec compliance ⚠️ It is possible that some non-spec-compliant bugs in our fork will be \"fixed\" by moving to undici, so beware of \"breaking bug fixes\" and keep an eye on any advanced fetch API interactions you're performing in your app ⚠️ In some cases, undici may have different behavior by design -- most notably, undici's garbage collection behavior differs and you are required to consume all fetch response bodies to avoid a memory leak in your app Because undici is the fetch implementation used by node internally, it should better prepare Remix apps to more smoothly drop the polyfill to use the built-in Node.js APIs on node 20+ Minor Changes New future.unstable_singleFetch flag (#8773, #9073, #9084, #9272) @remix-run/node - Add a new installGlobals({ nativeFetch: true }) flag to opt-into using undici as the fetch polyfill instead of @remix-run/web-* (#9106, #9111, #9198) @remix-run/server-runtime - Add ResponseStub header interface and deprecate the headers export when Single Fetch is enabled (#9142) Patch Changes create-remix - Allow . in repo name when using --template flag (#9026) @remix-run/dev - Improve getDependenciesToBundle resolution in monorepos (#8848) @remix-run/dev - Fix SPA mode when Single Fetch is enabled by using streaming entry.server (#9063) @remix-run/dev - Vite: added sourcemap support for transformed routes (#8970) @remix-run/dev - Update links printed to the console by the Remix CLI/Dev Server to point to updated docs locations (#9176) @remix-run/server-runtime - Handle redirects created by handleDataRequest (#9104) Updated Dependencies react-router-dom@6.23.0 @remix-run/router@1.16.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.8.1...v2.9.0 v2.8.1 Date: 2024-03-07 Patch Changes @remix-run/dev - Vite: Support reading from Vite config when running remix reveal and remix routes CLI commands (#8916) @remix-run/dev - Vite: Clean up redundant client route query strings on route JavaScript files in production builds (#8969) @remix-run/dev - Vite: Add vite commands to Remix CLI --help output (#8939) @remix-run/dev - Vite: Fix support for build.sourcemap option in Vite config (#8965) @remix-run/dev - Vite: Fix error when using Vite's server.fs.allow option without a client entry file (#8966) @remix-run/react - Strengthen the internal LayoutComponent type to accept limited children (#8910) Updated Dependencies react-router-dom@6.22.3 @remix-run/router@1.15.3 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.8.0...v2.8.1 v2.8.0 Date: 2024-02-28 Minor Changes @remix-run/dev - Vite: Pass resolved viteConfig to Remix Vite plugin's buildEnd hook (#8885) Patch Changes @remix-run/dev - Mark Layout as browser safe route export in esbuild compiler (#8842) @remix-run/dev - Vite: Silence build warnings when dependencies include \"use client\" directives (#8897) @remix-run/dev - Vite: Fix serverBundles issue where multiple browser manifests are generated (#8864) @remix-run/dev - Vite: Support custom build.assetsDir option (#8843) @remix-run/react - Fix the default root ErrorBoundary component so it leverages the user-provided Layout component (#8859) @remix-run/react - Fix the default root HydrateFallback component so it leverages any user-provided Layout component (#8892) Updated Dependencies react-router-dom@6.22.2 @remix-run/router@1.15.2 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.7.2...v2.8.0 2.7.2 Date: 2024-02-21 Patch Changes @remix-run/dev - Vite: Fix error when building projects with .css?url imports (#8829) 2.7.1 Date: 2024-02-20 Patch Changes @remix-run/cloudflare-pages - Fix breaking change and restore Cloudflare event context fields in getLoadContext argument for backwards compatibility (#8819) v2.7.0 Date: 2024-02-20 What's Changed Stabilized Vite Plugin We're excited to announce that support for Vite is now stable in Remix 2.7.0! Ever since the initial unstable release of Remix Vite, weve been hard at work refining and extending it over the past few months with help from all of our early adopters and community contributors. This also means that Vite-only features such as SPA Mode, Server Bundles, and basename support are now officially stable as well 😊. For more information, check out the blog post and the Vite docs. New Layout Export We've found that it's super common to create your own component in your root route to hold the shared layout/app shell between your Component/ErrorBoundary/HydrateFallback. This is so common (and can also cause some minor edge-case issues such as a FOUC on hydration) that we've incorporated this as a first-class API in 2.7.0. You can now export an optional Layout component from your root route which will be provided your route component, ErrorBoundary, or HydrateFallback as it's children. For more information, please see the Layout docs and the RFC. Basename support React Router has long supported a basename config that allows you to serve your app within a subpath such as http://localhost/myapp/* without having to include the /myapp segment in all of your route paths. This was originally omitted from Remix because v1 nested folders file-convention made it pretty easy to put your route files in a routes/myapp/ folder, giving you the same functionality. There has also been an open proposal from the community to add this functionality. Two things have since changed that made us reconsider the lack of basename support: We switched to a flat-file based convention in v2, and it gets far less ergonomic to have to prefix all of your route files with myapp. compared to the nested folder convention We moved to Vite which has it's own base config which is often (and easily) confused with the concept of a React Router basename (when in reality it's more aligned with the old Remix publicPath config) In 2.7.0 we've added support for a basename in the Vite plugin config. For more information, please check out the basename docs. Note: This is a Vite-only feature and is not available via the esbuild compiler. Cloudflare Proxy as a Vite Plugin ⚠️ This is a breaking change for projects relying on Cloudflare support from the unstable Vite plugin The Cloudflare preset (unstable_cloudflarePreset) as been removed and replaced with a new Vite plugin: import { unstable_vitePlugin as remix, - unstable_cloudflarePreset as cloudflare, + cloudflareDevProxyVitePlugin as remixCloudflareDevProxy, } from \"@remix-run/dev\"; import { defineConfig } from \"vite\"; export default defineConfig({ plugins: [ + remixCloudflareDevProxy(), + remix(), - remix({ - presets: [cloudflare()], - }), ], - ssr: { - resolve: { - externalConditions: [\"workerd\", \"worker\"], - }, - }, }); A few notes on the new plugin: remixCloudflareDevProxy must come before the remix plugin so that it can override Vite's dev server middleware to be compatible with Cloudflare's proxied environment Because it is a Vite plugin, remixCloudflareDevProxy can set ssr.resolve.externalConditions to be workerd-compatible for you remixCloudflareDevProxy accepts a getLoadContext function that replaces the old getRemixDevLoadContext If you were using a nightly version that required getBindingsProxy or getPlatformProxy, that is no longer required Any options you were passing to getBindingsProxy or getPlatformProxy should now be passed to remixCloudflareDevProxy instead This API also better aligns with future plans to support Cloudflare with a framework-agnostic Vite plugin that makes use of Vite's (experimental) Runtime API. Minor Changes @remix-run/react - Allow an optional Layout export from the root route (#8709) @remix-run/cloudflare-pages - Make getLoadContext optional for Cloudflare Pages (#8701) Defaults to (context) =\u003e ({ env: context }), which is what we used to have in all the templates This gives parity with the Cloudflare preset for the Remix Vite plugin and keeps our templates leaner @remix-run/dev - Vite: Cloudflare Proxy as a Vite plugin (#8749) ⚠️ This is a breaking change for projects relying on Cloudflare support from the unstable Vite plugin @remix-run/dev - Vite: Add a new basename option to the Vite plugin, allowing users to set the internal React Router basename in order to to serve their applications underneath a subpath (#8145) @remix-run/dev - Vite: Stabilize the Remix Vite plugin, Cloudflare preset, and all related types by removing all unstable_ / Unstable_ prefixes (#8713) While this is a breaking change for existing Remix Vite plugin consumers, now that the plugin has stabilized, there will no longer be any breaking changes outside of a major release. Thank you to all of our early adopters and community contributors for helping us get here! 🙏 @remix-run/dev - Vite: Stabilize \"SPA Mode\" by renaming the Remix vite plugin config from unstable_ssr -\u003e ssr (#8692) Patch Changes @remix-run/express - Use req.originalUrl instead of req.url so that Remix sees the full URL (#8145) Remix relies on the knowing the full URL to ensure that server and client code can function together, and does not support URL rewriting prior to the Remix handler @remix-run/react - Fix a bug with SPA mode when the root route had no children (#8747) @remix-run/server-runtime - Add a more specific error if a user returns a defer response from a resource route (#8726) @remix-run/dev - Always prepend DOCTYPE in SPA mode entry.server.tsx, can opt out via remix reveal (#8725) @remix-run/dev - Fix build issue in SPA mode when using a basename (#8720) @remix-run/dev - Fix type error in Remix config for synchronous routes function (#8745) @remix-run/dev - Vite: Fix issue where client route file requests fail if search params have been parsed and serialized before reaching the Remix Vite plugin (#8740) @remix-run/dev - Vite: Validate that the MDX Rollup plugin, if present, is placed before Remix in Vite config (#8690) @remix-run/dev - Vite: Fix issue resolving critical CSS during development when the current working directory differs from the project root (#8752) @remix-run/dev - Vite: Require version 5.1.0 to support .css?url imports (#8723) @remix-run/dev - Vite: Support Vite 5.1.0's .css?url imports (#8684) @remix-run/dev - Vite: Enable use of vite preview to preview Remix SPA applications (#8624) In the SPA template, npm run start has been renamed to npm run preview which uses vite preview instead of a standalone HTTP server such as http-server or serv-cli @remix-run/dev - Vite: Remove the ability to pass publicPath as an option to the Remix vite plugin (#8145) ⚠️ This is a breaking change for projects using the unstable Vite plugin with a publicPath This is already handled in Vite via the base config so we now set the Remix publicPath from the Vite base config @remix-run/dev - Vite: Enable HMR for .md and .mdx files (#8711) @remix-run/dev - Vite: reliably detect non-root routes in Windows (#8806) @remix-run/dev - Vite: Pass remixUserConfig to preset remixConfig hook (#8797) @remix-run/dev - Vite: Ensure CSS file URLs that are only referenced in the server build are available on the client (#8796) @remix-run/dev - Vite: fix server exports dead-code elimination for routes outside of app directory (#8795) Updated Dependencies react-router-dom@6.22.Y @remix-run/router@1.15.Y Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.6.0...v2.7.0 v2.6.0 Date: 2024-02-01 What's Changed Unstable Vite Plugin updates As we continue moving towards stabilizing the Vite plugin, we've introduced a few breaking changes to the unstable Vite plugin in this release. Please read the @remix-run/dev changes below closely and update your app accordingly if you've opted into using the Vite plugin. We've also removed the unstable_ prefix from the serverBundles option as we're now confident in the API (#8596). 🎉 And last, but certainly not least - we've added much anticipated Cloudflare support in #8531! To get started with Cloudflare, you can use the unstable-vite-cloudflare template: npx create-remix@latest --template remix-run/remix/templates/unstable-vite-cloudflare For more information, please refer to the docs at Future \u003e Vite \u003e Cloudflare and Future \u003e Vite \u003e Migrating \u003e Migrating Cloudflare Functions. Minor Changes @remix-run/server-runtime - Add future.v3_throwAbortReason flag to throw request.signal.reason when a request is aborted instead of an Error such as new Error(\"query() call aborted: GET /path\") (#8251) Patch Changes @remix-run/server-runtime - Unwrap thrown Response's from entry.server into ErrorResponse's and preserve the status code (#8577) @remix-run/dev - Vite: Add manifest option to Vite plugin to enable writing a .remix/manifest.json file to the build directory (#8575) ⚠️ This is a breaking change for consumers of the Vite plugin's \"server bundles\" feature The build/server/bundles.json file has been superseded by the more general build/.remix/manifest.json While the old server bundles manifest was always written to disk when generating server bundles, the build manifest file must be explicitly enabled via the manifest option @remix-run/dev - Vite: Rely on Vite plugin ordering (#8627) ⚠️ This is a breaking change for projects using the unstable Vite plugin The Remix plugin expects to process JavaScript or TypeScript files, so any transpilation from other languages must be done first. For example, that means putting the MDX plugin before the Remix plugin: import mdx from \"@mdx-js/rollup\"; import { unstable_vitePlugin as remix } from \"@remix-run/dev\"; import { defineConfig } from \"vite\"; export default defineConfig({ plugins: [ + mdx(), remix() - mdx(), ], }); Previously, the Remix plugin misused enforce: \"post\" from Vite's plugin API to ensure that it ran last However, this caused other unforeseen issues Instead, we now rely on standard Vite semantics for plugin ordering The official Vite React SWC plugin also relies on plugin ordering for MDX @remix-run/dev - Vite: Remove interop with \u003cLiveReload /\u003e, rely on \u003cScripts /\u003e instead (#8636) ⚠️ This is a breaking change for projects using the unstable Vite plugin Vite provides a robust client-side runtime for development features like HMR, making the \u003cLiveReload /\u003e component obsolete In fact, having a separate dev scripts component was causing issues with script execution order To work around this, the Remix Vite plugin used to override \u003cLiveReload /\u003e into a bespoke implementation that was compatible with Vite Instead of all this indirection, now the Remix Vite plugin instructs the \u003cScripts /\u003e component to automatically include Vite's client-side runtime and other dev-only scripts To adopt this change, you can remove the LiveReload component from your root.tsx component: import { - LiveReload, Outlet, Scripts, } export default function App() { return ( \u003chtml\u003e \u003chead\u003e \u003c/head\u003e \u003cbody\u003e \u003cOutlet /\u003e \u003cScripts /\u003e - \u003cLiveReload /\u003e \u003c/body\u003e \u003c/html\u003e ) } @remix-run/dev - Vite: Only write Vite manifest files if build.manifest is enabled within the Vite config (#8599) ⚠️ This is a breaking change for consumers of Vite's manifest.json files To explicitly enable generation of Vite manifest files, you must set build.manifest to true in your Vite config: export default defineConfig({ build: { manifest: true }, // ... }); @remix-run/dev - Vite: Add new buildDirectory option with a default value of \"build\" (#8575) ⚠️ This is a breaking change for consumers of the Vite plugin that were using the assetsBuildDirectory and serverBuildDirectory options This replaces the old assetsBuildDirectory and serverBuildDirectory options which defaulted to \"build/client\" and \"build/server\" respectively The Remix Vite plugin now builds into a single directory containing client and server directories If you've customized your build output directories, you'll need to migrate to the new buildDirectory option, e.g.: import { unstable_vitePlugin as remix } from \"@remix-run/dev\"; import { defineConfig } from \"vite\"; export default defineConfig({ plugins: [ remix({ - serverBuildDirectory: \"dist/server\", - assetsBuildDirectory: \"dist/client\", + buildDirectory: \"dist\", }) ], }); @remix-run/dev - Vite: Write Vite manifest files to build/.vite directory rather than being nested within build/client and build/server directories (#8599) ⚠️ This is a breaking change for consumers of Vite's manifest.json files Vite manifest files are now written to the Remix build directory Since all Vite manifests are now in the same directory, they're no longer named manifest.json Instead, they're named build/.vite/client-manifest.json and build/.vite/server-manifest.json, or build/.vite/server-{BUNDLE_ID}-manifest.json when using server bundles @remix-run/dev - Vite: Remove unstable prefix from serverBundles option (#8596) @remix-run/dev - Vite: Add --sourcemapClient and --sourcemapServer flags to remix vite:build (#8613) --sourcemapClient, --sourcemapClient=inline, or --sourcemapClient=hidden --sourcemapServer, --sourcemapServer=inline, or --sourcemapServer=hidden See https://vitejs.dev/config/build-options.html#build-sourcemap @remix-run/dev - Vite: Validate IDs returned from the serverBundles function to ensure they only contain alphanumeric characters, hyphens and underscores (#8598) @remix-run/dev - Vite: Fix \"could not fast refresh\" false alarm (#8580) HMR is already functioning correctly but was incorrectly logging that it \"could not fast refresh\" on internal client routes Now internal client routes correctly register Remix exports like meta for fast refresh, which removes the false alarm. @remix-run/dev - Vite: Cloudflare Pages support (#8531) @remix-run/dev - Vite: Add getRemixDevLoadContext option to Cloudflare preset (#8649) @remix-run/dev - Vite: Remove undocumented backwards compatibility layer for Vite v4 (#8581) @remix-run/dev - Vite: Add presets option to ease integration with different platforms and tools (#8514) @remix-run/dev - Vite: Add buildEnd hook (#8620) @remix-run/dev - Vite: Add mode field into generated server build (#8539) @remix-run/dev - Vite: Reduce network calls for route modules during HMR (#8591) @remix-run/dev - Vite: Export Unstable_ServerBundlesFunction and Unstable_VitePluginConfig types (#8654) Updated Dependencies react-router-dom@6.22.0 @remix-run/router@1.15.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.5.1...v2.6.0 v2.5.1 Date: 2024-01-18 Patch Changes create-remix - high-contrast fg/bg for header colors (#8503) bgWhite and whiteBright are the same color in many terminal colorthemes, which was causing it to render as illegible white-on-white @remix-run/dev - Add isSpaMode to @remix-run/dev/server-build virtual module (#8492) @remix-run/dev - SPA Mode: Automatically prepend \u003c!DOCTYPE html\u003e if not present to fix quirks mode warnings for SPA template (#8495) @remix-run/dev - Vite: Errors for server-only code point to new docs (#8488) @remix-run/dev - Vite: Fix HMR race condition when reading changed file contents (#8479) @remix-run/dev - Vite: Tree-shake unused route exports in the client build (#8468) @remix-run/dev - Vite: Performance profiling (#8493) Run remix vite:build --profile to generate a .cpuprofile that can be shared or uploaded to speedscope.app In dev, press p + enter to start a new profiling session or stop the current session If you need to profile dev server startup, run remix vite:dev --profile to initialize the dev server with a running profiling session For more, see the new Vite \u003e Performance docs @remix-run/dev - Vite: Improve performance of dev server requests by invalidating Remix's virtual modules on relevant file changes rather than on every request (#8164) @remix-run/react - Remove leftover unstable_ prefix from Blocker/BlockerFunction types (#8530) @remix-run/react - Only use active matches in \u003cMeta\u003e/\u003cLinks\u003e in SPA mode (#8538) Updated Dependencies react-router-dom@6.21.3 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.5.0...v2.5.1 v2.5.0 Date: 2024-01-11 What's Changed SPA Mode (unstable) SPA Mode (RFC) allows you to generate your Remix app as a standalone SPA served from a static index.html file. You can opt into SPA Mode by setting unstable_ssr: false in your Remix Vite plugin config: // vite.config.ts import { unstable_vitePlugin as remix } from \"@remix-run/dev\"; import { defineConfig } from \"vite\"; export default defineConfig({ plugins: [remix({ unstable_ssr: false })], }); Development in SPA Mode is just like a normal Remix app, and still uses the Remix dev server for HMR/HDR: remix vite:dev Building in SPA Mode will generate an index.html file in your client assets directory: remix vite:build To run your SPA, you serve your client assets directory via an HTTP server: npx http-server build/client For more information, please refer to the SPA Mode docs. Server Bundles (unstable) This is an advanced feature designed for hosting provider integrations where you may want to split server code into multiple request handlers. When compiling your app into multiple server bundles, there will need to be a custom routing layer in front of your app directing requests to the correct bundle. This feature is currently unstable and only designed to gather early . You can control the server bundles generated by your Remix Vite build by setting the unstable_serverBundles option in your vite config: import { unstable_vitePlugin as remix } from \"@remix-run/dev\"; import { defineConfig } from \"vite\"; export default defineConfig({ plugins: [ remix({ unstable_serverBundles: ({ branch }) =\u003e { const isAuthenticatedRoute = branch.some( (route) =\u003e route.id === \"routes/_authenticated\", ); return isAuthenticatedRoute ? \"authenticated\" : \"unauthenticated\"; }, }), ], }); Minor Changes Add unstable support for \"SPA Mode\" (#8457) Add unstable_serverBundles option to Vite plugin to support splitting server code into multiple request handlers (#8332) Patch Changes create-remix: Only update * versions for Remix dependencies (#8458) remix-serve: Don't try to load sourcemaps if they don't exist on disk (#8446) @remix-run/dev: Fix issue with isbot@4 released on 1/1/2024 (#8415) remix dev will now add \"isbot\": \"^4\" to package.json instead of using latest Update built-in entry.server files to work with both isbot@3 and isbot@4 for backwards-compatibility with Remix apps that have pinned isbot@3 Templates are updated to use isbot@4 moving forward via create-remix @remix-run/dev: Vite - Fix HMR issues when altering exports for non-rendered routes (#8157) @remix-run/dev: Vite - Default NODE_ENV to \"production\" when running remix vite:build command (#8405) @remix-run/dev: Vite - Remove Vite plugin config option serverBuildPath in favor of separate serverBuildDirectory and serverBuildFile options (#8332) @remix-run/dev: Vite - Loosen strict route exports restriction, reinstating support for non-Remix route exports (#8420) @remix-run/react: Vite - Fix type conflict with import.meta.hot from the existing Remix compiler (#8459) @remix-run/server-runtime: Updated cookie dependency to 0.6.0 to inherit support for the Partitioned attribute (#8375) Updated Dependencies react-router-dom@6.21.2 @remix-run/router@1.14.2 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.4.1...v2.5.0 v2.4.1 Date: 2023-12-22 Patch Changes @remix-run/dev: Vite - Remove unstable_viteServerBuildModuleId in favor of manually referencing virtual module name \"virtual:remix/server-build\" (#8264) ⚠️ This is a breaking change for projects using the unstable Vite plugin with a custom server This change was made to avoid issues where @remix-run/dev could be inadvertently required in your server's production dependencies. Instead, you should manually write the virtual module name \"virtual:remix/server-build\" when calling ssrLoadModule in development. -import { unstable_viteServerBuildModuleId } from \"@remix-run/dev\"; // ... app.all( \"*\", createRequestHandler({ build: vite - ? () =\u003e vite.ssrLoadModule(unstable_viteServerBuildModuleId) + ? () =\u003e vite.ssrLoadModule(\"virtual:remix/server-build\") : await import(\"./build/server/index.js\"), }) ); @remix-run/dev: Vite - Add vite:dev and vite:build commands to the Remix CLI (#8211) In order to handle upcoming Remix features where your plugin options can impact the number of Vite builds required, you should now run your Vite dev and build processes via the Remix CLI. { \"scripts\": { - \"dev\": \"vite dev\", - \"build\": \"vite build \u0026\u0026 vite build --ssr\" + \"dev\": \"remix vite:dev\", + \"build\": \"remix vite:build\" } } @remix-run/dev: Vite - Error messages when .server files are referenced by client (#8267) Previously, referencing a .server module from client code resulted in an error message like: The requested module '/app/models/answer.server.ts' does not provide an export named 'isDateType' This was confusing because answer.server.ts does provide the isDateType export, but Remix was replacing .server modules with empty modules (export {}) for the client build Now, Remix explicitly fails at compile time when a .server module is referenced from client code and includes dedicated error messages depending on whether the import occurs in a route or a non-route module The error messages also include links to relevant documentation @remix-run/dev: Vite - Preserve names for exports from .client modules (#8200) Unlike .server modules, the main idea is not to prevent code from leaking into the server build since the client build is already public Rather, the goal is to isolate the SSR render from client-only code Routes need to import code from .client modules without compilation failing and then rely on runtime checks or otherwise ensure that execution only happens within a client-only context (e.g. event handlers, useEffect) Replacing .client modules with empty modules would cause the build to fail as ESM named imports are statically analyzed So instead, we preserve the named export but replace each exported value with undefined That way, the import is valid at build time and standard runtime checks can be used to determine if the code is running on the server or client @remix-run/dev: Vite - Disable watch mode in Vite child compiler during build (#8342) @remix-run/dev: Vite - Show warning when source maps are enabled in production build (#8222) @remix-run/react: Propagate server loader errors through serverLoader in hydrating clientLoader's (#8304) @remix-run/react Re-export Response helpers (defer/json/redirect/redirectDocument) through @remix-run/react for use in clientLoader/clientAction (#8351) @remix-run/server-runtime: Add optional error to ServerRuntimeMetaArgs type to align with MetaArgs (#8238) create-remix: Switch to using @remix-run/web-fetch instead of node-fetch inside the create-remix CLI (#7345) remix-serve: Use node fileURLToPath to convert source map URL to path (#8321) Updated Dependencies react-router-dom@6.21.1 @remix-run/router@1.14.1 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.4.0...v2.4.1 v2.4.0 Date: 2023-12-13 What's Changed Client Data We're excited to land the Client Data RFC in this release! The final API differs slightly from the RFC, so please check out the docs for use-cases and final APIs: Client Data Guide clientLoader HydrateFallback clientAction While we still recommend server loaders/actions for the majority of your data needs in a Remix app - these provide some levers you can pull for more advanced use-cases such as: Skip the Hop: Query a data API directly from the browser, using loaders simply for SSR Fullstack State: Augment server data with client data for your full set of loader data One or the Other: Sometimes you use server loaders, sometimes you use client loaders, but not both on one route Client Cache: Cache server loader data in the client and avoid some server calls Migration: Ease your migration from React Router -\u003e Remix SPA -\u003e Remix SSR future.v3_relativeSplatPath We introduced a future.v3_relativeSplatPath flag to implement a breaking bug fix to relative routing when inside a splat route. For more information, please see the React Router 6.21.0 Release Notes and the useResolvedPath docs Vite Updates (Unstable) Remix now excludes modules within .server directories from client build. Remix now enforces strict route exports, and will will throw an error if you have unsupported exports in your route modules. Previously, the Remix compiler would allow any export from routes. While this was convenient, it was also a common source of bugs that were hard to track down because they only surfaced at runtime. For more information, please see the docs. Minor Changes Add support for clientLoader/clientAction/HydrateFallback route exports (#8173) Add a new future.v3_relativeSplatPath flag to implement a breaking bug fix to relative routing when inside a splat route (#8216) Deprecate DataFunctionArgs in favor of LoaderFunctionArgs/ActionFunctionArgs (#8173) This is aimed at keeping the types aligned across server/client loaders/actions now that clientLoader/clientActon functions have serverLoader/serverAction parameters which differentiate ClientLoaderFunctionArgs/ClientActionFunctionArgs Vite: Exclude modules within .server directories from client build (#8154) Vite: Strict route exports (#8171) Patch Changes @remix-run/server-runtime: Fix flash of unstyled content for non-Express custom servers in Vite dev (#8076) @remix-run/server-runtime: Pass request handler errors to vite.ssrFixStacktrace in Vite dev to ensure stack traces correctly map to the original source code (#8066) remix-serve: Fix source map loading when file has ?t=timestamp suffix (rebuilds) (#8174) @remix-run/dev: Change Vite build output paths to fix a conflict between how Vite and the Remix compiler each manage the public directory (#8077) ⚠️ This is a breaking change for projects using the unstable Vite plugin The server is now compiled into build/server rather than build, and the client is now compiled into build/client rather than public For more information on the changes and guidance on how to migrate your project, refer to the updated Remix Vite documentation @remix-run/dev: Upgrade Vite peer dependency range to v5 (#8172) @remix-run/dev: Support HMR for routes with handle export in Vite dev (#8022) @remix-run/dev: Fix flash of unstyled content for non-Express custom servers in Vite dev (#8076) @remix-run/dev: Bundle CSS imported in client entry file in Vite plugin (#8143) @remix-run/dev: Remove undocumented legacyCssImports option from Vite plugin due to issues with ?url imports of CSS files not being processed correctly in Vite (#8096) @remix-run/dev: Vite: fix access to default entry.{client,server}.tsx within pnpm workspaces on Windows (#8057) @remix-run/dev: Remove unstable_createViteServer and unstable_loadViteServerBuild which were only minimal wrappers around Vite's createServer and ssrLoadModule functions when using a custom server (#8120) ⚠️ This is a breaking change for projects using the unstable Vite plugin with a custom server Instead, we now provide unstable_viteServerBuildModuleId so that custom servers interact with Vite directly rather than via Remix APIs, for example: -import { - unstable_createViteServer, - unstable_loadViteServerBuild, -} from \"@remix-run/dev\"; +import { unstable_viteServerBuildModuleId } from \"@remix-run/dev\"; Creating the Vite server in middleware mode: const vite = process.env.NODE_ENV === \"production\" ? undefined - : await unstable_createViteServer(); + : await import(\"vite\").then(({ createServer }) =\u003e + createServer({ + server: { + middlewareMode: true, + }, + }) + ); Loading the Vite server build in the request handler: app.all( \"*\", createRequestHandler({ build: vite - ? () =\u003e unstable_loadViteServerBuild(vite) + ? () =\u003e vite.ssrLoadModule(unstable_viteServerBuildModuleId) : await import(\"./build/server/index.js\"), }) ); @remix-run/dev: Pass request handler errors to vite.ssrFixStacktrace in Vite dev to ensure stack traces correctly map to the original source code (#8066) @remix-run/dev: Vite: Preserve names for exports from .client imports (#8200) Unlike .server modules, the main idea is not to prevent code from leaking into the server build since the client build is already public Rather, the goal is to isolate the SSR render from client-only code Routes need to import code from .client modules without compilation failing and then rely on runtime checks to determine if the code is running on the server or client Replacing .client modules with empty modules would cause the build to fail as ESM named imports are statically analyzed So instead, we preserve the named export but replace each exported value with an empty object That way, the import is valid at build time and the standard runtime checks can be used to determine if then code is running on the server or client @remix-run/dev: Add @remix-run/node to Vite's optimizeDeps.include array (#8177) @remix-run/dev: Improve Vite plugin performance (#8121) Parallelize detection of route module exports Disable server.preTransformRequests in Vite child compiler since it's only used to process route modules @remix-run/dev: Remove automatic global Node polyfill installation from the built-in Vite dev server and instead allow explicit opt-in (#8119) ⚠️ This is a breaking change for projects using the unstable Vite plugin without a custom server If you're not using a custom server, you should call installGlobals in your Vite config instead. import { unstable_vitePlugin as remix } from \"@remix-run/dev\"; +import { installGlobals } from \"@remix-run/node\"; import { defineConfig } from \"vite\"; +installGlobals(); export default defineConfig({ plugins: [remix()], }); @remix-run/dev: Vite: Errors at build-time when client imports .server default export (#8184) Remix already stripped .server file code before ensuring that server code never makes it into the client That results in errors when client code tries to import server code, which is exactly what we want! But those errors were happening at runtime for default imports A better experience is to have those errors happen at build-time so that you guarantee that your users won't hit them @remix-run/dev: Fix request instanceof Request checks when using Vite dev server (#8062) Updated Dependencies react-router-dom@6.21.0 @remix-run/router@1.14.0 @remix-run/web-fetch@4.4.2 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.3.1...v2.4.0 v2.3.1 Date: 2023-11-22 Patch Changes @remix-run/dev: Support nonce prop on LiveReload component in Vite dev (#8014) @remix-run/dev: Ensure code-split JS files in the server build's assets directory aren't cleaned up after Vite build (#8042) @remix-run/dev: Fix redundant copying of assets from public directory in Vite build (#8039) This ensures that static assets aren't duplicated in the server build directory This also fixes an issue where the build would break if assetsBuildDirectory was deeply nested within the public directory Updated Dependencies react-router-dom@6.20.0 @remix-run/router@1.13.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.3.0...v2.3.1 v2.3.0 Date: 2023-11-16 What's Changed Stabilized useBlocker We've removed the unstable_ prefix from the useBlocker hook as it's been in use for enough time that we are confident in the API. We do not plan to remove the prefix from unstable_usePrompt due to differences in how browsers handle window.confirm that prevent React Router from guaranteeing consistent/correct behavior. unstable_flushSync API We've added a new unstable_flushSync option to the imperative APIs (useSubmit, useNavigate, fetcher.submit, fetcher.load) to let users opt-into synchronous DOM updates for pending/optimistic UI. function handleClick() { submit(data, { flushSync: true }); // Everything is flushed to the DOM so you can focus/scroll to your pending/optimistic UI setFocusAndOrScrollToNewlyAddedThing(); } Minor Changes Remove the unstable_ prefix from the useBlocker hook (#7882) Add unstable_flushSync option to useNavigate/useSubmit/fetcher.load/fetcher.submit to opt-out of React.startTransition and into ReactDOM.flushSync for state updates (#7996) Patch Changes @remix-run/react: Add missing modulepreload for the manifest (#7684) @remix-run/server-runtime: Updated cookie dependency from 0.4.1 to 0.5.0 to inherit support for Priority attribute in Chrome (#6770) @remix-run/dev: Fix FutureConfig type (#7895) Lots of small fixes for the unstable vite compiler: Support optional rendering of the LiveReload component in Vite dev (#7919) Support rendering of the LiveReload component after Scripts in Vite dev (#7919) Fix react-refresh/babel resolution for custom server with pnpm (#7904) Support JSX usage in .jsx files without manual React import in Vite (#7888) Fix Vite production builds when plugins that have different local state between development and production modes are present (e.g. @mdx-js/rollup) (#7911) Cache resolution of Remix Vite plugin options (#7908) Support Vite 5 (#7846) Allow process.env.NODE_ENV values other than \"development\" in Vite dev (#7980) Attach CSS from shared chunks to routes in Vite build (#7952) Let Vite handle serving files outside of project root via /@fs (#7913) This fixes errors when using default client entry or server entry in a pnpm project where those files may be outside of the project root, but within the workspace root By default, Vite prevents access to files outside the workspace root (when using workspaces) or outside of the project root (when not using workspaces) unless user explicitly opts into it via Vite's server.fs.allow Improve performance of LiveReload proxy in Vite dev (#7883) Deduplicate @remix-run/react (#7926) Pre-bundle Remix dependencies to avoid Remix router duplicates Our remix-react-proxy plugin does not process default client and server entry files since those come from within node_modules That means that before Vite pre-bundles dependencies (e.g. first time dev server is run) mismatching Remix routers cause Error: You must render this element inside a \u003cRemix\u003e element Fix React Fast Refresh error on load when using defer in Vite dev server (#7842) Handle multiple Set-Cookie headers in Vite dev server (#7843) Fix flash of unstyled content on initial page load in Vite dev when using a custom Express server (#7937) Populate process.env from .env files on the server in Vite dev (#7958) Emit assets that were only referenced in the server build into the client assets directory in Vite build (#7892, cherry-picked in 8cd31d65) Updated Dependencies react-router-dom@6.19.0 @remix-run/router@1.12.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.2.0...v2.3.0 v2.2.0 Date: 2023-10-31 What's Changed Vite! Remix 2.2.0 adds unstable support for Vite for Node-based apps! See our announcement blog post and the Future \u003e Vite page in the Remix docs for more details. You can try it out today with two new (unstable) templates: # minimal server npx create-remix@latest --template remix-run/remix/templates/unstable-vite # custom server (Express example) npx create-remix@latest --template remix-run/remix/templates/unstable-vite-express New APIs in @remix-run/dev unstable_vitePlugin: The new Remix Vite plugin unstable_createViteServer: Creates a Vite server in middleware mode for interop with custom servers unstable_loadViteServerBuild: Allows your custom server to delegate SSR requests to Vite during development Changed APIs createRequestHandler: Now also allows the build argument to be a function that will be used to dynamically load new builds for each request during development Other Runtimes Deno support is untested, but should work through Deno's Node/npm interop CloudFlare support is not yet available New Fetcher APIs Per this RFC, we've introduced some new APIs that give you more granular control over your fetcher behaviors: You may now specify your own fetcher identifier via useFetcher({ key: string }), which allows you to access the same fetcher instance from different components in your application without prop-drilling Fetcher keys are now exposed on the fetchers returned from useFetchers so that they can be looked up by key Form and useSubmit now support optional navigate/fetcherKey props/params to allow kicking off a fetcher submission under the hood with an optionally user-specified key \u003cForm method=\"post\" navigate={false} fetcherKey=\"my-key\"\u003e submit(data, { method: \"post\", navigate: false, fetcherKey: \"my-key\" }) Invoking a fetcher in this way is ephemeral and stateless If you need to access the state of one of these fetchers, you will need to leverage useFetchers() or useFetcher({ key }) to look it up elsewhere Persistence Future Flag Per the same RFC as above, we've introduced a new future.v3_fetcherPersist flag that allows you to opt-into the new fetcher persistence/cleanup behavior. Instead of being immediately cleaned up on unmount, fetchers will persist until they return to an idle state. This makes pending/optimistic UI much easier in scenarios where the originating fetcher needs to unmount. This is sort of a long-standing bug fix as the useFetchers() API was always supposed to only reflect in-flight fetcher information for pending/optimistic UI -- it was not intended to reflect fetcher data or hang onto fetchers after they returned to an idle state Keep an eye out for the following specific behavioral changes when opting into this flag and check your app for compatibility: Fetchers that complete while still mounted will no longer appear in useFetchers() after completion - they served no purpose in there since you can access the data via useFetcher().data Fetchers that previously unmounted while in-flight will not be immediately aborted and will instead be cleaned up once they return to an idle state They will remain exposed via useFetchers while in-flight so you can still access pending/optimistic data after unmount If a fetcher is no longer mounted when it completes, then it's result will not be post processed - e.g., redirects will not be followed and errors will not bubble up in the UI However, if a fetcher was re-mounted elsewhere in the tree using the same key, then it's result will be processed, even if the originating fetcher was unmounted Minor Changes Unstable vite support (#7590) New fetcher key APIs and navigate/fetcherKey params for navigational APIs (#10960) New future.v3_fetcherPersist flag (#10962) Patch Changes @remix-run/express: Allow the Express adapter to work behind a proxy when using app.enable('trust proxy') (#7323) Previously, this used req.get('host') to construct the Remix Request, but that does not respect X-Forwarded-Host This now uses req.hostname which will respect X-Forwarded-Host @remix-run/react: Fix warning that could be inadvertently logged when using route files with no default export (#7745) create-remix: Support local tarballs with a .tgz extension which allows direct support for pnpm pack tarballs (#7649) create-remix: Default the Remix app version to the version of create-remix being used (#7670) This most notably enables easier usage of tags, e.g. npm create remix@nightly Updated Dependencies react-router-dom@6.18.0 @remix-run/router@1.11.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.1.0...v2.2.0 v2.1.0 Date: 2023-10-16 What's Changed View Transitions We're excited to release experimental support for the the View Transitions API in Remix! You can now trigger navigational DOM updates to be wrapped in document.startViewTransition to enable CSS animated transitions on SPA navigations in your application. The simplest approach to enabling a View Transition in your Remix app is via the new \u003cLink unstable_viewTransition\u003e prop. This will cause the navigation DOM update to be wrapped in document.startViewTransition which will enable transitions for the DOM update. Without any additional CSS styles, you'll get a basic cross-fade animation for your page. If you need to apply more fine-grained styles for your animations, you can leverage the unstable_useViewTransitionState hook which will tell you when a transition is in progress and you can use that to apply classes or styles: function ImageLink(to, src, alt) { const isTransitioning = unstable_useViewTransitionState(to); return ( \u003cLink to={to} unstable_viewTransition\u003e \u003cimg src={src} alt={alt} style={{ viewTransitionName: isTransitioning ? \"image-expand\" : \"\", }} /\u003e \u003c/Link\u003e ); } You can also use the \u003cNavLink unstable_viewTransition\u003e shorthand which will manage the hook usage for you and automatically add a transitioning class to the \u003ca\u003e during the transition: a.transitioning img { view-transition-name: \"image-expand\"; } \u003cNavLink to={to} unstable_viewTransition\u003e \u003cimg src={src} alt={alt} /\u003e \u003c/NavLink\u003e For an example usage of View Transitions, check out our fork of the Astro Records demo (which uses React Router but so does Remix 😉). For more information on using the View Transitions API, please refer to the Smooth and simple transitions with the View Transitions API guide from the Google Chrome team. Stable createRemixStub After real-world experience, we're confident in the createRemixStub API and ready to commit to it, so in 2.1.0 we've removed the unstable_ prefix. ⚠️ Please note that this did involve 1 small breaking change - the \u003cRemixStub remixConfigFuture\u003e prop has been renamed to \u003cRemixStub future\u003e to decouple the future prop from a specific file location. Minor Changes Added unstable support for the View Transition API (#10916) Stabilized the @remix-run/testing createRemixStub helper (#7647) Patch Changes Emulate types for JSON.parse(JSON.stringify(x)) in SerializeFrom (#7605) Notably, type fields that are only assignable to undefined after serialization are now omitted since JSON.stringify |\u003e JSON.parse will omit them. See test cases for examples This fixes type errors when upgrading to v2 from 1.19 Avoid mutating meta object when tagName is specified (#7594) Fix FOUC on subsequent client-side navigations to route.lazy routes (#7576) Export the proper Remix useMatches wrapper to fix UIMatch typings (#7551) @remix-run/cloudflare - sourcemap takes into account special chars in output file (#7574) @remix-run/express - Flush headers for text/event-stream responses (#7619) Updated Dependencies react-router-dom@6.17.0 @remix-run/router@1.10.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing Full Changelog: v2.0.1...v2.1.0 v2.0.1 Date: 2023-09-21 Patch Changes Fix types for MDX files when using pnpm (#7491) Update getDependenciesToBundle to handle ESM packages without main exports (#7272) Note that these packages must expose package.json in their exports field so that their path can be resolved Fix server builds where serverBuildPath extension is .cjs (#7180) Fix HMR for CJS projects using remix-serve and manual mode (remix dev --manual) (#7487) By explicitly busting the require cache, remix-serve now correctly re-imports new server changes in CJS ESM projects were already working correctly and are not affected by this. Fix error caused by partially written server build (#7470) Previously, it was possible to trigger a reimport of the app server code before the new server build had completely been written. Reimporting the partially written server build caused issues related to build.assets being undefined and crashing when reading build.assets.version Add second generic to UIMatch for handle field (#7464) Fix resource routes being loaded through route.lazy (#7498) Throw a semantically correct 405 ErrorResponse instead of just an Error when submitting to a route without an action (#7423) Update to latest version of @remix-run/web-fetch (#7477) Switch from crypto.randomBytes to crypto.webcrypto.getRandomValues for file session storage ID generation (#7203) Use native Blob class instead of polyfill (#7217) Changes by Package 🔗 @remix-run/dev @remix-run/node @remix-run/react @remix-run/serve Full Changelog: v2.0.0...v2.0.1 v2.0.0 Date: 2023-09-15 We're so excited to release Remix v2 to you and we really hope this upgrade is one of the smoothest framework upgrades you've ever experienced! That was our primary goal with v2 - something we aimed to achieve through a heavy use of deprecation warnings and Future Flags in Remix v1. If you are on the latest 1.x version and you've enabled all future flags and addressed all console warnings, then our hope is that you are 90% of the way to being upgraded for v2. There are always going to be a few things that we can't put behind a flag (like breaking type changes) or come up at the very last moment and don't have time to add as a warning or flag in 1.x. If you're not yet on the latest 1.x version we'd recommend first upgrading to that and resolving any flag/console warnings: \u003e npx upgrade-remix 1.19.3 Breaking Changes Below is a very concise list of the breaking changes in v2. For the most thorough discussion of breaking changes, please read the Upgrading to v2 guide. This document provides a comprehensive walkthrough of the breaking changes that come along with v2 - and instructions on how to adapt your application to handle them For additional details, you can refer to the Changes by Package section below Upgraded Dependency Requirements Remix v2 has upgraded it's minimum version support for React and Node and now officially requires: React 18 (#7121) For information on upgrading to React 18, please see the React upgrade guide Node 18 or later (#6939, #7292) For information on upgrading to Node 18, please see the Node v18 announcement Please refer to the Remix documentation for an overview of when we drop support for Node versions Removed Future Flags The following future flags were removed and their behavior is now the default - you can remove all of these from your remix.config.js file. v2_dev - New dev server with HMR+HDR (#7002) If you had configurations in future.v2_dev instead of just the boolean value (i.e., future.v2_dev.port), you can lift them into a root dev object in your remix.config.js v2_errorBoundary - Removed CatchBoundary in favor of a singular ErrorBoundary (#6906) v2_headers - Altered the logic for headers in nested route scenarios (#6979) v2_meta - Altered the return format of meta() (#6958) v2_normalizeFormMethod - Normalize formMethod APIs to uppercase (#6875) v2_routeConvention - Routes use a flat route convention by default now (#6969) Breaking Changes/API Removals With deprecation warnings The following lists other breaking changes/API removals which had deprecation warnings in Remix v1. If you're on the latest 1.19.3 release without any console warnings, then you're probably good to go on all of these! remix.config.js Renamed browserBuildDirectory to assetsBuildDirectory (#6900) Removed devServerBroadcastDelay (#7063) Renamed devServerPort to dev.port (000457e0) Note that if you are opting into this in a 1.x release, your config flag will be future.v2_dev.port, but on a stable 2.x release it will be dev.port Changed the default serverModuleFormat from cjs to esm (#6949) Removed serverBuildTarget (#6896) Changed serverBuildDirectory to serverBuildPath (#6897) Node built-ins are no longer polyfilled on the server by default, you must opt-into polyfills via serverNodeBuiltinsPolyfill (#6911 @remix-run/react Removed useTransition (#6870) Removed fetcher.type and flattened fetcher.submission (#6874) \u003cfetcher.Form method=\"get\"\u003e is now more accurately categorized as state:\"loading\" instead of state:\"submitting\" to better align with the underlying GET request Require camelCased versions of imagesrcset/imagesizes (#6936) Without deprecation warnings Unfortunately, we didn't manage to get a deprecation warning on every breaking change or API removal 🙃. Here's a list of remaining changes that you may need to look into to upgrade to v2: remix.config.js Node built-ins are no longer polyfilled in the browser by default, you must opt-into polyfills via browserNodeBuiltinsPolyfill (#7269) PostCSS/Tailwind will be enabled by default if config files exist in your app, you may disable this via the postcss and tailwind flags (#6909) @remix-run/cloudflare Remove createCloudflareKVSessionStorage (#6898) Drop @cloudflare/workers-types v2 \u0026 v3 support (#6925) @remix-run/dev Removed REMIX_DEV_HTTP_ORIGIN in favor of REMIX_DEV_ORIGIN (#6963) Removed REMIX_DEV_SERVER_WS_PORT in favor of dev.port or --port (#6965) Removed --no-restart/restart flag in favor of --manual/manual (#6962) Removed --scheme/scheme and --host/host in favor of REMIX_DEV_ORIGIN instead (#6962) Removed the codemod command (#6918) @remix-run/eslint-config Remove @remix-run/eslint-config/jest config (#6903) Remove magic imports ESLint warnings (#6902) @remix-run/netlify The @remix-run/netlify adapter has been removed in favor of the Netlify official adapters (#7058) @remix-run/node fetch is no longer polyfilled by default - apps must call installGlobals() to install the polyfills (#7009) fetch and related APIs are no longer exported from @remix-run/node - apps should use the versions in the global namespace (#7293) Apps must call sourceMapSupport.install() to setup source map support @remix-run/react Remove unstable_shouldReload in favor of shouldRevalidate (#6865) @remix-run/serve remix-serve picks an open port if 3000 is taken and PORT is not specified (#7278) Integrate manual mode (#7231) Remove undocumented createApp Node API (#7229) Preserve dynamic imports in remix-serve for external bundle (#7173) @remix-run/vercel The @remix-run/vercel adapter has been removed in favor of out of the box functionality provided by Vercel (#7035) create-remix Stop passing isTypeScript to remix.init script (#7099) remix Removed magic exports (#6895) Breaking Type Changes Removed V2_ prefixes from future.v2_meta types as they are now the default behavior (#6958) V2_MetaArgs -\u003e MetaArgs V2_MetaDescriptor -\u003e MetaDescriptor V2_MetaFunction -\u003e MetaFunction V2_MetaMatch -\u003e MetaMatch V2_MetaMatches -\u003e MetaMatches V2_ServerRuntimeMetaArgs -\u003e ServerRuntimeMetaArgs V2_ServerRuntimeMetaDescriptor -\u003e ServerRuntimeMetaDescriptor V2_ServerRuntimeMetaFunction -\u003e ServerRuntimeMetaFunction V2_ServerRuntimeMetaMatch -\u003e ServerRuntimeMetaMatch V2_ServerRuntimeMetaMatches -\u003e ServerRuntimeMetaMatches The following types were adjusted to prefer unknown over any and to align with underlying React Router types (#7319): Renamed the useMatches() return type from RouteMatch to UIMatch Renamed LoaderArgs/ActionArgs to LoaderFunctionArgs/ActionFunctionArgs AppData changed from any to unknown Location[\"state\"] (useLocation.state) changed from any to unknown UIMatch[\"data\"] (useMatches()[i].data) changed from any to unknown UIMatch[\"handle\"] (useMatches()[i].handle) changed from { [k: string]: any } to unknown Fetcher[\"data\"] (useFetcher().data) changed from any to unknown MetaMatch.handle (used in meta()) changed from any to unknown AppData/RouteHandle are no longer exported as they are just aliases for unknown New Features New create-remix CLI (#6887) Most notably, this removes the dropdown to choose your template/stack in favor of the --template flag and our ever-growing list of available templates Adds a new --overwrite flag (#7062) Supports the bun package manager (#7074) Detect built mode via build.mode (#6964) Support polyfilling node globals via serverNodeBuiltinsPolyfill.globals/browserNodeBuiltinsPolyfill.globals (#7269) New redirectDocument utility to redirect via a fresh document load (#7040, #6842) Add error to meta params so you can render error titles, etc. (#7105) unstable_createRemixStub now supports adding meta/links functions on stubbed Remix routes (#7186) unstable_createRemixStub no longer supports the element/errorElement properties on routes. You must use Component/ErrorBoundary to match what you would export from a Remix route module. Other Notable Changes Remix now uses React Router's route.lazy method internally to load route modules on navigations (#7133) Removed the @remix-run/node atob/btoa polyfills in favor of the built-in versions (#7206) Decouple the @remix-run/dev package from the contents of the @remix-run/css-bundle package (#6982) The contents of the @remix-run/css-bundle package are now entirely managed by the Remix compiler. Even though it's still recommended that your Remix dependencies all share the same version, this change ensures that there are no runtime errors when upgrading @remix-run/dev without upgrading @remix-run/css-bundle. remix-serve now picks an open port if 3000 is taken (#7278) If PORT env var is set, remix-serve will use that port Otherwise, remix-serve picks an open port (3000 unless that is already taken) Updated Dependencies react-router-dom@6.16.0 @remix-run/router@1.9.0 @remix-run/web-fetch@4.4.0 @remix-run/web-file@3.1.0 @remix-run/web-stream@1.1.0 Changes by Package create-remix @remix-run/architect @remix-run/cloudflare @remix-run/cloudflare-pages @remix-run/cloudflare-workers @remix-run/css-bundle @remix-run/deno @remix-run/dev @remix-run/eslint-config @remix-run/express @remix-run/node @remix-run/react @remix-run/serve @remix-run/server-runtime @remix-run/testing © Shopify, Inc.•Docs and examples licensed under MITEdit((storageKey2, restoreKey) =\u003e { if (!window.history.state || !window.history.state.key) { let key = Math.random().toString(32).slice(2); window.history.replaceState({ key }, \"\"); } try { let positions = JSON.parse(sessionStorage.getItem(storageKey2) || \"{}\"); let storedY = positions[restoreKey || window.history.state.key]; if (typeof storedY === \"number\") { window.scrollTo(0, storedY); } } catch (error) { console.error(error); sessionStorage.removeItem(storageKey2); } })(\"react-router-scroll-positions\", null)window.__reactRouterContext = {\"basename\":\"/\",\"future\":{\"unstable_optimizeDeps\":true,\"unstable_subResourceIntegrity\":false,\"v8_middleware\":true,\"v8_splitRouteModules\":true,\"v8_viteEnvironmentApi\":true},\"routeDiscovery\":{\"mode\":\"initial\"},\"ssr\":true,\"isSpaMode\":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());import \"/assets/manifest-b010e014.js\"; import * as route0 from \"/assets/root-CtUYAfRS.js\"; import * as route1 from \"/assets/docs-DauuYQK6.js\"; import * as route2 from \"/assets/docs._-B4dRXAHv.js\"; window.__reactRouterRouteModules = {\"root\":route0,\"routes/docs\":route1,\"routes/docs.$\":route2}; import(\"/assets/entry.client-q2ogymM2.js\");window.__reactRouterContext.streamController.enqueue(\"[{\\\"_1\\\":2,\\\"_1371\\\":-5,\\\"_1372\\\":-5},\\\"loaderData\\\",{\\\"_3\\\":4,\\\"_11\\\":12,\\\"_949\\\":950},\\\"root\\\",{\\\"_5\\\":6,\\\"_7\\\":8,\\\"_9\\\":10},\\\"host\\\",\\\"localhost\\\",\\\"siteUrl\\\",\\\"https://v2.remix.run\\\",\\\"noIndex\\\",false,\\\"routes/docs\\\",{\\\"_13\\\":14},\\\"menu\\\",[15,72,160,214,292,364,527,611,665,707],{\\\"_16\\\":17,\\\"_22\\\":23,\\\"_24\\\":25,\\\"_26\\\":10,\\\"_27\\\":28},\\\"attrs\\\",{\\\"_18\\\":19,\\\"_20\\\":21},\\\"title\\\",\\\"Getting Started\\\",\\\"order\\\",1,\\\"filename\\\",\\\"start/index.md\\\",\\\"slug\\\",\\\"start\\\",\\\"hasContent\\\",\\\"children\\\",[29,36,43,50,59,66],{\\\"_16\\\":30,\\\"_22\\\":32,\\\"_24\\\":33,\\\"_26\\\":34,\\\"_27\\\":35},{\\\"_18\\\":31,\\\"_20\\\":21},\\\"Quick Start (5m)\\\",\\\"start/quickstart.md\\\",\\\"start/quickstart\\\",true,[],{\\\"_16\\\":37,\\\"_22\\\":40,\\\"_24\\\":41,\\\"_26\\\":34,\\\"_27\\\":42},{\\\"_18\\\":38,\\\"_20\\\":39},\\\"Tutorial (30m)\\\",2,\\\"start/tutorial.md\\\",\\\"start/tutorial\\\",[],{\\\"_16\\\":44,\\\"_22\\\":47,\\\"_24\\\":48,\\\"_26\\\":34,\\\"_27\\\":49},{\\\"_18\\\":45,\\\"_20\\\":46},\\\"Upgrading to v2\\\",3,\\\"start/v2.md\\\",\\\"start/v2\\\",[],{\\\"_16\\\":51,\\\"_22\\\":56,\\\"_24\\\":57,\\\"_26\\\":34,\\\"_27\\\":58},{\\\"_18\\\":52,\\\"_53\\\":54,\\\"_20\\\":55},\\\"Community\\\",\\\"description\\\",\\\"Community resources for learning Remix and related technologies\\\",4,\\\"start/community.md\\\",\\\"start/community\\\",[],{\\\"_16\\\":60,\\\"_22\\\":63,\\\"_24\\\":64,\\\"_26\\\":34,\\\"_27\\\":65},{\\\"_18\\\":61,\\\"_20\\\":62},\\\"Future Flags\\\",5,\\\"start/future-flags.md\\\",\\\"start/future-flags\\\",[],{\\\"_16\\\":67,\\\"_22\\\":69,\\\"_24\\\":70,\\\"_26\\\":34,\\\"_27\\\":71},{\\\"_18\\\":68},\\\"Changelog\\\",\\\"start/changelog.md\\\",\\\"start/changelog\\\",[],{\\\"_16\\\":73,\\\"_22\\\":75,\\\"_24\\\":76,\\\"_26\\\":10,\\\"_27\\\":77},{\\\"_18\\\":74,\\\"_20\\\":39},\\\"Discussion Topics\\\",\\\"discussion/index.md\\\",\\\"discussion\\\",[78,84,90,96,102,108,115,122,129,136,142,148,154],{\\\"_16\\\":79,\\\"_22\\\":81,\\\"_24\\\":82,\\\"_26\\\":34,\\\"_27\\\":83},{\\\"_18\\\":80,\\\"_20\\\":21},\\\"Introduction, Technical Explanation\\\",\\\"discussion/introduction.md\\\",\\\"discussion/introduction\\\",[],{\\\"_16\\\":85,\\\"_22\\\":87,\\\"_24\\\":88,\\\"_26\\\":34,\\\"_27\\\":89},{\\\"_18\\\":86,\\\"_20\\\":39},\\\"Runtimes, Adapters, Templates, and Deployment\\\",\\\"discussion/runtimes.md\\\",\\\"discussion/runtimes\\\",[],{\\\"_16\\\":91,\\\"_22\\\":93,\\\"_24\\\":94,\\\"_26\\\":34,\\\"_27\\\":95},{\\\"_18\\\":92,\\\"_20\\\":46},\\\"Route Configuration\\\",\\\"discussion/routes.md\\\",\\\"discussion/routes\\\",[],{\\\"_16\\\":97,\\\"_22\\\":99,\\\"_24\\\":100,\\\"_26\\\":34,\\\"_27\\\":101},{\\\"_18\\\":98,\\\"_20\\\":55},\\\"Fullstack Data Flow\\\",\\\"discussion/data-flow.md\\\",\\\"discussion/data-flow\\\",[],{\\\"_16\\\":103,\\\"_22\\\":105,\\\"_24\\\":106,\\\"_26\\\":34,\\\"_27\\\":107},{\\\"_18\\\":104,\\\"_20\\\":62},\\\"Server vs. Client Code Execution\\\",\\\"discussion/server-vs-client.md\\\",\\\"discussion/server-vs-client\\\",[],{\\\"_16\\\":109,\\\"_22\\\":112,\\\"_24\\\":113,\\\"_26\\\":34,\\\"_27\\\":114},{\\\"_18\\\":110,\\\"_20\\\":111},\\\"React Router\\\",6,\\\"discussion/react-router.md\\\",\\\"discussion/react-router\\\",[],{\\\"_16\\\":116,\\\"_22\\\":119,\\\"_24\\\":120,\\\"_26\\\":34,\\\"_27\\\":121},{\\\"_18\\\":117,\\\"_20\\\":118},\\\"Progressive Enhancement\\\",7,\\\"discussion/progressive-enhancement.md\\\",\\\"discussion/progressive-enhancement\\\",[],{\\\"_16\\\":123,\\\"_22\\\":126,\\\"_24\\\":127,\\\"_26\\\":34,\\\"_27\\\":128},{\\\"_18\\\":124,\\\"_20\\\":125},\\\"Pending UI\\\",8,\\\"discussion/pending-ui.md\\\",\\\"discussion/pending-ui\\\",[],{\\\"_16\\\":130,\\\"_22\\\":133,\\\"_24\\\":134,\\\"_26\\\":34,\\\"_27\\\":135},{\\\"_18\\\":131,\\\"_20\\\":132},\\\"State Management\\\",9,\\\"discussion/state-management.md\\\",\\\"discussion/state-management\\\",[],{\\\"_16\\\":137,\\\"_22\\\":139,\\\"_24\\\":140,\\\"_26\\\":34,\\\"_27\\\":141},{\\\"_18\\\":138},\\\"Network Concurrency Management\\\",\\\"discussion/concurrency.md\\\",\\\"discussion/concurrency\\\",[],{\\\"_16\\\":143,\\\"_22\\\":145,\\\"_24\\\":146,\\\"_26\\\":34,\\\"_27\\\":147},{\\\"_18\\\":144},\\\"Form vs. fetcher\\\",\\\"discussion/form-vs-fetcher.md\\\",\\\"discussion/form-vs-fetcher\\\",[],{\\\"_16\\\":149,\\\"_22\\\":151,\\\"_24\\\":152,\\\"_26\\\":34,\\\"_27\\\":153},{\\\"_18\\\":150},\\\"Hot Module Replacement\\\",\\\"discussion/hot-module-replacement.md\\\",\\\"discussion/hot-module-replacement\\\",[],{\\\"_16\\\":155,\\\"_22\\\":157,\\\"_24\\\":158,\\\"_26\\\":34,\\\"_27\\\":159},{\\\"_18\\\":156},\\\"Form Resubmissions\\\",\\\"discussion/resubmissions.md\\\",\\\"discussion/resubmissions\\\",[],{\\\"_16\\\":161,\\\"_22\\\":163,\\\"_24\\\":164,\\\"_26\\\":10,\\\"_27\\\":165},{\\\"_18\\\":162,\\\"_20\\\":46},\\\"File Conventions\\\",\\\"file-conventions/index.md\\\",\\\"file-conventions\\\",[166,173,179,185,191,197,202,208],{\\\"_16\\\":167,\\\"_22\\\":170,\\\"_24\\\":171,\\\"_26\\\":34,\\\"_27\\\":172},{\\\"_18\\\":168,\\\"_169\\\":10},\\\".client modules\\\",\\\"toc\\\",\\\"file-conventions/-client.md\\\",\\\"file-conventions/-client\\\",[],{\\\"_16\\\":174,\\\"_22\\\":176,\\\"_24\\\":177,\\\"_26\\\":34,\\\"_27\\\":178},{\\\"_18\\\":175,\\\"_169\\\":10},\\\".server modules\\\",\\\"file-conventions/-server.md\\\",\\\"file-conventions/-server\\\",[],{\\\"_16\\\":180,\\\"_22\\\":182,\\\"_24\\\":183,\\\"_26\\\":34,\\\"_27\\\":184},{\\\"_18\\\":181,\\\"_169\\\":10},\\\"Asset Imports\\\",\\\"file-conventions/asset-imports.md\\\",\\\"file-conventions/asset-imports\\\",[],{\\\"_16\\\":186,\\\"_22\\\":188,\\\"_24\\\":189,\\\"_26\\\":34,\\\"_27\\\":190},{\\\"_18\\\":187,\\\"_169\\\":10},\\\"entry.client\\\",\\\"file-conventions/entry.client.md\\\",\\\"file-conventions/entry.client\\\",[],{\\\"_16\\\":192,\\\"_22\\\":194,\\\"_24\\\":195,\\\"_26\\\":34,\\\"_27\\\":196},{\\\"_18\\\":193,\\\"_169\\\":10},\\\"entry.server\\\",\\\"file-conventions/entry.server.md\\\",\\\"file-conventions/entry.server\\\",[],{\\\"_16\\\":198,\\\"_22\\\":199,\\\"_24\\\":200,\\\"_26\\\":34,\\\"_27\\\":201},{\\\"_18\\\":3,\\\"_169\\\":10},\\\"file-conventions/root.md\\\",\\\"file-conventions/root\\\",[],{\\\"_16\\\":203,\\\"_22\\\":205,\\\"_24\\\":206,\\\"_26\\\":34,\\\"_27\\\":207},{\\\"_18\\\":204},\\\"Route File Naming\\\",\\\"file-conventions/routes.md\\\",\\\"file-conventions/routes\\\",[],{\\\"_16\\\":209,\\\"_22\\\":211,\\\"_24\\\":212,\\\"_26\\\":34,\\\"_27\\\":213},{\\\"_18\\\":210},\\\"vite.config.ts\\\",\\\"file-conventions/vite-config.md\\\",\\\"file-conventions/vite-config\\\",[],{\\\"_16\\\":215,\\\"_22\\\":217,\\\"_24\\\":218,\\\"_26\\\":10,\\\"_27\\\":219},{\\\"_18\\\":216,\\\"_20\\\":55},\\\"Route Module\\\",\\\"route/index.md\\\",\\\"route\\\",[220,226,232,238,244,250,256,262,268,274,280,286],{\\\"_16\\\":221,\\\"_22\\\":223,\\\"_24\\\":224,\\\"_26\\\":34,\\\"_27\\\":225},{\\\"_18\\\":222},\\\"action\\\",\\\"route/action.md\\\",\\\"route/action\\\",[],{\\\"_16\\\":227,\\\"_22\\\":229,\\\"_24\\\":230,\\\"_26\\\":34,\\\"_27\\\":231},{\\\"_18\\\":228},\\\"clientAction\\\",\\\"route/client-action.md\\\",\\\"route/client-action\\\",[],{\\\"_16\\\":233,\\\"_22\\\":235,\\\"_24\\\":236,\\\"_26\\\":34,\\\"_27\\\":237},{\\\"_18\\\":234},\\\"clientLoader\\\",\\\"route/client-loader.md\\\",\\\"route/client-loader\\\",[],{\\\"_16\\\":239,\\\"_22\\\":241,\\\"_24\\\":242,\\\"_26\\\":34,\\\"_27\\\":243},{\\\"_18\\\":240},\\\"Component\\\",\\\"route/component.md\\\",\\\"route/component\\\",[],{\\\"_16\\\":245,\\\"_22\\\":247,\\\"_24\\\":248,\\\"_26\\\":34,\\\"_27\\\":249},{\\\"_18\\\":246},\\\"ErrorBoundary\\\",\\\"route/error-boundary.md\\\",\\\"route/error-boundary\\\",[],{\\\"_16\\\":251,\\\"_22\\\":253,\\\"_24\\\":254,\\\"_26\\\":34,\\\"_27\\\":255},{\\\"_18\\\":252},\\\"handle\\\",\\\"route/handle.md\\\",\\\"route/handle\\\",[],{\\\"_16\\\":257,\\\"_22\\\":259,\\\"_24\\\":260,\\\"_26\\\":34,\\\"_27\\\":261},{\\\"_18\\\":258},\\\"headers\\\",\\\"route/headers.md\\\",\\\"route/headers\\\",[],{\\\"_16\\\":263,\\\"_22\\\":265,\\\"_24\\\":266,\\\"_26\\\":34,\\\"_27\\\":267},{\\\"_18\\\":264},\\\"HydrateFallback\\\",\\\"route/hydrate-fallback.md\\\",\\\"route/hydrate-fallback\\\",[],{\\\"_16\\\":269,\\\"_22\\\":271,\\\"_24\\\":272,\\\"_26\\\":34,\\\"_27\\\":273},{\\\"_18\\\":270},\\\"links\\\",\\\"route/links.md\\\",\\\"route/links\\\",[],{\\\"_16\\\":275,\\\"_22\\\":277,\\\"_24\\\":278,\\\"_26\\\":34,\\\"_27\\\":279},{\\\"_18\\\":276},\\\"loader\\\",\\\"route/loader.md\\\",\\\"route/loader\\\",[],{\\\"_16\\\":281,\\\"_22\\\":283,\\\"_24\\\":284,\\\"_26\\\":34,\\\"_27\\\":285},{\\\"_18\\\":282},\\\"meta\\\",\\\"route/meta.md\\\",\\\"route/meta\\\",[],{\\\"_16\\\":287,\\\"_22\\\":289,\\\"_24\\\":290,\\\"_26\\\":34,\\\"_27\\\":291},{\\\"_18\\\":288},\\\"shouldRevalidate\\\",\\\"route/should-revalidate.md\\\",\\\"route/should-revalidate\\\",[],{\\\"_16\\\":293,\\\"_22\\\":295,\\\"_24\\\":296,\\\"_26\\\":10,\\\"_27\\\":297},{\\\"_18\\\":294,\\\"_20\\\":62},\\\"Components\\\",\\\"components/index.md\\\",\\\"components\\\",[298,304,310,316,322,328,334,340,346,352,358],{\\\"_16\\\":299,\\\"_22\\\":301,\\\"_24\\\":302,\\\"_26\\\":34,\\\"_27\\\":303},{\\\"_18\\\":300},\\\"Await\\\",\\\"components/await.md\\\",\\\"components/await\\\",[],{\\\"_16\\\":305,\\\"_22\\\":307,\\\"_24\\\":308,\\\"_26\\\":34,\\\"_27\\\":309},{\\\"_18\\\":306},\\\"Form\\\",\\\"components/form.md\\\",\\\"components/form\\\",[],{\\\"_16\\\":311,\\\"_22\\\":313,\\\"_24\\\":314,\\\"_26\\\":34,\\\"_27\\\":315},{\\\"_18\\\":312},\\\"Link\\\",\\\"components/link.md\\\",\\\"components/link\\\",[],{\\\"_16\\\":317,\\\"_22\\\":319,\\\"_24\\\":320,\\\"_26\\\":34,\\\"_27\\\":321},{\\\"_18\\\":318,\\\"_169\\\":10},\\\"Links\\\",\\\"components/links.md\\\",\\\"components/links\\\",[],{\\\"_16\\\":323,\\\"_22\\\":325,\\\"_24\\\":326,\\\"_26\\\":34,\\\"_27\\\":327},{\\\"_18\\\":324,\\\"_169\\\":10},\\\"LiveReload\\\",\\\"components/live-reload.md\\\",\\\"components/live-reload\\\",[],{\\\"_16\\\":329,\\\"_22\\\":331,\\\"_24\\\":332,\\\"_26\\\":34,\\\"_27\\\":333},{\\\"_18\\\":330,\\\"_169\\\":10},\\\"Meta\\\",\\\"components/meta.md\\\",\\\"components/meta\\\",[],{\\\"_16\\\":335,\\\"_22\\\":337,\\\"_24\\\":338,\\\"_26\\\":34,\\\"_27\\\":339},{\\\"_18\\\":336},\\\"NavLink\\\",\\\"components/nav-link.md\\\",\\\"components/nav-link\\\",[],{\\\"_16\\\":341,\\\"_22\\\":343,\\\"_24\\\":344,\\\"_26\\\":34,\\\"_27\\\":345},{\\\"_18\\\":342},\\\"Outlet\\\",\\\"components/outlet.md\\\",\\\"components/outlet\\\",[],{\\\"_16\\\":347,\\\"_22\\\":349,\\\"_24\\\":350,\\\"_26\\\":34,\\\"_27\\\":351},{\\\"_18\\\":348,\\\"_169\\\":10},\\\"PrefetchPageLinks\\\",\\\"components/prefetch-page-links.md\\\",\\\"components/prefetch-page-links\\\",[],{\\\"_16\\\":353,\\\"_22\\\":355,\\\"_24\\\":356,\\\"_26\\\":34,\\\"_27\\\":357},{\\\"_18\\\":354,\\\"_169\\\":10},\\\"Scripts\\\",\\\"components/scripts.md\\\",\\\"components/scripts\\\",[],{\\\"_16\\\":359,\\\"_22\\\":361,\\\"_24\\\":362,\\\"_26\\\":34,\\\"_27\\\":363},{\\\"_18\\\":360},\\\"ScrollRestoration\\\",\\\"components/scroll-restoration.md\\\",\\\"components/scroll-restoration\\\",[],{\\\"_16\\\":365,\\\"_22\\\":367,\\\"_24\\\":368,\\\"_26\\\":10,\\\"_27\\\":369},{\\\"_18\\\":366,\\\"_20\\\":111},\\\"Hooks\\\",\\\"hooks/index.md\\\",\\\"hooks\\\",[370,376,383,389,395,401,407,413,419,425,431,437,443,449,455,461,467,473,479,485,491,497,503,509,515,521],{\\\"_16\\\":371,\\\"_22\\\":373,\\\"_24\\\":374,\\\"_26\\\":34,\\\"_27\\\":375},{\\\"_18\\\":372,\\\"_169\\\":10},\\\"useActionData\\\",\\\"hooks/use-action-data.md\\\",\\\"hooks/use-action-data\\\",[],{\\\"_16\\\":377,\\\"_22\\\":380,\\\"_24\\\":381,\\\"_26\\\":34,\\\"_27\\\":382},{\\\"_18\\\":378,\\\"_379\\\":34},\\\"useAsyncError\\\",\\\"new\\\",\\\"hooks/use-async-error.md\\\",\\\"hooks/use-async-error\\\",[],{\\\"_16\\\":384,\\\"_22\\\":386,\\\"_24\\\":387,\\\"_26\\\":34,\\\"_27\\\":388},{\\\"_18\\\":385,\\\"_379\\\":34},\\\"useAsyncValue\\\",\\\"hooks/use-async-value.md\\\",\\\"hooks/use-async-value\\\",[],{\\\"_16\\\":390,\\\"_22\\\":392,\\\"_24\\\":393,\\\"_26\\\":34,\\\"_27\\\":394},{\\\"_18\\\":391,\\\"_169\\\":10},\\\"useBeforeUnload\\\",\\\"hooks/use-before-unload.md\\\",\\\"hooks/use-before-unload\\\",[],{\\\"_16\\\":396,\\\"_22\\\":398,\\\"_24\\\":399,\\\"_26\\\":34,\\\"_27\\\":400},{\\\"_18\\\":397},\\\"useBlocker\\\",\\\"hooks/use-blocker.md\\\",\\\"hooks/use-blocker\\\",[],{\\\"_16\\\":402,\\\"_22\\\":404,\\\"_24\\\":405,\\\"_26\\\":34,\\\"_27\\\":406},{\\\"_18\\\":403},\\\"useFetcher\\\",\\\"hooks/use-fetcher.md\\\",\\\"hooks/use-fetcher\\\",[],{\\\"_16\\\":408,\\\"_22\\\":410,\\\"_24\\\":411,\\\"_26\\\":34,\\\"_27\\\":412},{\\\"_18\\\":409,\\\"_169\\\":10},\\\"useFetchers\\\",\\\"hooks/use-fetchers.md\\\",\\\"hooks/use-fetchers\\\",[],{\\\"_16\\\":414,\\\"_22\\\":416,\\\"_24\\\":417,\\\"_26\\\":34,\\\"_27\\\":418},{\\\"_18\\\":415},\\\"useFormAction\\\",\\\"hooks/use-form-action.md\\\",\\\"hooks/use-form-action\\\",[],{\\\"_16\\\":420,\\\"_22\\\":422,\\\"_24\\\":423,\\\"_26\\\":34,\\\"_27\\\":424},{\\\"_18\\\":421},\\\"useHref\\\",\\\"hooks/use-href.md\\\",\\\"hooks/use-href\\\",[],{\\\"_16\\\":426,\\\"_22\\\":428,\\\"_24\\\":429,\\\"_26\\\":34,\\\"_27\\\":430},{\\\"_18\\\":427},\\\"useLoaderData\\\",\\\"hooks/use-loader-data.md\\\",\\\"hooks/use-loader-data\\\",[],{\\\"_16\\\":432,\\\"_22\\\":434,\\\"_24\\\":435,\\\"_26\\\":34,\\\"_27\\\":436},{\\\"_18\\\":433},\\\"useLocation\\\",\\\"hooks/use-location.md\\\",\\\"hooks/use-location\\\",[],{\\\"_16\\\":438,\\\"_22\\\":440,\\\"_24\\\":441,\\\"_26\\\":34,\\\"_27\\\":442},{\\\"_18\\\":439,\\\"_169\\\":10},\\\"useMatches\\\",\\\"hooks/use-matches.md\\\",\\\"hooks/use-matches\\\",[],{\\\"_16\\\":444,\\\"_22\\\":446,\\\"_24\\\":447,\\\"_26\\\":34,\\\"_27\\\":448},{\\\"_18\\\":445},\\\"useNavigate\\\",\\\"hooks/use-navigate.md\\\",\\\"hooks/use-navigate\\\",[],{\\\"_16\\\":450,\\\"_22\\\":452,\\\"_24\\\":453,\\\"_26\\\":34,\\\"_27\\\":454},{\\\"_18\\\":451},\\\"useNavigation\\\",\\\"hooks/use-navigation.md\\\",\\\"hooks/use-navigation\\\",[],{\\\"_16\\\":456,\\\"_22\\\":458,\\\"_24\\\":459,\\\"_26\\\":34,\\\"_27\\\":460},{\\\"_18\\\":457},\\\"useNavigationType\\\",\\\"hooks/use-navigation-type.md\\\",\\\"hooks/use-navigation-type\\\",[],{\\\"_16\\\":462,\\\"_22\\\":464,\\\"_24\\\":465,\\\"_26\\\":34,\\\"_27\\\":466},{\\\"_18\\\":463},\\\"useOutlet\\\",\\\"hooks/use-outlet.md\\\",\\\"hooks/use-outlet\\\",[],{\\\"_16\\\":468,\\\"_22\\\":470,\\\"_24\\\":471,\\\"_26\\\":34,\\\"_27\\\":472},{\\\"_18\\\":469},\\\"useOutletContext\\\",\\\"hooks/use-outlet-context.md\\\",\\\"hooks/use-outlet-context\\\",[],{\\\"_16\\\":474,\\\"_22\\\":476,\\\"_24\\\":477,\\\"_26\\\":34,\\\"_27\\\":478},{\\\"_18\\\":475},\\\"useParams\\\",\\\"hooks/use-params.md\\\",\\\"hooks/use-params\\\",[],{\\\"_16\\\":480,\\\"_22\\\":482,\\\"_24\\\":483,\\\"_26\\\":34,\\\"_27\\\":484},{\\\"_18\\\":481},\\\"unstable_usePrompt\\\",\\\"hooks/use-prompt.md\\\",\\\"hooks/use-prompt\\\",[],{\\\"_16\\\":486,\\\"_22\\\":488,\\\"_24\\\":489,\\\"_26\\\":34,\\\"_27\\\":490},{\\\"_18\\\":487},\\\"useResolvedPath\\\",\\\"hooks/use-resolved-path.md\\\",\\\"hooks/use-resolved-path\\\",[],{\\\"_16\\\":492,\\\"_22\\\":494,\\\"_24\\\":495,\\\"_26\\\":34,\\\"_27\\\":496},{\\\"_18\\\":493,\\\"_379\\\":34},\\\"useRevalidator\\\",\\\"hooks/use-revalidator.md\\\",\\\"hooks/use-revalidator\\\",[],{\\\"_16\\\":498,\\\"_22\\\":500,\\\"_24\\\":501,\\\"_26\\\":34,\\\"_27\\\":502},{\\\"_18\\\":499,\\\"_379\\\":34},\\\"useRouteError\\\",\\\"hooks/use-route-error.md\\\",\\\"hooks/use-route-error\\\",[],{\\\"_16\\\":504,\\\"_22\\\":506,\\\"_24\\\":507,\\\"_26\\\":34,\\\"_27\\\":508},{\\\"_18\\\":505,\\\"_169\\\":10},\\\"useRouteLoaderData\\\",\\\"hooks/use-route-loader-data.md\\\",\\\"hooks/use-route-loader-data\\\",[],{\\\"_16\\\":510,\\\"_22\\\":512,\\\"_24\\\":513,\\\"_26\\\":34,\\\"_27\\\":514},{\\\"_18\\\":511},\\\"useSearchParams\\\",\\\"hooks/use-search-params.md\\\",\\\"hooks/use-search-params\\\",[],{\\\"_16\\\":516,\\\"_22\\\":518,\\\"_24\\\":519,\\\"_26\\\":34,\\\"_27\\\":520},{\\\"_18\\\":517},\\\"useSubmit\\\",\\\"hooks/use-submit.md\\\",\\\"hooks/use-submit\\\",[],{\\\"_16\\\":522,\\\"_22\\\":524,\\\"_24\\\":525,\\\"_26\\\":34,\\\"_27\\\":526},{\\\"_18\\\":523,\\\"_169\\\":10},\\\"useViewTransitionState\\\",\\\"hooks/use-view-transition-state.md\\\",\\\"hooks/use-view-transition-state\\\",[],{\\\"_16\\\":528,\\\"_22\\\":530,\\\"_24\\\":531,\\\"_26\\\":10,\\\"_27\\\":532},{\\\"_18\\\":529,\\\"_20\\\":111},\\\"Utilities\\\",\\\"utils/index.md\\\",\\\"utils\\\",[533,539,545,551,557,563,569,575,581,587,593,599,605],{\\\"_16\\\":534,\\\"_22\\\":536,\\\"_24\\\":537,\\\"_26\\\":34,\\\"_27\\\":538},{\\\"_18\\\":535},\\\"Cookies\\\",\\\"utils/cookies.md\\\",\\\"utils/cookies\\\",[],{\\\"_16\\\":540,\\\"_22\\\":542,\\\"_24\\\":543,\\\"_26\\\":34,\\\"_27\\\":544},{\\\"_18\\\":541},\\\"createRemixStub\\\",\\\"utils/create-remix-stub.md\\\",\\\"utils/create-remix-stub\\\",[],{\\\"_16\\\":546,\\\"_22\\\":548,\\\"_24\\\":549,\\\"_26\\\":34,\\\"_27\\\":550},{\\\"_18\\\":547,\\\"_169\\\":10},\\\"data\\\",\\\"utils/data.md\\\",\\\"utils/data\\\",[],{\\\"_16\\\":552,\\\"_22\\\":554,\\\"_24\\\":555,\\\"_26\\\":34,\\\"_27\\\":556},{\\\"_18\\\":553,\\\"_169\\\":10},\\\"defer\\\",\\\"utils/defer.md\\\",\\\"utils/defer\\\",[],{\\\"_16\\\":558,\\\"_22\\\":560,\\\"_24\\\":561,\\\"_26\\\":34,\\\"_27\\\":562},{\\\"_18\\\":559,\\\"_169\\\":10},\\\"isRouteErrorResponse\\\",\\\"utils/is-route-error-response.md\\\",\\\"utils/is-route-error-response\\\",[],{\\\"_16\\\":564,\\\"_22\\\":566,\\\"_24\\\":567,\\\"_26\\\":34,\\\"_27\\\":568},{\\\"_18\\\":565,\\\"_169\\\":10},\\\"json\\\",\\\"utils/json.md\\\",\\\"utils/json\\\",[],{\\\"_16\\\":570,\\\"_22\\\":572,\\\"_24\\\":573,\\\"_26\\\":34,\\\"_27\\\":574},{\\\"_18\\\":571},\\\"unstable_parseMultipartFormData\\\",\\\"utils/parse-multipart-form-data.md\\\",\\\"utils/parse-multipart-form-data\\\",[],{\\\"_16\\\":576,\\\"_22\\\":578,\\\"_24\\\":579,\\\"_26\\\":34,\\\"_27\\\":580},{\\\"_18\\\":577,\\\"_169\\\":10},\\\"redirect\\\",\\\"utils/redirect.md\\\",\\\"utils/redirect\\\",[],{\\\"_16\\\":582,\\\"_22\\\":584,\\\"_24\\\":585,\\\"_26\\\":34,\\\"_27\\\":586},{\\\"_18\\\":583,\\\"_169\\\":10},\\\"redirectDocument\\\",\\\"utils/redirectDocument.md\\\",\\\"utils/redirectDocument\\\",[],{\\\"_16\\\":588,\\\"_22\\\":590,\\\"_24\\\":591,\\\"_26\\\":34,\\\"_27\\\":592},{\\\"_18\\\":589,\\\"_169\\\":10},\\\"replace\\\",\\\"utils/replace.md\\\",\\\"utils/replace\\\",[],{\\\"_16\\\":594,\\\"_22\\\":596,\\\"_24\\\":597,\\\"_26\\\":34,\\\"_27\\\":598},{\\\"_18\\\":595},\\\"Sessions\\\",\\\"utils/sessions.md\\\",\\\"utils/sessions\\\",[],{\\\"_16\\\":600,\\\"_22\\\":602,\\\"_24\\\":603,\\\"_26\\\":34,\\\"_27\\\":604},{\\\"_18\\\":601,\\\"_169\\\":10},\\\"unstable_createFileUploadHandler\\\",\\\"utils/unstable-create-file-upload-handler.md\\\",\\\"utils/unstable-create-file-upload-handler\\\",[],{\\\"_16\\\":606,\\\"_22\\\":608,\\\"_24\\\":609,\\\"_26\\\":34,\\\"_27\\\":610},{\\\"_18\\\":607,\\\"_169\\\":10},\\\"unstable_createMemoryUploadHandler\\\",\\\"utils/unstable-create-memory-upload-handler.md\\\",\\\"utils/unstable-create-memory-upload-handler\\\",[],{\\\"_16\\\":612,\\\"_22\\\":614,\\\"_24\\\":615,\\\"_26\\\":10,\\\"_27\\\":616},{\\\"_18\\\":613,\\\"_20\\\":118},\\\"Styling\\\",\\\"styling/index.md\\\",\\\"styling\\\",[617,623,629,635,641,647,653,659],{\\\"_16\\\":618,\\\"_22\\\":620,\\\"_24\\\":621,\\\"_26\\\":34,\\\"_27\\\":622},{\\\"_18\\\":619},\\\"CSS Bundling\\\",\\\"styling/bundling.md\\\",\\\"styling/bundling\\\",[],{\\\"_16\\\":624,\\\"_22\\\":626,\\\"_24\\\":627,\\\"_26\\\":34,\\\"_27\\\":628},{\\\"_18\\\":625},\\\"Regular CSS\\\",\\\"styling/css.md\\\",\\\"styling/css\\\",[],{\\\"_16\\\":630,\\\"_22\\\":632,\\\"_24\\\":633,\\\"_26\\\":34,\\\"_27\\\":634},{\\\"_18\\\":631},\\\"CSS Imports\\\",\\\"styling/css-imports.md\\\",\\\"styling/css-imports\\\",[],{\\\"_16\\\":636,\\\"_22\\\":638,\\\"_24\\\":639,\\\"_26\\\":34,\\\"_27\\\":640},{\\\"_18\\\":637},\\\"CSS in JS\\\",\\\"styling/css-in-js.md\\\",\\\"styling/css-in-js\\\",[],{\\\"_16\\\":642,\\\"_22\\\":644,\\\"_24\\\":645,\\\"_26\\\":34,\\\"_27\\\":646},{\\\"_18\\\":643},\\\"CSS Modules\\\",\\\"styling/css-modules.md\\\",\\\"styling/css-modules\\\",[],{\\\"_16\\\":648,\\\"_22\\\":650,\\\"_24\\\":651,\\\"_26\\\":34,\\\"_27\\\":652},{\\\"_18\\\":649},\\\"PostCSS\\\",\\\"styling/postcss.md\\\",\\\"styling/postcss\\\",[],{\\\"_16\\\":654,\\\"_22\\\":656,\\\"_24\\\":657,\\\"_26\\\":34,\\\"_27\\\":658},{\\\"_18\\\":655},\\\"Tailwind\\\",\\\"styling/tailwind.md\\\",\\\"styling/tailwind\\\",[],{\\\"_16\\\":660,\\\"_22\\\":662,\\\"_24\\\":663,\\\"_26\\\":34,\\\"_27\\\":664},{\\\"_18\\\":661},\\\"Vanilla Extract\\\",\\\"styling/vanilla-extract.md\\\",\\\"styling/vanilla-extract\\\",[],{\\\"_16\\\":666,\\\"_22\\\":668,\\\"_24\\\":669,\\\"_26\\\":10,\\\"_27\\\":670},{\\\"_18\\\":667,\\\"_20\\\":132},\\\"Other API\\\",\\\"other-api/index.md\\\",\\\"other-api\\\",[671,677,683,689,695,701],{\\\"_16\\\":672,\\\"_22\\\":674,\\\"_24\\\":675,\\\"_26\\\":34,\\\"_27\\\":676},{\\\"_18\\\":673,\\\"_20\\\":39,\\\"_379\\\":34},\\\"@remix-run/dev CLI\\\",\\\"other-api/dev.md\\\",\\\"other-api/dev\\\",[],{\\\"_16\\\":678,\\\"_22\\\":680,\\\"_24\\\":681,\\\"_26\\\":34,\\\"_27\\\":682},{\\\"_18\\\":679,\\\"_20\\\":46},\\\"@remix-run/{adapter}\\\",\\\"other-api/adapter.md\\\",\\\"other-api/adapter\\\",[],{\\\"_16\\\":684,\\\"_22\\\":686,\\\"_24\\\":687,\\\"_26\\\":34,\\\"_27\\\":688},{\\\"_18\\\":685,\\\"_20\\\":46},\\\"@remix-run/serve\\\",\\\"other-api/serve.md\\\",\\\"other-api/serve\\\",[],{\\\"_16\\\":690,\\\"_22\\\":692,\\\"_24\\\":693,\\\"_26\\\":34,\\\"_27\\\":694},{\\\"_18\\\":691},\\\"create-remix (CLI)\\\",\\\"other-api/create-remix.md\\\",\\\"other-api/create-remix\\\",[],{\\\"_16\\\":696,\\\"_22\\\":698,\\\"_24\\\":699,\\\"_26\\\":34,\\\"_27\\\":700},{\\\"_18\\\":697},\\\"@remix-run/node\\\",\\\"other-api/node.md\\\",\\\"other-api/node\\\",[],{\\\"_16\\\":702,\\\"_22\\\":704,\\\"_24\\\":705,\\\"_26\\\":34,\\\"_27\\\":706},{\\\"_18\\\":703},\\\"@remix-run/testing\\\",\\\"other-api/testing.md\\\",\\\"other-api/testing\\\",[],{\\\"_16\\\":708,\\\"_22\\\":711,\\\"_24\\\":712,\\\"_26\\\":10,\\\"_27\\\":713},{\\\"_18\\\":709,\\\"_20\\\":710},\\\"Guides\\\",10,\\\"guides/index.md\\\",\\\"guides\\\",[714,720,726,732,738,744,750,756,762,769,775,782,788,794,800,806,812,818,825,831,837,843,849,855,861,867,874,881,887,893,899,905,911,917,923,930,937,943],{\\\"_16\\\":715,\\\"_22\\\":717,\\\"_24\\\":718,\\\"_26\\\":34,\\\"_27\\\":719},{\\\"_18\\\":716},\\\"Accessibility\\\",\\\"guides/accessibility.md\\\",\\\"guides/accessibility\\\",[],{\\\"_16\\\":721,\\\"_22\\\":723,\\\"_24\\\":724,\\\"_26\\\":34,\\\"_27\\\":725},{\\\"_18\\\":722},\\\"Development Strategy\\\",\\\"guides/api-development-strategy.md\\\",\\\"guides/api-development-strategy\\\",[],{\\\"_16\\\":727,\\\"_22\\\":729,\\\"_24\\\":730,\\\"_26\\\":34,\\\"_27\\\":731},{\\\"_18\\\":728},\\\"API Routes\\\",\\\"guides/api-routes.md\\\",\\\"guides/api-routes\\\",[],{\\\"_16\\\":733,\\\"_22\\\":735,\\\"_24\\\":736,\\\"_26\\\":34,\\\"_27\\\":737},{\\\"_18\\\":734,\\\"_169\\\":10},\\\"Backend For Frontend\\\",\\\"guides/bff.md\\\",\\\"guides/bff\\\",[],{\\\"_16\\\":739,\\\"_22\\\":741,\\\"_24\\\":742,\\\"_26\\\":34,\\\"_27\\\":743},{\\\"_18\\\":740},\\\"Breadcrumbs Guide\\\",\\\"guides/breadcrumbs.md\\\",\\\"guides/breadcrumbs\\\",[],{\\\"_16\\\":745,\\\"_22\\\":747,\\\"_24\\\":748,\\\"_26\\\":34,\\\"_27\\\":749},{\\\"_18\\\":746},\\\"Browser Support\\\",\\\"guides/browser-support.md\\\",\\\"guides/browser-support\\\",[],{\\\"_16\\\":751,\\\"_22\\\":753,\\\"_24\\\":754,\\\"_26\\\":34,\\\"_27\\\":755},{\\\"_18\\\":752},\\\"Client Data\\\",\\\"guides/client-data.md\\\",\\\"guides/client-data\\\",[],{\\\"_16\\\":757,\\\"_22\\\":759,\\\"_24\\\":760,\\\"_26\\\":34,\\\"_27\\\":761},{\\\"_18\\\":758},\\\"Module Constraints\\\",\\\"guides/constraints.md\\\",\\\"guides/constraints\\\",[],{\\\"_16\\\":763,\\\"_22\\\":766,\\\"_24\\\":767,\\\"_26\\\":34,\\\"_27\\\":768},{\\\"_18\\\":764,\\\"_53\\\":765},\\\"Contributing\\\",\\\"Thank you for contributing to Remix! Here's everything you need to know before you open a pull request.\\\",\\\"guides/contributing.md\\\",\\\"guides/contributing\\\",[],{\\\"_16\\\":770,\\\"_22\\\":772,\\\"_24\\\":773,\\\"_26\\\":34,\\\"_27\\\":774},{\\\"_18\\\":771},\\\"CSS Files\\\",\\\"guides/css-files.md\\\",\\\"guides/css-files\\\",[],{\\\"_16\\\":776,\\\"_22\\\":779,\\\"_24\\\":780,\\\"_26\\\":34,\\\"_27\\\":781},{\\\"_18\\\":777,\\\"_53\\\":778},\\\"Data Loading\\\",\\\"One of the primary features of Remix is simplifying interactions with the server to get data into components. This document will help you get the most out of data loading in Remix.\\\",\\\"guides/data-loading.md\\\",\\\"guides/data-loading\\\",[],{\\\"_16\\\":783,\\\"_22\\\":785,\\\"_24\\\":786,\\\"_26\\\":34,\\\"_27\\\":787},{\\\"_18\\\":784},\\\"Data Writes\\\",\\\"guides/data-writes.md\\\",\\\"guides/data-writes\\\",[],{\\\"_16\\\":789,\\\"_22\\\":791,\\\"_24\\\":792,\\\"_26\\\":34,\\\"_27\\\":793},{\\\"_18\\\":790},\\\"Dependency optimization\\\",\\\"guides/dependency-optimization.md\\\",\\\"guides/dependency-optimization\\\",[],{\\\"_16\\\":795,\\\"_22\\\":797,\\\"_24\\\":798,\\\"_26\\\":34,\\\"_27\\\":799},{\\\"_18\\\":796,\\\"_169\\\":10},\\\"Deployment\\\",\\\"guides/deployment.md\\\",\\\"guides/deployment\\\",[],{\\\"_16\\\":801,\\\"_22\\\":803,\\\"_24\\\":804,\\\"_26\\\":34,\\\"_27\\\":805},{\\\"_18\\\":802,\\\"_169\\\":10},\\\"Disabling JavaScript\\\",\\\"guides/disabling-javascript.md\\\",\\\"guides/disabling-javascript\\\",[],{\\\"_16\\\":807,\\\"_22\\\":809,\\\"_24\\\":810,\\\"_26\\\":34,\\\"_27\\\":811},{\\\"_18\\\":808},\\\"Environment Variables\\\",\\\"guides/envvars.md\\\",\\\"guides/envvars\\\",[],{\\\"_16\\\":813,\\\"_22\\\":815,\\\"_24\\\":816,\\\"_26\\\":34,\\\"_27\\\":817},{\\\"_18\\\":814},\\\"Error Handling\\\",\\\"guides/errors.md\\\",\\\"guides/errors\\\",[],{\\\"_16\\\":819,\\\"_22\\\":822,\\\"_24\\\":823,\\\"_26\\\":34,\\\"_27\\\":824},{\\\"_18\\\":820,\\\"_53\\\":821},\\\"FAQs\\\",\\\"Frequently Asked Questions about Remix\\\",\\\"guides/faq.md\\\",\\\"guides/faq\\\",[],{\\\"_16\\\":826,\\\"_22\\\":828,\\\"_24\\\":829,\\\"_26\\\":34,\\\"_27\\\":830},{\\\"_18\\\":827},\\\"File Uploads\\\",\\\"guides/file-uploads.md\\\",\\\"guides/file-uploads\\\",[],{\\\"_16\\\":832,\\\"_22\\\":834,\\\"_24\\\":835,\\\"_26\\\":34,\\\"_27\\\":836},{\\\"_18\\\":833},\\\"Form Validation\\\",\\\"guides/form-validation.md\\\",\\\"guides/form-validation\\\",[],{\\\"_16\\\":838,\\\"_22\\\":840,\\\"_24\\\":841,\\\"_26\\\":34,\\\"_27\\\":842},{\\\"_18\\\":839},\\\"Gotchas\\\",\\\"guides/gotchas.md\\\",\\\"guides/gotchas\\\",[],{\\\"_16\\\":844,\\\"_22\\\":846,\\\"_24\\\":847,\\\"_26\\\":34,\\\"_27\\\":848},{\\\"_18\\\":845,\\\"_169\\\":10},\\\"Index Query Param\\\",\\\"guides/index-query-param.md\\\",\\\"guides/index-query-param\\\",[],{\\\"_16\\\":850,\\\"_22\\\":852,\\\"_24\\\":853,\\\"_26\\\":34,\\\"_27\\\":854},{\\\"_18\\\":851},\\\"Lazy Route Discovery\\\",\\\"guides/lazy-route-discovery.md\\\",\\\"guides/lazy-route-discovery\\\",[],{\\\"_16\\\":856,\\\"_22\\\":858,\\\"_24\\\":859,\\\"_26\\\":34,\\\"_27\\\":860},{\\\"_18\\\":857},\\\"Local TLS\\\",\\\"guides/local-tls.md\\\",\\\"guides/local-tls\\\",[],{\\\"_16\\\":862,\\\"_22\\\":864,\\\"_24\\\":865,\\\"_26\\\":34,\\\"_27\\\":866},{\\\"_18\\\":863},\\\"Manual Dev Server\\\",\\\"guides/manual-mode.md\\\",\\\"guides/manual-mode\\\",[],{\\\"_16\\\":868,\\\"_22\\\":871,\\\"_24\\\":872,\\\"_26\\\":34,\\\"_27\\\":873},{\\\"_18\\\":869,\\\"_53\\\":870},\\\"MDX\\\",\\\"Remix makes integrating MDX into your project a breeze with built in routes and \\\\\\\"import\\\\\\\" support.\\\",\\\"guides/mdx.md\\\",\\\"guides/mdx\\\",[],{\\\"_16\\\":875,\\\"_22\\\":878,\\\"_24\\\":879,\\\"_26\\\":34,\\\"_27\\\":880},{\\\"_18\\\":876,\\\"_53\\\":877},\\\"Migrating from React Router\\\",\\\"Migrating your React Router app to Remix can be done all at once or in stages. This guide will walk you through an iterative approach to get your app running quickly.\\\",\\\"guides/migrating-react-router-app.md\\\",\\\"guides/migrating-react-router-app\\\",[],{\\\"_16\\\":882,\\\"_22\\\":884,\\\"_24\\\":885,\\\"_26\\\":34,\\\"_27\\\":886},{\\\"_18\\\":883},\\\"Not Found Handling\\\",\\\"guides/not-found.md\\\",\\\"guides/not-found\\\",[],{\\\"_16\\\":888,\\\"_22\\\":890,\\\"_24\\\":891,\\\"_26\\\":34,\\\"_27\\\":892},{\\\"_18\\\":889},\\\"Performance\\\",\\\"guides/performance.md\\\",\\\"guides/performance\\\",[],{\\\"_16\\\":894,\\\"_22\\\":896,\\\"_24\\\":897,\\\"_26\\\":34,\\\"_27\\\":898},{\\\"_18\\\":895},\\\"Presets\\\",\\\"guides/presets.md\\\",\\\"guides/presets\\\",[],{\\\"_16\\\":900,\\\"_22\\\":902,\\\"_24\\\":903,\\\"_26\\\":34,\\\"_27\\\":904},{\\\"_18\\\":901},\\\"Resource Routes\\\",\\\"guides/resource-routes.md\\\",\\\"guides/resource-routes\\\",[],{\\\"_16\\\":906,\\\"_22\\\":908,\\\"_24\\\":909,\\\"_26\\\":34,\\\"_27\\\":910},{\\\"_18\\\":907},\\\"Server Bundles\\\",\\\"guides/server-bundles.md\\\",\\\"guides/server-bundles\\\",[],{\\\"_16\\\":912,\\\"_22\\\":914,\\\"_24\\\":915,\\\"_26\\\":34,\\\"_27\\\":916},{\\\"_18\\\":913},\\\"Single Fetch\\\",\\\"guides/single-fetch.md\\\",\\\"guides/single-fetch\\\",[],{\\\"_16\\\":918,\\\"_22\\\":920,\\\"_24\\\":921,\\\"_26\\\":34,\\\"_27\\\":922},{\\\"_18\\\":919},\\\"SPA Mode\\\",\\\"guides/spa-mode.md\\\",\\\"guides/spa-mode\\\",[],{\\\"_16\\\":924,\\\"_22\\\":927,\\\"_24\\\":928,\\\"_26\\\":34,\\\"_27\\\":929},{\\\"_18\\\":925,\\\"_53\\\":926},\\\"Streaming\\\",\\\"When, why, and how to stream with React 18 and Remix's deferred API.\\\",\\\"guides/streaming.md\\\",\\\"guides/streaming\\\",[],{\\\"_16\\\":931,\\\"_22\\\":934,\\\"_24\\\":935,\\\"_26\\\":34,\\\"_27\\\":936},{\\\"_18\\\":932,\\\"_53\\\":933},\\\"Templates\\\",\\\"The quickest way to get rocking and rolling with Remix\\\",\\\"guides/templates.md\\\",\\\"guides/templates\\\",[],{\\\"_16\\\":938,\\\"_22\\\":940,\\\"_24\\\":941,\\\"_26\\\":34,\\\"_27\\\":942},{\\\"_18\\\":939,\\\"_169\\\":10},\\\"TypeScript\\\",\\\"guides/typescript.md\\\",\\\"guides/typescript\\\",[],{\\\"_16\\\":944,\\\"_22\\\":946,\\\"_24\\\":947,\\\"_26\\\":34,\\\"_27\\\":948},{\\\"_18\\\":945},\\\"Vite\\\",\\\"guides/vite.md\\\",\\\"guides/vite\\\",[],\\\"routes/docs.$\\\",{\\\"_951\\\":952},\\\"doc\\\",{\\\"_16\\\":953,\\\"_22\\\":954,\\\"_955\\\":956,\\\"_24\\\":957,\\\"_958\\\":959,\\\"_27\\\":1370},{\\\"_18\\\":954},\\\"CHANGELOG.md\\\",\\\"html\\\",\\\"\\u003c!-- markdownlint-disable no-duplicate-header no-emphasis-as-heading no-inline-html --\\u003e\\\\n\\u003ch1 id=\\\\\\\"remix-releases\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#remix-releases\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eRemix Releases\\u003c/h1\\u003e\\\\n\\u003cp\\u003eThis page lists all releases/release notes for Remix back to \\u003ccode\\u003ev2.0.0\\u003c/code\\u003e. For releases prior to v2, please refer to the \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/releases\\\\\\\"\\u003eGitHub Releases Page\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWe manage release notes in this file instead of the paginated GitHub Releases Page for 2 reasons:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003ePagination in the GitHub UI means that you cannot easily search release notes for a large span of releases at once\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe paginated GitHub interface also cuts off longer releases notes without indication in list view, and you need to click into the detail view to see the full set of release notes\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cdetails\\u003e\\\\n \\u003csummary\\u003e \\u003c/summary\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#remix-releases\\\\\\\"\\u003eRemix Releases\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2170\\\\\\\"\\u003ev2.17.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2168\\\\\\\"\\u003ev2.16.8\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2167\\\\\\\"\\u003ev2.16.7\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-1\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2166\\\\\\\"\\u003ev2.16.6\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-2\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2165\\\\\\\"\\u003ev2.16.5\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-3\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2164\\\\\\\"\\u003ev2.16.4\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-4\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2163\\\\\\\"\\u003ev2.16.3\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#security-notice\\\\\\\"\\u003eSecurity Notice\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-5\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2162\\\\\\\"\\u003ev2.16.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-6\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2161\\\\\\\"\\u003ev2.16.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-7\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2160\\\\\\\"\\u003ev2.16.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-1\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-8\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2153\\\\\\\"\\u003ev2.15.3\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-9\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-1\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2152\\\\\\\"\\u003ev2.15.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-10\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-2\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2151\\\\\\\"\\u003ev2.15.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-11\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2150\\\\\\\"\\u003ev2.15.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-12\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2140\\\\\\\"\\u003ev2.14.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-2\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-13\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-3\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-1\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2131\\\\\\\"\\u003ev2.13.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-14\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2130\\\\\\\"\\u003ev2.13.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#stabilized-apis\\\\\\\"\\u003eStabilized APIs\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-3\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-15\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-4\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-2\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2121\\\\\\\"\\u003ev2.12.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-16\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-3\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2120\\\\\\\"\\u003ev2.12.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-1\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#future-flag-for-automatic-dependency-optimization-unstable\\\\\\\"\\u003eFuture Flag for Automatic Dependency Optimization (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#improved-single-fetch-type-safety-unstable\\\\\\\"\\u003eImproved Single Fetch Type Safety (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updates-to-single-fetch-revalidation-behavior-unstable\\\\\\\"\\u003eUpdates to Single Fetch Revalidation Behavior (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-4\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-17\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-5\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-4\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2112\\\\\\\"\\u003ev2.11.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-18\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-6\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-5\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2111\\\\\\\"\\u003ev2.11.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-19\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-6\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2110\\\\\\\"\\u003ev2.11.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-2\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#renamed-unstable_fogofwar-future-flag-to-unstable_lazyroutediscovery-unstable\\\\\\\"\\u003eRenamed \\u003ccode\\u003eunstable_fogOfWar\\u003c/code\\u003e future flag to \\u003ccode\\u003eunstable_lazyRouteDiscovery\\u003c/code\\u003e (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#removed-response-stub-in-single-fetch-unstable\\\\\\\"\\u003eRemoved \\u003ccode\\u003eresponse\\u003c/code\\u003e stub in Single Fetch (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-5\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-20\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-7\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-7\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2103\\\\\\\"\\u003ev2.10.3\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-21\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-8\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-8\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2102\\\\\\\"\\u003ev2.10.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-22\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-9\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2101\\\\\\\"\\u003ev2.10.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-23\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-9\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-10\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v2100\\\\\\\"\\u003ev2.10.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-3\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#lazy-route-discovery-aka-fog-of-war\\\\\\\"\\u003eLazy Route Discovery (a.k.a. \\\\\\\"Fog of War\\\\\\\")\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-6\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-24\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-10\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-11\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v292\\\\\\\"\\u003ev2.9.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-4\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-type-safety-for-single-fetch\\\\\\\"\\u003eUpdated Type-Safety for Single Fetch\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-25\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-11\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-12\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v291\\\\\\\"\\u003ev2.9.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-26\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-13\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v290\\\\\\\"\\u003ev2.9.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-5\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#single-fetch-unstable\\\\\\\"\\u003eSingle Fetch (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#undici\\\\\\\"\\u003eUndici\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-7\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-27\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-12\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-14\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v281\\\\\\\"\\u003ev2.8.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-28\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-13\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-15\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v280\\\\\\\"\\u003ev2.8.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-8\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-29\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-14\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-16\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#272\\\\\\\"\\u003e2.7.2\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-30\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#271\\\\\\\"\\u003e2.7.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-31\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v270\\\\\\\"\\u003ev2.7.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-6\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#stabilized-vite-plugin\\\\\\\"\\u003eStabilized Vite Plugin\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#new-layout-export\\\\\\\"\\u003eNew \\u003ccode\\u003eLayout\\u003c/code\\u003e Export\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#basename-support\\\\\\\"\\u003eBasename support\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#cloudflare-proxy-as-a-vite-plugin\\\\\\\"\\u003eCloudflare Proxy as a Vite Plugin\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-9\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-32\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-15\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-17\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v260\\\\\\\"\\u003ev2.6.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-7\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#unstable-vite-plugin-updates\\\\\\\"\\u003eUnstable Vite Plugin updates\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-10\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-33\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-16\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-18\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v251\\\\\\\"\\u003ev2.5.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-34\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-17\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-19\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v250\\\\\\\"\\u003ev2.5.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-8\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#spa-mode-unstable\\\\\\\"\\u003eSPA Mode (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#server-bundles-unstable\\\\\\\"\\u003eServer Bundles (unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-11\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-35\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-18\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-20\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v241\\\\\\\"\\u003ev2.4.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-36\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-19\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-21\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v240\\\\\\\"\\u003ev2.4.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-9\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#client-data\\\\\\\"\\u003eClient Data\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#futurev3_relativesplatpath\\\\\\\"\\u003e\\u003ccode\\u003efuture.v3_relativeSplatPath\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#vite-updates-unstable\\\\\\\"\\u003eVite Updates (Unstable)\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-12\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-37\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-20\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-22\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v231\\\\\\\"\\u003ev2.3.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-38\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-21\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-23\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v230\\\\\\\"\\u003ev2.3.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-10\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#stabilized-useblocker\\\\\\\"\\u003eStabilized \\u003ccode\\u003euseBlocker\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#unstable_flushsync-api\\\\\\\"\\u003e\\u003ccode\\u003eunstable_flushSync\\u003c/code\\u003e API\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-13\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-39\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-22\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-24\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v220\\\\\\\"\\u003ev2.2.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-11\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#vite\\\\\\\"\\u003eVite!\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#new-fetcher-apis\\\\\\\"\\u003eNew Fetcher APIs\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#persistence-future-flag\\\\\\\"\\u003ePersistence Future Flag\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-14\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-40\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-23\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-25\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v210\\\\\\\"\\u003ev2.1.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#whats-changed-12\\\\\\\"\\u003eWhat's Changed\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#view-transitions\\\\\\\"\\u003eView Transitions\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#stable-createremixstub\\\\\\\"\\u003eStable \\u003ccode\\u003ecreateRemixStub\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#minor-changes-15\\\\\\\"\\u003eMinor Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-41\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-24\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-26\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v201\\\\\\\"\\u003ev2.0.1\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#patch-changes-42\\\\\\\"\\u003ePatch Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-\\\\\\\"\\u003eChanges by Package 🔗\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#v200\\\\\\\"\\u003ev2.0.0\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#breaking-changes\\\\\\\"\\u003eBreaking Changes\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#upgraded-dependency-requirements\\\\\\\"\\u003eUpgraded Dependency Requirements\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#removed-future-flags\\\\\\\"\\u003eRemoved Future Flags\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#breaking-changesapi-removals\\\\\\\"\\u003eBreaking Changes/API Removals\\u003c/a\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#with-deprecation-warnings\\\\\\\"\\u003eWith deprecation warnings\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#without-deprecation-warnings\\\\\\\"\\u003eWithout deprecation warnings\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#breaking-type-changes\\\\\\\"\\u003eBreaking Type Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#new-features\\\\\\\"\\u003eNew Features\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#other-notable-changes\\\\\\\"\\u003eOther Notable Changes\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#updated-dependencies-25\\\\\\\"\\u003eUpdated Dependencies\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"#changes-by-package-27\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/details\\u003e\\\\n\\u003c!--\\\\nTo add a new release, copy from this template:\\\\n\\\\n## v2.X.Y\\\\n\\\\nDate: YYYY-MM-DD\\\\n\\\\n### What's Changed\\\\n\\\\n#### Big New Feature 1\\\\n\\\\n#### Big New Feature 2\\\\n\\\\n### Minor Changes\\\\n\\\\n### Patch Changes\\\\n\\\\n### Updated Dependencies\\\\n\\\\n- [`react-router-dom@6.X.Y`](https://github.com/remix-run/react-router/releases/tag/react-router%406.X.Y)\\\\n- [`@remix-run/router@1.X.Y`](https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1XY)\\\\n\\\\n### Changes by Package\\\\n\\\\n- [`create-remix`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/create-remix/CHANGELOG.md#2XY)\\\\n- [`@remix-run/architect`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-architect/CHANGELOG.md#2XY)\\\\n- [`@remix-run/cloudflare`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-cloudflare/CHANGELOG.md#2XY)\\\\n- [`@remix-run/cloudflare-pages`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-cloudflare-pages/CHANGELOG.md#2XY)\\\\n- [`@remix-run/cloudflare-workers`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-cloudflare-workers/CHANGELOG.md#2XY)\\\\n- [`@remix-run/css-bundle`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-css-bundle/CHANGELOG.md#2XY)\\\\n- [`@remix-run/deno`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-deno/CHANGELOG.md#2XY)\\\\n- [`@remix-run/dev`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-dev/CHANGELOG.md#2XY)\\\\n- [`@remix-run/eslint-config`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-eslint-config/CHANGELOG.md#2XY)\\\\n- [`@remix-run/express`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-express/CHANGELOG.md#2XY)\\\\n- [`@remix-run/fs-routes`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-fs-routes/CHANGELOG.md#2XY)\\\\n- [`@remix-run/node`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-node/CHANGELOG.md#2XY)\\\\n- [`@remix-run/react`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-react/CHANGELOG.md#2XY)\\\\n- [`@remix-run/route-config`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-route-config/CHANGELOG.md#2XY)\\\\n- [`@remix-run/routes-option-adapter`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-routes-option-adapter/CHANGELOG.md#2XY)\\\\n- [`@remix-run/serve`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-serve/CHANGELOG.md#2XY)\\\\n- [`@remix-run/server-runtime`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-server-runtime/CHANGELOG.md#2XY)\\\\n- [`@remix-run/testing`](https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/remix-testing/CHANGELOG.md#2XY)\\\\n\\\\n**Full Changelog**: [`v2.X.Y...v2.X.Y`](https://github.com/remix-run/remix/compare/remix@2.X.Y...remix@2.X.Y)\\\\n\\\\n--\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2170\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2170\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.17.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-07-25\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e - Redirect users to \\u003ccode\\u003ecreate-react-router\\u003c/code\\u003e instead of \\u003ccode\\u003ecreate-remix\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10686\\\\\\\"\\u003e#10686\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10688\\\\\\\"\\u003e#10688\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemix v2 is in maintenance mode so we don't want new Remix apps to be created\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/create-remix/CHANGELOG.md#2170\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.8...remix@2.17.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.8...v2.17.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2168\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2168\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.8\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-05-29\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e - Update \\u003ccode\\u003etar-fs\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10638\\\\\\\"\\u003e#10638\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.7...remix@2.16.8\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.7...v2.16.8\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2167\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2167\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.7\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-05-19\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-1\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-1\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Update \\u003ccode\\u003evite-node\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10611\\\\\\\"\\u003e#10611\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.6...remix@2.16.7\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.6...v2.16.7\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2166\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2166\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.6\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-05-08\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-2\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-2\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Upgrade \\u003ccode\\u003eturbo-stream\\u003c/code\\u003e to \\u003ccode\\u003e2.4.1\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9973\\\\\\\"\\u003e#9973\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix \\u003ccode\\u003ewindow is not defined\\u003c/code\\u003e error in Single Fetch when server-rendering \\u003ccode\\u003e\\u0026#x3C;PrefetchPageLinks\\u003e\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10601\\\\\\\"\\u003e#10601\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e - Remove redundant \\u003ccode\\u003e@remix-run/node/install\\u003c/code\\u003e import from \\u003ccode\\u003eremix-serve\\u003c/code\\u003e because it manually calls \\u003ccode\\u003einstallGlobals\\u003c/code\\u003e separately (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10306\\\\\\\"\\u003e#10306\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.5...remix@2.16.6\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.5...v2.16.6\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2165\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2165\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.5\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-04-09\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-3\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-3\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e - Bump \\u003ccode\\u003eundici\\u003c/code\\u003e to version \\u003ccode\\u003e6.21.2\\u003c/code\\u003e to address a \\u003ca href=\\\\\\\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\\\\\\\"\\u003esecurity advisory\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10562\\\\\\\"\\u003e#10562\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.4...remix@2.16.5\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.4...v2.16.5\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2164\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2164\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.4\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-03-31\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-4\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-4\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Bump \\u003ccode\\u003ecookie\\u003c/code\\u003e dependency from \\u003ccode\\u003e^0.6.0 -\\u003e ^0.7.2\\u003c/code\\u003e to fix \\u003ca href=\\\\\\\"https://github.com/advisories/GHSA-pxg6-pf52-xh8x\\\\\\\"\\u003esecurity advisory\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10547\\\\\\\"\\u003e#10547\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.3...remix@2.16.4\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.3...v2.16.4\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2163\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2163\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.3\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-03-28\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"security-notice\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#security-notice\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eSecurity Notice\\u003c/h3\\u003e\\\\n\\u003cp\\u003eFixed a security vulnerability that allowed URL manipulation and potential cache pollution via the \\u003ccode\\u003eHost\\u003c/code\\u003e and \\u003ccode\\u003eX-Forwarded-Host\\u003c/code\\u003e headers due to inadequate port sanitization.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-5\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-5\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e - Better validation of \\u003ccode\\u003ex-forwarded-host\\u003c/code\\u003e header to prevent potential security issues (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10553\\\\\\\"\\u003e#10553\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.2...remix@2.16.3\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.2...v2.16.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2162\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2162\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-03-19\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-6\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-6\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix \\u003ccode\\u003eshouldRevalidate\\u003c/code\\u003e behavior for \\u003ccode\\u003eclientLoader\\u003c/code\\u003e-only routes in \\u003ccode\\u003essr:true\\u003c/code\\u003e apps (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10527\\\\\\\"\\u003e#10527\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Load ancestor pathless/index routes in lazy route discovery for upwards non-eager-discovery routing (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10535\\\\\\\"\\u003e#10535\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.1...remix@2.16.2\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.1...v2.16.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2161\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2161\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-03-17\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-7\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-7\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Remove unused Vite file system watcher (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10510\\\\\\\"\\u003e#10510\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - When \\u003ccode\\u003efuture.v3_routeConfig\\u003c/code\\u003e is enabled, fix errors evaluating \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e when multiple copies of \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e are present (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10524\\\\\\\"\\u003e#10524\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix Vite import analysis of \\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e failing when the package is not marked as external (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10528\\\\\\\"\\u003e#10528\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.16.0...remix@2.16.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.16.0...v2.16.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2160\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2160\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.16.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-02-27\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-1\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-1\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Add Vite v6 support (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10351\\\\\\\"\\u003e#10351\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-8\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-8\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Clean up vite-node dev server when build finishes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10477\\\\\\\"\\u003e#10477\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Don't apply Single Fetch revalidation de-optimization when in SPA mode since there is no server HTTP request (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10479\\\\\\\"\\u003e#10479\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - When using Lazy Route Discovery (\\u003ccode\\u003efuture.v3_lazyRouteDiscovery\\u003c/code\\u003e), Remix will now detect manifest version mismatches after a new deploy and trigger a document reload to sync up any active client sessions with the newly deployed version (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10498\\\\\\\"\\u003e#10498\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eOn navigations to undiscovered routes, this mismatch will trigger a document reload of the destination path\\u003c/li\\u003e\\\\n\\u003cli\\u003eOn \\u003ccode\\u003efetcher\\u003c/code\\u003e calls to undiscovered routes, this mismatch will trigger a document reload of the current path\\u003c/li\\u003e\\\\n\\u003cli\\u003eWhile performing Eager Route Discovery on rendered \\u003ccode\\u003e\\u0026#x3C;Link\\u003e\\u003c/code\\u003e components, mismatches will result in a no-op\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.30.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.30.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.23.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.15.3...remix@2.16.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.15.3...v2.16.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2153\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2153\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.15.3\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2025-01-30\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-9\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-9\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Properly handle interrupted manifest requests in lazy route discovery (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10447\\\\\\\"\\u003e#10447\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Avoid duplication of \\u003ccode\\u003eSet-Cookie\\u003c/code\\u003e headers if also returned from \\u003ccode\\u003eheaders\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10424\\\\\\\"\\u003e#10424\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Properly handle status codes that cannot have a body in single fetch responses (204, etc.) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10410\\\\\\\"\\u003e#10410\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-1\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-1\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.29.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.29.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.22.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.15.2...remix@2.15.3\\\\\\\"\\u003e\\u003ccode\\u003ev2.15.2...v2.15.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2152\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2152\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.15.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-12-20\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-10\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-10\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Allow suppression of future flag warnings by setting them to \\u003ccode\\u003efalse\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10358\\\\\\\"\\u003e#10358\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Throw unwrapped Single Fetch \\u003ccode\\u003eredirect\\u003c/code\\u003e to align with pre-Single Fetch behavior (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10317\\\\\\\"\\u003e#10317\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-2\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-2\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.28.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.28.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.15.1...remix@2.15.2\\\\\\\"\\u003e\\u003ccode\\u003ev2.15.1...v2.15.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2151\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2151\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.15.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-12-09\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-11\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-11\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e - Move \\u003ccode\\u003efs-extra\\u003c/code\\u003e from \\u003ccode\\u003edevDependencies\\u003c/code\\u003e to \\u003ccode\\u003edependencies\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10300\\\\\\\"\\u003e#10300\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.15.0...remix@2.15.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.15.0...v2.15.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2150\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2150\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.15.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-11-19\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-12\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-12\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eStabilize the \\u003ccode\\u003efuture.v3_routeConfig\\u003c/code\\u003e future flag, replacing \\u003ccode\\u003efuture.unstable_routeConfig\\u003c/code\\u003e. This enables support for \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e to assist with the migration to React Router v7. (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10236\\\\\\\"\\u003e#10236\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cp\\u003eNote that if you had already enabled the \\u003ccode\\u003efuture.unstable_routeConfig\\u003c/code\\u003e flag, your route config in \\u003ccode\\u003eapp/routes.ts\\u003c/code\\u003e is no longer defined via the \\u003ccode\\u003eroutes\\u003c/code\\u003e export and must now be defined via the default export.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003eimport { type RouteConfig } from \\\\\\\"@remix-run/route-config\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eexport const routes: RouteConfig = [];\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eexport default [] satisfies RouteConfig;\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2140\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2140\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.14.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-11-08\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-2\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-2\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eDeprecate \\u003ccode\\u003eSerializeFrom\\u003c/code\\u003e in favor of generics because it will be removed in React Router v7 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10173\\\\\\\"\\u003e#10173\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eAdd deprecation warning to \\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10174\\\\\\\"\\u003e#10174\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eAdd support for \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e behind \\u003ccode\\u003efuture.unstable_routeConfig\\u003c/code\\u003e flag to assist with the migration to React Router v7. (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10107\\\\\\\"\\u003e#10107\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cp\\u003eConfig-based routing is the new default in React Router v7, configured via the \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e file in the app directory. Support for \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e and its related APIs in Remix are designed as a migration path to help minimize the number of changes required when moving your Remix project over to React Router v7. While some new packages have been introduced within the \\u003ccode\\u003e@remix-run\\u003c/code\\u003e scope, these new packages only exist to keep the code in \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e as similar as possible to the equivalent code for React Router v7.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWhen the \\u003ccode\\u003eunstable_routeConfig\\u003c/code\\u003e future flag is enabled, Remix's built-in file system routing will be disabled and your project will opted into React Router v7's config-based routing.\\u003c/p\\u003e\\\\n\\u003cp\\u003eTo enable the flag, in your \\u003ccode\\u003evite.config.ts\\u003c/code\\u003e file:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eremix\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e future: {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e unstable_routeConfig: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003etrue\\u003c/span\\u003e,\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e },\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eA minimal \\u003ccode\\u003eroutes.ts\\u003c/code\\u003e file to support Remix's built-in file system routing looks like this:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// app/routes.ts\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eflatRoutes\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e@remix-run/fs-routes\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003etype\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eRouteConfig\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e@remix-run/route-config\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003econst\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eroutes\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e:\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eRouteConfig\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eflatRoutes\\u003c/span\\u003e();\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eLog deprecation warnings for v3 future flags (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10126\\\\\\\"\\u003e#10126\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdd \\u003ccode\\u003e@deprecated\\u003c/code\\u003e annotations to \\u003ccode\\u003ejson\\u003c/code\\u003e/\\u003ccode\\u003edefer\\u003c/code\\u003e utilities\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-13\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-13\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix \\u003ccode\\u003edefaultShouldRevalidate\\u003c/code\\u003e value when using Single Fetch (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10139\\\\\\\"\\u003e#10139\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Update externally-accessed resource routes warning to cover \\u003ccode\\u003enull\\u003c/code\\u003e usage as well (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10145\\\\\\\"\\u003e#10145\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-3\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-3\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.28.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.28.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.21.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-1\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-1\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/create-remix/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-architect/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare-pages/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare-workers/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-css-bundle/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-deno/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-dev/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-eslint-config/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-express/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-fs-routes/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/fs-routes\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-node/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-react/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-route-config/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/route-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-routes-option-adapter/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/routes-option-adapter\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-serve/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-server-runtime/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-testing/CHANGELOG.md#2140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.13.1...remix@2.14.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.13.1...v2.14.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2131\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2131\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.13.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-10-11\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-14\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-14\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Revert \\u003ccode\\u003efuture.v3_optimizeDeps\\u003c/code\\u003e back to \\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e as it was not intended to stabilize in Remix v2 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10099\\\\\\\"\\u003e#10099\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.13.0...remix@2.13.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.13.0...v2.13.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2130\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2130\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.13.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-10-11\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"stabilized-apis\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#stabilized-apis\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eStabilized APIs\\u003c/h4\\u003e\\\\n\\u003cp\\u003eThis release stabilizes a handful of \\\\\\\"unstable\\\\\\\" APIs in preparation for the \\u003ca href=\\\\\\\"https://x.com/remix_run/status/1841926034868077009\\\\\\\"\\u003epending\\u003c/a\\u003e React Router v7 release (see \\u003ca href=\\\\\\\"https://remix.run/blog/merging-remix-and-react-router\\\\\\\"\\u003ethese\\u003c/a\\u003e \\u003ca href=\\\\\\\"https://remix.run/blog/incremental-path-to-react-19\\\\\\\"\\u003eposts\\u003c/a\\u003e for more info):\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_data\\u003c/code\\u003e → \\u003ccode\\u003edata\\u003c/code\\u003e (for use with Single Fetch)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_flushSync\\u003c/code\\u003e → \\u003ccode\\u003eflushSync\\u003c/code\\u003e (\\u003ccode\\u003euseSubmit\\u003c/code\\u003e, \\u003ccode\\u003efetcher.load\\u003c/code\\u003e, \\u003ccode\\u003efetcher.submit\\u003c/code\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_viewTransition\\u003c/code\\u003e → \\u003ccode\\u003eviewTransition\\u003c/code\\u003e (\\u003ccode\\u003e\\u0026#x3C;Link\\u003e\\u003c/code\\u003e, \\u003ccode\\u003e\\u0026#x3C;Form\\u003e\\u003c/code\\u003e, \\u003ccode\\u003euseNavigate\\u003c/code\\u003e, \\u003ccode\\u003euseSubmit\\u003c/code\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cdel\\u003e\\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e → \\u003ccode\\u003efuture.v3_optimizeDeps\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/guides/dependency-optimization\\\\\\\"\\u003eDocs\\u003c/a\\u003e)\\u003c/del\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ This flag was not intended to stabilize in Remix v2 and was reverted back to \\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e in \\u003ccode\\u003e2.13.1\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efuture.unstable_lazyRouteDiscovery\\u003c/code\\u003e → \\u003ccode\\u003efuture.v3_lazyRouteDiscovery\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://remix.run/docs/guides/lazy-route-discovery\\\\\\\"\\u003eDocs\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efuture.unstable_singleFetch\\u003c/code\\u003e → \\u003ccode\\u003efuture.v3_singleFetch\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://remix.run/docs/guides/single-fetch\\\\\\\"\\u003eDocs\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-3\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-3\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eStabilize React Router APIs in Remix (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9980\\\\\\\"\\u003e#9980\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdopt stabilized React Router APIs internally\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eSingle Fetch: \\u003ccode\\u003eunstable_dataStrategy\\u003c/code\\u003e -\\u003e \\u003ccode\\u003edataStrategy\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eLazy Route Discovery: \\u003ccode\\u003eunstable_patchRoutesOnNavigation\\u003c/code\\u003e -\\u003e \\u003ccode\\u003epatchRoutesOnNavigation\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eStabilize public-facing APIs\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eSingle Fetch: \\u003ccode\\u003eunstable_data()\\u003c/code\\u003e -\\u003e \\u003ccode\\u003edata()\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_viewTransition\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eviewTransition\\u003c/code\\u003e (\\u003ccode\\u003eLink\\u003c/code\\u003e, \\u003ccode\\u003eForm\\u003c/code\\u003e, \\u003ccode\\u003enavigate\\u003c/code\\u003e, \\u003ccode\\u003esubmit\\u003c/code\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_flushSync\\u003e\\u003c/code\\u003e -\\u003e \\u003ccode\\u003e\\u0026#x3C;Link viewTransition\\u003e\\u003c/code\\u003e (\\u003ccode\\u003eLink\\u003c/code\\u003e, \\u003ccode\\u003eForm\\u003c/code\\u003e, \\u003ccode\\u003enavigate\\u003c/code\\u003e, \\u003ccode\\u003esubmit\\u003c/code\\u003e, \\u003ccode\\u003euseFetcher\\u003c/code\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eStabilize future flags (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10072\\\\\\\"\\u003e#10072\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10092\\\\\\\"\\u003e#10092\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efuture.unstable_lazyRouteDiscovery\\u003c/code\\u003e -\\u003e \\u003ccode\\u003efuture.v3_lazyRouteDiscovery\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e -\\u003e \\u003ccode\\u003efuture.v3_optimizeDeps\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efuture.unstable_singleFetch\\u003c/code\\u003e -\\u003e \\u003ccode\\u003efuture.v3_singleFetch\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-15\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-15\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Stop passing \\u003ccode\\u003erequest.signal\\u003c/code\\u003e as the \\u003ccode\\u003erenderToReadableStream\\u003c/code\\u003e \\u003ccode\\u003esignal\\u003c/code\\u003e to abort server rendering for cloudflare/deno runtimes because by the time that \\u003ccode\\u003erequest\\u003c/code\\u003e is aborted, aborting the rendering is useless because there's no way for React to flush down the unresolved boundaries (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10047\\\\\\\"\\u003e#10047\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis has been incorrect for some time, but only recently exposed due to a bug in how we were aborting requests when running via \\u003ccode\\u003eremix vite:dev\\u003c/code\\u003e because we were incorrectly aborting requests after successful renders - which was causing us to abort a completed React render, and try to close an already closed \\u003ccode\\u003eReadableStream\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis has likely not shown up in any production scenarios because cloudflare/deno production runtimes are (correctly) not aborting the \\u003ccode\\u003erequest.signal\\u003c/code\\u003e on successful renders\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe built-in \\u003ccode\\u003eentry.server\\u003c/code\\u003e files no longer pass a \\u003ccode\\u003esignal\\u003c/code\\u003e to \\u003ccode\\u003erenderToReadableStream\\u003c/code\\u003e because adding a timeout-based abort signal to the default behavior would constitute a breaking change\\u003c/li\\u003e\\\\n\\u003cli\\u003eUsers can configure this abort behavior via their own \\u003ccode\\u003eentry.server\\u003c/code\\u003e via \\u003ccode\\u003eremix reveal entry.server\\u003c/code\\u003e, and the template entry.server files have been updated with an example approach for newly created Remix apps\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e - Fix adapter logic for aborting \\u003ccode\\u003erequest.signal\\u003c/code\\u003e so we don't incorrectly abort on the \\u003ccode\\u003eclose\\u003c/code\\u003e event for successful requests (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10046\\\\\\\"\\u003e#10046\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix bug with \\u003ccode\\u003eclientLoader.hydrate\\u003c/code\\u003e in a layout route when hydrating with bubbled errors (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/10063\\\\\\\"\\u003e#10063\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-4\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-4\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.27.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.27.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.20.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-2\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-2\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/create-remix/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-architect/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare-pages/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare-workers/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-css-bundle/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-deno/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-dev/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-eslint-config/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-express/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-node/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-react/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-serve/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-server-runtime/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-testing/CHANGELOG.md#2130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.12.1...remix@2.13.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.12.1...v2.13.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2121\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2121\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.12.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-09-19\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-16\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-16\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Properly abort \\u003ccode\\u003erequest.signal\\u003c/code\\u003e during \\u003ccode\\u003evite dev\\u003c/code\\u003e when the node response is closed (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9976\\\\\\\"\\u003e#9976\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - CSS imports with \\u003ccode\\u003e?inline\\u003c/code\\u003e, \\u003ccode\\u003e?inline-css\\u003c/code\\u003e and \\u003ccode\\u003e?raw\\u003c/code\\u003e are no longer incorrectly injected during SSR in development (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9910\\\\\\\"\\u003e#9910\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Single Fetch: Fix types when \\u003ccode\\u003eloader\\u003c/code\\u003e, \\u003ccode\\u003eaction\\u003c/code\\u003e, \\u003ccode\\u003eclientLoader\\u003c/code\\u003e, or \\u003ccode\\u003eclientAction\\u003c/code\\u003e return a mixture of bare objects, \\u003ccode\\u003ejson(...)\\u003c/code\\u003e, \\u003ccode\\u003edefer(...)\\u003c/code\\u003e, and \\u003ccode\\u003eunstable_data(...)\\u003c/code\\u003e. (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9999\\\\\\\"\\u003e#9999\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e/\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e/\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e - Single Fetch: Re-export \\u003ccode\\u003einterface Future\\u003c/code\\u003e through runtime packages so that \\u003ccode\\u003epnpm\\u003c/code\\u003e doesn't complain about \\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e not being a dependency (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9982\\\\\\\"\\u003e#9982\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf you've already opted into Single Fetch, you can change your \\u003ca href=\\\\\\\"https://remix.run/docs/guides/single-fetch#enable-single-fetch-types\\\\\\\"\\u003eSingle Fetch type augmentation\\u003c/a\\u003e in \\u003ccode\\u003evite.config.ts\\u003c/code\\u003e to augment \\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e (or \\u003ccode\\u003ecloudflare\\u003c/code\\u003e/\\u003ccode\\u003edeno\\u003c/code\\u003e) instead of \\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-3\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-3\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-cloudflare/CHANGELOG.md#2121\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-deno/CHANGELOG.md#2121\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-dev/CHANGELOG.md#2121\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-node/CHANGELOG.md#2121\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-server-runtime/CHANGELOG.md#2121\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.12.0...remix@2.12.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.12.0...v2.12.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2120\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2120\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.12.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-09-09\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-1\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-1\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"future-flag-for-automatic-dependency-optimization-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#future-flag-for-automatic-dependency-optimization-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eFuture Flag for Automatic Dependency Optimization (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eYou can now opt-in to automatic dependency optimization during development by using the \\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e future flag. For details, check out the docs at \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/guides/dependency-optimization\\\\\\\"\\u003eGuides \\u003e Dependency optimization\\u003c/a\\u003e. For users who were previously working around this limitation, you no longer need to explicitly add routes to Vite's \\u003ccode\\u003eoptimizeDeps.entries\\u003c/code\\u003e nor do you need to disable the \\u003ccode\\u003eremix-dot-server\\u003c/code\\u003e plugin.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"improved-single-fetch-type-safety-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#improved-single-fetch-type-safety-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eImproved Single Fetch Type Safety (unstable)\\u003c/h4\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf you were already using single-fetch types:\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemove the \\u003ccode\\u003e\\\\\\\"@remix-run/react/future/single-fetch.d.ts\\\\\\\"\\u003c/code\\u003e override from \\u003ccode\\u003etsconfig.json\\u003c/code\\u003e \\u003e \\u003ccode\\u003ecompilerOptions\\u003c/code\\u003e \\u003e \\u003ccode\\u003etypes\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemove \\u003ccode\\u003edefineLoader\\u003c/code\\u003e, \\u003ccode\\u003edefineAction\\u003c/code\\u003e, \\u003ccode\\u003edefineClientLoader\\u003c/code\\u003e, \\u003ccode\\u003edefineClientAction\\u003c/code\\u003e helpers from your route modules\\u003c/li\\u003e\\\\n\\u003cli\\u003eReplace \\u003ccode\\u003eUIMatch_SingleFetch\\u003c/code\\u003e type helper with the original \\u003ccode\\u003eUIMatch\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eReplace \\u003ccode\\u003eMetaArgs_SingleFetch\\u003c/code\\u003e type helper with the original \\u003ccode\\u003eMetaArgs\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003eThen you are ready for the new type safety setup:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// vite.config.ts\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003edeclare\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003emodule\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e@remix-run/server-runtime\\u003c/span\\u003e\\\\\\\" {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003einterface\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eFuture\\u003c/span\\u003e {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eunstable_singleFetch\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e:\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0C)\\\\\\\"\\u003etrue\\u003c/span\\u003e; \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// 👈 enable _types_ for single-fetch\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e }\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e}\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003edefault\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e plugins: [\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eremix\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e future: {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e unstable_singleFetch: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003etrue\\u003c/span\\u003e, \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// 👈 enable single-fetch\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"14\\\\\\\"\\u003e },\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"15\\\\\\\"\\u003e }),\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"16\\\\\\\"\\u003e ],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"17\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eFor more information, see \\u003ca href=\\\\\\\"https://remix.run/docs/guides/single-fetch\\\\\\\"\\u003eGuides \\u003e Single Fetch\\u003c/a\\u003e in our docs.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"updates-to-single-fetch-revalidation-behavior-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updates-to-single-fetch-revalidation-behavior-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdates to Single Fetch Revalidation Behavior (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWith Single Fetch, re-used routes will now revalidate by default on \\u003ccode\\u003eGET\\u003c/code\\u003e navigations. This is aimed at improving caching of Single Fetch calls in the simple case while still allowing users to opt-into the previous behavior for more advanced use cases.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWith this new behavior, requests do not need special query params for granular route revalidations out of the box - i.e., \\u003ccode\\u003eGET /a/b/c.data\\u003c/code\\u003e\\u003c/p\\u003e\\\\n\\u003cp\\u003eThere are two conditions that will trigger granular revalidation and will exclude certain routes from the single fetch call:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf a route opts out of revalidation via \\u003ccode\\u003eshouldRevalidate\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf a route defines a \\u003ccode\\u003eclientLoader\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf you call \\u003ccode\\u003eserverLoader()\\u003c/code\\u003e from your \\u003ccode\\u003eclientLoader\\u003c/code\\u003e, that will make a separate HTTP call for just that route loader - i.e., \\u003ccode\\u003eGET /a/b/c.data?_routes=routes/a\\u003c/code\\u003e for a \\u003ccode\\u003eclientLoader\\u003c/code\\u003e in \\u003ccode\\u003eroutes/a.tsx\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003eWhen one or more routes are excluded from the Single Fetch call, the remaining routes that have loaders are included as query params. For example, when navigating to \\u003ccode\\u003e/a/b/c\\u003c/code\\u003e, if A was excluded, and the \\u003ccode\\u003eroot\\u003c/code\\u003e route and \\u003ccode\\u003eroutes/b\\u003c/code\\u003e had a \\u003ccode\\u003eloader\\u003c/code\\u003e but \\u003ccode\\u003eroutes/c\\u003c/code\\u003e did not, the Single Fetch request would be \\u003ccode\\u003eGET /a/b/c.data?_routes=root,routes/b\\u003c/code\\u003e.\\u003c/p\\u003e\\\\n\\u003cp\\u003eFor more information, see \\u003ca href=\\\\\\\"https://remix.run/docs/guides/single-fetch\\\\\\\"\\u003eGuides \\u003e Single Fetch\\u003c/a\\u003e in our docs.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-4\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-4\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - New \\u003ccode\\u003efuture.unstable_optimizeDeps\\u003c/code\\u003e flag for automatic dependency optimization (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9921\\\\\\\"\\u003e#9921\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-17\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-17\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Handle circular dependencies in modulepreload manifest generation (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9917\\\\\\\"\\u003e#9917\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix \\u003ccode\\u003edest already exists\\u003c/code\\u003e build errors by only moving SSR assets to the client build directory when they're not already present on disk (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9901\\\\\\\"\\u003e#9901\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Clarify wording in default \\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e console warning (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9899\\\\\\\"\\u003e#9899\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Remove hydration URL check that was originally added for React 17 hydration issues and we no longer support React 17 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9890\\\\\\\"\\u003e#9890\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eReverts the logic originally added in Remix \\u003ccode\\u003ev1.18.0\\u003c/code\\u003e via \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6409\\\\\\\"\\u003e#6409\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis was added to resolve an issue that could arise when doing quick back/forward history navigations while JS was loading which would cause a mismatch between the server matches and client matches: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/issues/1757\\\\\\\"\\u003e#1757\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis specific hydration issue would then cause this React v17 only looping issue: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/issues/1678\\\\\\\"\\u003e#1678\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe URL comparison that we added in \\u003ccode\\u003e1.18.0\\u003c/code\\u003e turned out to be subject to false positives of it's own which could also put the user in looping scenarios\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemix v2 upgraded it's minimal React version to v18 which eliminated the v17 hydration error loop\\u003c/li\\u003e\\\\n\\u003cli\\u003eReact v18 handles this hydration error like any other error and does not result in a loop\\u003c/li\\u003e\\\\n\\u003cli\\u003eSo we can remove our check and thus avoid the false-positive scenarios in which it may also trigger a loop\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Lazy Route Discovery: Sort \\u003ccode\\u003e/__manifest\\u003c/code\\u003e query parameters for better caching (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9888\\\\\\\"\\u003e#9888\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Improved type safety (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9893\\\\\\\"\\u003e#9893\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Fix revalidation behavior bugs (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9938\\\\\\\"\\u003e#9938\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Do not render or try to include a body for 304 responses on document requests (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9955\\\\\\\"\\u003e#9955\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Do not try to encode a \\u003ccode\\u003eturbo-stream\\u003c/code\\u003e body into 304 responses (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9941\\\\\\\"\\u003e#9941\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Change content type on \\u003ccode\\u003e.data\\u003c/code\\u003e requests to \\u003ccode\\u003etext/x-script\\u003c/code\\u003e to allow Cloudflare compression (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9889\\\\\\\"\\u003e#9889\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-5\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-5\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.2\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.26.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1192\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.19.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-4\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-4\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-dev/CHANGELOG.md#2120\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-react/CHANGELOG.md#2120\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-server-runtime/CHANGELOG.md#2120\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.11.2...remix@2.12.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.11.2...v2.12.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2112\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2112\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.11.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-08-15\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-18\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-18\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fog of War: Simplify implementation now that React Router handles slug/splat edge cases and tracks previously discovered routes (see \\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/pull/11883\\\\\\\"\\u003ehttps://github.com/remix-run/react-router/pull/11883\\u003c/a\\u003e) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9860\\\\\\\"\\u003e#9860\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ This changes the return signature of the internal \\u003ccode\\u003e/__manifest\\u003c/code\\u003e endpoint since we no longer need the \\u003ccode\\u003enotFoundPaths\\u003c/code\\u003e field\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fog of War: Update to use renamed \\u003ccode\\u003eunstable_patchRoutesOnNavigation\\u003c/code\\u003e function in RR (see \\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/pull/11888\\\\\\\"\\u003ehttps://github.com/remix-run/react-router/pull/11888\\u003c/a\\u003e) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9860\\\\\\\"\\u003e#9860\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Fix redirects when a \\u003ccode\\u003ebasename\\u003c/code\\u003e is present (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9848\\\\\\\"\\u003e#9848\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Update \\u003ccode\\u003eturbo-stream\\u003c/code\\u003e to \\u003ccode\\u003ev2.3.0\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9856\\\\\\\"\\u003e#9856\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eStabilize object key order for serialized payloads\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemove memory limitations payloads sizes\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-6\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-6\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.26.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1191\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.19.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-5\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-5\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.2/packages/remix-react/CHANGELOG.md#2112\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.2/packages/remix-server-runtime/CHANGELOG.md#2112\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.11.1...remix@2.11.2\\\\\\\"\\u003e\\u003ccode\\u003ev2.11.1...v2.11.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2111\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2111\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.11.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-08-05\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-19\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-19\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Revert #9695, stop infinite reload (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/commit/a7cffe5733c8b7d0f29bd2d8606876c537d87101\\\\\\\"\\u003e\\u003ccode\\u003ea7cffe57\\u003c/code\\u003e\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-6\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-6\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.1/packages/remix-react/CHANGELOG.md#2111\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.11.0...remix@2.11.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.11.0...v2.11.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2110\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2110\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.11.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-08-01\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-2\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-2\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"renamed-unstable_fogofwar-future-flag-to-unstable_lazyroutediscovery-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#renamed-unstable_fogofwar-future-flag-to-unstable_lazyroutediscovery-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eRenamed \\u003ccode\\u003eunstable_fogOfWar\\u003c/code\\u003e future flag to \\u003ccode\\u003eunstable_lazyRouteDiscovery\\u003c/code\\u003e (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe found that the \\u003ccode\\u003efuture.unstable_fogOfWar\\u003c/code\\u003e flag name could be a bit confusing without the proper context (notably, the \\u003ca href=\\\\\\\"https://remix.run/blog/fog-of-war\\\\\\\"\\u003eblog post\\u003c/a\\u003e), so we've renamed the flag to \\u003ccode\\u003efuture.unstable_lazyRouteDiscovery\\u003c/code\\u003e for clarity. If you had opted into this feature already, please update the name of the flag in your \\u003ccode\\u003evite.config.ts\\u003c/code\\u003e file (or \\u003ccode\\u003eremix.config.js\\u003c/code\\u003e).\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"removed-response-stub-in-single-fetch-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#removed-response-stub-in-single-fetch-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eRemoved \\u003ccode\\u003eresponse\\u003c/code\\u003e stub in Single Fetch (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eThe original Single Fetch approach was based on an assumption that an eventual \\u003ccode\\u003emiddleware\\u003c/code\\u003e implementation would require something like the \\u003ccode\\u003eResponseStub\\u003c/code\\u003e API so users could mutate \\u003ccode\\u003estatus\\u003c/code\\u003e/\\u003ccode\\u003eheaders\\u003c/code\\u003e in \\u003ccode\\u003emiddleware\\u003c/code\\u003e before/after handlers as well as during handlers. As part of Single Fetch, we wanted to align how response headers would be merged between document and data requests. Thinking \\u003ccode\\u003eresponse\\u003c/code\\u003e was the future API, we aligned document requests to use the \\u003ccode\\u003eresponse\\u003c/code\\u003e stub that data requests were using, and we stopped using the \\u003ccode\\u003eheaders()\\u003c/code\\u003e function.\\u003c/p\\u003e\\\\n\\u003cp\\u003eHowever, the realization/alignment between Michael and Ryan on the recent \\u003ca href=\\\\\\\"https://www.youtube.com/watch?v=f5z_axCofW0\\\\\\\"\\u003eroadmap planning\\u003c/a\\u003e made us realize that the original assumption was incorrect. \\u003ccode\\u003emiddleware\\u003c/code\\u003e won't need a \\u003ccode\\u003eresponse\\u003c/code\\u003e stub - as users can just mutate the \\u003ccode\\u003eResponse\\u003c/code\\u003e they get from \\u003ccode\\u003eawait next()\\u003c/code\\u003e directly.\\u003c/p\\u003e\\\\n\\u003cp\\u003eRemoving that assumption, and still wanting to align how headers get merged between document and data requests, it makes more sense to stick with the current \\u003ccode\\u003eheaders()\\u003c/code\\u003e API and align Single Fetch data requests to use that existing API. This was we don't need to introduce any new header-related APIs which will make the adoption of Single Fetch much easier.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWith this change:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThe \\u003ccode\\u003eheaders()\\u003c/code\\u003e function will let you control header merging for both document and data requests\\u003c/li\\u003e\\\\n\\u003cli\\u003eIn most cases, if you were returning \\u003ccode\\u003ejson()\\u003c/code\\u003e/\\u003ccode\\u003edefer()\\u003c/code\\u003e \\u003cem\\u003ewithout\\u003c/em\\u003e setting a custom \\u003ccode\\u003estatus\\u003c/code\\u003e or \\u003ccode\\u003eheaders\\u003c/code\\u003e, you can just remove those utility functions and return the raw data\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e❌ \\u003ccode\\u003ereturn json({ data: \\\\\\\"whatever\\\\\\\" });\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e✅ \\u003ccode\\u003ereturn { data: \\\\\\\"whatever\\\\\\\" };\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf you \\u003cem\\u003ewere\\u003c/em\\u003e returning a custom \\u003ccode\\u003estatus\\u003c/code\\u003e or \\u003ccode\\u003eheaders\\u003c/code\\u003e via \\u003ccode\\u003ejson\\u003c/code\\u003e/\\u003ccode\\u003edefer\\u003c/code\\u003e:\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eWe've added a new API-compatible \\u003ca href=\\\\\\\"https://remix.run/docs/utils/data\\\\\\\"\\u003e\\u003ccode\\u003eunstable_data\\u003c/code\\u003e\\u003c/a\\u003e utility that will let you send back \\u003ccode\\u003estatus\\u003c/code\\u003e/\\u003ccode\\u003eheaders\\u003c/code\\u003e alongside your raw data without having to encode it into a \\u003ccode\\u003eResponse\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eWe will be removing both \\u003ccode\\u003ejson\\u003c/code\\u003e and \\u003ccode\\u003edefer\\u003c/code\\u003e in the next major version, but both \\u003cem\\u003eshould\\u003c/em\\u003e still work in Single Fetch in v2 to allow for incremental adoption of the new behavior\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e⚠️ If you've already adopted Single Fetch in it's unstable state and converted to \\u003ccode\\u003eresponse\\u003c/code\\u003e stub, you'll need to move those changes back to leveraging the \\u003ccode\\u003eheaders()\\u003c/code\\u003e API.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-5\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-5\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fog of War: Rename \\u003ccode\\u003efuture.unstable_fogOfWar\\u003c/code\\u003e to \\u003ccode\\u003efuture.unstable_lazyRouteDiscovery\\u003c/code\\u003e for clarity (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9763\\\\\\\"\\u003e#9763\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Add a new \\u003ccode\\u003ereplace(url, init?)\\u003c/code\\u003e alternative to \\u003ccode\\u003eredirect(url, init?)\\u003c/code\\u003e that performs a \\u003ccode\\u003ehistory.replaceState\\u003c/code\\u003e instead of a \\u003ccode\\u003ehistory.pushState\\u003c/code\\u003e on client-side navigation redirects (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9764\\\\\\\"\\u003e#9764\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Add a new \\u003ccode\\u003eunstable_data()\\u003c/code\\u003e API as a replacement for \\u003ccode\\u003ejson\\u003c/code\\u003e/\\u003ccode\\u003edefer\\u003c/code\\u003e when custom \\u003ccode\\u003estatus\\u003c/code\\u003e/\\u003ccode\\u003eheaders\\u003c/code\\u003e are needed (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9769\\\\\\\"\\u003e#9769\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Remove \\u003ccode\\u003eresponseStub\\u003c/code\\u003e in favor of \\u003ccode\\u003eheaders\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9769\\\\\\\"\\u003e#9769\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-20\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-20\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Handle absolute Vite base URLs (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9700\\\\\\\"\\u003e#9700\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Change initial hydration route mismatch from a URL check to a matches check to be resistant to URL inconsistencies (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9695\\\\\\\"\\u003e#9695\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Ensure calls don't include any trailing slash from the pathname (i.e., \\u003ccode\\u003e/path/.data\\u003c/code\\u003e) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9792\\\\\\\"\\u003e#9792\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Add \\u003ccode\\u003eundefined\\u003c/code\\u003e to the \\u003ccode\\u003euseRouteLoaderData\\u003c/code\\u003e type override (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9796\\\\\\\"\\u003e#9796\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-7\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-7\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.26.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1190\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.19.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-7\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-7\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/create-remix/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-architect/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare-pages/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare-workers/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-css-bundle/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-deno/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-dev/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-eslint-config/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-express/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-node/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-react/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-serve/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-server-runtime/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-testing/CHANGELOG.md#2110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.10.3...remix@2.11.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.10.3...v2.11.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2103\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2103\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.10.3\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-07-16\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-21\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-21\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e - Manually joining headers with semi-colons to avoid differences in Remix and node/undici Headers implementation (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9664\\\\\\\"\\u003e#9664\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Log any errors encountered loading a route module prior to reloading the page (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8932\\\\\\\"\\u003e#8932\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch (unstable): Proxy \\u003ccode\\u003erequest.signal\\u003c/code\\u003e through \\u003ccode\\u003edataStrategy\\u003c/code\\u003e for \\u003ccode\\u003eloader\\u003c/code\\u003e calls to fix cancellation (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9738\\\\\\\"\\u003e#9738\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch (unstable): Adopt React Router's stabilized \\u003ccode\\u003efuture.v7_skipActionErrorRevalidation\\u003c/code\\u003e under the hood (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9706\\\\\\\"\\u003e#9706\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis stabilizes the \\u003ccode\\u003eshouldRevalidate\\u003c/code\\u003e parameter from \\u003ccode\\u003eunstable_actionStatus\\u003c/code\\u003e to \\u003ccode\\u003eactionStatus\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e⚠️ This might be a breaking change for your app if you have opted into single fetch and the \\u003ccode\\u003eunstable_actionStatus\\u003c/code\\u003e parameter\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-8\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-8\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.25.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.25.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1180\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.18.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-8\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-8\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/create-remix/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-architect/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare-pages/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare-workers/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-css-bundle/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-deno/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-dev/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-eslint-config/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-express/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-node/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-react/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-serve/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-server-runtime/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-testing/CHANGELOG.md#2103\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.10.2...remix@2.10.3\\\\\\\"\\u003e\\u003ccode\\u003ev2.10.2...v2.10.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2102\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2102\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.10.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-07-04\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-22\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-22\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Forward \\u003ccode\\u003eref\\u003c/code\\u003e to \\u003ccode\\u003eForm\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/commit/bdd04217713292307078a30dab9033926d48ede6\\\\\\\"\\u003e\\u003ccode\\u003ebdd04217\\u003c/code\\u003e\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Fix bug with \\u003ccode\\u003eimmutable\\u003c/code\\u003e headers on raw native \\u003ccode\\u003efetch\\u003c/code\\u003e responses returned from loaders (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9693\\\\\\\"\\u003e#9693\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-9\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-9\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/create-remix/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-architect/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare-pages/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare-workers/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-css-bundle/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-deno/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-dev/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-eslint-config/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-express/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-node/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-react/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-serve/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-server-runtime/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-testing/CHANGELOG.md#2102\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.10.1...remix@2.10.2\\\\\\\"\\u003e\\u003ccode\\u003ev2.10.1...v2.10.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2101\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2101\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.10.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-07-03\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-23\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-23\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fog of War (unstable): Support route discovery from \\u003ccode\\u003e\\u0026#x3C;Form\\u003e\\u003c/code\\u003e components (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9665\\\\\\\"\\u003e#9665\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fog of War (unstable): Don't discover links/forms with \\u003ccode\\u003ereloadDocument\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9686\\\\\\\"\\u003e#9686\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-9\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-9\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.24.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.24.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1171\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.17.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-10\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-10\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/create-remix/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-architect/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare-pages/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare-workers/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-css-bundle/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-deno/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-dev/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-eslint-config/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-express/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-node/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-react/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-serve/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-server-runtime/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-testing/CHANGELOG.md#2101\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.10.0...remix@2.10.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.10.0...v2.10.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v2100\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v2100\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.10.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-06-25\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-3\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-3\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"lazy-route-discovery-aka-fog-of-war\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#lazy-route-discovery-aka-fog-of-war\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eLazy Route Discovery (a.k.a. \\\\\\\"Fog of War\\\\\\\")\\u003c/h4\\u003e\\\\n\\u003cp\\u003eThe \\\\\\\"Fog of War\\\\\\\" feature in Remix, now available through the \\u003ccode\\u003efuture.unstable_fogOfWar\\u003c/code\\u003e flag, is an optimization to reduce the up front size of the Remix route manifest. In most scenarios the Remix route manifest isn't prohibitively large so as to impact initial perf metrics, but at scale we've found that some apps can generate large manifests that are expensive to download and execute on app startup.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWhen Fog of War is enabled, Remix will only include the initially server-rendered routes in the manifest and then it will fetch manifest \\\\\\\"patches\\\\\\\" for outgoing links as the user navigates around. By default, to avoid waterfalls Remix fetches patches for all rendered links, so that in the ideal case they've already been patched in prior to being clicked. If a user clicks a link before this eager discovery completes, then a small waterfall will occur to first \\\\\\\"discover\\\\\\\" the route, and then navigate to the route.\\u003c/p\\u003e\\\\n\\u003cp\\u003eEnabling this flag should require no application code changes. For more information, please see the \\u003ca href=\\\\\\\"https://remix.run/docs/guides/fog-of-war\\\\\\\"\\u003edocumentation\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-6\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-6\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdd support for Lazy Route Discovery (a.k.a. Fog of War) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9600\\\\\\\"\\u003e#9600\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9619\\\\\\\"\\u003e#9619\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-24\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-24\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/{dev|express|serve}\\u003c/code\\u003e - Upgrade \\u003ccode\\u003eexpress\\u003c/code\\u003e dependency to \\u003ccode\\u003e^4.19.2\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9184\\\\\\\"\\u003e#9184\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Don't prefetch server \\u003ccode\\u003eloader\\u003c/code\\u003e data when \\u003ccode\\u003eclientLoader\\u003c/code\\u003e exists (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9580\\\\\\\"\\u003e#9580\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Avoid hydration loops when \\u003ccode\\u003eLayout\\u003c/code\\u003e/\\u003ccode\\u003eErrorBoundary\\u003c/code\\u003e renders also throw (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9566\\\\\\\"\\u003e#9566\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix a hydration bug when using child routes and \\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e components with a \\u003ccode\\u003ebasename\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9584\\\\\\\"\\u003e#9584\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/{server-runtime|react}\\u003c/code\\u003e - Single Fetch: Update to \\u003ccode\\u003eturbo-stream@2.2.0\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9562\\\\\\\"\\u003e#9562\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Properly handle thrown 4xx/5xx response stubs (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9501\\\\\\\"\\u003e#9501\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Change redirects to use a 202 status to avoid automatic caching (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9564\\\\\\\"\\u003e#9564\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Fix issues with returning or throwing a response stub from a resource route in single fetch (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9488\\\\\\\"\\u003e#9488\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Fix error when returning \\u003ccode\\u003enull\\u003c/code\\u003e from a resource route (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9488\\\\\\\"\\u003e#9488\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-10\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-10\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.24.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.24.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#117\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.17.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-11\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-11\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/create-remix/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-architect/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare-pages/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare-workers/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-css-bundle/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-deno/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-dev/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-eslint-config/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-express/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-node/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-react/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-serve/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-server-runtime/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-testing/CHANGELOG.md#2100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.9.2...remix@2.10.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.9.2...v2.10.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v292\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v292\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.9.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-05-10\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-4\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-4\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"updated-type-safety-for-single-fetch\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-type-safety-for-single-fetch\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Type-Safety for Single Fetch\\u003c/h4\\u003e\\\\n\\u003cp\\u003eIn 2.9.2 we've enhanced the type-safety when opting into the \\u003ccode\\u003efuture.unstable_singleFetch\\u003c/code\\u003e feature. Previously, we added the \\u003ccode\\u003eresponse\\u003c/code\\u003e stub to \\u003ccode\\u003eLoaderFunctionArgs\\u003c/code\\u003e and used type overrides for inference on \\u003ccode\\u003euseLoaderData\\u003c/code\\u003e, etc., but we found that it wasn't quite enough.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWith this release we're introducing new functions to assist the type-inference when using single fetch - \\u003ccode\\u003edefineLoader\\u003c/code\\u003e/\\u003ccode\\u003edefineAction\\u003c/code\\u003e and their client-side counterparts \\u003ccode\\u003edefineClientLoader\\u003c/code\\u003e and nd \\u003ccode\\u003edefineClientAction\\u003c/code\\u003e. These are identity functions; they don't modify your loader or action at runtime. Rather, they exist solely for type-safety by providing types for args and by ensuring valid return types.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003econst\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eloader\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003edefineLoader\\u003c/span\\u003e(({ \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003erequest\\u003c/span\\u003e }) \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003e=\\u003e\\u003c/span\\u003e {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// ^? Request\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003ereturn\\u003c/span\\u003e { a: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003e1\\u003c/span\\u003e, \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eb\\u003c/span\\u003e: () \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003e=\\u003e\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003e2\\u003c/span\\u003e };\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// ^ type error: `b` is not serializable\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eNote that \\u003ccode\\u003edefineLoader\\u003c/code\\u003e and \\u003ccode\\u003edefineAction\\u003c/code\\u003e are not technically necessary for defining loaders and actions if you aren't concerned with type-safety:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// this totally works! and typechecking is happy too!\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003econst\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eloader\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e () \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003e=\\u003e\\u003c/span\\u003e {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003ereturn\\u003c/span\\u003e { a: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003e1\\u003c/span\\u003e };\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e};\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eThis means that you can opt-in to \\u003ccode\\u003edefineLoader\\u003c/code\\u003e incrementally, one loader at a time.\\u003c/p\\u003e\\\\n\\u003cp\\u003ePlease see the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/guides/single-fetch\\\\\\\"\\u003eSingle Fetch docs\\u003c/a\\u003e for more information.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-25\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-25\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix \\u003ccode\\u003edest already exists\\u003c/code\\u003e error when running \\u003ccode\\u003eremix vite:build\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9305\\\\\\\"\\u003e#9305\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix issue resolving critical CSS during development when route files are located outside of the app directory (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9194\\\\\\\"\\u003e#9194\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Remove \\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e from Vite plugin's \\u003ccode\\u003eoptimizeDeps.include\\u003c/code\\u003e list since it was unnecessary and resulted in Vite warnings when not depending on this package (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9287\\\\\\\"\\u003e#9287\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Clean up redundant \\u003ccode\\u003e?client-route=1\\u003c/code\\u003e imports in development (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9395\\\\\\\"\\u003e#9395\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Ensure Babel config files are not referenced when applying the \\u003ccode\\u003ereact-refresh\\u003c/code\\u003e Babel transform within the Remix Vite plugin (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9241\\\\\\\"\\u003e#9241\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Type-safety for single-fetch: \\u003ccode\\u003edefineLoader\\u003c/code\\u003e, \\u003ccode\\u003edefineClientLoader\\u003c/code\\u003e, \\u003ccode\\u003edefineAction\\u003c/code\\u003e, \\u003ccode\\u003edefineClientAction\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9372\\\\\\\"\\u003e#9372\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Add \\u003ccode\\u003eundefined\\u003c/code\\u003e to \\u003ccode\\u003euseActionData\\u003c/code\\u003e type override (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9322\\\\\\\"\\u003e#9322\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Single Fetch: Allow a \\u003ccode\\u003enonce\\u003c/code\\u003e to be set on single fetch stream transfer inline scripts via \\u003ccode\\u003e\\u0026#x3C;RemixServer\\u003e\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9364\\\\\\\"\\u003e#9364\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Don't log thrown response stubs via \\u003ccode\\u003ehandleError\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9369\\\\\\\"\\u003e#9369\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Automatically wrap resource route naked object returns in \\u003ccode\\u003ejson()\\u003c/code\\u003e for back-compat in v2 (and log deprecation warning) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9349\\\\\\\"\\u003e#9349\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Single Fetch: Pass \\u003ccode\\u003eresponse\\u003c/code\\u003e stub to resource route handlers (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9349\\\\\\\"\\u003e#9349\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-11\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-11\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.23.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.23.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1161\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.16.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-12\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-12\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare-pages/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare-workers/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-css-bundle/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-deno/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-dev/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-eslint-config/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-express/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-node/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-react/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-serve/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-server-runtime/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-testing/CHANGELOG.md#292\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.9.1...remix@2.9.2\\\\\\\"\\u003e\\u003ccode\\u003ev2.9.1...v2.9.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v291\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v291\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.9.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-04-24\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-26\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-26\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix issue where consumers who had added Remix packages to Vite's \\u003ccode\\u003essr.noExternal\\u003c/code\\u003e option were being overridden by the Remix Vite plugin adding Remix packages to Vite's \\u003ccode\\u003essr.external\\u003c/code\\u003e option (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9301\\\\\\\"\\u003e#9301\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Ignore \\u003ccode\\u003efuture/*.d.ts\\u003c/code\\u003e files from TS build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9299\\\\\\\"\\u003e#9299\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-13\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-13\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.1/packages/remix-dev/CHANGELOG.md#291\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.1/packages/remix-react/CHANGELOG.md#291\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.9.0...remix@2.9.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.9.0...v2.9.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v290\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v290\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.9.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-04-23\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-5\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-5\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"single-fetch-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#single-fetch-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eSingle Fetch (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e2.9.0\\u003c/code\\u003e introduces a \\u003ccode\\u003efuture.unstable_singleFetch\\u003c/code\\u003e flag to enable to Single Fetch behavior (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/7640\\\\\\\"\\u003eRFC\\u003c/a\\u003e) in your Remix application. Please refer to the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/guides/single-fetch\\\\\\\"\\u003edocs\\u003c/a\\u003e for the full detail but the high-level changes to be aware of include:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNaked objects returned from \\u003ccode\\u003eloader\\u003c/code\\u003e/\\u003ccode\\u003eaction\\u003c/code\\u003e functions are no longer automatically serialized to JSON responses\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eInstead, they'll be streamed as-is via \\u003ca href=\\\\\\\"https://github.com/jacob-ebey/turbo-stream\\\\\\\"\\u003e\\u003ccode\\u003eturbo-stream\\u003c/code\\u003e\\u003c/a\\u003e which allows direct serialization of more complex types such as \\u003ccode\\u003ePromise\\u003c/code\\u003e, \\u003ccode\\u003eDate\\u003c/code\\u003e, \\u003ccode\\u003eMap\\u003c/code\\u003e instances, and more\\u003c/li\\u003e\\\\n\\u003cli\\u003eYou will need to modify your \\u003ccode\\u003etsconfig.json\\u003c/code\\u003e's \\u003ccode\\u003ecompilerOptions.types\\u003c/code\\u003e array to infer types properly when using Single Fetch\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe \\u003ccode\\u003eheaders\\u003c/code\\u003e export is no longer used when Single Fetch is enabled in favor of a new \\u003ccode\\u003eresponse\\u003c/code\\u003e stub passed to your \\u003ccode\\u003eloader\\u003c/code\\u003e/\\u003ccode\\u003eaction\\u003c/code\\u003e functions\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe \\u003ccode\\u003ejson\\u003c/code\\u003e/\\u003ccode\\u003edefer\\u003c/code\\u003e/\\u003ccode\\u003eredirect\\u003c/code\\u003e utilities are deprecated when using Single Fetch (but still work \\u003cem\\u003emostly\\u003c/em\\u003e the same)\\u003c/li\\u003e\\\\n\\u003cli\\u003eActions no longer automatically revalidate on \\u003ccode\\u003e4xx\\u003c/code\\u003e/\\u003ccode\\u003e5xx\\u003c/code\\u003e responses - you can return a \\u003ccode\\u003e2xx\\u003c/code\\u003e to opt-into revalidation or use \\u003ccode\\u003eshouldRevalidate\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cblockquote\\u003e\\\\n\\u003cp\\u003e[!IMPORTANT]\\\\nSingle Fetch requires using \\u003ccode\\u003eundici\\u003c/code\\u003e as your fetch polyfill, or using the built-in fetch on Node 20+, because it relies on APIs available there but not in the \\u003ccode\\u003e@remix-run/web-fetch\\u003c/code\\u003e polyfill. Please refer to the \\u003ca href=\\\\\\\"#undici\\\\\\\"\\u003eUndici\\u003c/a\\u003e section below for more details.\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf you are managing your own server and calling \\u003ccode\\u003einstallGlobals()\\u003c/code\\u003e, you will need to call \\u003ccode\\u003einstallGlobals({ nativeFetch: true })\\u003c/code\\u003e to avoid runtime errors when using Single Fetch\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf you are using \\u003ccode\\u003eremix-serve\\u003c/code\\u003e, it will use \\u003ccode\\u003eundici\\u003c/code\\u003e automatically if Single Fetch is enabled\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/blockquote\\u003e\\\\n\\u003ch4 id=\\\\\\\"undici\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#undici\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUndici\\u003c/h4\\u003e\\\\n\\u003cp\\u003eRemix \\u003ccode\\u003e2.9.0\\u003c/code\\u003e adds a new \\u003ccode\\u003einstallGlobals({ nativeFetch: true })\\u003c/code\\u003e flag to opt into using \\u003ca href=\\\\\\\"https://github.com/nodejs/undici\\\\\\\"\\u003e\\u003ccode\\u003eundici\\u003c/code\\u003e\\u003c/a\\u003e for the \\u003ca href=\\\\\\\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\\\\\\\"\\u003eWeb Fetch\\u003c/a\\u003e polyfills instead of the \\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/web-*\\u003c/code\\u003e packages\\u003c/a\\u003e. This change has a few primary benefits:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIt will allow us to stop maintaining our own \\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io\\\\\\\"\\u003eweb-std-io fork\\u003c/a\\u003e in future versions of Remix\\u003c/li\\u003e\\\\n\\u003cli\\u003eIt should bring us more in-line with spec compliance\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ It is possible that some non-spec-compliant bugs in our fork will be \\\\\\\"fixed\\\\\\\" by moving to \\u003ccode\\u003eundici\\u003c/code\\u003e, so beware of \\\\\\\"breaking bug fixes\\\\\\\" and keep an eye on any advanced \\u003ccode\\u003efetch\\u003c/code\\u003e API interactions you're performing in your app\\u003c/li\\u003e\\\\n\\u003cli\\u003e⚠️ In some cases, \\u003ccode\\u003eundici\\u003c/code\\u003e may have different behavior by design -- most notably, \\u003ccode\\u003eundici\\u003c/code\\u003e's garbage collection behavior differs and you are \\u003ca href=\\\\\\\"https://github.com/nodejs/undici?tab=readme-ov-file#garbage-collection\\\\\\\"\\u003erequired to consume all fetch response bodies\\u003c/a\\u003e to avoid a memory leak in your app\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eBecause \\u003ccode\\u003eundici\\u003c/code\\u003e is the fetch implementation used by \\u003ccode\\u003enode\\u003c/code\\u003e internally, it should better prepare Remix apps to more smoothly drop the polyfill to use the built-in Node.js APIs on \\u003ccode\\u003enode\\u003c/code\\u003e 20+\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-7\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-7\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNew \\u003ccode\\u003efuture.unstable_singleFetch\\u003c/code\\u003e flag (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8773\\\\\\\"\\u003e#8773\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9073\\\\\\\"\\u003e#9073\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9084\\\\\\\"\\u003e#9084\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9272\\\\\\\"\\u003e#9272\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e - Add a new \\u003ccode\\u003einstallGlobals({ nativeFetch: true })\\u003c/code\\u003e flag to opt-into using \\u003ca href=\\\\\\\"https://github.com/nodejs/undici\\\\\\\"\\u003e\\u003ccode\\u003eundici\\u003c/code\\u003e\\u003c/a\\u003e as the fetch polyfill instead of \\u003ccode\\u003e@remix-run/web-*\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9106\\\\\\\"\\u003e#9106\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9111\\\\\\\"\\u003e#9111\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9198\\\\\\\"\\u003e#9198\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Add \\u003ccode\\u003eResponseStub\\u003c/code\\u003e header interface and deprecate the \\u003ccode\\u003eheaders\\u003c/code\\u003e export when Single Fetch is enabled (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9142\\\\\\\"\\u003e#9142\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-27\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-27\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e - Allow \\u003ccode\\u003e.\\u003c/code\\u003e in repo name when using \\u003ccode\\u003e--template\\u003c/code\\u003e flag (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9026\\\\\\\"\\u003e#9026\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Improve \\u003ccode\\u003egetDependenciesToBundle\\u003c/code\\u003e resolution in monorepos (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8848\\\\\\\"\\u003e#8848\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix SPA mode when Single Fetch is enabled by using streaming \\u003ccode\\u003eentry.server\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9063\\\\\\\"\\u003e#9063\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: added sourcemap support for transformed routes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8970\\\\\\\"\\u003e#8970\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Update links printed to the console by the Remix CLI/Dev Server to point to updated docs locations (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9176\\\\\\\"\\u003e#9176\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Handle redirects created by \\u003ccode\\u003ehandleDataRequest\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/9104\\\\\\\"\\u003e#9104\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-12\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-12\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.23.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.23.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1160\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.16.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-14\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-14\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/create-remix/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-architect/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare-pages/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare-workers/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-css-bundle/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-deno/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-dev/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-eslint-config/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-express/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-node/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-react/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-serve/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-server-runtime/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-testing/CHANGELOG.md#290\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.8.1...remix@2.9.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.8.1...v2.9.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v281\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v281\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.8.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-03-07\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-28\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-28\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Support reading from Vite config when running \\u003ccode\\u003eremix reveal\\u003c/code\\u003e and \\u003ccode\\u003eremix routes\\u003c/code\\u003e CLI commands (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8916\\\\\\\"\\u003e#8916\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Clean up redundant client route query strings on route JavaScript files in production builds (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8969\\\\\\\"\\u003e#8969\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add vite commands to Remix CLI \\u003ccode\\u003e--help\\u003c/code\\u003e output (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8939\\\\\\\"\\u003e#8939\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix support for \\u003ccode\\u003ebuild.sourcemap\\u003c/code\\u003e option in Vite config (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8965\\\\\\\"\\u003e#8965\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix error when using Vite's \\u003ccode\\u003eserver.fs.allow\\u003c/code\\u003e option without a client entry file (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8966\\\\\\\"\\u003e#8966\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Strengthen the internal \\u003ccode\\u003eLayoutComponent\\u003c/code\\u003e type to accept limited children (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8910\\\\\\\"\\u003e#8910\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-13\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-13\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.3\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.22.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1153\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.15.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-15\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-15\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/create-remix/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-architect/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare-pages/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare-workers/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-css-bundle/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-deno/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-dev/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-eslint-config/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-express/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-node/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-react/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-serve/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-server-runtime/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-testing/CHANGELOG.md#281\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.8.0...remix@2.8.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.8.0...v2.8.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v280\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v280\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.8.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-02-28\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-8\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-8\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Pass resolved \\u003ccode\\u003eviteConfig\\u003c/code\\u003e to Remix Vite plugin's \\u003ccode\\u003ebuildEnd\\u003c/code\\u003e hook (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8885\\\\\\\"\\u003e#8885\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-29\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-29\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Mark \\u003ccode\\u003eLayout\\u003c/code\\u003e as browser safe route export in \\u003ccode\\u003eesbuild\\u003c/code\\u003e compiler (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8842\\\\\\\"\\u003e#8842\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Silence build warnings when dependencies include \\u003ccode\\u003e\\\\\\\"use client\\\\\\\"\\u003c/code\\u003e directives (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8897\\\\\\\"\\u003e#8897\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix \\u003ccode\\u003eserverBundles\\u003c/code\\u003e issue where multiple browser manifests are generated (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8864\\\\\\\"\\u003e#8864\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Support custom \\u003ccode\\u003ebuild.assetsDir\\u003c/code\\u003e option (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8843\\\\\\\"\\u003e#8843\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix the default root \\u003ccode\\u003eErrorBoundary\\u003c/code\\u003e component so it leverages the user-provided \\u003ccode\\u003eLayout\\u003c/code\\u003e component (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8859\\\\\\\"\\u003e#8859\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix the default root \\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e component so it leverages any user-provided \\u003ccode\\u003eLayout\\u003c/code\\u003e component (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8892\\\\\\\"\\u003e#8892\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-14\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-14\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.2\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.22.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1152\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.15.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-16\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-16\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/create-remix/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-architect/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare-pages/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare-workers/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-css-bundle/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-deno/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-dev/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-eslint-config/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-express/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-node/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-react/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-serve/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-server-runtime/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-testing/CHANGELOG.md#280\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.7.2...remix@2.8.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.7.2...v2.8.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"272\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#272\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e2.7.2\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-02-21\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-30\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-30\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix error when building projects with \\u003ccode\\u003e.css?url\\u003c/code\\u003e imports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8829\\\\\\\"\\u003e#8829\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch2 id=\\\\\\\"271\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#271\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e2.7.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-02-20\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-31\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-31\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e - Fix breaking change and restore Cloudflare event context fields in \\u003ccode\\u003egetLoadContext\\u003c/code\\u003e argument for backwards compatibility (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8819\\\\\\\"\\u003e#8819\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch2 id=\\\\\\\"v270\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v270\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.7.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-02-20\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-6\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-6\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"stabilized-vite-plugin\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#stabilized-vite-plugin\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eStabilized Vite Plugin\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe're excited to announce that support for \\u003ca href=\\\\\\\"https://vitejs.dev/\\\\\\\"\\u003eVite\\u003c/a\\u003e is now stable in Remix \\u003ccode\\u003e2.7.0\\u003c/code\\u003e! Ever since the \\u003ca href=\\\\\\\"https://remix.run/blog/remix-heart-vite\\\\\\\"\\u003einitial unstable release of Remix Vite\\u003c/a\\u003e, weve been hard at work refining and extending it over the past few months with help from all of our early adopters and community contributors. This also means that Vite-only features such as \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/future/spa-mode\\\\\\\"\\u003eSPA Mode\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://remix.run/docs/future/server-bundles\\\\\\\"\\u003eServer Bundles\\u003c/a\\u003e, and \\u003ca href=\\\\\\\"https://remix.run/docs/en/dev/future/vite#basename\\\\\\\"\\u003e\\u003ccode\\u003ebasename\\u003c/code\\u003e support\\u003c/a\\u003e are now officially stable as well 😊.\\u003c/p\\u003e\\\\n\\u003cp\\u003eFor more information, check out the \\u003ca href=\\\\\\\"https://remix.run/blog/remix-vite-stable\\\\\\\"\\u003eblog post\\u003c/a\\u003e and the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/future/vite\\\\\\\"\\u003eVite docs\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"new-layout-export\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#new-layout-export\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eNew \\u003ccode\\u003eLayout\\u003c/code\\u003e Export\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe've found that it's \\u003cem\\u003esuper\\u003c/em\\u003e common to create your own component in your root route to hold the shared layout/app shell between your \\u003ccode\\u003eComponent\\u003c/code\\u003e/\\u003ccode\\u003eErrorBoundary\\u003c/code\\u003e/\\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e. This is so common (and can also cause some minor edge-case issues such as a FOUC on hydration) that we've incorporated this as a first-class API in \\u003ccode\\u003e2.7.0\\u003c/code\\u003e.\\u003c/p\\u003e\\\\n\\u003cp\\u003eYou can now export an optional \\u003ccode\\u003eLayout\\u003c/code\\u003e component from your root route which will be provided your route component, ErrorBoundary, or HydrateFallback as it's \\u003ccode\\u003echildren\\u003c/code\\u003e. For more information, please see the \\u003ca href=\\\\\\\"https://remix.run/docs/en/dev/file-conventions/root#layout-export\\\\\\\"\\u003e\\u003ccode\\u003eLayout\\u003c/code\\u003e docs\\u003c/a\\u003e and the \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/8702\\\\\\\"\\u003eRFC\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"basename-support\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#basename-support\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eBasename support\\u003c/h4\\u003e\\\\n\\u003cp\\u003eReact Router has long supported a \\u003ca href=\\\\\\\"https://reactrouter.com/v6/routers/create-browser-router#basename\\\\\\\"\\u003e\\u003ccode\\u003ebasename\\u003c/code\\u003e\\u003c/a\\u003e config that allows you to serve your app within a subpath such as \\u003ccode\\u003ehttp://localhost/myapp/*\\u003c/code\\u003e without having to include the \\u003ccode\\u003e/myapp\\u003c/code\\u003e segment in all of your route paths. This was originally omitted from Remix because v1 nested folders file-convention made it pretty easy to put your route files in a \\u003ccode\\u003eroutes/myapp/\\u003c/code\\u003e folder, giving you the same functionality. There has also been an \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/2891\\\\\\\"\\u003eopen proposal from the community\\u003c/a\\u003e to add this functionality.\\u003c/p\\u003e\\\\n\\u003cp\\u003eTwo things have since changed that made us reconsider the lack of \\u003ccode\\u003ebasename\\u003c/code\\u003e support:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eWe switched to a flat-file based convention in v2, and it gets far less ergonomic to have to prefix all of your route files with \\u003ccode\\u003emyapp.\\u003c/code\\u003e compared to the nested folder convention\\u003c/li\\u003e\\\\n\\u003cli\\u003eWe moved to Vite which has it's own \\u003ccode\\u003ebase\\u003c/code\\u003e config which is often (and easily) confused with the concept of a React Router \\u003ccode\\u003ebasename\\u003c/code\\u003e (when in reality it's more aligned with the old Remix \\u003ccode\\u003epublicPath\\u003c/code\\u003e config)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003eIn \\u003ccode\\u003e2.7.0\\u003c/code\\u003e we've added support for a \\u003ccode\\u003ebasename\\u003c/code\\u003e in the Vite plugin config. For more information, please check out the \\u003ca href=\\\\\\\"https://remix.run/docs/en/dev/future/vite#basename\\\\\\\"\\u003e\\u003ccode\\u003ebasename\\u003c/code\\u003e docs\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003cp\\u003e\\u003cem\\u003eNote: This is a Vite-only feature and is not available via the \\u003ccode\\u003eesbuild\\u003c/code\\u003e compiler.\\u003c/em\\u003e\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"cloudflare-proxy-as-a-vite-plugin\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#cloudflare-proxy-as-a-vite-plugin\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eCloudflare Proxy as a Vite Plugin\\u003c/h4\\u003e\\\\n\\u003cp\\u003e⚠️ This is a breaking change for projects relying on Cloudflare support from the unstable Vite plugin\\u003c/p\\u003e\\\\n\\u003cp\\u003eThe Cloudflare preset (\\u003ccode\\u003eunstable_cloudflarePreset\\u003c/code\\u003e) as been removed and replaced with a new Vite plugin:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e import {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e unstable_vitePlugin as remix,\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e unstable_cloudflarePreset as cloudflare,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e cloudflareDevProxyVitePlugin as remixCloudflareDevProxy,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e } from \\\\\\\"@remix-run/dev\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e import { defineConfig } from \\\\\\\"vite\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e export default defineConfig({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e plugins: [\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e remixCloudflareDevProxy(),\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e remix(),\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e remix({\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e presets: [cloudflare()],\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"14\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e }),\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"15\\\\\\\"\\u003e ],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"16\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e ssr: {\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"17\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e resolve: {\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"18\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e externalConditions: [\\\\\\\"workerd\\\\\\\", \\\\\\\"worker\\\\\\\"],\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"19\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e },\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"20\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e },\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"21\\\\\\\"\\u003e });\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eA few notes on the new plugin:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremixCloudflareDevProxy\\u003c/code\\u003e must come \\u003cem\\u003ebefore\\u003c/em\\u003e the \\u003ccode\\u003eremix\\u003c/code\\u003e plugin so that it can override Vite's dev server middleware to be compatible with Cloudflare's proxied environment\\u003c/li\\u003e\\\\n\\u003cli\\u003eBecause it is a Vite plugin, \\u003ccode\\u003eremixCloudflareDevProxy\\u003c/code\\u003e can set \\u003ccode\\u003essr.resolve.externalConditions\\u003c/code\\u003e to be \\u003ccode\\u003eworkerd\\u003c/code\\u003e-compatible for you\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremixCloudflareDevProxy\\u003c/code\\u003e accepts a \\u003ccode\\u003egetLoadContext\\u003c/code\\u003e function that replaces the old \\u003ccode\\u003egetRemixDevLoadContext\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf you were using a \\u003ccode\\u003enightly\\u003c/code\\u003e version that required \\u003ccode\\u003egetBindingsProxy\\u003c/code\\u003e or \\u003ccode\\u003egetPlatformProxy\\u003c/code\\u003e, that is no longer required\\u003c/li\\u003e\\\\n\\u003cli\\u003eAny options you were passing to \\u003ccode\\u003egetBindingsProxy\\u003c/code\\u003e or \\u003ccode\\u003egetPlatformProxy\\u003c/code\\u003e should now be passed to \\u003ccode\\u003eremixCloudflareDevProxy\\u003c/code\\u003e instead\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis API also better aligns with future plans to support Cloudflare with a framework-agnostic Vite plugin that makes use of Vite's (experimental) Runtime API.\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-9\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-9\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Allow an optional \\u003ccode\\u003eLayout\\u003c/code\\u003e export from the root route (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8709\\\\\\\"\\u003e#8709\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e - Make \\u003ccode\\u003egetLoadContext\\u003c/code\\u003e optional for Cloudflare Pages (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8701\\\\\\\"\\u003e#8701\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eDefaults to \\u003ccode\\u003e(context) =\\u003e ({ env: context })\\u003c/code\\u003e, which is what we used to have in all the templates\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis gives parity with the Cloudflare preset for the Remix Vite plugin and keeps our templates leaner\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Cloudflare Proxy as a Vite plugin (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8749\\\\\\\"\\u003e#8749\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003e⚠️ This is a breaking change for projects relying on Cloudflare support from the unstable Vite plugin\\u003c/strong\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add a new \\u003ccode\\u003ebasename\\u003c/code\\u003e option to the Vite plugin, allowing users to set the internal React Router \\u003ca href=\\\\\\\"https://reactrouter.com/v6/routers/create-browser-router#basename\\\\\\\"\\u003e\\u003ccode\\u003ebasename\\u003c/code\\u003e\\u003c/a\\u003e in order to to serve their applications underneath a subpath (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8145\\\\\\\"\\u003e#8145\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Stabilize the Remix Vite plugin, Cloudflare preset, and all related types by removing all \\u003ccode\\u003eunstable_\\u003c/code\\u003e / \\u003ccode\\u003eUnstable_\\u003c/code\\u003e prefixes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8713\\\\\\\"\\u003e#8713\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eWhile this is a breaking change for existing Remix Vite plugin consumers, now that the plugin has stabilized, there will no longer be any breaking changes outside of a major release. Thank you to all of our early adopters and community contributors for helping us get here! 🙏\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Stabilize \\\\\\\"SPA Mode\\\\\\\" by renaming the Remix vite plugin config from \\u003ccode\\u003eunstable_ssr -\\u003e ssr\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8692\\\\\\\"\\u003e#8692\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-32\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-32\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e - Use \\u003ccode\\u003ereq.originalUrl\\u003c/code\\u003e instead of \\u003ccode\\u003ereq.url\\u003c/code\\u003e so that Remix sees the full URL (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8145\\\\\\\"\\u003e#8145\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemix relies on the knowing the full URL to ensure that server and client code can function together, and does not support URL rewriting prior to the Remix handler\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Fix a bug with SPA mode when the root route had no children (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8747\\\\\\\"\\u003e#8747\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Add a more specific error if a user returns a \\u003ccode\\u003edefer\\u003c/code\\u003e response from a resource route (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8726\\\\\\\"\\u003e#8726\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Always prepend \\u003ccode\\u003eDOCTYPE\\u003c/code\\u003e in SPA mode \\u003ccode\\u003eentry.server.tsx\\u003c/code\\u003e, can opt out via remix reveal (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8725\\\\\\\"\\u003e#8725\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix build issue in SPA mode when using a \\u003ccode\\u003ebasename\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8720\\\\\\\"\\u003e#8720\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Fix type error in Remix config for synchronous \\u003ccode\\u003eroutes\\u003c/code\\u003e function (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8745\\\\\\\"\\u003e#8745\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix issue where client route file requests fail if search params have been parsed and serialized before reaching the Remix Vite plugin (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8740\\\\\\\"\\u003e#8740\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Validate that the MDX Rollup plugin, if present, is placed before Remix in Vite config (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8690\\\\\\\"\\u003e#8690\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix issue resolving critical CSS during development when the current working directory differs from the project root (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8752\\\\\\\"\\u003e#8752\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Require version \\u003ccode\\u003e5.1.0\\u003c/code\\u003e to support \\u003ccode\\u003e.css?url\\u003c/code\\u003e imports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8723\\\\\\\"\\u003e#8723\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Support Vite \\u003ccode\\u003e5.1.0\\u003c/code\\u003e's \\u003ccode\\u003e.css?url\\u003c/code\\u003e imports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8684\\\\\\\"\\u003e#8684\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Enable use of \\u003ca href=\\\\\\\"https://main.vitejs.dev/guide/static-deploy.html#deploying-a-static-site\\\\\\\"\\u003e\\u003ccode\\u003evite preview\\u003c/code\\u003e\\u003c/a\\u003e to preview Remix SPA applications (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8624\\\\\\\"\\u003e#8624\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIn the SPA template, \\u003ccode\\u003enpm run start\\u003c/code\\u003e has been renamed to \\u003ccode\\u003enpm run preview\\u003c/code\\u003e which uses \\u003ccode\\u003evite preview\\u003c/code\\u003e instead of a standalone HTTP server such as \\u003ccode\\u003ehttp-server\\u003c/code\\u003e or \\u003ccode\\u003eserv-cli\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Remove the ability to pass \\u003ccode\\u003epublicPath\\u003c/code\\u003e as an option to the Remix vite plugin (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8145\\\\\\\"\\u003e#8145\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003e⚠️ This is a breaking change for projects using the unstable Vite plugin with a \\u003ccode\\u003epublicPath\\u003c/code\\u003e\\u003c/strong\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis is already handled in Vite via the \\u003ca href=\\\\\\\"https://vitejs.dev/guide/build.html#public-base-path\\\\\\\"\\u003e\\u003ccode\\u003ebase\\u003c/code\\u003e\\u003c/a\\u003e config so we now set the Remix \\u003ccode\\u003epublicPath\\u003c/code\\u003e from the Vite \\u003ccode\\u003ebase\\u003c/code\\u003e config\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Enable HMR for \\u003ccode\\u003e.md\\u003c/code\\u003e and \\u003ccode\\u003e.mdx\\u003c/code\\u003e files (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8711\\\\\\\"\\u003e#8711\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: reliably detect non-root routes in Windows (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8806\\\\\\\"\\u003e#8806\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Pass \\u003ccode\\u003eremixUserConfig\\u003c/code\\u003e to preset \\u003ccode\\u003eremixConfig\\u003c/code\\u003e hook (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8797\\\\\\\"\\u003e#8797\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Ensure CSS file URLs that are only referenced in the server build are available on the client (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8796\\\\\\\"\\u003e#8796\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: fix server exports dead-code elimination for routes outside of app directory (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8795\\\\\\\"\\u003e#8795\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-15\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-15\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.22.Y\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1151\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.15.Y\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-17\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-17\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/create-remix/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-architect/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare-pages/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare-workers/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-css-bundle/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-deno/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-dev/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-eslint-config/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-express/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-node/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-react/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-serve/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-server-runtime/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-testing/CHANGELOG.md#270\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.6.0...remix@2.7.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.6.0...v2.7.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v260\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v260\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.6.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-02-01\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-7\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-7\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"unstable-vite-plugin-updates\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#unstable-vite-plugin-updates\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUnstable Vite Plugin updates\\u003c/h4\\u003e\\\\n\\u003cp\\u003eAs we continue moving towards stabilizing the Vite plugin, we've introduced a few breaking changes to the unstable Vite plugin in this release. Please read the \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e changes below closely and update your app accordingly if you've opted into using the Vite plugin.\\u003c/p\\u003e\\\\n\\u003cp\\u003eWe've also removed the \\u003ccode\\u003eunstable_\\u003c/code\\u003e prefix from the \\u003ccode\\u003eserverBundles\\u003c/code\\u003e option as we're now confident in the API (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8596\\\\\\\"\\u003e#8596\\u003c/a\\u003e).\\u003c/p\\u003e\\\\n\\u003cp\\u003e🎉 And last, but certainly not least - we've added much anticipated Cloudflare support in \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8531\\\\\\\"\\u003e#8531\\u003c/a\\u003e! To get started with Cloudflare, you can use the \\u003ccode\\u003eunstable-vite-cloudflare\\u003c/code\\u003e template:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-nonumber=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"false\\\\\\\" data-lang=\\\\\\\"shellscript\\\\\\\"\\u003e\\u003cpre data-nonumber=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"false\\\\\\\" data-lang=\\\\\\\"shellscript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003enpx\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003ecreate-remix@latest\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e--template\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eremix-run/remix/templates/unstable-vite-cloudflare\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eFor more information, please refer to the docs at \\u003ca href=\\\\\\\"https://remix.run/docs/future/vite#cloudflare\\\\\\\"\\u003eFuture \\u003e Vite \\u003e Cloudflare\\u003c/a\\u003e and \\u003ca href=\\\\\\\"https://remix.run/docs/future/vite#migrating-cloudflare-functions\\\\\\\"\\u003eFuture \\u003e Vite \\u003e Migrating \\u003e Migrating Cloudflare Functions\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-10\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-10\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Add \\u003ccode\\u003efuture.v3_throwAbortReason\\u003c/code\\u003e flag to throw \\u003ccode\\u003erequest.signal.reason\\u003c/code\\u003e when a request is aborted instead of an \\u003ccode\\u003eError\\u003c/code\\u003e such as \\u003ccode\\u003enew Error(\\\\\\\"query() call aborted: GET /path\\\\\\\")\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8251\\\\\\\"\\u003e#8251\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-33\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-33\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e - Unwrap thrown \\u003ccode\\u003eResponse\\u003c/code\\u003e's from \\u003ccode\\u003eentry.server\\u003c/code\\u003e into \\u003ccode\\u003eErrorResponse\\u003c/code\\u003e's and preserve the status code (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8577\\\\\\\"\\u003e#8577\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003emanifest\\u003c/code\\u003e option to Vite plugin to enable writing a \\u003ccode\\u003e.remix/manifest.json\\u003c/code\\u003e file to the build directory (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8575\\\\\\\"\\u003e#8575\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for consumers of the Vite plugin's \\\\\\\"server bundles\\\\\\\" feature\\u003c/strong\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe \\u003ccode\\u003ebuild/server/bundles.json\\u003c/code\\u003e file has been superseded by the more general \\u003ccode\\u003ebuild/.remix/manifest.json\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eWhile the old server bundles manifest was always written to disk when generating server bundles, the build manifest file must be explicitly enabled via the \\u003ccode\\u003emanifest\\u003c/code\\u003e option\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Rely on Vite plugin ordering (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8627\\\\\\\"\\u003e#8627\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eThe Remix plugin expects to process JavaScript or TypeScript files, so any transpilation from other languages must be done first.\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eFor example, that means putting the MDX plugin \\u003cem\\u003ebefore\\u003c/em\\u003e the Remix plugin:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e import mdx from \\\\\\\"@mdx-js/rollup\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e import { unstable_vitePlugin as remix } from \\\\\\\"@remix-run/dev\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e import { defineConfig } from \\\\\\\"vite\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e export default defineConfig({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e plugins: [\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e mdx(),\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e remix()\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e mdx(),\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e ],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e });\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003ePreviously, the Remix plugin misused \\u003ccode\\u003eenforce: \\\\\\\"post\\\\\\\"\\u003c/code\\u003e from Vite's plugin API to ensure that it ran last\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eHowever, this caused other unforeseen issues\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eInstead, we now rely on standard Vite semantics for plugin ordering\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eThe official \\u003ca href=\\\\\\\"https://github.com/vitejs/vite-plugin-react-swc/blob/main/src/index.ts#L97-L116\\\\\\\"\\u003eVite React SWC plugin\\u003c/a\\u003e also relies on plugin ordering for MDX\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Remove interop with \\u003ccode\\u003e\\u0026#x3C;LiveReload /\\u003e\\u003c/code\\u003e, rely on \\u003ccode\\u003e\\u0026#x3C;Scripts /\\u003e\\u003c/code\\u003e instead (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8636\\\\\\\"\\u003e#8636\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eVite provides a robust client-side runtime for development features like HMR, making the \\u003ccode\\u003e\\u0026#x3C;LiveReload /\\u003e\\u003c/code\\u003e component obsolete\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eIn fact, having a separate dev scripts component was causing issues with script execution order\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eTo work around this, the Remix Vite plugin used to override \\u003ccode\\u003e\\u0026#x3C;LiveReload /\\u003e\\u003c/code\\u003e into a bespoke implementation that was compatible with Vite\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eInstead of all this indirection, now the Remix Vite plugin instructs the \\u003ccode\\u003e\\u0026#x3C;Scripts /\\u003e\\u003c/code\\u003e component to automatically include Vite's client-side runtime and other dev-only scripts\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eTo adopt this change, you can remove the LiveReload component from your \\u003ccode\\u003eroot.tsx\\u003c/code\\u003e component:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e import {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e LiveReload,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e Outlet,\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e Scripts,\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e }\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e export default function App() {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e return (\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e \\u0026#x3C;html\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e \\u0026#x3C;head\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e \\u0026#x3C;/head\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e \\u0026#x3C;body\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e \\u0026#x3C;Outlet /\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"14\\\\\\\"\\u003e \\u0026#x3C;Scripts /\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"15\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e \\u0026#x3C;LiveReload /\\u003e\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"16\\\\\\\"\\u003e \\u0026#x3C;/body\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"17\\\\\\\"\\u003e \\u0026#x3C;/html\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"18\\\\\\\"\\u003e )\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"19\\\\\\\"\\u003e }\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Only write Vite manifest files if \\u003ccode\\u003ebuild.manifest\\u003c/code\\u003e is enabled within the Vite config (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8599\\\\\\\"\\u003e#8599\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for consumers of Vite's \\u003ccode\\u003emanifest.json\\u003c/code\\u003e files\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eTo explicitly enable generation of Vite manifest files, you must set \\u003ccode\\u003ebuild.manifest\\u003c/code\\u003e to \\u003ccode\\u003etrue\\u003c/code\\u003e in your Vite config:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003edefault\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e build: { manifest: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003etrue\\u003c/span\\u003e },\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// ...\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add new \\u003ccode\\u003ebuildDirectory\\u003c/code\\u003e option with a default value of \\u003ccode\\u003e\\\\\\\"build\\\\\\\"\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8575\\\\\\\"\\u003e#8575\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for consumers of the Vite plugin that were using the \\u003ccode\\u003eassetsBuildDirectory\\u003c/code\\u003e and \\u003ccode\\u003eserverBuildDirectory\\u003c/code\\u003e options\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eThis replaces the old \\u003ccode\\u003eassetsBuildDirectory\\u003c/code\\u003e and \\u003ccode\\u003eserverBuildDirectory\\u003c/code\\u003e options which defaulted to \\u003ccode\\u003e\\\\\\\"build/client\\\\\\\"\\u003c/code\\u003e and \\u003ccode\\u003e\\\\\\\"build/server\\\\\\\"\\u003c/code\\u003e respectively\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eThe Remix Vite plugin now builds into a single directory containing \\u003ccode\\u003eclient\\u003c/code\\u003e and \\u003ccode\\u003eserver\\u003c/code\\u003e directories\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eIf you've customized your build output directories, you'll need to migrate to the new \\u003ccode\\u003ebuildDirectory\\u003c/code\\u003e option, e.g.:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003eimport { unstable_vitePlugin as remix } from \\\\\\\"@remix-run/dev\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003eimport { defineConfig } from \\\\\\\"vite\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003eexport default defineConfig({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e plugins: [\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e remix({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e serverBuildDirectory: \\\\\\\"dist/server\\\\\\\",\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e assetsBuildDirectory: \\\\\\\"dist/client\\\\\\\",\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e buildDirectory: \\\\\\\"dist\\\\\\\",\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e })\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e ],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Write Vite manifest files to \\u003ccode\\u003ebuild/.vite\\u003c/code\\u003e directory rather than being nested within \\u003ccode\\u003ebuild/client\\u003c/code\\u003e and \\u003ccode\\u003ebuild/server\\u003c/code\\u003e directories (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8599\\\\\\\"\\u003e#8599\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for consumers of Vite's \\u003ccode\\u003emanifest.json\\u003c/code\\u003e files\\u003c/strong\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eVite manifest files are now written to the Remix build directory\\u003c/li\\u003e\\\\n\\u003cli\\u003eSince all Vite manifests are now in the same directory, they're no longer named \\u003ccode\\u003emanifest.json\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eInstead, they're named \\u003ccode\\u003ebuild/.vite/client-manifest.json\\u003c/code\\u003e and \\u003ccode\\u003ebuild/.vite/server-manifest.json\\u003c/code\\u003e, or \\u003ccode\\u003ebuild/.vite/server-{BUNDLE_ID}-manifest.json\\u003c/code\\u003e when using server bundles\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Remove \\u003ccode\\u003eunstable\\u003c/code\\u003e prefix from \\u003ccode\\u003eserverBundles\\u003c/code\\u003e option (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8596\\\\\\\"\\u003e#8596\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003e--sourcemapClient\\u003c/code\\u003e and \\u003ccode\\u003e--sourcemapServer\\u003c/code\\u003e flags to \\u003ccode\\u003eremix vite:build\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8613\\\\\\\"\\u003e#8613\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e--sourcemapClient\\u003c/code\\u003e, \\u003ccode\\u003e--sourcemapClient=inline\\u003c/code\\u003e, or \\u003ccode\\u003e--sourcemapClient=hidden\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e--sourcemapServer\\u003c/code\\u003e, \\u003ccode\\u003e--sourcemapServer=inline\\u003c/code\\u003e, or \\u003ccode\\u003e--sourcemapServer=hidden\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eSee \\u003ca href=\\\\\\\"https://vitejs.dev/config/build-options.html#build-sourcemap\\\\\\\"\\u003ehttps://vitejs.dev/config/build-options.html#build-sourcemap\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Validate IDs returned from the \\u003ccode\\u003eserverBundles\\u003c/code\\u003e function to ensure they only contain alphanumeric characters, hyphens and underscores (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8598\\\\\\\"\\u003e#8598\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix \\\\\\\"could not fast refresh\\\\\\\" false alarm (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8580\\\\\\\"\\u003e#8580\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eHMR is already functioning correctly but was incorrectly logging that it \\\\\\\"could not fast refresh\\\\\\\" on internal client routes\\u003c/li\\u003e\\\\n\\u003cli\\u003eNow internal client routes correctly register Remix exports like \\u003ccode\\u003emeta\\u003c/code\\u003e for fast refresh, which removes the false alarm.\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Cloudflare Pages support (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8531\\\\\\\"\\u003e#8531\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003egetRemixDevLoadContext\\u003c/code\\u003e option to Cloudflare preset (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8649\\\\\\\"\\u003e#8649\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Remove undocumented backwards compatibility layer for Vite v4 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8581\\\\\\\"\\u003e#8581\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003epresets\\u003c/code\\u003e option to ease integration with different platforms and tools (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8514\\\\\\\"\\u003e#8514\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003ebuildEnd\\u003c/code\\u003e hook (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8620\\\\\\\"\\u003e#8620\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Add \\u003ccode\\u003emode\\u003c/code\\u003e field into generated server build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8539\\\\\\\"\\u003e#8539\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Reduce network calls for route modules during HMR (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8591\\\\\\\"\\u003e#8591\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Export \\u003ccode\\u003eUnstable_ServerBundlesFunction\\u003c/code\\u003e and \\u003ccode\\u003eUnstable_VitePluginConfig\\u003c/code\\u003e types (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8654\\\\\\\"\\u003e#8654\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-16\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-16\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.22.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1150\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.15.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-18\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-18\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/create-remix/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-architect/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare-pages/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare-workers/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-css-bundle/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-deno/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-dev/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-eslint-config/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-express/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-node/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-react/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-serve/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-server-runtime/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-testing/CHANGELOG.md#260\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.5.1...remix@2.6.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.5.1...v2.6.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v251\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v251\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.5.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-01-18\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-34\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-34\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e - high-contrast fg/bg for header colors (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8503\\\\\\\"\\u003e#8503\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ebgWhite\\u003c/code\\u003e and \\u003ccode\\u003ewhiteBright\\u003c/code\\u003e are the same color in many terminal colorthemes, which was causing it to render as illegible white-on-white\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Add \\u003ccode\\u003eisSpaMode\\u003c/code\\u003e to \\u003ccode\\u003e@remix-run/dev/server-build\\u003c/code\\u003e virtual module (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8492\\\\\\\"\\u003e#8492\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - SPA Mode: Automatically prepend \\u003ccode\\u003e\\u0026#x3C;!DOCTYPE html\\u003e\\u003c/code\\u003e if not present to fix quirks mode warnings for SPA template (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8495\\\\\\\"\\u003e#8495\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Errors for server-only code point to new docs (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8488\\\\\\\"\\u003e#8488\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Fix HMR race condition when reading changed file contents (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8479\\\\\\\"\\u003e#8479\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Tree-shake unused route exports in the client build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8468\\\\\\\"\\u003e#8468\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Performance profiling (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8493\\\\\\\"\\u003e#8493\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRun \\u003ccode\\u003eremix vite:build --profile\\u003c/code\\u003e to generate a \\u003ccode\\u003e.cpuprofile\\u003c/code\\u003e that can be shared or uploaded to speedscope.app\\u003c/li\\u003e\\\\n\\u003cli\\u003eIn dev, press \\u003ccode\\u003ep + enter\\u003c/code\\u003e to start a new profiling session or stop the current session\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf you need to profile dev server startup, run \\u003ccode\\u003eremix vite:dev --profile\\u003c/code\\u003e to initialize the dev server with a running profiling session\\u003c/li\\u003e\\\\n\\u003cli\\u003eFor more, see the new \\u003ca href=\\\\\\\"https://remix.run/docs/future/vite#performance\\\\\\\"\\u003eVite \\u003e Performance\\u003c/a\\u003e docs\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e - Vite: Improve performance of dev server requests by invalidating Remix's virtual modules on relevant file changes rather than on every request (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8164\\\\\\\"\\u003e#8164\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Remove leftover \\u003ccode\\u003eunstable_\\u003c/code\\u003e prefix from \\u003ccode\\u003eBlocker\\u003c/code\\u003e/\\u003ccode\\u003eBlockerFunction\\u003c/code\\u003e types (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8530\\\\\\\"\\u003e#8530\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e - Only use active matches in \\u003ccode\\u003e\\u0026#x3C;Meta\\u003e\\u003c/code\\u003e/\\u003ccode\\u003e\\u0026#x3C;Links\\u003e\\u003c/code\\u003e in SPA mode (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8538\\\\\\\"\\u003e#8538\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-17\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-17\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.3\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.21.3\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-19\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-19\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/create-remix/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-architect/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare-pages/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare-workers/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-css-bundle/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-deno/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-dev/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-eslint-config/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-express/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-node/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-react/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-serve/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-server-runtime/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-testing/CHANGELOG.md#251\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.5.0...remix@2.5.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.5.0...v2.5.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v250\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v250\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.5.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2024-01-11\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-8\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-8\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"spa-mode-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#spa-mode-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eSPA Mode (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eSPA Mode (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/7638\\\\\\\"\\u003eRFC\\u003c/a\\u003e) allows you to generate your Remix app as a standalone SPA served from a static \\u003ccode\\u003eindex.html\\u003c/code\\u003e file. You can opt into SPA Mode by setting \\u003ccode\\u003eunstable_ssr: false\\u003c/code\\u003e in your Remix Vite plugin config:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"javascript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"javascript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// vite.config.ts\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eunstable_vitePlugin\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eas\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eremix\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e@remix-run/dev\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003evite\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003edefault\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e plugins: [\\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eremix\\u003c/span\\u003e({ unstable_ssr: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003efalse\\u003c/span\\u003e })],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eDevelopment in SPA Mode is just like a normal Remix app, and still uses the Remix dev server for HMR/HDR:\\u003c/p\\u003e\\\\n\\u003cpre\\u003e\\u003ccode class=\\\\\\\"language-sh\\\\\\\"\\u003eremix vite:dev\\\\n\\u003c/code\\u003e\\u003c/pre\\u003e\\\\n\\u003cp\\u003eBuilding in SPA Mode will generate an \\u003ccode\\u003eindex.html\\u003c/code\\u003e file in your client assets directory:\\u003c/p\\u003e\\\\n\\u003cpre\\u003e\\u003ccode class=\\\\\\\"language-sh\\\\\\\"\\u003eremix vite:build\\\\n\\u003c/code\\u003e\\u003c/pre\\u003e\\\\n\\u003cp\\u003eTo run your SPA, you serve your client assets directory via an HTTP server:\\u003c/p\\u003e\\\\n\\u003cpre\\u003e\\u003ccode class=\\\\\\\"language-sh\\\\\\\"\\u003enpx http-server build/client\\\\n\\u003c/code\\u003e\\u003c/pre\\u003e\\\\n\\u003cp\\u003eFor more information, please refer to the \\u003ca href=\\\\\\\"https://remix.run/future/spa-mode\\\\\\\"\\u003eSPA Mode docs\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"server-bundles-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#server-bundles-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eServer Bundles (unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eThis is an advanced feature designed for hosting provider integrations where you may want to split server code into multiple request handlers. When compiling your app into multiple server bundles, there will need to be a custom routing layer in front of your app directing requests to the correct bundle. This feature is currently unstable and only designed to gather early .\\u003c/p\\u003e\\\\n\\u003cp\\u003eYou can control the server bundles generated by your Remix Vite build by setting the \\u003ccode\\u003eunstable_serverBundles\\u003c/code\\u003e option in your vite config:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"typescript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eunstable_vitePlugin\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eas\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eremix\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e@remix-run/dev\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eimport\\u003c/span\\u003e { \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e } \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003efrom\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003evite\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003eexport\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003edefault\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003edefineConfig\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e plugins: [\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eremix\\u003c/span\\u003e({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eunstable_serverBundles\\u003c/span\\u003e: ({ \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ebranch\\u003c/span\\u003e }) \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003e=\\u003e\\u003c/span\\u003e {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003econst\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eisAuthenticatedRoute\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ebranch\\u003c/span\\u003e.\\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003esome\\u003c/span\\u003e(\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e (\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eroute\\u003c/span\\u003e) \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003e=\\u003e\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eroute\\u003c/span\\u003e.\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eid\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e===\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eroutes/_authenticated\\u003c/span\\u003e\\\\\\\",\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e );\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003ereturn\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eisAuthenticatedRoute\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e?\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eauthenticated\\u003c/span\\u003e\\\\\\\" \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e:\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eunauthenticated\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e },\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"14\\\\\\\"\\u003e }),\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"15\\\\\\\"\\u003e ],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"16\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-11\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-11\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdd unstable support for \\\\\\\"SPA Mode\\\\\\\" (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8457\\\\\\\"\\u003e#8457\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdd \\u003ccode\\u003eunstable_serverBundles\\u003c/code\\u003e option to Vite plugin to support splitting server code into multiple request handlers (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8332\\\\\\\"\\u003e#8332\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-35\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-35\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e: Only update \\u003ccode\\u003e*\\u003c/code\\u003e versions for Remix dependencies (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8458\\\\\\\"\\u003e#8458\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix-serve\\u003c/code\\u003e: Don't try to load sourcemaps if they don't exist on disk (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8446\\\\\\\"\\u003e#8446\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Fix issue with \\u003ccode\\u003eisbot@4\\u003c/code\\u003e released on 1/1/2024 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8415\\\\\\\"\\u003e#8415\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix dev\\u003c/code\\u003e will now add \\u003ccode\\u003e\\\\\\\"isbot\\\\\\\": \\\\\\\"^4\\\\\\\"\\u003c/code\\u003e to \\u003ccode\\u003epackage.json\\u003c/code\\u003e instead of using \\u003ccode\\u003elatest\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eUpdate built-in \\u003ccode\\u003eentry.server\\u003c/code\\u003e files to work with both \\u003ccode\\u003eisbot@3\\u003c/code\\u003e and \\u003ccode\\u003eisbot@4\\u003c/code\\u003e for backwards-compatibility with Remix apps that have pinned \\u003ccode\\u003eisbot@3\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eTemplates are updated to use \\u003ccode\\u003eisbot@4\\u003c/code\\u003e moving forward via \\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Fix HMR issues when altering exports for non-rendered routes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8157\\\\\\\"\\u003e#8157\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Default \\u003ccode\\u003eNODE_ENV\\u003c/code\\u003e to \\u003ccode\\u003e\\\\\\\"production\\\\\\\"\\u003c/code\\u003e when running \\u003ccode\\u003eremix vite:build\\u003c/code\\u003e command (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8405\\\\\\\"\\u003e#8405\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Remove Vite plugin config option \\u003ccode\\u003eserverBuildPath\\u003c/code\\u003e in favor of separate \\u003ccode\\u003eserverBuildDirectory\\u003c/code\\u003e and \\u003ccode\\u003eserverBuildFile\\u003c/code\\u003e options (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8332\\\\\\\"\\u003e#8332\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Loosen strict route exports restriction, reinstating support for non-Remix route exports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8420\\\\\\\"\\u003e#8420\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e: Vite - Fix type conflict with \\u003ccode\\u003eimport.meta.hot\\u003c/code\\u003e from the existing Remix compiler (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8459\\\\\\\"\\u003e#8459\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Updated \\u003ccode\\u003ecookie\\u003c/code\\u003e dependency to \\u003ca href=\\\\\\\"https://github.com/jshttp/cookie/blob/master/HISTORY.md#060--2023-11-06\\\\\\\"\\u003e\\u003ccode\\u003e0.6.0\\u003c/code\\u003e\\u003c/a\\u003e to inherit support for the \\u003ca href=\\\\\\\"https://developer.mozilla.org/en-US/docs/Web/Privacy/Partitioned_cookies\\\\\\\"\\u003e\\u003ccode\\u003ePartitioned\\u003c/code\\u003e\\u003c/a\\u003e attribute (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8375\\\\\\\"\\u003e#8375\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-18\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-18\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.2\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.21.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1142\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.14.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-20\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-20\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/create-remix/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-architect/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare-pages/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare-workers/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-css-bundle/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-deno/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-dev/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-eslint-config/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-express/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-node/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-react/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-serve/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-server-runtime/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-testing/CHANGELOG.md#250\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.4.1...remix@2.5.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.4.1...v2.5.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v241\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v241\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.4.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-12-22\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-36\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-36\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Remove \\u003ccode\\u003eunstable_viteServerBuildModuleId\\u003c/code\\u003e in favor of manually referencing virtual module name \\u003ccode\\u003e\\\\\\\"virtual:remix/server-build\\\\\\\"\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8264\\\\\\\"\\u003e#8264\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin with a custom server\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eThis change was made to avoid issues where \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e could be inadvertently required in your server's production dependencies.\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eInstead, you should manually write the virtual module name \\u003ccode\\u003e\\\\\\\"virtual:remix/server-build\\\\\\\"\\u003c/code\\u003e when calling \\u003ccode\\u003essrLoadModule\\u003c/code\\u003e in development.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eimport { unstable_viteServerBuildModuleId } from \\\\\\\"@remix-run/dev\\\\\\\";\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e// ...\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003eapp.all(\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e \\\\\\\"*\\\\\\\",\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e createRequestHandler({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e build: vite\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e ? () =\\u003e vite.ssrLoadModule(unstable_viteServerBuildModuleId)\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e ? () =\\u003e vite.ssrLoadModule(\\\\\\\"virtual:remix/server-build\\\\\\\")\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e : await import(\\\\\\\"./build/server/index.js\\\\\\\"),\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e })\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e);\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Add \\u003ccode\\u003evite:dev\\u003c/code\\u003e and \\u003ccode\\u003evite:build\\u003c/code\\u003e commands to the Remix CLI (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8211\\\\\\\"\\u003e#8211\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eIn order to handle upcoming Remix features where your plugin options can impact the number of Vite builds required, you should now run your Vite \\u003ccode\\u003edev\\u003c/code\\u003e and \\u003ccode\\u003ebuild\\u003c/code\\u003e processes via the Remix CLI.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e{\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\\\\\\"scripts\\\\\\\": {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e \\\\\\\"dev\\\\\\\": \\\\\\\"vite dev\\\\\\\",\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e \\\\\\\"build\\\\\\\": \\\\\\\"vite build \\u0026#x26;\\u0026#x26; vite build --ssr\\\\\\\"\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e \\\\\\\"dev\\\\\\\": \\\\\\\"remix vite:dev\\\\\\\",\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e \\\\\\\"build\\\\\\\": \\\\\\\"remix vite:build\\\\\\\"\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e }\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e}\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Error messages when \\u003ccode\\u003e.server\\u003c/code\\u003e files are referenced by client (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8267\\\\\\\"\\u003e#8267\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003ePreviously, referencing a \\u003ccode\\u003e.server\\u003c/code\\u003e module from client code resulted in an error message like:\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eThe requested module '/app/models/answer.server.ts' does not provide an export named 'isDateType'\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis was confusing because \\u003ccode\\u003eanswer.server.ts\\u003c/code\\u003e \\u003cem\\u003edoes\\u003c/em\\u003e provide the \\u003ccode\\u003eisDateType\\u003c/code\\u003e export, but Remix was replacing \\u003ccode\\u003e.server\\u003c/code\\u003e modules with empty modules (\\u003ccode\\u003eexport {}\\u003c/code\\u003e) for the client build\\u003c/li\\u003e\\\\n\\u003cli\\u003eNow, Remix explicitly fails at compile time when a \\u003ccode\\u003e.server\\u003c/code\\u003e module is referenced from client code and includes dedicated error messages depending on whether the import occurs in a route or a non-route module\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe error messages also include links to relevant documentation\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Preserve names for exports from \\u003ccode\\u003e.client\\u003c/code\\u003e modules (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8200\\\\\\\"\\u003e#8200\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eUnlike \\u003ccode\\u003e.server\\u003c/code\\u003e modules, the main idea is not to prevent code from leaking into the server build since the client build is already public\\u003c/li\\u003e\\\\n\\u003cli\\u003eRather, the goal is to isolate the SSR render from client-only code\\u003c/li\\u003e\\\\n\\u003cli\\u003eRoutes need to import code from \\u003ccode\\u003e.client\\u003c/code\\u003e modules without compilation failing and then rely on runtime checks or otherwise ensure that execution only happens within a client-only context (e.g. event handlers, \\u003ccode\\u003euseEffect\\u003c/code\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eReplacing \\u003ccode\\u003e.client\\u003c/code\\u003e modules with empty modules would cause the build to fail as ESM named imports are statically analyzed\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eSo instead, we preserve the named export but replace each exported value with \\u003ccode\\u003eundefined\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThat way, the import is valid at build time and standard runtime checks can be used to determine if the code is running on the server or client\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Disable watch mode in Vite child compiler during build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8342\\\\\\\"\\u003e#8342\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite - Show warning when source maps are enabled in production build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8222\\\\\\\"\\u003e#8222\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e: Propagate server \\u003ccode\\u003eloader\\u003c/code\\u003e errors through \\u003ccode\\u003eserverLoader\\u003c/code\\u003e in hydrating \\u003ccode\\u003eclientLoader\\u003c/code\\u003e's (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8304\\\\\\\"\\u003e#8304\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e Re-export \\u003ccode\\u003eResponse\\u003c/code\\u003e helpers (\\u003ccode\\u003edefer\\u003c/code\\u003e/\\u003ccode\\u003ejson\\u003c/code\\u003e/\\u003ccode\\u003eredirect\\u003c/code\\u003e/\\u003ccode\\u003eredirectDocument\\u003c/code\\u003e) through \\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e for use in \\u003ccode\\u003eclientLoader\\u003c/code\\u003e/\\u003ccode\\u003eclientAction\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8351\\\\\\\"\\u003e#8351\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Add optional \\u003ccode\\u003eerror\\u003c/code\\u003e to \\u003ccode\\u003eServerRuntimeMetaArgs\\u003c/code\\u003e type to align with \\u003ccode\\u003eMetaArgs\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8238\\\\\\\"\\u003e#8238\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e: Switch to using \\u003ccode\\u003e@remix-run/web-fetch\\u003c/code\\u003e instead of \\u003ccode\\u003enode-fetch\\u003c/code\\u003e inside the \\u003ccode\\u003ecreate-remix\\u003c/code\\u003e CLI (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7345\\\\\\\"\\u003e#7345\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003eremix-serve\\u003c/code\\u003e: Use node \\u003ccode\\u003efileURLToPath\\u003c/code\\u003e to convert source map URL to path (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8321\\\\\\\"\\u003e#8321\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-19\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-19\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.1\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.21.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1141\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.14.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-21\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-21\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/create-remix/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-architect/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare-pages/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare-workers/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-css-bundle/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-deno/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-dev/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-eslint-config/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-express/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-node/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-react/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-serve/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-server-runtime/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-testing/CHANGELOG.md#241\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.4.0...remix@2.4.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.4.0...v2.4.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v240\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v240\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.4.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-12-13\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-9\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-9\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"client-data\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#client-data\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eClient Data\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe're excited to land the \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/7634\\\\\\\"\\u003eClient Data RFC\\u003c/a\\u003e in this release! The final API differs slightly from the RFC, so please check out the docs for use-cases and final APIs:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/guides/client-data\\\\\\\"\\u003eClient Data Guide\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/route/client-loader\\\\\\\"\\u003e\\u003ccode\\u003eclientLoader\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/route/hydrate-fallback\\\\\\\"\\u003e\\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/route/client-action\\\\\\\"\\u003e\\u003ccode\\u003eclientAction\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003eWhile we still recommend server loaders/actions for the majority of your data needs in a Remix app - these provide some levers you can pull for more advanced use-cases such as:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eSkip the Hop:\\u003c/strong\\u003e Query a data API directly from the browser, using loaders simply for SSR\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eFullstack State:\\u003c/strong\\u003e Augment server data with client data for your full set of loader data\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eOne or the Other:\\u003c/strong\\u003e Sometimes you use server loaders, sometimes you use client loaders, but not both on one route\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eClient Cache:\\u003c/strong\\u003e Cache server loader data in the client and avoid some server calls\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eMigration:\\u003c/strong\\u003e Ease your migration from React Router -\\u003e Remix SPA -\\u003e Remix SSR\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"futurev3_relativesplatpath\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#futurev3_relativesplatpath\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\\u003ccode\\u003efuture.v3_relativeSplatPath\\u003c/code\\u003e\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe introduced a \\u003ccode\\u003efuture.v3_relativeSplatPath\\u003c/code\\u003e flag to implement a breaking bug fix to relative routing when inside a splat route. For more information, please see the React Router \\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#futurev7_relativesplatpath\\\\\\\"\\u003e\\u003ccode\\u003e6.21.0\\u003c/code\\u003e Release Notes\\u003c/a\\u003e and the \\u003ca href=\\\\\\\"https://remix.run/hooks/use-resolved-path#splat-paths\\\\\\\"\\u003e\\u003ccode\\u003euseResolvedPath\\u003c/code\\u003e docs\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"vite-updates-unstable\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#vite-updates-unstable\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eVite Updates (Unstable)\\u003c/h4\\u003e\\\\n\\u003cp\\u003eRemix now excludes modules within \\u003ccode\\u003e.server\\u003c/code\\u003e directories from client build.\\u003c/p\\u003e\\\\n\\u003cp\\u003eRemix now enforces strict route exports, and will will throw an error if you have unsupported exports in your route modules. Previously, the Remix compiler would allow any export from routes. While this was convenient, it was also a common source of bugs that were hard to track down because they only surfaced at runtime. For more information, please see \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/future/vite#strict-route-exports\\\\\\\"\\u003ethe docs\\u003c/a\\u003e.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-12\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-12\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdd support for \\u003ccode\\u003eclientLoader\\u003c/code\\u003e/\\u003ccode\\u003eclientAction\\u003c/code\\u003e/\\u003ccode\\u003eHydrateFallback\\u003c/code\\u003e route exports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8173\\\\\\\"\\u003e#8173\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdd a new \\u003ccode\\u003efuture.v3_relativeSplatPath\\u003c/code\\u003e flag to implement a breaking bug fix to relative routing when inside a splat route (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8216\\\\\\\"\\u003e#8216\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eDeprecate \\u003ccode\\u003eDataFunctionArgs\\u003c/code\\u003e in favor of \\u003ccode\\u003eLoaderFunctionArgs\\u003c/code\\u003e/\\u003ccode\\u003eActionFunctionArgs\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8173\\\\\\\"\\u003e#8173\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis is aimed at keeping the types aligned across server/client loaders/actions now that \\u003ccode\\u003eclientLoader\\u003c/code\\u003e/\\u003ccode\\u003eclientActon\\u003c/code\\u003e functions have \\u003ccode\\u003eserverLoader\\u003c/code\\u003e/\\u003ccode\\u003eserverAction\\u003c/code\\u003e parameters which differentiate \\u003ccode\\u003eClientLoaderFunctionArgs\\u003c/code\\u003e/\\u003ccode\\u003eClientActionFunctionArgs\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eVite: Exclude modules within \\u003ccode\\u003e.server\\u003c/code\\u003e directories from client build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8154\\\\\\\"\\u003e#8154\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eVite: Strict route exports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8171\\\\\\\"\\u003e#8171\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-37\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-37\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Fix flash of unstyled content for non-Express custom servers in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8076\\\\\\\"\\u003e#8076\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Pass request handler errors to \\u003ccode\\u003evite.ssrFixStacktrace\\u003c/code\\u003e in Vite dev to ensure stack traces correctly map to the original source code (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8066\\\\\\\"\\u003e#8066\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003eremix-serve\\u003c/code\\u003e: Fix source map loading when file has \\u003ccode\\u003e?t=timestamp\\u003c/code\\u003e suffix (rebuilds) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8174\\\\\\\"\\u003e#8174\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Change Vite build output paths to fix a conflict between how Vite and the Remix compiler each manage the \\u003ccode\\u003epublic\\u003c/code\\u003e directory (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8077\\\\\\\"\\u003e#8077\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin\\u003c/strong\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe server is now compiled into \\u003ccode\\u003ebuild/server\\u003c/code\\u003e rather than \\u003ccode\\u003ebuild\\u003c/code\\u003e, and the client is now compiled into \\u003ccode\\u003ebuild/client\\u003c/code\\u003e rather than \\u003ccode\\u003epublic\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eFor more information on the changes and guidance on how to migrate your project, refer to the updated \\u003ca href=\\\\\\\"https://remix.run/future/vite\\\\\\\"\\u003eRemix Vite documentation\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Upgrade Vite peer dependency range to v5 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8172\\\\\\\"\\u003e#8172\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Support HMR for routes with \\u003ccode\\u003ehandle\\u003c/code\\u003e export in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8022\\\\\\\"\\u003e#8022\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Fix flash of unstyled content for non-Express custom servers in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8076\\\\\\\"\\u003e#8076\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Bundle CSS imported in client entry file in Vite plugin (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8143\\\\\\\"\\u003e#8143\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Remove undocumented \\u003ccode\\u003elegacyCssImports\\u003c/code\\u003e option from Vite plugin due to issues with \\u003ccode\\u003e?url\\u003c/code\\u003e imports of CSS files not being processed correctly in Vite (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8096\\\\\\\"\\u003e#8096\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite: fix access to default \\u003ccode\\u003eentry.{client,server}.tsx\\u003c/code\\u003e within \\u003ccode\\u003epnpm\\u003c/code\\u003e workspaces on Windows (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8057\\\\\\\"\\u003e#8057\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Remove \\u003ccode\\u003eunstable_createViteServer\\u003c/code\\u003e and \\u003ccode\\u003eunstable_loadViteServerBuild\\u003c/code\\u003e which were only minimal wrappers around Vite's \\u003ccode\\u003ecreateServer\\u003c/code\\u003e and \\u003ccode\\u003essrLoadModule\\u003c/code\\u003e functions when using a custom server (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8120\\\\\\\"\\u003e#8120\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin with a custom server\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eInstead, we now provide \\u003ccode\\u003eunstable_viteServerBuildModuleId\\u003c/code\\u003e so that custom servers interact with Vite directly rather than via Remix APIs, for example:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eimport {\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e unstable_createViteServer,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e unstable_loadViteServerBuild,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e} from \\\\\\\"@remix-run/dev\\\\\\\";\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eimport { unstable_viteServerBuildModuleId } from \\\\\\\"@remix-run/dev\\\\\\\";\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eCreating the Vite server in middleware mode:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003econst vite =\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e process.env.NODE_ENV === \\\\\\\"production\\\\\\\"\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e ? undefined\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e : await unstable_createViteServer();\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e : await import(\\\\\\\"vite\\\\\\\").then(({ createServer }) =\\u003e\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e createServer({\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e server: {\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e middlewareMode: true,\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e },\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e })\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e );\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eLoading the Vite server build in the request handler:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003eapp.all(\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\\\\\\"*\\\\\\\",\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e createRequestHandler({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e build: vite\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e-\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003e ? () =\\u003e unstable_loadViteServerBuild(vite)\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e ? () =\\u003e vite.ssrLoadModule(unstable_viteServerBuildModuleId)\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e : await import(\\\\\\\"./build/server/index.js\\\\\\\"),\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e })\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e);\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Pass request handler errors to \\u003ccode\\u003evite.ssrFixStacktrace\\u003c/code\\u003e in Vite dev to ensure stack traces correctly map to the original source code (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8066\\\\\\\"\\u003e#8066\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite: Preserve names for exports from \\u003ccode\\u003e.client\\u003c/code\\u003e imports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8200\\\\\\\"\\u003e#8200\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eUnlike \\u003ccode\\u003e.server\\u003c/code\\u003e modules, the main idea is not to prevent code from leaking into the server build since the client build is already public\\u003c/li\\u003e\\\\n\\u003cli\\u003eRather, the goal is to isolate the SSR render from client-only code\\u003c/li\\u003e\\\\n\\u003cli\\u003eRoutes need to import code from \\u003ccode\\u003e.client\\u003c/code\\u003e modules without compilation failing and then rely on runtime checks to determine if the code is running on the server or client\\u003c/li\\u003e\\\\n\\u003cli\\u003eReplacing \\u003ccode\\u003e.client\\u003c/code\\u003e modules with empty modules would cause the build to fail as ESM named imports are statically analyzed\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eSo instead, we preserve the named export but replace each exported value with an empty object\\u003c/li\\u003e\\\\n\\u003cli\\u003eThat way, the import is valid at build time and the standard runtime checks can be used to determine if then code is running on the server or client\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Add \\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e to Vite's \\u003ccode\\u003eoptimizeDeps.include\\u003c/code\\u003e array (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8177\\\\\\\"\\u003e#8177\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Improve Vite plugin performance (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8121\\\\\\\"\\u003e#8121\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eParallelize detection of route module exports\\u003c/li\\u003e\\\\n\\u003cli\\u003eDisable \\u003ccode\\u003eserver.preTransformRequests\\u003c/code\\u003e in Vite child compiler since it's only used to process route modules\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Remove automatic global Node polyfill installation from the built-in Vite dev server and instead allow explicit opt-in (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8119\\\\\\\"\\u003e#8119\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e⚠️ \\u003cstrong\\u003eThis is a breaking change for projects using the unstable Vite plugin without a custom server\\u003c/strong\\u003e\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003eIf you're not using a custom server, you should call \\u003ccode\\u003einstallGlobals\\u003c/code\\u003e in your Vite config instead.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"diff\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003eimport { unstable_vitePlugin as remix } from \\\\\\\"@remix-run/dev\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eimport { installGlobals } from \\\\\\\"@remix-run/node\\\\\\\";\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003eimport { defineConfig } from \\\\\\\"vite\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e+\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003einstallGlobals();\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003eexport default defineConfig({\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e plugins: [remix()],\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e});\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Vite: Errors at build-time when client imports .server default export (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8184\\\\\\\"\\u003e#8184\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemix already stripped .server file code before ensuring that server code never makes it into the client\\u003c/li\\u003e\\\\n\\u003cli\\u003eThat results in errors when client code tries to import server code, which is exactly what we want!\\u003c/li\\u003e\\\\n\\u003cli\\u003eBut those errors were happening at runtime for default imports\\u003c/li\\u003e\\\\n\\u003cli\\u003eA better experience is to have those errors happen at build-time so that you guarantee that your users won't hit them\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\\\n\\u003cp\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Fix \\u003ccode\\u003erequest instanceof Request\\u003c/code\\u003e checks when using Vite dev server (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8062\\\\\\\"\\u003e#8062\\u003c/a\\u003e)\\u003c/p\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-20\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-20\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.21.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1140\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.14.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-fetch%404.4.2\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/web-fetch@4.4.2\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-22\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-22\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/create-remix/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-architect/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare-pages/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare-workers/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-css-bundle/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-deno/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-dev/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-eslint-config/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-express/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-node/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-react/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-serve/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-server-runtime/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-testing/CHANGELOG.md#240\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.3.1...remix@2.4.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.3.1...v2.4.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v231\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v231\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.3.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-11-22\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-38\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-38\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Support \\u003ccode\\u003enonce\\u003c/code\\u003e prop on \\u003ccode\\u003eLiveReload\\u003c/code\\u003e component in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8014\\\\\\\"\\u003e#8014\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Ensure code-split JS files in the server build's assets directory aren't cleaned up after Vite build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8042\\\\\\\"\\u003e#8042\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Fix redundant copying of assets from \\u003ccode\\u003epublic\\u003c/code\\u003e directory in Vite build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/8039\\\\\\\"\\u003e#8039\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis ensures that static assets aren't duplicated in the server build directory\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis also fixes an issue where the build would break if \\u003ccode\\u003eassetsBuildDirectory\\u003c/code\\u003e was deeply nested within the \\u003ccode\\u003epublic\\u003c/code\\u003e directory\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-21\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-21\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.20.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.20.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1130\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.13.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-23\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-23\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/create-remix/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-architect/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare-pages/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare-workers/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-css-bundle/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-deno/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-dev/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-eslint-config/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-express/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-node/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-react/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-serve/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-server-runtime/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-testing/CHANGELOG.md#231\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.3.0...remix@2.3.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.3.0...v2.3.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v230\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v230\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.3.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-11-16\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-10\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-10\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"stabilized-useblocker\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#stabilized-useblocker\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eStabilized \\u003ccode\\u003euseBlocker\\u003c/code\\u003e\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe've removed the \\u003ccode\\u003eunstable_\\u003c/code\\u003e prefix from the \\u003ca href=\\\\\\\"https://remix.run/hooks/use-blocker\\\\\\\"\\u003e\\u003ccode\\u003euseBlocker\\u003c/code\\u003e\\u003c/a\\u003e hook as it's been in use for enough time that we are confident in the API. We do not plan to remove the prefix from \\u003ca href=\\\\\\\"https://remix.run/hooks/use-prompt\\\\\\\"\\u003e\\u003ccode\\u003eunstable_usePrompt\\u003c/code\\u003e\\u003c/a\\u003e due to differences in how browsers handle \\u003ccode\\u003ewindow.confirm\\u003c/code\\u003e that prevent React Router from guaranteeing consistent/correct behavior.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"unstable_flushsync-api\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#unstable_flushsync-api\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\\u003ccode\\u003eunstable_flushSync\\u003c/code\\u003e API\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe've added a new \\u003ccode\\u003eunstable_flushSync\\u003c/code\\u003e option to the imperative APIs (\\u003ccode\\u003euseSubmit\\u003c/code\\u003e, \\u003ccode\\u003euseNavigate\\u003c/code\\u003e, \\u003ccode\\u003efetcher.submit\\u003c/code\\u003e, \\u003ccode\\u003efetcher.load\\u003c/code\\u003e) to let users opt-into synchronous DOM updates for pending/optimistic UI.\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"javascript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"javascript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003efunction\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003ehandleClick\\u003c/span\\u003e() {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003esubmit\\u003c/span\\u003e(\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003edata\\u003c/span\\u003e, { flushSync: \\u003cspan style=\\\\\\\"color: var(--base09)\\\\\\\"\\u003etrue\\u003c/span\\u003e });\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e// Everything is flushed to the DOM so you can focus/scroll to your pending/optimistic UI\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003esetFocusAndOrScrollToNewlyAddedThing\\u003c/span\\u003e();\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e}\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-13\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-13\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemove the \\u003ccode\\u003eunstable_\\u003c/code\\u003e prefix from the \\u003ca href=\\\\\\\"https://reactrouter.com/v6/hooks/use-blocker\\\\\\\"\\u003e\\u003ccode\\u003euseBlocker\\u003c/code\\u003e\\u003c/a\\u003e hook (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7882\\\\\\\"\\u003e#7882\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdd \\u003ccode\\u003eunstable_flushSync\\u003c/code\\u003e option to \\u003ccode\\u003euseNavigate\\u003c/code\\u003e/\\u003ccode\\u003euseSubmit\\u003c/code\\u003e/\\u003ccode\\u003efetcher.load\\u003c/code\\u003e/\\u003ccode\\u003efetcher.submit\\u003c/code\\u003e to opt-out of \\u003ccode\\u003eReact.startTransition\\u003c/code\\u003e and into \\u003ccode\\u003eReactDOM.flushSync\\u003c/code\\u003e for state updates (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7996\\\\\\\"\\u003e#7996\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-39\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-39\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e: Add missing \\u003ccode\\u003emodulepreload\\u003c/code\\u003e for the manifest (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7684\\\\\\\"\\u003e#7684\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e: Updated \\u003ccode\\u003ecookie\\u003c/code\\u003e dependency from \\u003ccode\\u003e0.4.1\\u003c/code\\u003e to \\u003ca href=\\\\\\\"https://github.com/jshttp/cookie/blob/v0.5.0/HISTORY.md#050--2022-04-11\\\\\\\"\\u003e\\u003ccode\\u003e0.5.0\\u003c/code\\u003e\\u003c/a\\u003e to inherit support for \\u003ccode\\u003ePriority\\u003c/code\\u003e attribute in Chrome (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6770\\\\\\\"\\u003e#6770\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e: Fix \\u003ccode\\u003eFutureConfig\\u003c/code\\u003e type (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7895\\\\\\\"\\u003e#7895\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cem\\u003eLots\\u003c/em\\u003e of small fixes for the unstable \\u003ccode\\u003evite\\u003c/code\\u003e compiler:\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eSupport optional rendering of the \\u003ccode\\u003eLiveReload\\u003c/code\\u003e component in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7919\\\\\\\"\\u003e#7919\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSupport rendering of the \\u003ccode\\u003eLiveReload\\u003c/code\\u003e component after \\u003ccode\\u003eScripts\\u003c/code\\u003e in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7919\\\\\\\"\\u003e#7919\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix \\u003ccode\\u003ereact-refresh/babel\\u003c/code\\u003e resolution for custom server with \\u003ccode\\u003epnpm\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7904\\\\\\\"\\u003e#7904\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSupport JSX usage in \\u003ccode\\u003e.jsx\\u003c/code\\u003e files without manual \\u003ccode\\u003eReact\\u003c/code\\u003e import in Vite (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7888\\\\\\\"\\u003e#7888\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix Vite production builds when plugins that have different local state between \\u003ccode\\u003edevelopment\\u003c/code\\u003e and \\u003ccode\\u003eproduction\\u003c/code\\u003e modes are present (e.g. \\u003ccode\\u003e@mdx-js/rollup\\u003c/code\\u003e) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7911\\\\\\\"\\u003e#7911\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eCache resolution of Remix Vite plugin options (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7908\\\\\\\"\\u003e#7908\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSupport Vite 5 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7846\\\\\\\"\\u003e#7846\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAllow \\u003ccode\\u003eprocess.env.NODE_ENV\\u003c/code\\u003e values other than \\u003ccode\\u003e\\\\\\\"development\\\\\\\"\\u003c/code\\u003e in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7980\\\\\\\"\\u003e#7980\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAttach CSS from shared chunks to routes in Vite build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7952\\\\\\\"\\u003e#7952\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eLet Vite handle serving files outside of project root via \\u003ccode\\u003e/@fs\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7913\\\\\\\"\\u003e#7913\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis fixes errors when using default client entry or server entry in a pnpm project where those files may be outside of the project root, but within the workspace root\\u003c/li\\u003e\\\\n\\u003cli\\u003eBy default, Vite prevents access to files outside the workspace root (when using workspaces) or outside of the project root (when not using workspaces) unless user explicitly opts into it via Vite's \\u003ccode\\u003eserver.fs.allow\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eImprove performance of LiveReload proxy in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7883\\\\\\\"\\u003e#7883\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eDeduplicate \\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7926\\\\\\\"\\u003e#7926\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003ePre-bundle Remix dependencies to avoid Remix router duplicates\\u003c/li\\u003e\\\\n\\u003cli\\u003eOur \\u003ccode\\u003eremix-react-proxy\\u003c/code\\u003e plugin does not process default client and server entry files since those come from within \\u003ccode\\u003enode_modules\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThat means that before Vite pre-bundles dependencies (e.g. first time dev server is run) mismatching Remix routers cause \\u003ccode\\u003eError: You must render this element inside a \\u0026#x3C;Remix\\u003e element\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix React Fast Refresh error on load when using \\u003ccode\\u003edefer\\u003c/code\\u003e in Vite dev server (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7842\\\\\\\"\\u003e#7842\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eHandle multiple \\u003ccode\\u003eSet-Cookie\\u003c/code\\u003e headers in Vite dev server (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7843\\\\\\\"\\u003e#7843\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix flash of unstyled content on initial page load in Vite dev when using a custom Express server (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7937\\\\\\\"\\u003e#7937\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003ePopulate \\u003ccode\\u003eprocess.env\\u003c/code\\u003e from \\u003ccode\\u003e.env\\u003c/code\\u003e files on the server in Vite dev (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7958\\\\\\\"\\u003e#7958\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eEmit assets that were only referenced in the server build into the client assets directory in Vite build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7892\\\\\\\"\\u003e#7892\\u003c/a\\u003e, cherry-picked in \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/commit/8cd31d6543ef4c765220fc64dca9bcc9c61ee9eb\\\\\\\"\\u003e\\u003ccode\\u003e8cd31d65\\u003c/code\\u003e\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-22\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-22\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.19.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.19.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1120\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.12.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-24\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-24\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/create-remix/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-architect/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare-pages/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare-workers/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-css-bundle/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-deno/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-dev/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-eslint-config/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-express/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-node/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-react/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-serve/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-server-runtime/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-testing/CHANGELOG.md#230\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.2.0...remix@2.3.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.2.0...v2.3.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v220\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v220\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.2.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-10-31\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-11\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-11\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"vite\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#vite\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eVite!\\u003c/h4\\u003e\\\\n\\u003cp\\u003eRemix \\u003ccode\\u003e2.2.0\\u003c/code\\u003e adds unstable support for Vite for Node-based apps! See our \\u003ca href=\\\\\\\"https://remix.run/blog/remix-heart-vite\\\\\\\"\\u003eannouncement blog post\\u003c/a\\u003e and the \\u003ca href=\\\\\\\"https://remix.run/docs/en/2.2.0/future/vite\\\\\\\"\\u003e\\u003cem\\u003eFuture \\u003e Vite\\u003c/em\\u003e page in the Remix docs\\u003c/a\\u003e for more details.\\u003c/p\\u003e\\\\n\\u003cp\\u003eYou can try it out today with two new (unstable) templates:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"shellscript\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"shellscript\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e# minimal server\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003enpx\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003ecreate-remix@latest\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e--template\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eremix-run/remix/templates/unstable-vite\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base03)\\\\\\\"\\u003e# custom server (Express example)\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003enpx\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003ecreate-remix@latest\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003e--template\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eremix-run/remix/templates/unstable-vite-express\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eNew APIs in \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/strong\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_vitePlugin\\u003c/code\\u003e: The new Remix Vite plugin\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_createViteServer\\u003c/code\\u003e: Creates a Vite server in middleware mode for interop with custom servers\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_loadViteServerBuild\\u003c/code\\u003e: Allows your custom server to delegate SSR requests to Vite during development\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eChanged APIs\\u003c/strong\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreateRequestHandler\\u003c/code\\u003e: Now also allows the \\u003ccode\\u003ebuild\\u003c/code\\u003e argument to be a function that will be used to dynamically load new builds for each request during development\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003cstrong\\u003eOther Runtimes\\u003c/strong\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eDeno support is untested, but should work through Deno's Node/\\u003ccode\\u003enpm\\u003c/code\\u003e interop\\u003c/li\\u003e\\\\n\\u003cli\\u003eCloudFlare support is not yet available\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"new-fetcher-apis\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#new-fetcher-apis\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eNew Fetcher APIs\\u003c/h4\\u003e\\\\n\\u003cp\\u003ePer this \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/7698\\\\\\\"\\u003eRFC\\u003c/a\\u003e, we've introduced some new APIs that give you more granular control over your fetcher behaviors:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eYou may now specify your own fetcher identifier via \\u003ccode\\u003euseFetcher({ key: string })\\u003c/code\\u003e, which allows you to access the same fetcher instance from different components in your application without prop-drilling\\u003c/li\\u003e\\\\n\\u003cli\\u003eFetcher keys are now exposed on the fetchers returned from \\u003ccode\\u003euseFetchers\\u003c/code\\u003e so that they can be looked up by \\u003ccode\\u003ekey\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eForm\\u003c/code\\u003e and \\u003ccode\\u003euseSubmit\\u003c/code\\u003e now support optional \\u003ccode\\u003enavigate\\u003c/code\\u003e/\\u003ccode\\u003efetcherKey\\u003c/code\\u003e props/params to allow kicking off a fetcher submission under the hood with an optionally user-specified \\u003ccode\\u003ekey\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e\\u0026#x3C;Form method=\\\\\\\"post\\\\\\\" navigate={false} fetcherKey=\\\\\\\"my-key\\\\\\\"\\u003e\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003esubmit(data, { method: \\\\\\\"post\\\\\\\", navigate: false, fetcherKey: \\\\\\\"my-key\\\\\\\" })\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eInvoking a fetcher in this way is ephemeral and stateless\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf you need to access the state of one of these fetchers, you will need to leverage \\u003ccode\\u003euseFetchers()\\u003c/code\\u003e or \\u003ccode\\u003euseFetcher({ key })\\u003c/code\\u003e to look it up elsewhere\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"persistence-future-flag\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#persistence-future-flag\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePersistence Future Flag\\u003c/h4\\u003e\\\\n\\u003cp\\u003ePer the same \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/discussions/7698\\\\\\\"\\u003eRFC\\u003c/a\\u003e as above, we've introduced a new \\u003ccode\\u003efuture.v3_fetcherPersist\\u003c/code\\u003e flag that allows you to opt-into the new fetcher persistence/cleanup behavior. Instead of being immediately cleaned up on unmount, fetchers will persist until they return to an \\u003ccode\\u003eidle\\u003c/code\\u003e state. This makes pending/optimistic UI \\u003cem\\u003emuch\\u003c/em\\u003e easier in scenarios where the originating fetcher needs to unmount.\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis is sort of a long-standing bug fix as the \\u003ccode\\u003euseFetchers()\\u003c/code\\u003e API was always supposed to only reflect \\u003cstrong\\u003ein-flight\\u003c/strong\\u003e fetcher information for pending/optimistic UI -- it was not intended to reflect fetcher data or hang onto fetchers after they returned to an \\u003ccode\\u003eidle\\u003c/code\\u003e state\\u003c/li\\u003e\\\\n\\u003cli\\u003eKeep an eye out for the following specific behavioral changes when opting into this flag and check your app for compatibility:\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eFetchers that complete \\u003cem\\u003ewhile still mounted\\u003c/em\\u003e will no longer appear in \\u003ccode\\u003euseFetchers()\\u003c/code\\u003e after completion - they served no purpose in there since you can access the data via \\u003ccode\\u003euseFetcher().data\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eFetchers that previously unmounted \\u003cem\\u003ewhile in-flight\\u003c/em\\u003e will not be immediately aborted and will instead be cleaned up once they return to an \\u003ccode\\u003eidle\\u003c/code\\u003e state\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThey will remain exposed via \\u003ccode\\u003euseFetchers\\u003c/code\\u003e while in-flight so you can still access pending/optimistic data after unmount\\u003c/li\\u003e\\\\n\\u003cli\\u003eIf a fetcher is no longer mounted when it completes, then it's result will not be post processed - e.g., redirects will not be followed and errors will not bubble up in the UI\\u003c/li\\u003e\\\\n\\u003cli\\u003eHowever, if a fetcher was re-mounted elsewhere in the tree using the same \\u003ccode\\u003ekey\\u003c/code\\u003e, then it's result will be processed, even if the originating fetcher was unmounted\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-14\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-14\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eUnstable \\u003ccode\\u003evite\\u003c/code\\u003e support (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7590\\\\\\\"\\u003e#7590\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eNew fetcher \\u003ccode\\u003ekey\\u003c/code\\u003e APIs and \\u003ccode\\u003enavigate\\u003c/code\\u003e/\\u003ccode\\u003efetcherKey\\u003c/code\\u003e params for navigational APIs (\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/pull/10960\\\\\\\"\\u003e#10960\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eNew \\u003ccode\\u003efuture.v3_fetcherPersist\\u003c/code\\u003e flag (\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/pull/10962\\\\\\\"\\u003e#10962\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-40\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-40\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e: Allow the Express adapter to work behind a proxy when using \\u003ccode\\u003eapp.enable('trust proxy')\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7323\\\\\\\"\\u003e#7323\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003ePreviously, this used \\u003ccode\\u003ereq.get('host')\\u003c/code\\u003e to construct the Remix \\u003ccode\\u003eRequest\\u003c/code\\u003e, but that does not respect \\u003ccode\\u003eX-Forwarded-Host\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis now uses \\u003ccode\\u003ereq.hostname\\u003c/code\\u003e which will respect \\u003ccode\\u003eX-Forwarded-Host\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e: Fix warning that could be inadvertently logged when using route files with no \\u003ccode\\u003edefault\\u003c/code\\u003e export (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7745\\\\\\\"\\u003e#7745\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e: Support local tarballs with a \\u003ccode\\u003e.tgz\\u003c/code\\u003e extension which allows direct support for \\u003ca href=\\\\\\\"https://pnpm.io/cli/pack\\\\\\\"\\u003e\\u003ccode\\u003epnpm pack\\u003c/code\\u003e tarballs\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7649\\\\\\\"\\u003e#7649\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e: Default the Remix app version to the version of \\u003ccode\\u003ecreate-remix\\u003c/code\\u003e being used (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7670\\\\\\\"\\u003e#7670\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThis most notably enables easier usage of tags, e.g. \\u003ccode\\u003enpm create remix@nightly\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-23\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-23\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.18.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.18.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1110\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.11.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-25\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-25\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/create-remix/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-architect/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare-pages/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare-workers/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-css-bundle/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-deno/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-dev/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-eslint-config/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-express/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-node/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-react/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-serve/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-server-runtime/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-testing/CHANGELOG.md#220\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.1.0...remix@2.2.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.1.0...v2.2.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v210\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v210\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.1.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-10-16\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"whats-changed-12\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#whats-changed-12\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWhat's Changed\\u003c/h3\\u003e\\\\n\\u003ch4 id=\\\\\\\"view-transitions\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#view-transitions\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eView Transitions\\u003c/h4\\u003e\\\\n\\u003cp\\u003eWe're excited to release experimental support for the the \\u003ca href=\\\\\\\"https://developer.mozilla.org/en-US/docs/Web/API/ViewTransition\\\\\\\"\\u003eView Transitions API\\u003c/a\\u003e in Remix! You can now trigger navigational DOM updates to be wrapped in \\u003ccode\\u003edocument.startViewTransition\\u003c/code\\u003e to enable CSS animated transitions on SPA navigations in your application.\\u003c/p\\u003e\\\\n\\u003cp\\u003eThe simplest approach to enabling a View Transition in your Remix app is via the new \\u003ca href=\\\\\\\"https://remix.run/docs/components/link#unstable_viewtransition\\\\\\\"\\u003e\\u003ccode\\u003e\\u0026#x3C;Link unstable_viewTransition\\u003e\\u003c/code\\u003e\\u003c/a\\u003e prop. This will cause the navigation DOM update to be wrapped in \\u003ccode\\u003edocument.startViewTransition\\u003c/code\\u003e which will enable transitions for the DOM update. Without any additional CSS styles, you'll get a basic cross-fade animation for your page.\\u003c/p\\u003e\\\\n\\u003cp\\u003eIf you need to apply more fine-grained styles for your animations, you can leverage the \\u003ca href=\\\\\\\"https://remix.run/docs/hooks/use-view-transition-state\\\\\\\"\\u003e\\u003ccode\\u003eunstable_useViewTransitionState\\u003c/code\\u003e\\u003c/a\\u003e hook which will tell you when a transition is in progress and you can use that to apply classes or styles:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"jsx\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"jsx\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003efunction\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eImageLink\\u003c/span\\u003e(\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eto\\u003c/span\\u003e, \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003esrc\\u003c/span\\u003e, \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ealt\\u003c/span\\u003e) {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003econst\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eisTransitioning\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eunstable_useViewTransitionState\\u003c/span\\u003e(\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eto\\u003c/span\\u003e);\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003ereturn\\u003c/span\\u003e (\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"4\\\\\\\"\\u003e \\u0026#x3C;\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eLink\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eto\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eto\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eunstable_viewTransition\\u003c/span\\u003e\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"5\\\\\\\"\\u003e \\u0026#x3C;\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eimg\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"6\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003esrc\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003esrc\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"7\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003ealt\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ealt\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"8\\\\\\\"\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003estyle\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e{\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"9\\\\\\\"\\u003e viewTransitionName: \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eisTransitioning\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e?\\u003c/span\\u003e \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eimage-expand\\u003c/span\\u003e\\\\\\\" \\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e:\\u003c/span\\u003e \\\\\\\"\\\\\\\",\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"10\\\\\\\"\\u003e }\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"11\\\\\\\"\\u003e /\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"12\\\\\\\"\\u003e \\u0026#x3C;/\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eLink\\u003c/span\\u003e\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"13\\\\\\\"\\u003e );\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"14\\\\\\\"\\u003e}\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eYou can also use the \\u003ca href=\\\\\\\"https://remix.run/docs/components/nav-link#unstable_viewtransition\\\\\\\"\\u003e\\u003ccode\\u003e\\u0026#x3C;NavLink unstable_viewTransition\\u003e\\u003c/code\\u003e\\u003c/a\\u003e shorthand which will manage the hook usage for you and automatically add a \\u003ccode\\u003etransitioning\\u003c/code\\u003e class to the \\u003ccode\\u003e\\u0026#x3C;a\\u003e\\u003c/code\\u003e during the transition:\\u003c/p\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"css\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"css\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ea\\u003c/span\\u003e.\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003etransitioning\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eimg\\u003c/span\\u003e {\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e view-transition-name: \\\\\\\"\\u003cspan style=\\\\\\\"color: var(--base0B)\\\\\\\"\\u003eimage-expand\\u003c/span\\u003e\\\\\\\";\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e}\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cdiv data-code-block=\\\\\\\"\\\\\\\" data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"jsx\\\\\\\"\\u003e\\u003cpre data-line-numbers=\\\\\\\"true\\\\\\\" data-lang=\\\\\\\"jsx\\\\\\\" style=\\\\\\\"color: var(--base05);\\\\\\\"\\u003e\\u003ccode\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"1\\\\\\\"\\u003e\\u0026#x3C;\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eNavLink\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eto\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eto\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003eunstable_viewTransition\\u003c/span\\u003e\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"2\\\\\\\"\\u003e \\u0026#x3C;\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003eimg\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003esrc\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003esrc\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e \\u003cspan style=\\\\\\\"color: var(--base0D)\\\\\\\"\\u003ealt\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0E)\\\\\\\"\\u003e=\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e{\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base08)\\\\\\\"\\u003ealt\\u003c/span\\u003e\\u003cspan style=\\\\\\\"color: var(--base0F)\\\\\\\"\\u003e}\\u003c/span\\u003e /\\u003e\\\\n\\u003c/span\\u003e\\u003cspan class=\\\\\\\"codeblock-line\\\\\\\" data-line-number=\\\\\\\"3\\\\\\\"\\u003e\\u0026#x3C;/\\u003cspan style=\\\\\\\"color: var(--base0A)\\\\\\\"\\u003eNavLink\\u003c/span\\u003e\\u003e\\\\n\\u003c/span\\u003e\\u003c/code\\u003e\\u003c/pre\\u003e\\u003c/div\\u003e\\\\n\\u003cp\\u003eFor an example usage of View Transitions, check out \\u003ca href=\\\\\\\"https://github.com/brophdawg11/react-router-records\\\\\\\"\\u003eour fork\\u003c/a\\u003e of the \\u003ca href=\\\\\\\"https://github.com/Charca/astro-records\\\\\\\"\\u003eAstro Records\\u003c/a\\u003e demo (which uses React Router but so does Remix 😉).\\u003c/p\\u003e\\\\n\\u003cp\\u003eFor more information on using the View Transitions API, please refer to the \\u003ca href=\\\\\\\"https://developer.chrome.com/docs/web-platform/view-transitions/\\\\\\\"\\u003eSmooth and simple transitions with the View Transitions API\\u003c/a\\u003e guide from the Google Chrome team.\\u003c/p\\u003e\\\\n\\u003ch4 id=\\\\\\\"stable-createremixstub\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#stable-createremixstub\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eStable \\u003ccode\\u003ecreateRemixStub\\u003c/code\\u003e\\u003c/h4\\u003e\\\\n\\u003cp\\u003eAfter real-world experience, we're confident in the \\u003ca href=\\\\\\\"https://remix.run/docs/utils/create-remix-stub\\\\\\\"\\u003e\\u003ccode\\u003ecreateRemixStub\\u003c/code\\u003e\\u003c/a\\u003e API and ready to commit to it, so in \\u003ccode\\u003e2.1.0\\u003c/code\\u003e we've removed the \\u003ccode\\u003eunstable_\\u003c/code\\u003e prefix.\\u003c/p\\u003e\\\\n\\u003cp\\u003e⚠️ Please note that this did involve 1 \\u003cem\\u003esmall\\u003c/em\\u003e breaking change - the \\u003ccode\\u003e\\u0026#x3C;RemixStub remixConfigFuture\\u003e\\u003c/code\\u003e prop has been renamed to \\u003ccode\\u003e\\u0026#x3C;RemixStub future\\u003e\\u003c/code\\u003e to decouple the \\u003ccode\\u003efuture\\u003c/code\\u003e prop from a specific file location.\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"minor-changes-15\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#minor-changes-15\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eMinor Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eAdded unstable support for the View Transition API (\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/pull/10916\\\\\\\"\\u003e#10916\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eStabilized the \\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e \\u003ccode\\u003ecreateRemixStub\\u003c/code\\u003e helper (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7647\\\\\\\"\\u003e#7647\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-41\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-41\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eEmulate types for \\u003ccode\\u003eJSON.parse(JSON.stringify(x))\\u003c/code\\u003e in \\u003ccode\\u003eSerializeFrom\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7605\\\\\\\"\\u003e#7605\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNotably, type fields that are only assignable to \\u003ccode\\u003eundefined\\u003c/code\\u003e after serialization are now omitted since \\u003ccode\\u003eJSON.stringify |\\u003e JSON.parse\\u003c/code\\u003e will omit them. See test cases for examples\\u003c/li\\u003e\\\\n\\u003cli\\u003eThis fixes type errors when upgrading to v2 from 1.19\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eAvoid mutating \\u003ccode\\u003emeta\\u003c/code\\u003e object when \\u003ccode\\u003etagName\\u003c/code\\u003e is specified (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7594\\\\\\\"\\u003e#7594\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix FOUC on subsequent client-side navigations to \\u003ccode\\u003eroute.lazy\\u003c/code\\u003e routes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7576\\\\\\\"\\u003e#7576\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eExport the proper Remix \\u003ccode\\u003euseMatches\\u003c/code\\u003e wrapper to fix \\u003ccode\\u003eUIMatch\\u003c/code\\u003e typings (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7551\\\\\\\"\\u003e#7551\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e - sourcemap takes into account special chars in output file (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7574\\\\\\\"\\u003e#7574\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e - Flush headers for \\u003ccode\\u003etext/event-stream\\u003c/code\\u003e responses (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7619\\\\\\\"\\u003e#7619\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-24\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-24\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.17.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.17.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1100\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.10.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-26\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-26\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/create-remix/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-architect/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare-pages/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare-workers/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-css-bundle/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-deno/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-dev/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-eslint-config/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-express/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-node/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-react/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-serve/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-server-runtime/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-testing/CHANGELOG.md#210\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.0.1...remix@2.1.0\\\\\\\"\\u003e\\u003ccode\\u003ev2.0.1...v2.1.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v201\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v201\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.0.1\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-09-21\\u003c/p\\u003e\\\\n\\u003ch3 id=\\\\\\\"patch-changes-42\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#patch-changes-42\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ePatch Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eFix types for MDX files when using pnpm (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7491\\\\\\\"\\u003e#7491\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eUpdate \\u003ccode\\u003egetDependenciesToBundle\\u003c/code\\u003e to handle ESM packages without main exports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7272\\\\\\\"\\u003e#7272\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNote that these packages must expose \\u003ccode\\u003epackage.json\\u003c/code\\u003e in their \\u003ccode\\u003eexports\\u003c/code\\u003e field so that their path can be resolved\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix server builds where \\u003ccode\\u003eserverBuildPath\\u003c/code\\u003e extension is \\u003ccode\\u003e.cjs\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7180\\\\\\\"\\u003e#7180\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix HMR for CJS projects using \\u003ccode\\u003eremix-serve\\u003c/code\\u003e and manual mode (\\u003ccode\\u003eremix dev --manual\\u003c/code\\u003e) (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7487\\\\\\\"\\u003e#7487\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eBy explicitly busting the \\u003ccode\\u003erequire\\u003c/code\\u003e cache, \\u003ccode\\u003eremix-serve\\u003c/code\\u003e now correctly re-imports new server changes in CJS\\u003c/li\\u003e\\\\n\\u003cli\\u003eESM projects were already working correctly and are not affected by this.\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix error caused by partially written server build (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7470\\\\\\\"\\u003e#7470\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003ePreviously, it was possible to trigger a reimport of the app server code before the new server build had completely been written. Reimporting the partially written server build caused issues related to \\u003ccode\\u003ebuild.assets\\u003c/code\\u003e being undefined and crashing when reading \\u003ccode\\u003ebuild.assets.version\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdd second generic to \\u003ccode\\u003eUIMatch\\u003c/code\\u003e for \\u003ccode\\u003ehandle\\u003c/code\\u003e field (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7464\\\\\\\"\\u003e#7464\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eFix resource routes being loaded through \\u003ccode\\u003eroute.lazy\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7498\\\\\\\"\\u003e#7498\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eThrow a semantically correct 405 \\u003ccode\\u003eErrorResponse\\u003c/code\\u003e instead of just an \\u003ccode\\u003eError\\u003c/code\\u003e when submitting to a route without an \\u003ccode\\u003eaction\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7423\\\\\\\"\\u003e#7423\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eUpdate to latest version of \\u003ccode\\u003e@remix-run/web-fetch\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7477\\\\\\\"\\u003e#7477\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSwitch from \\u003ccode\\u003ecrypto.randomBytes\\u003c/code\\u003e to \\u003ccode\\u003ecrypto.webcrypto.getRandomValues\\u003c/code\\u003e for file session storage ID generation (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7203\\\\\\\"\\u003e#7203\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eUse native \\u003ccode\\u003eBlob\\u003c/code\\u003e class instead of polyfill (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7217\\\\\\\"\\u003e#7217\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package 🔗\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-dev/CHANGELOG.md#201\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-node/CHANGELOG.md#201\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-react/CHANGELOG.md#201\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-serve/CHANGELOG.md#201\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003cp\\u003e\\u003cstrong\\u003eFull Changelog\\u003c/strong\\u003e: \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/compare/remix@2.0.0...remix@2.0.1\\\\\\\"\\u003e\\u003ccode\\u003ev2.0.0...v2.0.1\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\\\\n\\u003ch2 id=\\\\\\\"v200\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#v200\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003ev2.0.0\\u003c/h2\\u003e\\\\n\\u003cp\\u003eDate: 2023-09-15\\u003c/p\\u003e\\\\n\\u003cp\\u003eWe're \\u003cem\\u003e\\u003cstrong\\u003eso\\u003c/strong\\u003e\\u003c/em\\u003e excited to release Remix v2 to you and we really hope this upgrade is one of the smoothest framework upgrades you've ever experienced! That was our primary goal with v2 - something we aimed to achieve through a heavy use of deprecation warnings and \\u003ca href=\\\\\\\"https://remix.run/blog/future-flags\\\\\\\"\\u003eFuture Flags\\u003c/a\\u003e in Remix v1.\\u003c/p\\u003e\\\\n\\u003cp\\u003eIf you are on the latest \\u003ccode\\u003e1.x\\u003c/code\\u003e version and you've enabled all future flags and addressed all console warnings, then our hope is that you are 90% of the way to being upgraded for v2. There are always going to be a few things that we \\u003cem\\u003ecan't\\u003c/em\\u003e put behind a flag (like breaking type changes) or come up at the very last moment and don't have time to add as a warning or flag in \\u003ccode\\u003e1.x\\u003c/code\\u003e.\\u003c/p\\u003e\\\\n\\u003cp\\u003eIf you're \\u003cem\\u003enot\\u003c/em\\u003e yet on the latest 1.x version we'd recommend first upgrading to that and resolving any flag/console warnings:\\u003c/p\\u003e\\\\n\\u003cpre\\u003e\\u003ccode class=\\\\\\\"language-sh\\\\\\\"\\u003e\\u003e npx upgrade-remix 1.19.3\\\\n\\u003c/code\\u003e\\u003c/pre\\u003e\\\\n\\u003ch3 id=\\\\\\\"breaking-changes\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#breaking-changes\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eBreaking Changes\\u003c/h3\\u003e\\\\n\\u003cp\\u003eBelow is a \\u003cem\\u003every concise\\u003c/em\\u003e list of the breaking changes in v2.\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eFor the most thorough discussion of breaking changes, please read the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2\\\\\\\"\\u003e\\u003cstrong\\u003eUpgrading to v2\\u003c/strong\\u003e\\u003c/a\\u003e guide. This document provides a comprehensive walkthrough of the breaking changes that come along with v2 - and instructions on how to adapt your application to handle them\\u003c/li\\u003e\\\\n\\u003cli\\u003eFor additional details, you can refer to the \\u003ca href=\\\\\\\"#changes-by-package\\\\\\\"\\u003eChanges by Package\\u003c/a\\u003e section below\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"upgraded-dependency-requirements\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#upgraded-dependency-requirements\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpgraded Dependency Requirements\\u003c/h4\\u003e\\\\n\\u003cp\\u003eRemix v2 has upgraded it's minimum version support for React and Node and now officially requires:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eReact 18 (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7121\\\\\\\"\\u003e#7121\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eFor information on upgrading to React 18, please see the React \\u003ca href=\\\\\\\"https://react.dev/blog/2022/03/08/react-18-upgrade-guide\\\\\\\"\\u003eupgrade guide\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eNode 18 or later (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6939\\\\\\\"\\u003e#6939\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7292\\\\\\\"\\u003e#7292\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eFor information on upgrading to Node 18, please see the Node \\u003ca href=\\\\\\\"https://nodejs.org/en/blog/announcements/v18-release-announce\\\\\\\"\\u003ev18 announcement\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003ePlease refer to the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/other-api/node#version-support\\\\\\\"\\u003eRemix documentation\\u003c/a\\u003e for an overview of when we drop support for Node versions\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"removed-future-flags\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#removed-future-flags\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eRemoved Future Flags\\u003c/h4\\u003e\\\\n\\u003cp\\u003eThe following future flags were removed and their behavior is now the default - you can remove all of these from your \\u003ccode\\u003eremix.config.js\\u003c/code\\u003e file.\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#remix-dev\\\\\\\"\\u003e\\u003ccode\\u003ev2_dev\\u003c/code\\u003e\\u003c/a\\u003e - New dev server with HMR+HDR (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7002\\\\\\\"\\u003e#7002\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf you had configurations in \\u003ccode\\u003efuture.v2_dev\\u003c/code\\u003e instead of just the boolean value (i.e., \\u003ccode\\u003efuture.v2_dev.port\\u003c/code\\u003e), you can lift them into a root \\u003ccode\\u003edev\\u003c/code\\u003e object in your \\u003ccode\\u003eremix.config.js\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#catchboundary-and-errorboundary\\\\\\\"\\u003e\\u003ccode\\u003ev2_errorBoundary\\u003c/code\\u003e\\u003c/a\\u003e - Removed \\u003ccode\\u003eCatchBoundary\\u003c/code\\u003e in favor of a singular \\u003ccode\\u003eErrorBoundary\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6906\\\\\\\"\\u003e#6906\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#route-headers\\\\\\\"\\u003e\\u003ccode\\u003ev2_headers\\u003c/code\\u003e\\u003c/a\\u003e - Altered the logic for \\u003ccode\\u003eheaders\\u003c/code\\u003e in nested route scenarios (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6979\\\\\\\"\\u003e#6979\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#route-meta\\\\\\\"\\u003e\\u003ccode\\u003ev2_meta\\u003c/code\\u003e\\u003c/a\\u003e - Altered the return format of \\u003ccode\\u003emeta()\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6958\\\\\\\"\\u003e#6958\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#formmethod\\\\\\\"\\u003e\\u003ccode\\u003ev2_normalizeFormMethod\\u003c/code\\u003e\\u003c/a\\u003e - Normalize \\u003ccode\\u003eformMethod\\u003c/code\\u003e APIs to uppercase (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6875\\\\\\\"\\u003e#6875\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#file-system-route-convention\\\\\\\"\\u003e\\u003ccode\\u003ev2_routeConvention\\u003c/code\\u003e\\u003c/a\\u003e - Routes use a flat route convention by default now (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6969\\\\\\\"\\u003e#6969\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch4 id=\\\\\\\"breaking-changesapi-removals\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#breaking-changesapi-removals\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eBreaking Changes/API Removals\\u003c/h4\\u003e\\\\n\\u003ch5 id=\\\\\\\"with-deprecation-warnings\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#with-deprecation-warnings\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWith deprecation warnings\\u003c/h5\\u003e\\\\n\\u003cp\\u003eThe following lists other breaking changes/API removals which had deprecation warnings in Remix v1. If you're on the latest \\u003ccode\\u003e1.19.3\\u003c/code\\u003e release without any console warnings, then you're probably good to go on all of these!\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix.config.js\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRenamed \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#browserbuilddirectory\\\\\\\"\\u003e\\u003ccode\\u003ebrowserBuildDirectory\\u003c/code\\u003e\\u003c/a\\u003e to \\u003ccode\\u003eassetsBuildDirectory\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6900\\\\\\\"\\u003e#6900\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#devserverbroadcastdelay\\\\\\\"\\u003e\\u003ccode\\u003edevServerBroadcastDelay\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7063\\\\\\\"\\u003e#7063\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRenamed \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#devserverport\\\\\\\"\\u003e\\u003ccode\\u003edevServerPort\\u003c/code\\u003e\\u003c/a\\u003e to \\u003ccode\\u003edev.port\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/commit/000457e0ae025d9b94e721af254c319e83438923\\\\\\\"\\u003e\\u003ccode\\u003e000457e0\\u003c/code\\u003e\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNote that if you are opting into this in a \\u003ccode\\u003e1.x\\u003c/code\\u003e release, your config flag will be \\u003ccode\\u003efuture.v2_dev.port\\u003c/code\\u003e, but on a stable \\u003ccode\\u003e2.x\\u003c/code\\u003e release it will be \\u003ccode\\u003edev.port\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eChanged the default \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#servermoduleformat\\\\\\\"\\u003e\\u003ccode\\u003eserverModuleFormat\\u003c/code\\u003e\\u003c/a\\u003e from \\u003ccode\\u003ecjs\\u003c/code\\u003e to \\u003ccode\\u003eesm\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6949\\\\\\\"\\u003e#6949\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#serverbuildtarget\\\\\\\"\\u003e\\u003ccode\\u003eserverBuildTarget\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6896\\\\\\\"\\u003e#6896\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eChanged \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#serverbuilddirectory\\\\\\\"\\u003e\\u003ccode\\u003eserverBuildDirectory\\u003c/code\\u003e\\u003c/a\\u003e to \\u003ccode\\u003eserverBuildPath\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6897\\\\\\\"\\u003e#6897\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eNode built-ins are no longer polyfilled on the server by default, you must opt-into polyfills via \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#servernodebuiltinspolyfill\\\\\\\"\\u003e\\u003ccode\\u003eserverNodeBuiltinsPolyfill\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6911\\\\\\\"\\u003e#6911\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#usetransition\\\\\\\"\\u003e\\u003ccode\\u003euseTransition\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6870\\\\\\\"\\u003e#6870\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#usefetcher\\\\\\\"\\u003e\\u003ccode\\u003efetcher.type\\u003c/code\\u003e\\u003c/a\\u003e and flattened \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#usefetcher\\\\\\\"\\u003e\\u003ccode\\u003efetcher.submission\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6874\\\\\\\"\\u003e#6874\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e\\u0026#x3C;fetcher.Form method=\\\\\\\"get\\\\\\\"\\u003e\\u003c/code\\u003e is now more accurately categorized as \\u003ccode\\u003estate:\\\\\\\"loading\\\\\\\"\\u003c/code\\u003e instead of \\u003ccode\\u003estate:\\\\\\\"submitting\\\\\\\"\\u003c/code\\u003e to better align with the underlying GET request\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eRequire camelCased versions of \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#links-imagesizes-and-imagesrcset\\\\\\\"\\u003e\\u003ccode\\u003eimagesrcset\\u003c/code\\u003e/\\u003ccode\\u003eimagesizes\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6936\\\\\\\"\\u003e#6936\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch5 id=\\\\\\\"without-deprecation-warnings\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#without-deprecation-warnings\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eWithout deprecation warnings\\u003c/h5\\u003e\\\\n\\u003cp\\u003eUnfortunately, we didn't manage to get a deprecation warning on \\u003cem\\u003eevery\\u003c/em\\u003e breaking change or API removal 🙃. Here's a list of remaining changes that you may need to look into to upgrade to v2:\\u003c/p\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix.config.js\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNode built-ins are no longer polyfilled in the browser by default, you must opt-into polyfills via \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#browsernodebuiltinspolyfill\\\\\\\"\\u003e\\u003ccode\\u003ebrowserNodeBuiltinsPolyfill\\u003c/code\\u003e\\u003c/a\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7269\\\\\\\"\\u003e#7269\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003ePostCSS/Tailwind will be enabled by default if config files exist in your app, you may disable this via the \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#built-in-postcsstailwind-support\\\\\\\"\\u003e\\u003ccode\\u003epostcss\\u003c/code\\u003e and \\u003ccode\\u003etailwind\\u003c/code\\u003e\\u003c/a\\u003e flags (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6909\\\\\\\"\\u003e#6909\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemove \\u003ccode\\u003ecreateCloudflareKVSessionStorage\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6898\\\\\\\"\\u003e#6898\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eDrop \\u003ccode\\u003e@cloudflare/workers-types\\u003c/code\\u003e v2 \\u0026#x26; v3 support (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6925\\\\\\\"\\u003e#6925\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ccode\\u003eREMIX_DEV_HTTP_ORIGIN\\u003c/code\\u003e in favor of \\u003ccode\\u003eREMIX_DEV_ORIGIN\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6963\\\\\\\"\\u003e#6963\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ccode\\u003eREMIX_DEV_SERVER_WS_PORT\\u003c/code\\u003e in favor of \\u003ccode\\u003edev.port\\u003c/code\\u003e or \\u003ccode\\u003e--port\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6965\\\\\\\"\\u003e#6965\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ccode\\u003e--no-restart\\u003c/code\\u003e/\\u003ccode\\u003erestart\\u003c/code\\u003e flag in favor of \\u003ccode\\u003e--manual\\u003c/code\\u003e/\\u003ccode\\u003emanual\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6962\\\\\\\"\\u003e#6962\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ccode\\u003e--scheme\\u003c/code\\u003e/\\u003ccode\\u003escheme\\u003c/code\\u003e and \\u003ccode\\u003e--host\\u003c/code\\u003e/\\u003ccode\\u003ehost\\u003c/code\\u003e in favor of \\u003ccode\\u003eREMIX_DEV_ORIGIN\\u003c/code\\u003e instead (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6962\\\\\\\"\\u003e#6962\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved the \\u003ccode\\u003ecodemod\\u003c/code\\u003e command (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6918\\\\\\\"\\u003e#6918\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemove \\u003ccode\\u003e@remix-run/eslint-config/jest\\u003c/code\\u003e config (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6903\\\\\\\"\\u003e#6903\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemove magic imports ESLint warnings (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6902\\\\\\\"\\u003e#6902\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/netlify\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThe \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#netlify-adapter\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/netlify\\u003c/code\\u003e\\u003c/a\\u003e adapter has been removed in favor of the Netlify official adapters (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7058\\\\\\\"\\u003e#7058\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efetch\\u003c/code\\u003e is no longer polyfilled by default - apps must call \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#installglobals\\\\\\\"\\u003e\\u003ccode\\u003einstallGlobals()\\u003c/code\\u003e\\u003c/a\\u003e to install the polyfills (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7009\\\\\\\"\\u003e#7009\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003efetch\\u003c/code\\u003e and related APIs are no longer exported from \\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e - apps should use the versions in the global namespace (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7293\\\\\\\"\\u003e#7293\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eApps must call \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#source-map-support\\\\\\\"\\u003e\\u003ccode\\u003esourceMapSupport.install()\\u003c/code\\u003e\\u003c/a\\u003e to setup source map support\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemove \\u003ccode\\u003eunstable_shouldReload\\u003c/code\\u003e in favor of \\u003ccode\\u003eshouldRevalidate\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6865\\\\\\\"\\u003e#6865\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix-serve\\u003c/code\\u003e picks an open port if 3000 is taken and \\u003ccode\\u003ePORT\\u003c/code\\u003e is not specified (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7278\\\\\\\"\\u003e#7278\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eIntegrate \\u003ccode\\u003emanual\\u003c/code\\u003e mode (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7231\\\\\\\"\\u003e#7231\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemove undocumented \\u003ccode\\u003ecreateApp\\u003c/code\\u003e Node API (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7229\\\\\\\"\\u003e#7229\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003ePreserve dynamic imports in remix-serve for external bundle (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7173\\\\\\\"\\u003e#7173\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003e@remix-run/vercel\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThe \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/start/v2#vercel-adapter\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/vercel\\u003c/code\\u003e\\u003c/a\\u003e adapter has been removed in favor of out of the box functionality provided by Vercel (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7035\\\\\\\"\\u003e#7035\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eStop passing \\u003ccode\\u003eisTypeScript\\u003c/code\\u003e to \\u003ccode\\u003eremix.init\\u003c/code\\u003e script (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7099\\\\\\\"\\u003e#7099\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix\\u003c/code\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemoved magic exports (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6895\\\\\\\"\\u003e#6895\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch5 id=\\\\\\\"breaking-type-changes\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#breaking-type-changes\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eBreaking Type Changes\\u003c/h5\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemoved \\u003ccode\\u003eV2_\\u003c/code\\u003e prefixes from \\u003ccode\\u003efuture.v2_meta\\u003c/code\\u003e types as they are now the default behavior (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6958\\\\\\\"\\u003e#6958\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_MetaArgs\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eMetaArgs\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_MetaDescriptor\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eMetaDescriptor\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_MetaFunction\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eMetaFunction\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_MetaMatch\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eMetaMatch\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_MetaMatches\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eMetaMatches\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_ServerRuntimeMetaArgs\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eServerRuntimeMetaArgs\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_ServerRuntimeMetaDescriptor\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eServerRuntimeMetaDescriptor\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_ServerRuntimeMetaFunction\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eServerRuntimeMetaFunction\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_ServerRuntimeMetaMatch\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eServerRuntimeMetaMatch\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eV2_ServerRuntimeMetaMatches\\u003c/code\\u003e -\\u003e \\u003ccode\\u003eServerRuntimeMetaMatches\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eThe following types were adjusted to prefer \\u003ccode\\u003eunknown\\u003c/code\\u003e over \\u003ccode\\u003eany\\u003c/code\\u003e and to align with underlying React Router types (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7319\\\\\\\"\\u003e#7319\\u003c/a\\u003e):\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRenamed the \\u003ccode\\u003euseMatches()\\u003c/code\\u003e return type from \\u003ccode\\u003eRouteMatch\\u003c/code\\u003e to \\u003ccode\\u003eUIMatch\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eRenamed \\u003ccode\\u003eLoaderArgs\\u003c/code\\u003e/\\u003ccode\\u003eActionArgs\\u003c/code\\u003e to \\u003ccode\\u003eLoaderFunctionArgs\\u003c/code\\u003e/\\u003ccode\\u003eActionFunctionArgs\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eAppData\\u003c/code\\u003e changed from \\u003ccode\\u003eany\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eLocation[\\\\\\\"state\\\\\\\"]\\u003c/code\\u003e (\\u003ccode\\u003euseLocation.state\\u003c/code\\u003e) changed from \\u003ccode\\u003eany\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eUIMatch[\\\\\\\"data\\\\\\\"]\\u003c/code\\u003e (\\u003ccode\\u003euseMatches()[i].data\\u003c/code\\u003e) changed from \\u003ccode\\u003eany\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eUIMatch[\\\\\\\"handle\\\\\\\"]\\u003c/code\\u003e (\\u003ccode\\u003euseMatches()[i].handle\\u003c/code\\u003e) changed from \\u003ccode\\u003e{ [k: string]: any }\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eFetcher[\\\\\\\"data\\\\\\\"]\\u003c/code\\u003e (\\u003ccode\\u003euseFetcher().data\\u003c/code\\u003e) changed from \\u003ccode\\u003eany\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eMetaMatch.handle\\u003c/code\\u003e (used in \\u003ccode\\u003emeta()\\u003c/code\\u003e) changed from \\u003ccode\\u003eany\\u003c/code\\u003e to \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eAppData\\u003c/code\\u003e/\\u003ccode\\u003eRouteHandle\\u003c/code\\u003e are no longer exported as they are just aliases for \\u003ccode\\u003eunknown\\u003c/code\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"new-features\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#new-features\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eNew Features\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eNew \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/other-api/create-remix\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e CLI (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6887\\\\\\\"\\u003e#6887\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eMost notably, this removes the dropdown to choose your template/stack in favor of the \\u003ccode\\u003e--template\\u003c/code\\u003e flag and our ever-growing list of \\u003ca href=\\\\\\\"https://remix.run/docs/en/main/guides/templates\\\\\\\"\\u003eavailable templates\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdds a new \\u003ccode\\u003e--overwrite\\u003c/code\\u003e flag (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7062\\\\\\\"\\u003e#7062\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSupports the \\u003ccode\\u003ebun\\u003c/code\\u003e package manager (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7074\\\\\\\"\\u003e#7074\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003eDetect built mode via \\u003ccode\\u003ebuild.mode\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6964\\\\\\\"\\u003e#6964\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eSupport polyfilling node globals via \\u003ccode\\u003eserverNodeBuiltinsPolyfill.globals\\u003c/code\\u003e/\\u003ccode\\u003ebrowserNodeBuiltinsPolyfill.globals\\u003c/code\\u003e (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7269\\\\\\\"\\u003e#7269\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eNew \\u003ccode\\u003eredirectDocument\\u003c/code\\u003e utility to redirect via a fresh document load (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7040\\\\\\\"\\u003e#7040\\u003c/a\\u003e, \\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6842\\\\\\\"\\u003e#6842\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eAdd \\u003ccode\\u003eerror\\u003c/code\\u003e to \\u003ccode\\u003emeta\\u003c/code\\u003e params so you can render error titles, etc. (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7105\\\\\\\"\\u003e#7105\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_createRemixStub\\u003c/code\\u003e now supports adding \\u003ccode\\u003emeta\\u003c/code\\u003e/\\u003ccode\\u003elinks\\u003c/code\\u003e functions on stubbed Remix routes (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7186\\\\\\\"\\u003e#7186\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eunstable_createRemixStub\\u003c/code\\u003e no longer supports the \\u003ccode\\u003eelement\\u003c/code\\u003e/\\u003ccode\\u003eerrorElement\\u003c/code\\u003e properties on routes. You must use \\u003ccode\\u003eComponent\\u003c/code\\u003e/\\u003ccode\\u003eErrorBoundary\\u003c/code\\u003e to match what you would export from a Remix route module.\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"other-notable-changes\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#other-notable-changes\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eOther Notable Changes\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eRemix now uses React Router's \\u003ccode\\u003eroute.lazy\\u003c/code\\u003e method internally to load route modules on navigations (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7133\\\\\\\"\\u003e#7133\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eRemoved the \\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e \\u003ccode\\u003eatob\\u003c/code\\u003e/\\u003ccode\\u003ebtoa\\u003c/code\\u003e polyfills in favor of the built-in versions (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7206\\\\\\\"\\u003e#7206\\u003c/a\\u003e)\\u003c/li\\u003e\\\\n\\u003cli\\u003eDecouple the \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e package from the contents of the \\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e package (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/6982\\\\\\\"\\u003e#6982\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eThe contents of the \\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e package are now entirely managed by the Remix compiler. Even though it's still recommended that your Remix dependencies all share the same version, this change ensures that there are no runtime errors when upgrading \\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e without upgrading \\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e.\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ccode\\u003eremix-serve\\u003c/code\\u003e now picks an open port if 3000 is taken (\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/pull/7278\\\\\\\"\\u003e#7278\\u003c/a\\u003e)\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003eIf \\u003ccode\\u003ePORT\\u003c/code\\u003e env var is set, \\u003ccode\\u003eremix-serve\\u003c/code\\u003e will use that port\\u003c/li\\u003e\\\\n\\u003cli\\u003eOtherwise, \\u003ccode\\u003eremix-serve\\u003c/code\\u003e picks an open port (3000 unless that is already taken)\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"updated-dependencies-25\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#updated-dependencies-25\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eUpdated Dependencies\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/releases/tag/react-router%406.16.0\\\\\\\"\\u003e\\u003ccode\\u003ereact-router-dom@6.16.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#190\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/router@1.9.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-fetch%404.4.0\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/web-fetch@4.4.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-file%403.1.0\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/web-file@3.1.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-stream%401.1.0\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/web-stream@1.1.0\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\\n\\u003ch3 id=\\\\\\\"changes-by-package-27\\\\\\\"\\u003e\\u003ca aria-hidden=\\\\\\\"true\\\\\\\" tabindex=\\\\\\\"-1\\\\\\\" href=\\\\\\\"#changes-by-package-27\\\\\\\"\\u003e\\u003cspan class=\\\\\\\"icon icon-link\\\\\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003eChanges by Package\\u003c/h3\\u003e\\\\n\\u003cul\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/create-remix/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003ecreate-remix\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-architect/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/architect\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare-pages/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-pages\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare-workers/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/cloudflare-workers\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-css-bundle/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/css-bundle\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-deno/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/deno\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-dev/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/dev\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-eslint-config/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/eslint-config\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-express/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/express\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-node/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/node\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-react/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/react\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-serve/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/serve\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-server-runtime/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/server-runtime\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003cli\\u003e\\u003ca href=\\\\\\\"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-testing/CHANGELOG.md#200\\\\\\\"\\u003e\\u003ccode\\u003e@remix-run/testing\\u003c/code\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\\\n\\u003c/ul\\u003e\\\",\\\"CHANGELOG\\\",\\\"headings\\\",[960,965,969,972,975,978,981,983,986,988,991,993,996,998,1001,1004,1006,1009,1011,1014,1016,1019,1021,1023,1026,1029,1031,1033,1036,1038,1040,1043,1045,1048,1050,1053,1055,1057,1059,1061,1064,1066,1069,1072,1074,1076,1078,1080,1083,1085,1087,1090,1092,1094,1096,1098,1100,1103,1105,1107,1109,1112,1114,1116,1119,1121,1123,1125,1127,1129,1132,1134,1136,1138,1141,1143,1145,1148,1150,1152,1154,1157,1159,1161,1163,1165,1167,1170,1172,1174,1176,1178,1181,1183,1185,1188,1190,1192,1194,1196,1198,1201,1203,1205,1207,1210,1212,1214,1216,1218,1221,1223,1226,1228,1231,1233,1235,1237,1239,1241,1244,1246,1248,1250,1252,1254,1257,1259,1261,1263,1266,1268,1270,1272,1274,1276,1279,1281,1283,1285,1288,1290,1292,1294,1296,1298,1301,1303,1305,1307,1310,1312,1314,1316,1318,1320,1323,1325,1327,1329,1331,1333,1336,1338,1340,1342,1344,1346,1349,1351,1354,1357,1360,1363,1366,1368],{\\\"_961\\\":962,\\\"_955\\\":963,\\\"_24\\\":964},\\\"headingLevel\\\",\\\"h2\\\",\\\"v2.17.0\\\",\\\"v2170\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":968},\\\"h3\\\",\\\"Minor Changes\\\",\\\"minor-changes\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":971},\\\"Changes by Package\\\",\\\"changes-by-package\\\",{\\\"_961\\\":962,\\\"_955\\\":973,\\\"_24\\\":974},\\\"v2.16.8\\\",\\\"v2168\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":977},\\\"Patch Changes\\\",\\\"patch-changes\\\",{\\\"_961\\\":962,\\\"_955\\\":979,\\\"_24\\\":980},\\\"v2.16.7\\\",\\\"v2167\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":982},\\\"patch-changes-1\\\",{\\\"_961\\\":962,\\\"_955\\\":984,\\\"_24\\\":985},\\\"v2.16.6\\\",\\\"v2166\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":987},\\\"patch-changes-2\\\",{\\\"_961\\\":962,\\\"_955\\\":989,\\\"_24\\\":990},\\\"v2.16.5\\\",\\\"v2165\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":992},\\\"patch-changes-3\\\",{\\\"_961\\\":962,\\\"_955\\\":994,\\\"_24\\\":995},\\\"v2.16.4\\\",\\\"v2164\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":997},\\\"patch-changes-4\\\",{\\\"_961\\\":962,\\\"_955\\\":999,\\\"_24\\\":1000},\\\"v2.16.3\\\",\\\"v2163\\\",{\\\"_961\\\":966,\\\"_955\\\":1002,\\\"_24\\\":1003},\\\"Security Notice\\\",\\\"security-notice\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1005},\\\"patch-changes-5\\\",{\\\"_961\\\":962,\\\"_955\\\":1007,\\\"_24\\\":1008},\\\"v2.16.2\\\",\\\"v2162\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1010},\\\"patch-changes-6\\\",{\\\"_961\\\":962,\\\"_955\\\":1012,\\\"_24\\\":1013},\\\"v2.16.1\\\",\\\"v2161\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1015},\\\"patch-changes-7\\\",{\\\"_961\\\":962,\\\"_955\\\":1017,\\\"_24\\\":1018},\\\"v2.16.0\\\",\\\"v2160\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1020},\\\"minor-changes-1\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1022},\\\"patch-changes-8\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1025},\\\"Updated Dependencies\\\",\\\"updated-dependencies\\\",{\\\"_961\\\":962,\\\"_955\\\":1027,\\\"_24\\\":1028},\\\"v2.15.3\\\",\\\"v2153\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1030},\\\"patch-changes-9\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1032},\\\"updated-dependencies-1\\\",{\\\"_961\\\":962,\\\"_955\\\":1034,\\\"_24\\\":1035},\\\"v2.15.2\\\",\\\"v2152\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1037},\\\"patch-changes-10\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1039},\\\"updated-dependencies-2\\\",{\\\"_961\\\":962,\\\"_955\\\":1041,\\\"_24\\\":1042},\\\"v2.15.1\\\",\\\"v2151\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1044},\\\"patch-changes-11\\\",{\\\"_961\\\":962,\\\"_955\\\":1046,\\\"_24\\\":1047},\\\"v2.15.0\\\",\\\"v2150\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1049},\\\"patch-changes-12\\\",{\\\"_961\\\":962,\\\"_955\\\":1051,\\\"_24\\\":1052},\\\"v2.14.0\\\",\\\"v2140\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1054},\\\"minor-changes-2\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1056},\\\"patch-changes-13\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1058},\\\"updated-dependencies-3\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1060},\\\"changes-by-package-1\\\",{\\\"_961\\\":962,\\\"_955\\\":1062,\\\"_24\\\":1063},\\\"v2.13.1\\\",\\\"v2131\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1065},\\\"patch-changes-14\\\",{\\\"_961\\\":962,\\\"_955\\\":1067,\\\"_24\\\":1068},\\\"v2.13.0\\\",\\\"v2130\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1071},\\\"What's Changed\\\",\\\"whats-changed\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1073},\\\"minor-changes-3\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1075},\\\"patch-changes-15\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1077},\\\"updated-dependencies-4\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1079},\\\"changes-by-package-2\\\",{\\\"_961\\\":962,\\\"_955\\\":1081,\\\"_24\\\":1082},\\\"v2.12.1\\\",\\\"v2121\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1084},\\\"patch-changes-16\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1086},\\\"changes-by-package-3\\\",{\\\"_961\\\":962,\\\"_955\\\":1088,\\\"_24\\\":1089},\\\"v2.12.0\\\",\\\"v2120\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1091},\\\"whats-changed-1\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1093},\\\"minor-changes-4\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1095},\\\"patch-changes-17\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1097},\\\"updated-dependencies-5\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1099},\\\"changes-by-package-4\\\",{\\\"_961\\\":962,\\\"_955\\\":1101,\\\"_24\\\":1102},\\\"v2.11.2\\\",\\\"v2112\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1104},\\\"patch-changes-18\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1106},\\\"updated-dependencies-6\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1108},\\\"changes-by-package-5\\\",{\\\"_961\\\":962,\\\"_955\\\":1110,\\\"_24\\\":1111},\\\"v2.11.1\\\",\\\"v2111\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1113},\\\"patch-changes-19\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1115},\\\"changes-by-package-6\\\",{\\\"_961\\\":962,\\\"_955\\\":1117,\\\"_24\\\":1118},\\\"v2.11.0\\\",\\\"v2110\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1120},\\\"whats-changed-2\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1122},\\\"minor-changes-5\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1124},\\\"patch-changes-20\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1126},\\\"updated-dependencies-7\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1128},\\\"changes-by-package-7\\\",{\\\"_961\\\":962,\\\"_955\\\":1130,\\\"_24\\\":1131},\\\"v2.10.3\\\",\\\"v2103\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1133},\\\"patch-changes-21\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1135},\\\"updated-dependencies-8\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1137},\\\"changes-by-package-8\\\",{\\\"_961\\\":962,\\\"_955\\\":1139,\\\"_24\\\":1140},\\\"v2.10.2\\\",\\\"v2102\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1142},\\\"patch-changes-22\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1144},\\\"changes-by-package-9\\\",{\\\"_961\\\":962,\\\"_955\\\":1146,\\\"_24\\\":1147},\\\"v2.10.1\\\",\\\"v2101\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1149},\\\"patch-changes-23\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1151},\\\"updated-dependencies-9\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1153},\\\"changes-by-package-10\\\",{\\\"_961\\\":962,\\\"_955\\\":1155,\\\"_24\\\":1156},\\\"v2.10.0\\\",\\\"v2100\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1158},\\\"whats-changed-3\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1160},\\\"minor-changes-6\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1162},\\\"patch-changes-24\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1164},\\\"updated-dependencies-10\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1166},\\\"changes-by-package-11\\\",{\\\"_961\\\":962,\\\"_955\\\":1168,\\\"_24\\\":1169},\\\"v2.9.2\\\",\\\"v292\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1171},\\\"whats-changed-4\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1173},\\\"patch-changes-25\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1175},\\\"updated-dependencies-11\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1177},\\\"changes-by-package-12\\\",{\\\"_961\\\":962,\\\"_955\\\":1179,\\\"_24\\\":1180},\\\"v2.9.1\\\",\\\"v291\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1182},\\\"patch-changes-26\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1184},\\\"changes-by-package-13\\\",{\\\"_961\\\":962,\\\"_955\\\":1186,\\\"_24\\\":1187},\\\"v2.9.0\\\",\\\"v290\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1189},\\\"whats-changed-5\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1191},\\\"minor-changes-7\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1193},\\\"patch-changes-27\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1195},\\\"updated-dependencies-12\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1197},\\\"changes-by-package-14\\\",{\\\"_961\\\":962,\\\"_955\\\":1199,\\\"_24\\\":1200},\\\"v2.8.1\\\",\\\"v281\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1202},\\\"patch-changes-28\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1204},\\\"updated-dependencies-13\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1206},\\\"changes-by-package-15\\\",{\\\"_961\\\":962,\\\"_955\\\":1208,\\\"_24\\\":1209},\\\"v2.8.0\\\",\\\"v280\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1211},\\\"minor-changes-8\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1213},\\\"patch-changes-29\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1215},\\\"updated-dependencies-14\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1217},\\\"changes-by-package-16\\\",{\\\"_961\\\":962,\\\"_955\\\":1219,\\\"_24\\\":1220},\\\"2.7.2\\\",\\\"272\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1222},\\\"patch-changes-30\\\",{\\\"_961\\\":962,\\\"_955\\\":1224,\\\"_24\\\":1225},\\\"2.7.1\\\",\\\"271\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1227},\\\"patch-changes-31\\\",{\\\"_961\\\":962,\\\"_955\\\":1229,\\\"_24\\\":1230},\\\"v2.7.0\\\",\\\"v270\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1232},\\\"whats-changed-6\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1234},\\\"minor-changes-9\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1236},\\\"patch-changes-32\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1238},\\\"updated-dependencies-15\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1240},\\\"changes-by-package-17\\\",{\\\"_961\\\":962,\\\"_955\\\":1242,\\\"_24\\\":1243},\\\"v2.6.0\\\",\\\"v260\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1245},\\\"whats-changed-7\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1247},\\\"minor-changes-10\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1249},\\\"patch-changes-33\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1251},\\\"updated-dependencies-16\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1253},\\\"changes-by-package-18\\\",{\\\"_961\\\":962,\\\"_955\\\":1255,\\\"_24\\\":1256},\\\"v2.5.1\\\",\\\"v251\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1258},\\\"patch-changes-34\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1260},\\\"updated-dependencies-17\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1262},\\\"changes-by-package-19\\\",{\\\"_961\\\":962,\\\"_955\\\":1264,\\\"_24\\\":1265},\\\"v2.5.0\\\",\\\"v250\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1267},\\\"whats-changed-8\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1269},\\\"minor-changes-11\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1271},\\\"patch-changes-35\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1273},\\\"updated-dependencies-18\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1275},\\\"changes-by-package-20\\\",{\\\"_961\\\":962,\\\"_955\\\":1277,\\\"_24\\\":1278},\\\"v2.4.1\\\",\\\"v241\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1280},\\\"patch-changes-36\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1282},\\\"updated-dependencies-19\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1284},\\\"changes-by-package-21\\\",{\\\"_961\\\":962,\\\"_955\\\":1286,\\\"_24\\\":1287},\\\"v2.4.0\\\",\\\"v240\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1289},\\\"whats-changed-9\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1291},\\\"minor-changes-12\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1293},\\\"patch-changes-37\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1295},\\\"updated-dependencies-20\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1297},\\\"changes-by-package-22\\\",{\\\"_961\\\":962,\\\"_955\\\":1299,\\\"_24\\\":1300},\\\"v2.3.1\\\",\\\"v231\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1302},\\\"patch-changes-38\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1304},\\\"updated-dependencies-21\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1306},\\\"changes-by-package-23\\\",{\\\"_961\\\":962,\\\"_955\\\":1308,\\\"_24\\\":1309},\\\"v2.3.0\\\",\\\"v230\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1311},\\\"whats-changed-10\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1313},\\\"minor-changes-13\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1315},\\\"patch-changes-39\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1317},\\\"updated-dependencies-22\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1319},\\\"changes-by-package-24\\\",{\\\"_961\\\":962,\\\"_955\\\":1321,\\\"_24\\\":1322},\\\"v2.2.0\\\",\\\"v220\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1324},\\\"whats-changed-11\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1326},\\\"minor-changes-14\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1328},\\\"patch-changes-40\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1330},\\\"updated-dependencies-23\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1332},\\\"changes-by-package-25\\\",{\\\"_961\\\":962,\\\"_955\\\":1334,\\\"_24\\\":1335},\\\"v2.1.0\\\",\\\"v210\\\",{\\\"_961\\\":966,\\\"_955\\\":1070,\\\"_24\\\":1337},\\\"whats-changed-12\\\",{\\\"_961\\\":966,\\\"_955\\\":967,\\\"_24\\\":1339},\\\"minor-changes-15\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1341},\\\"patch-changes-41\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1343},\\\"updated-dependencies-24\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1345},\\\"changes-by-package-26\\\",{\\\"_961\\\":962,\\\"_955\\\":1347,\\\"_24\\\":1348},\\\"v2.0.1\\\",\\\"v201\\\",{\\\"_961\\\":966,\\\"_955\\\":976,\\\"_24\\\":1350},\\\"patch-changes-42\\\",{\\\"_961\\\":966,\\\"_955\\\":1352,\\\"_24\\\":1353},\\\"Changes by Package 🔗\\\",\\\"changes-by-package-\\\",{\\\"_961\\\":962,\\\"_955\\\":1355,\\\"_24\\\":1356},\\\"v2.0.0\\\",\\\"v200\\\",{\\\"_961\\\":966,\\\"_955\\\":1358,\\\"_24\\\":1359},\\\"Breaking Changes\\\",\\\"breaking-changes\\\",{\\\"_961\\\":966,\\\"_955\\\":1361,\\\"_24\\\":1362},\\\"New Features\\\",\\\"new-features\\\",{\\\"_961\\\":966,\\\"_955\\\":1364,\\\"_24\\\":1365},\\\"Other Notable Changes\\\",\\\"other-notable-changes\\\",{\\\"_961\\\":966,\\\"_955\\\":1024,\\\"_24\\\":1367},\\\"updated-dependencies-25\\\",{\\\"_961\\\":966,\\\"_955\\\":970,\\\"_24\\\":1369},\\\"changes-by-package-27\\\",[],\\\"actionData\\\",\\\"errors\\\"]\\n\");function $RC(a,b){a=document.getElementById(a);b=document.getElementById(b);b.parentNode.removeChild(b);if(a){a=a.previousSibling;var f=a.parentNode,c=a.nextSibling,e=0;do{if(c\u0026\u00268===c.nodeType){var d=c.data;if(\"/$\"===d)if(0===e)break;else e--;else\"$\"!==d\u0026\u0026\"$?\"!==d\u0026\u0026\"$!\"!==d||e++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;b.firstChild;)f.insertBefore(b.firstChild,c);a.data=\"$\";a._reactRetry\u0026\u0026a._reactRetry()}};$RC(\"B:0\",\"S:0\")window.__reactRouterContext.streamController.close();$RC(\"B:1\",\"S:1\")",
"url": "https://v2.remix.run/docs/start/changelog",
"metadata": {
"description": "",
"headings": [
"Remix Releases",
"v2.17.0",
"Minor Changes",
"Changes by Package",
"v2.16.8",
"Patch Changes",
"v2.16.7",
"Patch Changes",
"v2.16.6",
"Patch Changes",
"v2.16.5",
"Patch Changes",
"v2.16.4",
"Patch Changes",
"v2.16.3",
"Security Notice",
"Patch Changes",
"v2.16.2",
"Patch Changes",
"v2.16.1",
"Patch Changes",
"v2.16.0",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"v2.15.3",
"Patch Changes",
"Updated Dependencies",
"v2.15.2",
"Patch Changes",
"Updated Dependencies",
"v2.15.1",
"Patch Changes",
"v2.15.0",
"Patch Changes",
"v2.14.0",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.13.1",
"Patch Changes",
"v2.13.0",
"What's Changed",
"Stabilized APIs",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.12.1",
"Patch Changes",
"Changes by Package",
"v2.12.0",
"What's Changed",
"Future Flag for Automatic Dependency Optimization (unstable)",
"Improved Single Fetch Type Safety (unstable)",
"Updates to Single Fetch Revalidation Behavior (unstable)",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.11.2",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.11.1",
"Patch Changes",
"Changes by Package",
"v2.11.0",
"What's Changed",
"Renamed unstable_fogOfWar future flag to unstable_lazyRouteDiscovery (unstable)",
"Removed response stub in Single Fetch (unstable)",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.10.3",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.10.2",
"Patch Changes",
"Changes by Package",
"v2.10.1",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.10.0",
"What's Changed",
"Lazy Route Discovery (a.k.a. \"Fog of War\")",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.9.2",
"What's Changed",
"Updated Type-Safety for Single Fetch",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.9.1",
"Patch Changes",
"Changes by Package",
"v2.9.0",
"What's Changed",
"Single Fetch (unstable)",
"Undici",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.8.1",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.8.0",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"2.7.2",
"Patch Changes",
"2.7.1",
"Patch Changes",
"v2.7.0",
"What's Changed",
"Stabilized Vite Plugin",
"New Layout Export",
"Basename support",
"Cloudflare Proxy as a Vite Plugin",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.6.0",
"What's Changed",
"Unstable Vite Plugin updates",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.5.1",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.5.0",
"What's Changed",
"SPA Mode (unstable)",
"Server Bundles (unstable)",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.4.1",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.4.0",
"What's Changed",
"Client Data",
"future.v3_relativeSplatPath",
"Vite Updates (Unstable)",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.3.1",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.3.0",
"What's Changed",
"Stabilized useBlocker",
"unstable_flushSync API",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.2.0",
"What's Changed",
"Vite!",
"New Fetcher APIs",
"Persistence Future Flag",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.1.0",
"What's Changed",
"View Transitions",
"Stable createRemixStub",
"Minor Changes",
"Patch Changes",
"Updated Dependencies",
"Changes by Package",
"v2.0.1",
"Patch Changes",
"Changes by Package 🔗",
"v2.0.0",
"Breaking Changes",
"Upgraded Dependency Requirements",
"Removed Future Flags",
"Breaking Changes/API Removals",
"With deprecation warnings",
"Without deprecation warnings",
"Breaking Type Changes",
"New Features",
"Other Notable Changes",
"Updated Dependencies",
"Changes by Package"
],
"images": [
"/assets/icons-CZ8v8NWl.svg"
],
"links": [
"/",
"/docs",
"https://remix.run/blog",
"/resources",
"https://reactrouter.com/home",
"https://github.com/remix-run/remix/tree/v2",
"https://rmx.as/discord",
"/docs/start/quickstart",
"/docs/start/tutorial",
"/docs/start/v2",
"/docs/start/community",
"/docs/start/future-flags",
"/docs/start/changelog",
"/docs/discussion/introduction",
"/docs/discussion/runtimes",
"/docs/discussion/routes",
"/docs/discussion/data-flow",
"/docs/discussion/server-vs-client",
"/docs/discussion/react-router",
"/docs/discussion/progressive-enhancement",
"/docs/discussion/pending-ui",
"/docs/discussion/state-management",
"/docs/discussion/concurrency",
"/docs/discussion/form-vs-fetcher",
"/docs/discussion/hot-module-replacement",
"/docs/discussion/resubmissions",
"/docs/file-conventions/-client",
"/docs/file-conventions/-server",
"/docs/file-conventions/asset-imports",
"/docs/file-conventions/entry.client",
"/docs/file-conventions/entry.server",
"/docs/file-conventions/root",
"/docs/file-conventions/routes",
"/docs/file-conventions/vite-config",
"/docs/route/action",
"/docs/route/client-action",
"/docs/route/client-loader",
"/docs/route/component",
"/docs/route/error-boundary",
"/docs/route/handle",
"/docs/route/headers",
"/docs/route/hydrate-fallback",
"/docs/route/links",
"/docs/route/loader",
"/docs/route/meta",
"/docs/route/should-revalidate",
"/docs/components/await",
"/docs/components/form",
"/docs/components/link",
"/docs/components/links",
"/docs/components/live-reload",
"/docs/components/meta",
"/docs/components/nav-link",
"/docs/components/outlet",
"/docs/components/prefetch-page-links",
"/docs/components/scripts",
"/docs/components/scroll-restoration",
"/docs/hooks/use-action-data",
"/docs/hooks/use-async-error",
"/docs/hooks/use-async-value",
"/docs/hooks/use-before-unload",
"/docs/hooks/use-blocker",
"/docs/hooks/use-fetcher",
"/docs/hooks/use-fetchers",
"/docs/hooks/use-form-action",
"/docs/hooks/use-href",
"/docs/hooks/use-loader-data",
"/docs/hooks/use-location",
"/docs/hooks/use-matches",
"/docs/hooks/use-navigate",
"/docs/hooks/use-navigation",
"/docs/hooks/use-navigation-type",
"/docs/hooks/use-outlet",
"/docs/hooks/use-outlet-context",
"/docs/hooks/use-params",
"/docs/hooks/use-prompt",
"/docs/hooks/use-resolved-path",
"/docs/hooks/use-revalidator",
"/docs/hooks/use-route-error",
"/docs/hooks/use-route-loader-data",
"/docs/hooks/use-search-params",
"/docs/hooks/use-submit",
"/docs/hooks/use-view-transition-state",
"/docs/utils/cookies",
"/docs/utils/create-remix-stub",
"/docs/utils/data",
"/docs/utils/defer",
"/docs/utils/is-route-error-response",
"/docs/utils/json",
"/docs/utils/parse-multipart-form-data",
"/docs/utils/redirect",
"/docs/utils/redirectDocument",
"/docs/utils/replace",
"/docs/utils/sessions",
"/docs/utils/unstable-create-file-upload-handler",
"/docs/utils/unstable-create-memory-upload-handler",
"/docs/styling/bundling",
"/docs/styling/css",
"/docs/styling/css-imports",
"/docs/styling/css-in-js",
"/docs/styling/css-modules",
"/docs/styling/postcss",
"/docs/styling/tailwind",
"/docs/styling/vanilla-extract",
"/docs/other-api/dev",
"/docs/other-api/adapter",
"/docs/other-api/serve",
"/docs/other-api/create-remix",
"/docs/other-api/node",
"/docs/other-api/testing",
"/docs/guides/accessibility",
"/docs/guides/api-development-strategy",
"/docs/guides/api-routes",
"/docs/guides/bff",
"/docs/guides/breadcrumbs",
"/docs/guides/browser-support",
"/docs/guides/client-data",
"/docs/guides/constraints",
"/docs/guides/contributing",
"/docs/guides/css-files",
"/docs/guides/data-loading",
"/docs/guides/data-writes",
"/docs/guides/dependency-optimization",
"/docs/guides/deployment",
"/docs/guides/disabling-javascript",
"/docs/guides/envvars",
"/docs/guides/errors",
"/docs/guides/faq",
"/docs/guides/file-uploads",
"/docs/guides/form-validation",
"/docs/guides/gotchas",
"/docs/guides/index-query-param",
"/docs/guides/lazy-route-discovery",
"/docs/guides/local-tls",
"/docs/guides/manual-mode",
"/docs/guides/mdx",
"/docs/guides/migrating-react-router-app",
"/docs/guides/not-found",
"/docs/guides/performance",
"/docs/guides/presets",
"/docs/guides/resource-routes",
"/docs/guides/server-bundles",
"/docs/guides/single-fetch",
"/docs/guides/spa-mode",
"/docs/guides/streaming",
"/docs/guides/templates",
"/docs/guides/typescript",
"/docs/guides/vite",
"/docs/start/changelog/#v2170",
"/docs/start/changelog/#minor-changes",
"/docs/start/changelog/#changes-by-package",
"/docs/start/changelog/#v2168",
"/docs/start/changelog/#patch-changes",
"/docs/start/changelog/#v2167",
"/docs/start/changelog/#patch-changes-1",
"/docs/start/changelog/#v2166",
"/docs/start/changelog/#patch-changes-2",
"/docs/start/changelog/#v2165",
"/docs/start/changelog/#patch-changes-3",
"/docs/start/changelog/#v2164",
"/docs/start/changelog/#patch-changes-4",
"/docs/start/changelog/#v2163",
"/docs/start/changelog/#security-notice",
"/docs/start/changelog/#patch-changes-5",
"/docs/start/changelog/#v2162",
"/docs/start/changelog/#patch-changes-6",
"/docs/start/changelog/#v2161",
"/docs/start/changelog/#patch-changes-7",
"/docs/start/changelog/#v2160",
"/docs/start/changelog/#minor-changes-1",
"/docs/start/changelog/#patch-changes-8",
"/docs/start/changelog/#updated-dependencies",
"/docs/start/changelog/#v2153",
"/docs/start/changelog/#patch-changes-9",
"/docs/start/changelog/#updated-dependencies-1",
"/docs/start/changelog/#v2152",
"/docs/start/changelog/#patch-changes-10",
"/docs/start/changelog/#updated-dependencies-2",
"/docs/start/changelog/#v2151",
"/docs/start/changelog/#patch-changes-11",
"/docs/start/changelog/#v2150",
"/docs/start/changelog/#patch-changes-12",
"/docs/start/changelog/#v2140",
"/docs/start/changelog/#minor-changes-2",
"/docs/start/changelog/#patch-changes-13",
"/docs/start/changelog/#updated-dependencies-3",
"/docs/start/changelog/#changes-by-package-1",
"/docs/start/changelog/#v2131",
"/docs/start/changelog/#patch-changes-14",
"/docs/start/changelog/#v2130",
"/docs/start/changelog/#whats-changed",
"/docs/start/changelog/#minor-changes-3",
"/docs/start/changelog/#patch-changes-15",
"/docs/start/changelog/#updated-dependencies-4",
"/docs/start/changelog/#changes-by-package-2",
"/docs/start/changelog/#v2121",
"/docs/start/changelog/#patch-changes-16",
"/docs/start/changelog/#changes-by-package-3",
"/docs/start/changelog/#v2120",
"/docs/start/changelog/#whats-changed-1",
"/docs/start/changelog/#minor-changes-4",
"/docs/start/changelog/#patch-changes-17",
"/docs/start/changelog/#updated-dependencies-5",
"/docs/start/changelog/#changes-by-package-4",
"/docs/start/changelog/#v2112",
"/docs/start/changelog/#patch-changes-18",
"/docs/start/changelog/#updated-dependencies-6",
"/docs/start/changelog/#changes-by-package-5",
"/docs/start/changelog/#v2111",
"/docs/start/changelog/#patch-changes-19",
"/docs/start/changelog/#changes-by-package-6",
"/docs/start/changelog/#v2110",
"/docs/start/changelog/#whats-changed-2",
"/docs/start/changelog/#minor-changes-5",
"/docs/start/changelog/#patch-changes-20",
"/docs/start/changelog/#updated-dependencies-7",
"/docs/start/changelog/#changes-by-package-7",
"/docs/start/changelog/#v2103",
"/docs/start/changelog/#patch-changes-21",
"/docs/start/changelog/#updated-dependencies-8",
"/docs/start/changelog/#changes-by-package-8",
"/docs/start/changelog/#v2102",
"/docs/start/changelog/#patch-changes-22",
"/docs/start/changelog/#changes-by-package-9",
"/docs/start/changelog/#v2101",
"/docs/start/changelog/#patch-changes-23",
"/docs/start/changelog/#updated-dependencies-9",
"/docs/start/changelog/#changes-by-package-10",
"/docs/start/changelog/#v2100",
"/docs/start/changelog/#whats-changed-3",
"/docs/start/changelog/#minor-changes-6",
"/docs/start/changelog/#patch-changes-24",
"/docs/start/changelog/#updated-dependencies-10",
"/docs/start/changelog/#changes-by-package-11",
"/docs/start/changelog/#v292",
"/docs/start/changelog/#whats-changed-4",
"/docs/start/changelog/#patch-changes-25",
"/docs/start/changelog/#updated-dependencies-11",
"/docs/start/changelog/#changes-by-package-12",
"/docs/start/changelog/#v291",
"/docs/start/changelog/#patch-changes-26",
"/docs/start/changelog/#changes-by-package-13",
"/docs/start/changelog/#v290",
"/docs/start/changelog/#whats-changed-5",
"/docs/start/changelog/#minor-changes-7",
"/docs/start/changelog/#patch-changes-27",
"/docs/start/changelog/#updated-dependencies-12",
"/docs/start/changelog/#changes-by-package-14",
"/docs/start/changelog/#v281",
"/docs/start/changelog/#patch-changes-28",
"/docs/start/changelog/#updated-dependencies-13",
"/docs/start/changelog/#changes-by-package-15",
"/docs/start/changelog/#v280",
"/docs/start/changelog/#minor-changes-8",
"/docs/start/changelog/#patch-changes-29",
"/docs/start/changelog/#updated-dependencies-14",
"/docs/start/changelog/#changes-by-package-16",
"/docs/start/changelog/#272",
"/docs/start/changelog/#patch-changes-30",
"/docs/start/changelog/#271",
"/docs/start/changelog/#patch-changes-31",
"/docs/start/changelog/#v270",
"/docs/start/changelog/#whats-changed-6",
"/docs/start/changelog/#minor-changes-9",
"/docs/start/changelog/#patch-changes-32",
"/docs/start/changelog/#updated-dependencies-15",
"/docs/start/changelog/#changes-by-package-17",
"/docs/start/changelog/#v260",
"/docs/start/changelog/#whats-changed-7",
"/docs/start/changelog/#minor-changes-10",
"/docs/start/changelog/#patch-changes-33",
"/docs/start/changelog/#updated-dependencies-16",
"/docs/start/changelog/#changes-by-package-18",
"/docs/start/changelog/#v251",
"/docs/start/changelog/#patch-changes-34",
"/docs/start/changelog/#updated-dependencies-17",
"/docs/start/changelog/#changes-by-package-19",
"/docs/start/changelog/#v250",
"/docs/start/changelog/#whats-changed-8",
"/docs/start/changelog/#minor-changes-11",
"/docs/start/changelog/#patch-changes-35",
"/docs/start/changelog/#updated-dependencies-18",
"/docs/start/changelog/#changes-by-package-20",
"/docs/start/changelog/#v241",
"/docs/start/changelog/#patch-changes-36",
"/docs/start/changelog/#updated-dependencies-19",
"/docs/start/changelog/#changes-by-package-21",
"/docs/start/changelog/#v240",
"/docs/start/changelog/#whats-changed-9",
"/docs/start/changelog/#minor-changes-12",
"/docs/start/changelog/#patch-changes-37",
"/docs/start/changelog/#updated-dependencies-20",
"/docs/start/changelog/#changes-by-package-22",
"/docs/start/changelog/#v231",
"/docs/start/changelog/#patch-changes-38",
"/docs/start/changelog/#updated-dependencies-21",
"/docs/start/changelog/#changes-by-package-23",
"/docs/start/changelog/#v230",
"/docs/start/changelog/#whats-changed-10",
"/docs/start/changelog/#minor-changes-13",
"/docs/start/changelog/#patch-changes-39",
"/docs/start/changelog/#updated-dependencies-22",
"/docs/start/changelog/#changes-by-package-24",
"/docs/start/changelog/#v220",
"/docs/start/changelog/#whats-changed-11",
"/docs/start/changelog/#minor-changes-14",
"/docs/start/changelog/#patch-changes-40",
"/docs/start/changelog/#updated-dependencies-23",
"/docs/start/changelog/#changes-by-package-25",
"/docs/start/changelog/#v210",
"/docs/start/changelog/#whats-changed-12",
"/docs/start/changelog/#minor-changes-15",
"/docs/start/changelog/#patch-changes-41",
"/docs/start/changelog/#updated-dependencies-24",
"/docs/start/changelog/#changes-by-package-26",
"/docs/start/changelog/#v201",
"/docs/start/changelog/#patch-changes-42",
"/docs/start/changelog/#changes-by-package-",
"/docs/start/changelog/#v200",
"/docs/start/changelog/#breaking-changes",
"/docs/start/changelog/#new-features",
"/docs/start/changelog/#other-notable-changes",
"/docs/start/changelog/#updated-dependencies-25",
"/docs/start/changelog/#changes-by-package-27",
"https://github.com/remix-run/remix/releases",
"https://github.com/remix-run/remix/pull/10686",
"https://github.com/remix-run/remix/pull/10688",
"https://github.com/remix-run/remix/blob/remix%402.X.Y/packages/create-remix/CHANGELOG.md#2170",
"https://github.com/remix-run/remix/compare/remix@2.16.8...remix@2.17.0",
"https://github.com/remix-run/remix/pull/10638",
"https://github.com/remix-run/remix/compare/remix@2.16.7...remix@2.16.8",
"https://github.com/remix-run/remix/pull/10611",
"https://github.com/remix-run/remix/compare/remix@2.16.6...remix@2.16.7",
"https://github.com/remix-run/remix/pull/9973",
"https://github.com/remix-run/remix/pull/10601",
"https://github.com/remix-run/remix/pull/10306",
"https://github.com/remix-run/remix/compare/remix@2.16.5...remix@2.16.6",
"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975",
"https://github.com/remix-run/remix/pull/10562",
"https://github.com/remix-run/remix/compare/remix@2.16.4...remix@2.16.5",
"https://github.com/advisories/GHSA-pxg6-pf52-xh8x",
"https://github.com/remix-run/remix/pull/10547",
"https://github.com/remix-run/remix/compare/remix@2.16.3...remix@2.16.4",
"https://github.com/remix-run/remix/pull/10553",
"https://github.com/remix-run/remix/compare/remix@2.16.2...remix@2.16.3",
"https://github.com/remix-run/remix/pull/10527",
"https://github.com/remix-run/remix/pull/10535",
"https://github.com/remix-run/remix/compare/remix@2.16.1...remix@2.16.2",
"https://github.com/remix-run/remix/pull/10510",
"https://github.com/remix-run/remix/pull/10524",
"https://github.com/remix-run/remix/pull/10528",
"https://github.com/remix-run/remix/compare/remix@2.16.0...remix@2.16.1",
"https://github.com/remix-run/remix/pull/10351",
"https://github.com/remix-run/remix/pull/10477",
"https://github.com/remix-run/remix/pull/10479",
"https://github.com/remix-run/remix/pull/10498",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.30.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1230",
"https://github.com/remix-run/remix/compare/remix@2.15.3...remix@2.16.0",
"https://github.com/remix-run/remix/pull/10447",
"https://github.com/remix-run/remix/pull/10424",
"https://github.com/remix-run/remix/pull/10410",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.29.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1220",
"https://github.com/remix-run/remix/compare/remix@2.15.2...remix@2.15.3",
"https://github.com/remix-run/remix/pull/10358",
"https://github.com/remix-run/remix/pull/10317",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.28.1",
"https://github.com/remix-run/remix/compare/remix@2.15.1...remix@2.15.2",
"https://github.com/remix-run/remix/pull/10300",
"https://github.com/remix-run/remix/compare/remix@2.15.0...remix@2.15.1",
"https://github.com/remix-run/remix/pull/10236",
"https://github.com/remix-run/remix/pull/10173",
"https://github.com/remix-run/remix/pull/10174",
"https://github.com/remix-run/remix/pull/10107",
"https://github.com/remix-run/remix/pull/10126",
"https://github.com/remix-run/remix/pull/10139",
"https://github.com/remix-run/remix/pull/10145",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.28.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1210",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/create-remix/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-architect/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare-pages/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-cloudflare-workers/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-css-bundle/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-deno/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-dev/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-eslint-config/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-express/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-fs-routes/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-node/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-react/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-route-config/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-routes-option-adapter/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-serve/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-server-runtime/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/blob/remix%402.14.0/packages/remix-testing/CHANGELOG.md#2140",
"https://github.com/remix-run/remix/compare/remix@2.13.1...remix@2.14.0",
"https://github.com/remix-run/remix/pull/10099",
"https://github.com/remix-run/remix/compare/remix@2.13.0...remix@2.13.1",
"https://x.com/remix_run/status/1841926034868077009",
"https://remix.run/blog/merging-remix-and-react-router",
"https://remix.run/blog/incremental-path-to-react-19",
"https://remix.run/docs/en/main/guides/dependency-optimization",
"https://remix.run/docs/guides/lazy-route-discovery",
"https://remix.run/docs/guides/single-fetch",
"https://github.com/remix-run/remix/pull/9980",
"https://github.com/remix-run/remix/pull/10072",
"https://github.com/remix-run/remix/pull/10092",
"https://github.com/remix-run/remix/pull/10047",
"https://github.com/remix-run/remix/pull/10046",
"https://github.com/remix-run/remix/pull/10063",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.27.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1200",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/create-remix/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-architect/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare-pages/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-cloudflare-workers/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-css-bundle/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-deno/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-dev/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-eslint-config/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-express/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-node/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-react/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-serve/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-server-runtime/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/blob/remix%402.13.0/packages/remix-testing/CHANGELOG.md#2130",
"https://github.com/remix-run/remix/compare/remix@2.12.1...remix@2.13.0",
"https://github.com/remix-run/remix/pull/9976",
"https://github.com/remix-run/remix/pull/9910",
"https://github.com/remix-run/remix/pull/9999",
"https://github.com/remix-run/remix/pull/9982",
"https://remix.run/docs/guides/single-fetch#enable-single-fetch-types",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-cloudflare/CHANGELOG.md#2121",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-deno/CHANGELOG.md#2121",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-dev/CHANGELOG.md#2121",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-node/CHANGELOG.md#2121",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-server-runtime/CHANGELOG.md#2121",
"https://github.com/remix-run/remix/compare/remix@2.12.0...remix@2.12.1",
"https://github.com/remix-run/remix/pull/9921",
"https://github.com/remix-run/remix/pull/9917",
"https://github.com/remix-run/remix/pull/9901",
"https://github.com/remix-run/remix/pull/9899",
"https://github.com/remix-run/remix/pull/9890",
"https://github.com/remix-run/remix/pull/6409",
"https://github.com/remix-run/remix/issues/1757",
"https://github.com/remix-run/remix/issues/1678",
"https://github.com/remix-run/remix/pull/9888",
"https://github.com/remix-run/remix/pull/9893",
"https://github.com/remix-run/remix/pull/9938",
"https://github.com/remix-run/remix/pull/9955",
"https://github.com/remix-run/remix/pull/9941",
"https://github.com/remix-run/remix/pull/9889",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.2",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1192",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-dev/CHANGELOG.md#2120",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-react/CHANGELOG.md#2120",
"https://github.com/remix-run/remix/blob/remix%402.12.0/packages/remix-server-runtime/CHANGELOG.md#2120",
"https://github.com/remix-run/remix/compare/remix@2.11.2...remix@2.12.0",
"https://github.com/remix-run/react-router/pull/11883",
"https://github.com/remix-run/remix/pull/9860",
"https://github.com/remix-run/react-router/pull/11888",
"https://github.com/remix-run/remix/pull/9848",
"https://github.com/remix-run/remix/pull/9856",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.1",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1191",
"https://github.com/remix-run/remix/blob/remix%402.11.2/packages/remix-react/CHANGELOG.md#2112",
"https://github.com/remix-run/remix/blob/remix%402.11.2/packages/remix-server-runtime/CHANGELOG.md#2112",
"https://github.com/remix-run/remix/compare/remix@2.11.1...remix@2.11.2",
"https://github.com/remix-run/remix/commit/a7cffe5733c8b7d0f29bd2d8606876c537d87101",
"https://github.com/remix-run/remix/blob/remix%402.11.1/packages/remix-react/CHANGELOG.md#2111",
"https://github.com/remix-run/remix/compare/remix@2.11.0...remix@2.11.1",
"https://remix.run/blog/fog-of-war",
"https://www.youtube.com/watch?v=f5z_axCofW0",
"https://remix.run/docs/utils/data",
"https://github.com/remix-run/remix/pull/9763",
"https://github.com/remix-run/remix/pull/9764",
"https://github.com/remix-run/remix/pull/9769",
"https://github.com/remix-run/remix/pull/9700",
"https://github.com/remix-run/remix/pull/9695",
"https://github.com/remix-run/remix/pull/9792",
"https://github.com/remix-run/remix/pull/9796",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.26.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1190",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/create-remix/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-architect/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare-pages/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-cloudflare-workers/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-css-bundle/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-deno/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-dev/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-eslint-config/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-express/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-node/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-react/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-serve/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-server-runtime/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/blob/remix%402.11.0/packages/remix-testing/CHANGELOG.md#2110",
"https://github.com/remix-run/remix/compare/remix@2.10.3...remix@2.11.0",
"https://github.com/remix-run/remix/pull/9664",
"https://github.com/remix-run/remix/pull/8932",
"https://github.com/remix-run/remix/pull/9738",
"https://github.com/remix-run/remix/pull/9706",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.25.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1180",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/create-remix/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-architect/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare-pages/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-cloudflare-workers/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-css-bundle/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-deno/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-dev/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-eslint-config/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-express/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-node/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-react/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-serve/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-server-runtime/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/blob/remix%402.10.3/packages/remix-testing/CHANGELOG.md#2103",
"https://github.com/remix-run/remix/compare/remix@2.10.2...remix@2.10.3",
"https://github.com/remix-run/remix/commit/bdd04217713292307078a30dab9033926d48ede6",
"https://github.com/remix-run/remix/pull/9693",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/create-remix/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-architect/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare-pages/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-cloudflare-workers/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-css-bundle/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-deno/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-dev/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-eslint-config/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-express/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-node/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-react/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-serve/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-server-runtime/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/blob/remix%402.10.2/packages/remix-testing/CHANGELOG.md#2102",
"https://github.com/remix-run/remix/compare/remix@2.10.1...remix@2.10.2",
"https://github.com/remix-run/remix/pull/9665",
"https://github.com/remix-run/remix/pull/9686",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.24.1",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1171",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/create-remix/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-architect/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare-pages/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-cloudflare-workers/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-css-bundle/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-deno/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-dev/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-eslint-config/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-express/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-node/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-react/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-serve/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-server-runtime/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/blob/remix%402.10.1/packages/remix-testing/CHANGELOG.md#2101",
"https://github.com/remix-run/remix/compare/remix@2.10.0...remix@2.10.1",
"https://remix.run/docs/guides/fog-of-war",
"https://github.com/remix-run/remix/pull/9600",
"https://github.com/remix-run/remix/pull/9619",
"https://github.com/remix-run/remix/pull/9184",
"https://github.com/remix-run/remix/pull/9580",
"https://github.com/remix-run/remix/pull/9566",
"https://github.com/remix-run/remix/pull/9584",
"https://github.com/remix-run/remix/pull/9562",
"https://github.com/remix-run/remix/pull/9501",
"https://github.com/remix-run/remix/pull/9564",
"https://github.com/remix-run/remix/pull/9488",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.24.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#117",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/create-remix/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-architect/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare-pages/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-cloudflare-workers/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-css-bundle/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-deno/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-dev/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-eslint-config/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-express/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-node/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-react/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-serve/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-server-runtime/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/blob/remix%402.10.0/packages/remix-testing/CHANGELOG.md#2100",
"https://github.com/remix-run/remix/compare/remix@2.9.2...remix@2.10.0",
"https://remix.run/docs/en/main/guides/single-fetch",
"https://github.com/remix-run/remix/pull/9305",
"https://github.com/remix-run/remix/pull/9194",
"https://github.com/remix-run/remix/pull/9287",
"https://github.com/remix-run/remix/pull/9395",
"https://github.com/remix-run/remix/pull/9241",
"https://github.com/remix-run/remix/pull/9372",
"https://github.com/remix-run/remix/pull/9322",
"https://github.com/remix-run/remix/pull/9364",
"https://github.com/remix-run/remix/pull/9369",
"https://github.com/remix-run/remix/pull/9349",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.23.1",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1161",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare-pages/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-cloudflare-workers/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-css-bundle/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-deno/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-dev/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-eslint-config/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-express/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-node/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-react/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-serve/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-server-runtime/CHANGELOG.md#292",
"https://github.com/remix-run/remix/blob/remix%402.9.2/packages/remix-testing/CHANGELOG.md#292",
"https://github.com/remix-run/remix/compare/remix@2.9.1...remix@2.9.2",
"https://github.com/remix-run/remix/pull/9301",
"https://github.com/remix-run/remix/pull/9299",
"https://github.com/remix-run/remix/blob/remix%402.9.1/packages/remix-dev/CHANGELOG.md#291",
"https://github.com/remix-run/remix/blob/remix%402.9.1/packages/remix-react/CHANGELOG.md#291",
"https://github.com/remix-run/remix/compare/remix@2.9.0...remix@2.9.1",
"https://github.com/remix-run/remix/discussions/7640",
"https://github.com/jacob-ebey/turbo-stream",
"https://github.com/nodejs/undici",
"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
"https://github.com/remix-run/web-std-io",
"https://github.com/nodejs/undici?tab=readme-ov-file#garbage-collection",
"https://github.com/remix-run/remix/pull/8773",
"https://github.com/remix-run/remix/pull/9073",
"https://github.com/remix-run/remix/pull/9084",
"https://github.com/remix-run/remix/pull/9272",
"https://github.com/remix-run/remix/pull/9106",
"https://github.com/remix-run/remix/pull/9111",
"https://github.com/remix-run/remix/pull/9198",
"https://github.com/remix-run/remix/pull/9142",
"https://github.com/remix-run/remix/pull/9026",
"https://github.com/remix-run/remix/pull/8848",
"https://github.com/remix-run/remix/pull/9063",
"https://github.com/remix-run/remix/pull/8970",
"https://github.com/remix-run/remix/pull/9176",
"https://github.com/remix-run/remix/pull/9104",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.23.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1160",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/create-remix/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-architect/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare-pages/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-cloudflare-workers/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-css-bundle/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-deno/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-dev/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-eslint-config/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-express/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-node/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-react/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-serve/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-server-runtime/CHANGELOG.md#290",
"https://github.com/remix-run/remix/blob/remix%402.9.0/packages/remix-testing/CHANGELOG.md#290",
"https://github.com/remix-run/remix/compare/remix@2.8.1...remix@2.9.0",
"https://github.com/remix-run/remix/pull/8916",
"https://github.com/remix-run/remix/pull/8969",
"https://github.com/remix-run/remix/pull/8939",
"https://github.com/remix-run/remix/pull/8965",
"https://github.com/remix-run/remix/pull/8966",
"https://github.com/remix-run/remix/pull/8910",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.3",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1153",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/create-remix/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-architect/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare-pages/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-cloudflare-workers/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-css-bundle/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-deno/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-dev/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-eslint-config/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-express/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-node/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-react/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-serve/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-server-runtime/CHANGELOG.md#281",
"https://github.com/remix-run/remix/blob/remix%402.8.1/packages/remix-testing/CHANGELOG.md#281",
"https://github.com/remix-run/remix/compare/remix@2.8.0...remix@2.8.1",
"https://github.com/remix-run/remix/pull/8885",
"https://github.com/remix-run/remix/pull/8842",
"https://github.com/remix-run/remix/pull/8897",
"https://github.com/remix-run/remix/pull/8864",
"https://github.com/remix-run/remix/pull/8843",
"https://github.com/remix-run/remix/pull/8859",
"https://github.com/remix-run/remix/pull/8892",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.2",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1152",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/create-remix/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-architect/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare-pages/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-cloudflare-workers/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-css-bundle/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-deno/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-dev/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-eslint-config/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-express/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-node/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-react/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-serve/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-server-runtime/CHANGELOG.md#280",
"https://github.com/remix-run/remix/blob/remix%402.8.0/packages/remix-testing/CHANGELOG.md#280",
"https://github.com/remix-run/remix/compare/remix@2.7.2...remix@2.8.0",
"https://github.com/remix-run/remix/pull/8829",
"https://github.com/remix-run/remix/pull/8819",
"https://vitejs.dev/",
"https://remix.run/blog/remix-heart-vite",
"https://remix.run/docs/en/main/future/spa-mode",
"https://remix.run/docs/future/server-bundles",
"https://remix.run/docs/en/dev/future/vite#basename",
"https://remix.run/blog/remix-vite-stable",
"https://remix.run/docs/en/main/future/vite",
"https://remix.run/docs/en/dev/file-conventions/root#layout-export",
"https://github.com/remix-run/remix/discussions/8702",
"https://reactrouter.com/v6/routers/create-browser-router#basename",
"https://github.com/remix-run/remix/discussions/2891",
"https://github.com/remix-run/remix/pull/8709",
"https://github.com/remix-run/remix/pull/8701",
"https://github.com/remix-run/remix/pull/8749",
"https://github.com/remix-run/remix/pull/8145",
"https://github.com/remix-run/remix/pull/8713",
"https://github.com/remix-run/remix/pull/8692",
"https://github.com/remix-run/remix/pull/8747",
"https://github.com/remix-run/remix/pull/8726",
"https://github.com/remix-run/remix/pull/8725",
"https://github.com/remix-run/remix/pull/8720",
"https://github.com/remix-run/remix/pull/8745",
"https://github.com/remix-run/remix/pull/8740",
"https://github.com/remix-run/remix/pull/8690",
"https://github.com/remix-run/remix/pull/8752",
"https://github.com/remix-run/remix/pull/8723",
"https://github.com/remix-run/remix/pull/8684",
"https://main.vitejs.dev/guide/static-deploy.html#deploying-a-static-site",
"https://github.com/remix-run/remix/pull/8624",
"https://vitejs.dev/guide/build.html#public-base-path",
"https://github.com/remix-run/remix/pull/8711",
"https://github.com/remix-run/remix/pull/8806",
"https://github.com/remix-run/remix/pull/8797",
"https://github.com/remix-run/remix/pull/8796",
"https://github.com/remix-run/remix/pull/8795",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.1",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1151",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/create-remix/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-architect/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare-pages/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-cloudflare-workers/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-css-bundle/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-deno/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-dev/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-eslint-config/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-express/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-node/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-react/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-serve/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-server-runtime/CHANGELOG.md#270",
"https://github.com/remix-run/remix/blob/remix%402.7.0/packages/remix-testing/CHANGELOG.md#270",
"https://github.com/remix-run/remix/compare/remix@2.6.0...remix@2.7.0",
"https://github.com/remix-run/remix/pull/8596",
"https://github.com/remix-run/remix/pull/8531",
"https://remix.run/docs/future/vite#cloudflare",
"https://remix.run/docs/future/vite#migrating-cloudflare-functions",
"https://github.com/remix-run/remix/pull/8251",
"https://github.com/remix-run/remix/pull/8577",
"https://github.com/remix-run/remix/pull/8575",
"https://github.com/remix-run/remix/pull/8627",
"https://github.com/vitejs/vite-plugin-react-swc/blob/main/src/index.ts#L97-L116",
"https://github.com/remix-run/remix/pull/8636",
"https://github.com/remix-run/remix/pull/8599",
"https://github.com/remix-run/remix/pull/8613",
"https://vitejs.dev/config/build-options.html#build-sourcemap",
"https://github.com/remix-run/remix/pull/8598",
"https://github.com/remix-run/remix/pull/8580",
"https://github.com/remix-run/remix/pull/8649",
"https://github.com/remix-run/remix/pull/8581",
"https://github.com/remix-run/remix/pull/8514",
"https://github.com/remix-run/remix/pull/8620",
"https://github.com/remix-run/remix/pull/8539",
"https://github.com/remix-run/remix/pull/8591",
"https://github.com/remix-run/remix/pull/8654",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.22.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1150",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/create-remix/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-architect/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare-pages/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-cloudflare-workers/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-css-bundle/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-deno/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-dev/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-eslint-config/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-express/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-node/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-react/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-serve/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-server-runtime/CHANGELOG.md#260",
"https://github.com/remix-run/remix/blob/remix%402.6.0/packages/remix-testing/CHANGELOG.md#260",
"https://github.com/remix-run/remix/compare/remix@2.5.1...remix@2.6.0",
"https://github.com/remix-run/remix/pull/8503",
"https://github.com/remix-run/remix/pull/8492",
"https://github.com/remix-run/remix/pull/8495",
"https://github.com/remix-run/remix/pull/8488",
"https://github.com/remix-run/remix/pull/8479",
"https://github.com/remix-run/remix/pull/8468",
"https://github.com/remix-run/remix/pull/8493",
"https://remix.run/docs/future/vite#performance",
"https://github.com/remix-run/remix/pull/8164",
"https://github.com/remix-run/remix/pull/8530",
"https://github.com/remix-run/remix/pull/8538",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.3",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/create-remix/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-architect/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare-pages/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-cloudflare-workers/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-css-bundle/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-deno/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-dev/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-eslint-config/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-express/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-node/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-react/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-serve/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-server-runtime/CHANGELOG.md#251",
"https://github.com/remix-run/remix/blob/remix%402.5.1/packages/remix-testing/CHANGELOG.md#251",
"https://github.com/remix-run/remix/compare/remix@2.5.0...remix@2.5.1",
"https://github.com/remix-run/remix/discussions/7638",
"https://remix.run/future/spa-mode",
"https://github.com/remix-run/remix/pull/8457",
"https://github.com/remix-run/remix/pull/8332",
"https://github.com/remix-run/remix/pull/8458",
"https://github.com/remix-run/remix/pull/8446",
"https://github.com/remix-run/remix/pull/8415",
"https://github.com/remix-run/remix/pull/8157",
"https://github.com/remix-run/remix/pull/8405",
"https://github.com/remix-run/remix/pull/8420",
"https://github.com/remix-run/remix/pull/8459",
"https://github.com/jshttp/cookie/blob/master/HISTORY.md#060--2023-11-06",
"https://developer.mozilla.org/en-US/docs/Web/Privacy/Partitioned_cookies",
"https://github.com/remix-run/remix/pull/8375",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.2",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1142",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/create-remix/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-architect/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare-pages/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-cloudflare-workers/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-css-bundle/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-deno/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-dev/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-eslint-config/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-express/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-node/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-react/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-serve/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-server-runtime/CHANGELOG.md#250",
"https://github.com/remix-run/remix/blob/remix%402.5.0/packages/remix-testing/CHANGELOG.md#250",
"https://github.com/remix-run/remix/compare/remix@2.4.1...remix@2.5.0",
"https://github.com/remix-run/remix/pull/8264",
"https://github.com/remix-run/remix/pull/8211",
"https://github.com/remix-run/remix/pull/8267",
"https://github.com/remix-run/remix/pull/8200",
"https://github.com/remix-run/remix/pull/8342",
"https://github.com/remix-run/remix/pull/8222",
"https://github.com/remix-run/remix/pull/8304",
"https://github.com/remix-run/remix/pull/8351",
"https://github.com/remix-run/remix/pull/8238",
"https://github.com/remix-run/remix/pull/7345",
"https://github.com/remix-run/remix/pull/8321",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.1",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1141",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/create-remix/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-architect/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare-pages/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-cloudflare-workers/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-css-bundle/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-deno/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-dev/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-eslint-config/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-express/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-node/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-react/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-serve/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-server-runtime/CHANGELOG.md#241",
"https://github.com/remix-run/remix/blob/remix%402.4.1/packages/remix-testing/CHANGELOG.md#241",
"https://github.com/remix-run/remix/compare/remix@2.4.0...remix@2.4.1",
"https://github.com/remix-run/remix/discussions/7634",
"https://remix.run/guides/client-data",
"https://remix.run/route/client-loader",
"https://remix.run/route/hydrate-fallback",
"https://remix.run/route/client-action",
"https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#futurev7_relativesplatpath",
"https://remix.run/hooks/use-resolved-path#splat-paths",
"https://remix.run/docs/en/main/future/vite#strict-route-exports",
"https://github.com/remix-run/remix/pull/8173",
"https://github.com/remix-run/remix/pull/8216",
"https://github.com/remix-run/remix/pull/8154",
"https://github.com/remix-run/remix/pull/8171",
"https://github.com/remix-run/remix/pull/8076",
"https://github.com/remix-run/remix/pull/8066",
"https://github.com/remix-run/remix/pull/8174",
"https://github.com/remix-run/remix/pull/8077",
"https://remix.run/future/vite",
"https://github.com/remix-run/remix/pull/8172",
"https://github.com/remix-run/remix/pull/8022",
"https://github.com/remix-run/remix/pull/8143",
"https://github.com/remix-run/remix/pull/8096",
"https://github.com/remix-run/remix/pull/8057",
"https://github.com/remix-run/remix/pull/8120",
"https://github.com/remix-run/remix/pull/8177",
"https://github.com/remix-run/remix/pull/8121",
"https://github.com/remix-run/remix/pull/8119",
"https://github.com/remix-run/remix/pull/8184",
"https://github.com/remix-run/remix/pull/8062",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.21.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1140",
"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-fetch%404.4.2",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/create-remix/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-architect/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare-pages/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-cloudflare-workers/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-css-bundle/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-deno/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-dev/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-eslint-config/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-express/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-node/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-react/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-serve/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-server-runtime/CHANGELOG.md#240",
"https://github.com/remix-run/remix/blob/remix%402.4.0/packages/remix-testing/CHANGELOG.md#240",
"https://github.com/remix-run/remix/compare/remix@2.3.1...remix@2.4.0",
"https://github.com/remix-run/remix/pull/8014",
"https://github.com/remix-run/remix/pull/8042",
"https://github.com/remix-run/remix/pull/8039",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.20.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1130",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/create-remix/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-architect/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare-pages/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-cloudflare-workers/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-css-bundle/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-deno/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-dev/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-eslint-config/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-express/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-node/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-react/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-serve/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-server-runtime/CHANGELOG.md#231",
"https://github.com/remix-run/remix/blob/remix%402.3.1/packages/remix-testing/CHANGELOG.md#231",
"https://github.com/remix-run/remix/compare/remix@2.3.0...remix@2.3.1",
"https://remix.run/hooks/use-blocker",
"https://remix.run/hooks/use-prompt",
"https://reactrouter.com/v6/hooks/use-blocker",
"https://github.com/remix-run/remix/pull/7882",
"https://github.com/remix-run/remix/pull/7996",
"https://github.com/remix-run/remix/pull/7684",
"https://github.com/jshttp/cookie/blob/v0.5.0/HISTORY.md#050--2022-04-11",
"https://github.com/remix-run/remix/pull/6770",
"https://github.com/remix-run/remix/pull/7895",
"https://github.com/remix-run/remix/pull/7919",
"https://github.com/remix-run/remix/pull/7904",
"https://github.com/remix-run/remix/pull/7888",
"https://github.com/remix-run/remix/pull/7911",
"https://github.com/remix-run/remix/pull/7908",
"https://github.com/remix-run/remix/pull/7846",
"https://github.com/remix-run/remix/pull/7980",
"https://github.com/remix-run/remix/pull/7952",
"https://github.com/remix-run/remix/pull/7913",
"https://github.com/remix-run/remix/pull/7883",
"https://github.com/remix-run/remix/pull/7926",
"https://github.com/remix-run/remix/pull/7842",
"https://github.com/remix-run/remix/pull/7843",
"https://github.com/remix-run/remix/pull/7937",
"https://github.com/remix-run/remix/pull/7958",
"https://github.com/remix-run/remix/pull/7892",
"https://github.com/remix-run/remix/commit/8cd31d6543ef4c765220fc64dca9bcc9c61ee9eb",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.19.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1120",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/create-remix/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-architect/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare-pages/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-cloudflare-workers/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-css-bundle/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-deno/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-dev/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-eslint-config/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-express/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-node/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-react/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-serve/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-server-runtime/CHANGELOG.md#230",
"https://github.com/remix-run/remix/blob/remix%402.3.0/packages/remix-testing/CHANGELOG.md#230",
"https://github.com/remix-run/remix/compare/remix@2.2.0...remix@2.3.0",
"https://remix.run/docs/en/2.2.0/future/vite",
"https://github.com/remix-run/remix/discussions/7698",
"https://github.com/remix-run/remix/pull/7590",
"https://github.com/remix-run/react-router/pull/10960",
"https://github.com/remix-run/react-router/pull/10962",
"https://github.com/remix-run/remix/pull/7323",
"https://github.com/remix-run/remix/pull/7745",
"https://pnpm.io/cli/pack",
"https://github.com/remix-run/remix/pull/7649",
"https://github.com/remix-run/remix/pull/7670",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.18.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1110",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/create-remix/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-architect/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare-pages/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-cloudflare-workers/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-css-bundle/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-deno/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-dev/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-eslint-config/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-express/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-node/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-react/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-serve/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-server-runtime/CHANGELOG.md#220",
"https://github.com/remix-run/remix/blob/remix%402.2.0/packages/remix-testing/CHANGELOG.md#220",
"https://github.com/remix-run/remix/compare/remix@2.1.0...remix@2.2.0",
"https://developer.mozilla.org/en-US/docs/Web/API/ViewTransition",
"https://remix.run/docs/components/link#unstable_viewtransition",
"https://remix.run/docs/hooks/use-view-transition-state",
"https://remix.run/docs/components/nav-link#unstable_viewtransition",
"https://github.com/brophdawg11/react-router-records",
"https://github.com/Charca/astro-records",
"https://developer.chrome.com/docs/web-platform/view-transitions/",
"https://remix.run/docs/utils/create-remix-stub",
"https://github.com/remix-run/react-router/pull/10916",
"https://github.com/remix-run/remix/pull/7647",
"https://github.com/remix-run/remix/pull/7605",
"https://github.com/remix-run/remix/pull/7594",
"https://github.com/remix-run/remix/pull/7576",
"https://github.com/remix-run/remix/pull/7551",
"https://github.com/remix-run/remix/pull/7574",
"https://github.com/remix-run/remix/pull/7619",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.17.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#1100",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/create-remix/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-architect/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare-pages/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-cloudflare-workers/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-css-bundle/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-deno/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-dev/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-eslint-config/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-express/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-node/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-react/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-serve/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-server-runtime/CHANGELOG.md#210",
"https://github.com/remix-run/remix/blob/remix%402.1.0/packages/remix-testing/CHANGELOG.md#210",
"https://github.com/remix-run/remix/compare/remix@2.0.1...remix@2.1.0",
"https://github.com/remix-run/remix/pull/7491",
"https://github.com/remix-run/remix/pull/7272",
"https://github.com/remix-run/remix/pull/7180",
"https://github.com/remix-run/remix/pull/7487",
"https://github.com/remix-run/remix/pull/7470",
"https://github.com/remix-run/remix/pull/7464",
"https://github.com/remix-run/remix/pull/7498",
"https://github.com/remix-run/remix/pull/7423",
"https://github.com/remix-run/remix/pull/7477",
"https://github.com/remix-run/remix/pull/7203",
"https://github.com/remix-run/remix/pull/7217",
"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-dev/CHANGELOG.md#201",
"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-node/CHANGELOG.md#201",
"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-react/CHANGELOG.md#201",
"https://github.com/remix-run/remix/blob/remix%402.0.1/packages/remix-serve/CHANGELOG.md#201",
"https://github.com/remix-run/remix/compare/remix@2.0.0...remix@2.0.1",
"https://remix.run/blog/future-flags",
"https://remix.run/docs/en/main/start/v2",
"https://github.com/remix-run/remix/pull/7121",
"https://react.dev/blog/2022/03/08/react-18-upgrade-guide",
"https://github.com/remix-run/remix/pull/6939",
"https://github.com/remix-run/remix/pull/7292",
"https://nodejs.org/en/blog/announcements/v18-release-announce",
"https://remix.run/docs/en/main/other-api/node#version-support",
"https://remix.run/docs/en/main/start/v2#remix-dev",
"https://github.com/remix-run/remix/pull/7002",
"https://remix.run/docs/en/main/start/v2#catchboundary-and-errorboundary",
"https://github.com/remix-run/remix/pull/6906",
"https://remix.run/docs/en/main/start/v2#route-headers",
"https://github.com/remix-run/remix/pull/6979",
"https://remix.run/docs/en/main/start/v2#route-meta",
"https://github.com/remix-run/remix/pull/6958",
"https://remix.run/docs/en/main/start/v2#formmethod",
"https://github.com/remix-run/remix/pull/6875",
"https://remix.run/docs/en/main/start/v2#file-system-route-convention",
"https://github.com/remix-run/remix/pull/6969",
"https://remix.run/docs/en/main/start/v2#browserbuilddirectory",
"https://github.com/remix-run/remix/pull/6900",
"https://remix.run/docs/en/main/start/v2#devserverbroadcastdelay",
"https://github.com/remix-run/remix/pull/7063",
"https://remix.run/docs/en/main/start/v2#devserverport",
"https://github.com/remix-run/remix/commit/000457e0ae025d9b94e721af254c319e83438923",
"https://remix.run/docs/en/main/start/v2#servermoduleformat",
"https://github.com/remix-run/remix/pull/6949",
"https://remix.run/docs/en/main/start/v2#serverbuildtarget",
"https://github.com/remix-run/remix/pull/6896",
"https://remix.run/docs/en/main/start/v2#serverbuilddirectory",
"https://github.com/remix-run/remix/pull/6897",
"https://remix.run/docs/en/main/start/v2#servernodebuiltinspolyfill",
"https://github.com/remix-run/remix/pull/6911",
"https://remix.run/docs/en/main/start/v2#usetransition",
"https://github.com/remix-run/remix/pull/6870",
"https://remix.run/docs/en/main/start/v2#usefetcher",
"https://github.com/remix-run/remix/pull/6874",
"https://remix.run/docs/en/main/start/v2#links-imagesizes-and-imagesrcset",
"https://github.com/remix-run/remix/pull/6936",
"https://remix.run/docs/en/main/start/v2#browsernodebuiltinspolyfill",
"https://github.com/remix-run/remix/pull/7269",
"https://remix.run/docs/en/main/start/v2#built-in-postcsstailwind-support",
"https://github.com/remix-run/remix/pull/6909",
"https://github.com/remix-run/remix/pull/6898",
"https://github.com/remix-run/remix/pull/6925",
"https://github.com/remix-run/remix/pull/6963",
"https://github.com/remix-run/remix/pull/6965",
"https://github.com/remix-run/remix/pull/6962",
"https://github.com/remix-run/remix/pull/6918",
"https://github.com/remix-run/remix/pull/6903",
"https://github.com/remix-run/remix/pull/6902",
"https://remix.run/docs/en/main/start/v2#netlify-adapter",
"https://github.com/remix-run/remix/pull/7058",
"https://remix.run/docs/en/main/start/v2#installglobals",
"https://github.com/remix-run/remix/pull/7009",
"https://github.com/remix-run/remix/pull/7293",
"https://remix.run/docs/en/main/start/v2#source-map-support",
"https://github.com/remix-run/remix/pull/6865",
"https://github.com/remix-run/remix/pull/7278",
"https://github.com/remix-run/remix/pull/7231",
"https://github.com/remix-run/remix/pull/7229",
"https://github.com/remix-run/remix/pull/7173",
"https://remix.run/docs/en/main/start/v2#vercel-adapter",
"https://github.com/remix-run/remix/pull/7035",
"https://github.com/remix-run/remix/pull/7099",
"https://github.com/remix-run/remix/pull/6895",
"https://github.com/remix-run/remix/pull/7319",
"https://remix.run/docs/en/main/other-api/create-remix",
"https://github.com/remix-run/remix/pull/6887",
"https://remix.run/docs/en/main/guides/templates",
"https://github.com/remix-run/remix/pull/7062",
"https://github.com/remix-run/remix/pull/7074",
"https://github.com/remix-run/remix/pull/6964",
"https://github.com/remix-run/remix/pull/7040",
"https://github.com/remix-run/remix/pull/6842",
"https://github.com/remix-run/remix/pull/7105",
"https://github.com/remix-run/remix/pull/7186",
"https://github.com/remix-run/remix/pull/7133",
"https://github.com/remix-run/remix/pull/7206",
"https://github.com/remix-run/remix/pull/6982",
"https://github.com/remix-run/react-router/releases/tag/react-router%406.16.0",
"https://github.com/remix-run/react-router/blob/main/packages/router/CHANGELOG.md#190",
"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-fetch%404.4.0",
"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-file%403.1.0",
"https://github.com/remix-run/web-std-io/releases/tag/%40remix-run%2Fweb-stream%401.1.0",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/create-remix/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-architect/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare-pages/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-cloudflare-workers/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-css-bundle/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-deno/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-dev/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-eslint-config/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-express/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-node/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-react/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-serve/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-server-runtime/CHANGELOG.md#200",
"https://github.com/remix-run/remix/blob/remix%402.0.0/packages/remix-testing/CHANGELOG.md#200",
"https://remix.run",
"https://opensource.org/licenses/MIT",
"https://github.com/remix-run/remix-v2-website/edit/main/data/CHANGELOG.md"
]
},
"hash": "b841f71922233b1d0933bb98fc4f46d67d7bc6bec6bf85d2ee30c9383f9c8f22",
"timestamp": "2026-02-23T11:36:17.870204218+01:00"
}