From b3c99ef74079d88ee10afe9b3a8131bb213b6071 Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 15:10:47 +0900 Subject: [PATCH 1/9] keyboard.ts --- packages/driver/src/cy/keyboard.ts | 14 ++------------ packages/driver/src/cypress/state.ts | 2 ++ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/driver/src/cy/keyboard.ts b/packages/driver/src/cy/keyboard.ts index c44791ce2fc3..e947816e582d 100644 --- a/packages/driver/src/cy/keyboard.ts +++ b/packages/driver/src/cy/keyboard.ts @@ -13,6 +13,7 @@ import $selection from '../dom/selection' import $utils from '../cypress/utils' import $window from '../dom/window' import type { Log } from '../cypress/log' +import type { StateFunc } from '../cypress/state' const debug = Debug('cypress:driver:keyboard') @@ -23,17 +24,6 @@ export interface KeyboardModifiers { shift: boolean } -export interface KeyboardState { - keyboardModifiers?: KeyboardModifiers -} - -export interface ProxyState { - (arg: K): T[K] | undefined - (arg: K, arg2: T[K] | null): void -} - -export type State = ProxyState - interface KeyDetailsPartial extends Partial { key: string } @@ -697,7 +687,7 @@ export interface typeOptions { } export class Keyboard { - constructor (private state: State) {} + constructor (private state: StateFunc) {} type (opts: typeOptions) { const options = _.defaults({}, opts, { diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index b19d33f8a238..2f569d7bf612 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -4,6 +4,7 @@ import type { RouteMap } from '../cy/net-stubbing/types' import type { $Command } from './command' import type { XHRResponse } from '../cy/commands/xhr' +import type { KeyboardModifiers } from '../cy/keyboard' export interface StateFunc { (): Record @@ -35,6 +36,7 @@ export interface StateFunc { (k: 'responses', v?: XHRResponse[]): XHRResponse[] (k: 'aliases', v?: Record): Record (k: 'onBeforeLog', v?: () => boolean): () => boolean + (k: 'keyboardModifiers', v?: KeyboardModifiers): KeyboardModifiers (k: string, v?: any): any state: StateFunc reset: () => Record From 409a266941d1968ad7c7b1eadbfa369766be1a61 Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 15:48:56 +0900 Subject: [PATCH 2/9] mouse.ts --- packages/driver/src/cy/actionability.ts | 9 +++++++-- .../driver/src/cy/commands/actions/click.ts | 9 ++++++--- packages/driver/src/cy/keyboard.ts | 6 +++--- packages/driver/src/cy/mouse.ts | 19 ++++++++++--------- packages/driver/src/cypress/state.ts | 3 +++ packages/driver/src/dom/elements/find.ts | 2 +- 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packages/driver/src/cy/actionability.ts b/packages/driver/src/cy/actionability.ts index 279316d1dfdf..e59c22f33ea8 100644 --- a/packages/driver/src/cy/actionability.ts +++ b/packages/driver/src/cy/actionability.ts @@ -4,7 +4,7 @@ import Promise from 'bluebird' import debugFn from 'debug' import $dom from '../dom' -import type { ElWindowPostion, ElViewportPostion } from '../dom/coordinates' +import type { ElWindowPostion, ElViewportPostion, ElementPositioning } from '../dom/coordinates' import $elements from '../dom/elements' import $errUtils from '../cypress/error_utils' const debug = debugFn('cypress:driver:actionability') @@ -290,7 +290,12 @@ const ensureNotAnimating = function (cy, $el, coordsHistory, animationDistanceTh cy.ensureElementIsNotAnimating($el, coordsHistory, animationDistanceThreshold) } -const verify = function (cy, $el, config, options, callbacks) { +interface VerifyCallbacks { + onReady?: ($el: any, coords: ElementPositioning) => any + onScroll?: ($el: any, type: 'element' | 'window' | 'container') => any +} + +const verify = function (cy, $el, config, options, callbacks: VerifyCallbacks) { _.defaults(options, { scrollBehavior: config('scrollBehavior'), ensure: { diff --git a/packages/driver/src/cy/commands/actions/click.ts b/packages/driver/src/cy/commands/actions/click.ts index 796b50752cba..a14d43773ed9 100644 --- a/packages/driver/src/cy/commands/actions/click.ts +++ b/packages/driver/src/cy/commands/actions/click.ts @@ -5,6 +5,9 @@ import $dom from '../../../dom' import $utils from '../../../cypress/utils' import $errUtils from '../../../cypress/error_utils' import $actionability from '../../actionability' +import type { ElViewportPostion } from '../../../dom/coordinates' +import type { $Cy } from '../../../cypress/cy' +import type { ForceEl } from '../../mouse' const formatMouseEvents = (events) => { return _.map(events, (val, key) => { @@ -39,12 +42,12 @@ type MouseActionOptions = { positionOrX: string | number y: number userOptions: Record - onReady: Function + onReady: (fromElViewport: ElViewportPostion, forceEl: ForceEl) => any onTable: Function defaultOptions?: Record } -export default (Commands, Cypress, cy, state, config) => { +export default (Commands, Cypress, cy: $Cy, state, config) => { const { mouse, keyboard } = cy.devices const mouseAction = (eventName, { subject, positionOrX, y, userOptions, onReady, onTable, defaultOptions }: MouseActionOptions) => { @@ -128,7 +131,7 @@ export default (Commands, Cypress, cy, state, config) => { // add this delay delta to the runnables timeout because we delay // by it below before performing each click - cy.timeout($actionability.delay, true, eventName) + cy.timeout($actionability.delay, true) const createLog = (domEvents, fromElWindow, fromAutWindow) => { let consoleObj diff --git a/packages/driver/src/cy/keyboard.ts b/packages/driver/src/cy/keyboard.ts index e947816e582d..6cbb017d6cbd 100644 --- a/packages/driver/src/cy/keyboard.ts +++ b/packages/driver/src/cy/keyboard.ts @@ -159,11 +159,11 @@ const joinKeyArrayToString = (keyArr: KeyInfo[]) => { }).join('') } -type modifierKeyDetails = KeyDetails & { +type KeyModifiers = { key: keyof typeof keyToModifierMap } -const isModifier = (details: KeyInfo): details is modifierKeyDetails => { +const isModifier = (details: KeyInfo): details is KeyDetails & KeyModifiers => { return details.type === 'key' && !!keyToModifierMap[details.key] } @@ -1098,7 +1098,7 @@ export class Keyboard { return details } - flagModifier (key: modifierKeyDetails, setTo = true) { + flagModifier (key: KeyModifiers, setTo = true) { debug('handleModifier', key.key) const modifier = keyToModifierMap[key.key] diff --git a/packages/driver/src/cy/mouse.ts b/packages/driver/src/cy/mouse.ts index df2317f3e338..3ba3ac914881 100644 --- a/packages/driver/src/cy/mouse.ts +++ b/packages/driver/src/cy/mouse.ts @@ -8,9 +8,14 @@ import debugFn from 'debug' import type { StateFunc } from '../cypress/state' import type { IFocused } from './focused' import type { ICypress } from '../cypress' +import type { ElViewportPostion } from '../dom/coordinates' const debug = debugFn('cypress:driver:mouse') +export type ForceEl = false | HTMLElement + +export type MouseCoords = { x?: number, y?: number} + /** * @typedef Coords * @property {number} x @@ -18,7 +23,7 @@ const debug = debugFn('cypress:driver:mouse') * @property {Document} doc */ -const getLastHoveredEl = (state): HTMLElement | null => { +const getLastHoveredEl = (state: StateFunc): HTMLElement | null => { let lastHoveredEl = state('mouseLastHoveredEl') const lastHoveredElAttached = lastHoveredEl && $elements.isAttachedEl(lastHoveredEl) @@ -40,7 +45,7 @@ const defaultPointerDownUpOptions = { pressure: 0.5, } -const getMouseCoords = (state) => { +const getMouseCoords = (state: StateFunc) => { return state('mouseCoords') } @@ -205,11 +210,7 @@ export const create = (state: StateFunc, keyboard: Keyboard, focused: IFocused, }, modifiersEventOptions, coordsEventOptions) }, - /** - * @param {Coords} coords - * @param {HTMLElement} forceEl - */ - move (fromElViewport, forceEl?) { + move (fromElViewport: ElViewportPostion, forceEl?: ForceEl) { debug('mouse.move', fromElViewport) const lastHoveredEl = getLastHoveredEl(state) @@ -241,7 +242,7 @@ export const create = (state: StateFunc, keyboard: Keyboard, focused: IFocused, * - send move events to elToHover (bubbles) * - elLastHovered = elToHover */ - _moveEvents (el, coords) { + _moveEvents (el: HTMLElement, coords: ElViewportPostion) { // events are not fired on disabled elements, so we don't have to take that into account const win = $dom.getWindowByElement(el) const { x, y } = coords @@ -386,7 +387,7 @@ export const create = (state: StateFunc, keyboard: Keyboard, focused: IFocused, * @param {Coords} coords * @returns {HTMLElement} */ - getElAtCoords ({ x, y, doc }) { + getElAtCoords ({ x, y, doc }: ElViewportPostion) { const el = $dom.elementFromPoint(doc, x, y) return el diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index 2f569d7bf612..c25b4d4cd648 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -5,6 +5,7 @@ import type { RouteMap } from '../cy/net-stubbing/types' import type { $Command } from './command' import type { XHRResponse } from '../cy/commands/xhr' import type { KeyboardModifiers } from '../cy/keyboard' +import type { MouseCoords } from '../cy/mouse' export interface StateFunc { (): Record @@ -37,6 +38,8 @@ export interface StateFunc { (k: 'aliases', v?: Record): Record (k: 'onBeforeLog', v?: () => boolean): () => boolean (k: 'keyboardModifiers', v?: KeyboardModifiers): KeyboardModifiers + (k: 'mouseLastHoveredEl', v?: HTMLElement | null): HTMLElement | null + (k: 'mouseCoords', v?: MouseCoords): MouseCoords (k: string, v?: any): any state: StateFunc reset: () => Record diff --git a/packages/driver/src/dom/elements/find.ts b/packages/driver/src/dom/elements/find.ts index 8ac5466aba1b..4291ff1ad587 100644 --- a/packages/driver/src/dom/elements/find.ts +++ b/packages/driver/src/dom/elements/find.ts @@ -161,7 +161,7 @@ export const getFirstDeepestElement = ($el: JQuery, index = 0) => { /** * By XY Coordinate */ -export const elementFromPoint = (doc, x, y) => { +export const elementFromPoint = (doc, x, y): HTMLElement => { // first try the native elementFromPoint method let elFromPoint = doc.elementFromPoint(x, y) From 1c37f4d7e601881bc219408b303ec05e6f2caa26 Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 16:18:13 +0900 Subject: [PATCH 3/9] chai.ts --- packages/driver/src/cy/chai.ts | 6 +++--- packages/driver/src/cypress/stack_utils.ts | 6 +++--- packages/driver/src/cypress/state.ts | 2 +- packages/driver/types/window.d.ts | 13 +++++++++++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/driver/src/cy/chai.ts b/packages/driver/src/cy/chai.ts index 5242cfd11168..b71ae0946807 100644 --- a/packages/driver/src/cy/chai.ts +++ b/packages/driver/src/cy/chai.ts @@ -35,11 +35,11 @@ const imageMarkdown = /!\[.*?\]\(.*?\)/g const doubleslashRe = /\\\\/g const escapedDoubleslashRe = /__double_slash__/g -type CreateFunc = ((specWindow, state, assertFn) => ({ +type CreateFunc = (specWindow: SpecWindow, state: StateFunc, assertFn: $Cy['assert']) => ({ chai: Chai.ChaiStatic expect: (val: any, message?: string) => Chai.Assertion assert: any -})) +}) export let create: CreateFunc | null = null chai.use(sinonChai) @@ -439,7 +439,7 @@ chai.use((chai, u) => { }) } - const captureUserInvocationStack = (specWindow, state: StateFunc, ssfi) => { + const captureUserInvocationStack = (specWindow: SpecWindow, state: StateFunc, ssfi) => { // we need a user invocation stack with the top line being the point where // the error occurred for the sake of the code frame // in chrome, stack lines from another frame don't appear in the diff --git a/packages/driver/src/cypress/stack_utils.ts b/packages/driver/src/cypress/stack_utils.ts index 674bf67bb994..167cc9826f3b 100644 --- a/packages/driver/src/cypress/stack_utils.ts +++ b/packages/driver/src/cypress/stack_utils.ts @@ -143,7 +143,7 @@ const getCodeFrameFromSource = (sourceCode, { line, column, relativeFile, absolu } } -const captureUserInvocationStack = (ErrorConstructor, userInvocationStack?) => { +const captureUserInvocationStack = (ErrorConstructor: SpecWindow['Error'], userInvocationStack?: string | false) => { if (!userInvocationStack) { const newErr = new ErrorConstructor('userInvocationStack') @@ -151,7 +151,7 @@ const captureUserInvocationStack = (ErrorConstructor, userInvocationStack?) => { // if browser natively supports Error.captureStackTrace, use it (chrome) (must be bound) // otherwise use our polyfill on top.Error - const captureStackTrace = ErrorConstructor.captureStackTrace ? ErrorConstructor.captureStackTrace.bind(ErrorConstructor) : Error.captureStackTrace + const captureStackTrace: ErrorConstructor['captureStackTrace'] = ErrorConstructor.captureStackTrace ? ErrorConstructor.captureStackTrace.bind(ErrorConstructor) : Error.captureStackTrace captureStackTrace(newErr, captureUserInvocationStack) @@ -159,7 +159,7 @@ const captureUserInvocationStack = (ErrorConstructor, userInvocationStack?) => { // leaving nothing beyond the error message. If we get back a single line // (just the error message with no stack trace), then use the original value // instead of the trimmed one. - if (newErr.stack.match('\n')) { + if (newErr.stack!.match('\n')) { userInvocationStack = newErr.stack } } diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index c25b4d4cd648..26e9a6c72009 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -33,7 +33,7 @@ export interface StateFunc { (k: 'canceld', v?: boolean): boolean (k: 'error', v?: Error): Error (k: 'assertUsed', v?: boolean): boolean - (k: 'currentAssertionUserInvocationStack', v?: any): any + (k: 'currentAssertionUserInvocationStack', v?: string): string (k: 'responses', v?: XHRResponse[]): XHRResponse[] (k: 'aliases', v?: Record): Record (k: 'onBeforeLog', v?: () => boolean): () => boolean diff --git a/packages/driver/types/window.d.ts b/packages/driver/types/window.d.ts index bf67c4d019f8..c2ef506c16e5 100644 --- a/packages/driver/types/window.d.ts +++ b/packages/driver/types/window.d.ts @@ -1,6 +1,15 @@ +interface ErrorConstructor { + // Cannot use `ErrorConstructor` because it doesn't allow Error as an argument. + new(arg?: string | Error): Error + + // Non-standard static method that only exists in Chrome + // @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#static_methods + captureStackTrace(targetObject: object, constructorOpt?: Function): void; +} + declare interface Window { jquery: Function $: JQueryStatic - // Cannot use `ErrorConstructor` because it doesn't allow Error as an argument. - Error: (new(arg?: string | Error) => Error) + + Error: ErrorConstructor } From 7e17f9cc7c3d9fdbd9113cb42b25f8733f410f3b Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 16:35:01 +0900 Subject: [PATCH 4/9] xhr.ts --- packages/driver/src/cy/commands/xhr.ts | 5 +++++ packages/driver/src/cy/xhrs.ts | 7 +++---- packages/driver/src/cypress/state.ts | 5 ++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/driver/src/cy/commands/xhr.ts b/packages/driver/src/cy/commands/xhr.ts index 799a103bdcd1..a5ebef42aeb7 100644 --- a/packages/driver/src/cy/commands/xhr.ts +++ b/packages/driver/src/cy/commands/xhr.ts @@ -60,6 +60,11 @@ const setRequest = (state, xhr, alias) => { return state('requests', requests) } +export type XHRRequest = { + xhr: any + alias: any +} + export interface XHRResponse { xhr: any alias: any diff --git a/packages/driver/src/cy/xhrs.ts b/packages/driver/src/cy/xhrs.ts index 9d50f90e1c80..61b0ddf10d44 100644 --- a/packages/driver/src/cy/xhrs.ts +++ b/packages/driver/src/cy/xhrs.ts @@ -1,4 +1,3 @@ -/* globals cy */ import _ from 'lodash' import $errUtils from '../cypress/error_utils' @@ -6,7 +5,7 @@ import type { StateFunc } from '../cypress/state' const validAliasApiRe = /^(\d+|all)$/ -const xhrNotWaitedOnByIndex = (state, alias, index, prop) => { +const xhrNotWaitedOnByIndex = (state: StateFunc, alias: string, index: number, prop: 'requests' | 'responses') => { // find the last request or response // which hasnt already been used. let xhrs = state(prop) || [] @@ -28,7 +27,7 @@ const xhrNotWaitedOnByIndex = (state, alias, index, prop) => { // eslint-disable-next-line @cypress/dev/arrow-body-multiline-braces export const create = (state: StateFunc) => ({ - getIndexedXhrByAlias (alias, index) { + getIndexedXhrByAlias (alias: string, index: number) { let prop let str @@ -60,7 +59,7 @@ export const create = (state: StateFunc) => ({ getRequestsByAlias (alias) { let prop - if (_.indexOf(alias, '.') === -1 || _.keys(cy.state('aliases')).includes(alias)) { + if (_.indexOf(alias, '.') === -1 || _.keys(state('aliases')).includes(alias)) { prop = null } else { // potentially valid prop diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index 26e9a6c72009..ca4a8c12f31a 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -3,9 +3,10 @@ import type { RouteMap } from '../cy/net-stubbing/types' import type { $Command } from './command' -import type { XHRResponse } from '../cy/commands/xhr' +import type { XHRRequest, XHRResponse } from '../cy/commands/xhr' import type { KeyboardModifiers } from '../cy/keyboard' import type { MouseCoords } from '../cy/mouse' +import type { Server } from './server' export interface StateFunc { (): Record @@ -40,6 +41,8 @@ export interface StateFunc { (k: 'keyboardModifiers', v?: KeyboardModifiers): KeyboardModifiers (k: 'mouseLastHoveredEl', v?: HTMLElement | null): HTMLElement | null (k: 'mouseCoords', v?: MouseCoords): MouseCoords + (k: 'server', v?: Server): Server + (k: 'requests', v?: XHRRequest[]): XHRRequest[] (k: string, v?: any): any state: StateFunc reset: () => Record From 751835e0ecbbdbf718d655bbc60ddbc124f283aa Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 16:39:30 +0900 Subject: [PATCH 5/9] snapshots.ts --- packages/driver/src/cy/jquery.ts | 2 +- packages/driver/src/cy/snapshots.ts | 4 +++- packages/driver/src/cypress/state.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/driver/src/cy/jquery.ts b/packages/driver/src/cy/jquery.ts index bb9132d154b6..7196ebe2190a 100644 --- a/packages/driver/src/cy/jquery.ts +++ b/packages/driver/src/cy/jquery.ts @@ -10,7 +10,7 @@ const remoteJQueryisNotSameAsGlobal = (remoteJQuery) => { // eslint-disable-next-line @cypress/dev/arrow-body-multiline-braces export const create = (state: StateFunc) => ({ - $$ (selector, context) { + $$ (selector, context?) { if (context == null) { context = state('document') } diff --git a/packages/driver/src/cy/snapshots.ts b/packages/driver/src/cy/snapshots.ts index 9d0a05328101..c8a9b9998551 100644 --- a/packages/driver/src/cy/snapshots.ts +++ b/packages/driver/src/cy/snapshots.ts @@ -1,5 +1,7 @@ import $ from 'jquery' import _ from 'lodash' +import type { $Cy } from '../cypress/cy' +import type { StateFunc } from '../cypress/state' import $dom from '../dom' import { create as createSnapshotsCSS } from './snapshots_css' @@ -7,7 +9,7 @@ export const HIGHLIGHT_ATTR = 'data-cypress-el' export const FINAL_SNAPSHOT_NAME = 'final state' -export const create = ($$, state) => { +export const create = ($$: $Cy['$$'], state: StateFunc) => { const snapshotsCss = createSnapshotsCSS($$, state) const snapshotsMap = new WeakMap() const snapshotDocument = new Document() diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index ca4a8c12f31a..eeeff339df30 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -37,7 +37,7 @@ export interface StateFunc { (k: 'currentAssertionUserInvocationStack', v?: string): string (k: 'responses', v?: XHRResponse[]): XHRResponse[] (k: 'aliases', v?: Record): Record - (k: 'onBeforeLog', v?: () => boolean): () => boolean + (k: 'onBeforeLog', v?: (() => boolean) | null): () => boolean | null (k: 'keyboardModifiers', v?: KeyboardModifiers): KeyboardModifiers (k: 'mouseLastHoveredEl', v?: HTMLElement | null): HTMLElement | null (k: 'mouseCoords', v?: MouseCoords): MouseCoords From de5a348fea093e6eb85fd38f4adfa89405e72a00 Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 16:54:29 +0900 Subject: [PATCH 6/9] overrides.ts --- packages/driver/src/cy/focused.ts | 5 +---- packages/driver/src/cy/overrides.ts | 8 ++++++-- packages/driver/src/cy/snapshots.ts | 5 +---- packages/driver/src/cypress/cy.ts | 14 +++++++++++--- packages/driver/src/cypress/state.ts | 1 + 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/driver/src/cy/focused.ts b/packages/driver/src/cy/focused.ts index 63accce35c29..d1592919bbfa 100644 --- a/packages/driver/src/cy/focused.ts +++ b/packages/driver/src/cy/focused.ts @@ -237,7 +237,4 @@ export const create = (state: StateFunc) => ({ }, }) -export interface IFocused extends Omit< - ReturnType, - 'documentHasFocus' | 'interceptFocus' | 'interceptBlur' -> {} +export interface IFocused extends ReturnType {} diff --git a/packages/driver/src/cy/overrides.ts b/packages/driver/src/cy/overrides.ts index 20e1c4a56742..cc9c1c4fac97 100644 --- a/packages/driver/src/cy/overrides.ts +++ b/packages/driver/src/cy/overrides.ts @@ -1,9 +1,13 @@ import _ from 'lodash' -// @ts-ignore import { registerFetch } from 'unfetch' import $selection from '../dom/selection' -export const create = (state, config, focused, snapshots) => { +import type { ICypress } from '../cypress' +import type { StateFunc } from '../cypress/state' +import type { IFocused } from './focused' +import type { ISnapshots } from './snapshots' + +export const create = (state: StateFunc, config: ICypress['config'], focused: IFocused, snapshots: ISnapshots) => { const wrapNativeMethods = function (contentWindow) { try { // return null to trick contentWindow into thinking diff --git a/packages/driver/src/cy/snapshots.ts b/packages/driver/src/cy/snapshots.ts index c8a9b9998551..2decf6bbfbb5 100644 --- a/packages/driver/src/cy/snapshots.ts +++ b/packages/driver/src/cy/snapshots.ts @@ -298,7 +298,4 @@ export const create = ($$: $Cy['$$'], state: StateFunc) => { } } -export interface ISnapshots extends Omit< - ReturnType, - 'onCssModified' | 'onBeforeWindowLoad' -> {} +export interface ISnapshots extends ReturnType {} diff --git a/packages/driver/src/cypress/cy.ts b/packages/driver/src/cypress/cy.ts index 38e931fa68bc..75c533b1fdc5 100644 --- a/packages/driver/src/cypress/cy.ts +++ b/packages/driver/src/cypress/cy.ts @@ -122,7 +122,17 @@ const setTopOnError = function (Cypress, cy: $Cy) { top.__alreadySetErrorHandlers__ = true } -export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssertions, IRetries, IJQuery, ILocation, ITimer, IChai, IXhr, IAliases, IEnsures, ISnapshots, IFocused { +interface ICyFocused extends Omit< + IFocused, + 'documentHasFocus' | 'interceptFocus' | 'interceptBlur' +> {} + +interface ICySnapshots extends Omit< + ISnapshots, + 'onCssModified' | 'onBeforeWindowLoad' +> {} + +export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssertions, IRetries, IJQuery, ILocation, ITimer, IChai, IXhr, IAliases, IEnsures, ICySnapshots, ICyFocused { id: string specWindow: any state: StateFunc @@ -200,7 +210,6 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert ensureSubjectByType: ReturnType['ensureSubjectByType'] ensureRunnable: ReturnType['ensureRunnable'] - onCssModified: ReturnType['onCssModified'] onBeforeWindowLoad: ReturnType['onBeforeWindowLoad'] documentHasFocus: ReturnType['documentHasFocus'] @@ -347,7 +356,6 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert this.detachDom = snapshots.detachDom this.getStyles = snapshots.getStyles - this.onCssModified = snapshots.onCssModified this.onBeforeWindowLoad = snapshots.onBeforeWindowLoad this.overrides = createOverrides(state, config, focused, snapshots) diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index eeeff339df30..c60f689c7659 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -43,6 +43,7 @@ export interface StateFunc { (k: 'mouseCoords', v?: MouseCoords): MouseCoords (k: 'server', v?: Server): Server (k: 'requests', v?: XHRRequest[]): XHRRequest[] + (k: 'fetchPolyfilled', v?: boolean): boolean (k: string, v?: any): any state: StateFunc reset: () => Record From 1c31800b85071d5cbb6f652ca0f725b9a64785ac Mon Sep 17 00:00:00 2001 From: KHeo Date: Mon, 23 May 2022 17:33:35 +0900 Subject: [PATCH 7/9] command_queue.ts --- packages/driver/src/cy/stability.ts | 2 +- packages/driver/src/cypress/command_queue.ts | 31 +++++++++++--------- packages/driver/src/cypress/cy.ts | 5 +--- packages/driver/src/cypress/state.ts | 12 ++++++++ 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/packages/driver/src/cy/stability.ts b/packages/driver/src/cy/stability.ts index 273c82e166d8..cfabae380a5e 100644 --- a/packages/driver/src/cy/stability.ts +++ b/packages/driver/src/cy/stability.ts @@ -55,7 +55,7 @@ export const create = (Cypress: ICypress, state: StateFunc) => ({ state('anticipatingCrossOriginResponse', request) }, - whenStableOrAnticipatingCrossOriginResponse (fn, command) { + whenStableOrAnticipatingCrossOriginResponse (fn, command?) { const commandIsOrigin = command?.get('name') === 'origin' const commandIsEndLogGroup = command?.get('name') === 'end-logGroup' diff --git a/packages/driver/src/cypress/command_queue.ts b/packages/driver/src/cypress/command_queue.ts index 8d1301452ab1..166a7e2ea7a2 100644 --- a/packages/driver/src/cypress/command_queue.ts +++ b/packages/driver/src/cypress/command_queue.ts @@ -8,6 +8,10 @@ import $dom from '../dom' import $utils from './utils' import $errUtils from './error_utils' import type $Command from './command' +import type { StateFunc } from './state' +import type { $Cy } from './cy' +import type { IStability } from '../cy/stability' +import type { ITimeouts } from '../cy/timeouts' const debugErrors = Debug('cypress:driver:errors') @@ -53,14 +57,15 @@ const commandRunningFailed = (Cypress, state, err) => { } export class CommandQueue extends Queue<$Command> { - state: any - timeout: any - stability: any - cleanup: any - fail: any - isCy: any - - constructor (state, timeout, stability, cleanup, fail, isCy) { + state: StateFunc + timeout: $Cy['timeout'] + stability: IStability + cleanup: $Cy['cleanup'] + fail: $Cy['fail'] + isCy: $Cy['isCy'] + clearTimeout: ITimeouts['clearTimeout'] + + constructor (state: StateFunc, timeout: $Cy['timeout'], stability: IStability, cleanup: $Cy['cleanup'], fail: $Cy['fail'], isCy: $Cy['isCy'], clearTimeout: ITimeouts['clearTimeout']) { super() this.state = state this.timeout = timeout @@ -68,6 +73,7 @@ export class CommandQueue extends Queue<$Command> { this.cleanup = cleanup this.fail = fail this.isCy = isCy + this.clearTimeout = clearTimeout } logs (filter) { @@ -238,9 +244,6 @@ export class CommandQueue extends Queue<$Command> { // reset the nestedIndex back to null this.state('nestedIndex', null) - // also reset recentlyReady back to null - this.state('recentlyReady', null) - // we're finished with the current command so set it back to null this.state('current', null) @@ -310,8 +313,8 @@ export class CommandQueue extends Queue<$Command> { // If we have created a timeout but are in an unstable state, clear the // timeout in favor of the on load timeout already running. - if (!cy.state('isStable')) { - cy.clearTimeout() + if (!this.state('isStable')) { + this.clearTimeout() } // store the current runnable @@ -319,7 +322,7 @@ export class CommandQueue extends Queue<$Command> { Cypress.action('cy:command:start', command) - return this.runCommand(command) + return this.runCommand(command)! .then(() => { // each successful command invocation should // always reset the timeout for the current runnable diff --git a/packages/driver/src/cypress/cy.ts b/packages/driver/src/cypress/cy.ts index 75c533b1fdc5..dc82f1e4dd05 100644 --- a/packages/driver/src/cypress/cy.ts +++ b/packages/driver/src/cypress/cy.ts @@ -360,7 +360,7 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert this.overrides = createOverrides(state, config, focused, snapshots) - this.queue = new CommandQueue(state, this.timeout, stability, this.cleanup, this.fail, this.isCy) + this.queue = new CommandQueue(state, this.timeout, stability, this.cleanup, this.fail, this.isCy, this.clearTimeout) setTopOnError(Cypress, this) @@ -1079,9 +1079,6 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert // reset the nestedIndex back to null this.state('nestedIndex', null) - // also reset recentlyReady back to null - this.state('recentlyReady', null) - // and forcibly move the index needle to the // end in case we have after / afterEach hooks // which need to run diff --git a/packages/driver/src/cypress/state.ts b/packages/driver/src/cypress/state.ts index c60f689c7659..9039ae6d61ef 100644 --- a/packages/driver/src/cypress/state.ts +++ b/packages/driver/src/cypress/state.ts @@ -1,6 +1,8 @@ /// /// +import type Bluebird from 'bluebird' + import type { RouteMap } from '../cy/net-stubbing/types' import type { $Command } from './command' import type { XHRRequest, XHRResponse } from '../cy/commands/xhr' @@ -44,6 +46,16 @@ export interface StateFunc { (k: 'server', v?: Server): Server (k: 'requests', v?: XHRRequest[]): XHRRequest[] (k: 'fetchPolyfilled', v?: boolean): boolean + (k: 'nestedIndex', v?: number): number + (k: 'chainerId', v?: string): string + (k: 'ctx', v?: Mocha.Context): Mocha.Context + (k: 'commandIntermediateValue', v?: any): any + (k: 'subject', v?: any): any + (k: 'onPaused', v?: (fn: any) => void): (fn: any) => void + (k: 'onCommandFailed', v?: (err: any, queue: any, next: any) => boolean): (err: any, queue: any, next: any) => boolean + (k: 'promise', v?: Bluebird): Bluebird + (k: 'reject', v?: (err: any) => any): (err: any) => any + (k: 'cancel', v?: () => void): () => void (k: string, v?: any): any state: StateFunc reset: () => Record From 1f972f590977d27c9f2044b662b3065d2ca98e5d Mon Sep 17 00:00:00 2001 From: KHeo Date: Tue, 24 May 2022 15:54:13 +0900 Subject: [PATCH 8/9] fix errors. --- .../integration/cypress/command_queue_spec.ts | 13 ++++++++----- packages/driver/src/cypress/cy.ts | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/driver/cypress/integration/cypress/command_queue_spec.ts b/packages/driver/cypress/integration/cypress/command_queue_spec.ts index ae4c476613a6..eadf16cfa2d7 100644 --- a/packages/driver/cypress/integration/cypress/command_queue_spec.ts +++ b/packages/driver/cypress/integration/cypress/command_queue_spec.ts @@ -1,6 +1,8 @@ import _ from 'lodash' +import type { IStability } from '../../../src/cy/stability' import $Command from '../../../src/cypress/command' import { CommandQueue } from '../../../src/cypress/command_queue' +import type { StateFunc } from '../../../src/cypress/state' const createCommand = (props = {}) => { return $Command.create(_.extend({ @@ -22,15 +24,16 @@ const log = (props = {}) => { describe('src/cypress/command_queue', () => { let queue - const state = () => {} + const state = (() => {}) as StateFunc const timeout = () => {} - const whenStable = () => {} - const cleanup = () => {} + const whenStable = {} as IStability + const cleanup = () => 0 const fail = () => {} - const isCy = () => {} + const isCy = () => true + const clearTimeout = () => {} beforeEach(() => { - queue = new CommandQueue(state, timeout, whenStable, cleanup, fail, isCy) + queue = new CommandQueue(state, timeout, whenStable, cleanup, fail, isCy, clearTimeout) queue.add(createCommand({ name: 'get', diff --git a/packages/driver/src/cypress/cy.ts b/packages/driver/src/cypress/cy.ts index dc82f1e4dd05..4af9ba133c18 100644 --- a/packages/driver/src/cypress/cy.ts +++ b/packages/driver/src/cypress/cy.ts @@ -204,8 +204,10 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert detachDom: ISnapshots['detachDom'] getStyles: ISnapshots['getStyles'] - // Private methods resetTimer: ReturnType['reset'] + overrides: IOverrides + + // Private methods ensureSubjectByType: ReturnType['ensureSubjectByType'] ensureRunnable: ReturnType['ensureRunnable'] @@ -215,7 +217,6 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert documentHasFocus: ReturnType['documentHasFocus'] interceptFocus: ReturnType['interceptFocus'] interceptBlur: ReturnType['interceptBlur'] - overrides: IOverrides private testConfigOverride: TestConfigOverride private commandFns: Record = {} From 5952742c9bc6b0457634ce910a549a68b34caa76 Mon Sep 17 00:00:00 2001 From: KHeo Date: Tue, 24 May 2022 16:10:11 +0900 Subject: [PATCH 9/9] fix tests. --- .../driver/cypress/integration/commands/actions/click_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/driver/cypress/integration/commands/actions/click_spec.js b/packages/driver/cypress/integration/commands/actions/click_spec.js index 16d34dfc34a5..e9431e8b6a7e 100644 --- a/packages/driver/cypress/integration/commands/actions/click_spec.js +++ b/packages/driver/cypress/integration/commands/actions/click_spec.js @@ -748,7 +748,7 @@ describe('src/cy/commands/actions/click', () => { cy.get('#three-buttons button').click({ multiple: true }).then(() => { const calls = cy.timeout.getCalls() - const num = _.filter(calls, (call) => _.isEqual(call.args, [50, true, 'click'])) + const num = _.filter(calls, (call) => _.isEqual(call.args, [50, true])) expect(num.length).to.eq(count) }) @@ -3242,7 +3242,7 @@ describe('src/cy/commands/actions/click', () => { cy.get('#three-buttons button').dblclick().then(() => { const calls = cy.timeout.getCalls() - const num = _.filter(calls, (call) => _.isEqual(call.args, [50, true, 'dblclick'])) + const num = _.filter(calls, (call) => _.isEqual(call.args, [50, true])) expect(num.length).to.eq(count) })