import { TypeInfo } from 'rtti'; import { Anonymize, ExtractMethod, ExtractPath } from '../util'; import { RouteSpec } from './create-http-route'; import { Method } from './methods'; import { RouteInfo } from './route-info'; /** * Creates a HttpSchema object from the given route specification object. * HTTP schemas may be passed to `createHttpClient` and/or `decorateExpressServer` to implement the schema on the * client-side and/or server-side. See those functions for more details. * @param routeSpecs an object keyed by route, with values describing the req/res body shape per route. */ export declare function createHttpSchema(routeSpecs: RSO): { [R in keyof RSO]: ExtractRouteInfoFromRSO; }; /** * Creates a HttpSchema object from the given route specification array. * HTTP schemas may be passed to `createHttpClient` and/or `decorateExpressServer` to implement the schema on the * client-side and/or server-side. See those functions for more details. * @param routeSpecs an array with one element per route, with each element describing the route and req/res body shape. */ export declare function createHttpSchema(routeSpecs: RSA): ExtractRouteInfoFromRSA; /** Route specifications, given as an object keyed by route, with values describing the req/res body shape per route. */ export interface RouteSpecObject { [route: `${Method} ${string}`]: { requestBody?: TypeInfo; responseBody?: TypeInfo; }; } /** A HTTP Schema declared as an object keyed by route, with values containing detailed information about each route. */ export interface HttpSchema { [route: string]: RouteInfo; } declare type ExtractRouteInfoFromRSO = Anonymize<{ method: ExtractMethod; path: ExtractPath; namedParams: Array> | ExtractNumberedParams>>; requestBody: RSO[Route] extends { requestBody: infer T; } ? T : never; responseBody: RSO[Route] extends { responseBody: infer T; } ? T : never; }>; declare type ExtractRouteInfoFromRSA = Anonymize<{ [K in keyof RSA as K extends `${number}` ? RSA[K] extends RouteSpec ? `${M} ${P}` : never : never]: RSA[K] extends RouteSpec ? { method: M; path: P; namedParams: Array | ExtractNumberedParams

>; requestBody: RSA[K] extends { requestBody: infer T; } ? T : never; responseBody: RSA[K] extends { responseBody: infer T; } ? T : never; } : never; }>; declare type ExtractNamedParams>> = ExtractUntilDelim; declare type ExtractUntilDelim = S extends `${Delim}${string}` ? '' : S extends `${infer First}${infer Rest}` ? `${First}${ExtractUntilDelim}` : ''; declare type Delim = '/' | ':' | '-' | '.' | '~' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '@' | '%'; declare type ExtractNumberedParams> = Filter extends [...infer U] ? { [K in keyof U]: K; }[any] : never; declare type Split = Str extends `${infer First}${Sep}${infer Rest}` ? [First, ...Split] : [Str]; declare type Tail = Tuple extends [any, ...infer Rest] ? Rest : never; declare type Filter = Tuple extends [infer First, ...infer Rest] ? First extends U ? [U, ...Filter] : Filter : []; export {};