cypress 8.6.0 → 9.1.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.
- package/lib/cli.js +12 -7
- package/lib/errors.js +9 -6
- package/lib/exec/info.js +12 -7
- package/lib/exec/spawn.js +1 -1
- package/lib/logger.js +4 -3
- package/lib/tasks/download.js +1 -15
- package/lib/tasks/install.js +18 -2
- package/lib/tasks/state.js +6 -5
- package/lib/util.js +19 -9
- package/package.json +3 -4
- package/types/cy-bluebird.d.ts +3 -2
- package/types/cypress-npm-api.d.ts +4 -0
- package/types/cypress.d.ts +17 -7
package/lib/cli.js
CHANGED
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
// @ts-check
|
|
4
4
|
const _ = require('lodash');
|
|
5
5
|
|
|
6
|
-
const R = require('ramda');
|
|
7
|
-
|
|
8
6
|
const commander = require('commander');
|
|
9
7
|
|
|
10
8
|
const {
|
|
@@ -238,11 +236,18 @@ const castCypressRunOptions = opts => {
|
|
|
238
236
|
// only properties that have type "string | false" in our TS definition
|
|
239
237
|
// require special handling, because CLI parsing takes care of purely
|
|
240
238
|
// boolean arguments
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
239
|
+
const castOpts = { ...opts
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
if (_.has(opts, 'port')) {
|
|
243
|
+
castOpts.port = coerceAnyStringToInt(opts.port);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (_.has(opts, 'configFile')) {
|
|
247
|
+
castOpts.configFile = coerceFalseOrString(opts.configFile);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return castOpts;
|
|
246
251
|
};
|
|
247
252
|
|
|
248
253
|
module.exports = {
|
package/lib/errors.js
CHANGED
|
@@ -7,10 +7,6 @@ const {
|
|
|
7
7
|
stripIndents
|
|
8
8
|
} = require('common-tags');
|
|
9
9
|
|
|
10
|
-
const {
|
|
11
|
-
merge
|
|
12
|
-
} = require('ramda');
|
|
13
|
-
|
|
14
10
|
const la = require('lazy-ass');
|
|
15
11
|
|
|
16
12
|
const is = require('check-more-types');
|
|
@@ -45,6 +41,12 @@ const invalidRunProjectPath = {
|
|
|
45
41
|
${chalk.blue(runDocumentationUrl)}
|
|
46
42
|
`
|
|
47
43
|
};
|
|
44
|
+
const invalidOS = {
|
|
45
|
+
description: 'The Cypress App could not be installed. Your machine does not meet the operating system requirements.',
|
|
46
|
+
solution: stripIndent`
|
|
47
|
+
|
|
48
|
+
${chalk.blue('https://on.cypress.io/guides/getting-started/installing-cypress#system-requirements')}`
|
|
49
|
+
};
|
|
48
50
|
const failedDownload = {
|
|
49
51
|
description: 'The Cypress App could not be downloaded.',
|
|
50
52
|
solution: stripIndent`
|
|
@@ -233,9 +235,9 @@ const CYPRESS_RUN_BINARY = {
|
|
|
233
235
|
|
|
234
236
|
function addPlatformInformation(info) {
|
|
235
237
|
return util.getPlatformInfo().then(platform => {
|
|
236
|
-
return
|
|
238
|
+
return { ...info,
|
|
237
239
|
platform
|
|
238
|
-
}
|
|
240
|
+
};
|
|
239
241
|
});
|
|
240
242
|
}
|
|
241
243
|
/**
|
|
@@ -374,6 +376,7 @@ module.exports = {
|
|
|
374
376
|
missingApp,
|
|
375
377
|
notInstalledCI,
|
|
376
378
|
missingDependency,
|
|
379
|
+
invalidOS,
|
|
377
380
|
invalidSmokeTestDisplayError,
|
|
378
381
|
versionMismatch,
|
|
379
382
|
binaryNotExecutable,
|
package/lib/exec/info.js
CHANGED
|
@@ -13,9 +13,7 @@ const chalk = require('chalk');
|
|
|
13
13
|
|
|
14
14
|
const prettyBytes = require('pretty-bytes');
|
|
15
15
|
|
|
16
|
-
const _ = require('lodash');
|
|
17
|
-
|
|
18
|
-
const R = require('ramda'); // color for numbers and show values
|
|
16
|
+
const _ = require('lodash'); // color for numbers and show values
|
|
19
17
|
|
|
20
18
|
|
|
21
19
|
const g = chalk.green; // color for paths
|
|
@@ -30,14 +28,21 @@ methods.findProxyEnvironmentVariables = () => {
|
|
|
30
28
|
return _.pick(process.env, ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY']);
|
|
31
29
|
};
|
|
32
30
|
|
|
33
|
-
const maskSensitiveVariables =
|
|
34
|
-
|
|
35
|
-
}
|
|
31
|
+
const maskSensitiveVariables = obj => {
|
|
32
|
+
const masked = { ...obj
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (masked.CYPRESS_RECORD_KEY) {
|
|
36
|
+
masked.CYPRESS_RECORD_KEY = '<redacted>';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return masked;
|
|
40
|
+
};
|
|
36
41
|
|
|
37
42
|
methods.findCypressEnvironmentVariables = () => {
|
|
38
43
|
const isCyVariable = (val, key) => key.startsWith('CYPRESS_');
|
|
39
44
|
|
|
40
|
-
return
|
|
45
|
+
return _.pickBy(process.env, isCyVariable);
|
|
41
46
|
};
|
|
42
47
|
|
|
43
48
|
const formatCypressVariables = () => {
|
package/lib/exec/spawn.js
CHANGED
package/lib/logger.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const R = require('ramda');
|
|
4
|
-
|
|
5
3
|
const chalk = require('chalk');
|
|
6
4
|
|
|
7
5
|
let logs = [];
|
|
@@ -36,7 +34,10 @@ const always = (...messages) => {
|
|
|
36
34
|
|
|
37
35
|
const logLines = text => {
|
|
38
36
|
const lines = text.split('\n');
|
|
39
|
-
|
|
37
|
+
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
log(line);
|
|
40
|
+
}
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
const print = () => {
|
package/lib/tasks/download.js
CHANGED
|
@@ -41,19 +41,6 @@ const getProxyForUrlWithNpmConfig = url => {
|
|
|
41
41
|
return getProxyForUrl(url) || process.env.npm_config_https_proxy || process.env.npm_config_proxy || null;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const getRealOsArch = () => {
|
|
45
|
-
// os.arch() returns the arch for which this node was compiled
|
|
46
|
-
// we want the operating system's arch instead: x64 or x86
|
|
47
|
-
const osArch = arch();
|
|
48
|
-
|
|
49
|
-
if (osArch === 'x86') {
|
|
50
|
-
// match process.platform output
|
|
51
|
-
return 'ia32';
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return osArch;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
44
|
const getBaseUrl = () => {
|
|
58
45
|
if (util.getEnv('CYPRESS_DOWNLOAD_MIRROR')) {
|
|
59
46
|
let baseUrl = util.getEnv('CYPRESS_DOWNLOAD_MIRROR');
|
|
@@ -91,8 +78,7 @@ const getCA = () => {
|
|
|
91
78
|
const prepend = urlPath => {
|
|
92
79
|
const endpoint = url.resolve(getBaseUrl(), urlPath);
|
|
93
80
|
const platform = os.platform();
|
|
94
|
-
|
|
95
|
-
return `${endpoint}?platform=${platform}&arch=${arch}`;
|
|
81
|
+
return `${endpoint}?platform=${platform}&arch=${arch()}`;
|
|
96
82
|
};
|
|
97
83
|
|
|
98
84
|
const getUrl = version => {
|
package/lib/tasks/install.js
CHANGED
|
@@ -64,6 +64,10 @@ const getNpmArgv = () => {
|
|
|
64
64
|
const getVersionSpecifier = (startDir = path.resolve(__dirname, '../..')) => {
|
|
65
65
|
const argv = getNpmArgv();
|
|
66
66
|
|
|
67
|
+
if ((process.env.npm_package_resolved || '').endsWith('cypress.tgz')) {
|
|
68
|
+
return process.env.npm_package_resolved;
|
|
69
|
+
}
|
|
70
|
+
|
|
67
71
|
if (argv) {
|
|
68
72
|
const tgz = _.find(argv, t => t.endsWith('cypress.tgz'));
|
|
69
73
|
|
|
@@ -104,7 +108,7 @@ const getVersionSpecifier = (startDir = path.resolve(__dirname, '../..')) => {
|
|
|
104
108
|
});
|
|
105
109
|
};
|
|
106
110
|
|
|
107
|
-
const betaNpmUrlRe = /^\/beta\/npm\/(?<version>[0-9.]+)\/(?<artifactSlug
|
|
111
|
+
const betaNpmUrlRe = /^\/beta\/npm\/(?<version>[0-9.]+)\/(?<artifactSlug>.+?)\/cypress\.tgz$/; // convert a prerelease NPM package .tgz URL to the corresponding binary .zip URL
|
|
108
112
|
|
|
109
113
|
const getBinaryUrlFromPrereleaseNpmUrl = npmUrl => {
|
|
110
114
|
let parsed;
|
|
@@ -226,6 +230,12 @@ const downloadAndUnzip = ({
|
|
|
226
230
|
return Promise.resolve(tasks.run());
|
|
227
231
|
};
|
|
228
232
|
|
|
233
|
+
const validateOS = () => {
|
|
234
|
+
return util.getPlatformInfo().then(platformInfo => {
|
|
235
|
+
return platformInfo.match(/(darwin|linux|win32)-x64/);
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
|
|
229
239
|
const start = (options = {}) => {
|
|
230
240
|
debug('installing with options %j', options);
|
|
231
241
|
|
|
@@ -269,7 +279,13 @@ const start = (options = {}) => {
|
|
|
269
279
|
const installDir = state.getVersionDir(pkgVersion);
|
|
270
280
|
const cacheDir = state.getCacheDir();
|
|
271
281
|
const binaryDir = state.getBinaryDir(pkgVersion);
|
|
272
|
-
return
|
|
282
|
+
return validateOS().then(isValid => {
|
|
283
|
+
if (!isValid) {
|
|
284
|
+
return throwFormErrorText(errors.invalidOS)();
|
|
285
|
+
}
|
|
286
|
+
}).then(() => {
|
|
287
|
+
return fs.ensureDirAsync(cacheDir);
|
|
288
|
+
}).catch({
|
|
273
289
|
code: 'EACCES'
|
|
274
290
|
}, err => {
|
|
275
291
|
return throwFormErrorText(errors.invalidCacheDirectory)(stripIndent`
|
package/lib/tasks/state.js
CHANGED
|
@@ -8,8 +8,6 @@ const path = require('path');
|
|
|
8
8
|
|
|
9
9
|
const untildify = require('untildify');
|
|
10
10
|
|
|
11
|
-
const R = require('ramda');
|
|
12
|
-
|
|
13
11
|
const debug = require('debug')('cypress:cli');
|
|
14
12
|
|
|
15
13
|
const fs = require('../fs');
|
|
@@ -203,9 +201,12 @@ const getBinaryPkgAsync = binaryDir => {
|
|
|
203
201
|
});
|
|
204
202
|
};
|
|
205
203
|
|
|
206
|
-
const getBinaryPkgVersion =
|
|
207
|
-
|
|
208
|
-
const
|
|
204
|
+
const getBinaryPkgVersion = o => _.get(o, 'version', null);
|
|
205
|
+
|
|
206
|
+
const getBinaryElectronVersion = o => _.get(o, 'electronVersion', null);
|
|
207
|
+
|
|
208
|
+
const getBinaryElectronNodeVersion = o => _.get(o, 'electronNodeVersion', null);
|
|
209
|
+
|
|
209
210
|
module.exports = {
|
|
210
211
|
getPathToExecutable,
|
|
211
212
|
getPlatformExecutable,
|
package/lib/util.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const _ = require('lodash');
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const arch = require('arch');
|
|
6
6
|
|
|
7
7
|
const os = require('os');
|
|
8
8
|
|
|
@@ -133,9 +133,8 @@ const logBrokenGtkDisplayWarning = () => {
|
|
|
133
133
|
};
|
|
134
134
|
|
|
135
135
|
function stdoutLineMatches(expectedLine, stdout) {
|
|
136
|
-
const lines = stdout.split('\n').map(
|
|
137
|
-
|
|
138
|
-
return lines.some(lineMatches);
|
|
136
|
+
const lines = stdout.split('\n').map(val => val.trim());
|
|
137
|
+
return lines.some(line => line === expectedLine);
|
|
139
138
|
}
|
|
140
139
|
/**
|
|
141
140
|
* Confirms if given value is a valid CYPRESS_INTERNAL_ENV value. Undefined values
|
|
@@ -220,11 +219,16 @@ const parseOpts = opts => {
|
|
|
220
219
|
// remove double quotes from certain options
|
|
221
220
|
|
|
222
221
|
|
|
223
|
-
const
|
|
224
|
-
group: dequote,
|
|
225
|
-
ciBuildId: dequote
|
|
222
|
+
const cleanOpts = { ...opts
|
|
226
223
|
};
|
|
227
|
-
const
|
|
224
|
+
const toDequote = ['group', 'ciBuildId'];
|
|
225
|
+
|
|
226
|
+
for (const prop of toDequote) {
|
|
227
|
+
if (_.has(opts, prop)) {
|
|
228
|
+
cleanOpts[prop] = dequote(opts[prop]);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
228
232
|
debug('parsed cli options %o', cleanOpts);
|
|
229
233
|
return cleanOpts;
|
|
230
234
|
};
|
|
@@ -404,8 +408,14 @@ const util = {
|
|
|
404
408
|
|
|
405
409
|
getPlatformInfo() {
|
|
406
410
|
return util.getOsVersionAsync().then(version => {
|
|
411
|
+
let osArch = arch();
|
|
412
|
+
|
|
413
|
+
if (osArch === 'x86') {
|
|
414
|
+
osArch = 'ia32';
|
|
415
|
+
}
|
|
416
|
+
|
|
407
417
|
return stripIndent`
|
|
408
|
-
Platform: ${os.platform()} (${version})
|
|
418
|
+
Platform: ${os.platform()}-${osArch} (${version})
|
|
409
419
|
Cypress Version: ${util.pkgVersion()}
|
|
410
420
|
`;
|
|
411
421
|
});
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cypress",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.1.1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"postinstall": "node index.js --exec install",
|
|
7
7
|
"size": "t=\"$(npm pack .)\"; wc -c \"${t}\"; tar tvf \"${t}\"; rm \"${t}\";"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@cypress/request": "^2.88.
|
|
10
|
+
"@cypress/request": "^2.88.10",
|
|
11
11
|
"@cypress/xvfb": "^1.2.4",
|
|
12
12
|
"@types/node": "^14.14.31",
|
|
13
13
|
"@types/sinonjs__fake-timers": "^6.0.2",
|
|
14
14
|
"@types/sizzle": "^2.3.2",
|
|
15
15
|
"arch": "^2.2.0",
|
|
16
16
|
"blob-util": "^2.0.2",
|
|
17
|
-
"bluebird": "
|
|
17
|
+
"bluebird": "3.7.2",
|
|
18
18
|
"cachedir": "^2.3.0",
|
|
19
19
|
"chalk": "^4.1.0",
|
|
20
20
|
"check-more-types": "^2.24.0",
|
|
@@ -42,7 +42,6 @@
|
|
|
42
42
|
"ospath": "^1.2.2",
|
|
43
43
|
"pretty-bytes": "^5.6.0",
|
|
44
44
|
"proxy-from-env": "1.0.0",
|
|
45
|
-
"ramda": "~0.27.1",
|
|
46
45
|
"request-progress": "^3.0.0",
|
|
47
46
|
"supports-color": "^8.1.1",
|
|
48
47
|
"tmp": "~0.2.1",
|
package/types/cy-bluebird.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// Shim definition to export a namespace. Cypress is actually a global module
|
|
2
2
|
// so import/export isn't allowed there. We import here and define a global module
|
|
3
3
|
// so that Cypress can get and use the Blob type
|
|
4
|
-
import
|
|
4
|
+
import ImportedBluebird = require('./bluebird')
|
|
5
5
|
|
|
6
6
|
export = Bluebird
|
|
7
7
|
export as namespace Bluebird
|
|
8
8
|
|
|
9
9
|
declare namespace Bluebird {
|
|
10
|
-
type BluebirdStatic = typeof
|
|
10
|
+
type BluebirdStatic = typeof ImportedBluebird
|
|
11
|
+
interface Promise<T> extends ImportedBluebird<T> {}
|
|
11
12
|
}
|
|
@@ -91,6 +91,10 @@ declare namespace CypressCommandLine {
|
|
|
91
91
|
* Specify mocha reporter options
|
|
92
92
|
*/
|
|
93
93
|
reporterOptions: any
|
|
94
|
+
/**
|
|
95
|
+
* Slow test threshold in milliseconds. Only affects the visual output of some reporters. For example, the spec reporter will display the test time in yellow if over the threshold.
|
|
96
|
+
*/
|
|
97
|
+
slowTestThreshold: number
|
|
94
98
|
/**
|
|
95
99
|
* Specify the specs to run
|
|
96
100
|
*/
|
package/types/cypress.d.ts
CHANGED
|
@@ -170,6 +170,11 @@ declare namespace Cypress {
|
|
|
170
170
|
*/
|
|
171
171
|
interface ApplicationWindow { } // tslint:disable-line
|
|
172
172
|
|
|
173
|
+
/**
|
|
174
|
+
* The configuration for Cypress.
|
|
175
|
+
*/
|
|
176
|
+
type Config = ResolvedConfigOptions & RuntimeConfigOptions
|
|
177
|
+
|
|
173
178
|
/**
|
|
174
179
|
* Several libraries are bundled with Cypress by default.
|
|
175
180
|
*
|
|
@@ -275,7 +280,7 @@ declare namespace Cypress {
|
|
|
275
280
|
* Currently executing test runnable instance.
|
|
276
281
|
*/
|
|
277
282
|
currentTest: {
|
|
278
|
-
title: string
|
|
283
|
+
title: string
|
|
279
284
|
titlePath: string[]
|
|
280
285
|
}
|
|
281
286
|
|
|
@@ -297,7 +302,7 @@ declare namespace Cypress {
|
|
|
297
302
|
/**
|
|
298
303
|
* Fire automation:request event for internal use.
|
|
299
304
|
*/
|
|
300
|
-
automation(eventName: string, ...args: any[]): Promise<any>
|
|
305
|
+
automation(eventName: string, ...args: any[]): Bluebird.Promise<any>
|
|
301
306
|
|
|
302
307
|
/**
|
|
303
308
|
* Promise wrapper for certain internal tasks.
|
|
@@ -313,7 +318,7 @@ declare namespace Cypress {
|
|
|
313
318
|
// {defaultCommandTimeout: 10000, pageLoadTimeout: 30000, ...}
|
|
314
319
|
```
|
|
315
320
|
*/
|
|
316
|
-
config():
|
|
321
|
+
config(): Config
|
|
317
322
|
/**
|
|
318
323
|
* Returns one configuration value.
|
|
319
324
|
* @see https://on.cypress.io/config
|
|
@@ -415,9 +420,9 @@ declare namespace Cypress {
|
|
|
415
420
|
* @see https://on.cypress.io/api/commands
|
|
416
421
|
*/
|
|
417
422
|
Commands: {
|
|
418
|
-
add(name:
|
|
419
|
-
add(name:
|
|
420
|
-
overwrite(name:
|
|
423
|
+
add<T extends keyof Chainable>(name: T, fn: Chainable[T]): void
|
|
424
|
+
add<T extends keyof Chainable>(name: T, options: CommandOptions, fn: Chainable[T]): void
|
|
425
|
+
overwrite<T extends keyof Chainable>(name: T, fn: Chainable[T]): void
|
|
421
426
|
}
|
|
422
427
|
|
|
423
428
|
/**
|
|
@@ -2572,6 +2577,11 @@ declare namespace Cypress {
|
|
|
2572
2577
|
* @default "spec"
|
|
2573
2578
|
*/
|
|
2574
2579
|
reporterOptions: { [key: string]: any }
|
|
2580
|
+
/**
|
|
2581
|
+
* Slow test threshold in milliseconds. Only affects the visual output of some reporters. For example, the spec reporter will display the test time in yellow if over the threshold.
|
|
2582
|
+
* @default 10000
|
|
2583
|
+
*/
|
|
2584
|
+
slowTestThreshold: number
|
|
2575
2585
|
/**
|
|
2576
2586
|
* Whether Cypress will watch and restart tests on test file changes
|
|
2577
2587
|
* @default true
|
|
@@ -5667,7 +5677,7 @@ declare namespace Cypress {
|
|
|
5667
5677
|
xhr: XMLHttpRequest
|
|
5668
5678
|
}
|
|
5669
5679
|
|
|
5670
|
-
type Encodings = 'ascii' | 'base64' | 'binary' | 'hex' | 'latin1' | 'utf8' | 'utf-8' | 'ucs2' | 'ucs-2' | 'utf16le' | 'utf-16le'
|
|
5680
|
+
type Encodings = 'ascii' | 'base64' | 'binary' | 'hex' | 'latin1' | 'utf8' | 'utf-8' | 'ucs2' | 'ucs-2' | 'utf16le' | 'utf-16le' | null
|
|
5671
5681
|
type PositionType = 'topLeft' | 'top' | 'topRight' | 'left' | 'center' | 'right' | 'bottomLeft' | 'bottom' | 'bottomRight'
|
|
5672
5682
|
type ViewportPreset = 'macbook-16' | 'macbook-15' | 'macbook-13' | 'macbook-11' | 'ipad-2' | 'ipad-mini' | 'iphone-xr' | 'iphone-x' | 'iphone-6+' | 'iphone-se2' | 'iphone-8' | 'iphone-7' | 'iphone-6' | 'iphone-5' | 'iphone-4' | 'iphone-3' | 'samsung-s10' | 'samsung-note9'
|
|
5673
5683
|
interface Offset {
|