[];
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['type'] extends keyof ParameterTypeMap
? P['required'] extends true
? ParameterTypeMap[P['type']] // Required field
: ParameterTypeMap[P['type']] | undefined // Optional field
: any;
type MapParameters = {
[P in Params[number]as P['name']]: ParameterToType;
};
export type ExtractParams =
T extends `${infer _Start}\${${infer Param}}${infer Rest}`
? { [K in Param | keyof ExtractParams]: string }
: {};
export type RequestHandlerParams<
T extends string,
P extends readonly Parameter[],
Request extends typeof http.IncomingMessage,
Response extends typeof http.ServerResponse> = {
request: InstanceType;
response: InstanceType & { req: InstanceType };
value?: ExtractParams & MapParameters;
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) => any | Promise | GeneratorFunction | AsyncGeneratorFunction;