UNPKG

craydent

Version:

node library based on craydent-1.9.3

223 lines (210 loc) 7.01 kB
/// <reference types="node" /> import * as http from 'http'; import { OneOrMore } from '../models/Generics'; import ServerManager from '../methods/servermanager'; import { Invokable } from '../models/Invokable'; export interface CraydentHttp extends http.Server { routes: Route[]; /** * @deprecated Load balancing should be done by the infrastructure */ loadBalance: (ips: string | string[]) => void; // #region all overloads all<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; all<T extends string, P extends Parameter[]>( path: T, callback: RequestHandler<T, P>, parameters?: P ): void; // all<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T, P>, // parameters?: P // ): void; // #endregion // #region delete overloads delete<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; delete<T extends string, P extends readonly Parameter[]>( path: T, callback: RequestHandler<T, P>, parameters?: P ): void; // delete<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T, P>, // parameters?: Parameter[] // ): void; // #endregion // #region get overloads get<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; get<T extends string>( path: T, callback: RequestHandler<T> ): void; // get<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T> // ): void; // #endregion // #region patch overloads patch<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; patch<T extends string, P extends readonly Parameter[]>( path: T, callback: RequestHandler<T, P>, parameters?: P ): void; // patch<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T, P>, // parameters?: P // ): void; // #endregion // #region post overloads post<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; post<T extends string, P extends readonly Parameter[]>( path: T, callback: RequestHandler<T, P>, parameters?: P ): void; // post<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T, P>, // parameters?: P // ): void; // #endregion // #region put overloads put<T extends string, P extends readonly Parameter[]>( config: { path: T; callback: RequestHandler<T, P>; readonly parameters?: P; } ): void; put<T extends string, P extends readonly Parameter[]>( path: T, callback: RequestHandler<T, P>, parameters?: P ): void; // put<T extends string, P extends readonly Parameter[]>( // configOrPath: T | { // path: T; // callback: RequestHandler<T, P>; // readonly parameters?: P; // }, // callback?: RequestHandler<T, P>, // parameters?: P // ): void; // #endregion // #region use overloads use<T extends string>( path: T, callback: RequestHandler<T> ): void | ((this: CraydentHttp, callback: OneOrMore<RequestHandler>) => void); use<T extends string>( callback: RequestHandler<T> ): void | ((this: CraydentHttp, callback: OneOrMore<RequestHandler>) => void); // #endregion } export interface Route<T extends string = string, P extends Parameter[] = Parameter[]> { path: T; callback: RequestHandler<T, P>[]; method: 'all' | 'delete' | 'get' | 'middleware' | 'patch' | 'post' | 'put'; parameters?: P; } export interface Parameter { name: string; type?: 'array' | 'bool' | 'boolean' | 'date' | 'email' | 'int' | 'number' | 'object' | 'regexp' | 'string'; required?: boolean; default?: any; } type ParameterTypeMap = { string: string; email: string; object: { [key: string]: any } number: number; int: number; bool: boolean; boolean: boolean; array: any[]; date: Date; regexp: RegExp; }; type ParameterToType<P extends Parameter> = P['type'] extends keyof ParameterTypeMap ? P['required'] extends true ? ParameterTypeMap[P['type']] // Required field : ParameterTypeMap[P['type']] | undefined // Optional field : any; type MapParameters<Params extends readonly Parameter[]> = { [P in Params[number]as P['name']]: ParameterToType<P>; }; export type ExtractParams<T extends string> = T extends `${infer _Start}\${${infer Param}}${infer Rest}` ? { [K in Param | keyof ExtractParams<Rest>]: string } : {}; export type RequestHandlerParams< T extends string, P extends readonly Parameter[], Request extends typeof http.IncomingMessage, Response extends typeof http.ServerResponse> = { request: InstanceType<Request>; response: InstanceType<Response> & { req: InstanceType<Request> }; value?: ExtractParams<T> & MapParameters<P>; next?: Invokable; }; export type RequestHandler< T extends string = string, P extends readonly Parameter[] = readonly Parameter[], Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, Response extends typeof http.ServerResponse = typeof http.ServerResponse > = (this: ServerManager, params: RequestHandlerParams<T, P, Request, Response>) => any | Promise<any> | GeneratorFunction | AsyncGeneratorFunction;