diff --git a/package.json b/package.json index b86720d95..e0d5eddee 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@vue/compiler-sfc": "3.0.11", "babel-jest": "^26.6.3", "babel-preset-jest": "^26.6.2", - "dom-event-types": "^1.0.0", "husky": "^6.0.0", "jest": "25.5.4", "jsdom": "^16.5.3", diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 6eee2b653..1313ef329 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -1,7 +1,8 @@ import { textContent } from './utils' -import { createDOMEvent } from './createDomEvent' import type { TriggerOptions } from './createDomEvent' import { nextTick } from 'vue' +import { createDOMEvent } from './createDomEvent' +import { DomEventName } from './constants/dom-event-types' export default class BaseWrapper { private readonly wrapperElement: ElementType @@ -44,6 +45,31 @@ export default class BaseWrapper { return true } + protected isDisabled = () => { + const validTagsToBeDisabled = [ + 'BUTTON', + 'COMMAND', + 'FIELDSET', + 'KEYGEN', + 'OPTGROUP', + 'OPTION', + 'SELECT', + 'TEXTAREA', + 'INPUT' + ] + const hasDisabledAttribute = this.attributes().disabled !== undefined + const elementCanBeDisabled = validTagsToBeDisabled.includes( + this.element.tagName + ) + + return hasDisabledAttribute && elementCanBeDisabled + } + + async trigger( + eventString: DomEventName, + options?: TriggerOptions + ): Promise + async trigger(eventString: string, options?: TriggerOptions): Promise async trigger(eventString: string, options?: TriggerOptions) { if (options && options['target']) { throw Error( @@ -53,27 +79,7 @@ export default class BaseWrapper { ) } - const isDisabled = () => { - const validTagsToBeDisabled = [ - 'BUTTON', - 'COMMAND', - 'FIELDSET', - 'KEYGEN', - 'OPTGROUP', - 'OPTION', - 'SELECT', - 'TEXTAREA', - 'INPUT' - ] - const hasDisabledAttribute = this.attributes().disabled !== undefined - const elementCanBeDisabled = validTagsToBeDisabled.includes( - this.element.tagName - ) - - return hasDisabledAttribute && elementCanBeDisabled - } - - if (this.element && !isDisabled()) { + if (this.element && !this.isDisabled()) { const event = createDOMEvent(eventString, options) this.element.dispatchEvent(event) } diff --git a/src/constants/dom-event-types.ts b/src/constants/dom-event-types.ts new file mode 100644 index 000000000..c9f273e8f --- /dev/null +++ b/src/constants/dom-event-types.ts @@ -0,0 +1,934 @@ +export type EventInterface = + | 'AnimationEvent' + | 'AudioProcessingEvent' + | 'BeforeInputEvent' + | 'BeforeUnloadEvent' + | 'BlobEvent' + | 'CSSFontFaceLoadEvent' + | 'ClipboardEvent' + | 'CloseEvent' + | 'CompositionEvent' + | 'CustomEvent' + | 'DOMTransactionEvent' + | 'DeviceLightEvent' + | 'DeviceMotionEvent' + | 'DeviceOrientationEvent' + | 'DeviceProximityEvent' + | 'DragEvent' + | 'EditingBeforeInputEvent' + | 'ErrorEvent' + | 'Event' + | 'FetchEvent' + | 'FocusEvent' + | 'GamepadEvent' + | 'HashChangeEvent' + | 'IDBVersionChangeEvent' + | 'InputEvent' + | 'KeyboardEvent' + | 'MediaStreamEvent' + | 'MessageEvent' + | 'MouseEvent' + | 'MutationEvent' + | 'OfflineAudioCompletionEvent' + | 'OverconstrainedError' + | 'PageTransitionEvent' + | 'PaymentRequestUpdateEvent' + | 'PointerEvent' + | 'PopStateEvent' + | 'ProgressEvent' + | 'RTCDataChannelEvent' + | 'RTCIdentityErrorEvent' + | 'RTCIdentityEvent' + | 'RTCPeerConnectionIceEvent' + | 'RelatedEvent' + | 'SVGEvent' + | 'SVGZoomEvent' + | 'SensorEvent' + | 'StorageEvent' + | 'TimeEvent' + | 'TouchEvent' + | 'TrackEvent' + | 'TransitionEvent' + | 'UIEvent' + | 'UserProximityEvent' + | 'WebGLContextEvent' + | 'WheelEvent' + +export interface DomEvent { + eventInterface: EventInterface | string + bubbles: boolean + cancelable: boolean +} + +export type DomEventName = keyof typeof domEvents + +const domEvents = { + abort: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + afterprint: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + animationend: { + eventInterface: 'AnimationEvent', + bubbles: true, + cancelable: false + }, + animationiteration: { + eventInterface: 'AnimationEvent', + bubbles: true, + cancelable: false + }, + animationstart: { + eventInterface: 'AnimationEvent', + bubbles: true, + cancelable: false + }, + appinstalled: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + /** + * @deprecated + */ + audioprocess: { + eventInterface: 'AudioProcessingEvent', + bubbles: false, + cancelable: false + }, + audioend: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + audiostart: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + beforeprint: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + beforeunload: { + eventInterface: 'BeforeUnloadEvent', + bubbles: false, + cancelable: true + }, + beginEvent: { + eventInterface: 'TimeEvent', + bubbles: false, + cancelable: false + }, + blur: { + eventInterface: 'FocusEvent', + bubbles: false, + cancelable: false + }, + boundary: { + eventInterface: 'SpeechSynthesisEvent', + bubbles: false, + cancelable: false + }, + cached: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + canplay: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + canplaythrough: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + change: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + chargingchange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + chargingtimechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + checking: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + click: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + close: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + complete: { + eventInterface: 'OfflineAudioCompletionEvent', + bubbles: false, + cancelable: false + }, + compositionend: { + eventInterface: 'CompositionEvent', + bubbles: true, + cancelable: true + }, + compositionstart: { + eventInterface: 'CompositionEvent', + bubbles: true, + cancelable: true + }, + compositionupdate: { + eventInterface: 'CompositionEvent', + bubbles: true, + cancelable: false + }, + contextmenu: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + copy: { + eventInterface: 'ClipboardEvent', + bubbles: true, + cancelable: true + }, + cut: { + eventInterface: 'ClipboardEvent', + bubbles: true, + cancelable: true + }, + dblclick: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + devicechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + devicelight: { + eventInterface: 'DeviceLightEvent', + bubbles: false, + cancelable: false + }, + devicemotion: { + eventInterface: 'DeviceMotionEvent', + bubbles: false, + cancelable: false + }, + deviceorientation: { + eventInterface: 'DeviceOrientationEvent', + bubbles: false, + cancelable: false + }, + deviceproximity: { + eventInterface: 'DeviceProximityEvent', + bubbles: false, + cancelable: false + }, + dischargingtimechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + DOMActivate: { + eventInterface: 'UIEvent', + bubbles: true, + cancelable: true + }, + DOMAttributeNameChanged: { + eventInterface: 'MutationNameEvent', + bubbles: true, + cancelable: true + }, + DOMAttrModified: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + DOMCharacterDataModified: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + DOMContentLoaded: { + eventInterface: 'Event', + bubbles: true, + cancelable: true + }, + DOMElementNameChanged: { + eventInterface: 'MutationNameEvent', + bubbles: true, + cancelable: true + }, + DOMFocusIn: { + eventInterface: 'FocusEvent', + bubbles: true, + cancelable: true + }, + DOMFocusOut: { + eventInterface: 'FocusEvent', + bubbles: true, + cancelable: true + }, + DOMNodeInserted: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + DOMNodeInsertedIntoDocument: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + DOMNodeRemoved: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + DOMNodeRemovedFromDocument: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: true + }, + /** + * @deprecated + */ + DOMSubtreeModified: { + eventInterface: 'MutationEvent', + bubbles: true, + cancelable: false + }, + downloading: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + drag: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: true + }, + dragend: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: false + }, + dragenter: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: true + }, + dragleave: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: false + }, + dragover: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: true + }, + dragstart: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: true + }, + drop: { + eventInterface: 'DragEvent', + bubbles: true, + cancelable: true + }, + durationchange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + emptied: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + end: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + ended: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + endEvent: { + eventInterface: 'TimeEvent', + bubbles: false, + cancelable: false + }, + error: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + focus: { + eventInterface: 'FocusEvent', + bubbles: false, + cancelable: false + }, + focusin: { + eventInterface: 'FocusEvent', + bubbles: true, + cancelable: false + }, + focusout: { + eventInterface: 'FocusEvent', + bubbles: true, + cancelable: false + }, + fullscreenchange: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + fullscreenerror: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + gamepadconnected: { + eventInterface: 'GamepadEvent', + bubbles: false, + cancelable: false + }, + gamepaddisconnected: { + eventInterface: 'GamepadEvent', + bubbles: false, + cancelable: false + }, + gotpointercapture: { + eventInterface: 'PointerEvent', + bubbles: false, + cancelable: false + }, + hashchange: { + eventInterface: 'HashChangeEvent', + bubbles: true, + cancelable: false + }, + lostpointercapture: { + eventInterface: 'PointerEvent', + bubbles: false, + cancelable: false + }, + input: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + invalid: { + eventInterface: 'Event', + cancelable: true, + bubbles: false + }, + keydown: { + eventInterface: 'KeyboardEvent', + bubbles: true, + cancelable: true + }, + keypress: { + eventInterface: 'KeyboardEvent', + bubbles: true, + cancelable: true + }, + keyup: { + eventInterface: 'KeyboardEvent', + bubbles: true, + cancelable: true + }, + languagechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + levelchange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + load: { + eventInterface: 'UIEvent', + bubbles: false, + cancelable: false + }, + loadeddata: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + loadedmetadata: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + loadend: { + eventInterface: 'ProgressEvent', + bubbles: false, + cancelable: false + }, + loadstart: { + eventInterface: 'ProgressEvent', + bubbles: false, + cancelable: false + }, + mark: { + eventInterface: 'SpeechSynthesisEvent', + bubbles: false, + cancelable: false + }, + message: { + eventInterface: 'MessageEvent', + bubbles: false, + cancelable: false + }, + messageerror: { + eventInterface: 'MessageEvent', + bubbles: false, + cancelable: false + }, + mousedown: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + mouseenter: { + eventInterface: 'MouseEvent', + bubbles: false, + cancelable: false + }, + mouseleave: { + eventInterface: 'MouseEvent', + bubbles: false, + cancelable: false + }, + mousemove: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + mouseout: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + mouseover: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + mouseup: { + eventInterface: 'MouseEvent', + bubbles: true, + cancelable: true + }, + nomatch: { + eventInterface: 'SpeechRecognitionEvent', + bubbles: false, + cancelable: false + }, + notificationclick: { + eventInterface: 'NotificationEvent', + bubbles: false, + cancelable: false + }, + noupdate: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + obsolete: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + offline: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + online: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + open: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + orientationchange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + pagehide: { + eventInterface: 'PageTransitionEvent', + bubbles: false, + cancelable: false + }, + pageshow: { + eventInterface: 'PageTransitionEvent', + bubbles: false, + cancelable: false + }, + paste: { + eventInterface: 'ClipboardEvent', + bubbles: true, + cancelable: true + }, + pause: { + eventInterface: 'SpeechSynthesisEvent', + bubbles: false, + cancelable: false + }, + pointercancel: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: false + }, + pointerdown: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: true + }, + pointerenter: { + eventInterface: 'PointerEvent', + bubbles: false, + cancelable: false + }, + pointerleave: { + eventInterface: 'PointerEvent', + bubbles: false, + cancelable: false + }, + pointerlockchange: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + pointerlockerror: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + pointermove: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: true + }, + pointerout: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: true + }, + pointerover: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: true + }, + pointerup: { + eventInterface: 'PointerEvent', + bubbles: true, + cancelable: true + }, + play: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + playing: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + popstate: { + eventInterface: 'PopStateEvent', + bubbles: true, + cancelable: false + }, + progress: { + eventInterface: 'ProgressEvent', + bubbles: false, + cancelable: false + }, + push: { + eventInterface: 'PushEvent', + bubbles: false, + cancelable: false + }, + pushsubscriptionchange: { + eventInterface: 'PushEvent', + bubbles: false, + cancelable: false + }, + ratechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + readystatechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + repeatEvent: { + eventInterface: 'TimeEvent', + bubbles: false, + cancelable: false + }, + reset: { + eventInterface: 'Event', + bubbles: true, + cancelable: true + }, + resize: { + eventInterface: 'UIEvent', + bubbles: false, + cancelable: false + }, + resourcetimingbufferfull: { + eventInterface: 'Performance', + bubbles: true, + cancelable: true + }, + result: { + eventInterface: 'SpeechRecognitionEvent', + bubbles: false, + cancelable: false + }, + resume: { + eventInterface: 'SpeechSynthesisEvent', + bubbles: false, + cancelable: false + }, + scroll: { + eventInterface: 'UIEvent', + bubbles: false, + cancelable: false + }, + seeked: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + seeking: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + select: { + eventInterface: 'UIEvent', + bubbles: true, + cancelable: false + }, + selectstart: { + eventInterface: 'Event', + bubbles: true, + cancelable: true + }, + selectionchange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + show: { + eventInterface: 'MouseEvent', + bubbles: false, + cancelable: false + }, + slotchange: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + soundend: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + soundstart: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + speechend: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + speechstart: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + stalled: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + start: { + eventInterface: 'SpeechSynthesisEvent', + bubbles: false, + cancelable: false + }, + storage: { + eventInterface: 'StorageEvent', + bubbles: false, + cancelable: false + }, + submit: { + eventInterface: 'Event', + bubbles: true, + cancelable: true + }, + success: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + suspend: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + SVGAbort: { + eventInterface: 'SVGEvent', + bubbles: true, + cancelable: false + }, + SVGError: { + eventInterface: 'SVGEvent', + bubbles: true, + cancelable: false + }, + SVGLoad: { + eventInterface: 'SVGEvent', + bubbles: false, + cancelable: false + }, + SVGResize: { + eventInterface: 'SVGEvent', + bubbles: true, + cancelable: false + }, + SVGScroll: { + eventInterface: 'SVGEvent', + bubbles: true, + cancelable: false + }, + SVGUnload: { + eventInterface: 'SVGEvent', + bubbles: false, + cancelable: false + }, + SVGZoom: { + eventInterface: 'SVGZoomEvent', + bubbles: true, + cancelable: false + }, + timeout: { + eventInterface: 'ProgressEvent', + bubbles: false, + cancelable: false + }, + timeupdate: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + touchcancel: { + eventInterface: 'TouchEvent', + bubbles: true, + cancelable: false + }, + touchend: { + eventInterface: 'TouchEvent', + bubbles: true, + cancelable: true + }, + touchmove: { + eventInterface: 'TouchEvent', + bubbles: true, + cancelable: true + }, + touchstart: { + eventInterface: 'TouchEvent', + bubbles: true, + cancelable: true + }, + transitionend: { + eventInterface: 'TransitionEvent', + bubbles: true, + cancelable: true + }, + unload: { + eventInterface: 'UIEvent', + bubbles: false, + cancelable: false + }, + updateready: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + userproximity: { + eventInterface: 'UserProximityEvent', + bubbles: false, + cancelable: false + }, + voiceschanged: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + visibilitychange: { + eventInterface: 'Event', + bubbles: true, + cancelable: false + }, + volumechange: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + waiting: { + eventInterface: 'Event', + bubbles: false, + cancelable: false + }, + wheel: { + eventInterface: 'WheelEvent', + bubbles: true, + cancelable: true + } +} as const + +export default domEvents as Record diff --git a/src/createDomEvent.ts b/src/createDomEvent.ts index e2b22ed56..f916b364d 100644 --- a/src/createDomEvent.ts +++ b/src/createDomEvent.ts @@ -1,6 +1,8 @@ -// @ts-ignore todo - No DefinitelyTyped package exists for this -import eventTypes from 'dom-event-types' -import { Key } from 'readline' +import domEvents, { + DomEvent, + DomEventName, + EventInterface +} from './constants/dom-event-types' const keyCodesByKeyName = { backspace: 8, @@ -38,7 +40,7 @@ interface TriggerOptions { } interface EventParams { - eventType: string + eventType: DomEventName | string modifiers: KeyName[] options?: TriggerOptions } @@ -102,7 +104,7 @@ function getEventProperties(eventParams: EventParams) { } } - const meta = eventTypes[eventType] || { + const meta: DomEvent = domEvents[eventType as DomEventName] || { eventInterface: 'Event', cancelable: true, bubbles: true @@ -146,7 +148,7 @@ function createEvent(eventParams: EventParams) { const { eventProperties, meta, eventType } = getEventProperties(eventParams) // user defined eventInterface - const metaEventInterface = window[meta.eventInterface] + const metaEventInterface: Event = window[meta.eventInterface as keyof Window] const SupportedEventInterface = typeof metaEventInterface === 'function' ? metaEventInterface : window.Event @@ -159,7 +161,10 @@ function createEvent(eventParams: EventParams) { ) } -function createDOMEvent(eventString: String, options?: TriggerOptions) { +function createDOMEvent( + eventString: DomEventName | string, + options?: TriggerOptions +) { // split eventString like `keydown.ctrl.shift.c` into `keydown` and array of modifiers const [eventType, ...modifiers] = eventString.split('.') diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index c6ceb4cbf..06b9ad3fd 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -1,10 +1,10 @@ import { ComponentPublicInstance, nextTick, App } from 'vue' import { ShapeFlags } from '@vue/shared' // @ts-ignore todo - No DefinitelyTyped package exists for this -import eventTypes from 'dom-event-types' import pretty from 'pretty' import { config } from './config' +import domEvents from './constants/dom-event-types' import { DOMWrapper } from './domWrapper' import { FindAllComponentsSelector, @@ -66,7 +66,7 @@ export class VueWrapper Object.keys(vm.$options.emits) : [] const element = this.element - for (let eventName of Object.keys(eventTypes)) { + for (let eventName of Object.keys(domEvents)) { // if a component includes events in 'emits' with the same name as native // events, the native events with that name should be ignored // @see https://github.com/vuejs/rfcs/blob/master/active-rfcs/0030-emits-option.md#fallthrough-control diff --git a/yarn.lock b/yarn.lock index ebc9c698d..55a1968d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2635,11 +2635,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dom-event-types@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" - integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ== - domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"