Spaces:
Paused
Paused
| type HookMethod<Options, Result> = ( | |
| options: Options | |
| ) => Result | Promise<Result>; | |
| type BeforeHook<Options> = (options: Options) => void | Promise<void>; | |
| type ErrorHook<Options, Error> = ( | |
| error: Error, | |
| options: Options | |
| ) => unknown | Promise<unknown>; | |
| type AfterHook<Options, Result> = ( | |
| result: Result, | |
| options: Options | |
| ) => void | Promise<void>; | |
| type WrapHook<Options, Result> = ( | |
| hookMethod: HookMethod<Options, Result>, | |
| options: Options | |
| ) => Result | Promise<Result>; | |
| type AnyHook<Options, Result, Error> = | |
| | BeforeHook<Options> | |
| | ErrorHook<Options, Error> | |
| | AfterHook<Options, Result> | |
| | WrapHook<Options, Result>; | |
| type TypeStoreKeyLong = "Options" | "Result" | "Error"; | |
| type TypeStoreKeyShort = "O" | "R" | "E"; | |
| type TypeStore = | |
| | ({ [key in TypeStoreKeyLong]?: any } & | |
| { [key in TypeStoreKeyShort]?: never }) | |
| | ({ [key in TypeStoreKeyLong]?: never } & | |
| { [key in TypeStoreKeyShort]?: any }); | |
| type GetType< | |
| Store extends TypeStore, | |
| LongKey extends TypeStoreKeyLong, | |
| ShortKey extends TypeStoreKeyShort | |
| > = LongKey extends keyof Store | |
| ? Store[LongKey] | |
| : ShortKey extends keyof Store | |
| ? Store[ShortKey] | |
| : any; | |
| export interface HookCollection< | |
| HooksType extends Record<string, TypeStore> = Record< | |
| string, | |
| { Options: any; Result: any; Error: any } | |
| >, | |
| HookName extends keyof HooksType = keyof HooksType | |
| > { | |
| /** | |
| * Invoke before and after hooks | |
| */ | |
| <Name extends HookName>( | |
| name: Name | Name[], | |
| hookMethod: HookMethod< | |
| GetType<HooksType[Name], "Options", "O">, | |
| GetType<HooksType[Name], "Result", "R"> | |
| >, | |
| options?: GetType<HooksType[Name], "Options", "O"> | |
| ): Promise<GetType<HooksType[Name], "Result", "R">>; | |
| /** | |
| * Add `before` hook for given `name` | |
| */ | |
| before<Name extends HookName>( | |
| name: Name, | |
| beforeHook: BeforeHook<GetType<HooksType[Name], "Options", "O">> | |
| ): void; | |
| /** | |
| * Add `error` hook for given `name` | |
| */ | |
| error<Name extends HookName>( | |
| name: Name, | |
| errorHook: ErrorHook< | |
| GetType<HooksType[Name], "Options", "O">, | |
| GetType<HooksType[Name], "Error", "E"> | |
| > | |
| ): void; | |
| /** | |
| * Add `after` hook for given `name` | |
| */ | |
| after<Name extends HookName>( | |
| name: Name, | |
| afterHook: AfterHook< | |
| GetType<HooksType[Name], "Options", "O">, | |
| GetType<HooksType[Name], "Result", "R"> | |
| > | |
| ): void; | |
| /** | |
| * Add `wrap` hook for given `name` | |
| */ | |
| wrap<Name extends HookName>( | |
| name: Name, | |
| wrapHook: WrapHook< | |
| GetType<HooksType[Name], "Options", "O">, | |
| GetType<HooksType[Name], "Result", "R"> | |
| > | |
| ): void; | |
| /** | |
| * Remove added hook for given `name` | |
| */ | |
| remove<Name extends HookName>( | |
| name: Name, | |
| hook: AnyHook< | |
| GetType<HooksType[Name], "Options", "O">, | |
| GetType<HooksType[Name], "Result", "R">, | |
| GetType<HooksType[Name], "Error", "E"> | |
| > | |
| ): void; | |
| /** | |
| * Public API | |
| */ | |
| api: Pick< | |
| HookCollection<HooksType>, | |
| "before" | "error" | "after" | "wrap" | "remove" | |
| >; | |
| } | |
| export interface HookSingular<Options, Result, Error> { | |
| /** | |
| * Invoke before and after hooks | |
| */ | |
| (hookMethod: HookMethod<Options, Result>, options?: Options): Promise<Result>; | |
| /** | |
| * Add `before` hook | |
| */ | |
| before(beforeHook: BeforeHook<Options>): void; | |
| /** | |
| * Add `error` hook | |
| */ | |
| error(errorHook: ErrorHook<Options, Error>): void; | |
| /** | |
| * Add `after` hook | |
| */ | |
| after(afterHook: AfterHook<Options, Result>): void; | |
| /** | |
| * Add `wrap` hook | |
| */ | |
| wrap(wrapHook: WrapHook<Options, Result>): void; | |
| /** | |
| * Remove added hook | |
| */ | |
| remove(hook: AnyHook<Options, Result, Error>): void; | |
| /** | |
| * Public API | |
| */ | |
| api: Pick< | |
| HookSingular<Options, Result, Error>, | |
| "before" | "error" | "after" | "wrap" | "remove" | |
| >; | |
| } | |
| type Collection = new < | |
| HooksType extends Record<string, TypeStore> = Record< | |
| string, | |
| { Options: any; Result: any; Error: any } | |
| > | |
| >() => HookCollection<HooksType>; | |
| type Singular = new < | |
| Options = any, | |
| Result = any, | |
| Error = any | |
| >() => HookSingular<Options, Result, Error>; | |
| interface Hook { | |
| new < | |
| HooksType extends Record<string, TypeStore> = Record< | |
| string, | |
| { Options: any; Result: any; Error: any } | |
| > | |
| >(): HookCollection<HooksType>; | |
| /** | |
| * 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; | |