cypress 3.1.4 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cli.js CHANGED
@@ -26,8 +26,7 @@ function unknownOption(flag) {
26
26
  logger.error(' error: unknown ' + type + ':', flag);
27
27
  logger.error();
28
28
  this.outputHelp();
29
- logger.error();
30
- process.exit(1);
29
+ util.exit(1);
31
30
  }
32
31
  commander.Command.prototype.unknownOption = unknownOption;
33
32
 
@@ -65,9 +64,9 @@ var descriptions = {
65
64
  dev: 'runs cypress in development and bypasses binary check',
66
65
  forceInstall: 'force install the Cypress binary',
67
66
  exit: 'keep the browser open after tests finish',
68
- cachePath: 'print the cypress binary cache path',
69
- cacheList: 'list the currently cached versions',
70
- cacheClear: 'delete the Cypress binary cache',
67
+ cachePath: 'print the path to the binary cache',
68
+ cacheList: 'list cached binary versions',
69
+ cacheClear: 'delete all cached binaries',
71
70
  group: 'a named group for recorded runs in the Cypress dashboard',
72
71
  parallel: 'enables concurrent runs and automatic load balancing of specs across multiple machines or processes',
73
72
  ciBuildId: 'the unique identifier for a run on your CI provider. typically a "BUILD_ID" env var. this value is automatically detected for most CI providers'
@@ -140,8 +139,13 @@ module.exports = {
140
139
  });
141
140
 
