|
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 |
|
> { |
|
|
|
|
|
|
|
<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">>; |
|
|
|
|
|
|
|
before<Name extends HookName>( |
|
name: Name, |
|
beforeHook: BeforeHook<GetType<HooksType[Name], "Options", "O">> |
|
): void; |
|
|
|
|
|
|
|
error<Name extends HookName>( |
|
name: Name, |
|
errorHook: ErrorHook< |
|
GetType<HooksType[Name], "Options", "O">, |
|
GetType<HooksType[Name], "Error", "E"> |
|
> |
|
): void; |
|
|
|
|
|
|
|
after<Name extends HookName>( |
|
name: Name, |
|
afterHook: AfterHook< |
|
GetType<HooksType[Name], "Options", "O">, |
|
GetType<HooksType[Name], "Result", "R"> |
|
> |
|
): void; |
|
|
|
|
|
|
|
wrap<Name extends HookName>( |
|
name: Name, |
|
wrapHook: WrapHook< |
|
GetType<HooksType[Name], "Options", "O">, |
|
GetType<HooksType[Name], "Result", "R"> |
|
> |
|
): void; |
|
|
|
|
|
|
|
remove<Name extends HookName>( |
|
name: Name, |
|
hook: AnyHook< |
|
GetType<HooksType[Name], "Options", "O">, |
|
GetType<HooksType[Name], "Result", "R">, |
|
GetType<HooksType[Name], "Error", "E"> |
|
> |
|
): void; |
|
|
|
|
|
|
|
api: Pick< |
|
HookCollection<HooksType>, |
|
"before" | "error" | "after" | "wrap" | "remove" |
|
>; |
|
} |
|
|
|
export interface HookSingular<Options, Result, Error> { |
|
|
|
|
|
|
|
(hookMethod: HookMethod<Options, Result>, options?: Options): Promise<Result>; |
|
|
|
|
|
|
|
before(beforeHook: BeforeHook<Options>): void; |
|
|
|
|
|
|
|
error(errorHook: ErrorHook<Options, Error>): void; |
|
|
|
|
|
|
|
after(afterHook: AfterHook<Options, Result>): void; |
|
|
|
|
|
|
|
wrap(wrapHook: WrapHook<Options, Result>): void; |
|
|
|
|
|
|
|
remove(hook: AnyHook<Options, Result, Error>): void; |
|
|
|
|
|
|
|
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>; |
|
|
|
|
|
|
|
|
|
Collection: Collection; |
|
|
|
|
|
|
|
|
|
Singular: Singular; |
|
} |
|
|
|
export const Hook: Hook; |
|
export const Collection: Collection; |
|
export const Singular: Singular; |
|
|
|
export default Hook; |
|
|