diff --git a/index.d.mts b/index.d.mts index 6bfb656..2d60f9e 100644 --- a/index.d.mts +++ b/index.d.mts @@ -1,4 +1,6 @@ -import type EventEmitter from "./index.d.ts"; +import type { EventEmitter as EE } from "./shared-types.d.ts"; + +declare const EventEmitter: typeof EE; export { EventEmitter }; export default EventEmitter; diff --git a/index.d.ts b/index.d.ts index 7c34c40..9e3db49 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,134 +1,4 @@ -/** - * Minimal `EventEmitter` interface that is molded against the Node.js - * `EventEmitter` interface. - */ -declare class EventEmitter< - EventTypes extends EventEmitter.ValidEventTypes = string | symbol, - Context extends any = any -> { - static prefixed: string | boolean; +import type { EventEmitter as EE } from "./shared-types.d.ts"; - /** - * Return an array listing the events for which the emitter has registered - * listeners. - */ - eventNames(): Array>; - - /** - * Return the listeners registered for a given event. - */ - listeners>( - event: T - ): Array>; - - /** - * Return the number of listeners listening to a given event. - */ - listenerCount(event: EventEmitter.EventNames): number; - - /** - * Calls each of the listeners registered for a given event. - */ - emit>( - event: T, - ...args: EventEmitter.EventArgs - ): boolean; - - /** - * Add a listener for a given event. - */ - on>( - event: T, - fn: EventEmitter.EventListener, - context?: Context - ): this; - addListener>( - event: T, - fn: EventEmitter.EventListener, - context?: Context - ): this; - - /** - * Add a one-time listener for a given event. - */ - once>( - event: T, - fn: EventEmitter.EventListener, - context?: Context - ): this; - - /** - * Remove the listeners of a given event. - */ - removeListener>( - event: T, - fn?: EventEmitter.EventListener, - context?: Context, - once?: boolean - ): this; - off>( - event: T, - fn?: EventEmitter.EventListener, - context?: Context, - once?: boolean - ): this; - - /** - * Remove all listeners, or those of the specified event. - */ - removeAllListeners(event?: EventEmitter.EventNames): this; -} - -declare namespace EventEmitter { - export interface ListenerFn { - (...args: Args): void; - } - - export interface EventEmitterStatic { - new < - EventTypes extends ValidEventTypes = string | symbol, - Context = any - >(): EventEmitter; - } - - /** - * `object` should be in either of the following forms: - * ``` - * interface EventTypes { - * 'event-with-parameters': any[] - * 'event-with-example-handler': (...args: any[]) => void - * } - * ``` - */ - export type ValidEventTypes = string | symbol | object; - - export type EventNames = T extends string | symbol - ? T - : keyof T; - - export type ArgumentMap = { - [K in keyof T]: T[K] extends (...args: any[]) => void - ? Parameters - : T[K] extends any[] - ? T[K] - : any[]; - }; - - export type EventListener< - T extends ValidEventTypes, - K extends EventNames - > = T extends string | symbol - ? (...args: any[]) => void - : ( - ...args: ArgumentMap>[Extract] - ) => void; - - export type EventArgs< - T extends ValidEventTypes, - K extends EventNames - > = Parameters>; - - export const EventEmitter: EventEmitterStatic; -} - -module.exports = EventEmitter; +declare const EventEmitter: typeof EE; +export = EventEmitter; diff --git a/package.json b/package.json index 2aa6284..831639c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "index.mjs", "index.d.ts", "index.d.mts", + "shared-types.d.ts", "dist" ], "repository": { diff --git a/shared-types.d.ts b/shared-types.d.ts new file mode 100644 index 0000000..af7009f --- /dev/null +++ b/shared-types.d.ts @@ -0,0 +1,134 @@ +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + */ +export declare class EventEmitter< + EventTypes extends EventEmitter.ValidEventTypes = string | symbol, + Context extends any = any +> { + static prefixed: string | boolean; + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + */ + eventNames(): Array>; + + /** + * Return the listeners registered for a given event. + */ + listeners>( + event: T + ): Array>; + + /** + * Return the number of listeners listening to a given event. + */ + listenerCount(event: EventEmitter.EventNames): number; + + /** + * Calls each of the listeners registered for a given event. + */ + emit>( + event: T, + ...args: EventEmitter.EventArgs + ): boolean; + + /** + * Add a listener for a given event. + */ + on>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + addListener>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + + /** + * Add a one-time listener for a given event. + */ + once>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + + /** + * Remove the listeners of a given event. + */ + removeListener>( + event: T, + fn?: EventEmitter.EventListener, + context?: Context, + once?: boolean + ): this; + off>( + event: T, + fn?: EventEmitter.EventListener, + context?: Context, + once?: boolean + ): this; + + /** + * Remove all listeners, or those of the specified event. + */ + removeAllListeners(event?: EventEmitter.EventNames): this; +} + +export declare namespace EventEmitter { + export interface ListenerFn { + (...args: Args): void; + } + + export interface EventEmitterStatic { + new < + EventTypes extends ValidEventTypes = string | symbol, + Context = any + >(): EventEmitter; + } + + /** + * `object` should be in either of the following forms: + * ``` + * interface EventTypes { + * 'event-with-parameters': any[] + * 'event-with-example-handler': (...args: any[]) => void + * } + * ``` + */ + export type ValidEventTypes = string | symbol | object; + + export type EventNames = T extends string | symbol + ? T + : keyof T; + + export type ArgumentMap = { + [K in keyof T]: T[K] extends (...args: any[]) => void + ? Parameters + : T[K] extends any[] + ? T[K] + : any[]; + }; + + export type EventListener< + T extends ValidEventTypes, + K extends EventNames + > = T extends string | symbol + ? (...args: any[]) => void + : ( + ...args: ArgumentMap>[Extract] + ) => void; + + export type EventArgs< + T extends ValidEventTypes, + K extends EventNames + > = Parameters>; + + export const EventEmitter: EventEmitterStatic; +} + +export default EventEmitter;