import { Callback, Context, Handler } from 'aws-lambda' declare type EventType = T extends (event: infer EventArgType, context: C, callback: Callback) => void ? EventArgType : T extends (event: infer EventArgType, context: C) => Promise ? EventArgType : never; declare type HandlerReturnType = T extends (event: any, context: C) => Promise ? RetType : T extends (event: any, context: C, callback: Callback) => void ? RetType : never; declare type AsyncHandler = ((event: any, context: C, callback: Callback) => void) | ((event: any, context: C) => Promise); declare const middy: , C extends Context = Context>(handler: H) => middy.Middy< EventType, HandlerReturnType, C > declare namespace middy { interface Middy extends Handler { use: >(middlewares: M | M[]) => Middy; before: (callbackFn: MiddlewareFunction) => Middy; after: (callbackFn: MiddlewareFunction) => Middy; onError: (callbackFn: MiddlewareFunction) => Middy; } type Middleware = (config?: C) => MiddlewareObject; interface MiddlewareObject { before?: MiddlewareFunction; after?: MiddlewareFunction; onError?: MiddlewareFunction; } type MiddlewareFunction = (handler: HandlerLambda, next: NextFunction) => void | Promise; type NextFunction = (error?: any) => void; interface HandlerLambda { event: T; context: C; response: V; error: Error; callback: Callback; } } export default middy export as namespace middy;