declare type HookCallback = (...args: any) => Promise | void; interface Hooks { [key: string]: HookCallback; } declare type HookKeys = keyof T & string; declare type DeprecatedHook = string | { message?: string; to: HookKeys; }; declare type DeprecatedHooks = { [name in HookKeys]: DeprecatedHook; }; declare type ValueOf = C extends Record ? C[keyof C] : never; declare type Strings = Exclude; declare type KnownKeys = keyof { [K in keyof T as string extends K ? never : number extends K ? never : K]: never; }; declare type StripGeneric = Pick extends keyof T ? KnownKeys : never>; declare type OnlyGeneric = Omit extends keyof T ? KnownKeys : never>; declare type Namespaces = ValueOf<{ [key in Strings]: key extends `${infer Namespace}:${string}` ? Namespace : never; }>; declare type BareHooks = ValueOf<{ [key in Strings]: key extends `${string}:${string}` ? never : key; }>; declare type HooksInNamespace = ValueOf<{ [key in Strings]: key extends `${Namespace}:${infer HookName}` ? HookName : never; }>; declare type WithoutNamespace = { [key in HooksInNamespace]: `${Namespace}:${key}` extends keyof T ? T[`${Namespace}:${key}`] : never; }; declare type NestedHooks = (Partial> | Partial>) & Partial<{ [key in Namespaces>]: NestedHooks>; }> & Partial<{ [key in BareHooks>]: T[key]; }>; declare type InferCallback = HT[HN] extends HookCallback ? HT[HN] : never; declare class Hookable, HookNameT extends HookKeys = HookKeys> { private _hooks; private _deprecatedHooks; constructor(); hook(name: NameT, fn: InferCallback): () => void; hookOnce(name: NameT, fn: InferCallback): () => void; removeHook(name: NameT, fn: InferCallback): void; deprecateHook(name: NameT, deprecated: DeprecatedHook): void; deprecateHooks(deprecatedHooks: Record>): void; addHooks(configHooks: NestedHooks): () => void; removeHooks(configHooks: NestedHooks): void; callHook(name: NameT, ...args: Parameters>): Promise; callHookParallel(name: NameT, ...args: Parameters>): Promise; callHookWith>) => any>(caller: CallFunction, name: NameT, ...args: Parameters>): void | ReturnType; } declare function createHooks(): Hookable; declare function flatHooks(configHooks: NestedHooks, hooks?: T, parentName?: string): T; declare function mergeHooks(...hooks: NestedHooks[]): T; declare function serial(tasks: T[], fn: (task: T) => Promise | any): Promise; declare function serialCaller(hooks: HookCallback[], args?: any[]): Promise; declare function parallelCaller(hooks: HookCallback[], args?: any[]): Promise; export { DeprecatedHook, DeprecatedHooks, HookCallback, HookKeys, Hookable, Hooks, NestedHooks, createHooks, flatHooks, mergeHooks, parallelCaller, serial, serialCaller };