/** * Extends a function arguments with extra ones. */ type FnWithExtraArgs any, TExtraArgs extends any[] = any[]> = (...args: [...args: Parameters, ...extraArgs: TExtraArgs]) => ReturnType; /** * Defines a hook handler. */ export type HookFn = (...args: TArgs) => Promise | TReturn; /** * Generic hook metadata. */ type HookMeta = Record; /** * Defines a hook, including its function handler and optional metadata. */ export type Hook = { fn: THookFn; meta?: THookMeta; }; /** * Represents a map of hook types to hook functions and metas. */ type Hooks = Record; /** * Builds hook meta arguments after hook meta requirements. */ type HookMetaArg | undefined> = THookMeta extends Record ? [meta: THookMeta] : [meta?: never]; /** * Defines the return type of the {@link HookSystem.callHook} functions. * * @internal */ export type CallHookReturnType = Promise<{ data: Awaited>[]; errors: HookError[]; }>; /** * Defines the return type of the {@link HookSystem.createScope} functions. * * @internal */ export type CreateScopeReturnType, TExtraArgs extends unknown[] = never[]> = { hook: (type: TType, hookFn: FnWithExtraArgs, ...[meta]: HookMetaArg) => void; unhook: HookSystem<{ [P in keyof THooks]: Omit & { fn: FnWithExtraArgs; }; }>["unhook"]; }; type RegisteredHookMeta = { id: string; type: string; owner: string; external?: HookFn; }; /** * Represents a registered hook. */ type RegisteredHook = { fn: THook["fn"]; meta: THook["meta"] extends Record ? RegisteredHookMeta & THook["meta"] : RegisteredHookMeta; }; export declare class HookError extends Error { type: string; owner: string; rawMeta: RegisteredHookMeta; rawCause: TError; constructor(meta: RegisteredHookMeta, cause: TError); } /** * @internal */ export declare class HookSystem { private _registeredHooks; hook(owner: string, type: TType, hookFn: THooks[TType]["fn"], ...[meta]: HookMetaArg): void; unhook(type: TType, hookFn: THooks[TType]["fn"]): void; callHook>(typeOrTypeAndHookID: TType | { type: TType; hookID: string; }, ...args: Parameters): CallHookReturnType; /** * Returns list of hooks for a given owner */ hooksForOwner(owner: string): RegisteredHook[]; /** * Returns list of hooks for a given type */ hooksForType(type: TType): RegisteredHook[]; createScope(owner: string, extraArgs: [...TExtraArgs]): CreateScopeReturnType; } export {};