123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- 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
- ) => void | Promise<void>
- 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
|