@planningcenter/chat-react-native 3.15.0-rc.7 → 3.15.0-rc.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/build/index.d.ts +2 -0
  2. package/build/index.d.ts.map +1 -1
  3. package/build/index.js +2 -0
  4. package/build/index.js.map +1 -1
  5. package/build/polyfills/events/CustomEvent.d.ts +21 -0
  6. package/build/polyfills/events/CustomEvent.d.ts.map +1 -0
  7. package/build/polyfills/events/CustomEvent.js +22 -0
  8. package/build/polyfills/events/CustomEvent.js.map +1 -0
  9. package/build/polyfills/events/Event.d.ts +49 -0
  10. package/build/polyfills/events/Event.d.ts.map +1 -0
  11. package/build/polyfills/events/Event.js +125 -0
  12. package/build/polyfills/events/Event.js.map +1 -0
  13. package/build/polyfills/events/EventHandlerAttributes.d.ts +8 -0
  14. package/build/polyfills/events/EventHandlerAttributes.d.ts.map +1 -0
  15. package/build/polyfills/events/EventHandlerAttributes.js +46 -0
  16. package/build/polyfills/events/EventHandlerAttributes.js.map +1 -0
  17. package/build/polyfills/events/EventTarget.d.ts +33 -0
  18. package/build/polyfills/events/EventTarget.d.ts.map +1 -0
  19. package/build/polyfills/events/EventTarget.js +238 -0
  20. package/build/polyfills/events/EventTarget.js.map +1 -0
  21. package/build/polyfills/events/internals/EventInternals.d.ts +30 -0
  22. package/build/polyfills/events/internals/EventInternals.d.ts.map +1 -0
  23. package/build/polyfills/events/internals/EventInternals.js +76 -0
  24. package/build/polyfills/events/internals/EventInternals.js.map +1 -0
  25. package/build/polyfills/events/internals/EventTargetInternals.d.ts +9 -0
  26. package/build/polyfills/events/internals/EventTargetInternals.d.ts.map +1 -0
  27. package/build/polyfills/events/internals/EventTargetInternals.js +11 -0
  28. package/build/polyfills/events/internals/EventTargetInternals.js.map +1 -0
  29. package/build/polyfills/webidl/PlatformObjects.d.ts +31 -0
  30. package/build/polyfills/webidl/PlatformObjects.d.ts.map +1 -0
  31. package/build/polyfills/webidl/PlatformObjects.js +39 -0
  32. package/build/polyfills/webidl/PlatformObjects.js.map +1 -0
  33. package/package.json +5 -5
  34. package/src/__tests__/event-polyfill.test.ts +314 -0
  35. package/src/index.tsx +2 -0
  36. package/src/polyfills/events/CustomEvent.ts +32 -0
  37. package/src/polyfills/events/Event.ts +186 -0
  38. package/src/polyfills/events/EventHandlerAttributes.ts +67 -0
  39. package/src/polyfills/events/EventTarget.ts +360 -0
  40. package/src/polyfills/events/README.md +1 -0
  41. package/src/polyfills/events/internals/EventInternals.ts +95 -0
  42. package/src/polyfills/events/internals/EventTargetInternals.ts +16 -0
  43. package/src/polyfills/webidl/PlatformObjects.ts +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventTarget.js","sourceRoot":"","sources":["../../../src/polyfills/events/EventTarget.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * Implements the `EventTarget` interface from the DOM.\n */\n\nimport Event from './Event'\nimport {\n getStopImmediatePropagationFlag,\n getStopPropagationFlag,\n setComposedPath,\n setCurrentTarget,\n setEventPhase,\n setInPassiveListenerFlag,\n setIsTrusted,\n setStopImmediatePropagationFlag,\n setStopPropagationFlag,\n setTarget,\n} from './internals/EventInternals'\nimport {\n EVENT_TARGET_GET_THE_PARENT_KEY,\n INTERNAL_DISPATCH_METHOD_KEY,\n} from './internals/EventTargetInternals'\nimport { setPlatformObject } from '../webidl/PlatformObjects'\n\nexport type EventCallback = (event: Event) => void\nexport type EventHandler = { handleEvent(event: Event): void }\nexport type EventListener = EventCallback | EventHandler\n\nexport type EventListenerOptions = Readonly<{\n capture?: boolean\n}>\n\nexport type AddEventListenerOptions = Readonly<{\n capture?: boolean\n passive?: boolean\n once?: boolean\n signal?: AbortSignal\n}>\n\ntype EventListenerRegistration = {\n readonly callback: EventListener\n readonly passive: boolean\n readonly once: boolean\n removed: boolean\n}\n\ntype ListenersMap = Map<string, Map<EventListener, EventListenerRegistration>>\n\nexport default class EventTarget {\n addEventListener(\n type: string,\n callback: EventListener | null,\n optionsOrUseCapture: AddEventListenerOptions | boolean = {}\n ): void {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`\n )\n }\n\n if (callback == null) {\n return\n }\n\n validateCallback(callback, 'addEventListener')\n\n const processedType = String(type)\n\n let capture: boolean\n let passive: boolean\n let once: boolean\n let signal: AbortSignal | null | undefined\n\n if (\n optionsOrUseCapture != null &&\n (typeof optionsOrUseCapture === 'object' || typeof optionsOrUseCapture === 'function')\n ) {\n const opts = optionsOrUseCapture as AddEventListenerOptions\n capture = Boolean(opts.capture)\n passive =\n opts.passive == null ? getDefaultPassiveValue(processedType, this) : Boolean(opts.passive)\n once = Boolean(opts.once)\n signal = opts.signal\n if (signal !== undefined && !(signal instanceof AbortSignal)) {\n throw new TypeError(\n \"Failed to execute 'addEventListener' on 'EventTarget': Failed to read the 'signal' property from 'AddEventListenerOptions': Failed to convert value to 'AbortSignal'.\"\n )\n }\n } else {\n capture = Boolean(optionsOrUseCapture)\n passive = false\n once = false\n signal = null\n }\n\n if (signal?.aborted) {\n return\n }\n\n let listenersByType = getListenersForPhase(this, capture)\n let listeners = listenersByType?.get(processedType)\n if (listeners == null) {\n if (listenersByType == null) {\n listenersByType = new Map()\n setListenersMap(this, capture, listenersByType)\n }\n listeners = new Map()\n listenersByType.set(processedType, listeners)\n } else if (listeners.has(callback)) {\n return\n }\n\n const listener: EventListenerRegistration = {\n callback,\n passive,\n once,\n removed: false,\n }\n listeners.set(callback, listener)\n\n const nonNullListeners = listeners\n\n if (signal != null) {\n signal.addEventListener(\n 'abort',\n () => {\n listener.removed = true\n if (nonNullListeners.get(callback) === listener) {\n nonNullListeners.delete(callback)\n }\n },\n { once: true }\n )\n }\n }\n\n removeEventListener(\n type: string,\n callback: EventListener,\n optionsOrUseCapture: EventListenerOptions | boolean = {}\n ): void {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'removeEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`\n )\n }\n\n if (callback == null) {\n return\n }\n\n validateCallback(callback, 'removeEventListener')\n\n const processedType = String(type)\n\n const capture =\n typeof optionsOrUseCapture === 'boolean'\n ? optionsOrUseCapture\n : Boolean((optionsOrUseCapture as EventListenerOptions).capture)\n\n const listenersByType = getListenersForPhase(this, capture)\n const listeners = listenersByType?.get(processedType)\n if (listeners == null) {\n return\n }\n\n const listener = listeners.get(callback)\n if (listener != null) {\n listener.removed = true\n listeners.delete(callback)\n }\n }\n\n dispatchEvent(event: Event): boolean {\n if (!(event instanceof Event)) {\n throw new TypeError(\n \"Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.\"\n )\n }\n\n if (getEventDispatchFlag(event)) {\n throw new Error(\n \"Failed to execute 'dispatchEvent' on 'EventTarget': The event is already being dispatched.\"\n )\n }\n\n setIsTrusted(event, false)\n dispatch(this, event)\n return !event.defaultPrevented\n }\n\n // \"protected\" for subclasses: get the parent (see spec)\n [EVENT_TARGET_GET_THE_PARENT_KEY](): EventTarget | null {\n return null\n }\n\n // \"protected\" to dispatch trusted events\n [INTERNAL_DISPATCH_METHOD_KEY](event: Event): void {\n dispatch(this, event)\n }\n}\n\nsetPlatformObject(EventTarget)\n\nfunction validateCallback(callback: EventListener, methodName: string): void {\n if (typeof callback !== 'function' && typeof callback !== 'object') {\n throw new TypeError(\n `Failed to execute '${methodName}' on 'EventTarget': parameter 2 is not of type 'Object'.`\n )\n }\n}\n\nfunction getDefaultPassiveValue(_type: string, _eventTarget: EventTarget): boolean {\n return false\n}\n\nfunction dispatch(eventTarget: EventTarget, event: Event): void {\n setEventDispatchFlag(event, true)\n\n const eventPath = getEventPath(eventTarget, event)\n setComposedPath(event, eventPath)\n setTarget(event, eventTarget)\n\n for (let i = eventPath.length - 1; i >= 0; i--) {\n if (getStopPropagationFlag(event)) {\n break\n }\n const target = eventPath[i]\n setEventPhase(event, target === eventTarget ? Event.AT_TARGET : Event.CAPTURING_PHASE)\n invoke(target, event, Event.CAPTURING_PHASE)\n }\n\n for (const target of eventPath) {\n if (getStopPropagationFlag(event)) {\n break\n }\n if (!event.bubbles && target !== eventTarget) {\n break\n }\n setEventPhase(event, target === eventTarget ? Event.AT_TARGET : Event.BUBBLING_PHASE)\n invoke(target, event, Event.BUBBLING_PHASE)\n }\n\n setEventPhase(event, Event.NONE)\n setCurrentTarget(event, null)\n setComposedPath(event, [])\n\n setEventDispatchFlag(event, false)\n setStopImmediatePropagationFlag(event, false)\n setStopPropagationFlag(event, false)\n}\n\nfunction getEventPath(eventTarget: EventTarget, _event: Event): ReadonlyArray<EventTarget> {\n const path: EventTarget[] = []\n let target: EventTarget | null = eventTarget\n\n while (target != null) {\n path.push(target)\n target = target[EVENT_TARGET_GET_THE_PARENT_KEY]()\n }\n\n return path\n}\n\nfunction invoke(eventTarget: EventTarget, event: Event, eventPhase: import('./Event').EventPhase) {\n const listenersByType = getListenersForPhase(eventTarget, eventPhase === Event.CAPTURING_PHASE)\n\n setCurrentTarget(event, eventTarget)\n\n const maybeListeners = listenersByType?.get(event.type)\n if (maybeListeners == null) {\n return\n }\n\n const listeners = Array.from(maybeListeners.values())\n setCurrentTarget(event, eventTarget)\n\n for (const listener of listeners) {\n if (listener.removed) {\n continue\n }\n\n if (listener.once) {\n eventTarget.removeEventListener(\n event.type,\n listener.callback,\n eventPhase === Event.CAPTURING_PHASE\n )\n }\n\n if (listener.passive) {\n setInPassiveListenerFlag(event, true)\n }\n\n const currentEvent = (global as any).event\n ;(global as any).event = event\n\n const callback = listener.callback as any\n try {\n if (typeof callback === 'function') {\n callback.call(eventTarget, event)\n } else if (typeof callback.handleEvent === 'function') {\n callback.handleEvent(event)\n }\n } catch (error) {\n // TODO: replace with `reportError` when it's available.\n\n console.error(error)\n }\n\n if (listener.passive) {\n setInPassiveListenerFlag(event, false)\n }\n\n ;(global as any).event = currentEvent\n\n if (getStopImmediatePropagationFlag(event)) {\n break\n }\n }\n}\n\nconst CAPTURING_LISTENERS_KEY = Symbol('capturingListeners')\nconst BUBBLING_LISTENERS_KEY = Symbol('bubblingListeners')\n\nfunction getListenersForPhase(\n eventTarget: EventTarget,\n isCapture: boolean\n): ListenersMap | null | undefined {\n // @ts-expect-error index on symbol\n return isCapture ? eventTarget[CAPTURING_LISTENERS_KEY] : eventTarget[BUBBLING_LISTENERS_KEY]\n}\n\nfunction setListenersMap(\n eventTarget: EventTarget,\n isCapture: boolean,\n listenersMap: ListenersMap\n): void {\n if (isCapture) {\n ;(eventTarget as any)[CAPTURING_LISTENERS_KEY] = listenersMap\n } else {\n ;(eventTarget as any)[BUBBLING_LISTENERS_KEY] = listenersMap\n }\n}\n\nconst EVENT_DISPATCH_FLAG = Symbol('Event.dispatch')\n\nfunction getEventDispatchFlag(event: Event): boolean {\n return (event as any)[EVENT_DISPATCH_FLAG]\n}\n\nfunction setEventDispatchFlag(event: Event, value: boolean): void {\n ;(event as any)[EVENT_DISPATCH_FLAG] = value\n}\n"]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Internal implementation details for the `Event` module.
3
+ */
4
+ import type Event from '../Event';
5
+ import type EventTarget from '../EventTarget';
6
+ export declare const COMPOSED_PATH_KEY: unique symbol;
7
+ export declare const CURRENT_TARGET_KEY: unique symbol;
8
+ export declare const EVENT_PHASE_KEY: unique symbol;
9
+ export declare const IN_PASSIVE_LISTENER_FLAG_KEY: unique symbol;
10
+ export declare const IS_TRUSTED_KEY: unique symbol;
11
+ export declare const STOP_IMMEDIATE_PROPAGATION_FLAG_KEY: unique symbol;
12
+ export declare const STOP_PROPAGATION_FLAG_KEY: unique symbol;
13
+ export declare const TARGET_KEY: unique symbol;
14
+ export declare function getCurrentTarget(event: Event): EventTarget | null;
15
+ export declare function setCurrentTarget(event: Event, currentTarget: EventTarget | null): void;
16
+ export declare function getComposedPath(event: Event): ReadonlyArray<EventTarget>;
17
+ export declare function setComposedPath(event: Event, composedPath: ReadonlyArray<EventTarget>): void;
18
+ export declare function getEventPhase(event: Event): import('../Event').EventPhase;
19
+ export declare function setEventPhase(event: Event, eventPhase: import('../Event').EventPhase): void;
20
+ export declare function getInPassiveListenerFlag(event: Event): boolean;
21
+ export declare function setInPassiveListenerFlag(event: Event, value: boolean): void;
22
+ export declare function getIsTrusted(event: Event): boolean;
23
+ export declare function setIsTrusted(event: Event, isTrusted: boolean): void;
24
+ export declare function getStopImmediatePropagationFlag(event: Event): boolean;
25
+ export declare function setStopImmediatePropagationFlag(event: Event, value: boolean): void;
26
+ export declare function getStopPropagationFlag(event: Event): boolean;
27
+ export declare function setStopPropagationFlag(event: Event, value: boolean): void;
28
+ export declare function getTarget(event: Event): EventTarget | null;
29
+ export declare function setTarget(event: Event, target: EventTarget | null): void;
30
+ //# sourceMappingURL=EventInternals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventInternals.d.ts","sourceRoot":"","sources":["../../../../src/polyfills/events/internals/EventInternals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AACjC,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAA+B,CAAA;AACtE,eAAO,MAAM,kBAAkB,EAAE,OAAO,MAAgC,CAAA;AACxE,eAAO,MAAM,eAAe,EAAE,OAAO,MAA6B,CAAA;AAClE,eAAO,MAAM,4BAA4B,EAAE,OAAO,MAAwC,CAAA;AAC1F,eAAO,MAAM,cAAc,EAAE,OAAO,MAA4B,CAAA;AAChE,eAAO,MAAM,mCAAmC,EAAE,OAAO,MAAsC,CAAA;AAC/F,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAAsC,CAAA;AACrF,eAAO,MAAM,UAAU,EAAE,OAAO,MAAyB,CAAA;AAEzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAGjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAGtF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,CAGxE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,IAAI,CAG5F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,UAAU,EAAE,UAAU,CAGzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,UAAU,EAAE,UAAU,GAAG,IAAI,CAG3F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAG9D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG3E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGlD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAGnE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGrE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGlF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAG5D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGzE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAG1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAGxE"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Internal implementation details for the `Event` module.
3
+ */
4
+ export const COMPOSED_PATH_KEY = Symbol('composedPath');
5
+ export const CURRENT_TARGET_KEY = Symbol('currentTarget');
6
+ export const EVENT_PHASE_KEY = Symbol('eventPhase');
7
+ export const IN_PASSIVE_LISTENER_FLAG_KEY = Symbol('inPassiveListenerFlag');
8
+ export const IS_TRUSTED_KEY = Symbol('isTrusted');
9
+ export const STOP_IMMEDIATE_PROPAGATION_FLAG_KEY = Symbol('stopPropagationFlag');
10
+ export const STOP_PROPAGATION_FLAG_KEY = Symbol('stopPropagationFlag');
11
+ export const TARGET_KEY = Symbol('target');
12
+ export function getCurrentTarget(event) {
13
+ // @ts-expect-error index on symbol
14
+ return event[CURRENT_TARGET_KEY];
15
+ }
16
+ export function setCurrentTarget(event, currentTarget) {
17
+ // @ts-expect-error index on symbol
18
+ event[CURRENT_TARGET_KEY] = currentTarget;
19
+ }
20
+ export function getComposedPath(event) {
21
+ // @ts-expect-error index on symbol
22
+ return event[COMPOSED_PATH_KEY];
23
+ }
24
+ export function setComposedPath(event, composedPath) {
25
+ // @ts-expect-error index on symbol
26
+ event[COMPOSED_PATH_KEY] = composedPath;
27
+ }
28
+ export function getEventPhase(event) {
29
+ // @ts-expect-error index on symbol
30
+ return event[EVENT_PHASE_KEY];
31
+ }
32
+ export function setEventPhase(event, eventPhase) {
33
+ // @ts-expect-error index on symbol
34
+ event[EVENT_PHASE_KEY] = eventPhase;
35
+ }
36
+ export function getInPassiveListenerFlag(event) {
37
+ // @ts-expect-error index on symbol
38
+ return event[IN_PASSIVE_LISTENER_FLAG_KEY];
39
+ }
40
+ export function setInPassiveListenerFlag(event, value) {
41
+ // @ts-expect-error index on symbol
42
+ event[IN_PASSIVE_LISTENER_FLAG_KEY] = value;
43
+ }
44
+ export function getIsTrusted(event) {
45
+ // @ts-expect-error index on symbol
46
+ return event[IS_TRUSTED_KEY];
47
+ }
48
+ export function setIsTrusted(event, isTrusted) {
49
+ // @ts-expect-error index on symbol
50
+ event[IS_TRUSTED_KEY] = isTrusted;
51
+ }
52
+ export function getStopImmediatePropagationFlag(event) {
53
+ // @ts-expect-error index on symbol
54
+ return event[STOP_IMMEDIATE_PROPAGATION_FLAG_KEY];
55
+ }
56
+ export function setStopImmediatePropagationFlag(event, value) {
57
+ // @ts-expect-error index on symbol
58
+ event[STOP_IMMEDIATE_PROPAGATION_FLAG_KEY] = value;
59
+ }
60
+ export function getStopPropagationFlag(event) {
61
+ // @ts-expect-error index on symbol
62
+ return event[STOP_PROPAGATION_FLAG_KEY];
63
+ }
64
+ export function setStopPropagationFlag(event, value) {
65
+ // @ts-expect-error index on symbol
66
+ event[STOP_PROPAGATION_FLAG_KEY] = value;
67
+ }
68
+ export function getTarget(event) {
69
+ // @ts-expect-error index on symbol
70
+ return event[TARGET_KEY];
71
+ }
72
+ export function setTarget(event, target) {
73
+ // @ts-expect-error index on symbol
74
+ event[TARGET_KEY] = target;
75
+ }
76
+ //# sourceMappingURL=EventInternals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventInternals.js","sourceRoot":"","sources":["../../../../src/polyfills/events/internals/EventInternals.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Internal implementation details for the `Event` module.\n */\n\nimport type Event from '../Event'\nimport type EventTarget from '../EventTarget'\n\nexport const COMPOSED_PATH_KEY: unique symbol = Symbol('composedPath')\nexport const CURRENT_TARGET_KEY: unique symbol = Symbol('currentTarget')\nexport const EVENT_PHASE_KEY: unique symbol = Symbol('eventPhase')\nexport const IN_PASSIVE_LISTENER_FLAG_KEY: unique symbol = Symbol('inPassiveListenerFlag')\nexport const IS_TRUSTED_KEY: unique symbol = Symbol('isTrusted')\nexport const STOP_IMMEDIATE_PROPAGATION_FLAG_KEY: unique symbol = Symbol('stopPropagationFlag')\nexport const STOP_PROPAGATION_FLAG_KEY: unique symbol = Symbol('stopPropagationFlag')\nexport const TARGET_KEY: unique symbol = Symbol('target')\n\nexport function getCurrentTarget(event: Event): EventTarget | null {\n // @ts-expect-error index on symbol\n return event[CURRENT_TARGET_KEY]\n}\n\nexport function setCurrentTarget(event: Event, currentTarget: EventTarget | null): void {\n // @ts-expect-error index on symbol\n event[CURRENT_TARGET_KEY] = currentTarget\n}\n\nexport function getComposedPath(event: Event): ReadonlyArray<EventTarget> {\n // @ts-expect-error index on symbol\n return event[COMPOSED_PATH_KEY]\n}\n\nexport function setComposedPath(event: Event, composedPath: ReadonlyArray<EventTarget>): void {\n // @ts-expect-error index on symbol\n event[COMPOSED_PATH_KEY] = composedPath\n}\n\nexport function getEventPhase(event: Event): import('../Event').EventPhase {\n // @ts-expect-error index on symbol\n return event[EVENT_PHASE_KEY]\n}\n\nexport function setEventPhase(event: Event, eventPhase: import('../Event').EventPhase): void {\n // @ts-expect-error index on symbol\n event[EVENT_PHASE_KEY] = eventPhase\n}\n\nexport function getInPassiveListenerFlag(event: Event): boolean {\n // @ts-expect-error index on symbol\n return event[IN_PASSIVE_LISTENER_FLAG_KEY]\n}\n\nexport function setInPassiveListenerFlag(event: Event, value: boolean): void {\n // @ts-expect-error index on symbol\n event[IN_PASSIVE_LISTENER_FLAG_KEY] = value\n}\n\nexport function getIsTrusted(event: Event): boolean {\n // @ts-expect-error index on symbol\n return event[IS_TRUSTED_KEY]\n}\n\nexport function setIsTrusted(event: Event, isTrusted: boolean): void {\n // @ts-expect-error index on symbol\n event[IS_TRUSTED_KEY] = isTrusted\n}\n\nexport function getStopImmediatePropagationFlag(event: Event): boolean {\n // @ts-expect-error index on symbol\n return event[STOP_IMMEDIATE_PROPAGATION_FLAG_KEY]\n}\n\nexport function setStopImmediatePropagationFlag(event: Event, value: boolean): void {\n // @ts-expect-error index on symbol\n event[STOP_IMMEDIATE_PROPAGATION_FLAG_KEY] = value\n}\n\nexport function getStopPropagationFlag(event: Event): boolean {\n // @ts-expect-error index on symbol\n return event[STOP_PROPAGATION_FLAG_KEY]\n}\n\nexport function setStopPropagationFlag(event: Event, value: boolean): void {\n // @ts-expect-error index on symbol\n event[STOP_PROPAGATION_FLAG_KEY] = value\n}\n\nexport function getTarget(event: Event): EventTarget | null {\n // @ts-expect-error index on symbol\n return event[TARGET_KEY]\n}\n\nexport function setTarget(event: Event, target: EventTarget | null): void {\n // @ts-expect-error index on symbol\n event[TARGET_KEY] = target\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Internal implementation details for the `EventTarget` module.
3
+ */
4
+ import type Event from '../Event';
5
+ import type EventTarget from '../EventTarget';
6
+ export declare const EVENT_TARGET_GET_THE_PARENT_KEY: unique symbol;
7
+ export declare const INTERNAL_DISPATCH_METHOD_KEY: unique symbol;
8
+ export declare function dispatchTrustedEvent(eventTarget: EventTarget, event: Event): void;
9
+ //# sourceMappingURL=EventTargetInternals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventTargetInternals.d.ts","sourceRoot":"","sources":["../../../../src/polyfills/events/internals/EventTargetInternals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AACjC,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAA;AAG7C,eAAO,MAAM,+BAA+B,EAAE,OAAO,MAA8C,CAAA;AAEnG,eAAO,MAAM,4BAA4B,EAAE,OAAO,MAAwC,CAAA;AAE1F,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAGjF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Internal implementation details for the `EventTarget` module.
3
+ */
4
+ import { setIsTrusted } from './EventInternals';
5
+ export const EVENT_TARGET_GET_THE_PARENT_KEY = Symbol('EventTarget[get the parent]');
6
+ export const INTERNAL_DISPATCH_METHOD_KEY = Symbol('EventTarget[dispatch]');
7
+ export function dispatchTrustedEvent(eventTarget, event) {
8
+ setIsTrusted(event, true);
9
+ return eventTarget[INTERNAL_DISPATCH_METHOD_KEY](event);
10
+ }
11
+ //# sourceMappingURL=EventTargetInternals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventTargetInternals.js","sourceRoot":"","sources":["../../../../src/polyfills/events/internals/EventTargetInternals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,+BAA+B,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAA;AAEnG,MAAM,CAAC,MAAM,4BAA4B,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAA;AAE1F,MAAM,UAAU,oBAAoB,CAAC,WAAwB,EAAE,KAAY;IACzE,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACzB,OAAO,WAAW,CAAC,4BAA4B,CAAC,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC","sourcesContent":["/**\n * Internal implementation details for the `EventTarget` module.\n */\n\nimport type Event from '../Event'\nimport type EventTarget from '../EventTarget'\nimport { setIsTrusted } from './EventInternals'\n\nexport const EVENT_TARGET_GET_THE_PARENT_KEY: unique symbol = Symbol('EventTarget[get the parent]')\n\nexport const INTERNAL_DISPATCH_METHOD_KEY: unique symbol = Symbol('EventTarget[dispatch]')\n\nexport function dispatchTrustedEvent(eventTarget: EventTarget, event: Event): void {\n setIsTrusted(event, true)\n return eventTarget[INTERNAL_DISPATCH_METHOD_KEY](event)\n}\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ type CloneFn<T extends object> = (value: T) => T;
8
+ /**
9
+ * Marks the given object or instances of the given class as platform objects.
10
+ *
11
+ * Optionally, it sets the clone function for that platform object, which is a
12
+ * simplification of the serializable attribute of the Web interface.
13
+ */
14
+ export declare function setPlatformObject<T extends object>(obj: {
15
+ prototype: unknown;
16
+ }, options?: {
17
+ clone: CloneFn<T>;
18
+ }): void;
19
+ export declare function setPlatformObject<T extends object>(obj: T, options?: {
20
+ clone: CloneFn<T>;
21
+ }): void;
22
+ /**
23
+ * Indicates if the given object is a platform object.
24
+ */
25
+ export declare function isPlatformObject<T extends object>(obj: T): boolean;
26
+ /**
27
+ * Returns the clone function for the given platform object, if it was set.
28
+ */
29
+ export declare function getPlatformObjectClone<T extends object>(obj: T): ((value: T) => T) | undefined;
30
+ export {};
31
+ //# sourceMappingURL=PlatformObjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformObjects.d.ts","sourceRoot":"","sources":["../../../src/polyfills/webidl/PlatformObjects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;AAEhD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,GAAG,EAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,EAC3B,OAAO,CAAC,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,GAC9B,IAAI,CAAA;AACP,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,GAAG,IAAI,CAAA;AAelG;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAE9F"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ const IS_PLATFORM_OBJECT_KEY = Symbol('isPlatformObject');
8
+ const CLONE_PLATFORM_OBJECT_KEY = Symbol('clonePlatformObject');
9
+ export function setPlatformObject(obj, options) {
10
+ if (typeof obj === 'function') {
11
+ ;
12
+ obj.prototype[IS_PLATFORM_OBJECT_KEY] = true;
13
+ if (options) {
14
+ ;
15
+ obj.prototype[CLONE_PLATFORM_OBJECT_KEY] = options.clone;
16
+ }
17
+ }
18
+ else {
19
+ ;
20
+ obj[IS_PLATFORM_OBJECT_KEY] = true;
21
+ if (options) {
22
+ ;
23
+ obj[CLONE_PLATFORM_OBJECT_KEY] = options.clone;
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Indicates if the given object is a platform object.
29
+ */
30
+ export function isPlatformObject(obj) {
31
+ return IS_PLATFORM_OBJECT_KEY in obj;
32
+ }
33
+ /**
34
+ * Returns the clone function for the given platform object, if it was set.
35
+ */
36
+ export function getPlatformObjectClone(obj) {
37
+ return obj[CLONE_PLATFORM_OBJECT_KEY];
38
+ }
39
+ //# sourceMappingURL=PlatformObjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformObjects.js","sourceRoot":"","sources":["../../../src/polyfills/webidl/PlatformObjects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,sBAAsB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;AACzD,MAAM,yBAAyB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAe/D,MAAM,UAAU,iBAAiB,CAAC,GAAQ,EAAE,OAAwC;IAClF,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,CAAC;QAAC,GAAG,CAAC,SAAiB,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAA;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,GAAG,CAAC,SAAiB,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;QACpE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,CAAC;QAAC,GAAW,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAA;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,GAAW,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAmB,GAAM;IACvD,OAAO,sBAAsB,IAAK,GAAW,CAAA;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAmB,GAAM;IAC7D,OAAQ,GAAW,CAAC,yBAAyB,CAAC,CAAA;AAChD,CAAC","sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst IS_PLATFORM_OBJECT_KEY = Symbol('isPlatformObject')\nconst CLONE_PLATFORM_OBJECT_KEY = Symbol('clonePlatformObject')\n\ntype CloneFn<T extends object> = (value: T) => T\n\n/**\n * Marks the given object or instances of the given class as platform objects.\n *\n * Optionally, it sets the clone function for that platform object, which is a\n * simplification of the serializable attribute of the Web interface.\n */\nexport function setPlatformObject<T extends object>(\n obj: { prototype: unknown },\n options?: { clone: CloneFn<T> }\n): void\nexport function setPlatformObject<T extends object>(obj: T, options?: { clone: CloneFn<T> }): void\nexport function setPlatformObject(obj: any, options?: { clone: (value: any) => any }): void {\n if (typeof obj === 'function') {\n ;(obj.prototype as any)[IS_PLATFORM_OBJECT_KEY] = true\n if (options) {\n ;(obj.prototype as any)[CLONE_PLATFORM_OBJECT_KEY] = options.clone\n }\n } else {\n ;(obj as any)[IS_PLATFORM_OBJECT_KEY] = true\n if (options) {\n ;(obj as any)[CLONE_PLATFORM_OBJECT_KEY] = options.clone\n }\n }\n}\n\n/**\n * Indicates if the given object is a platform object.\n */\nexport function isPlatformObject<T extends object>(obj: T): boolean {\n return IS_PLATFORM_OBJECT_KEY in (obj as any)\n}\n\n/**\n * Returns the clone function for the given platform object, if it was set.\n */\nexport function getPlatformObjectClone<T extends object>(obj: T): ((value: T) => T) | undefined {\n return (obj as any)[CLONE_PLATFORM_OBJECT_KEY]\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "3.15.0-rc.7",
3
+ "version": "3.15.0-rc.8",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "@react-navigation/elements": "*",
27
27
  "@react-navigation/native": ">=7.0.0",
28
28
  "@react-navigation/native-stack": ">=7.0.0",
29
- "@shopify/flash-list": "*",
29
+ "@shopify/flash-list": "<2.0.0",
30
30
  "@tanstack/react-query": "^5.0.0",
31
31
  "color": "^3.1.2",
32
32
  "lodash": "*",
@@ -37,7 +37,7 @@
37
37
  "react-native-device-info": "*",
38
38
  "react-native-gesture-handler": "*",
39
39
  "react-native-linear-gradient": "^2.8.3",
40
- "react-native-reanimated": "*",
40
+ "react-native-reanimated": "<4.0.0",
41
41
  "react-native-safe-area-context": ">=4.0.0",
42
42
  "react-native-svg": "*"
43
43
  },
@@ -46,7 +46,7 @@
46
46
  "@testing-library/react-hooks": "^8.0.1",
47
47
  "@types/jest": "^29.5.14",
48
48
  "@typescript-eslint/parser": "^8.32.0",
49
- "expo-module-scripts": "^4.1.6",
49
+ "expo-module-scripts": "^5.0.7",
50
50
  "fast-text-encoding": "^1.0.6",
51
51
  "jest": "^29.7.0",
52
52
  "jest-fetch-mock": "^3.0.3",
@@ -55,5 +55,5 @@
55
55
  "react-native-url-polyfill": "^2.0.0",
56
56
  "typescript": "<5.6.0"
57
57
  },
58
- "gitHead": "b0a179d60d9c6d502898b0bea6bcb7c4aaaaa7c9"
58
+ "gitHead": "98f7a5fc0b4d1fa7127a7fc4e151dc706147c29f"
59
59
  }
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Tests for Event/CustomEvent/EventTarget polyfills
3
+ */
4
+
5
+ import Event from '../polyfills/events/Event'
6
+ import EventTarget from '../polyfills/events/EventTarget'
7
+ import { CustomEvent } from '../polyfills/events/CustomEvent'
8
+
9
+ // Set up global polyfill for tests
10
+ ;(global as any).Event = Event
11
+ ;(global as any).CustomEvent = CustomEvent
12
+
13
+ describe('Event Polyfill', () => {
14
+ describe('Event', () => {
15
+ it('should create a basic event', () => {
16
+ const event = new Event('test')
17
+ expect(event.type).toBe('test')
18
+ expect(event.bubbles).toBe(false)
19
+ expect(event.cancelable).toBe(false)
20
+ expect(event.composed).toBe(false)
21
+ expect(event.defaultPrevented).toBe(false)
22
+ expect(event.isTrusted).toBe(false)
23
+ expect(event.eventPhase).toBe(Event.NONE)
24
+ expect(typeof event.timeStamp).toBe('number')
25
+ })
26
+
27
+ it('should create an event with options', () => {
28
+ const event = new Event('test', {
29
+ bubbles: true,
30
+ cancelable: true,
31
+ composed: true,
32
+ })
33
+ expect(event.bubbles).toBe(true)
34
+ expect(event.cancelable).toBe(true)
35
+ expect(event.composed).toBe(true)
36
+ })
37
+
38
+ it('should have correct phase constants', () => {
39
+ expect(Event.NONE).toBe(0)
40
+ expect(Event.CAPTURING_PHASE).toBe(1)
41
+ expect(Event.AT_TARGET).toBe(2)
42
+ expect(Event.BUBBLING_PHASE).toBe(3)
43
+ })
44
+
45
+ it('should prevent default when cancelable', () => {
46
+ const event = new Event('test', { cancelable: true })
47
+ expect(event.defaultPrevented).toBe(false)
48
+ event.preventDefault()
49
+ expect(event.defaultPrevented).toBe(true)
50
+ })
51
+
52
+ it('should not prevent default when not cancelable', () => {
53
+ const event = new Event('test', { cancelable: false })
54
+ event.preventDefault()
55
+ expect(event.defaultPrevented).toBe(false)
56
+ })
57
+
58
+ it('should support stopPropagation', () => {
59
+ const event = new Event('test')
60
+ // No error thrown - internal flags are set
61
+ event.stopPropagation()
62
+ event.stopImmediatePropagation()
63
+ })
64
+ })
65
+
66
+ describe('CustomEvent', () => {
67
+ it('should create a custom event with detail', () => {
68
+ const detail = { foo: 'bar', count: 42 }
69
+ const event = new CustomEvent('custom', { detail })
70
+ expect(event.type).toBe('custom')
71
+ expect(event.detail).toEqual(detail)
72
+ })
73
+
74
+ it('should inherit from Event', () => {
75
+ const event = new CustomEvent('custom', {
76
+ bubbles: true,
77
+ cancelable: true,
78
+ detail: 'test',
79
+ })
80
+ expect(event instanceof Event).toBe(true)
81
+ expect(event.bubbles).toBe(true)
82
+ expect(event.cancelable).toBe(true)
83
+ })
84
+
85
+ it('should handle undefined detail', () => {
86
+ const event = new CustomEvent('custom')
87
+ expect(event.detail).toBeUndefined()
88
+ })
89
+ })
90
+
91
+ describe('EventTarget', () => {
92
+ let target: EventTarget
93
+
94
+ beforeEach(() => {
95
+ target = new EventTarget()
96
+ })
97
+
98
+ it('should add and remove event listeners', () => {
99
+ const listener = jest.fn()
100
+ target.addEventListener('test', listener)
101
+
102
+ const event = new Event('test')
103
+ const result = target.dispatchEvent(event)
104
+
105
+ expect(listener).toHaveBeenCalledWith(event)
106
+ expect(listener).toHaveBeenCalledTimes(1)
107
+ expect(result).toBe(true) // not prevented
108
+
109
+ target.removeEventListener('test', listener)
110
+ target.dispatchEvent(new Event('test'))
111
+ expect(listener).toHaveBeenCalledTimes(1) // not called again
112
+ })
113
+
114
+ it('should handle multiple listeners for the same event', () => {
115
+ const listener1 = jest.fn()
116
+ const listener2 = jest.fn()
117
+
118
+ target.addEventListener('test', listener1)
119
+ target.addEventListener('test', listener2)
120
+
121
+ target.dispatchEvent(new Event('test'))
122
+
123
+ expect(listener1).toHaveBeenCalledTimes(1)
124
+ expect(listener2).toHaveBeenCalledTimes(1)
125
+ })
126
+
127
+ it('should handle once option', () => {
128
+ const listener = jest.fn()
129
+ target.addEventListener('test', listener, { once: true })
130
+
131
+ target.dispatchEvent(new Event('test'))
132
+ target.dispatchEvent(new Event('test'))
133
+
134
+ expect(listener).toHaveBeenCalledTimes(1)
135
+ })
136
+
137
+ it('should handle capture option', () => {
138
+ const listener = jest.fn()
139
+ target.addEventListener('test', listener, { capture: true })
140
+
141
+ target.dispatchEvent(new Event('test'))
142
+ expect(listener).toHaveBeenCalledTimes(1)
143
+
144
+ target.removeEventListener('test', listener, { capture: true })
145
+ target.dispatchEvent(new Event('test'))
146
+ expect(listener).toHaveBeenCalledTimes(1)
147
+ })
148
+
149
+ it('should handle passive option', () => {
150
+ const listener = jest.fn()
151
+ target.addEventListener('test', listener, { passive: true })
152
+
153
+ target.dispatchEvent(new Event('test'))
154
+ expect(listener).toHaveBeenCalledTimes(1)
155
+ })
156
+
157
+ it('should handle object listeners with handleEvent', () => {
158
+ const listener = {
159
+ handleEvent: jest.fn(),
160
+ }
161
+
162
+ target.addEventListener('test', listener)
163
+ target.dispatchEvent(new Event('test'))
164
+
165
+ expect(listener.handleEvent).toHaveBeenCalledTimes(1)
166
+ })
167
+
168
+ it('should return false when event is prevented', () => {
169
+ const listener = (event: Event) => {
170
+ event.preventDefault()
171
+ }
172
+
173
+ target.addEventListener('test', listener)
174
+ const event = new Event('test', { cancelable: true })
175
+ const result = target.dispatchEvent(event)
176
+
177
+ expect(result).toBe(false)
178
+ expect(event.defaultPrevented).toBe(true)
179
+ })
180
+
181
+ it('should set event properties during dispatch', () => {
182
+ let capturedEvent: Event | null = null
183
+
184
+ const listener = (event: Event) => {
185
+ capturedEvent = event
186
+ expect(event.target).toBe(target)
187
+ expect(event.currentTarget).toBe(target)
188
+ expect(event.eventPhase).toBe(Event.AT_TARGET)
189
+ }
190
+
191
+ target.addEventListener('test', listener)
192
+ target.dispatchEvent(new Event('test'))
193
+
194
+ expect(capturedEvent).not.toBeNull()
195
+ // After dispatch, these should be reset
196
+ expect(capturedEvent!.currentTarget).toBeNull()
197
+ expect(capturedEvent!.eventPhase).toBe(Event.NONE)
198
+ })
199
+
200
+ it('should handle bubbling events', () => {
201
+ const listener = jest.fn()
202
+ target.addEventListener('test', listener)
203
+
204
+ const bubblingEvent = new Event('test', { bubbles: true })
205
+ target.dispatchEvent(bubblingEvent)
206
+
207
+ expect(listener).toHaveBeenCalledWith(bubblingEvent)
208
+ })
209
+
210
+ it('should handle error in listener gracefully', () => {
211
+ const errorListener = () => {
212
+ throw new Error('Test error')
213
+ }
214
+ const normalListener = jest.fn()
215
+
216
+ // Mock console.error to avoid test output noise
217
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation()
218
+
219
+ target.addEventListener('test', errorListener)
220
+ target.addEventListener('test', normalListener)
221
+
222
+ target.dispatchEvent(new Event('test'))
223
+
224
+ expect(normalListener).toHaveBeenCalledTimes(1)
225
+ expect(consoleErrorSpy).toHaveBeenCalled()
226
+
227
+ consoleErrorSpy.mockRestore()
228
+ })
229
+
230
+ it('should ignore null listeners', () => {
231
+ // Should not throw
232
+ target.addEventListener('test', null)
233
+ target.removeEventListener('test', null)
234
+ target.dispatchEvent(new Event('test'))
235
+ })
236
+
237
+ it('should handle composed path', () => {
238
+ let composedPath: readonly EventTarget[] | null = null
239
+
240
+ const listener = (event: Event) => {
241
+ composedPath = event.composedPath()
242
+ }
243
+
244
+ target.addEventListener('test', listener)
245
+ target.dispatchEvent(new Event('test'))
246
+
247
+ expect(composedPath).toEqual([target])
248
+ })
249
+
250
+ it('should prevent duplicate listeners', () => {
251
+ const listener = jest.fn()
252
+
253
+ target.addEventListener('test', listener)
254
+ target.addEventListener('test', listener) // Same listener
255
+
256
+ target.dispatchEvent(new Event('test'))
257
+ expect(listener).toHaveBeenCalledTimes(1) // Only called once
258
+ })
259
+ })
260
+
261
+ describe('Event flow integration', () => {
262
+ it('should work with CustomEvent dispatch', () => {
263
+ const target = new EventTarget()
264
+ const listener = jest.fn()
265
+ const detail = { message: 'hello' }
266
+
267
+ target.addEventListener('custom', listener)
268
+
269
+ const event = new CustomEvent('custom', {
270
+ detail,
271
+ bubbles: true,
272
+ cancelable: true,
273
+ })
274
+
275
+ const result = target.dispatchEvent(event)
276
+
277
+ expect(listener).toHaveBeenCalledWith(event)
278
+ expect(listener.mock.calls[0][0].detail).toEqual(detail)
279
+ expect(result).toBe(true)
280
+ })
281
+
282
+ it('should handle stopImmediatePropagation', () => {
283
+ const target = new EventTarget()
284
+ const listener1 = jest.fn((event: Event) => {
285
+ event.stopImmediatePropagation()
286
+ })
287
+ const listener2 = jest.fn()
288
+
289
+ target.addEventListener('test', listener1)
290
+ target.addEventListener('test', listener2)
291
+
292
+ target.dispatchEvent(new Event('test'))
293
+
294
+ expect(listener1).toHaveBeenCalledTimes(1)
295
+ expect(listener2).toHaveBeenCalledTimes(0) // Stopped
296
+ })
297
+ })
298
+
299
+ describe('Global polyfill installation', () => {
300
+ it('should make Event available globally', () => {
301
+ // This tests that our polyfill setup works
302
+ expect(typeof (global as any).Event).toBe('function')
303
+ expect(typeof (global as any).CustomEvent).toBe('function')
304
+
305
+ const globalEvent = new (global as any).Event('test')
306
+ expect(globalEvent.type).toBe('test')
307
+
308
+ const globalCustomEvent = new (global as any).CustomEvent('custom', {
309
+ detail: 'test',
310
+ })
311
+ expect(globalCustomEvent.detail).toBe('test')
312
+ })
313
+ })
314
+ })
package/src/index.tsx CHANGED
@@ -8,3 +8,5 @@ export * from './types'
8
8
  export { platformFontWeightBold, Session, TemporaryDefaultColorsType, Uri } from './utils'
9
9
  export * from './utils/client'
10
10
  export * from './utils/native_adapters'
11
+ export { default as Event } from './polyfills/events/Event'
12
+ export { CustomEvent } from './polyfills/events/CustomEvent'