UNPKG

@jmnuf/ao

Version:

A simple typescript based full-stack api endpoint creator that is meant to somewhat follow web standards in its implementation.

55 lines (54 loc) 2.89 kB
import type { Cookie, HTTPMethod, ResponseValueType, FindPathParams } from "./utils"; declare function requestCookies(request: Request): Record<string, Cookie>; type BasePathParams = Record<string, string | number | string[] | number[] | undefined>; type RedirectCode = 301 | 302 | 303 | 307 | 308; type Nomicon<PathParams extends BasePathParams> = { error: ((code: number) => never) & ((code: number, message: string) => never); redirect: (url: string, code?: RedirectCode) => never; request: Request; cookies: ReturnType<typeof requestCookies>; query: Record<string, string | string[] | undefined>; params: PathParams; }; export type RouteHandler<TRet extends ResponseValueType, PathParams extends { [param: string]: string | string[] | undefined; } = {}> = (nom: Nomicon<PathParams>) => Promise<TRet> | TRet; export type AncientOne<Prefix extends string, T extends { [P: `/${string}`]: Record<Lowercase<HTTPMethod>, RouteHandler<any, any>>; }> = { readonly prefix: Prefix; fetch(request: Request): Promise<Response>; seize<OtherPrefix extends string, OtherHandlers extends { [P: `/${string}`]: Record<Lowercase<HTTPMethod>, RouteHandler<any, any>>; }>(otherAnction: AncientOne<OtherPrefix, OtherHandlers>): AncientOne<Prefix, T & { [P in keyof OtherHandlers as P extends `/${string}` ? `${OtherPrefix}${P}` : never]: { [M in keyof OtherHandlers[P]]: OtherHandlers[P][M]; }; }>; get<Path extends `/${string}`, Return extends ResponseValueType, PathParams extends Record<string, string | string[]> = FindPathParams<Path>, Handler extends RouteHandler<any, any> = RouteHandler<Return, PathParams>>(path: Path, handler: Handler): AncientOne<Prefix, T & { [P in Path]: P extends keyof T ? { [K in keyof T[P] | Lowercase<HTTPMethod>]: K extends "get" ? Handler : K extends keyof T[P] ? T[P][K] : never; } : { get: Handler; put: never; post: never; delete: never; }; }>; post<Path extends `/${string}`, Return extends ResponseValueType, PathParams extends Record<string, string | string[]> = FindPathParams<Path>, Handler extends RouteHandler<any, any> = RouteHandler<Return, PathParams>>(path: Path, handler: Handler): AncientOne<Prefix, T & { [P in Path]: P extends keyof T ? { [K in keyof T[P] | Lowercase<HTTPMethod>]: K extends "post" ? Handler : K extends keyof T[P] ? T[P][K] : never; } : { post: Handler; put: never; get: never; delete: never; }; }>; readonly __TYPE_LEVEL_T: T; }; type AncientOneSummonSetup<Prefix extends `/${string}`> = { prefix?: Prefix; }; export declare function summonAncientOne<Prefix extends `/${string}`>(setup: AncientOneSummonSetup<Prefix>): AncientOne<Prefix, {}>; export {};