cypress 9.6.0 → 10.0.0

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.
Files changed (44) hide show
  1. package/index.mjs +15 -0
  2. package/lib/cli.js +72 -23
  3. package/lib/errors.js +16 -1
  4. package/lib/exec/open.js +45 -10
  5. package/lib/exec/run.js +17 -10
  6. package/lib/exec/shared.js +30 -9
  7. package/lib/exec/spawn.js +4 -0
  8. package/lib/exec/xvfb.js +1 -0
  9. package/lib/util.js +10 -3
  10. package/mount-utils/CHANGELOG.md +20 -0
  11. package/mount-utils/README.md +14 -0
  12. package/mount-utils/dist/index.d.ts +54 -0
  13. package/mount-utils/dist/index.js +134 -0
  14. package/mount-utils/package.json +31 -0
  15. package/package.json +39 -4
  16. package/react/CHANGELOG.md +373 -0
  17. package/react/README.md +414 -0
  18. package/react/dist/cypress-react.browser.js +497 -0
  19. package/react/dist/cypress-react.cjs.js +495 -0
  20. package/react/dist/cypress-react.esm-bundler.js +467 -0
  21. package/react/dist/getDisplayName.d.ts +8 -0
  22. package/react/dist/index.d.ts +2 -0
  23. package/react/dist/mount.d.ts +143 -0
  24. package/react/dist/mountHook.d.ts +11 -0
  25. package/react/package.json +105 -0
  26. package/types/bluebird/index.d.ts +18 -4
  27. package/types/cypress-eventemitter.d.ts +1 -1
  28. package/types/cypress-global-vars.d.ts +2 -2
  29. package/types/cypress-npm-api.d.ts +4 -10
  30. package/types/cypress.d.ts +180 -120
  31. package/types/minimatch/index.d.ts +15 -5
  32. package/vue/CHANGELOG.md +380 -0
  33. package/vue/README.md +678 -0
  34. package/vue/dist/cypress-vue.cjs.js +13535 -0
  35. package/vue/dist/cypress-vue.esm-bundler.js +13511 -0
  36. package/vue/dist/index.d.ts +56 -0
  37. package/vue/package.json +86 -0
  38. package/vue2/CHANGELOG.md +5 -0
  39. package/vue2/README.md +693 -0
  40. package/vue2/dist/cypress-vue2.browser.js +20191 -0
  41. package/vue2/dist/cypress-vue2.cjs.js +20188 -0
  42. package/vue2/dist/cypress-vue2.esm-bundler.js +20179 -0
  43. package/vue2/dist/index.d.ts +171 -0
  44. package/vue2/package.json +59 -0
