import EventEmitter from "events"; type DefaultEventMap = [never]; type EventMap = Record | DefaultEventMap; type Key = T extends DefaultEventMap ? string | symbol : K | keyof T; type AnyRest = [...args: any[]]; type Args = T extends DefaultEventMap ? AnyRest : ( K extends keyof T ? T[K] : never ); type WildcardKey = T extends DefaultEventMap ? string | symbol : keyof T; type WildcardHandler = (event: WildcardKey, ...args: unknown[]) => void; export class WildcardEmitter = DefaultEventMap> extends EventEmitter { private wildcardHandlers: Array> = []; emit(eventName: Key, ...args: Args): boolean { this.wildcardHandlers.forEach((h) => h(eventName as WildcardKey, ...args)); return super.emit(eventName, ...args); } onAny(handler: WildcardHandler): () => void { this.wildcardHandlers.push(handler); return () => { this.wildcardHandlers = this.wildcardHandlers.filter((h) => h !== handler); }; } removeAllListeners(eventName?: unknown): this { if (eventName === undefined) { this.wildcardHandlers = []; } return super.removeAllListeners(eventName as Key); } }