From aad4ebe165e48a10e7f2de69adda281218d31139 Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Tue, 27 Apr 2021 11:25:01 +0100 Subject: [PATCH 1/9] feat: added typehint to the trigger method --- package.json | 1 - src/baseWrapper.ts | 3 +- src/constants/dom-event-types.ts | 935 +++++++++++++++++++++++++++++++ src/createDomEvent.ts | 16 +- src/vueWrapper.ts | 4 +- yarn.lock | 5 - 6 files changed, 948 insertions(+), 16 deletions(-) create mode 100644 src/constants/dom-event-types.ts 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..11d9abd5f 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -2,6 +2,7 @@ import { textContent } from './utils' import { createDOMEvent } from './createDomEvent' import type { TriggerOptions } from './createDomEvent' import { nextTick } from 'vue' +import { DomEventName } from './constants/dom-event-types' export default class BaseWrapper { private readonly wrapperElement: ElementType @@ -44,7 +45,7 @@ export default class BaseWrapper { return true } - async trigger(eventString: string, options?: TriggerOptions) { + async trigger(eventString: DomEventName | string, options?: TriggerOptions) { if (options && options['target']) { throw Error( `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + diff --git a/src/constants/dom-event-types.ts b/src/constants/dom-event-types.ts new file mode 100644 index 000000000..65040c5eb --- /dev/null +++ b/src/constants/dom-event-types.ts @@ -0,0 +1,935 @@ +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..b6aa42add 100644 --- a/src/createDomEvent.ts +++ b/src/createDomEvent.ts @@ -1,6 +1,4 @@ -// @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 +36,7 @@ interface TriggerOptions { } interface EventParams { - eventType: string + eventType: DomEventName | string modifiers: KeyName[] options?: TriggerOptions } @@ -102,7 +100,7 @@ function getEventProperties(eventParams: EventParams) { } } - const meta = eventTypes[eventType] || { + const meta: DomEvent = domEvents[eventType as DomEventName] || { eventInterface: 'Event', cancelable: true, bubbles: true @@ -146,7 +144,8 @@ function createEvent(eventParams: EventParams) { const { eventProperties, meta, eventType } = getEventProperties(eventParams) // user defined eventInterface - const metaEventInterface = window[meta.eventInterface] + // @ts-expect-error + const metaEventInterface: Event = window[meta.eventInterface] const SupportedEventInterface = typeof metaEventInterface === 'function' ? metaEventInterface : window.Event @@ -159,7 +158,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" From 9db3431e24eb1d6d36459d31ccded50ad18cbd2a Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Tue, 27 Apr 2021 11:29:06 +0100 Subject: [PATCH 2/9] chore: fixed linting issues --- src/constants/dom-event-types.ts | 109 +++++++++++++++---------------- src/createDomEvent.ts | 6 +- 2 files changed, 59 insertions(+), 56 deletions(-) diff --git a/src/constants/dom-event-types.ts b/src/constants/dom-event-types.ts index 65040c5eb..c9f273e8f 100644 --- a/src/constants/dom-event-types.ts +++ b/src/constants/dom-event-types.ts @@ -1,59 +1,58 @@ 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' - + | '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 diff --git a/src/createDomEvent.ts b/src/createDomEvent.ts index b6aa42add..0dc261e67 100644 --- a/src/createDomEvent.ts +++ b/src/createDomEvent.ts @@ -1,4 +1,8 @@ -import domEvents, { DomEvent, DomEventName, EventInterface } from './constants/dom-event-types' +import domEvents, { + DomEvent, + DomEventName, + EventInterface +} from './constants/dom-event-types' const keyCodesByKeyName = { backspace: 8, From 2d94599aa0097661f385227e4eeca3ab9bedba2d Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Tue, 27 Apr 2021 13:00:01 +0100 Subject: [PATCH 3/9] fix: updated to use correct type cast --- src/createDomEvent.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/createDomEvent.ts b/src/createDomEvent.ts index 0dc261e67..f916b364d 100644 --- a/src/createDomEvent.ts +++ b/src/createDomEvent.ts @@ -148,8 +148,7 @@ function createEvent(eventParams: EventParams) { const { eventProperties, meta, eventType } = getEventProperties(eventParams) // user defined eventInterface - // @ts-expect-error - const metaEventInterface: Event = window[meta.eventInterface] + const metaEventInterface: Event = window[meta.eventInterface as keyof Window] const SupportedEventInterface = typeof metaEventInterface === 'function' ? metaEventInterface : window.Event From 9bba3822e3ad334a5ae08b9a625852407f081a62 Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Sat, 1 May 2021 20:45:41 +0100 Subject: [PATCH 4/9] feat: Added typings --- src/baseWrapper.ts | 60 +++++++++++++++++-------------------------- src/domWrapper.ts | 20 +++++++++++++++ src/vueWrapper.ts | 21 +++++++++++++++ tests/emit.spec.ts | 2 +- tests/props.spec.ts | 4 +-- tests/trigger.spec.ts | 7 ++--- 6 files changed, 71 insertions(+), 43 deletions(-) diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 11d9abd5f..342b022b9 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -1,10 +1,8 @@ import { textContent } from './utils' -import { createDOMEvent } from './createDomEvent' import type { TriggerOptions } from './createDomEvent' import { nextTick } from 'vue' -import { DomEventName } from './constants/dom-event-types' -export default class BaseWrapper { +export default abstract class BaseWrapper { private readonly wrapperElement: ElementType get element() { @@ -45,40 +43,28 @@ export default class BaseWrapper { return true } - async trigger(eventString: DomEventName | string, options?: TriggerOptions) { - if (options && options['target']) { - throw Error( - `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + - `of the docs for more details—` + - `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` - ) - } - - 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 - } + 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 + ) - if (this.element && !isDisabled()) { - const event = createDOMEvent(eventString, options) - this.element.dispatchEvent(event) - } - - return nextTick() + return hasDisabledAttribute && elementCanBeDisabled } + + abstract trigger( + eventString: string, + options?: TriggerOptions + ): ReturnType } diff --git a/src/domWrapper.ts b/src/domWrapper.ts index 9aa2958b9..a9b4287d7 100644 --- a/src/domWrapper.ts +++ b/src/domWrapper.ts @@ -3,6 +3,9 @@ import { isElementVisible } from './utils/isElementVisible' import BaseWrapper from './baseWrapper' import { createWrapperError } from './errorWrapper' import WrapperLike from './interfaces/wrapperLike' +import { DomEventName } from './constants/dom-event-types' +import { createDOMEvent, TriggerOptions } from './createDomEvent' +import { nextTick } from 'vue' export class DOMWrapper extends BaseWrapper @@ -137,4 +140,21 @@ export class DOMWrapper return new DOMWrapper(parentElement).trigger('change') } + + async trigger(eventString: DomEventName | string, options?: TriggerOptions) { + if (options && options['target']) { + throw Error( + `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + + `of the docs for more details—` + + `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` + ) + } + + if (this.element && !this.isDisabled()) { + const event = createDOMEvent(eventString, options) + this.element.dispatchEvent(event) + } + + return nextTick() + } } diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 06b9ad3fd..913cb8c2e 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -17,6 +17,7 @@ import { mergeDeep } from './utils' import { emitted, recordEvent } from './emit' import BaseWrapper from './baseWrapper' import WrapperLike from './interfaces/wrapperLike' +import { createDOMEvent, TriggerOptions } from './createDomEvent' export class VueWrapper extends BaseWrapper @@ -257,6 +258,26 @@ export class VueWrapper this.__app.unmount() } + + async trigger( + eventString: Parameters[0], + options?: TriggerOptions + ) { + if (options && options['target']) { + throw Error( + `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + + `of the docs for more details—` + + `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` + ) + } + + if (this.element && !this.isDisabled()) { + const event = createDOMEvent(eventString, options) + this.element.dispatchEvent(event) + } + + return nextTick() + } } export function createWrapper( diff --git a/tests/emit.spec.ts b/tests/emit.spec.ts index 9862a3a90..d73e75cd5 100644 --- a/tests/emit.spec.ts +++ b/tests/emit.spec.ts @@ -316,7 +316,7 @@ describe('emitted', () => { }) const wrapper = mount(Foo) - await wrapper.trigger('click') + await wrapper.get('div').trigger('click') expect(wrapper.emitted('foo')).toHaveLength(1) }) }) diff --git a/tests/props.spec.ts b/tests/props.spec.ts index cf9d217f2..9167973c6 100644 --- a/tests/props.spec.ts +++ b/tests/props.spec.ts @@ -110,7 +110,7 @@ describe('props', () => { }) expect(wrapper.props('modelValue')).toBe(1) - await wrapper.trigger('click') + await wrapper.get('button').trigger('click') expect(wrapper.props('modelValue')).toBe(2) }) @@ -217,7 +217,7 @@ describe('props', () => { expect(wrapper.text()).toEqual('hello') - await wrapper.trigger('click') + await wrapper.get('div').trigger('click') expect(wrapper.text()).toEqual('hello') }) diff --git a/tests/trigger.spec.ts b/tests/trigger.spec.ts index 88986242c..c1b406c12 100644 --- a/tests/trigger.spec.ts +++ b/tests/trigger.spec.ts @@ -314,10 +314,11 @@ describe('trigger', () => { describe('custom data', () => { it('adds custom data to events', () => { const updateHandler = jest.fn() - const Component = { + const Component = defineComponent({ template: '
', - methods: { updateHandler } - } + methods: { updateHandler }, + emits: ['update'] + }) const wrapper = mount(Component, {}) wrapper.trigger('update', { customData: 123 }) From 5a5bc0b5f5b9d3487fd40ae90ca3cf249dfcce2b Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Wed, 5 May 2021 09:55:51 +0100 Subject: [PATCH 5/9] feat: Added overrides --- src/domWrapper.ts | 6 +++++- src/vueWrapper.ts | 10 ++++++++-- tests/emit.spec.ts | 2 +- tests/props.spec.ts | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/domWrapper.ts b/src/domWrapper.ts index a9b4287d7..0352d9add 100644 --- a/src/domWrapper.ts +++ b/src/domWrapper.ts @@ -141,7 +141,11 @@ export class DOMWrapper return new DOMWrapper(parentElement).trigger('change') } - async trigger(eventString: DomEventName | string, options?: TriggerOptions) { + async trigger( + eventString: DomEventName, + options?: TriggerOptions + ): Promise + async trigger(eventString: string, options?: TriggerOptions) { if (options && options['target']) { throw Error( `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 913cb8c2e..682a6937b 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -4,7 +4,7 @@ import { ShapeFlags } from '@vue/shared' import pretty from 'pretty' import { config } from './config' -import domEvents from './constants/dom-event-types' +import domEvents, { DomEventName } from './constants/dom-event-types' import { DOMWrapper } from './domWrapper' import { FindAllComponentsSelector, @@ -262,7 +262,13 @@ export class VueWrapper async trigger( eventString: Parameters[0], options?: TriggerOptions - ) { + ): Promise + 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( `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + diff --git a/tests/emit.spec.ts b/tests/emit.spec.ts index d73e75cd5..9862a3a90 100644 --- a/tests/emit.spec.ts +++ b/tests/emit.spec.ts @@ -316,7 +316,7 @@ describe('emitted', () => { }) const wrapper = mount(Foo) - await wrapper.get('div').trigger('click') + await wrapper.trigger('click') expect(wrapper.emitted('foo')).toHaveLength(1) }) }) diff --git a/tests/props.spec.ts b/tests/props.spec.ts index 9167973c6..cf9d217f2 100644 --- a/tests/props.spec.ts +++ b/tests/props.spec.ts @@ -110,7 +110,7 @@ describe('props', () => { }) expect(wrapper.props('modelValue')).toBe(1) - await wrapper.get('button').trigger('click') + await wrapper.trigger('click') expect(wrapper.props('modelValue')).toBe(2) }) @@ -217,7 +217,7 @@ describe('props', () => { expect(wrapper.text()).toEqual('hello') - await wrapper.get('div').trigger('click') + await wrapper.trigger('click') expect(wrapper.text()).toEqual('hello') }) From 8d5b59917e271b629df2f248b5cf3185ea090518 Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Wed, 5 May 2021 09:58:36 +0100 Subject: [PATCH 6/9] feat: Updated baseWrapper trigger return value --- src/baseWrapper.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 342b022b9..969a6e5e5 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -63,8 +63,5 @@ export default abstract class BaseWrapper { return hasDisabledAttribute && elementCanBeDisabled } - abstract trigger( - eventString: string, - options?: TriggerOptions - ): ReturnType + abstract trigger(eventString: string, options?: TriggerOptions): Promise } From 22559bdb22d90c473e465b2dfe3a2b8a041ac1cd Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Wed, 5 May 2021 14:25:15 +0100 Subject: [PATCH 7/9] feat: moved trigger method body to the baseWrapper --- src/baseWrapper.ts | 18 +++++++++++++++++- src/domWrapper.ts | 18 ++---------------- src/vueWrapper.ts | 17 ++--------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 969a6e5e5..9e10ecf6c 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -1,6 +1,7 @@ import { textContent } from './utils' import type { TriggerOptions } from './createDomEvent' import { nextTick } from 'vue' +import { createDOMEvent } from './createDomEvent' export default abstract class BaseWrapper { private readonly wrapperElement: ElementType @@ -63,5 +64,20 @@ export default abstract class BaseWrapper { return hasDisabledAttribute && elementCanBeDisabled } - abstract trigger(eventString: string, options?: TriggerOptions): Promise + async trigger(eventString: string, options?: TriggerOptions) { + if (options && options['target']) { + throw Error( + `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + + `of the docs for more details—` + + `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` + ) + } + + if (this.element && !this.isDisabled()) { + const event = createDOMEvent(eventString, options) + this.element.dispatchEvent(event) + } + + return nextTick() + } } diff --git a/src/domWrapper.ts b/src/domWrapper.ts index 0352d9add..95e1620da 100644 --- a/src/domWrapper.ts +++ b/src/domWrapper.ts @@ -4,8 +4,7 @@ import BaseWrapper from './baseWrapper' import { createWrapperError } from './errorWrapper' import WrapperLike from './interfaces/wrapperLike' import { DomEventName } from './constants/dom-event-types' -import { createDOMEvent, TriggerOptions } from './createDomEvent' -import { nextTick } from 'vue' +import { TriggerOptions } from './createDomEvent' export class DOMWrapper extends BaseWrapper @@ -146,19 +145,6 @@ export class DOMWrapper options?: TriggerOptions ): Promise async trigger(eventString: string, options?: TriggerOptions) { - if (options && options['target']) { - throw Error( - `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + - `of the docs for more details—` + - `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` - ) - } - - if (this.element && !this.isDisabled()) { - const event = createDOMEvent(eventString, options) - this.element.dispatchEvent(event) - } - - return nextTick() + return super.trigger(eventString, options); } } diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 682a6937b..276ab2c5c 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -17,7 +17,7 @@ import { mergeDeep } from './utils' import { emitted, recordEvent } from './emit' import BaseWrapper from './baseWrapper' import WrapperLike from './interfaces/wrapperLike' -import { createDOMEvent, TriggerOptions } from './createDomEvent' +import { TriggerOptions } from './createDomEvent' export class VueWrapper extends BaseWrapper @@ -269,20 +269,7 @@ export class VueWrapper ): Promise async trigger(eventString: string, options?: TriggerOptions): Promise async trigger(eventString: string, options?: TriggerOptions) { - if (options && options['target']) { - throw Error( - `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + - `of the docs for more details—` + - `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` - ) - } - - if (this.element && !this.isDisabled()) { - const event = createDOMEvent(eventString, options) - this.element.dispatchEvent(event) - } - - return nextTick() + return super.trigger(eventString, options); } } From c66c77d308234f9b271b5bbf17dc07dba27c2410 Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Tue, 11 May 2021 11:41:22 +0100 Subject: [PATCH 8/9] feat: reverted non-baseWrapper triggers --- src/baseWrapper.ts | 10 ++++++++-- src/domWrapper.ts | 10 ---------- src/vueWrapper.ts | 16 +--------------- tests/trigger.spec.ts | 3 +-- 4 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 9e10ecf6c..611a866ae 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -2,6 +2,7 @@ import { textContent } from './utils' import type { TriggerOptions } from './createDomEvent' import { nextTick } from 'vue' import { createDOMEvent } from './createDomEvent' +import { DomEventName } from './constants/dom-event-types' export default abstract class BaseWrapper { private readonly wrapperElement: ElementType @@ -64,12 +65,17 @@ export default abstract class BaseWrapper { 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( `[vue-test-utils]: you cannot set the target value of an event. See the notes section ` + - `of the docs for more details—` + - `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` + `of the docs for more details—` + + `https://vue-test-utils.vuejs.org/api/wrapper/trigger.html` ) } diff --git a/src/domWrapper.ts b/src/domWrapper.ts index 95e1620da..9aa2958b9 100644 --- a/src/domWrapper.ts +++ b/src/domWrapper.ts @@ -3,8 +3,6 @@ import { isElementVisible } from './utils/isElementVisible' import BaseWrapper from './baseWrapper' import { createWrapperError } from './errorWrapper' import WrapperLike from './interfaces/wrapperLike' -import { DomEventName } from './constants/dom-event-types' -import { TriggerOptions } from './createDomEvent' export class DOMWrapper extends BaseWrapper @@ -139,12 +137,4 @@ export class DOMWrapper return new DOMWrapper(parentElement).trigger('change') } - - async trigger( - eventString: DomEventName, - options?: TriggerOptions - ): Promise - async trigger(eventString: string, options?: TriggerOptions) { - return super.trigger(eventString, options); - } } diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 276ab2c5c..06b9ad3fd 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -4,7 +4,7 @@ import { ShapeFlags } from '@vue/shared' import pretty from 'pretty' import { config } from './config' -import domEvents, { DomEventName } from './constants/dom-event-types' +import domEvents from './constants/dom-event-types' import { DOMWrapper } from './domWrapper' import { FindAllComponentsSelector, @@ -17,7 +17,6 @@ import { mergeDeep } from './utils' import { emitted, recordEvent } from './emit' import BaseWrapper from './baseWrapper' import WrapperLike from './interfaces/wrapperLike' -import { TriggerOptions } from './createDomEvent' export class VueWrapper extends BaseWrapper @@ -258,19 +257,6 @@ export class VueWrapper this.__app.unmount() } - - async trigger( - eventString: Parameters[0], - options?: TriggerOptions - ): Promise - async trigger( - eventString: DomEventName, - options?: TriggerOptions - ): Promise - async trigger(eventString: string, options?: TriggerOptions): Promise - async trigger(eventString: string, options?: TriggerOptions) { - return super.trigger(eventString, options); - } } export function createWrapper( diff --git a/tests/trigger.spec.ts b/tests/trigger.spec.ts index c1b406c12..5d240927b 100644 --- a/tests/trigger.spec.ts +++ b/tests/trigger.spec.ts @@ -316,8 +316,7 @@ describe('trigger', () => { const updateHandler = jest.fn() const Component = defineComponent({ template: '
', - methods: { updateHandler }, - emits: ['update'] + methods: { updateHandler } }) const wrapper = mount(Component, {}) From c79281814aa15dc1e2ccef3fbde41d8bfff0e7e5 Mon Sep 17 00:00:00 2001 From: Nandor Kraszlan Date: Tue, 11 May 2021 11:50:38 +0100 Subject: [PATCH 9/9] feat: reverted unnecessary changes --- src/baseWrapper.ts | 2 +- tests/trigger.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/baseWrapper.ts b/src/baseWrapper.ts index 611a866ae..1313ef329 100644 --- a/src/baseWrapper.ts +++ b/src/baseWrapper.ts @@ -4,7 +4,7 @@ import { nextTick } from 'vue' import { createDOMEvent } from './createDomEvent' import { DomEventName } from './constants/dom-event-types' -export default abstract class BaseWrapper { +export default class BaseWrapper { private readonly wrapperElement: ElementType get element() { diff --git a/tests/trigger.spec.ts b/tests/trigger.spec.ts index 5d240927b..88986242c 100644 --- a/tests/trigger.spec.ts +++ b/tests/trigger.spec.ts @@ -314,10 +314,10 @@ describe('trigger', () => { describe('custom data', () => { it('adds custom data to events', () => { const updateHandler = jest.fn() - const Component = defineComponent({ + const Component = { template: '
', methods: { updateHandler } - }) + } const wrapper = mount(Component, {}) wrapper.trigger('update', { customData: 123 })