import type { EventEmitter } from "../classes/EventEmitter"; import type { EventMap, Listener, ListenerOptions, Register, Unregister, } from "../types"; /** * Listens for `event` on `target`, calling `listener(event)` at each incoming `event`. The provided `options` are identical to those provided to `addEventListener`. * Returns a function that removes the `listener` from the `target` for the specified `event`. * * @param target The target on which to listen for the event. * @param event The event name to listen for. * @param listener The listener callback. * @param options Options to pass to the listener. * @returns A function that removes the `listener`. */ function on( target: HTMLElement, eventName: K, listener: Listener, options?: ListenerOptions, ): Unregister; function on( target: Document, eventName: K, listener: Listener, options?: ListenerOptions, ): Unregister; function on( target: MediaQueryList, eventName: K, listener: Listener, options?: ListenerOptions, ): Unregister; function on( target: MediaRecorder, eventName: K, listener: Listener, options?: ListenerOptions, ): Unregister; function on( target: Worker, eventName: K, listener: Listener, options?: ListenerOptions, ): Unregister; function on( target: EventEmitter, eventName: K, listener: Listener, ): Unregister; function on( target: EventTarget, eventName: string, listener: Listener, options?: ListenerOptions, ): Unregister; /** * Returns a function that registers a `listener` with optional `options` for a given `event` on the provided `target`. * * @example * ```typescript * const register = on(element, "click"); * // Start listening * const off = register(callback); * // Stop listening * off(); * ``` * * @param target The target on which to listen for the event. * @param event The event name to listen for. * @returns Function that registers a `listener` with optional `options`. */ function on( target: HTMLElement, eventName: K, ): Register, ListenerOptions>; function on( target: Document, eventName: K, ): Register, ListenerOptions>; function on( target: MediaQueryList, eventName: K, ): Register, ListenerOptions>; function on( target: MediaRecorder, eventName: K, ): Register, ListenerOptions>; function on( target: Worker, eventName: K, ): Register, ListenerOptions>; function on( target: EventEmitter, eventName: K, ): Register, never>; function on( target: EventTarget, eventName: string | number | symbol, ): Register, ListenerOptions>; function on( target: any, eventName: string | number | symbol, listener?: Listener, options?: any, ): Unregister | Register, any> { if (listener === undefined) { return ((listener: any, options: any) => on(target, eventName as any, listener, options)) as Register< Listener, any >; } target.addEventListener(eventName, listener, options); return () => { target.removeEventListener(eventName, listener, options); }; } export { on };