@ts-rest/core
Version:
RPC-like experience over a regular REST API, with type safe server implementations 🪄
31 lines (30 loc) • 1.44 kB
TypeScript
type ResolveOptionalPathParam<T extends string> = T extends `${infer PathParam}?` ? {
[key in PathParam]?: string | undefined;
} : {
[key in T]: string;
};
/**
* @params T - The URL e.g. /posts/:id
* @params TAcc - Accumulator object
*/
type RecursivelyExtractPathParams<T extends string> = T extends '' ? Record<never, never> : T extends `${infer Left}/:${infer PathParam}/${infer Right}` ? ResolveOptionalPathParam<PathParam> & RecursivelyExtractPathParams<Left> & RecursivelyExtractPathParams<Right> : T extends `:${infer PathParam}/${infer Right}` ? ResolveOptionalPathParam<PathParam> & RecursivelyExtractPathParams<Right> : T extends `${infer Left}/:${infer PathParam}` ? ResolveOptionalPathParam<PathParam> & RecursivelyExtractPathParams<Left> : T extends `:${infer PathParam}` ? ResolveOptionalPathParam<PathParam> : Record<never, never>;
/**
* Extract path params from path function
*
* `{ id: string, commentId: string }`
*
* @params T - The URL e.g. /posts/:id
*/
export type ParamsFromUrl<T extends string> = RecursivelyExtractPathParams<T> extends infer U ? {
[key in keyof U]: U[key];
} : never;
/**
* @param path - The URL e.g. /posts/:id
* @param params - The params e.g. `{ id: string }`
* @returns - The URL with the params e.g. /posts/123
*/
export declare const insertParamsIntoPath: <T extends string>({ path, params, }: {
path: T;
params: ParamsFromUrl<T>;
}) => string;
export {};