cypress 9.6.0 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
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;