index.d.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. type HookCallback = (...arguments_: any) => Promise<void> | void;
  2. interface Hooks {
  3. [key: string]: HookCallback;
  4. }
  5. type HookKeys<T> = keyof T & string;
  6. type DeprecatedHook<T> = {
  7. message?: string;
  8. to: HookKeys<T>;
  9. };
  10. type DeprecatedHooks<T> = {
  11. [name in HookKeys<T>]: DeprecatedHook<T>;
  12. };
  13. type ValueOf<C> = C extends Record<any, any> ? C[keyof C] : never;
  14. type Strings<T> = Exclude<keyof T, number | symbol>;
  15. type KnownKeys<T> = keyof {
  16. [K in keyof T as string extends K ? never : number extends K ? never : K]: never;
  17. };
  18. type StripGeneric<T> = Pick<T, KnownKeys<T> extends keyof T ? KnownKeys<T> : never>;
  19. type OnlyGeneric<T> = Omit<T, KnownKeys<T> extends keyof T ? KnownKeys<T> : never>;
  20. type Namespaces<T> = ValueOf<{
  21. [key in Strings<T>]: key extends `${infer Namespace}:${string}` ? Namespace : never;
  22. }>;
  23. type BareHooks<T> = ValueOf<{
  24. [key in Strings<T>]: key extends `${string}:${string}` ? never : key;
  25. }>;
  26. type HooksInNamespace<T, Namespace extends string> = ValueOf<{
  27. [key in Strings<T>]: key extends `${Namespace}:${infer HookName}` ? HookName : never;
  28. }>;
  29. type WithoutNamespace<T, Namespace extends string> = {
  30. [key in HooksInNamespace<T, Namespace>]: `${Namespace}:${key}` extends keyof T ? T[`${Namespace}:${key}`] : never;
  31. };
  32. type NestedHooks<T> = (Partial<StripGeneric<T>> | Partial<OnlyGeneric<T>>) & Partial<{
  33. [key in Namespaces<StripGeneric<T>>]: NestedHooks<WithoutNamespace<T, key>>;
  34. }> & Partial<{
  35. [key in BareHooks<StripGeneric<T>>]: T[key];
  36. }>;
  37. type InferCallback<HT, HN extends keyof HT> = HT[HN] extends HookCallback ? HT[HN] : never;
  38. type InferSpyEvent<HT extends Record<string, any>> = {
  39. [key in keyof HT]: {
  40. name: key;
  41. args: Parameters<HT[key]>;
  42. context: Record<string, any>;
  43. };
  44. }[keyof HT];
  45. declare class Hookable<HooksT extends Record<string, any> = Record<string, HookCallback>, HookNameT extends HookKeys<HooksT> = HookKeys<HooksT>> {
  46. private _hooks;
  47. private _before?;
  48. private _after?;
  49. private _deprecatedHooks;
  50. private _deprecatedMessages?;
  51. constructor();
  52. hook<NameT extends HookNameT>(name: NameT, function_: InferCallback<HooksT, NameT>, options?: {
  53. allowDeprecated?: boolean;
  54. }): () => void;
  55. hookOnce<NameT extends HookNameT>(name: NameT, function_: InferCallback<HooksT, NameT>): () => void;
  56. removeHook<NameT extends HookNameT>(name: NameT, function_: InferCallback<HooksT, NameT>): void;
  57. deprecateHook<NameT extends HookNameT>(name: NameT, deprecated: HookKeys<HooksT> | DeprecatedHook<HooksT>): void;
  58. deprecateHooks(deprecatedHooks: Partial<Record<HookNameT, DeprecatedHook<HooksT>>>): void;
  59. addHooks(configHooks: NestedHooks<HooksT>): () => void;
  60. removeHooks(configHooks: NestedHooks<HooksT>): void;
  61. removeAllHooks(): void;
  62. callHook<NameT extends HookNameT>(name: NameT, ...arguments_: Parameters<InferCallback<HooksT, NameT>>): Promise<any>;
  63. callHookParallel<NameT extends HookNameT>(name: NameT, ...arguments_: Parameters<InferCallback<HooksT, NameT>>): Promise<any[]>;
  64. callHookWith<NameT extends HookNameT, CallFunction extends (hooks: HookCallback[], arguments_: Parameters<InferCallback<HooksT, NameT>>) => any>(caller: CallFunction, name: NameT, ...arguments_: Parameters<InferCallback<HooksT, NameT>>): ReturnType<CallFunction>;
  65. beforeEach(function_: (event: InferSpyEvent<HooksT>) => void): () => void;
  66. afterEach(function_: (event: InferSpyEvent<HooksT>) => void): () => void;
  67. }
  68. declare function createHooks<T extends Record<string, any>>(): Hookable<T>;
  69. declare function flatHooks<T>(configHooks: NestedHooks<T>, hooks?: T, parentName?: string): T;
  70. declare function mergeHooks<T>(...hooks: NestedHooks<T>[]): T;
  71. declare function serial<T>(tasks: T[], function_: (task: T) => Promise<any> | any): Promise<any>;
  72. /** @deprecated */
  73. declare function serialCaller(hooks: HookCallback[], arguments_?: any[]): Promise<void>;
  74. /** @deprecated */
  75. declare function parallelCaller(hooks: HookCallback[], args?: any[]): Promise<void[]>;
  76. interface CreateDebuggerOptions {
  77. /** An optional tag to prefix console logs with */
  78. tag?: string;
  79. /**
  80. * Show hook params to the console output
  81. *
  82. * Enabled for browsers by default
  83. */
  84. inspect?: boolean;
  85. /**
  86. * Use group/groupEnd wrapper around logs happening during a specific hook
  87. *
  88. * Enabled for browsers by default
  89. */
  90. group?: boolean;
  91. /** Filter which hooks to enable debugger for. Can be a string prefix or fn. */
  92. filter?: string | ((event: string) => boolean);
  93. }
  94. /** Start debugging hook names and timing in console */
  95. declare function createDebugger(hooks: Hookable<any>, _options?: CreateDebuggerOptions): {
  96. /** Stop debugging and remove listeners */
  97. close: () => void;
  98. };
  99. export { CreateDebuggerOptions, DeprecatedHook, DeprecatedHooks, HookCallback, HookKeys, Hookable, Hooks, NestedHooks, createDebugger, createHooks, flatHooks, mergeHooks, parallelCaller, serial, serialCaller };