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: TContext response: TResult | null error: TErr | null internal: { [key: string]: any } } declare type MiddlewareFn = (request: Request) => any export interface MiddlewareObj { before?: MiddlewareFn after?: MiddlewareFn onError?: MiddlewareFn } type MiddyInputHandler = (event: TEvent, context: TContext) => Promise export interface MiddyfiedHandler extends MiddyInputHandler { use: UseFn applyMiddleware: AttachMiddlewareObj before: AttachMiddlewareFn after: AttachMiddlewareFn onError: AttachMiddlewareFn __middlewares: { before: Array> after: Array> onError: Array> } (event: TEvent, context: TContext): Promise } declare type AttachMiddlewareFn = (middleware: MiddlewareFn) => MiddyfiedHandler declare type AttachMiddlewareObj = (middleware: MiddlewareObj) => MiddyfiedHandler declare type UseFn = (middlewares: MiddlewareObj | Array>) => MiddyfiedHandler declare type MiddlewareHandler, TContext> = THandler extends LambdaHandler // always true ? (event: TEvent, context: TContext) => Promise : never /** * 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?: MiddlewareHandler, TContext>, plugin?: PluginObject): MiddyfiedHandler declare namespace middy { export { Request, PluginHook, PluginHookWithMiddlewareName, PluginObject, MiddlewareFn, MiddlewareObj, MiddyfiedHandler } } export default middy