From 23981a300d01c9176470902eb91013914fcf8a22 Mon Sep 17 00:00:00 2001 From: 4lessandrodev Date: Sat, 13 Apr 2024 23:40:05 -0300 Subject: [PATCH] fix: ensure CustomEvent --- lib/core/browser-event-manager.ts | 8 ++++---- tests/utils/browser-event-manager.spec.ts | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/core/browser-event-manager.ts b/lib/core/browser-event-manager.ts index 3f20d29..9f1326e 100644 --- a/lib/core/browser-event-manager.ts +++ b/lib/core/browser-event-manager.ts @@ -5,14 +5,14 @@ export default class BrowserEventManager implements EventManager { private events: EventType[]; private static _instance: BrowserEventManager; - private constructor(private readonly _window: Window) { + private constructor(private readonly _window: Window & typeof globalThis) { this.events = []; if (typeof this._window === 'undefined') { throw new Error('BrowserEventManager is not supported'); } } - static instance(window: Window): BrowserEventManager { + static instance(window: Window & typeof globalThis): BrowserEventManager { if (BrowserEventManager._instance) return BrowserEventManager._instance; BrowserEventManager._instance = new BrowserEventManager(window); return BrowserEventManager._instance; @@ -59,7 +59,7 @@ export default class BrowserEventManager implements EventManager { const localEventName = this.events[i].eventName; const match = regex.test(localEventName); if (match) { - this._window.dispatchEvent(new CustomEvent(localEventName, { + this._window.dispatchEvent(new this._window.CustomEvent(localEventName, { bubbles: true, detail: args || [] })); @@ -69,7 +69,7 @@ export default class BrowserEventManager implements EventManager { return; } - this._window.dispatchEvent(new CustomEvent(eventName, { + this._window.dispatchEvent(new this._window.CustomEvent(eventName, { bubbles: true, detail: args || [] })); diff --git a/tests/utils/browser-event-manager.spec.ts b/tests/utils/browser-event-manager.spec.ts index ad2ab41..a78f5ee 100644 --- a/tests/utils/browser-event-manager.spec.ts +++ b/tests/utils/browser-event-manager.spec.ts @@ -2,6 +2,17 @@ import BrowserEventManager from '../../lib/core/browser-event-manager' describe('BrowserEventManager', () => { + class CustomEventMock { + type: string; + bubbles: boolean; + detail: any; + + constructor(type: string, eventInitDict?: CustomEventInit) { + this.type = type; + this.bubbles = eventInitDict?.bubbles ?? false; + this.detail = eventInitDict?.detail ?? null; + } + } var sessionStorage = new Map(); var globalThis = { window: { @@ -13,7 +24,8 @@ describe('BrowserEventManager', () => { }, addEventListener: jest.fn(), removeEventListener: jest.fn(), - dispatchEvent: jest.fn() + dispatchEvent: jest.fn(), + CustomEvent: CustomEventMock } } as const; @@ -24,7 +36,7 @@ describe('BrowserEventManager', () => { describe('instance', () => { it('should throw if window is not defined', () => { - const init = () => BrowserEventManager.instance(undefined as unknown as Window); + const init = () => BrowserEventManager.instance(undefined as unknown as any); expect(init).toThrow(); });