@@ -56,146 +56,6 @@ function initSsrInfo(): void {
5656 }
5757}
5858
59- type HmrInfo = {
60- abortController : AbortController | undefined ;
61- routerReadyResolve : ( router : RemixRouter ) => void ;
62- routerReadyPromise : Promise < RemixRouter > ;
63- } ;
64-
65- let hmrInfo : HmrInfo | null = null ;
66-
67- if (
68- import . meta &&
69- // @ts -expect-error
70- import . meta. hot &&
71- typeof window !== "undefined" &&
72- window . __remixManifest
73- ) {
74- let resolve : ( router : RemixRouter ) => void ;
75- let routerReadyPromise = new Promise ( ( r ) => {
76- resolve = r ;
77- } ) . catch ( ( ) => {
78- // This is a noop catch handler to avoid unhandled promise rejection warnings
79- // in the console. The promise is never rejected.
80- return undefined ;
81- } ) as Promise < RemixRouter > ;
82-
83- hmrInfo = {
84- abortController : undefined ,
85- routerReadyResolve : resolve ! ,
86- // There's a race condition with HMR where the remix:manifest is signaled before
87- // the router is assigned in the RemixBrowser component. This promise gates the
88- // HMR handler until the router is ready
89- routerReadyPromise,
90- } ;
91-
92- // @ts -expect-error
93- import . meta. hot . accept (
94- "remix:manifest" ,
95- async ( {
96- assetsManifest,
97- needsRevalidation,
98- } : {
99- assetsManifest : AssetsManifest ;
100- needsRevalidation : Set < string > ;
101- } ) => {
102- let router = await hmrInfo ! . routerReadyPromise ;
103- // This should never happen, but just in case...
104- if ( ! router || ! ssrInfo || ! hmrInfo ) {
105- console . error (
106- "Failed to accept HMR update because the router/ssrInfo was not ready."
107- ) ;
108- return ;
109- }
110-
111- let routeIds = [
112- ...new Set (
113- router . state . matches
114- . map ( ( m ) => m . route . id )
115- . concat ( Object . keys ( ssrInfo ! . routeModules ) )
116- ) ,
117- ] ;
118-
119- hmrInfo . abortController ?. abort ( ) ;
120- hmrInfo . abortController = new AbortController ( ) ;
121- let signal = hmrInfo . abortController . signal ;
122-
123- // Load new route modules that we've seen.
124- let newRouteModules = Object . assign (
125- { } ,
126- ssrInfo . routeModules ,
127- Object . fromEntries (
128- (
129- await Promise . all (
130- routeIds . map ( async ( id ) => {
131- if ( ! assetsManifest . routes [ id ] ) {
132- return null ;
133- }
134- let imported = await import (
135- assetsManifest . routes [ id ] . module +
136- `?t=${ assetsManifest . hmr ?. timestamp } `
137- ) ;
138- invariant ( ssrInfo , "ssrInfo unavailable for HMR update" ) ;
139- return [
140- id ,
141- {
142- ...imported ,
143- // react-refresh takes care of updating these in-place,
144- // if we don't preserve existing values we'll loose state.
145- default : imported . default
146- ? ssrInfo . routeModules [ id ] ?. default || imported . default
147- : imported . default ,
148- ErrorBoundary : imported . ErrorBoundary
149- ? ssrInfo . routeModules [ id ] ?. ErrorBoundary ||
150- imported . ErrorBoundary
151- : imported . ErrorBoundary ,
152- HydrateFallback : imported . HydrateFallback
153- ? ssrInfo . routeModules [ id ] ?. HydrateFallback ||
154- imported . HydrateFallback
155- : imported . HydrateFallback ,
156- } ,
157- ] ;
158- } )
159- )
160- ) . filter ( Boolean ) as [ string , RouteModules [ string ] ] [ ]
161- )
162- ) ;
163-
164- Object . assign ( ssrInfo . routeModules , newRouteModules ) ;
165- // Create new routes
166- let routes = createClientRoutesWithHMRRevalidationOptOut (
167- needsRevalidation ,
168- assetsManifest . routes ,
169- ssrInfo . routeModules ,
170- ssrInfo . context . state ,
171- ssrInfo . context . future ,
172- ssrInfo . context . isSpaMode
173- ) ;
174-
175- // This is temporary API and will be more granular before release
176- router . _internalSetRoutes ( routes ) ;
177-
178- // Wait for router to be idle before updating the manifest and route modules
179- // and triggering a react-refresh
180- let unsub = router . subscribe ( ( state ) => {
181- if ( state . revalidation === "idle" ) {
182- unsub ( ) ;
183- // Abort if a new update comes in while we're waiting for the
184- // router to be idle.
185- if ( signal . aborted ) return ;
186- // Ensure RouterProvider setState has flushed before re-rendering
187- setTimeout ( ( ) => {
188- Object . assign ( ssrInfo ! . manifest , assetsManifest ) ;
189- window . $RefreshRuntime$ ! . performReactRefresh ( ) ;
190- } , 1 ) ;
191- }
192- } ) ;
193- window . __remixRevalidation = ( window . __remixRevalidation || 0 ) + 1 ;
194- router . revalidate ( ) ;
195- }
196- ) ;
197- }
198-
19959function createHydratedRouter ( ) : RemixRouter {
20060 initSsrInfo ( ) ;
20161
@@ -330,9 +190,6 @@ function createHydratedRouter(): RemixRouter {
330190 router . createRoutesForHMR = createClientRoutesWithHMRRevalidationOptOut ;
331191 window . __remixRouter = router ;
332192
333- // Notify that the router is ready for HMR
334- hmrInfo ?. routerReadyResolve ( router ) ;
335-
336193 return router ;
337194}
338195
0 commit comments