@@ -7,13 +7,29 @@ declare namespace Cypress {
77 type HttpMethod = string
88 type RequestBody = string | object
99 type ViewportOrientation = 'portrait' | 'landscape'
10- type PrevSubject = 'optional' | 'element' | 'document' | 'window'
10+ type PrevSubject = keyof PrevSubjectMap
1111 type TestingType = 'e2e' | 'component'
1212 type PluginConfig = ( on : PluginEvents , config : PluginConfigOptions ) => void | ConfigOptions | Promise < ConfigOptions >
1313
14+ interface PrevSubjectMap {
15+ optional : unknown
16+ element : JQuery
17+ document : JQuery < HTMLDocument >
18+ window : Window
19+ }
20+
1421 interface CommandOptions {
1522 prevSubject : boolean | PrevSubject | PrevSubject [ ]
1623 }
24+ interface CommandFn < T extends keyof ChainableMethods > {
25+ ( ...args : Parameters < ChainableMethods [ T ] > ) : ReturnType < ChainableMethods [ T ] > | void
26+ }
27+ interface CommandFnWithSubject < T extends keyof ChainableMethods , S = JQuery > {
28+ ( prevSubject : S , ...args : Parameters < ChainableMethods [ T ] > ) : ReturnType < ChainableMethods [ T ] > | void
29+ }
30+ interface CommandFnWithOriginalFn < T extends keyof Chainable > {
31+ ( originalFn : ChainableMethods [ T ] , ...args : Parameters < ChainableMethods [ T ] > ) : ReturnType < ChainableMethods [ T ] > | void
32+ }
1733 interface ObjectLike {
1834 [ key : string ] : any
1935 }
@@ -420,9 +436,11 @@ declare namespace Cypress {
420436 * @see https://on.cypress.io/api/commands
421437 */
422438 Commands : {
423- add < T extends keyof Chainable > ( name : T , fn : Chainable [ T ] ) : void
424- add < T extends keyof Chainable > ( name : T , options : CommandOptions , fn : Chainable [ T ] ) : void
425- overwrite < T extends keyof Chainable > ( name : T , fn : Chainable [ T ] ) : void
439+ add < T extends keyof Chainable > ( name : T , fn : CommandFn < T > ) : void
440+ add < T extends keyof Chainable , S extends PrevSubject > ( name : T , options : { prevSubject : S | Array < Exclude < S , 'optional' > > } , fn : CommandFnWithSubject < T , PrevSubjectMap [ S ] > ) : void
441+ add < T extends keyof Chainable , S extends PrevSubject > ( name : T , options : { prevSubject : 'optional' | [ 'optional' , ...S [ ] ] } , fn : CommandFnWithSubject < T , PrevSubjectMap [ S ] | void > ) : void
442+ add < T extends keyof Chainable , S > ( name : T , options : CommandOptions , fn : CommandFnWithSubject < T , S > ) : void
443+ overwrite < T extends keyof Chainable > ( name : T , fn : CommandFnWithOriginalFn < T > ) : void
426444 }
427445
428446 /**
@@ -2255,6 +2273,12 @@ declare namespace Cypress {
22552273 $$ < TElement extends Element = HTMLElement > ( selector : JQuery . Selector , context ?: Element | Document | JQuery ) : JQuery < TElement >
22562274 }
22572275
2276+ type ChainableMethods < Subject = any > = {
2277+ [ P in keyof Chainable < Subject > ] : Chainable < Subject > [ P ] extends ( ( ...args : any [ ] ) => any )
2278+ ? Chainable < Subject > [ P ]
2279+ : never
2280+ }
2281+
22582282 interface SinonSpyAgent < A extends sinon . SinonSpy > {
22592283 log ( shouldOutput ?: boolean ) : Omit < A , 'withArgs' > & Agent < A >
22602284
0 commit comments