142
141
  program.command('cache').usage('[command]').description('Manages the Cypress binary cache').option('list', text('cacheList')).option('path', text('cachePath')).option('clear', text('cacheClear')).action(function (opts) {
142
+ if (!_.isString(opts)) {
143
+ this.outputHelp();
144
+ util.exit(1);
145
+ }
146
+
143
147
  if (opts.command || !_.includes(['list', 'path', 'clear'], opts)) {
144
- unknownOption.call(this, 'cache ' + opts, 'sub-command');
148
+ unknownOption.call(this, 'cache ' + opts, 'command');
145
149
  }
146
150
 
147
151
  cache[opts]();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cypress",
3
- "version": "3.1.4",
3
+ "version": "3.1.5",
4
4
  "main": "index.js",
5
5
  "bin": {
6
6
  "cypress": "bin/cypress"
@@ -31,7 +31,7 @@
31
31
  "@types/minimatch": "3.0.3",
32
32
  "@types/mocha": "2.2.44",
33
33
  "@types/sinon": "7.0.0",
34
- "@types/sinon-chai": "2.7.29",
34
+ "@types/sinon-chai": "3.2.2",
35
35
  "bluebird": "3.5.0",
36
36
  "cachedir": "1.3.0",
37
37
  "chalk": "2.4.1",
package/types/index.d.ts CHANGED
@@ -116,10 +116,12 @@ declare namespace Cypress {
116
116
  * Cypress version string. i.e. "1.1.2"
117
117
  * @see https://on.cypress.io/version
118
118
  * @example
119
- * expect(Cypress.version).to.be.a('string')
120
- * if (Cypress.version === '1.2.0') {
121
- * // test something specific
122
- * }
119
+ ```
120
+ expect(Cypress.version).to.be.a('string')
121
+ if (Cypress.version === '1.2.0') {
122
+ // test something specific
123
+ }
124
+ ```
123
125
  */
124
126
  version: string
125
127
 
@@ -143,6 +145,15 @@ declare namespace Cypress {
143
145
 
144
146
  /**
145
147
  * Currently executing spec file.
148
+ * @example
149
+ ```
150
+ Cypress.spec
151
+ // {
152
+ // name: "config_passing_spec.coffee",
153
+ // relative: "cypress/integration/config_passing_spec.coffee",
154
+ // absolute: "/users/smith/projects/web/cypress/integration/config_passing_spec.coffee"
155
+ // }
156
+ ```
146
157
  */
147
158
  spec: {
148
159
  name: string // "config_passing_spec.coffee"
@@ -156,11 +167,45 @@ declare namespace Cypress {
156
167
  browser: Browser
157
168
 
158
169
  /**
170
+ * Returns all configuration objects.
159
171
  * @see https://on.cypress.io/config
172
+ * @example
173
+ ```
174
+ Cypress.config()
175
+ // {defaultCommandTimeout: 10000, pageLoadTimeout: 30000, ...}
176
+ ```
160
177
  */
161
178
  config(): ConfigOptions
179
+ /**
180
+ * Returns one configuration value.
181
+ * @see https://on.cypress.io/config
182
+ * @example
183
+ ```
184
+ Cypress.config('pageLoadTimeout')
185
+ // 60000
186
+ ```
187
+ */
162
188
  config<K extends keyof ConfigOptions>(key: K): ConfigOptions[K]
189
+ /**
190
+ * Sets one configuration value.
191
+ * @see https://on.cypress.io/config
192
+ * @example
193
+ ```
194
+ Cypress.config('viewportWidth', 800)
195
+ ```
196
+ */
163
197
  config<K extends keyof ConfigOptions>(key: K, value: ConfigOptions[K]): void
198
+ /**
199
+ * Sets multiple configuration values at once.
200
+ * @see https://on.cypress.io/config
201
+ * @example
202
+ ```
203
+ Cypress.config({
204
+ defaultCommandTimeout: 10000,
205
+ viewportHeight: 900
206
+ })
207
+ ```
208
+ */
164
209
  config(Object: Partial<ConfigOptions>): void
165
210
 
166
211
  // no real way to type without generics
@@ -277,16 +322,20 @@ declare namespace Cypress {
277
322
  * @see https://on.cypress.io/variables-and-aliases
278
323
  * @see https://on.cypress.io/get
279
324
  * @example
280
- * // Get the aliased ‘todos’ elements
281
- * cy.get('ul#todos').as('todos')
282
- * //...hack hack hack...
283
- * // later retrieve the todos
284
- * cy.get('@todos')
325
+ ```
326
+ // Get the aliased ‘todos’ elements
327
+ cy.get('ul#todos').as('todos')
328
+ //...hack hack hack...
329
+ // later retrieve the todos
330
+ cy.get('@todos')
331
+ ```
285
332
  */
286
333
  as(alias: string): Chainable<Subject>
287
334
 
288
335
  /**
289
- * Blur a focused element. This element must currently be in focus. If you want to ensure an element is focused before blurring, try using .focus() before .blur().
336
+ * Blur a focused element. This element must currently be in focus.
337
+ * If you want to ensure an element is focused before blurring,
338
+ * try using .focus() before .blur().
290
339
  *
291
340
  * @see https://on.cypress.io/blur
292
341
  */
@@ -355,19 +404,29 @@ declare namespace Cypress {
355
404
  * to clear localStorage inside a single test. Yields `localStorage` object.
356
405
  *
357
406
  * @see https://on.cypress.io/clearlocalstorage
358
- * @example
359
- * cy.clearLocalStorage().should(ls => {
360
- * expect(ls.getItem('prop1')).to.be.null
361
- * })
407
+ * @param {string} [key] - name of a particular item to remove (optional).
408
+ * @example
409
+ ```
410
+ // removes all local storage keys
411
+ cy.clearLocalStorage()
412
+ .should(ls => {
413
+ expect(ls.getItem('prop1')).to.be.null
414
+ })
415
+ // removes item "todos"
416
+ cy.clearLocalStorage("todos")
417
+ ```
362
418
  */
363
419
  clearLocalStorage(key?: string): Chainable<Storage>
364
420
  /**
365
421
  * Clear keys in local storage that match given regular expression.
366
422
  *
367
423
  * @see https://on.cypress.io/clearlocalstorage
424
+ * @param {RegExp} re - regular expression to match.
368
425
  * @example
369
- * // Clear all local storage matching /app-/
370
- * cy.clearLocalStorage(/app-/)
426
+ ```
427
+ // Clear all local storage matching /app-/
428
+ cy.clearLocalStorage(/app-/)
429
+ ```
371
430
  */
372
431
  clearLocalStorage(re: RegExp): Chainable<Storage>
373
432
 
@@ -384,7 +443,8 @@ declare namespace Cypress {
384
443
  /**
385
444
  * Click a DOM element at specific corner / side.
386
445
  *
387
- * @param {String} position The position where the click should be issued. The `center` position is the default position.
446
+ * @param {String} position - The position where the click should be issued.
447
+ * The `center` position is the default position.
388
448
  * @see https://on.cypress.io/click
389
449
  * @example
390
450
  * cy.get('button').click('topRight')
@@ -397,9 +457,11 @@ declare namespace Cypress {
397
457
  * @param {number} y The distance in pixels from the element’s top to issue the click.
398
458
  * @see https://on.cypress.io/click
399
459
  * @example
400
- * // The click below will be issued inside of the element
401
- * // (15px from the left and 40px from the top).
402
- * cy.get('button').click(15, 40)
460
+ ```
461
+ // The click below will be issued inside of the element
462
+ // (15px from the left and 40px from the top).
463
+ cy.get('button').click(15, 40)
464
+ ```
403
465
  */
404
466
  click(x: number, y: number, options?: Partial<ClickOptions>): Chainable<Subject>
405
467
 
@@ -623,9 +685,11 @@ declare namespace Cypress {
623
685
  fixture<Contents = any>(path: string, encoding: Encodings, options?: Partial<Timeoutable>): Chainable<Contents> // no log?
624
686
 
625
687
  /**
626
- * Get the DOM element that is currently focused.
688
+ * Focus on a DOM element.
627
689
  *
628
690
  * @see https://on.cypress.io/focus
691
+ * @example
692
+ * cy.get('input').first().focus() // Focus on the first input
629
693
  */
630
694
  focus(options?: Partial<Loggable & Timeoutable>): Chainable<Subject>
631
695
 
@@ -1327,19 +1391,37 @@ declare namespace Cypress {
1327
1391
  *
1328
1392
  * @see https://on.cypress.io/then
1329
1393
  */
1330
- then<S>(fn: (this: ObjectLike, currentSubject: Subject) => Chainable<S>, options?: Partial<Timeoutable>): Chainable<S>
1394
+ then<S>(fn: (this: ObjectLike, currentSubject: Subject) => Chainable<S>): Chainable<S>
1395
+ /**
1396
+ * Enables you to work with the subject yielded from the previous command.
1397
+ *
1398
+ * @see https://on.cypress.io/then
1399
+ */
1400
+ then<S>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => Chainable<S>): Chainable<S>
1331
1401
  /**
1332
1402
  * Enables you to work with the subject yielded from the previous command / promise.
1333
1403
  *
1334
1404
  * @see https://on.cypress.io/then
1335
1405
  */
1336
- then<S>(fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike<S>, options?: Partial<Timeoutable>): Chainable<S>
1406
+ then<S>(fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike<S>): Chainable<S>
1337
1407
  /**
1338
1408
  * Enables you to work with the subject yielded from the previous command / promise.
1339
1409
  *
1340
1410
  * @see https://on.cypress.io/then
1341
1411
  */
1342
- then<S extends object | any[] | string | number | boolean>(fn: (this: ObjectLike, currentSubject: Subject) => S, options?: Partial<Timeoutable>): Chainable<S>
1412
+ then<S>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike<S>): Chainable<S>
1413
+ /**
1414
+ * Enables you to work with the subject yielded from the previous command / promise.
1415
+ *
1416
+ * @see https://on.cypress.io/then
1417
+ */
1418
+ then<S extends object | any[] | string | number | boolean>(fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<S>
1419
+ /**
1420
+ * Enables you to work with the subject yielded from the previous command / promise.
1421
+ *
1422
+ * @see https://on.cypress.io/then
1423
+ */
1424
+ then<S extends object | any[] | string | number | boolean>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<S>
1343
1425
  /**
1344
1426
  * Enables you to work with the subject yielded from the previous command.
1345
1427
  *
@@ -1348,7 +1430,16 @@ declare namespace Cypress {
1348
1430
  * cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg
1349
1431
  * cy.location().then((loc) => {}) // Yields location object as first arg
1350
1432
  */
1351
- then(fn: (this: ObjectLike, currentSubject: Subject) => void, options?: Partial<Timeoutable>): Chainable<Subject>
1433
+ then(fn: (this: ObjectLike, currentSubject: Subject) => void): Chainable<Subject>
1434
+ /**
1435
+ * Enables you to work with the subject yielded from the previous command.
1436
+ *
1437
+ * @see https://on.cypress.io/then
1438
+ * @example
1439
+ * cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg
1440
+ * cy.location().then((loc) => {}) // Yields location object as first arg
1441
+ */
1442
+ then(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => void): Chainable<Subject>
1352
1443
 
1353
1444
  /**
1354
1445
  * Move time after overriding a native time function with [cy.clock()](https://on.cypress.io/clock).
@@ -1502,9 +1593,12 @@ declare namespace Cypress {
1502
1593
  visit(url: string, options?: Partial<VisitOptions>): Chainable<Window>
1503
1594
 
1504
1595
  /**
1505
- * Wait for a number of milliseconds or wait for an aliased resource to resolve before moving on to the next command.
1596
+ * Wait for a number of milliseconds.
1597
+ * You almost never need to wait for an arbitrary period of time.
1598
+ * There are always better ways to express this in Cypress, see the documentation.
1506
1599
  *
1507
1600
  * @see https://on.cypress.io/wait
1601
+ * @param {number} ms - Milliseconds to wait.
1508
1602
  * @example
1509
1603
  * cy.wait(1000) // wait for 1 second
1510
1604
  */
@@ -1513,12 +1607,44 @@ declare namespace Cypress {
1513
1607
  * Wait for a specific XHR to respond.
1514
1608
  *
1515
1609
  * @see https://on.cypress.io/wait
1610
+ * @param {string} alias - Name of the alias to wait for.
1611
+ *
1612
+ ```
1613
+ // Wait for the route aliased as 'getAccount' to respond
1614
+ // without changing or stubbing its response
1615
+ cy.server()
1616
+ cy.route('/accounts/*').as('getAccount')
1617
+ cy.visit('/accounts/123')
1618
+ cy.wait('@getAccount').then((xhr) => {
1619
+ // we can now access the low level xhr
1620
+ // that contains the request body,
1621
+ // response body, status, etc
1622
+ })
1623
+ ```
1516
1624
  */
1517
1625
  wait(alias: string, options?: Partial<Loggable & Timeoutable & TimeoutableXHR>): Chainable<WaitXHR>
1518
1626
  /**
1519
1627
  * Wait for list of XHR requests to complete.
1520
1628
  *
1521
1629
  * @see https://on.cypress.io/wait
1630
+ * @param {string[]} aliases - An array of aliased routes as defined using the `.as()` command.
1631
+ *
1632
+ ```
1633
+ // wait for 3 XHR requests to complete
1634
+ cy.server()
1635
+ cy.route('users/*').as('getUsers')
1636
+ cy.route('activities/*').as('getActivities')
1637
+ cy.route('comments/*').as('getComments')
1638
+ cy.visit('/dashboard')
1639
+
1640
+ cy.wait(['@getUsers', '@getActivities', '@getComments'])
1641
+ .then((xhrs) => {
1642
+ // xhrs will now be an array of matching XHR's
1643
+ // xhrs[0] <-- getUsers
1644
+ // xhrs[1] <-- getActivities
1645
+ // xhrs[2] <-- getComments
1646
+ })
1647
+ ```
1522
1648
  */
1523
1649
  wait(alias: string[], options?: Partial<Loggable & Timeoutable & TimeoutableXHR>): Chainable<WaitXHR[]>
1524
1650
 
@@ -1527,11 +1653,13 @@ declare namespace Cypress {
1527
1653
  *
1528
1654
  * @see https://on.cypress.io/window
1529
1655
  * @example
1530
- * cy.visit('http://localhost:8080/app')
1531
- * cy.window().then(function(win){
1532
- * // win is the remote window
1533
- * // of the page at: http://localhost:8080/app
1534
- * })
1656
+ ```
1657
+ cy.visit('http://localhost:8080/app')
1658
+ cy.window().then(function(win){
1659
+ // win is the remote window
1660
+ // of the page at: http://localhost:8080/app
1661
+ })
1662
+ ```
1535
1663
  */
1536
1664
  window(options?: Partial<Loggable & Timeoutable>): Chainable<Window>
1537
1665
 
@@ -1540,14 +1668,15 @@ declare namespace Cypress {
1540
1668
  * Useful when working within a particular group of elements such as a `<form>`.
1541
1669
  * @see https://on.cypress.io/within
1542
1670
  * @example
1543
- * cy.get('form').within(($form) => {
1544
- * // cy.get() will only search for elements within form,
1545
- * // not within the entire document
1546
- * cy.get('input[name="username"]').type('john')
1547
- * cy.get('input[name="password"]').type('password')
1548
- * cy.root().submit()
1549
- * })
1550
- *
1671
+ ```
1672
+ cy.get('form').within(($form) => {
1673
+ // cy.get() will only search for elements within form,
1674
+ // not within the entire document
1675
+ cy.get('input[name="username"]').type('john')
1676
+ cy.get('input[name="password"]').type('password')
1677
+ cy.root().submit()
1678
+ })
1679
+ ```
1551
1680
  */
1552
1681
  within(fn: (currentSubject: Subject) => void): Chainable<Subject>
1553
1682
  /**
@@ -1562,10 +1691,13 @@ declare namespace Cypress {
1562
1691
  *
1563
1692
  * @see https://on.cypress.io/wrap
1564
1693
  * @example
1565
- * cy.get('form').within(($form) => {
1566
- * // more commands
1567
- * cy.wrap($form).should('have.class', 'form-container')
1568
- * })
1694
+ ```
1695
+ // wraps DOM element
1696
+ cy.get('form').within(($form) => {
1697
+ // more commands
1698
+ cy.wrap($form).should('have.class', 'form-container')
1699
+ })
1700
+ ```
1569
1701
  */
1570
1702
  wrap<E extends Node = HTMLElement>(element: E | JQuery<E>, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
1571
1703
  /**
@@ -1573,9 +1705,11 @@ declare namespace Cypress {
1573
1705
  *
1574
1706
  * @see https://on.cypress.io/wrap
1575
1707
  * @example
1576
- * cy.wrap(new Promise((resolve, reject) => {
1577
- * setTimeout(resolve, 1000);
1578
- * }).then(result => {})
1708
+ ```
1709
+ cy.wrap(new Promise((resolve, reject) => {
1710
+ setTimeout(resolve, 1000);
1711
+ }).then(result => {})
1712
+ ```
1579
1713
  */
1580
1714
  wrap<F extends Promise<S>, S>(promise: F, options?: Partial<Loggable & Timeoutable>): Chainable<S>
1581
1715
  /**
@@ -1583,10 +1717,12 @@ declare namespace Cypress {
1583
1717
  *
1584
1718
  * @see https://on.cypress.io/wrap
1585
1719
  * @example
1586
- * // Make assertions about object
1587
- * cy.wrap({ amount: 10 })
1588
- * .should('have.property', 'amount')
1589
- * .and('eq', 10)
1720
+ ```
1721
+ // Make assertions about object
1722
+ cy.wrap({ amount: 10 })
1723
+ .should('have.property', 'amount')
1724
+ .and('eq', 10)
1725
+ ```
1590
1726
  */
1591
1727
  wrap<S>(object: S, options?: Partial<Loggable & Timeoutable>): Chainable<S>
1592
1728
 
@@ -1594,6 +1730,12 @@ declare namespace Cypress {
1594
1730
  * Write to a file with the specified contents.
1595
1731
  *
1596
1732
  * @see https://on.cypress.io/writefile
1733
+ ```
1734
+ cy.writeFile('path/to/message.txt', 'Hello World')
1735
+ .then((text) => {
1736
+ expect(text).to.equal('Hello World') // true
1737
+ })
1738
+ ```
1597
1739
  */
1598
1740
  writeFile<C extends FileContents>(filePath: string, contents: C, options?: Partial<Loggable>): Chainable<C>
1599
1741
  /**
@@ -3674,26 +3816,28 @@ declare namespace Cypress {
3674
3816
  * Fires when an uncaught exception occurs in your application.
3675
3817
  * Cypress will fail the test when this fires.
3676
3818
  * Return `false` from this event and Cypress will not fail the test. Also useful for debugging purposes because the actual `error` instance is provided to you.
3677
- * @example
3678
- * // likely want to do this in a support file
3679
- * // so it's applied to all spec files
3680
- * // cypress/support/index.js
3681
- *
3682
- * Cypress.on('uncaught:exception', (err, runnable) => {
3683
- * // returning false here prevents Cypress from
3684
- * // failing the test
3685
- * return false
3686
- * })
3687
- * // stub "window.alert" in a single test
3688
- * it('shows alert', () => {
3689
- * const stub = cy.stub()
3690
- * cy.on('window:alert', stub)
3691
- * // trigger application code that calls alert(...)
3692
- * .then(() => {
3693
- * expect(stub).to.have.been.calledOnce
3694
- * })
3695
- * })
3696
3819
  * @see https://on.cypress.io/catalog-of-events#App-Events
3820
+ * @example
3821
+ ```
3822
+ // likely want to do this in a support file
3823
+ // so it's applied to all spec files
3824
+ // cypress/support/index.js
3825
+
3826
+ Cypress.on('uncaught:exception', (err, runnable) => {
3827
+ // returning false here prevents Cypress from
3828
+ // failing the test
3829
+ return false
3830
+ })
3831
+ // stub "window.alert" in a single test
3832
+ it('shows alert', () => {
3833
+ const stub = cy.stub()
3834
+ cy.on('window:alert', stub)
3835
+ // trigger application code that calls alert(...)
3836
+ .then(() => {
3837
+ expect(stub).to.have.been.calledOnce
3838
+ })
3839
+ })
3840
+ ```
3697
3841
  */
3698
3842
  (action: 'uncaught:exception', fn: (error: Error, runnable: Mocha.IRunnable) => false | void): void
3699
3843
  /**
@@ -3701,23 +3845,28 @@ declare namespace Cypress {
3701
3845
  * Cypress will auto accept confirmations. Return `false` from this event and the confirmation will be cancelled.
3702
3846
  * @see https://on.cypress.io/catalog-of-events#App-Events
3703
3847
  * @example
3704
- * cy.on('window:confirm', (str) => {
3705
- * console.log(str)
3706
- * return false // simulate "Cancel"
3707
- * })
3848
+ ```
3849
+ cy.on('window:confirm', (str) => {
3850
+ console.log(str)
3851
+ return false // simulate "Cancel"
3852
+ })
3853
+ ```
3708
3854
  */
3709
3855
  (action: 'window:confirm', fn: ((text: string) => false | void) | Agent<sinon.SinonSpy>): void
3710
3856
  /**
3711
3857
  * Fires when your app calls the global `window.alert()` method.
3712
3858
  * Cypress will auto accept alerts. You cannot change this behavior.
3713
3859
  * @example
3714
- * const stub = cy.stub()
3715
- * cy.on('window:alert', stub)
3716
- * // assume the button calls window.alert()
3717
- * cy.get('.my-button').click()
3718
- * .then(() => {
3719
- * expect(stub).to.have.been.calledOnce
3720
- * })
3860
+ ```
3861
+ const stub = cy.stub()
3862
+ cy.on('window:alert', stub)
3863
+ // assume the button calls window.alert()
3864
+ cy.get('.my-button')
3865
+ .click()
3866
+ .then(() => {
3867
+ expect(stub).to.have.been.calledOnce
3868
+ })
3869
+ ```
3721
3870
  * @see https://on.cypress.io/catalog-of-events#App-Events
3722
3871
  */
3723
3872
  (action: 'window:alert', fn: ((text: string) => void) | Agent<sinon.SinonSpy>): void
@@ -3931,26 +4080,29 @@ declare namespace Cypress {
3931
4080
  left: number
3932
4081
  }
3933
4082
 
3934
- // Diff / Omit taken from https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-311923766
4083
+ // Diff taken from https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-311923766
3935
4084
  type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
3936
- // TODO - remove this if possible. Seems a recent change to TypeScript broke this. Possibly https://github.com/Microsoft/TypeScript/pull/17912
3937
- type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>> // tslint:disable-line
4085
+ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
3938
4086
  }
3939
4087
 
3940
4088
  /**
3941
4089
  * Global variables `cy` added by Cypress with all API commands.
3942
4090
  * @see https://on.cypress.io/api
3943
4091
  * @example
3944
- * cy.get('button').click()
3945
- * cy.get('.result').contains('Expected text')
4092
+ ```
4093
+ cy.get('button').click()
4094
+ cy.get('.result').contains('Expected text')
4095
+ ```
3946
4096
  */
3947
4097
  declare const cy: Cypress.Chainable<undefined>
3948
4098
  /**
3949
4099
  * Global variable `Cypress` holds common utilities and constants.
3950
4100
  * @see https://on.cypress.io/api
3951
4101
  * @example
3952
- * Cypress.config("pageLoadTimeout") // => 60000
3953
- * Cypress.version // => "1.4.0"
3954
- * Cypress._ // => Lodash _
4102
+ ```
4103
+ Cypress.config("pageLoadTimeout") // => 60000
4104
+ Cypress.version // => "1.4.0"
4105
+ Cypress._ // => Lodash _
4106
+ ```
3955
4107
  */
3956
4108
  declare const Cypress: Cypress.Cypress