type FixedSizeArray = T extends 0 ? undefined[] : ReadonlyArray & { 0: U; length: T; }; type Measure = T extends 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ? T : never; type Append = { 0: [U]; 1: [T[0], U]; 2: [T[0], T[1], U]; 3: [T[0], T[1], T[2], U]; 4: [T[0], T[1], T[2], T[3], U]; 5: [T[0], T[1], T[2], T[3], T[4], U]; 6: [T[0], T[1], T[2], T[3], T[4], T[5], U]; 7: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], U]; 8: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], T[7], U]; }[Measure]; export type AsArray = T extends any[] ? T : [T]; export type Fn = (...args: AsArray) => R; export type FnAsync = (...args: Append, InnerCallback>) => void; export type FnPromise = (...args: AsArray) => Promise; declare class UnsetAdditionalOptions { _UnsetAdditionalOptions: true; } type IfSet = X extends UnsetAdditionalOptions ? {} : X; export type Callback = (error: E | null, result?: T) => void; type InnerCallback = (error?: E | null | false, result?: T) => void; type FullTap = Tap & { type: 'sync' | 'async' | 'promise'; fn: Function; }; type Tap = TapOptions & { name: string; }; type TapOptions = { before?: string; stage?: number; }; export type Options = string | (Tap & IfSet); export interface HookInterceptor { name?: string; tap?: (tap: FullTap & IfSet) => void; call?: (...args: any[]) => void; loop?: (...args: any[]) => void; error?: (err: Error) => void; result?: (result: R) => void; done?: () => void; register?: (tap: FullTap & IfSet) => FullTap & IfSet; } type ArgumentNames = FixedSizeArray; type ExtractHookArgs = H extends Hook ? T : never; type ExtractHookReturn = H extends Hook ? R : never; type ExtractHookAdditionalOptions = H extends Hook ? A : never; export interface Hook { name?: string; tap(opt: Options, fn: Fn): void; tapAsync(opt: Options, fn: FnAsync): void; tapPromise(opt: Options, fn: FnPromise): void; intercept(interceptor: HookInterceptor): void; isUsed(): boolean; withOptions(opt: TapOptions & IfSet): Hook; queryStageRange(stageRange: StageRange): QueriedHook; } export declare class HookBase implements Hook { args: ArgumentNames>; name?: string; taps: (FullTap & IfSet)[]; interceptors: HookInterceptor[]; constructor(args?: ArgumentNames>, name?: string); intercept(interceptor: HookInterceptor): void; _runRegisterInterceptors(options: FullTap & IfSet): FullTap & IfSet; _runCallInterceptors(...args: any[]): void; _runErrorInterceptors(e: Error): void; _runTapInterceptors(tap: FullTap & IfSet): void; _runDoneInterceptors(): void; _runResultInterceptors(r: R): void; withOptions(options: TapOptions & IfSet): Hook; isUsed(): boolean; queryStageRange(stageRange: StageRange): QueriedHook; callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; callAsync(...args: Append, Callback>): void; promiseStageRange(queried: QueriedHook, ...args: AsArray): Promise; promise(...args: AsArray): Promise; tap(options: Options, fn: Fn): void; tapAsync(options: Options, fn: FnAsync): void; tapPromise(options: Options, fn: FnPromise): void; _tap(type: 'sync' | 'async' | 'promise', options: Options, fn: Function): void; _insert(item: FullTap & IfSet): void; _prepareArgs(args: AsArray): (T | undefined)[]; } export type StageRange = readonly [number, number]; export declare const minStage: number; export declare const maxStage: number; export declare const safeStage: (stage: number) => number; export declare class QueriedHook { stageRange: StageRange; hook: HookBase; tapsInRange: (FullTap & IfSet)[]; constructor(stageRange: StageRange, hook: HookBase); isUsed(): boolean; call(...args: AsArray): R; callAsync(...args: Append, Callback>): void; promise(...args: AsArray): Promise; } export declare class SyncHook extends HookBase { callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; call(...args: AsArray): R; callStageRange(queried: QueriedHook, ...args: AsArray): R; tapAsync(): never; tapPromise(): never; } export declare class SyncBailHook extends HookBase { callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; call(...args: AsArray): R; callStageRange(queried: QueriedHook, ...args: AsArray): R; tapAsync(): never; tapPromise(): never; } export declare class SyncWaterfallHook extends HookBase[0], AdditionalOptions> { constructor(args?: ArgumentNames>, name?: string); callAsyncStageRange(queried: QueriedHook[0], AdditionalOptions>, ...args: Append, Callback[0]>>): void; call(...args: AsArray): AsArray[0]; callStageRange(queried: QueriedHook[0], AdditionalOptions>, ...args: AsArray): AsArray[0]; tapAsync(): never; tapPromise(): never; } export declare class AsyncParallelHook extends HookBase { callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; } export declare class AsyncSeriesHook extends HookBase { callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; } export declare class AsyncSeriesBailHook extends HookBase { callAsyncStageRange(queried: QueriedHook, ...args: Append, Callback>): void; } export declare class AsyncSeriesWaterfallHook extends HookBase[0], AdditionalOptions> { constructor(args?: ArgumentNames>, name?: string); callAsyncStageRange(queried: QueriedHook[0], AdditionalOptions>, ...args: Append, Callback[0]>>): void; } export type HookMapKey = any; export type HookFactory = (key: HookMapKey, hook?: H) => H; export interface HookMapInterceptor { factory?: HookFactory; } export declare class HookMap { _map: Map; _factory: HookFactory; name?: string; _interceptors: HookMapInterceptor[]; constructor(factory: HookFactory, name?: string); get(key: HookMapKey): H | undefined; for(key: HookMapKey): H; intercept(interceptor: HookMapInterceptor): void; isUsed(): boolean; queryStageRange(stageRange: StageRange): QueriedHookMap; } export declare class QueriedHookMap { stageRange: StageRange; hookMap: HookMap; constructor(stageRange: StageRange, hookMap: HookMap); get(key: HookMapKey): QueriedHook | undefined; for(key: HookMapKey): QueriedHook; isUsed(): boolean; } export declare class MultiHook { hooks: H[]; name?: string; constructor(hooks: H[], name?: string); tap(options: Options>, fn: Fn, ExtractHookReturn>): void; tapAsync(options: Options>, fn: FnAsync, ExtractHookReturn>): void; tapPromise(options: Options>, fn: FnPromise, ExtractHookReturn>): void; isUsed(): boolean; intercept(interceptor: HookInterceptor, ExtractHookReturn, ExtractHookAdditionalOptions>): void; withOptions(options: TapOptions & IfSet>): MultiHook>; } export {};