tapable.d.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. declare class UnsetAdditionalOptions {
  23. _UnsetAdditionalOptions: true;
  24. }
  25. type IfSet<X> = X extends UnsetAdditionalOptions ? {} : X;
  26. type Callback<E, T> = (error: E | null, result?: T) => void;
  27. type InnerCallback<E, T> = (error?: E | null | false, result?: T) => void;
  28. type FullTap = Tap & {
  29. type: "sync" | "async" | "promise";
  30. fn: Function;
  31. };
  32. type Tap = TapOptions & {
  33. name: string;
  34. };
  35. type TapOptions = {
  36. before?: string;
  37. stage?: number;
  38. };
  39. interface HookInterceptor<T, R, AdditionalOptions = UnsetAdditionalOptions> {
  40. name?: string;
  41. tap?: (tap: FullTap & IfSet<AdditionalOptions>) => void;
  42. call?: (...args: any[]) => void;
  43. loop?: (...args: any[]) => void;
  44. error?: (err: Error) => void;
  45. result?: (result: R) => void;
  46. done?: () => void;
  47. register?: (
  48. tap: FullTap & IfSet<AdditionalOptions>
  49. ) => FullTap & IfSet<AdditionalOptions>;
  50. }
  51. type ArgumentNames<T extends any[]> = FixedSizeArray<T["length"], string>;
  52. declare class Hook<T, R, AdditionalOptions = UnsetAdditionalOptions> {
  53. constructor(args?: ArgumentNames<AsArray<T>>, name?: string);
  54. name: string | undefined;
  55. interceptors: HookInterceptor<T, R, AdditionalOptions>[];
  56. taps: FullTap[];
  57. intercept(interceptor: HookInterceptor<T, R, AdditionalOptions>): void;
  58. isUsed(): boolean;
  59. callAsync(...args: Append<AsArray<T>, Callback<Error, R>>): void;
  60. promise(...args: AsArray<T>): Promise<R>;
  61. tap(
  62. options: string | (Tap & IfSet<AdditionalOptions>),
  63. fn: (...args: AsArray<T>) => R
  64. ): void;
  65. withOptions(
  66. options: TapOptions & IfSet<AdditionalOptions>
  67. ): Omit<this, "call" | "callAsync" | "promise">;
  68. }
  69. export class SyncHook<
  70. T,
  71. R = void,
  72. AdditionalOptions = UnsetAdditionalOptions
  73. > extends Hook<T, R, AdditionalOptions> {
  74. call(...args: AsArray<T>): R;
  75. }
  76. export class SyncBailHook<
  77. T,
  78. R,
  79. AdditionalOptions = UnsetAdditionalOptions
  80. > extends SyncHook<T, R, AdditionalOptions> {}
  81. export class SyncLoopHook<
  82. T,
  83. AdditionalOptions = UnsetAdditionalOptions
  84. > extends SyncHook<T, void, AdditionalOptions> {}
  85. export class SyncWaterfallHook<
  86. T,
  87. R = AsArray<T>[0],
  88. AdditionalOptions = UnsetAdditionalOptions
  89. > extends SyncHook<T, R, AdditionalOptions> {}
  90. declare class AsyncHook<
  91. T,
  92. R,
  93. AdditionalOptions = UnsetAdditionalOptions
  94. > extends Hook<T, R, AdditionalOptions> {
  95. tapAsync(
  96. options: string | (Tap & IfSet<AdditionalOptions>),
  97. fn: (...args: Append<AsArray<T>, InnerCallback<Error, R>>) => void
  98. ): void;
  99. tapPromise(
  100. options: string | (Tap & IfSet<AdditionalOptions>),
  101. fn: (...args: AsArray<T>) => Promise<R>
  102. ): void;
  103. }
  104. export class AsyncParallelHook<
  105. T,
  106. AdditionalOptions = UnsetAdditionalOptions
  107. > extends AsyncHook<T, void, AdditionalOptions> {}
  108. export class AsyncParallelBailHook<
  109. T,
  110. R,
  111. AdditionalOptions = UnsetAdditionalOptions
  112. > extends AsyncHook<T, R, AdditionalOptions> {}
  113. export class AsyncSeriesHook<
  114. T,
  115. AdditionalOptions = UnsetAdditionalOptions
  116. > extends AsyncHook<T, void, AdditionalOptions> {}
  117. export class AsyncSeriesBailHook<
  118. T,
  119. R,
  120. AdditionalOptions = UnsetAdditionalOptions
  121. > extends AsyncHook<T, R, AdditionalOptions> {}
  122. export class AsyncSeriesLoopHook<
  123. T,
  124. AdditionalOptions = UnsetAdditionalOptions
  125. > extends AsyncHook<T, void, AdditionalOptions> {}
  126. export class AsyncSeriesWaterfallHook<
  127. T,
  128. R = AsArray<T>[0],
  129. AdditionalOptions = UnsetAdditionalOptions
  130. > extends AsyncHook<T, R, AdditionalOptions> {}
  131. type HookFactory<H> = (key: any, hook?: H) => H;
  132. interface HookMapInterceptor<H> {
  133. factory?: HookFactory<H>;
  134. }
  135. export class HookMap<H> {
  136. constructor(factory: HookFactory<H>, name?: string);
  137. name: string | undefined;
  138. get(key: any): H | undefined;
  139. for(key: any): H;
  140. intercept(interceptor: HookMapInterceptor<H>): void;
  141. }
  142. export class MultiHook<H> {
  143. constructor(hooks: H[], name?: string);
  144. name: string | undefined;
  145. tap(options: string | Tap, fn?: Function): void;
  146. tapAsync(options: string | Tap, fn?: Function): void;
  147. tapPromise(options: string | Tap, fn?: Function): void;
  148. }