cypress 8.4.1 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
package/lib/cli.js CHANGED
@@ -3,8 +3,6 @@
3
3
  // @ts-check
4
4
  const _ = require('lodash');
5
5
 
6
- const R = require('ramda');
7
-
8
6
  const commander = require('commander');
9
7
 
10
8
  const {
@@ -238,11 +236,18 @@ const castCypressRunOptions = opts => {
238
236
  // only properties that have type "string | false" in our TS definition
239
237
  // require special handling, because CLI parsing takes care of purely
240
238
  // boolean arguments
241
- const result = R.evolve({
242
- port: coerceAnyStringToInt,
243
- configFile: coerceFalseOrString
244
- })(opts);
245
- return result;
239
+ const castOpts = { ...opts
240
+ };
241
+
242
+ if (_.has(opts, 'port')) {
243
+ castOpts.port = coerceAnyStringToInt(opts.port);
244
+ }
245
+
246
+ if (_.has(opts, 'configFile')) {
247
+ castOpts.configFile = coerceFalseOrString(opts.configFile);
248
+ }
249
+
250
+ return castOpts;
246
251
  };
247
252
 
248
253
  module.exports = {
package/lib/cypress.js CHANGED
@@ -70,6 +70,24 @@ const cypressModuleApi = {
70
70
  return cli.parseRunCommand(args);
71
71
  }
72
72
 
73
+ },
74
+
75
+ /**
76
+ * Provides automatic code completion for configuration in many popular code editors.
77
+ * While it's not strictly necessary for Cypress to parse your configuration, we
78
+ * recommend wrapping your config object with `defineConfig()`
79
+ * @example
80
+ * module.exports = defineConfig({
81
+ * viewportWith: 400
82
+ * })
83
+ *
84
+ * @see ../types/cypress-npm-api.d.ts
85
+ * @param {Cypress.ConfigOptions} config
86
+ * @returns {Cypress.ConfigOptions} the configuration passed in parameter
87
+ */
88
+ defineConfig(config) {
89
+ return config;
73
90
  }
91
+
74
92
  };
75
93
  module.exports = cypressModuleApi;
package/lib/errors.js CHANGED
@@ -7,10 +7,6 @@ const {
7
7
  stripIndents
8
8
  } = require('common-tags');
9
9
 
10
- const {
11
- merge
12
- } = require('ramda');
13
-
14
10
  const la = require('lazy-ass');
15
11
 
16
12
  const is = require('check-more-types');
