cypress 9.2.1 → 9.4.1

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.
@@ -8,7 +8,7 @@ const is = require('check-more-types');
8
8
 
9
9
  const os = require('os');
10
10
 
11
- const Url = require('url');
11
+ const url = require('url');
12
12
 
13
13
  const path = require('path');
14
14
 
@@ -77,9 +77,10 @@ const getCA = () => {
77
77
  };
78
78
 
79
79
  const prepend = urlPath => {
80
- const endpoint = Url.resolve(getBaseUrl(), urlPath);
80
+ const endpoint = url.resolve(getBaseUrl(), urlPath);
81
81
  const platform = os.platform();
82
- return `${endpoint}?platform=${platform}&arch=${arch()}`;
82
+ const pathTemplate = util.getEnv('CYPRESS_DOWNLOAD_PATH_TEMPLATE');
83
+ return pathTemplate ? pathTemplate.replace('${endpoint}', endpoint).replace('${platform}', platform).replace('${arch}', arch()) : `${endpoint}?platform=${platform}&arch=${arch()}`;
83
84
  };
84
85
 
85
86
  const getUrl = version => {
@@ -300,7 +301,7 @@ const downloadFromUrl = ({
300
301
  });
301
302
  };
302
303
  /**
303
- * Download Cypress.zip from external url to local file.
304
+ * Download Cypress.zip from external versionUrl to local file.
304
305
  * @param [string] version Could be "3.3.0" or full URL
305
306
  * @param [string] downloadDestination Local filename to save as
306
307
  */
@@ -326,17 +327,17 @@ const start = opts => {
326
327
  };
327
328
  }
328
329
 
329
- const url = getUrl(version);
330
+ const versionUrl = getUrl(version);
330
331
  progress.throttle = 100;
331
332
  debug('needed Cypress version: %s', version);
332
- debug('source url %s', url);
333
+ debug('source url %s', versionUrl);
333
334
  debug(`downloading cypress.zip to "${downloadDestination}"`); // ensure download dir exists
334
335
 
