You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							400 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							400 lines
						
					
					
						
							10 KiB
						
					
					
				| 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
 |