@@ -45,6 +41,12 @@ const invalidRunProjectPath = {
45
41
  ${chalk.blue(runDocumentationUrl)}
46
42
  `
47
43
  };
44
+ const invalidOS = {
45
+ description: 'The Cypress App could not be installed. Your machine does not meet the operating system requirements.',
46
+ solution: stripIndent`
47
+
48
+ ${chalk.blue('https://on.cypress.io/guides/getting-started/installing-cypress#system-requirements')}`
49
+ };
48
50
  const failedDownload = {
49
51
  description: 'The Cypress App could not be downloaded.',
50
52
  solution: stripIndent`
@@ -233,9 +235,9 @@ const CYPRESS_RUN_BINARY = {
233
235
 
234
236
  function addPlatformInformation(info) {
235
237
  return util.getPlatformInfo().then(platform => {
236
- return merge(info, {
238
+ return { ...info,
237
239
  platform
238
- });
240
+ };
239
241
  });
240
242
  }
241
243
  /**
@@ -374,6 +376,7 @@ module.exports = {
374
376
  missingApp,
375
377
  notInstalledCI,
376
378
  missingDependency,
379
+ invalidOS,
377
380
  invalidSmokeTestDisplayError,
378
381
  versionMismatch,
379
382
  binaryNotExecutable,
package/lib/exec/info.js CHANGED
@@ -13,9 +13,7 @@ const chalk = require('chalk');
13
13
 
14
14
  const prettyBytes = require('pretty-bytes');
15
15
 
16
- const _ = require('lodash');
17
-
18
- const R = require('ramda'); // color for numbers and show values
16
+ const _ = require('lodash'); // color for numbers and show values
19
17
 
20
18
 
21
19
  const g = chalk.green; // color for paths
@@ -30,14 +28,21 @@ methods.findProxyEnvironmentVariables = () => {
30
28
  return _.pick(process.env, ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY']);
31
29
  };
32
30
 
33
- const maskSensitiveVariables = R.evolve({
34
- CYPRESS_RECORD_KEY: R.always('<redacted>')
35
- });
31
+ const maskSensitiveVariables = obj => {
32
+ const masked = { ...obj
33
+ };
34
+
35
+ if (masked.CYPRESS_RECORD_KEY) {
36
+ masked.CYPRESS_RECORD_KEY = '<redacted>';
37
+ }
38
+
39
+ return masked;
40
+ };
36
41
 
37
42
  methods.findCypressEnvironmentVariables = () => {
38
43
  const isCyVariable = (val, key) => key.startsWith('CYPRESS_');
39
44
 
40
- return R.pickBy(isCyVariable)(process.env);
45
+ return _.pickBy(process.env, isCyVariable);
41
46
  };
42
47
 
43
48
  const formatCypressVariables = () => {
package/lib/exec/spawn.js CHANGED
@@ -86,7 +86,7 @@ module.exports = {
86
86
  args = [args];
87
87
  }
88
88
 
89
- args = [...args, '--cwd', process.cwd()];
89
+ args = [...args, '--cwd', process.cwd(), '--userNodePath', process.execPath, '--userNodeVersion', process.versions.node];
90
90
 
91
91
  _.defaults(options, {
92
92
  dev: false,
package/lib/logger.js CHANGED
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- const R = require('ramda');
4
-
5
3
  const chalk = require('chalk');
6
4
 
7
5
  let logs = [];
@@ -36,7 +34,10 @@ const always = (...messages) => {
36
34
 
37
35
  const logLines = text => {
38
36
  const lines = text.split('\n');
39
- R.forEach(log, lines);
37
+
38
+ for (const line of lines) {
39
+ log(line);
40
+ }
40
41
  };
41
42
 
42
43
  const print = () => {
@@ -24,6 +24,8 @@ const {
24
24
  stripIndent
25
25
  } = require('common-tags');
26
26
 
27
+ const getProxyForUrl = require('proxy-from-env').getProxyForUrl;
28
+
27
29
  const {
28
30
  throwFormErrorText,
29
31
  errors
@@ -35,21 +37,8 @@ const util = require('../util');
35
37
 
36
38
  const defaultBaseUrl = 'https://download.cypress.io/';
37
39
 
38
- const getProxyUrl = () => {
39
- return process.env.HTTPS_PROXY || process.env.https_proxy || process.env.npm_config_https_proxy || process.env.HTTP_PROXY || process.env.http_proxy || process.env.npm_config_proxy || null;
40
- };
41
-
42
- const getRealOsArch = () => {
43
- // os.arch() returns the arch for which this node was compiled
44
- // we want the operating system's arch instead: x64 or x86
45
- const osArch = arch();
46
-
47
- if (osArch === 'x86') {
48
- // match process.platform output
49
- return 'ia32';
50
- }
51
-
52
- return osArch;
40
+ const getProxyForUrlWithNpmConfig = url => {
41
+ return getProxyForUrl(url) || process.env.npm_config_https_proxy || process.env.npm_config_proxy || null;
53
42
  };
54
43
 
55
44
  const getBaseUrl = () => {
@@ -89,8 +78,7 @@ const getCA = () => {
89
78
  const prepend = urlPath => {
90
79
  const endpoint = url.resolve(getBaseUrl(), urlPath);
91
80
  const platform = os.platform();
92
- const arch = getRealOsArch();
93
- return `${endpoint}?platform=${platform}&arch=${arch}`;
81
+ return `${endpoint}?platform=${platform}&arch=${arch()}`;
94
82
  };
95
83
 
96
84
  const getUrl = version => {
@@ -198,7 +186,7 @@ const downloadFromUrl = ({
198
186
  ca
199
187
  }) => {
200
188
  return new Promise((resolve, reject) => {
201
- const proxy = getProxyUrl();
189
+ const proxy = getProxyForUrlWithNpmConfig(url);
202
190
  debug('Downloading package', {
203
191
  url,
204
192
  proxy,
@@ -338,6 +326,6 @@ const start = opts => {
338
326
  module.exports = {
339
327
  start,
340
328
  getUrl,
341
- getProxyUrl,
329
+ getProxyForUrlWithNpmConfig,
342
330
  getCA
343
331
  };
@@ -226,6 +226,12 @@ const downloadAndUnzip = ({
226
226
  return Promise.resolve(tasks.run());
227
227
  };
228
228
 
229
+ const validateOS = () => {
230
+ return util.getPlatformInfo().then(platformInfo => {
231
+ return platformInfo.match(/(darwin|linux|win32)-x64/);
232
+ });
233
+ };
234
+
229
235
  const start = (options = {}) => {
230
236
  debug('installing with options %j', options);
231
237
 
@@ -269,7 +275,13 @@ const start = (options = {}) => {
269
275
  const installDir = state.getVersionDir(pkgVersion);
270
276
  const cacheDir = state.getCacheDir();
271
277
  const binaryDir = state.getBinaryDir(pkgVersion);
272
- return fs.ensureDirAsync(cacheDir).catch({
278
+ return validateOS().then(isValid => {
279
+ if (!isValid) {
280
+ return throwFormErrorText(errors.invalidOS)();
281
+ }
282
+ }).then(() => {
283
+ return fs.ensureDirAsync(cacheDir);
284
+ }).catch({
273
285
  code: 'EACCES'
274
286
  }, err => {
275
287
  return throwFormErrorText(errors.invalidCacheDirectory)(stripIndent`
@@ -8,8 +8,6 @@ const path = require('path');
8
8
 
9
9
  const untildify = require('untildify');
10
10
 
11
- const R = require('ramda');
12
-
13
11
  const debug = require('debug')('cypress:cli');
14
12
 
15
13
  const fs = require('../fs');
@@ -203,9 +201,12 @@ const getBinaryPkgAsync = binaryDir => {
203
201
  });
204
202
  };
205
203
 
206
- const getBinaryPkgVersion = R.propOr(null, 'version');
207
- const getBinaryElectronVersion = R.propOr(null, 'electronVersion');
208
- const getBinaryElectronNodeVersion = R.propOr(null, 'electronNodeVersion');
204
+ const getBinaryPkgVersion = o => _.get(o, 'version', null);
205
+
206
+ const getBinaryElectronVersion = o => _.get(o, 'electronVersion', null);
207
+
208
+ const getBinaryElectronNodeVersion = o => _.get(o, 'electronNodeVersion', null);
209
+
209
210
  module.exports = {
210
211
  getPathToExecutable,
211
212
  getPlatformExecutable,
package/lib/util.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  const _ = require('lodash');
4
4
 
5
- const R = require('ramda');
5
+ const arch = require('arch');
6
6
 
7
7
  const os = require('os');
8
8
 
@@ -133,9 +133,8 @@ const logBrokenGtkDisplayWarning = () => {
133
133
  };
134
134
 
135
135
  function stdoutLineMatches(expectedLine, stdout) {
136
- const lines = stdout.split('\n').map(R.trim);
137
- const lineMatches = R.equals(expectedLine);
138
- return lines.some(lineMatches);
136
+ const lines = stdout.split('\n').map(val => val.trim());
137
+ return lines.some(line => line === expectedLine);
139
138
  }
140
139
  /**
141
140
  * Confirms if given value is a valid CYPRESS_INTERNAL_ENV value. Undefined values
@@ -220,11 +219,16 @@ const parseOpts = opts => {
220
219
  // remove double quotes from certain options
221
220
 
222
221
 
223
- const removeQuotes = {
224
- group: dequote,
225
- ciBuildId: dequote
222
+ const cleanOpts = { ...opts
226
223
  };
227
- const cleanOpts = R.evolve(removeQuotes, opts);
224
+ const toDequote = ['group', 'ciBuildId'];
225
+
226
+ for (const prop of toDequote) {
227
+ if (_.has(opts, prop)) {
228
+ cleanOpts[prop] = dequote(opts[prop]);
229
+ }
230
+ }
231
+
228
232
  debug('parsed cli options %o', cleanOpts);
229
233
  return cleanOpts;
230
234
  };
@@ -404,8 +408,14 @@ const util = {
404
408
 
405
409
  getPlatformInfo() {
406
410
  return util.getOsVersionAsync().then(version => {
411
+ let osArch = arch();
412
+
413
+ if (osArch === 'x86') {
414
+ osArch = 'ia32';
415
+ }
416
+
407
417
  return stripIndent`
408
- Platform: ${os.platform()} (${version})
418
+ Platform: ${os.platform()}-${osArch} (${version})
409
419
  Cypress Version: ${util.pkgVersion()}
410
420
  `;
411
421
  });
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "cypress",
3
- "version": "8.4.1",
3
+ "version": "9.0.0",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "postinstall": "node index.js --exec install",
7
7
  "size": "t=\"$(npm pack .)\"; wc -c \"${t}\"; tar tvf \"${t}\"; rm \"${t}\";"
8
8
  },
9
9
  "dependencies": {
10
- "@cypress/request": "^2.88.6",
10
+ "@cypress/request": "^2.88.7",
11
11
  "@cypress/xvfb": "^1.2.4",
12
12
  "@types/node": "^14.14.31",
13
13
  "@types/sinonjs__fake-timers": "^6.0.2",
@@ -41,7 +41,7 @@
41
41
  "minimist": "^1.2.5",
42
42
  "ospath": "^1.2.2",
43
43
  "pretty-bytes": "^5.6.0",
44
- "ramda": "~0.27.1",
44
+ "proxy-from-env": "1.0.0",
45
45
  "request-progress": "^3.0.0",
46
46
  "supports-color": "^8.1.1",
47
47
  "tmp": "~0.2.1",
@@ -1,11 +1,12 @@
1
1
  // Shim definition to export a namespace. Cypress is actually a global module
2
2
  // so import/export isn't allowed there. We import here and define a global module
3
3
  // so that Cypress can get and use the Blob type
4
- import BluebirdStatic = require('./bluebird')
4
+ import ImportedBluebird = require('./bluebird')
5
5
 
6
6
  export = Bluebird
7
7
  export as namespace Bluebird
8
8
 
9
9
  declare namespace Bluebird {
10
- type BluebirdStatic = typeof BluebirdStatic
10
+ type BluebirdStatic = typeof ImportedBluebird
11
+ interface Promise<T> extends ImportedBluebird<T> {}
11
12
  }
@@ -91,6 +91,10 @@ declare namespace CypressCommandLine {
91
91
  * Specify mocha reporter options
92
92
  */
93
93
  reporterOptions: any
94
+ /**
95
+ * Slow test threshold in milliseconds. Only affects the visual output of some reporters. For example, the spec reporter will display the test time in yellow if over the threshold.
96
+ */
97
+ slowTestThreshold: number
94
98
  /**
95
99
  * Specify the specs to run
96
100
  */
@@ -377,6 +381,21 @@ declare module 'cypress' {
377
381
  * Cypress does
378
382
  */
379
383
  cli: CypressCommandLine.CypressCliParser
384
+
385
+ /**
386
+ * Provides automatic code completion for configuration in many popular code editors.
387
+ * While it's not strictly necessary for Cypress to parse your configuration, we
388
+ * recommend wrapping your config object with `defineConfig()`
389
+ * @example
390
+ * module.exports = defineConfig({
391
+ * viewportWith: 400
392
+ * })
393
+ *
394
+ * @see ../types/cypress-npm-api.d.ts
395
+ * @param {Cypress.ConfigOptions} config
396
+ * @returns {Cypress.ConfigOptions} the configuration passed in parameter
397
+ */
398
+ defineConfig(config: Cypress.ConfigOptions): Cypress.ConfigOptions
380
399
  }
381
400
 
382
401
  // export Cypress NPM module interface
@@ -168,7 +168,12 @@ declare namespace Cypress {
168
168
  /**
169
169
  * The interface for user-defined properties in Window object under test.
170
170
  */
171
- interface ApplicationWindow {} // tslint:disable-line
171
+ interface ApplicationWindow { } // tslint:disable-line
172
+
173
+ /**
174
+ * The configuration for Cypress.
175
+ */
176
+ type Config = ResolvedConfigOptions & RuntimeConfigOptions
172
177
 
173
178
  /**
174
179
  * Several libraries are bundled with Cypress by default.
@@ -275,7 +280,7 @@ declare namespace Cypress {
275
280
  * Currently executing test runnable instance.
276
281
  */
277
282
  currentTest: {
278
- title: string,
283
+ title: string
279
284
  titlePath: string[]
280
285
  }
281
286
 
@@ -297,7 +302,7 @@ declare namespace Cypress {
297
302
  /**
298
303
  * Fire automation:request event for internal use.
299
304
  */
300
- automation(eventName: string, ...args: any[]): Promise<any>
305
+ automation(eventName: string, ...args: any[]): Bluebird.Promise<any>
301
306
 
302
307
  /**
303
308
  * Promise wrapper for certain internal tasks.
@@ -313,7 +318,7 @@ declare namespace Cypress {
313
318
  // {defaultCommandTimeout: 10000, pageLoadTimeout: 30000, ...}
314
319
  ```
315
320
  */
316
- config(): ResolvedConfigOptions & RuntimeConfigOptions
321
+ config(): Config
317
322
  /**
318
323
  * Returns one configuration value.
319
324
  * @see https://on.cypress.io/config
@@ -415,9 +420,9 @@ declare namespace Cypress {
415
420
  * @see https://on.cypress.io/api/commands
416
421
  */
417
422
  Commands: {
418
- add(name: string, fn: (...args: any[]) => CanReturnChainable): void
419
- add(name: string, options: CommandOptions, fn: (...args: any[]) => CanReturnChainable): void
420
- overwrite(name: string, fn: (...args: any[]) => CanReturnChainable): void
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
421
426
  }
422
427
 
423
428
  /**
@@ -521,7 +526,7 @@ declare namespace Cypress {
521
526
  /**
522
527
  * @see https://on.cypress.io/keyboard-api
523
528
  */
524
- Keyboard: {
529
+ Keyboard: {
525
530
  defaults(options: Partial<KeyboardDefaultsOptions>): void
526
531
  }
527
532
 
@@ -579,7 +584,7 @@ declare namespace Cypress {
579
584
  }
580
585
 
581
586
  interface SessionOptions {
582
- validate?: () => false|void
587
+ validate?: () => false | void
583
588
  }
584
589
 
585
590
  type CanReturnChainable = void | Chainable | Promise<unknown>
@@ -717,36 +722,36 @@ declare namespace Cypress {
717
722
  ```
718
723
  */
719
724
  clearLocalStorage(re: RegExp): Chainable<Storage>
720
- /**
721
- * Clear data in local storage.
722
- * Cypress automatically runs this command before each test to prevent state from being
723
- * shared across tests. You shouldn’t need to use this command unless you’re using it
724
- * to clear localStorage inside a single test. Yields `localStorage` object.
725
- *
726
- * @see https://on.cypress.io/clearlocalstorage
727
- * @param {options} [object] - options object
728
- * @example
729
- ```
730
- // Removes all local storage items, without logging
731
- cy.clearLocalStorage({ log: false })
732
- ```
733
- */
725
+ /**
726
+ * Clear data in local storage.
727
+ * Cypress automatically runs this command before each test to prevent state from being
728
+ * shared across tests. You shouldn’t need to use this command unless you’re using it
729
+ * to clear localStorage inside a single test. Yields `localStorage` object.
730
+ *
731
+ * @see https://on.cypress.io/clearlocalstorage
732
+ * @param {options} [object] - options object
733
+ * @example
734
+ ```
735
+ // Removes all local storage items, without logging
736
+ cy.clearLocalStorage({ log: false })
737
+ ```
738
+ */
734
739
  clearLocalStorage(options: Partial<Loggable>): Chainable<Storage>
735
- /**
736
- * Clear data in local storage.
737
- * Cypress automatically runs this command before each test to prevent state from being
738
- * shared across tests. You shouldn’t need to use this command unless you’re using it
739
- * to clear localStorage inside a single test. Yields `localStorage` object.
740
- *
741
- * @see https://on.cypress.io/clearlocalstorage
742
- * @param {string} [key] - name of a particular item to remove (optional).
743
- * @param {options} [object] - options object
744
- * @example
745
- ```
746
- // Removes item "todos" without logging
747
- cy.clearLocalStorage("todos", { log: false })
748
- ```
749
- */
740
+ /**
741
+ * Clear data in local storage.
742
+ * Cypress automatically runs this command before each test to prevent state from being
743
+ * shared across tests. You shouldn’t need to use this command unless you’re using it
744
+ * to clear localStorage inside a single test. Yields `localStorage` object.
745
+ *
746
+ * @see https://on.cypress.io/clearlocalstorage
747
+ * @param {string} [key] - name of a particular item to remove (optional).
748
+ * @param {options} [object] - options object
749
+ * @example
750
+ ```
751
+ // Removes item "todos" without logging
752
+ cy.clearLocalStorage("todos", { log: false })
753
+ ```
754
+ */
750
755
  clearLocalStorage(key: string, options: Partial<Loggable>): Chainable<Storage>
751
756
 
752
757
  /**
@@ -834,7 +839,7 @@ declare namespace Cypress {
834
839
  * // or use this shortcut
835
840
  * cy.clock().invoke('restore')
836
841
  */
837
- clock(now: number|Date, options?: Loggable): Chainable<Clock>
842
+ clock(now: number | Date, options?: Loggable): Chainable<Clock>
838
843
  /**
839
844
  * Mocks global clock but only overrides specific functions.
840
845
  *
@@ -843,7 +848,7 @@ declare namespace Cypress {
843
848
  * // keep current date but override "setTimeout" and "clearTimeout"
844
849
  * cy.clock(null, ['setTimeout', 'clearTimeout'])
845
850
  */
846
- clock(now: number|Date, functions?: Array<'setTimeout' | 'clearTimeout' | 'setInterval' | 'clearInterval' | 'Date'>, options?: Loggable): Chainable<Clock>
851
+ clock(now: number | Date, functions?: Array<'setTimeout' | 'clearTimeout' | 'setInterval' | 'clearInterval' | 'Date'>, options?: Loggable): Chainable<Clock>
847
852
  /**
848
853
  * Mocks global clock and all functions.
849
854
  *
@@ -977,14 +982,14 @@ declare namespace Cypress {
977
982
  */
978
983
  debug(options?: Partial<Loggable>): Chainable<Subject>
979
984
 
980
- /**
981
- * Save/Restore browser Cookies, LocalStorage, and SessionStorage data resulting from the supplied `setup` function.
982
- *
983
- * Only available if the `experimentalSessionSupport` config option is enabled.
984
- *
985
- * @see https://on.cypress.io/session
986
- */
987
- session(id: string|object, setup?: SessionOptions['validate'], options?: SessionOptions): Chainable<null>
985
+ /**
986
+ * Save/Restore browser Cookies, LocalStorage, and SessionStorage data resulting from the supplied `setup` function.
987
+ *
988
+ * Only available if the `experimentalSessionSupport` config option is enabled.
989
+ *
990
+ * @see https://on.cypress.io/session
991
+ */
992
+ session(id: string | object, setup?: SessionOptions['validate'], options?: SessionOptions): Chainable<null>
988
993
 
989
994
  /**
990
995
  * Get the window.document of the page that is currently active.
@@ -1648,17 +1653,11 @@ declare namespace Cypress {
1648
1653
  scrollTo(x: number | string, y: number | string, options?: Partial<ScrollToOptions>): Chainable<Subject>
1649
1654
 
1650
1655
  /**
1651
- * Select an `<option>` with specific text within a `<select>`.
1652
- *
1653
- * @see https://on.cypress.io/select
1654
- */
1655
- select(text: string | string[], options?: Partial<SelectOptions>): Chainable<Subject>
1656
- /**
1657
- * Select an `<option>` with specific value(s) within a `<select>`.
1656
+ * Select an `<option>` with specific text, value, or index within a `<select>`.
1658
1657
  *
1659
1658
  * @see https://on.cypress.io/select
1660
1659
  */
1661
- select(value: string | string[], options?: Partial<SelectOptions>): Chainable<Subject>
1660
+ select(valueOrTextOrIndex: string | number | Array<string | number>, options?: Partial<SelectOptions>): Chainable<Subject>
1662
1661
 
1663
1662
  /**
1664
1663
  * @deprecated Use `cy.intercept()` instead.
@@ -1909,13 +1908,13 @@ declare namespace Cypress {
1909
1908
  *
1910
1909
  * @see https://on.cypress.io/then
1911
1910
  */
1912
- then<S extends HTMLElement>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<JQuery<S>>
1913
- /**
1914
- * Enables you to work with the subject yielded from the previous command / promise.
1915
- *
1916
- * @see https://on.cypress.io/then
1917
- */
1918
- then<S extends ArrayLike<HTMLElement>>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<JQuery<S extends ArrayLike<infer T> ? T : never>>
1911
+ then<S extends HTMLElement>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<JQuery<S>>
1912
+ /**
1913
+ * Enables you to work with the subject yielded from the previous command / promise.
1914
+ *
1915
+ * @see https://on.cypress.io/then
1916
+ */
1917
+ then<S extends ArrayLike<HTMLElement>>(options: Partial<Timeoutable>, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable<JQuery<S extends ArrayLike<infer T> ? T : never>>
1919
1918
  /**
1920
1919
  * Enables you to work with the subject yielded from the previous command / promise.
1921
1920
  *
@@ -2578,6 +2577,11 @@ declare namespace Cypress {
2578
2577
  * @default "spec"
2579
2578
  */
2580
2579
  reporterOptions: { [key: string]: any }
2580
+ /**
2581
+ * Slow test threshold in milliseconds. Only affects the visual output of some reporters. For example, the spec reporter will display the test time in yellow if over the threshold.
2582
+ * @default 10000
2583
+ */
2584
+ slowTestThreshold: number
2581
2585
  /**
2582
2586
  * Whether Cypress will watch and restart tests on test file changes
2583
2587
  * @default true
@@ -2754,7 +2758,7 @@ declare namespace Cypress {
2754
2758
  * To enable test retries only in runMode, set e.g. `{ openMode: null, runMode: 2 }`
2755
2759
  * @default null
2756
2760
  */
2757
- retries: Nullable<number | {runMode?: Nullable<number>, openMode?: Nullable<number>}>
2761
+ retries: Nullable<number | { runMode?: Nullable<number>, openMode?: Nullable<number> }>
2758
2762
  /**
2759
2763
  * Enables including elements within the shadow DOM when using querying
2760
2764
  * commands (e.g. cy.get(), cy.find()). Can be set globally in cypress.json,
@@ -2891,7 +2895,7 @@ declare namespace Cypress {
2891
2895
  * All configuration items are optional.
2892
2896
  */
2893
2897
  type CoreConfigOptions = Partial<Omit<ResolvedConfigOptions, TestingType>>
2894
- type ConfigOptions = CoreConfigOptions & {e2e?: CoreConfigOptions, component?: CoreConfigOptions }
2898
+ type ConfigOptions = CoreConfigOptions & { e2e?: CoreConfigOptions, component?: CoreConfigOptions }
2895
2899
 
2896
2900
  interface PluginConfigOptions extends ResolvedConfigOptions {
2897
2901
  /**
@@ -2998,6 +3002,7 @@ declare namespace Cypress {
2998
3002
  disableTimersAndAnimations: boolean
2999
3003
  padding: Padding
3000
3004
  scale: boolean
3005
+ overwrite: boolean
3001
3006
  onBeforeScreenshot: ($el: JQuery) => void
3002
3007
  onAfterScreenshot: ($el: JQuery, props: {
3003
3008
  path: string
@@ -5672,7 +5677,7 @@ declare namespace Cypress {
5672
5677
  xhr: XMLHttpRequest
5673
5678
  }
5674
5679
 
5675
- type Encodings = 'ascii' | 'base64' | 'binary' | 'hex' | 'latin1' | 'utf8' | 'utf-8' | 'ucs2' | 'ucs-2' | 'utf16le' | 'utf-16le'
5680
+ type Encodings = 'ascii' | 'base64' | 'binary' | 'hex' | 'latin1' | 'utf8' | 'utf-8' | 'ucs2' | 'ucs-2' | 'utf16le' | 'utf-16le' | null
5676
5681
  type PositionType = 'topLeft' | 'top' | 'topRight' | 'left' | 'center' | 'right' | 'bottomLeft' | 'bottom' | 'bottomRight'
5677
5682
  type ViewportPreset = 'macbook-16' | 'macbook-15' | 'macbook-13' | 'macbook-11' | 'ipad-2' | 'ipad-mini' | 'iphone-xr' | 'iphone-x' | 'iphone-6+' | 'iphone-se2' | 'iphone-8' | 'iphone-7' | 'iphone-6' | 'iphone-5' | 'iphone-4' | 'iphone-3' | 'samsung-s10' | 'samsung-note9'
5678
5683
  interface Offset {
@@ -5703,48 +5708,48 @@ declare namespace Cypress {
5703
5708
  }
5704
5709
  ```
5705
5710
  */
5706
- interface cy extends Chainable<undefined> {}
5711
+ interface cy extends Chainable<undefined> { }
5707
5712
  }
5708
5713
 
5709
5714
  declare namespace Mocha {
5710
5715
  interface TestFunction {
5711
- /**
5712
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5713
- * as a thunk.
5714
- */
5715
- (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5716
-
5717
- /**
5718
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5719
- * as a thunk.
5720
- */
5721
- (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5716
+ /**
5717
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5718
+ * as a thunk.
5719
+ */
5720
+ (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5721
+
5722
+ /**
5723
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5724
+ * as a thunk.
5725
+ */
5726
+ (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5722
5727
  }
5723
5728
  interface ExclusiveTestFunction {
5724
- /**
5725
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5726
- * as a thunk.
5727
- */
5728
- (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5729
-
5730
- /**
5731
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5732
- * as a thunk.
5733
- */
5734
- (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5729
+ /**
5730
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5731
+ * as a thunk.
5732
+ */
5733
+ (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5734
+
5735
+ /**
5736
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5737
+ * as a thunk.
5738
+ */
5739
+ (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5735
5740
  }
5736
5741
  interface PendingTestFunction {
5737
- /**
5738
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5739
- * as a thunk.
5740
- */
5741
- (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5742
-
5743
- /**
5744
- * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5745
- * as a thunk.
5746
- */
5747
- (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5742
+ /**
5743
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5744
+ * as a thunk.
5745
+ */
5746
+ (title: string, config: Cypress.TestConfigOverrides, fn?: Func): Test
5747
+
5748
+ /**
5749
+ * Describe a specification or test-case with the given `title`, TestOptions, and callback `fn` acting
5750
+ * as a thunk.
5751
+ */
5752
+ (title: string, config: Cypress.TestConfigOverrides, fn?: AsyncFunc): Test
5748
5753
  }
5749
5754
 
5750
5755
  interface SuiteFunction {