import { Context as LambdaContext, Handler as LambdaHandler } from 'aws-lambda' declare type PluginHook = () => void declare type PluginHookWithMiddlewareName = (middlewareName: string) => void declare type PluginHookPromise = () => Promise interface PluginObject { beforePrefetch?: PluginHook requestStart?: PluginHook beforeMiddleware?: PluginHookWithMiddlewareName afterMiddleware?: PluginHookWithMiddlewareName beforeHandler?: PluginHook afterHandler?: PluginHook requestEnd?: PluginHookPromise } interface Request { event: TEvent context: LambdaContext response: TResult | null error: TErr | null internal: { [key: string]: any } } declare type MiddlewareFn = (request: Request) => any interface MiddlewareObj { before?: MiddlewareFn after?: MiddlewareFn onError?: MiddlewareFn } interface MiddyfiedHandler { use: UseFn applyMiddleware: AttachMiddlewareObj before: AttachMiddlewareFn after: AttachMiddlewareFn onError: AttachMiddlewareFn __middlewares: { before: Array> after: Array> onError: Array> } (event: TEvent, context: LambdaContext): Promise } declare type AttachMiddlewareFn = (middleware: MiddlewareFn) => MiddyfiedHandler declare type AttachMiddlewareObj = (middleware: MiddlewareObj) => MiddyfiedHandler declare type UseFn = (middlewares: MiddlewareObj | Array>) => MiddyfiedHandler /** * Middy factory function. Use it to wrap your existing handler to enable middlewares on it. * @param handler your original AWS Lambda function * @param plugin wraps around each middleware and handler to add custom lifecycle behaviours (e.g. to profile performance) */ declare function middy (handler?: LambdaHandler, plugin?: PluginObject): MiddyfiedHandler declare namespace middy { export { Request, PluginHook, PluginHookWithMiddlewareName, PluginObject, MiddlewareFn, MiddlewareObj, MiddyfiedHandler } } export default middy