335
336
  return fs.ensureDirAsync(path.dirname(downloadDestination)).then(() => {
336
337
  return getCA();
337
338
  }).then(ca => {
338
339
  return downloadFromUrl({
339
- url,
340
+ url: versionUrl,
340
341
  downloadDestination,
341
342
  progress,
342
343
  ca,
@@ -37,7 +37,7 @@ const xvfb = require('../exec/xvfb');
37
37
 
38
38
  const state = require('./state');
39
39
 
40
- const VERIFY_TEST_RUNNER_TIMEOUT_MS = +process.env.CYPRESS_VERIFY_TIMEOUT || 30000;
40
+ const VERIFY_TEST_RUNNER_TIMEOUT_MS = +util.getEnv('CYPRESS_VERIFY_TIMEOUT') || 30000;
41
41
 
42
42
  const checkExecutable = binaryDir => {
43
43
  const executable = state.getPathToExecutable(binaryDir);
package/lib/util.js CHANGED
@@ -42,14 +42,16 @@ const supportsColor = require('supports-color');
42
42
 
43
43
  const isInstalledGlobally = require('is-installed-globally');
44
44
 
45
- const pkg = require(path.join(__dirname, '..', 'package.json'));
46
-
47
45
  const logger = require('./logger');
48
46
 
49
47
  const debug = require('debug')('cypress:cli');
50
48
 
51
49
  const fs = require('./fs');
52
50
 
51
+ const semver = require('semver');
52
+
53
+ const pkg = require(path.join(__dirname, '..', 'package.json'));
54
+
53
55
  const issuesUrl = 'https://github.com/cypress-io/cypress/issues';
54
56
  const getosAsync = Promise.promisify(getos);
55
57
  /**
@@ -267,17 +269,31 @@ const util = {
267
269
  .mapValues(value => {
268
270
  // stringify to 1 or 0
269
271
  return value ? '1' : '0';
270
- }).extend(util.getOriginalNodeOptions(options)).value();
272
+ }).extend(util.getOriginalNodeOptions()).value();
271
273
  },
272
274
 
273
- getOriginalNodeOptions(options) {
275
+ getOriginalNodeOptions() {
276
+ const opts = {};
277
+
274
278
  if (process.env.NODE_OPTIONS) {
275
- return {
276
- ORIGINAL_NODE_OPTIONS: process.env.NODE_OPTIONS
277
- };
279
+ opts.ORIGINAL_NODE_OPTIONS = process.env.NODE_OPTIONS;
280
+ } // https://github.com/cypress-io/cypress/issues/18914
281
+ // Node 17+ ships with OpenSSL 3 by default, so we may need the option
282
+ // --openssl-legacy-provider so that webpack@4 can use the legacy MD4 hash
283
+ // function. This option doesn't exist on Node <17 or when it is built
284
+ // against OpenSSL 1, so we have to detect Node's major version and check
285
+ // which version of OpenSSL it was built against before spawning the plugins
286
+ // process.
287
+ // To be removed when the Cypress binary pulls in the @cypress/webpack-batteries-included-preprocessor
288
+ // version that has been updated to webpack >= 5.61, which no longer relies on
289
+ // Node's builtin crypto.hash function.
290
+
291
+
292
+ if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && process.versions.openssl.startsWith('3.')) {
293
+ opts.ORIGINAL_NODE_OPTIONS = `${opts.ORIGINAL_NODE_OPTIONS || ''} --openssl-legacy-provider`;
278
294
  }
279
295
 
280
- return {};
296
+ return opts;
281
297
  },
282
298
 
283
299
  getForceTty() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cypress",
3
- "version": "9.2.1",
3
+ "version": "9.4.1",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "postinstall": "node index.js --exec install",
@@ -10,11 +10,12 @@
10
10
  "@cypress/request": "^2.88.10",
11
11
  "@cypress/xvfb": "^1.2.4",
12
12
  "@types/node": "^14.14.31",
13
- "@types/sinonjs__fake-timers": "^6.0.2",
13
+ "@types/sinonjs__fake-timers": "8.1.1",
14
14
  "@types/sizzle": "^2.3.2",
15
15
  "arch": "^2.2.0",
16
16
  "blob-util": "^2.0.2",
17
- "bluebird": "3.7.2",
17
+ "bluebird": "^3.7.2",
18
+ "buffer": "^5.6.0",
18
19
  "cachedir": "^2.3.0",
19
20
  "chalk": "^4.1.0",
20
21
  "check-more-types": "^2.24.0",
@@ -43,10 +44,10 @@
43
44
  "pretty-bytes": "^5.6.0",
44
45
  "proxy-from-env": "1.0.0",
45
46
  "request-progress": "^3.0.0",
47
+ "semver": "^7.3.2",
46
48
  "supports-color": "^8.1.1",
47
49
  "tmp": "~0.2.1",
48
50
  "untildify": "^4.0.0",
49
- "url": "^0.11.0",
50
51
  "yauzl": "^2.10.0"
51
52
  },
52
53
  "files": [
@@ -27,3 +27,7 @@ interface NodeEventEmitter {
27
27
  prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this
28
28
  eventNames(): Array<string | symbol>
29
29
  }
30
+
31
+ // We use the Buffer class for dealing with binary data, especially around the
32
+ // selectFile interface.
33
+ type BufferType = import("buffer/").Buffer
@@ -231,6 +231,15 @@ declare namespace Cypress {
231
231
  * Cypress.Blob.method()
232
232
  */
233
233
  Blob: BlobUtil.BlobUtilStatic
234
+ /**
235
+ * Cypress automatically includes a Buffer library and exposes it as Cypress.Buffer.
236
+ *
237
+ * @see https://on.cypress.io/buffer
238
+ * @see https://github.com/feross/buffer
239
+ * @example
240
+ * Cypress.Buffer.method()
241
+ */
242
+ Buffer: BufferType
234
243
  /**
235
244
  * Cypress automatically includes minimatch and exposes it as Cypress.minimatch.
236
245
  *
@@ -662,6 +671,20 @@ declare namespace Cypress {
662
671
  */
663
672
  as(alias: string): Chainable<Subject>
664
673
 
674
+ /**
675
+ * Select a file with the given <input> element, or drag and drop a file over any DOM subject.
676
+ *
677
+ * @param {FileReference} files - The file(s) to select or drag onto this element.
678
+ * @see https://on.cypress.io/selectfile
679
+ * @example
680
+ * cy.get('input[type=file]').selectFile(Cypress.Buffer.from('text'))
681
+ * cy.get('input[type=file]').selectFile({
682
+ * fileName: 'users.json',
683
+ * fileContents: [{name: 'John Doe'}]
684
+ * })
685
+ */
686
+ selectFile(files: FileReference | FileReference[], options?: Partial<SelectFileOptions>): Chainable<Subject>
687
+
665
688
  /**
666
689
  * Blur a focused element. This element must currently be in focus.
667
690
  * If you want to ensure an element is focused before blurring,
@@ -2466,6 +2489,17 @@ declare namespace Cypress {
2466
2489
  scrollBehavior: scrollBehaviorOptions
2467
2490
  }
2468
2491
 
2492
+ interface SelectFileOptions extends Loggable, Timeoutable, ActionableOptions {
2493
+ /**
2494
+ * Which user action to perform. `select` matches selecting a file while
2495
+ * `drag-drop` matches dragging files from the operating system into the
2496
+ * document.
2497
+ *
2498
+ * @default 'select'
2499
+ */
2500
+ action: 'select' | 'drag-drop'
2501
+ }
2502
+
2469
2503
  interface BlurOptions extends Loggable, Forceable { }
2470
2504
 
2471
2505
  interface CheckOptions extends Loggable, Timeoutable, ActionableOptions {
@@ -5641,6 +5675,18 @@ declare namespace Cypress {
5641
5675
  stderr: string
5642
5676
  }
5643
5677
 
5678
+ type FileReference = string | BufferType | FileReferenceObject
5679
+ interface FileReferenceObject {
5680
+ /*
5681
+ * Buffers will be used as-is, while strings will be interpreted as an alias or a file path.
5682
+ * All other types will have `Buffer.from(JSON.stringify())` applied.
5683
+ */
5684
+ contents: any
5685
+ fileName?: string
5686
+ mimeType?: string
5687
+ lastModified?: number
5688
+ }
5689
+
5644
5690
  interface LogAttrs {
5645
5691
  url: string
5646
5692
  consoleProps: ObjectLike