@@ -4,7 +4,7 @@ import * as Pathe from "pathe/utils";
44
55import { type RouteManifest , type RouteManifestEntry } from "../config/routes" ;
66import { type Context } from "./context" ;
7- import { getTypesPath } from "./paths" ;
7+ import { getTypesDir , getTypesPath } from "./paths" ;
88
99export function generate ( ctx : Context , route : RouteManifestEntry ) : string {
1010 const lineage = getRouteLineage ( ctx . config . routes , route ) ;
@@ -120,3 +120,44 @@ function parseParams(urlpath: string) {
120120 if ( hasSplat ) result [ "*" ] = [ false ] ;
121121 return result ;
122122}
123+
124+ export function generateRouteManifest ( ctx : Context ) {
125+ return ts `
126+ export type RouteManifest = {
127+ ${ Object . entries ( ctx . config . routes )
128+ . map ( ( [ routeId , routeEntry ] , i ) => {
129+ const indent = i === 0 ? "" : " " . repeat ( 3 ) ;
130+ const routeTypeFile = Path . relative (
131+ getTypesDir ( ctx ) ,
132+ getTypesPath ( ctx , routeEntry )
133+ ) ;
134+ return `${ indent } "${ routeId } ": import("./${ routeTypeFile } ").Info,` ;
135+ } )
136+ . join ( "\n" ) }
137+ };
138+
139+ export type RouteId = keyof RouteManifest;
140+ ` ;
141+ }
142+
143+ export function generateUseRouteLoaderDataType ( ctx : Context ) {
144+ if ( ctx . config . future . typesafeUseRouteLoaderData ) {
145+ return ts `
146+ import type { RouteId, RouteManifest } from "./routeManifest";
147+
148+ declare module "react-router" {
149+ export function useRouteLoaderData<RI extends RouteId>(
150+ id: RI,
151+ ): RouteManifest[RI]["loaderData"] | undefined;
152+ }
153+ ` ;
154+ }
155+
156+ return ts `
157+ declare module "react-router" {
158+ export function useRouteLoaderData<T = any>(
159+ routeId: string
160+ ): SerializeFrom<T> | undefined;
161+ }
162+ ` ;
163+ }
0 commit comments