/// import express from 'express' declare global { namespace Router { type ListRouteParams = TRoute extends `/${infer TPart}/${infer TNextRoute}` ? TPart extends `:${infer TParam}?` ? `${TParam}_O` | ListRouteParams<`/${TNextRoute}`> : TPart extends `:${infer TParam}` ? `${TParam}_R` | ListRouteParams<`/${TNextRoute}`> : undefined | ListRouteParams<`/${TNextRoute}`> : TRoute extends `/${infer TPart}` ? TPart extends `:${infer TParam}?` ? `${TParam}_O` : TPart extends `:${infer TParam}` ? `${TParam}_R` : undefined : undefined ; type GetRouteParams = Exclude, undefined> type GetUrlParams> = { [K in LooseAutocomplete as K extends `${infer N}_${string}` ? N : string]: K extends `${string}_O` ? string | undefined : string } type expressRequest = Omit interface Request extends expressRequest { user: any extras: any rawBody?: Buffer _onResponseEvent: PlataOnResponseEvent[] params: GetUrlParams } interface Response extends express.Response { oldJson(body?: any): this error(error: PlataError | PlataError[]): this addOnResponseEvent(callback: PlataOnResponseEvent): void } type RequestHandler = (req: Request, res: Response, next: express.NextFunction) => Promise type HttpPlataMethods = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head" | "checkout" | "connect" | "copy" | "lock" | "merge" | "mkactivity" | "mkcol" | "move" | "notify" | "propfind" | "proppatch" | "purge" | "report" | "search" | "subscribe" | "trace" | "unlock" | "unsubscribe" | "use" ; interface CustomHttpMethods {} type HttpMethods = HttpPlataMethods | keyof CustomHttpMethods ; interface Route { path?: string method: string handlers: RequestHandler[], swaggerHide?: boolean | undefined } type RouterConfig = Record> = { swaggerHide?: boolean routes: Route[] httpRoute: string mark: T } type Router = RouterConfig & { [method in HttpMethods]: method extends keyof CustomHttpMethods ? CustomHttpMethods[method] : (path: T | RequestHandler, ...handlers: RequestHandler[]) => void | Promise } type RouterBuilder = (r: Router) => Promise export interface RequiredRoute extends RequiredInterface { httpRoute: string } type PlataOnResponseEvent = (aReq: Request, aRes?: Response, body?: T, error?: PlataError | PlataError[]) => Promise } }