@@ -5,7 +5,7 @@ import FetchError from "../core/fetch_error.ts";
5
5
import { redirect } from "../core/redirect.ts" ;
6
6
import type { Route , RouteMeta , RouteModule , RouteRecord } from "../core/route.ts" ;
7
7
import { matchRoutes } from "../core/route.ts" ;
8
- import { URLPatternCompat } from "../core/url_pattern.ts" ;
8
+ import { URLPatternCompat , URLPatternInput } from "../core/url_pattern.ts" ;
9
9
import { ForwardPropsContext , RouterContext , type RouterContextProps } from "./context.ts" ;
10
10
import { DataProvider , type RouteData } from "./data.ts" ;
11
11
import { Err , ErrorBoundary } from "./error.ts" ;
@@ -199,12 +199,39 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
199
199
events . on ( "moduleprefetch" , onmoduleprefetch ) ;
200
200
events . emit ( "routerready" , { type : "routerready" } ) ;
201
201
202
- // todo: update routes by hmr
202
+ const oncreate = ( e : Record < string , unknown > ) => {
203
+ const route : Route = [
204
+ new URLPatternCompat ( e . routePattern as URLPatternInput ) ,
205
+ {
206
+ filename : e . specifier as string ,
207
+ pattern : e . routePattern as URLPatternInput ,
208
+ } ,
209
+ ] ;
210
+ const pathname = ( e . routePattern as URLPatternInput ) . pathname . slice ( 1 ) ;
211
+ if ( pathname === "_app" || pathname === "_404" || pathname === "_error" ) {
212
+ routeRecord [ pathname ] = route ;
213
+ }
214
+ routeRecord . routes . push ( route ) ;
215
+ } ;
216
+ events . on ( "hmr:create" , oncreate ) ;
217
+
218
+ const onremove = ( e : Record < string , unknown > ) => {
219
+ const route = routeRecord . routes . find ( ( v ) => v [ 1 ] . filename === e . specifier ) ;
220
+ const pathname = ( route ?. [ 1 ] . pattern . pathname ) ?. slice ( 1 ) ;
221
+ if ( pathname === "_app" || pathname === "_404" || pathname === "_error" ) {
222
+ routeRecord [ pathname ] = undefined ;
223
+ }
224
+ routeRecord . routes = routeRecord . routes . filter ( ( v ) => v [ 1 ] . filename != e . specifier ) ;
225
+ onpopstate ( { type : "popstate" } ) ;
226
+ } ;
227
+ events . on ( "hmr:remove" , onremove ) ;
203
228
204
229
return ( ) => {
205
230
removeEventListener ( "popstate" , onpopstate as unknown as EventListener ) ;
206
231
events . off ( "popstate" , onpopstate ) ;
207
232
events . off ( "moduleprefetch" , onmoduleprefetch ) ;
233
+ events . off ( "hmr:create" , oncreate ) ;
234
+ events . off ( "hmr:remove" , onremove ) ;
208
235
} ;
209
236
} , [ ] ) ;
210
237
0 commit comments