'use strict';
(({
eventTargetDispatchEvent,
eventStopPropagation,
eventStopImmediatePropagation,
eventPreventDefault
}) => {
const NONE = 0;
const CAPTURING_PHASE = 1;
const AT_TARGET = 2;
const BUBBLING_PHASE = 3;
class Event {
#type;
#bubbles;
#cancelable;
#composed;
#timeStamp;
constructor(type, eventInitDict = {}) {
this.#type = String(type);
this.#bubbles = Boolean(eventInitDict.bubbles);
this.#cancelable = Boolean(eventInitDict.cancelable);
this.#composed = Boolean(eventInitDict.composed);
this.#timeStamp = performance.now();
this.__target__ = null;
this.__currentTarget__ = null;
this.__eventPhase__ = NONE;
this.__stopPropagation__ = false;
this.__stopImmediatePropagation__ = false;
this.__defaultPrevented__ = false;
this.__isTrusted__ = false;
}
get type() {
return this.#type;
}
get target() {
return this.__target__;
}
get currentTarget() {
return this.__currentTarget__;
}
get eventPhase() {
return this.__eventPhase__ || NONE;
}
stopPropagation() {
eventStopPropagation(this);
}
stopImmediatePropagation() {
eventStopImmediatePropagation(this);
}
get bubbles() {
return this.#bubbles;
}
get cancelable() {
return this.#cancelable;
}
preventDefault() {
eventPreventDefault(this);
}
get defaultPrevented() {
return this.__defaultPrevented__ || false;
}
get composed() {
return this.#composed;
}
get isTrusted() {
return this.__isTrusted__ || false;
}
get timeStamp() {
return this.#timeStamp;
}
static get NONE() { return NONE; }
static get CAPTURING_PHASE() { return CAPTURING_PHASE; }
static get AT_TARGET() { return AT_TARGET; }
static get BUBBLING_PHASE() { return BUBBLING_PHASE; }
get NONE() { return NONE; }
get CAPTURING_PHASE() { return CAPTURING_PHASE; }
get AT_TARGET() { return AT_TARGET; }
get BUBBLING_PHASE() { return BUBBLING_PHASE; }
}
class EventTarget {
constructor() {
this.__listeners__ = new Map();
}
addEventListener(type, listener, options = {}) {
if (listener === null || listener === undefined) {
return;
}
if (typeof listener !== 'function' &&
(typeof listener !== 'object' || typeof listener.handleEvent !== 'function')) {
return;
}
const typeStr = String(type);
const listenersMap = this.__listeners__;
let listeners = listenersMap.get(typeStr);
if (!listeners) {
listeners = [];
listenersMap.set(typeStr, listeners);
}
listeners.push(listener);
}
removeEventListener(type, listener, options = {}) {
if (listener === null || listener === undefined) {
return;
}
if (typeof listener !== 'function' &&
(typeof listener !== 'object' || typeof listener.handleEvent !== 'function')) {
return;
}
const typeStr = String(type);
const listenersMap = this.__listeners__;
const listeners = listenersMap.get(typeStr);
if (!listeners) {
return;
}
const index = listeners.indexOf(listener);
if (index !== -1) {
listeners.splice(index, 1);
}
}
dispatchEvent(event) {
if (!(event instanceof Event)) {
throw new TypeError('Failed to execute \'dispatchEvent\' on \'EventTarget\': parameter 1 is not of type \'Event\'.');
}
event.__currentTarget__ = this;
if (event.__target__ === null || event.__target__ === undefined) {
event.__target__ = this;
}
const type = event.type;
const listenersMap = this.__listeners__;
if (!listenersMap || !(listenersMap instanceof Map)) {
return !event.__defaultPrevented__;
}
const listeners = listenersMap.get(type);
if (!listeners || !Array.isArray(listeners) || listeners.length === 0) {
return !event.__defaultPrevented__;
}
for (let i = 0; i < listeners.length; i++) {
if (event.__stopImmediatePropagation__) {
break;
}
const listener = listeners[i];
try {
if (typeof listener === 'function') {
listener.call(this, event);
} else if (typeof listener === 'object' && typeof listener.handleEvent === 'function') {
listener.handleEvent.call(listener, event);
}
} catch (e) {
console.error('Error in event listener:', e);
}
}
return !event.__defaultPrevented__;
}
}
globalThis.Event = Event;
globalThis.EventTarget = EventTarget;
});