type HookMethod = (options: O) => R | Promise type BeforeHook = (options: O) => void type ErrorHook = (error: E, options: O) => void type AfterHook = (result: R, options: O) => void type WrapHook = ( hookMethod: HookMethod, options: O ) => R | Promise type AnyHook = | BeforeHook | ErrorHook | AfterHook | WrapHook export interface HookCollection { /** * Invoke before and after hooks */ ( name: string | string[], hookMethod: HookMethod, options?: any ): Promise /** * Add `before` hook for given `name` */ before(name: string, beforeHook: BeforeHook): void /** * Add `error` hook for given `name` */ error(name: string, errorHook: ErrorHook): void /** * Add `after` hook for given `name` */ after(name: string, afterHook: AfterHook): void /** * Add `wrap` hook for given `name` */ wrap(name: string, wrapHook: WrapHook): void /** * Remove added hook for given `name` */ remove(name: string, hook: AnyHook): void } export interface HookSingular { /** * Invoke before and after hooks */ (hookMethod: HookMethod, options?: O): Promise /** * Add `before` hook */ before(beforeHook: BeforeHook): void /** * Add `error` hook */ error(errorHook: ErrorHook): void /** * Add `after` hook */ after(afterHook: AfterHook): void /** * Add `wrap` hook */ wrap(wrapHook: WrapHook): void /** * Remove added hook */ remove(hook: AnyHook): void } type Collection = new () => HookCollection type Singular = new () => HookSingular interface Hook { new (): HookCollection /** * Creates a collection of hooks */ Collection: Collection /** * Creates a nameless hook that supports strict typings */ Singular: Singular } export const Hook: Hook export const Collection: Collection export const Singular: Singular export default Hook