cypress 4.4.1 → 4.5.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.
- package/index.js +15 -6
- package/lib/cli.js +56 -53
- package/lib/cypress.js +8 -9
- package/lib/errors.js +216 -84
- package/lib/exec/info.js +17 -13
- package/lib/exec/open.js +4 -1
- package/lib/exec/run.js +20 -24
- package/lib/exec/spawn.js +56 -53
- package/lib/exec/versions.js +9 -6
- package/lib/exec/xvfb.js +29 -27
- package/lib/fs.js +1 -1
- package/lib/logger.js +16 -12
- package/lib/tasks/cache.js +11 -12
- package/lib/tasks/download.js +100 -73
- package/lib/tasks/install.js +125 -73
- package/lib/tasks/state.js +35 -19
- package/lib/tasks/unzip.js +38 -44
- package/lib/tasks/verify.js +101 -64
- package/lib/util.js +112 -107
- package/package.json +1 -1
package/index.js
CHANGED
@@ -1,26 +1,35 @@
|
|
1
|
-
|
1
|
+
"use strict";
|
2
2
|
|
3
3
|
var minimist = require('minimist');
|
4
|
+
|
4
5
|
var debug = require('debug')('cypress:cli');
|
6
|
+
|
5
7
|
var args = minimist(process.argv.slice(2));
|
6
|
-
var util = require('./lib/util');
|
7
8
|
|
8
|
-
// we're being used from the command line
|
9
|
+
var util = require('./lib/util'); // we're being used from the command line
|
10
|
+
|
11
|
+
|
9
12
|
switch (args.exec) {
|
10
13
|
case 'install':
|
11
14
|
debug('installing Cypress from NPM');
|
12
15
|
|
13
|
-
require('./lib/tasks/install').start({
|
16
|
+
require('./lib/tasks/install').start({
|
17
|
+
force: args.force
|
18
|
+
})["catch"](util.logErrorExit1);
|
14
19
|
|
15
20
|
break;
|
21
|
+
|
16
22
|
case 'verify':
|
17
23
|
// for simple testing in the monorepo
|
18
24
|
debug('verifying Cypress');
|
19
25
|
|
20
|
-
require('./lib/tasks/verify').start({
|
21
|
-
|
26
|
+
require('./lib/tasks/verify').start({
|
27
|
+
force: true
|
28
|
+
}) // always force verification
|
29
|
+
["catch"](util.logErrorExit1);
|
22
30
|
|
23
31
|
break;
|
32
|
+
|
24
33
|
default:
|
25
34
|
debug('exporting Cypress module interface');
|
26
35
|
module.exports = require('./lib/cypress');
|
package/lib/cli.js
CHANGED
@@ -1,33 +1,48 @@
|
|
1
|
-
|
1
|
+
"use strict";
|
2
2
|
|
3
|
-
|
3
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
4
|
+
|
5
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
6
|
+
|
7
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
8
|
+
|
9
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
10
|
+
|
11
|
+
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
12
|
+
|
13
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
4
14
|
|
5
15
|
var _ = require('lodash');
|
16
|
+
|
6
17
|
var commander = require('commander');
|
7
18
|
|
8
19
|
var _require = require('common-tags'),
|
9
20
|
stripIndent = _require.stripIndent;
|
10
21
|
|
11
22
|
var logSymbols = require('log-symbols');
|
23
|
+
|
12
24
|
var debug = require('debug')('cypress:cli:cli');
|
25
|
+
|
13
26
|
var util = require('./util');
|
27
|
+
|
14
28
|
var logger = require('./logger');
|
29
|
+
|
15
30
|
var errors = require('./errors');
|
16
|
-
var cache = require('./tasks/cache');
|
17
31
|
|
18
|
-
// patch "commander" method called when a user passed an unknown option
|
32
|
+
var cache = require('./tasks/cache'); // patch "commander" method called when a user passed an unknown option
|
19
33
|
// we want to print help for the current command and exit with an error
|
34
|
+
|
35
|
+
|
20
36
|
function unknownOption(flag) {
|
21
37
|
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'option';
|
22
|
-
|
23
38
|
if (this._allowUnknownOption) return;
|
24
|
-
|
25
39
|
logger.error();
|
26
|
-
logger.error(
|
40
|
+
logger.error(" error: unknown ".concat(type, ":"), flag);
|
27
41
|
logger.error();
|
28
42
|
this.outputHelp();
|
29
43
|
util.exit(1);
|
30
44
|
}
|
45
|
+
|
31
46
|
commander.Command.prototype.unknownOption = unknownOption;
|
32
47
|
|
33
48
|
var coerceFalse = function coerceFalse(arg) {
|
@@ -35,10 +50,10 @@ var coerceFalse = function coerceFalse(arg) {
|
|
35
50
|
};
|
36
51
|
|
37
52
|
var spaceDelimitedArgsMsg = function spaceDelimitedArgsMsg(flag, args) {
|
38
|
-
var msg =
|
53
|
+
var msg = "\n ".concat(logSymbols.warning, " Warning: It looks like you're passing --").concat(flag, " a space-separated list of arguments:\n\n \"").concat(args.join(' '), "\"\n\n This will work, but it's not recommended.\n\n If you are trying to pass multiple arguments, separate them with commas instead:\n cypress run --").concat(flag, " arg1,arg2,arg3\n ");
|
39
54
|
|
40
55
|
if (flag === 'spec') {
|
41
|
-
msg +=
|
56
|
+
msg += "\n The most common cause of this warning is using an unescaped glob pattern. If you are\n trying to pass a glob pattern, escape it using quotes:\n cypress run --spec \"**/*.spec.js\"\n ";
|
42
57
|
}
|
43
58
|
|
44
59
|
logger.log();
|
@@ -56,17 +71,19 @@ var parseVariableOpts = function parseVariableOpts(fnArgs, args) {
|
|
56
71
|
// flags that could have possible multiple args
|
57
72
|
// but before the next option
|
58
73
|
// --spec spec1 spec2 or --tag foo bar
|
59
|
-
|
60
74
|
var multiArgFlags = _.compact([opts.spec ? 'spec' : opts.spec, opts.tag ? 'tag' : opts.tag]);
|
61
75
|
|
62
76
|
_.forEach(multiArgFlags, function (flag) {
|
63
|
-
var argIndex = _.indexOf(args,
|
77
|
+
var argIndex = _.indexOf(args, "--".concat(flag)) + 2;
|
78
|
+
|
64
79
|
var nextOptOffset = _.findIndex(_.slice(args, argIndex), function (arg) {
|
65
80
|
return _.startsWith(arg, '--');
|
66
81
|
});
|
82
|
+
|
67
83
|
var endIndex = nextOptOffset !== -1 ? argIndex + nextOptOffset : args.length;
|
68
84
|
|
69
85
|
var maybeArgs = _.slice(args, argIndex, endIndex);
|
86
|
+
|
70
87
|
var extraArgs = _.intersection(maybeArgs, unknownArgs);
|
71
88
|
|
72
89
|
if (extraArgs.length) {
|
@@ -77,8 +94,10 @@ var parseVariableOpts = function parseVariableOpts(fnArgs, args) {
|
|
77
94
|
});
|
78
95
|
}
|
79
96
|
|
80
|
-
debug('variable-length opts parsed %o', {
|
81
|
-
|
97
|
+
debug('variable-length opts parsed %o', {
|
98
|
+
args: args,
|
99
|
+
opts: opts
|
100
|
+
});
|
82
101
|
return util.parseOpts(opts);
|
83
102
|
};
|
84
103
|
|
@@ -111,12 +130,11 @@ var descriptions = {
|
|
111
130
|
tag: 'named tag(s) for recorded runs in the Cypress Dashboard',
|
112
131
|
version: 'prints Cypress version'
|
113
132
|
};
|
114
|
-
|
115
133
|
var knownCommands = ['cache', 'help', '-h', '--help', 'install', 'open', 'run', 'verify', '-v', '--version', 'version', 'info'];
|
116
134
|
|
117
135
|
var text = function text(description) {
|
118
136
|
if (!descriptions[description]) {
|
119
|
-
throw new Error(
|
137
|
+
throw new Error("Could not find description for: ".concat(description));
|
120
138
|
}
|
121
139
|
|
122
140
|
return descriptions[description];
|
@@ -128,14 +146,12 @@ function includesVersion(args) {
|
|
128
146
|
|
129
147
|
function showVersions() {
|
130
148
|
debug('printing Cypress version');
|
131
|
-
|
132
149
|
return require('./exec/versions').getVersions().then(function () {
|
133
150
|
var versions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
134
|
-
|
135
|
-
logger.always('Cypress package version:', versions.package);
|
151
|
+
logger.always('Cypress package version:', versions["package"]);
|
136
152
|
logger.always('Cypress binary version:', versions.binary);
|
137
153
|
process.exit(0);
|
138
|
-
})
|
154
|
+
})["catch"](util.logErrorExit1);
|
139
155
|
}
|
140
156
|
|
141
157
|
module.exports = {
|
@@ -146,63 +162,56 @@ module.exports = {
|
|
146
162
|
|
147
163
|
var CYPRESS_INTERNAL_ENV = process.env.CYPRESS_INTERNAL_ENV;
|
148
164
|
|
149
|
-
|
150
165
|
if (!util.isValidCypressInternalEnvValue(CYPRESS_INTERNAL_ENV)) {
|
151
166
|
debug('invalid CYPRESS_INTERNAL_ENV value', CYPRESS_INTERNAL_ENV);
|
152
|
-
|
153
|
-
return errors.exitWithError(errors.errors.invalidCypressEnv)('CYPRESS_INTERNAL_ENV=' + CYPRESS_INTERNAL_ENV);
|
167
|
+
return errors.exitWithError(errors.errors.invalidCypressEnv)("CYPRESS_INTERNAL_ENV=".concat(CYPRESS_INTERNAL_ENV));
|
154
168
|
}
|
155
169
|
|
156
170
|
if (util.isNonProductionCypressInternalEnvValue(CYPRESS_INTERNAL_ENV)) {
|
157
171
|
debug('non-production CYPRESS_INTERNAL_ENV value', CYPRESS_INTERNAL_ENV);
|
158
|
-
|
159
|
-
var msg = '\n ' + logSymbols.warning + ' Warning: It looks like you\'re passing CYPRESS_INTERNAL_ENV=' + CYPRESS_INTERNAL_ENV + '\n\n The environment variable "CYPRESS_INTERNAL_ENV" is reserved and should only be used internally.\n\n Unset the "CYPRESS_INTERNAL_ENV" environment variable and run Cypress again.\n ';
|
160
|
-
|
172
|
+
var msg = "\n ".concat(logSymbols.warning, " Warning: It looks like you're passing CYPRESS_INTERNAL_ENV=").concat(CYPRESS_INTERNAL_ENV, "\n\n The environment variable \"CYPRESS_INTERNAL_ENV\" is reserved and should only be used internally.\n\n Unset the \"CYPRESS_INTERNAL_ENV\" environment variable and run Cypress again.\n ");
|
161
173
|
logger.log();
|
162
174
|
logger.warn(stripIndent(msg));
|
163
175
|
logger.log();
|
164
176
|
}
|
165
177
|
|
166
|
-
var program = new commander.Command();
|
167
|
-
|
168
|
-
// bug in commander not printing name
|
178
|
+
var program = new commander.Command(); // bug in commander not printing name
|
169
179
|
// in usage help docs
|
170
|
-
program._name = 'cypress';
|
171
180
|
|
181
|
+
program._name = 'cypress';
|
172
182
|
program.usage('<command> [options]');
|
173
|
-
|
174
183
|
program.command('help').description('Shows CLI help and exits').action(function () {
|
175
184
|
program.help();
|
176
185
|
});
|
177
|
-
|
178
186
|
program.option('-v, --version', text('version')).command('version').description(text('version')).action(showVersions);
|
179
|
-
|
180
187
|
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('--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(function () {
|
181
|
-
for (var _len = arguments.length, fnArgs = Array(_len), _key = 0; _key < _len; _key++) {
|
188
|
+
for (var _len = arguments.length, fnArgs = new Array(_len), _key = 0; _key < _len; _key++) {
|
182
189
|
fnArgs[_key] = arguments[_key];
|
183
190
|
}
|
184
191
|
|
185
192
|
debug('running Cypress with args %o', fnArgs);
|
186
|
-
require('./exec/run').start(parseVariableOpts(fnArgs, args)).then(util.exit).catch(util.logErrorExit1);
|
187
|
-
});
|
188
193
|
|
194
|
+
require('./exec/run').start(parseVariableOpts(fnArgs, args)).then(util.exit)["catch"](util.logErrorExit1);
|
195
|
+
});
|
189
196
|
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).action(function (opts) {
|
190
197
|
debug('opening Cypress');
|
191
|
-
require('./exec/open').start(util.parseOpts(opts)).catch(util.logErrorExit1);
|
192
|
-
});
|
193
198
|
|
199
|
+
require('./exec/open').start(util.parseOpts(opts))["catch"](util.logErrorExit1);
|
200
|
+
});
|
194
201
|
program.command('install').usage('[options]').description('Installs the Cypress executable matching this package\'s version').option('-f, --force', text('forceInstall')).action(function (opts) {
|
195
|
-
require('./tasks/install').start(util.parseOpts(opts))
|
202
|
+
require('./tasks/install').start(util.parseOpts(opts))["catch"](util.logErrorExit1);
|
196
203
|
});
|
197
|
-
|
198
204
|
program.command('verify').usage('[options]').description('Verifies that Cypress is installed correctly and executable').option('--dev', text('dev'), coerceFalse).action(function (opts) {
|
199
|
-
var defaultOpts = {
|
205
|
+
var defaultOpts = {
|
206
|
+
force: true,
|
207
|
+
welcomeMessage: false
|
208
|
+
};
|
200
209
|
var parsedOpts = util.parseOpts(opts);
|
210
|
+
|
201
211
|
var options = _.extend(parsedOpts, defaultOpts);
|
202
212
|
|
203
|
-
require('./tasks/verify').start(options)
|
213
|
+
require('./tasks/verify').start(options)["catch"](util.logErrorExit1);
|
204
214
|
});
|
205
|
-
|
206
215
|
program.command('cache').usage('[command]').description('Manages the Cypress binary cache').option('list', text('cacheList')).option('path', text('cachePath')).option('clear', text('cacheClear')).action(function (opts, args) {
|
207
216
|
if (!args || !args.length) {
|
208
217
|
this.outputHelp();
|
@@ -213,33 +222,28 @@ module.exports = {
|
|
213
222
|
command = _args[0];
|
214
223
|
|
215
224
|
if (!_.includes(['list', 'path', 'clear'], command)) {
|
216
|
-
unknownOption.call(this,
|
225
|
+
unknownOption.call(this, "cache ".concat(command), 'command');
|
217
226
|
}
|
218
227
|
|
219
228
|
cache[command]();
|
220
229
|
});
|
221
|
-
|
222
230
|
program.command('info').usage('[command]').description('Prints Cypress and system information').option('--dev', text('dev'), coerceFalse).action(function (opts) {
|
223
|
-
require('./exec/info').start(opts).then(util.exit)
|
231
|
+
require('./exec/info').start(opts).then(util.exit)["catch"](util.logErrorExit1);
|
224
232
|
});
|
225
|
-
|
226
233
|
debug('cli starts with arguments %j', args);
|
227
|
-
util.printNodeOptions();
|
234
|
+
util.printNodeOptions(); // if there are no arguments
|
228
235
|
|
229
|
-
// if there are no arguments
|
230
236
|
if (args.length <= 2) {
|
231
237
|
debug('printing help');
|
232
|
-
program.help();
|
233
|
-
// exits
|
238
|
+
program.help(); // exits
|
234
239
|
}
|
235
240
|
|
236
241
|
var firstCommand = args[2];
|
237
242
|
|
238
243
|
if (!_.includes(knownCommands, firstCommand)) {
|
239
244
|
debug('unknown command %s', firstCommand);
|
240
|
-
logger.error('Unknown command',
|
245
|
+
logger.error('Unknown command', "\"".concat(firstCommand, "\""));
|
241
246
|
program.outputHelp();
|
242
|
-
|
243
247
|
return util.exit(1);
|
244
248
|
}
|
245
249
|
|
@@ -252,7 +256,6 @@ module.exports = {
|
|
252
256
|
}
|
253
257
|
|
254
258
|
debug('program parsing arguments');
|
255
|
-
|
256
259
|
return program.parse(args);
|
257
260
|
}
|
258
261
|
};
|
package/lib/cypress.js
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
|
1
|
+
"use strict";
|
2
2
|
|
3
3
|
// https://github.com/cypress-io/cypress/issues/316
|
4
|
-
|
5
4
|
var Promise = require('bluebird');
|
5
|
+
|
6
6
|
var tmp = Promise.promisifyAll(require('tmp'));
|
7
7
|
|
8
8
|
var fs = require('./fs');
|
9
|
+
|
9
10
|
var _open = require('./exec/open');
|
11
|
+
|
10
12
|
var _run = require('./exec/run');
|
13
|
+
|
11
14
|
var util = require('./util');
|
12
15
|
|
13
16
|
var cypressModuleApi = {
|
14
17
|
open: function open() {
|
15
18
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
16
|
-
|
17
19
|
options = util.normalizeModuleOptions(options);
|
18
|
-
|
19
20
|
return _open.start(options);
|
20
21
|
},
|
21
22
|
run: function run() {
|
22
23
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
23
|
-
|
24
24
|
options = util.normalizeModuleOptions(options);
|
25
|
-
|
26
25
|
return tmp.fileAsync().then(function (outputPath) {
|
27
26
|
options.outputPath = outputPath;
|
28
|
-
|
29
27
|
return _run.start(options).then(function (failedTests) {
|
30
|
-
return fs.readJsonAsync(outputPath, {
|
28
|
+
return fs.readJsonAsync(outputPath, {
|
29
|
+
"throws": false
|
30
|
+
}).then(function (output) {
|
31
31
|
if (!output) {
|
32
32
|
return {
|
33
33
|
failures: failedTests,
|
@@ -41,5 +41,4 @@ var cypressModuleApi = {
|
|
41
41
|
});
|
42
42
|
}
|
43
43
|
};
|
44
|
-
|
45
44
|
module.exports = cypressModuleApi;
|