import type { HookHandler, HookHandlerBuilder } from './hooks.js'; import { hooksReworked } from './utils/deprecations.js'; // TODO: delete this in Sequelize v8 export interface LegacyRunHookFunction { ( hookName: HookName, ...args: HookConfig[HookName] extends (...args2: any) => any ? Parameters : never ): Return; } export function legacyBuildRunHook( // added for typing purposes _hookHandlerBuilder: HookHandlerBuilder, ): LegacyRunHookFunction { return async function runHooks( this: { hooks: HookHandler }, hookName: HookName, ...args: HookConfig[HookName] extends (...args2: any) => any ? Parameters : never ): Promise { hooksReworked(); return this.hooks.runAsync(hookName, ...args); }; } export interface LegacyAddAnyHookFunction { /** * Adds a hook listener */ (this: This, hookName: HookName, hook: HookConfig[HookName]): This; /** * Adds a hook listener * * @param listenerName Provide a name for the hook function. It can be used to remove the hook later. */ ( this: This, hookName: HookName, listenerName: string, hook: HookConfig[HookName] ): This; } export function legacyBuildAddAnyHook( // added for typing purposes _hookHandlerBuilder: HookHandlerBuilder, ): LegacyAddAnyHookFunction { return function addHook }, HookName extends keyof HookConfig>( this: This, hookName: HookName, listenerNameOrHook: HookConfig[HookName] | string, hook?: HookConfig[HookName], ): This { hooksReworked(); if (hook) { // @ts-expect-error -- TypeScript struggles with the multiple possible signatures of addListener this.hooks.addListener(hookName, hook, listenerNameOrHook); } else { // @ts-expect-error -- TypeScript struggles with the multiple possible signatures of addListener this.hooks.addListener(hookName, listenerNameOrHook); } return this; }; } export interface LegacyAddHookFunction { /** * Adds a hook listener */ (this: This, hook: Fn): This; /** * Adds a hook listener * * @param listenerName Provide a name for the hook function. It can be used to remove the hook later. */ (this: This, listenerName: string, hook: Fn): This; } export function legacyBuildAddHook( hookHandlerBuilder: HookHandlerBuilder, hookName: HookName, ): LegacyAddHookFunction { return function addHook }>( this: This, listenerNameOrHook: HookConfig[HookName] | string, hook?: HookConfig[HookName], ): This { hooksReworked(); if (hook) { // @ts-expect-error -- TypeScript struggles with the multiple possible signatures of addListener this.hooks.addListener(hookName, hook, listenerNameOrHook); } else { // @ts-expect-error -- TypeScript struggles with the multiple possible signatures of addListener this.hooks.addListener(hookName, listenerNameOrHook); } return this; }; } export function legacyBuildHasHook( // added for typing purposes _hookHandlerBuilder: HookHandlerBuilder, ) { return function hasHook( this: { hooks: HookHandler }, hookName: HookName, ): boolean { hooksReworked(); return this.hooks.hasListeners(hookName); }; } export function legacyBuildRemoveHook( // added for typing purposes _hookHandlerBuilder: HookHandlerBuilder, ) { return function removeHook( this: { hooks: HookHandler }, hookName: HookName, listenerNameOrListener: HookConfig[HookName] | string, ): void { hooksReworked(); return this.hooks.removeListener(hookName, listenerNameOrListener); }; }