UNPKG

eslint-config-lemon

Version:

<div align="center"> <br> <img width="400" src="logo.svg"> <br> <br> </div>

187 lines (175 loc) 4.5 kB
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