package/index.mjs ADDED
@@ -0,0 +1,15 @@
1
+ import module from 'module'
2
+
3
+ const require = module.createRequire(import.meta.url)
4
+
5
+ const cypress = require('./lib/cypress')
6
+
7
+ export default cypress
8
+
9
+ export const defineConfig = cypress.defineConfig
10
+
11
+ export const run = cypress.run
12
+
13
+ export const open = cypress.open
14
+
15
+ export const cli = cypress.cli
package/lib/cli.js CHANGED
@@ -34,10 +34,6 @@ function unknownOption(flag, type = 'option') {
34
34
 
35
35
  commander.Command.prototype.unknownOption = unknownOption;
36
36
 
37
- const coerceFalseOrString = arg => {
38
- return arg !== 'false' ? arg : false;
39
- };
40
-
41
37
  const coerceFalse = arg => {
42
38
  return arg !== 'false';
43
39
  };
@@ -110,19 +106,20 @@ const parseVariableOpts = (fnArgs, args) => {
110
106
  };
111
107
 
112
108
  const descriptions = {
113
- browserOpenMode: 'path to a custom browser to be added to the list of available browsers in Cypress',
114
- browserRunMode: 'runs Cypress in the browser with the given name. if a filesystem path is supplied, Cypress will attempt to use the browser at that path.',
109
+ browser: 'runs Cypress in the browser with the given name. if a filesystem path is supplied, Cypress will attempt to use the browser at that path.',
115
110
  cacheClear: 'delete all cached binaries',
116
111
  cachePrune: 'deletes all cached binaries except for the version currently in use',
117
112
  cacheList: 'list cached binary versions',
118
113
  cachePath: 'print the path to the binary cache',
119
114
  cacheSize: 'Used with the list command to show the sizes of the cached folders',
120
115
  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',
121
- config: 'sets configuration values. separate multiple values with a comma. overrides any value in cypress.json.',
122
- configFile: 'path to JSON file where configuration values are set. defaults to "cypress.json". pass "false" to disable.',
116
+ component: 'runs component tests',
117
+ config: 'sets configuration values. separate multiple values with a comma. overrides any value in cypress.config.{js,ts,mjs,cjs}.',
118
+ configFile: 'path to script file where configuration values are set. defaults to "cypress.config.{js,ts,mjs,cjs}".',
123
119
  detached: 'runs Cypress application in detached mode',
124
120
  dev: 'runs cypress in development and bypasses binary check',
125
- env: 'sets environment variables. separate multiple values with a comma. overrides any value in cypress.json or cypress.env.json',
121
+ e2e: 'runs end to end tests',
122
+ env: 'sets environment variables. separate multiple values with a comma. overrides any value in cypress.config.{js,ts,mjs,cjs} or cypress.env.json',
126
123
  exit: 'keep the browser open after tests finish',
127
124
  forceInstall: 'force install the Cypress binary',
128
125
  global: 'force Cypress into global mode as if its globally installed',
@@ -131,7 +128,7 @@ const descriptions = {
131
128
  headless: 'hide the browser instead of running headed (default for cypress run)',
132
129
  key: 'your secret Record Key. you can omit this if you set a CYPRESS_RECORD_KEY environment variable.',
133
130
  parallel: 'enables concurrent runs and automatic load balancing of specs across multiple machines or processes',
134
- port: 'runs Cypress on a specific port. overrides any value in cypress.json.',
131
+ port: 'runs Cypress on a specific port. overrides any value in cypress.config.{js,ts,mjs,cjs}.',
135
132
  project: 'path to the project',
136
133
  quiet: 'run quietly, using only the configured reporter',
137
134
  record: 'records the run. sends test results, screenshots and videos to your Cypress Dashboard.',
@@ -221,11 +218,19 @@ const createProgram = () => {
221
218
  };
222
219
 
223
220
  const addCypressRunCommand = program => {
224
- return program.command('run').usage('[options]').description('Runs Cypress tests from the CLI without the GUI').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);
221
+ return program.command('run').usage('[options]').description('Runs Cypress tests from the CLI without the GUI').option('-b, --browser <browser-name-or-path>', text('browser')).option('--ci-build-id <id>', text('ciBuildId')).option('--component', text('component')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('--e2e', text('e2e')).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);
225
222
  };
226
223
 
227
224
  const addCypressOpenCommand = program => {
228
- return program.command('open').usage('[options]').description('Opens Cypress in the interactive GUI.').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);
225
+ return program.command('open').usage('[options]').description('Opens Cypress in the interactive GUI.').option('-b, --browser <browser-path>', text('browser')).option('--component', text('component')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('-d, --detached [bool]', text('detached'), coerceFalse).option('--e2e', text('e2e')).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);
226
+ };
227
+
228
+ const maybeAddInspectFlags = program => {
229
+ if (process.argv.includes('--dev')) {
230
+ return program.option('--inspect', 'Node option').option('--inspect-brk', 'Node option');
231
+ }
232
+
233
+ return program;
229
234
  };
230
235
  /**
231
236
  * Casts known command line options for "cypress run" to their intended type.
@@ -236,7 +241,7 @@ const addCypressOpenCommand = program => {
236
241
  */
237
242
 
238
243
 
239
- const castCypressRunOptions = opts => {
244
+ const castCypressOptions = opts => {
240
245
  // only properties that have type "string | false" in our TS definition
241
246
  // require special handling, because CLI parsing takes care of purely
242
247
  // boolean arguments
@@ -247,10 +252,6 @@ const castCypressRunOptions = opts => {
247
252
  castOpts.port = coerceAnyStringToInt(opts.port);
248
253
  }
249
254
 
250
- if (_.has(opts, 'configFile')) {
251
- castOpts.configFile = coerceFalseOrString(opts.configFile);
252
- }
253
-
254
255
  return castOpts;
255
256
  };
256
257
 
@@ -275,11 +276,44 @@ module.exports = {
275
276
  cliArgs.unshift(null, null);
276
277
  debug('creating program parser');
277
278
  const program = createProgram();
278
- addCypressRunCommand(program).action((...fnArgs) => {
279
+ maybeAddInspectFlags(addCypressRunCommand(program)).action((...fnArgs) => {
279
280
  debug('parsed Cypress run %o', fnArgs);
280
281
  const options = parseVariableOpts(fnArgs, cliArgs);
281
282
  debug('parsed options %o', options);
282
- const casted = castCypressRunOptions(options);
283
+ const casted = castCypressOptions(options);
284
+ debug('casted options %o', casted);
285
+ resolve(casted);
286
+ });
287
+ debug('parsing args: %o', cliArgs);
288
+ program.parse(cliArgs);
289
+ });
290
+ },
291
+
292
+ /**
293
+ * Parses `cypress open` command line option array into an object
294
+ * with options that you can feed into cy.openModeSystemTest test calls
295
+ * @example
296
+ * const options = parseOpenCommand(['cypress', 'open', '--browser', 'chrome'])
297
+ * // options is {browser: 'chrome'}
298
+ */
299
+ parseOpenCommand(args) {
300
+ return new Promise((resolve, reject) => {
301
+ if (!Array.isArray(args)) {
302
+ return reject(new Error('Expected array of arguments'));
303
+ } // make a copy of the input arguments array
304
+ // and add placeholders where "node ..." would usually be
305
+ // also remove "cypress" keyword at the start if present
306
+
307
+
308
+ const cliArgs = args[0] === 'cypress' ? [...args.slice(1)] : [...args];
309
+ cliArgs.unshift(null, null);
310
+ debug('creating program parser');
311
+ const program = createProgram();
312
+ maybeAddInspectFlags(addCypressOpenCommand(program)).action((...fnArgs) => {
313
+ debug('parsed Cypress open %o', fnArgs);
314
+ const options = parseVariableOpts(fnArgs, cliArgs);
315
+ debug('parsed options %o', options);
316
+ const casted = castCypressOptions(options);
283
317
  debug('casted options %o', casted);
284
318
  resolve(casted);
285
319
  });
@@ -326,25 +360,40 @@ module.exports = {
326
360
  program.option('-v, --version', text('version')).command('version').description(text('version')).action(() => {
327
361
  showVersions(args);
328
362
  });
329
- addCypressOpenCommand(program).action(opts => {
363
+ maybeAddInspectFlags(addCypressOpenCommand(program)).action(opts => {
330
364
  debug('opening Cypress');
331
365
 
332
366
  require('./exec/open').start(util.parseOpts(opts)).then(util.exit).catch(util.logErrorExit1);
333
367
  });
334
- addCypressRunCommand(program).action((...fnArgs) => {
368
+ maybeAddInspectFlags(addCypressRunCommand(program)).action((...fnArgs) => {
335
369
  debug('running Cypress with args %o', fnArgs);
336
370
 
337
371
  require('./exec/run').start(parseVariableOpts(fnArgs, args)).then(util.exit).catch(util.logErrorExit1);
338
372
  });
339
- 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 => {
373
+ program.command('open-ct').usage('[options]').description('Opens Cypress component testing interactive mode. Deprecated: use "open --component"').option('-b, --browser <browser-path>', text('browser')).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 => {
340
374
  debug('opening Cypress');
375
+ const msg = `
376
+ ${logSymbols.warning} Warning: open-ct is deprecated and will be removed in a future release.
377
+
378
+ Use \`cypress open --component\` instead.
379
+ `;
380
+ logger.warn();
381
+ logger.warn(stripIndent(msg));
382
+ logger.warn();
341
383
 
342
384
  require('./exec/open').start({ ...util.parseOpts(opts),
343
385
  testingType: 'component'
344
386
  }).then(util.exit).catch(util.logErrorExit1);
345
387
  });
346
- 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 => {
388
+ program.command('run-ct').usage('[options]').description('Runs all Cypress component testing suites. Deprecated: use "run --component"').option('-b, --browser <browser-name-or-path>', text('browser')).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 => {
347
389
  debug('running Cypress run-ct');
390
+ const msg = `
391
+ ${logSymbols.warning} Warning: run-ct is deprecated and will be removed in a future release.
392
+ Use \`cypress run --component\` instead.
393
+ `;
394
+ logger.warn();
395
+ logger.warn(stripIndent(msg));
396
+ logger.warn();
348
397
 
349
398
  require('./exec/run').start({ ...util.parseOpts(opts),
350
399
  testingType: 'component'
package/lib/errors.js CHANGED
@@ -214,6 +214,18 @@ const invalidTestingType = {
214
214
  description: 'Invalid testingType',
215
215
  solution: `Please provide a valid testingType. Valid test types are ${chalk.cyan('\'e2e\'')} and ${chalk.cyan('\'component\'')}.`
216
216
  };
217
+ const incompatibleTestTypeFlags = {
218
+ description: '`--e2e` and `--component` cannot both be passed.',
219
+ solution: 'Either pass `--e2e` or `--component`, but not both.'
220
+ };
221
+ const incompatibleTestingTypeAndFlag = {
222
+ description: 'Set a `testingType` and also passed `--e2e` or `--component` flags.',
223
+ solution: 'Either set `testingType` or pass a testing type flag, but not both.'
224
+ };
225
+ const invalidConfigFile = {
226
+ description: '`--config-file` cannot be false.',
227
+ solution: 'Either pass a relative path to a valid Cypress config file or remove this option.'
228
+ };
217
229
  /**
218
230
  * This error happens when CLI detects that the child Test Runner process
219
231
  * was killed with a signal, like SIGBUS
@@ -397,6 +409,9 @@ module.exports = {
397
409
  childProcessKilled,
398
410
  incompatibleHeadlessFlags,
399
411
  invalidRunProjectPath,
400
- invalidTestingType
412
+ invalidTestingType,
413
+ incompatibleTestTypeFlags,
414
+ incompatibleTestingTypeAndFlag,
415
+ invalidConfigFile
401
416
  }
402
417
  };
package/lib/exec/open.js CHANGED
@@ -9,10 +9,25 @@ const spawn = require('./spawn');
9
9
  const verify = require('../tasks/verify');
10
10
 
11
11
  const {
12
- processTestingType
12
+ processTestingType,
13
+ checkConfigFile
13
14
  } = require('./shared');
14
15
 
15
- const processOpenOptions = options => {
16
+ const {
17
+ exitWithError
18
+ } = require('../errors');
19
+ /**
20
+ * Maps options collected by the CLI
21
+ * and forms list of CLI arguments to the server.
22
+ *
23
+ * Note: there is lightweight validation, with errors
24
+ * thrown synchronously.
25
+ *
26
+ * @returns {string[]} list of CLI arguments
27
+ */
28
+
29
+
30
+ const processOpenOptions = (options = {}) => {
16
31
  if (!util.isInstalledGlobally() && !options.global && !options.project) {
17
32
  options.project = process.cwd();
18
33
  }
@@ -24,6 +39,7 @@ const processOpenOptions = options => {
24
39
  }
25
40
 
26
41
  if (options.configFile !== undefined) {
42
+ checkConfigFile(options);
27
43
  args.push('--config-file', options.configFile);
28
44
  }
29
45
 
@@ -43,7 +59,19 @@ const processOpenOptions = options => {
43
59
  args.push('--project', options.project);
44
60
  }
45
61
 
46
- args.push(...processTestingType(options.testingType));
62
+ if (options.global) {
63
+ args.push('--global', options.global);
64
+ }
65
+
66
+ if (options.inspect) {
67
+ args.push('--inspect');
68
+ }
69
+
70
+ if (options.inspectBrk) {
71
+ args.push('--inspectBrk');
72
+ }
73
+
74
+ args.push(...processTestingType(options));
47
75
  debug('opening from options %j', options);
48
76
  debug('command line arguments %j', args);
49
77
  return args;
@@ -53,14 +81,21 @@ module.exports = {
53
81
  processOpenOptions,
54
82
 
55
83
  start(options = {}) {
56
- const args = processOpenOptions(options);
57
-
58
84
  function open() {
59
- return spawn.start(args, {
60
- dev: options.dev,
61
- detached: Boolean(options.detached),
62
- stdio: 'inherit'
63
- });
85
+ try {
86
+ const args = processOpenOptions(options);
87
+ return spawn.start(args, {
88
+ dev: options.dev,
89
+ detached: Boolean(options.detached),
90
+ stdio: 'inherit'
91
+ });
92
+ } catch (err) {
93
+ if (err.details) {
94
+ return exitWithError(err.details)();
95
+ }
96
+
97
+ throw err;
98
+ }
64
99
  }
65
100
 
66
101
  if (options.dev) {
package/lib/exec/run.js CHANGED
@@ -17,7 +17,8 @@ const {
17
17
 
18
18
  const {
19
19
  processTestingType,
20
- throwInvalidOptionError
20
+ throwInvalidOptionError,
21
+ checkConfigFile
21
22
  } = require('./shared');
22
23
  /**
23
24
  * Typically a user passes a string path to the project.
@@ -74,6 +75,7 @@ const processRunOptions = (options = {}) => {
74
75
  }
75
76
 
76
77
  if (options.configFile !== undefined) {
78
+ checkConfigFile(options);
77
79
  args.push('--config-file', options.configFile);
78
80
  }
79
81
 
@@ -153,7 +155,15 @@ const processRunOptions = (options = {}) => {
153
155
  args.push('--tag', options.tag);
154
156
  }
155
157
 
156
- args.push(...processTestingType(options.testingType));
158
+ if (options.inspect) {
159
+ args.push('--inspect');
160
+ }
161
+
162
+ if (options.inspectBrk) {
163
+ args.push('--inspectBrk');
164
+ }
165
+
166
+ args.push(...processTestingType(options));
157
167
  return args;
158
168
  };
159
169
 
@@ -172,10 +182,12 @@ module.exports = {
172
182
  });
173
183
 
174
184
  function run() {
175
- let args;
176
-
177
185
  try {
178
- args = processRunOptions(options);
186
+ const args = processRunOptions(options);
187
+ debug('run to spawn.start args %j', args);
188
+ return spawn.start(args, {
189
+ dev: options.dev
190
+ });
179
191
  } catch (err) {
180
192
  if (err.details) {
181
193
  return exitWithError(err.details)();
@@ -183,11 +195,6 @@ module.exports = {
183
195
 
184
196
  throw err;
185
197
  }
186
-
187
- debug('run to spawn.start args %j', args);
188
- return spawn.start(args, {
189
- dev: options.dev
190
- });
191
198
  }
192
199
 
193
200
  if (options.dev) {
@@ -28,23 +28,44 @@ const throwInvalidOptionError = details => {
28
28
  */
29
29
 
30
30
 
31
- const processTestingType = testingType => {
32
- if (testingType) {
33
- if (testingType === 'e2e') {
34
- return ['--testing-type', 'e2e'];
35
- }
31
+ const processTestingType = options => {
32
+ if (options.e2e && options.component) {
33
+ return throwInvalidOptionError(errors.incompatibleTestTypeFlags);
34
+ }
35
+
36
+ if (options.testingType && (options.component || options.e2e)) {
37
+ return throwInvalidOptionError(errors.incompatibleTestTypeFlags);
38
+ }
36
39
 
37
- if (testingType === 'component') {
38
- return ['--testing-type', 'component'];
39
- }
40
+ if (options.testingType === 'component' || options.component || options.ct) {
41
+ return ['--testing-type', 'component'];
42
+ }
43
+
44
+ if (options.testingType === 'e2e' || options.e2e) {
45
+ return ['--testing-type', 'e2e'];
46
+ }
40
47
 
48
+ if (options.testingType) {
41
49
  return throwInvalidOptionError(errors.invalidTestingType);
42
50
  }
43
51
 
44
52
  return [];
45
53
  };
54
+ /**
55
+ * Throws an error if configFile is string 'false' or boolean false
56
+ * @param {*} options
57
+ */
58
+
59
+
60
+ const checkConfigFile = options => {
61
+ // CLI will parse as string, module API can pass in boolean
62
+ if (options.configFile === 'false' || options.configFile === false) {
63
+ throwInvalidOptionError(errors.invalidConfigFile);
64
+ }
65
+ };
46
66
 
47
67
  module.exports = {
48
68
  throwInvalidOptionError,
49
- processTestingType
69
+ processTestingType,
70
+ checkConfigFile
50
71
  };
package/lib/exec/spawn.js CHANGED
@@ -175,6 +175,10 @@ module.exports = {
175
175
  args.unshift(startScriptPath);
176
176
  }
177
177
 
178
+ if (process.env.CYPRESS_INTERNAL_DEV_DEBUG) {
179
+ args.unshift(process.env.CYPRESS_INTERNAL_DEV_DEBUG);
180
+ }
181
+
178
182
  debug('spawn args %o %o', args, _.omit(stdioOptions, 'env'));
179
183
  debug('spawning Cypress with executable: %s', executable);
180
184
  const child = cp.spawn(executable, args, stdioOptions);
package/lib/exec/xvfb.js CHANGED
@@ -23,6 +23,7 @@ const debug = Debug('cypress:cli');
23
23
  const debugXvfb = Debug('cypress:xvfb');
24
24
  debug.Debug = debugXvfb.Debug = Debug;
25
25
  const xvfbOptions = {
26
+ displayNum: process.env.XVFB_DISPLAY_NUM,
26
27
  timeout: 30000,
27
28
  // milliseconds
28
29
  // need to explicitly define screen otherwise electron will crash
package/lib/util.js CHANGED
@@ -213,7 +213,7 @@ const dequote = str => {
213
213
  };
214
214
 
215
215
  const parseOpts = opts => {
216
- opts = _.pick(opts, 'browser', 'cachePath', 'cacheList', 'cacheClear', 'cachePrune', 'ciBuildId', 'config', 'configFile', 'cypressVersion', 'destination', 'detached', 'dev', 'exit', 'env', 'force', 'global', 'group', 'headed', 'headless', 'key', 'path', 'parallel', 'port', 'project', 'quiet', 'reporter', 'reporterOptions', 'record', 'runProject', 'spec', 'tag');
216
+ opts = _.pick(opts, 'browser', 'cachePath', 'cacheList', 'cacheClear', 'cachePrune', 'ciBuildId', 'ct', 'component', 'config', 'configFile', 'cypressVersion', 'destination', 'detached', 'dev', 'e2e', 'exit', 'env', 'force', 'global', 'group', 'headed', 'headless', 'inspect', 'inspectBrk', 'key', 'path', 'parallel', 'port', 'project', 'quiet', 'reporter', 'reporterOptions', 'record', 'runProject', 'spec', 'tag');
217
217
 
218
218
  if (opts.exit) {
219
219
  opts = _.omit(opts, 'exit');
@@ -245,10 +245,15 @@ const getApplicationDataFolder = (...paths) => {
245
245
  env
246
246
  } = process; // allow overriding the app_data folder
247
247
 
248
- const folder = env.CYPRESS_KONFIG_ENV || env.CYPRESS_INTERNAL_ENV || 'development';
248
+ let folder = env.CYPRESS_KONFIG_ENV || env.CYPRESS_INTERNAL_ENV || 'development';
249
249
  const PRODUCT_NAME = pkg.productName || pkg.name;
250
250
  const OS_DATA_PATH = ospath.data();
251
251
  const ELECTRON_APP_DATA_PATH = path.join(OS_DATA_PATH, PRODUCT_NAME);
252
+
253
+ if (process.env.CYPRESS_INTERNAL_E2E_TESTING_SELF) {
254
+ folder = `${folder}-e2e-test`;
255
+ }
256
+
252
257
  const p = path.join(ELECTRON_APP_DATA_PATH, 'cy', folder, ...paths);
253
258
  return p;
254
259
  };
@@ -289,7 +294,9 @@ const util = {
289
294
  // Node's builtin crypto.hash function.
290
295
 
291
296
 
292
- if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && process.versions.openssl.startsWith('3.')) {
297
+ if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && semver.satisfies(process.versions.openssl, '>=3', {
298
+ includePrerelease: true
299
+ })) {
293
300
  opts.ORIGINAL_NODE_OPTIONS = `${opts.ORIGINAL_NODE_OPTIONS || ''} --openssl-legacy-provider`;
294
301
  }
295
302
 
@@ -0,0 +1,20 @@
1
+ # [@cypress/mount-utils-v1.0.2](https://github.com/cypress-io/cypress/compare/@cypress/mount-utils-v1.0.1...@cypress/mount-utils-v1.0.2) (2021-04-30)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * avoid unmounting React components twice ([#16280](https://github.com/cypress-io/cypress/issues/16280)) ([bd629d3](https://github.com/cypress-io/cypress/commit/bd629d307eca9165b2c6f44ff87164a9e07a3eb5))
7
+
8
+ # [@cypress/mount-utils-v1.0.1](https://github.com/cypress-io/cypress/compare/@cypress/mount-utils-v1.0.0...@cypress/mount-utils-v1.0.1) (2021-04-26)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **webpack-dev-server:** remove hard dependency on html-webpack-plugin v4 ([#16108](https://github.com/cypress-io/cypress/issues/16108)) ([4cfe4b1](https://github.com/cypress-io/cypress/commit/4cfe4b1971c615d615c05ce35b9f7dd5ef8315fc))
14
+
15
+ # @cypress/mount-utils-v1.0.0 (2021-04-21)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * improve handling of userland injected styles in component testing ([#16024](https://github.com/cypress-io/cypress/issues/16024)) ([fe0b63c](https://github.com/cypress-io/cypress/commit/fe0b63c299947470c9cdce3a0d00364a1e224bdb))
@@ -0,0 +1,14 @@
1
+ # @cypress/mount-utils
2
+
3
+ > **Note** this package is not meant to be used outside of cypress component testing.
4
+
5
+ This librares exports some shared types and utility functions designed to build adapters for components frameworks.
6
+
7
+ It is used in:
8
+
9
+ - [`@cypress/react`](https://github.com/cypress-io/cypress/tree/develop/npm/react)
10
+ - [`@cypress/vue`](https://github.com/cypress-io/cypress/tree/develop/npm/vue)
11
+
12
+ ## Changelog
13
+
14
+ [Changelog](./CHANGELOG.md)
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Additional styles to inject into the document.
3
+ * A component might need 3rd party libraries from CDN,
4
+ * local CSS files and custom styles.
5
+ */
6
+ export interface StyleOptions {
7
+ /**
8
+ * Creates <link href="..." /> element for each stylesheet
9
+ * @alias stylesheet
10
+ */
11
+ stylesheets: string | string[];
12
+ /**
13
+ * Creates <link href="..." /> element for each stylesheet
14
+ * @alias stylesheets
15
+ */
16
+ stylesheet: string | string[];
17
+ /**
18
+ * Creates <style>...</style> element and inserts given CSS.
19
+ * @alias styles
20
+ */
21
+ style: string | string[];
22
+ /**
23
+ * Creates <style>...</style> element for each given CSS text.
24
+ * @alias style
25
+ */
26
+ styles: string | string[];
27
+ /**
28
+ * Loads each file and creates a <style>...</style> element
29
+ * with the loaded CSS
30
+ * @alias cssFile
31
+ */
32
+ cssFiles: string | string[];
33
+ /**
34
+ * Single CSS file to load into a <style></style> element
35
+ * @alias cssFile
36
+ */
37
+ cssFile: string | string[];
38
+ }
39
+ export declare const ROOT_SELECTOR = "[data-cy-root]";
40
+ export declare const getContainerEl: () => HTMLElement;
41
+ /**
42
+ * Remove any style or extra link elements from the iframe placeholder
43
+ * left from any previous test
44
+ *
45
+ */
46
+ export declare function cleanupStyles(): void;
47
+ /**
48
+ * Injects custom style text or CSS file or 3rd party style resources
49
+ * into the given document.
50
+ */
51
+ export declare const injectStylesBeforeElement: (options: Partial<StyleOptions & {
52
+ log: boolean;
53
+ }>, document: Document, el: HTMLElement | null) => HTMLElement;
54
+ export declare function setupHooks(optionalCallback?: Function): void;