cypress 7.2.0 → 7.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ // Vendored from @cypress/listr-verbose-renderer
4
+ const figures = require('figures');
5
+
6
+ const cliCursor = require('cli-cursor');
7
+
8
+ const chalk = require('chalk');
9
+
10
+ const dayjs = require('dayjs');
11
+
12
+ const formattedLog = (options, output) => {
13
+ const timestamp = dayjs().format(options.dateFormat); // eslint-disable-next-line no-console
14
+
15
+ console.log(`${chalk.dim(`[${timestamp}]`)} ${output}`);
16
+ };
17
+
18
+ const renderHelper = (task, event, options) => {
19
+ const log = formattedLog.bind(undefined, options);
20
+
21
+ if (event.type === 'STATE') {
22
+ const message = task.isPending() ? 'started' : task.state;
23
+ log(`${task.title} [${message}]`);
24
+
25
+ if (task.isSkipped() && task.output) {
26
+ log(`${figures.arrowRight} ${task.output}`);
27
+ }
28
+ } else if (event.type === 'TITLE') {
29
+ log(`${task.title} [title changed]`);
30
+ }
31
+ };
32
+
33
+ const render = (tasks, options) => {
34
+ for (const task of tasks) {
35
+ task.subscribe(event => {
36
+ if (event.type === 'SUBTASKS') {
37
+ render(task.subtasks, options);
38
+ return;
39
+ }
40
+
41
+ renderHelper(task, event, options);
42
+ }, err => {
43
+ // eslint-disable-next-line no-console
44
+ console.log(err);
45
+ });
46
+ }
47
+ };
48
+
49
+ class VerboseRenderer {
50
+ constructor(tasks, options) {
51
+ this._tasks = tasks;
52
+ this._options = Object.assign({
53
+ dateFormat: 'HH:mm:ss'
54
+ }, options);
55
+ }
56
+
57
+ static get nonTTY() {
58
+ return true;
59
+ }
60
+
61
+ render() {
62
+ cliCursor.hide();
63
+ render(this._tasks, this._options);
64
+ }
65
+
66
+ end() {
67
+ cliCursor.show();
68
+ }
69
+
70
+ }
71
+
72
+ module.exports = VerboseRenderer;
package/lib/cli.js CHANGED
@@ -330,15 +330,15 @@ module.exports = {
330
330
  program.command('open-ct').usage('[options]').description('Opens Cypress component testing interactive mode.').option('-b, --browser <browser-path>', text('browserOpenMode')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('-d, --detached [bool]', text('detached'), coerceFalse).option('-e, --env <env>', text('env')).option('--global', text('global')).option('-p, --port <port>', text('port')).option('-P, --project <project-path>', text('project')).option('--dev', text('dev'), coerceFalse).action(opts => {
331
331
  debug('opening Cypress');
332
332
 
333
- require('./exec/open').start(util.parseOpts(opts), {
334
- isComponentTesting: true
333
+ require('./exec/open').start({ ...util.parseOpts(opts),
334
+ testingType: 'component'
335
335
  }).catch(util.logErrorExit1);
336
336
  });
337
337
  program.command('run-ct').usage('[options]').description('Runs all Cypress Component Testing suites').option('-b, --browser <browser-name-or-path>', text('browserRunMode')).option('--ci-build-id <id>', text('ciBuildId')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('-e, --env <env>', text('env')).option('--group <name>', text('group')).option('-k, --key <record-key>', text('key')).option('--headed', text('headed')).option('--headless', text('headless')).option('--no-exit', text('exit')).option('--parallel', text('parallel')).option('-p, --port <port>', text('port')).option('-P, --project <project-path>', text('project')).option('-q, --quiet', text('quiet')).option('--record [bool]', text('record'), coerceFalse).option('-r, --reporter <reporter>', text('reporter')).option('-o, --reporter-options <reporter-options>', text('reporterOptions')).option('-s, --spec <spec>', text('spec')).option('-t, --tag <tag>', text('tag')).option('--dev', text('dev'), coerceFalse).action(opts => {
338
338
  debug('running Cypress run-ct');
339
339
 
340
- require('./exec/run').start(util.parseOpts(opts), {
341
- isComponentTesting: true
340
+ require('./exec/run').start({ ...util.parseOpts(opts),
341
+ testingType: 'component'
342
342
  }).then(util.exit).catch(util.logErrorExit1);
343
343
  });
344
344
  program.command('install').usage('[options]').description('Installs the Cypress executable matching this package\'s version').option('-f, --force', text('forceInstall')).action(opts => {
package/lib/errors.js CHANGED
@@ -210,6 +210,10 @@ const invalidCypressEnv = {
210
210
  solution: chalk.red('Unset the "CYPRESS_INTERNAL_ENV" environment variable and run Cypress again.'),
211
211
  exitCode: 11
212
212
  };
213
+ const invalidTestingType = {
214
+ description: 'Invalid testingType',
215
+ solution: `Please provide a valid testingType. Valid test types are ${chalk.cyan('\'e2e\'')} and ${chalk.cyan('\'component\'')}.`
216
+ };
213
217
  /**
214
218
  * This error happens when CLI detects that the child Test Runner process
215
219
  * was killed with a signal, like SIGBUS
@@ -390,6 +394,7 @@ module.exports = {
390
394
  smokeTestFailure,
391
395
  childProcessKilled,
392
396
  incompatibleHeadlessFlags,
393
- invalidRunProjectPath
397
+ invalidRunProjectPath,
398
+ invalidTestingType
394
399
  }
395
400
  };
package/lib/exec/open.js CHANGED
@@ -8,12 +8,12 @@ const spawn = require('./spawn');
8
8
 
9
9
  const verify = require('../tasks/verify');
10
10
 
11
+ const {
12
+ processTestingType
13
+ } = require('./shared');
14
+
11
15
  module.exports = {
12
- start(options = {}, {
13
- isComponentTesting
14
- } = {
15
- isComponentTesting: false
16
- }) {
16
+ start(options = {}) {
17
17
  if (!util.isInstalledGlobally() && !options.global && !options.project) {
18
18
  options.project = process.cwd();
19
19
  }
@@ -44,10 +44,7 @@ module.exports = {
44
44
  args.push('--project', options.project);
45
45
  }
46
46
 
47
- if (isComponentTesting) {
48
- args.push('--testing-type', 'component');
49
- }
50
-
47
+ args.push(...processTestingType(options.testingType));
51
48
  debug('opening from options %j', options);
52
49
  debug('command line arguments %j', args);
53
50
 
package/lib/exec/run.js CHANGED
@@ -14,24 +14,11 @@ const {
14
14
  exitWithError,
15
15
  errors
16
16
  } = require('../errors');
17
- /**
18
- * Throws an error with "details" property from
19
- * "errors" object.
20
- * @param {Object} details - Error details
21
- */
22
-
23
-
24
- const throwInvalidOptionError = details => {
25
- if (!details) {
26
- details = errors.unknownError;
27
- } // throw this error synchronously, it will be caught later on and
28
- // the details will be propagated to the promise chain
29
-
30
17
 
31
- const err = new Error();
32
- err.details = details;
33
- throw err;
34
- };
18
+ const {
19
+ processTestingType,
20
+ throwInvalidOptionError
21
+ } = require('./shared');
35
22
  /**
36
23
  * Typically a user passes a string path to the project.
37
24
  * But "cypress open" allows using `false` to open in global mode,
@@ -166,6 +153,7 @@ const processRunOptions = (options = {}) => {
166
153
  args.push('--tag', options.tag);
167
154
  }
168
155
 
156
+ args.push(...processTestingType(options.testingType));
169
157
  return args;
170
158
  };
171
159
 
@@ -174,11 +162,7 @@ module.exports = {
174
162
  isValidProject,
175
163
 
176
164
  // resolves with the number of failed tests
177
- start(options = {}, {
178
- isComponentTesting
179
- } = {
180
- isComponentTesting: false
181
- }) {
165
+ start(options = {}) {
182
166
  _.defaults(options, {
183
167
  key: null,
184
168
  spec: null,
@@ -200,10 +184,6 @@ module.exports = {
200
184
  throw err;
201
185
  }
202
186
 
203
- if (isComponentTesting) {
204
- args.push('--testing-type', 'component');
205
- }
206
-
207
187
  debug('run to spawn.start args %j', args);
208
188
  return spawn.start(args, {
209
189
  dev: options.dev
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ const {
4
+ errors
5
+ } = require('../errors');
6
+ /**
7
+ * Throws an error with "details" property from
8
+ * "errors" object.
9
+ * @param {Object} details - Error details
10
+ */
11
+
12
+
13
+ const throwInvalidOptionError = details => {
14
+ if (!details) {
15
+ details = errors.unknownError;
16
+ } // throw this error synchronously, it will be caught later on and
17
+ // the details will be propagated to the promise chain
18
+
19
+
20
+ const err = new Error();
21
+ err.details = details;
22
+ throw err;
23
+ };
24
+ /**
25
+ * Selects exec args based on the configured `testingType`
26
+ * @param {string} testingType The type of tests being executed
27
+ * @returns {string[]} The array of new exec arguments
28
+ */
29
+
30
+
31
+ const processTestingType = testingType => {
32
+ if (testingType) {
33
+ if (testingType === 'e2e') {
34
+ return ['--testing-type', 'e2e'];
35
+ }
36
+
37
+ if (testingType === 'component') {
38
+ return ['--testing-type', 'component'];
39
+ }
40
+
41
+ return throwInvalidOptionError(errors.invalidTestingType);
42
+ }
43
+
44
+ return [];
45
+ };
46
+
47
+ module.exports = {
48
+ throwInvalidOptionError,
49
+ processTestingType
50
+ };
@@ -66,6 +66,26 @@ const getBaseUrl = () => {
66
66
  return defaultBaseUrl;
67
67
  };
68
68
 
69
+ const getCA = () => {
70
+ return new Promise(resolve => {
71
+ if (!util.getEnv('CYPRESS_DOWNLOAD_USE_CA')) {
72
+ resolve();
73
+ }
74
+
75
+ if (process.env.npm_config_ca) {
76
+ resolve(process.env.npm_config_ca);
77
+ } else if (process.env.npm_config_cafile) {
78
+ fs.readFile(process.env.npm_config_cafile, 'utf8').then(cafileContent => {
79
+ resolve(cafileContent);
80
+ }).catch(() => {
81
+ resolve();
82
+ });
83
+ } else {
84
+ resolve();
85
+ }
86
+ });
87
+ };
88
+
69
89
  const prepend = urlPath => {
70
90
  const endpoint = url.resolve(getBaseUrl(), urlPath);
71
91
  const platform = os.platform();
@@ -174,7 +194,8 @@ const verifyDownloadedFile = (filename, expectedSize, expectedChecksum) => {
174
194
  const downloadFromUrl = ({
175
195
  url,
176
196
  downloadDestination,
177
- progress
197
+ progress,
198
+ ca
178
199
  }) => {
179
200
  return new Promise((resolve, reject) => {
180
201
  const proxy = getProxyUrl();
@@ -184,7 +205,7 @@ const downloadFromUrl = ({
184
205
  downloadDestination
185
206
  });
186
207
  let redirectVersion;
187
- const req = request({
208
+ const reqOptions = {
188
209
  url,
189
210
  proxy,
190
211
 
@@ -203,7 +224,16 @@ const downloadFromUrl = ({
203
224
  return true;
204
225
  }
205
226
 
206
- }); // closure
227
+ };
228
+
229
+ if (ca) {
230
+ debug('using custom CA details from npm config');
231
+ reqOptions.agentOptions = {
232
+ ca
233
+ };
234
+ }
235
+
236
+ const req = request(reqOptions); // closure
207
237
 
208
238
  let started = null;
209
239
  let expectedSize;
@@ -292,10 +322,13 @@ const start = opts => {
292
322
  debug(`downloading cypress.zip to "${downloadDestination}"`); // ensure download dir exists
293
323
 
294
324
  return fs.ensureDirAsync(path.dirname(downloadDestination)).then(() => {
325
+ return getCA();
326
+ }).then(ca => {
295
327
  return downloadFromUrl({
296
328
  url,
297
329
  downloadDestination,
298
- progress
330
+ progress,
331
+ ca
299
332
  });
300
333
  }).catch(err => {
301
334
  return prettyDownloadErr(err, version);
@@ -305,5 +338,6 @@ const start = opts => {
305
338
  module.exports = {
306
339
  start,
307
340
  getUrl,
308
- getProxyUrl
341
+ getProxyUrl,
342
+ getCA
309
343
  };
@@ -12,9 +12,9 @@ const chalk = require('chalk');
12
12
 
13
13
  const debug = require('debug')('cypress:cli');
14
14
 
15
- const Listr = require('listr');
16
-
17
- const verbose = require('@cypress/listr-verbose-renderer');
15
+ const {
16
+ Listr
17
+ } = require('listr2');
18
18
 
19
19
  const Promise = require('bluebird');
20
20
 
@@ -41,6 +41,8 @@ const {
41
41
  errors
42
42
  } = require('../errors');
43
43
 
44
+ const verbose = require('../VerboseRenderer');
45
+
44
46
  const getNpmArgv = () => {
45
47
  const json = process.env.npm_config_argv;
46
48
 
@@ -179,7 +181,9 @@ const downloadAndUnzip = ({
179
181
  logger.log(`Installing Cypress ${chalk.gray(`(version: ${version})`)}`);
180
182
  logger.log();
181
183
  const tasks = new Listr([{
182
- title: util.titleize('Downloading Cypress'),
184
+ options: {
185
+ title: util.titleize('Downloading Cypress')
186
+ },
183
187
  task: (ctx, task) => {
184
188
  // as our download progresses indicate the status
185
189
  progress.onProgress = progessify(task, 'Downloading Cypress');
@@ -201,7 +205,9 @@ const downloadAndUnzip = ({
201
205
  installDir,
202
206
  rendererOptions
203
207
  }), {
204
- title: util.titleize('Finishing Installation'),
208
+ options: {
209
+ title: util.titleize('Finishing Installation')
210
+ },
205
211
  task: (ctx, task) => {
206
212
  const cleanup = () => {
207
213
  debug('removing zip file %s', downloadDestination);
@@ -213,7 +219,9 @@ const downloadAndUnzip = ({
213
219
  util.setTaskTitle(task, util.titleize(chalk.green('Finished Installation'), chalk.gray(installDir)), rendererOptions.renderer);
214
220
  });
215
221
  }
216
- }], rendererOptions); // start the tasks!
222
+ }], {
223
+ rendererOptions
224
+ }); // start the tasks!
217
225
 
218
226
  return Promise.resolve(tasks.run());
219
227
  };
@@ -361,7 +369,9 @@ const start = (options = {}) => {
361
369
  zipFilePath: absolutePath,
362
370
  installDir,
363
371
  rendererOptions
364
- })], rendererOptions).run();
372
+ })], {
373
+ rendererOptions
374
+ }).run();
365
375
  }
366
376
 
367
377
  if (options.force) {
@@ -396,7 +406,9 @@ const unzipTask = ({
396
406
  rendererOptions
397
407
  }) => {
398
408
  return {
399
- title: util.titleize('Unzipping Cypress'),
409
+ options: {
410
+ title: util.titleize('Unzipping Cypress')
411
+ },
400
412
  task: (ctx, task) => {
401
413
  // as our unzip progresses indicate the status
402
414
  progress.onProgress = progessify(task, 'Unzipping Cypress');
@@ -78,23 +78,20 @@ const unzip = ({
78
78
 
79
79
  const unzipWithNode = () => {
80
80
  debug('unzipping with node.js (slow)');
81
-
82
- const endFn = err => {
83
- if (err) {
84
- debug('error %s', err.message);
85
- return reject(err);
86
- }
87
-
88
- debug('node unzip finished');
89
- return resolve();
90
- };
91
-
92
81
  const opts = {
93
82
  dir: installDir,
94
83
  onEntry: tick
95
84
  };
96
85
  debug('calling Node extract tool %s %o', zipFilePath, opts);
97
- return unzipTools.extract(zipFilePath, opts, endFn);
86
+ return unzipTools.extract(zipFilePath, opts).then(() => {
87
+ debug('node unzip finished');
88
+ return resolve();
89
+ }).catch(err => {
90
+ if (err) {
91
+ debug('error %s', err.message);
92
+ return reject(err);
93
+ }
94
+ });
98
95
  };
99
96
 
100
97
  const unzipFallback = _.once(unzipWithNode);
@@ -4,12 +4,12 @@ const _ = require('lodash');
4
4
 
5
5
  const chalk = require('chalk');
6
6
 
7
- const Listr = require('listr');
7
+ const {
8
+ Listr
9
+ } = require('listr2');
8
10
 
9
11
  const debug = require('debug')('cypress:cli');
10
12
 
11
- const verbose = require('@cypress/listr-verbose-renderer');
12
-
13
13
  const {
14
14
  stripIndent
15
15
  } = require('common-tags');
@@ -22,6 +22,8 @@ const path = require('path');
22
22
 
23
23
  const os = require('os');
24
24
 
25
+ const verbose = require('../VerboseRenderer');
26
+
25
27
  const {
26
28
  throwFormErrorText,
27
29
  errors
@@ -184,7 +186,9 @@ function testBinary(version, binaryDir, options) {
184
186
  renderer
185
187
  };
186
188
  const tasks = new Listr([{
187
- title: util.titleize('Verifying Cypress can run', chalk.gray(binaryDir)),
189
+ options: {
190
+ title: util.titleize('Verifying Cypress can run', chalk.gray(binaryDir))
191
+ },
188
192
  task: (ctx, task) => {
189
193
  debug('clearing out the verified version');
190
194
  return state.clearBinaryStateAsync(binaryDir).then(() => {
@@ -197,7 +201,9 @@ function testBinary(version, binaryDir, options) {
197
201
  util.setTaskTitle(task, util.titleize(chalk.green('Verified Cypress!'), chalk.gray(binaryDir)), rendererOptions.renderer);
198
202
  });
199
203
  }
200
- }], rendererOptions);
204
+ }], {
205
+ rendererOptions
206
+ });
201
207
  return tasks.run();
202
208
  }
203
209
 
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "cypress",
3
- "version": "7.2.0",
3
+ "version": "7.6.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/listr-verbose-renderer": "^0.4.1",
11
10
  "@cypress/request": "^2.88.5",
12
11
  "@cypress/xvfb": "^1.2.4",
13
12
  "@types/node": "^14.14.31",
@@ -19,21 +18,24 @@
19
18
  "cachedir": "^2.3.0",
20
19
  "chalk": "^4.1.0",
21
20
  "check-more-types": "^2.24.0",
21
+ "cli-cursor": "^3.1.0",
22
22
  "cli-table3": "~0.6.0",
23
23
  "commander": "^5.1.0",
24
24
  "common-tags": "^1.8.0",
25
25
  "dayjs": "^1.10.4",
26
- "debug": "4.3.2",
26
+ "debug": "^4.3.2",
27
+ "enquirer": "^2.3.6",
27
28
  "eventemitter2": "^6.4.3",
28
29
  "execa": "4.1.0",
29
30
  "executable": "^4.1.1",
30
- "extract-zip": "^1.7.0",
31
+ "extract-zip": "2.0.1",
32
+ "figures": "^3.2.0",
31
33
  "fs-extra": "^9.1.0",
32
34
  "getos": "^3.2.1",
33
35
  "is-ci": "^3.0.0",
34
36
  "is-installed-globally": "~0.4.0",
35
37
  "lazy-ass": "^1.6.0",
36
- "listr": "^0.14.3",
38
+ "listr2": "^3.8.3",
37
39
  "lodash": "^4.17.21",
38
40
  "log-symbols": "^4.0.0",
39
41
  "minimist": "^1.2.5",
@@ -62,7 +64,6 @@
62
64
  },
63
65
  "types": "types",
64
66
  "description": "Cypress.io end to end testing tool",
65
- "author": "Brian Mann",
66
67
  "homepage": "https://github.com/cypress-io/cypress",
67
68
  "license": "MIT",
68
69
  "bugs": {
@@ -1949,6 +1949,8 @@ declare module "chai" {
1949
1949
  export = chai;
1950
1950
  }
1951
1951
 
1952
- interface Object {
1953
- should: Chai.Assertion;
1954
- }
1952
+ // const a = 1; a.should(1); doesn't work with Cypress
1953
+ // https://github.com/cypress-io/cypress/issues/16548
1954
+ // interface Object {
1955
+ // should: Chai.Assertion;
1956
+ // }
@@ -156,6 +156,11 @@ declare namespace CypressCommandLine {
156
156
  * Path to a specific project
157
157
  */
158
158
  project: string
159
+ /**
160
+ * Specify the type of tests to execute.
161
+ * @default "e2e"
162
+ */
163
+ testingType: Cypress.TestingType
159
164
  }
160
165
 
161
166
  // small utility types to better express meaning of other types
@@ -8,6 +8,7 @@ declare namespace Cypress {
8
8
  type RequestBody = string | object
9
9
  type ViewportOrientation = 'portrait' | 'landscape'
10
10
  type PrevSubject = 'optional' | 'element' | 'document' | 'window'
11
+ type TestingType = 'e2e' | 'component'
11
12
  type PluginConfig = (on: PluginEvents, config: PluginConfigOptions) => void | ConfigOptions | Promise<ConfigOptions>
12
13
 
13
14
  interface CommandOptions {
@@ -59,7 +60,7 @@ declare namespace Cypress {
59
60
  */
60
61
  displayName: string
61
62
  version: string
62
- majorVersion: number
63
+ majorVersion: number | string
63
64
  path: string
64
65
  isHeaded: boolean
65
66
  isHeadless: boolean
@@ -251,6 +252,11 @@ declare namespace Cypress {
251
252
  */
252
253
  LocalStorage: LocalStorage
253
254
 
255
+ /**
256
+ * Current testing type, determined by the Test Runner chosen to run.
257
+ */
258
+ testingType: TestingType
259
+
254
260
  /**
255
261
  * Fire automation:request event for internal use.
256
262
  */
@@ -484,6 +490,13 @@ declare namespace Cypress {
484
490
  getElementCoordinatesByPositionRelativeToXY(element: JQuery | HTMLElement, x: number, y: number): ElementPositioning
485
491
  }
486
492
 
493
+ /**
494
+ * @see https://on.cypress.io/keyboard-api
495
+ */
496
+ Keyboard: {
497
+ defaults(options: Partial<KeyboardDefaultsOptions>): void
498
+ }
499
+
487
500
  /**
488
501
  * @see https://on.cypress.io/api/api-server
489
502
  */
@@ -1464,7 +1477,7 @@ declare namespace Cypress {
1464
1477
  * @example
1465
1478
  * cy.request('http://dev.local/seed')
1466
1479
  */
1467
- request(url: string, body?: RequestBody): Chainable<Response>
1480
+ request<T = any>(url: string, body?: RequestBody): Chainable<Response<T>>
1468
1481
  /**
1469
1482
  * Make an HTTP request with specific method.
1470
1483
  *
@@ -1472,7 +1485,7 @@ declare namespace Cypress {
1472
1485
  * @example
1473
1486
  * cy.request('POST', 'http://localhost:8888/users', {name: 'Jane'})
1474
1487
  */
1475
- request(method: HttpMethod, url: string, body?: RequestBody): Chainable<Response>
1488
+ request<T = any>(method: HttpMethod, url: string, body?: RequestBody): Chainable<Response<T>>
1476
1489
  /**
1477
1490
  * Make an HTTP request with specific behavior.
1478
1491
  *
@@ -1483,7 +1496,7 @@ declare namespace Cypress {
1483
1496
  * followRedirect: false // turn off following redirects
1484
1497
  * })
1485
1498
  */
1486
- request(options: Partial<RequestOptions>): Chainable<Response>
1499
+ request<T = any>(options: Partial<RequestOptions>): Chainable<Response<T>>
1487
1500
 
1488
1501
  /**
1489
1502
  * Get the root DOM element.
@@ -2750,8 +2763,6 @@ declare namespace Cypress {
2750
2763
  clientRoute: string
2751
2764
  configFile: string
2752
2765
  cypressEnv: string
2753
- integrationExampleName: string
2754
- integrationExamplePath: string
2755
2766
  isNewProject: boolean
2756
2767
  isTextTerminal: boolean
2757
2768
  morgan: boolean
@@ -2780,6 +2791,7 @@ declare namespace Cypress {
2780
2791
 
2781
2792
  interface TestConfigOverrides extends Partial<Pick<ConfigOptions, 'animationDistanceThreshold' | 'baseUrl' | 'defaultCommandTimeout' | 'env' | 'execTimeout' | 'includeShadowDom' | 'requestTimeout' | 'responseTimeout' | 'retries' | 'scrollBehavior' | 'taskTimeout' | 'viewportHeight' | 'viewportWidth' | 'waitForAnimations'>> {
2782
2793
  browser?: IsBrowserMatcher | IsBrowserMatcher[]
2794
+ keystrokeDelay?: number
2783
2795
  }
2784
2796
 
2785
2797
  /**
@@ -2799,7 +2811,7 @@ declare namespace Cypress {
2799
2811
  /**
2800
2812
  * Type of test and associated runner that was launched.
2801
2813
  */
2802
- testingType: 'e2e' | 'component'
2814
+ testingType: TestingType
2803
2815
  /**
2804
2816
  * Cypress version.
2805
2817
  */
@@ -2830,6 +2842,18 @@ declare namespace Cypress {
2830
2842
  env: object
2831
2843
  }
2832
2844
 
2845
+ /**
2846
+ * Options for Cypress.Keyboard.defaults()
2847
+ */
2848
+ interface KeyboardDefaultsOptions {
2849
+ /**
2850
+ * Time, in milliseconds, between each keystroke when typing. (Pass 0 to disable)
2851
+ *
2852
+ * @default 10
2853
+ */
2854
+ keystrokeDelay: number
2855
+ }
2856
+
2833
2857
  /**
2834
2858
  * Full set of possible options for cy.request call
2835
2859
  */
@@ -5496,9 +5520,9 @@ declare namespace Cypress {
5496
5520
  consoleProps(): ObjectLike
5497
5521
  }
5498
5522
 
5499
- interface Response {
5523
+ interface Response<T> {
5500
5524
  allRequestResponses: any[]
5501
- body: any
5525
+ body: T
5502
5526
  duration: number
5503
5527
  headers: { [key: string]: string | string[] }
5504
5528
  isOkStatusCode: boolean
@@ -175,37 +175,27 @@ declare namespace M {
175
175
  matchOne(files: string[], pattern: string[], partial: boolean): boolean;
176
176
 
177
177
  /**
178
- * Deprecated. For internal use.
179
- *
180
- * @private
178
+ * @deprecated. For internal use.
181
179
  */
182
180
  debug(): void;
183
181
 
184
182
  /**
185
- * Deprecated. For internal use.
186
- *
187
- * @private
183
+ * @deprecated. For internal use.
188
184
  */
189
185
  make(): void;
190
186
 
191
187
  /**
192
- * Deprecated. For internal use.
193
- *
194
- * @private
188
+ * @deprecated. For internal use.
195
189
  */
196
190
  parseNegate(): void;
197
191
 
198
192
  /**
199
- * Deprecated. For internal use.
200
- *
201
- * @private
193
+ * @deprecated. For internal use.
202
194
  */
203
195
  braceExpand(pattern: string, options: IOptions): void;
204
196
 
205
197
  /**
206
- * Deprecated. For internal use.
207
- *
208
- * @private
198
+ * @deprecated. For internal use.
209
199
  */
210
200
  parse(pattern: string, isSub?: boolean): void;
211
201
  }
@@ -79,7 +79,7 @@ export namespace CyHttpMessages {
79
79
  /**
80
80
  * The headers of the HTTP message.
81
81
  */
82
- headers: { [key: string]: string }
82
+ headers: { [key: string]: string | string[] }
83
83
  }
84
84
 
85
85
  export type IncomingResponse = BaseMessage & {
@@ -131,6 +131,10 @@ export namespace CyHttpMessages {
131
131
  * Request URL.
132
132
  */
133
133
  url: string
134
+ /**
135
+ * URL query string as object.
136
+ */
137
+ query: Record<string, string|number>
134
138
  /**
135
139
  * The HTTP version used in the request. Read only.
136
140
  */
@@ -364,6 +368,10 @@ export interface RouteMatcherOptionsGeneric<S> {
364
368
  * Match on parsed querystring parameters.
365
369
  */
366
370
  query?: DictMatcher<S>
371
+ /**
372
+ * If set, this `RouteMatcher` will only match the first `times` requests.
373
+ */
374
+ times?: number
367
375
  /**
368
376
  * Match against the full request URL.
369
377
  * If a string is passed, it will be used as a substring match,
@@ -379,7 +387,7 @@ export type RouteHandler = string | StaticResponse | RouteHandlerController | ob
379
387
  /**
380
388
  * Describes a response that will be sent back to the browser to fulfill the request.
381
389
  */
382
- export type StaticResponse = GenericStaticResponse<string, string | object | boolean | null> & {
390
+ export type StaticResponse = GenericStaticResponse<string, string | object | boolean | ArrayBuffer | null> & {
383
391
  /**
384
392
  * Milliseconds to delay before the response is sent.
385
393
  * @deprecated Use `delay` instead of `delayMs`.
@@ -498,7 +506,7 @@ declare global {
498
506
  *
499
507
  * @param mergeRouteMatcher Additional route matcher options to merge with `url`. Typically used for middleware.
500
508
  */
501
- intercept(url: string, mergeRouteMatcher: Omit<RouteMatcherOptions, 'url'>, response: RouteHandler): Chainable<null>
509
+ intercept(url: StringMatcher, mergeRouteMatcher: Omit<RouteMatcherOptions, 'url'>, response: RouteHandler): Chainable<null>
502
510
  /**
503
511
  * Wait for a specific request to complete.
504
512
  *