diff --git a/packages/fetch-router/src/lib/route-handlers.ts b/packages/fetch-router/src/lib/route-handlers.ts index 58d783435a5..6c56a9b8037 100644 --- a/packages/fetch-router/src/lib/route-handlers.ts +++ b/packages/fetch-router/src/lib/route-handlers.ts @@ -6,24 +6,24 @@ import type { RequestMethod } from './request-methods.ts' import type { Route, RouteMap } from './route-map.ts' // prettier-ignore -export type RouteHandlers = - | RouteHandlersWithMiddleware +export type RouteHandlers = + | RouteHandlersWithMiddleware | { - [K in keyof T]: ( - T[K] extends Route ? RouteHandler : - T[K] extends RouteMap ? RouteHandlers : + [name in keyof routeMap]: ( + routeMap[name] extends Route ? RouteHandler : + routeMap[name] extends RouteMap ? RouteHandlers : never ) } -type RouteHandlersWithMiddleware = { +type RouteHandlersWithMiddleware = { use: Middleware[] - handlers: RouteHandlers + handlers: RouteHandlers } -export function isRouteHandlersWithMiddleware( - handlers: any, -): handlers is RouteHandlersWithMiddleware { +export function isRouteHandlersWithMiddleware( + handlers: unknown, +): handlers is RouteHandlersWithMiddleware { return ( typeof handlers === 'object' && handlers != null && 'use' in handlers && 'handlers' in handlers ) @@ -32,18 +32,19 @@ export function isRouteHandlersWithMiddleware( /** * An individual route handler. */ -export type RouteHandler = - | RequestHandlerWithMiddleware - | RequestHandler> +export type RouteHandler = + | RequestHandlerWithMiddleware + | RequestHandler> -type RequestHandlerWithMiddleware = { - use: Middleware>[] - handler: RequestHandler> +type RequestHandlerWithMiddleware = { + use: Middleware>[] + handler: RequestHandler> } -export function isRequestHandlerWithMiddleware( - handler: any, -): handler is RequestHandlerWithMiddleware { +export function isRequestHandlerWithMiddleware< + method extends RequestMethod | 'ANY', + pattern extends string, +>(handler: unknown): handler is RequestHandlerWithMiddleware { return typeof handler === 'object' && handler != null && 'use' in handler && 'handler' in handler } @@ -51,8 +52,8 @@ export function isRequestHandlerWithMiddleware = - T extends string ? RouteHandler : - T extends RoutePattern ? RouteHandler : - T extends Route ? RouteHandler : +export type BuildRouteHandler = + route extends string ? RouteHandler : + route extends RoutePattern ? RouteHandler : + route extends Route ? RouteHandler : never diff --git a/packages/fetch-router/src/lib/route-map.ts b/packages/fetch-router/src/lib/route-map.ts index ba442244e43..d0f29221681 100644 --- a/packages/fetch-router/src/lib/route-map.ts +++ b/packages/fetch-router/src/lib/route-map.ts @@ -4,27 +4,27 @@ import type { HrefBuilderArgs, Join, RouteMatch } from '@remix-run/route-pattern import type { RequestMethod } from './request-methods.ts' import type { Simplify } from './type-utils.ts' -export interface RouteMap { - [K: string]: Route | RouteMap +export interface RouteMap { + [name: string]: Route | RouteMap } export class Route< - M extends RequestMethod | 'ANY' = RequestMethod | 'ANY', - P extends string = string, + method extends RequestMethod | 'ANY' = RequestMethod | 'ANY', + pattern extends string = string, > { - readonly method: M | 'ANY' - readonly pattern: RoutePattern

+ readonly method: method | 'ANY' + readonly pattern: RoutePattern - constructor(method: M | 'ANY', pattern: P | RoutePattern

) { + constructor(method: method | 'ANY', pattern: pattern | RoutePattern) { this.method = method this.pattern = typeof pattern === 'string' ? new RoutePattern(pattern) : pattern } - href(...args: HrefBuilderArgs

): string { + href(...args: HrefBuilderArgs): string { return this.pattern.href(...args) } - match(url: string | URL): RouteMatch

| null { + match(url: string | URL): RouteMatch | null { return this.pattern.match(url) } } @@ -32,11 +32,11 @@ export class Route< /** * Create a route map from a set of route definitions. */ -export function createRoutes(defs: R): BuildRouteMap<'/', R> -export function createRoutes

( - base: P | RoutePattern

, - defs: R, -): BuildRouteMap +export function createRoutes(defs: defs): BuildRouteMap<'/', defs> +export function createRoutes( + base: pattern | RoutePattern, + defs: defs, +): BuildRouteMap export function createRoutes(baseOrDefs: any, defs?: RouteDefs): RouteMap { return typeof baseOrDefs === 'string' || baseOrDefs instanceof RoutePattern ? buildRouteMap( @@ -46,10 +46,10 @@ export function createRoutes(baseOrDefs: any, defs?: RouteDefs): RouteMap { : buildRouteMap(new RoutePattern('/'), baseOrDefs) } -function buildRouteMap

( - base: RoutePattern

, - defs: R, -): BuildRouteMap { +function buildRouteMap( + base: RoutePattern, + defs: defs, +): BuildRouteMap { let routes: any = {} for (let key in defs) { @@ -70,31 +70,31 @@ function buildRouteMap

( } // prettier-ignore -export type BuildRouteMap

= Simplify<{ - -readonly [K in keyof R]: ( - R[K] extends Route ? Route> : - R[K] extends RouteDef ? BuildRoute : - R[K] extends RouteDefs ? BuildRouteMap : +export type BuildRouteMap = Simplify<{ + -readonly [name in keyof defs]: ( + defs[name] extends Route ? Route> : + defs[name] extends RouteDef ? BuildRoute : + defs[name] extends RouteDefs ? BuildRouteMap : never ) }> // prettier-ignore -type BuildRoute

= - D extends string ? Route<'ANY', Join> : - D extends RoutePattern ? Route<'ANY', Join> : - D extends { method: infer M, pattern: infer S } ? ( - S extends string ? Route> : - S extends RoutePattern ? Route> : +type BuildRoute = + def extends string ? Route<'ANY', Join> : + def extends RoutePattern ? Route<'ANY', Join> : + def extends { method: infer method, pattern: infer pattern } ? ( + pattern extends string ? Route> : + pattern extends RoutePattern ? Route> : never ) : never export interface RouteDefs { - [K: string]: Route | RouteDef | RouteDefs + [name: string]: Route | RouteDef | RouteDefs } -export type RouteDef = - | T - | RoutePattern - | { method?: RequestMethod; pattern: T | RoutePattern } +export type RouteDef = + | pattern + | RoutePattern + | { method?: RequestMethod; pattern: pattern | RoutePattern }