| 1 | type FixedSizeArray<T extends number, U> = T extends 0
|
|---|
| 2 | ? void[]
|
|---|
| 3 | : ReadonlyArray<U> & {
|
|---|
| 4 | 0: U;
|
|---|
| 5 | length: T;
|
|---|
| 6 | };
|
|---|
| 7 | type Measure<T extends number> = T extends 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
|
|---|
| 8 | ? T
|
|---|
| 9 | : never;
|
|---|
| 10 | type Append<T extends any[], U> = {
|
|---|
| 11 | 0: [U];
|
|---|
| 12 | 1: [T[0], U];
|
|---|
| 13 | 2: [T[0], T[1], U];
|
|---|
| 14 | 3: [T[0], T[1], T[2], U];
|
|---|
| 15 | 4: [T[0], T[1], T[2], T[3], U];
|
|---|
| 16 | 5: [T[0], T[1], T[2], T[3], T[4], U];
|
|---|
| 17 | 6: [T[0], T[1], T[2], T[3], T[4], T[5], U];
|
|---|
| 18 | 7: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], U];
|
|---|
| 19 | 8: [T[0], T[1], T[2], T[3], T[4], T[5], T[6], T[7], U];
|
|---|
| 20 | }[Measure<T["length"]>];
|
|---|
| 21 | type AsArray<T> = T extends any[] ? T : [T];
|
|---|
| 22 |
|
|---|
| 23 | declare class UnsetAdditionalOptions {
|
|---|
| 24 | _UnsetAdditionalOptions: true;
|
|---|
| 25 | }
|
|---|
| 26 | type IfSet<X> = X extends UnsetAdditionalOptions ? {} : X;
|
|---|
| 27 |
|
|---|
| 28 | type Callback<E, T> = (error: E | null, result?: T) => void;
|
|---|
| 29 | type InnerCallback<E, T> = (error?: E | null | false, result?: T) => void;
|
|---|
| 30 |
|
|---|
| 31 | type FullTap = Tap & {
|
|---|
| 32 | type: "sync" | "async" | "promise";
|
|---|
| 33 | fn: Function;
|
|---|
| 34 | };
|
|---|
| 35 |
|
|---|
| 36 | type Tap = TapOptions & {
|
|---|
| 37 | name: string;
|
|---|
| 38 | };
|
|---|
| 39 |
|
|---|
| 40 | type TapOptions = {
|
|---|
| 41 | before?: string;
|
|---|
| 42 | stage?: number;
|
|---|
| 43 | };
|
|---|
| 44 |
|
|---|
| 45 | interface HookInterceptor<T, R, AdditionalOptions = UnsetAdditionalOptions> {
|
|---|
| 46 | name?: string;
|
|---|
| 47 | tap?: (tap: FullTap & IfSet<AdditionalOptions>) => void;
|
|---|
| 48 | call?: (...args: any[]) => void;
|
|---|
| 49 | loop?: (...args: any[]) => void;
|
|---|
| 50 | error?: (err: Error) => void;
|
|---|
| 51 | result?: (result: R) => void;
|
|---|
| 52 | done?: () => void;
|
|---|
| 53 | register?: (
|
|---|
| 54 | tap: FullTap & IfSet<AdditionalOptions>
|
|---|
| 55 | ) => FullTap & IfSet<AdditionalOptions>;
|
|---|
| 56 | }
|
|---|
| 57 |
|
|---|
| 58 | type ArgumentNames<T extends any[]> = FixedSizeArray<T["length"], string>;
|
|---|
| 59 |
|
|---|
| 60 | declare class Hook<T, R, AdditionalOptions = UnsetAdditionalOptions> {
|
|---|
| 61 | constructor(args?: ArgumentNames<AsArray<T>>, name?: string);
|
|---|
| 62 | name: string | undefined;
|
|---|
| 63 | interceptors: HookInterceptor<T, R, AdditionalOptions>[];
|
|---|
| 64 | taps: FullTap[];
|
|---|
| 65 | intercept(interceptor: HookInterceptor<T, R, AdditionalOptions>): void;
|
|---|
| 66 | isUsed(): boolean;
|
|---|
| 67 | callAsync(...args: Append<AsArray<T>, Callback<Error, R>>): void;
|
|---|
| 68 | promise(...args: AsArray<T>): Promise<R>;
|
|---|
| 69 | tap(
|
|---|
| 70 | options: string | (Tap & IfSet<AdditionalOptions>),
|
|---|
| 71 | fn: (...args: AsArray<T>) => R
|
|---|
| 72 | ): void;
|
|---|
| 73 | withOptions(
|
|---|
| 74 | options: TapOptions & IfSet<AdditionalOptions>
|
|---|
| 75 | ): Omit<this, "call" | "callAsync" | "promise">;
|
|---|
| 76 | }
|
|---|
| 77 |
|
|---|
| 78 | export class SyncHook<
|
|---|
| 79 | T,
|
|---|
| 80 | R = void,
|
|---|
| 81 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 82 | > extends Hook<T, R, AdditionalOptions> {
|
|---|
| 83 | call(...args: AsArray<T>): R;
|
|---|
| 84 | }
|
|---|
| 85 |
|
|---|
| 86 | export class SyncBailHook<
|
|---|
| 87 | T,
|
|---|
| 88 | R,
|
|---|
| 89 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 90 | > extends SyncHook<T, R, AdditionalOptions> {}
|
|---|
| 91 | export class SyncLoopHook<
|
|---|
| 92 | T,
|
|---|
| 93 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 94 | > extends SyncHook<T, void, AdditionalOptions> {}
|
|---|
| 95 | export class SyncWaterfallHook<
|
|---|
| 96 | T,
|
|---|
| 97 | R = AsArray<T>[0],
|
|---|
| 98 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 99 | > extends SyncHook<T, R, AdditionalOptions> {}
|
|---|
| 100 |
|
|---|
| 101 | declare class AsyncHook<
|
|---|
| 102 | T,
|
|---|
| 103 | R,
|
|---|
| 104 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 105 | > extends Hook<T, R, AdditionalOptions> {
|
|---|
| 106 | tapAsync(
|
|---|
| 107 | options: string | (Tap & IfSet<AdditionalOptions>),
|
|---|
| 108 | fn: (...args: Append<AsArray<T>, InnerCallback<Error, R>>) => void
|
|---|
| 109 | ): void;
|
|---|
| 110 | tapPromise(
|
|---|
| 111 | options: string | (Tap & IfSet<AdditionalOptions>),
|
|---|
| 112 | fn: (...args: AsArray<T>) => Promise<R>
|
|---|
| 113 | ): void;
|
|---|
| 114 | }
|
|---|
| 115 |
|
|---|
| 116 | export class AsyncParallelHook<
|
|---|
| 117 | T,
|
|---|
| 118 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 119 | > extends AsyncHook<T, void, AdditionalOptions> {}
|
|---|
| 120 | export class AsyncParallelBailHook<
|
|---|
| 121 | T,
|
|---|
| 122 | R,
|
|---|
| 123 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 124 | > extends AsyncHook<T, R, AdditionalOptions> {}
|
|---|
| 125 | export class AsyncSeriesHook<
|
|---|
| 126 | T,
|
|---|
| 127 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 128 | > extends AsyncHook<T, void, AdditionalOptions> {}
|
|---|
| 129 | export class AsyncSeriesBailHook<
|
|---|
| 130 | T,
|
|---|
| 131 | R,
|
|---|
| 132 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 133 | > extends AsyncHook<T, R, AdditionalOptions> {}
|
|---|
| 134 | export class AsyncSeriesLoopHook<
|
|---|
| 135 | T,
|
|---|
| 136 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 137 | > extends AsyncHook<T, void, AdditionalOptions> {}
|
|---|
| 138 | export class AsyncSeriesWaterfallHook<
|
|---|
| 139 | T,
|
|---|
| 140 | R = AsArray<T>[0],
|
|---|
| 141 | AdditionalOptions = UnsetAdditionalOptions
|
|---|
| 142 | > extends AsyncHook<T, R, AdditionalOptions> {}
|
|---|
| 143 |
|
|---|
| 144 | type HookFactory<H, K = any> = (key: K) => H;
|
|---|
| 145 |
|
|---|
| 146 | interface HookMapInterceptor<H, K = any> {
|
|---|
| 147 | factory?: (key: K, hook: H) => H;
|
|---|
| 148 | }
|
|---|
| 149 |
|
|---|
| 150 | export class HookMap<H> {
|
|---|
| 151 | constructor(factory: HookFactory<H>, name?: string);
|
|---|
| 152 | name: string | undefined;
|
|---|
| 153 | get(key: any): H | undefined;
|
|---|
| 154 | for(key: any): H;
|
|---|
| 155 | intercept(interceptor: HookMapInterceptor<H>): void;
|
|---|
| 156 | }
|
|---|
| 157 |
|
|---|
| 158 | type AnyHook = Hook<any, any>;
|
|---|
| 159 |
|
|---|
| 160 | export class TypedHookMap<M extends Record<any, AnyHook>> {
|
|---|
| 161 | constructor(factory: HookFactory<M[keyof M], keyof M>, name?: string);
|
|---|
| 162 | name: string | undefined;
|
|---|
| 163 | get<K extends keyof M>(key: K): M[K] | undefined;
|
|---|
| 164 | for<K extends keyof M>(key: K): M[K];
|
|---|
| 165 | intercept(interceptor: HookMapInterceptor<M[keyof M], keyof M>): void;
|
|---|
| 166 | }
|
|---|
| 167 |
|
|---|
| 168 | export class MultiHook<H> {
|
|---|
| 169 | constructor(hooks: H[], name?: string);
|
|---|
| 170 | name: string | undefined;
|
|---|
| 171 | tap(options: string | Tap, fn?: Function): void;
|
|---|
| 172 | tapAsync(options: string | Tap, fn?: Function): void;
|
|---|
| 173 | tapPromise(options: string | Tap, fn?: Function): void;
|
|---|
| 174 | }
|
|---|