@@ -4,7 +4,7 @@ import * as Pathe from "pathe/utils";
4
4
5
5
import { type RouteManifest , type RouteManifestEntry } from "../config/routes" ;
6
6
import { type Context } from "./context" ;
7
- import { getTypesPath } from "./paths" ;
7
+ import { getTypesDir , getTypesPath } from "./paths" ;
8
8
9
9
export function generate ( ctx : Context , route : RouteManifestEntry ) : string {
10
10
const lineage = getRouteLineage ( ctx . config . routes , route ) ;
@@ -120,3 +120,44 @@ function parseParams(urlpath: string) {
120
120
if ( hasSplat ) result [ "*" ] = [ false ] ;
121
121
return result ;
122
122
}
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"];
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