Spaces:
Sleeping
Sleeping
export as namespace EventTargetShim | |
/** | |
* `Event` interface. | |
* @see https://dom.spec.whatwg.org/#event | |
*/ | |
export interface Event { | |
/** | |
* The type of this event. | |
*/ | |
readonly type: string | |
/** | |
* The target of this event. | |
*/ | |
readonly target: EventTarget<{}, {}, "standard"> | null | |
/** | |
* The current target of this event. | |
*/ | |
readonly currentTarget: EventTarget<{}, {}, "standard"> | null | |
/** | |
* The target of this event. | |
* @deprecated | |
*/ | |
readonly srcElement: any | null | |
/** | |
* The composed path of this event. | |
*/ | |
composedPath(): EventTarget<{}, {}, "standard">[] | |
/** | |
* Constant of NONE. | |
*/ | |
readonly NONE: number | |
/** | |
* Constant of CAPTURING_PHASE. | |
*/ | |
readonly CAPTURING_PHASE: number | |
/** | |
* Constant of BUBBLING_PHASE. | |
*/ | |
readonly BUBBLING_PHASE: number | |
/** | |
* Constant of AT_TARGET. | |
*/ | |
readonly AT_TARGET: number | |
/** | |
* Indicates which phase of the event flow is currently being evaluated. | |
*/ | |
readonly eventPhase: number | |
/** | |
* Stop event bubbling. | |
*/ | |
stopPropagation(): void | |
/** | |
* Stop event bubbling. | |
*/ | |
stopImmediatePropagation(): void | |
/** | |
* Initialize event. | |
* @deprecated | |
*/ | |
initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void | |
/** | |
* The flag indicating bubbling. | |
*/ | |
readonly bubbles: boolean | |
/** | |
* Stop event bubbling. | |
* @deprecated | |
*/ | |
cancelBubble: boolean | |
/** | |
* Set or get cancellation flag. | |
* @deprecated | |
*/ | |
returnValue: boolean | |
/** | |
* The flag indicating whether the event can be canceled. | |
*/ | |
readonly cancelable: boolean | |
/** | |
* Cancel this event. | |
*/ | |
preventDefault(): void | |
/** | |
* The flag to indicating whether the event was canceled. | |
*/ | |
readonly defaultPrevented: boolean | |
/** | |
* The flag to indicating if event is composed. | |
*/ | |
readonly composed: boolean | |
/** | |
* Indicates whether the event was dispatched by the user agent. | |
*/ | |
readonly isTrusted: boolean | |
/** | |
* The unix time of this event. | |
*/ | |
readonly timeStamp: number | |
} | |
/** | |
* The constructor of `EventTarget` interface. | |
*/ | |
export type EventTargetConstructor< | |
TEvents extends EventTarget.EventDefinition = {}, | |
TEventAttributes extends EventTarget.EventDefinition = {}, | |
TMode extends EventTarget.Mode = "loose" | |
> = { | |
prototype: EventTarget<TEvents, TEventAttributes, TMode> | |
new(): EventTarget<TEvents, TEventAttributes, TMode> | |
} | |
/** | |
* `EventTarget` interface. | |
* @see https://dom.spec.whatwg.org/#interface-eventtarget | |
*/ | |
export type EventTarget< | |
TEvents extends EventTarget.EventDefinition = {}, | |
TEventAttributes extends EventTarget.EventDefinition = {}, | |
TMode extends EventTarget.Mode = "loose" | |
> = EventTarget.EventAttributes<TEventAttributes> & { | |
/** | |
* Add a given listener to this event target. | |
* @param eventName The event name to add. | |
* @param listener The listener to add. | |
* @param options The options for this listener. | |
*/ | |
addEventListener<TEventType extends EventTarget.EventType<TEvents, TMode>>( | |
type: TEventType, | |
listener: | |
| EventTarget.Listener<EventTarget.PickEvent<TEvents, TEventType>> | |
| null, | |
options?: boolean | EventTarget.AddOptions | |
): void | |
/** | |
* Remove a given listener from this event target. | |
* @param eventName The event name to remove. | |
* @param listener The listener to remove. | |
* @param options The options for this listener. | |
*/ | |
removeEventListener<TEventType extends EventTarget.EventType<TEvents, TMode>>( | |
type: TEventType, | |
listener: | |
| EventTarget.Listener<EventTarget.PickEvent<TEvents, TEventType>> | |
| null, | |
options?: boolean | EventTarget.RemoveOptions | |
): void | |
/** | |
* Dispatch a given event. | |
* @param event The event to dispatch. | |
* @returns `false` if canceled. | |
*/ | |
dispatchEvent<TEventType extends EventTarget.EventType<TEvents, TMode>>( | |
event: EventTarget.EventData<TEvents, TEventType, TMode> | |
): boolean | |
} | |
export const EventTarget: EventTargetConstructor & { | |
/** | |
* Create an `EventTarget` instance with detailed event definition. | |
* | |
* The detailed event definition requires to use `defineEventAttribute()` | |
* function later. | |
* | |
* Unfortunately, the second type parameter `TEventAttributes` was needed | |
* because we cannot compute string literal types. | |
* | |
* @example | |
* const signal = new EventTarget<{ abort: Event }, { onabort: Event }>() | |
* defineEventAttribute(signal, "abort") | |
*/ | |
new < | |
TEvents extends EventTarget.EventDefinition, | |
TEventAttributes extends EventTarget.EventDefinition, | |
TMode extends EventTarget.Mode = "loose" | |
>(): EventTarget<TEvents, TEventAttributes, TMode> | |
/** | |
* Define an `EventTarget` constructor with attribute events and detailed event definition. | |
* | |
* Unfortunately, the second type parameter `TEventAttributes` was needed | |
* because we cannot compute string literal types. | |
* | |
* @example | |
* class AbortSignal extends EventTarget<{ abort: Event }, { onabort: Event }>("abort") { | |
* abort(): void {} | |
* } | |
* | |
* @param events Optional event attributes (e.g. passing in `"click"` adds `onclick` to prototype). | |
*/ | |
< | |
TEvents extends EventTarget.EventDefinition = {}, | |
TEventAttributes extends EventTarget.EventDefinition = {}, | |
TMode extends EventTarget.Mode = "loose" | |
>(events: string[]): EventTargetConstructor< | |
TEvents, | |
TEventAttributes, | |
TMode | |
> | |
/** | |
* Define an `EventTarget` constructor with attribute events and detailed event definition. | |
* | |
* Unfortunately, the second type parameter `TEventAttributes` was needed | |
* because we cannot compute string literal types. | |
* | |
* @example | |
* class AbortSignal extends EventTarget<{ abort: Event }, { onabort: Event }>("abort") { | |
* abort(): void {} | |
* } | |
* | |
* @param events Optional event attributes (e.g. passing in `"click"` adds `onclick` to prototype). | |
*/ | |
< | |
TEvents extends EventTarget.EventDefinition = {}, | |
TEventAttributes extends EventTarget.EventDefinition = {}, | |
TMode extends EventTarget.Mode = "loose" | |
>(event0: string, ...events: string[]): EventTargetConstructor< | |
TEvents, | |
TEventAttributes, | |
TMode | |
> | |
} | |
export namespace EventTarget { | |
/** | |
* Options of `removeEventListener()` method. | |
*/ | |
export interface RemoveOptions { | |
/** | |
* The flag to indicate that the listener is for the capturing phase. | |
*/ | |
capture?: boolean | |
} | |
/** | |
* Options of `addEventListener()` method. | |
*/ | |
export interface AddOptions extends RemoveOptions { | |
/** | |
* The flag to indicate that the listener doesn't support | |
* `event.preventDefault()` operation. | |
*/ | |
passive?: boolean | |
/** | |
* The flag to indicate that the listener will be removed on the first | |
* event. | |
*/ | |
once?: boolean | |
} | |
/** | |
* The type of regular listeners. | |
*/ | |
export interface FunctionListener<TEvent> { | |
(event: TEvent): void | |
} | |
/** | |
* The type of object listeners. | |
*/ | |
export interface ObjectListener<TEvent> { | |
handleEvent(event: TEvent): void | |
} | |
/** | |
* The type of listeners. | |
*/ | |
export type Listener<TEvent> = | |
| FunctionListener<TEvent> | |
| ObjectListener<TEvent> | |
/** | |
* Event definition. | |
*/ | |
export type EventDefinition = { | |
readonly [key: string]: Event | |
} | |
/** | |
* Mapped type for event attributes. | |
*/ | |
export type EventAttributes<TEventAttributes extends EventDefinition> = { | |
[P in keyof TEventAttributes]: | |
| FunctionListener<TEventAttributes[P]> | |
| null | |
} | |
/** | |
* The type of event data for `dispatchEvent()` method. | |
*/ | |
export type EventData< | |
TEvents extends EventDefinition, | |
TEventType extends keyof TEvents | string, | |
TMode extends Mode | |
> = | |
TEventType extends keyof TEvents | |
? ( | |
// Require properties which are not generated automatically. | |
& Pick< | |
TEvents[TEventType], | |
Exclude<keyof TEvents[TEventType], OmittableEventKeys> | |
> | |
// Properties which are generated automatically are optional. | |
& Partial<Pick<Event, OmittableEventKeys>> | |
) | |
: ( | |
TMode extends "standard" | |
? Event | |
: Event | NonStandardEvent | |
) | |
/** | |
* The string literal types of the properties which are generated | |
* automatically in `dispatchEvent()` method. | |
*/ | |
export type OmittableEventKeys = Exclude<keyof Event, "type"> | |
/** | |
* The type of event data. | |
*/ | |
export type NonStandardEvent = { | |
[key: string]: any | |
type: string | |
} | |
/** | |
* The type of listeners. | |
*/ | |
export type PickEvent< | |
TEvents extends EventDefinition, | |
TEventType extends keyof TEvents | string, | |
> = | |
TEventType extends keyof TEvents | |
? TEvents[TEventType] | |
: Event | |
/** | |
* Event type candidates. | |
*/ | |
export type EventType< | |
TEvents extends EventDefinition, | |
TMode extends Mode | |
> = | |
TMode extends "strict" | |
? keyof TEvents | |
: keyof TEvents | string | |
/** | |
* - `"strict"` ..... Methods don't accept unknown events. | |
* `dispatchEvent()` accepts partial objects. | |
* - `"loose"` ...... Methods accept unknown events. | |
* `dispatchEvent()` accepts partial objects. | |
* - `"standard"` ... Methods accept unknown events. | |
* `dispatchEvent()` doesn't accept partial objects. | |
*/ | |
export type Mode = "strict" | "standard" | "loose" | |
} | |
/** | |
* Specialized `type` property. | |
*/ | |
export type Type<T extends string> = { type: T } | |
/** | |
* Define an event attribute (e.g. `eventTarget.onclick`). | |
* @param prototype The event target prototype to define an event attribute. | |
* @param eventName The event name to define. | |
*/ | |
export function defineEventAttribute( | |
prototype: EventTarget, | |
eventName: string | |
): void | |
export default EventTarget | |