import { Tail, Reverse } from "typescript-tuple"; type Fn = (...args: any) => any; type RemoveLast = Reverse>>; type Last = T[Exclude>]; type LastParameter any> = Last>; export interface BeforeSync { (...args: Parameters): void; bail: (returnValue: ReturnType) => void; } export interface BeforeAsync { (...args: RemoveLast>): void; bail: (...args: Parameters) => void; } export interface BeforeAsyncNoCallback { (...args: Parameters): void; } export interface AfterSync { (returnValue: ReturnType): void; bail: (returnValue: ReturnType) => void; } export interface AfterAsync { (...args: Parameters): void; bail: (...args: Parameters) => void; } export interface HookGetter { getHooks( matcher?: | { type: "before" | "after"; } | { hook: Fn; } ): Array & { remove(): void; }; removeAll(): void; } export type SyncHook = T & HookGetter & { before: ( hook: (next: BeforeSync, ...args: Parameters) => void, priority?: number ) => SyncHook; after: ( hook: (next: AfterSync, returnValue: ReturnType) => void, priority?: number ) => SyncHook; }; export type AsyncHook = LastParameter extends Fn ? AsyncHookCallback> : AsyncHookNoCallback; export type AsyncHookCallback = T & HookGetter & { before: ( hook: ( next: BeforeAsync, ...args: RemoveLast> ) => void, priority?: number ) => AsyncHookCallback; after: ( hook: (next: AfterAsync, ...args: Parameters) => void, priority?: number ) => SyncHook; }; export type AsyncHookNoCallback = T & HookGetter & { before: ( hook: (next: BeforeAsyncNoCallback, ...args: Parameters) => void, priority?: number ) => AsyncHookNoCallback; }; export interface CreateHook { (fn: T): SyncHook; (type: "sync", fn: T, name?: string): SyncHook; (type: "async", fn: T, name?: string): AsyncHook; ( obj: T, props: string[], name?: string ): Hooks; get(name: string): T; } export interface HooksFactory { (config?: { ready?: number }): CreateHook; SYNC: 1; ASYNC: 2; QUEUE: 4; } declare const funHooks: HooksFactory; export default funHooks;