@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
TypeScript
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 {};