|
@@ -1,9 +1,5 @@
|
|
|
'use strict';
|
|
|
|
|
|
-var _templateObject = _taggedTemplateLiteral(['\n ', ' Warning: It looks like you\'re passing --spec a space-separated list of files:\n\n "', '"\n\n This will work, but it\'s not recommended.\n\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\n If you are trying to pass multiple spec filenames, separate them by commas instead:\n cypress run --spec spec1,spec2,spec3\n '], ['\n ', ' Warning: It looks like you\'re passing --spec a space-separated list of files:\n\n "', '"\n\n This will work, but it\'s not recommended.\n\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\n If you are trying to pass multiple spec filenames, separate them by commas instead:\n cypress run --spec spec1,spec2,spec3\n ']);
|
|
|
-
|
|
|
-function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
|
-
|
|
|
var _ = require('lodash');
|
|
|
var commander = require('commander');
|
|
|
|
|
@@ -11,7 +7,7 @@ var _require = require('common-tags'),
|
|
|
stripIndent = _require.stripIndent;
|
|
|
|
|
|
var logSymbols = require('log-symbols');
|
|
|
-var debug = require('debug')('cypress:cli');
|
|
|
+var debug = require('debug')('cypress:cli:cli');
|
|
|
var util = require('./util');
|
|
|
var logger = require('./logger');
|
|
|
var errors = require('./errors');
|
|
@@ -36,67 +32,83 @@ var coerceFalse = function coerceFalse(arg) {
|
|
|
return arg !== 'false';
|
|
|
};
|
|
|
|
|
|
-var spaceDelimitedSpecsMsg = function spaceDelimitedSpecsMsg(files) {
|
|
|
- logger.log();
|
|
|
- logger.warn(stripIndent(_templateObject, logSymbols.warning, files.join(' ')));
|
|
|
+var spaceDelimitedArgsMsg = function spaceDelimitedArgsMsg(flag, args) {
|
|
|
+ var msg = '\n ' + logSymbols.warning + ' Warning: It looks like you\'re passing --' + flag + ' a space-separated list of arguments:\n\n "' + 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 --' + flag + ' arg1,arg2,arg3\n ';
|
|
|
+
|
|
|
+ if (flag === 'spec') {
|
|
|
+ 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 ';
|
|
|
+ }
|
|
|
|
|
|
logger.log();
|
|
|
+ logger.warn(stripIndent(msg));
|
|
|
+ logger.log();
|
|
|
};
|
|
|
|
|
|
var parseVariableOpts = function parseVariableOpts(fnArgs, args) {
|
|
|
var opts = fnArgs.pop();
|
|
|
|
|
|
- if (fnArgs.length && opts.spec) {
|
|
|
- // this will capture space-delimited specs after --spec spec1 but before the next option
|
|
|
+ if (fnArgs.length && (opts.spec || opts.tag)) {
|
|
|
+ // this will capture space-delimited args after
|
|
|
+ // flags that could have possible multiple args
|
|
|
+ // but before the next option
|
|
|
+ // --spec spec1 spec2 or --tag foo bar
|
|
|
|
|
|
- var argIndex = _.indexOf(args, '--spec') + 2;
|
|
|
- var nextOptOffset = _.findIndex(_.slice(args, argIndex), function (arg) {
|
|
|
- return _.startsWith(arg, '--');
|
|
|
- });
|
|
|
- var endIndex = nextOptOffset !== -1 ? argIndex + nextOptOffset : args.length;
|
|
|
+ var multiArgFlags = _.compact([opts.spec ? 'spec' : opts.spec, opts.tag ? 'tag' : opts.tag]);
|
|
|
|
|
|
- var maybeSpecs = _.slice(args, argIndex, endIndex);
|
|
|
- var extraSpecs = _.intersection(maybeSpecs, fnArgs);
|
|
|
+ _.forEach(multiArgFlags, function (flag) {
|
|
|
+ var argIndex = _.indexOf(args, '--' + flag) + 2;
|
|
|
+ var nextOptOffset = _.findIndex(_.slice(args, argIndex), function (arg) {
|
|
|
+ return _.startsWith(arg, '--');
|
|
|
+ });
|
|
|
+ var endIndex = nextOptOffset !== -1 ? argIndex + nextOptOffset : args.length;
|
|
|
|
|
|
- if (extraSpecs.length) {
|
|
|
- opts.spec = [opts.spec].concat(extraSpecs);
|
|
|
- spaceDelimitedSpecsMsg(opts.spec);
|
|
|
- opts.spec = opts.spec.join(',');
|
|
|
- }
|
|
|
+ var maybeArgs = _.slice(args, argIndex, endIndex);
|
|
|
+ var extraArgs = _.intersection(maybeArgs, fnArgs);
|
|
|
+
|
|
|
+ if (extraArgs.length) {
|
|
|
+ opts[flag] = [opts[flag]].concat(extraArgs);
|
|
|
+ spaceDelimitedArgsMsg(flag, opts[flag]);
|
|
|
+ opts[flag] = opts[flag].join(',');
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
+ debug('variable-length opts parsed %o', { args: args, opts: opts });
|
|
|
+
|
|
|
return util.parseOpts(opts);
|
|
|
};
|
|
|
|
|
|
var descriptions = {
|
|
|
- record: 'records the run. sends test results, screenshots and videos to your Cypress Dashboard.',
|
|
|
- key: 'your secret Record Key. you can omit this if you set a CYPRESS_RECORD_KEY environment variable.',
|
|
|
- spec: 'runs a specific spec file. defaults to "all"',
|
|
|
- reporter: 'runs a specific mocha reporter. pass a path to use a custom reporter. defaults to "spec"',
|
|
|
- reporterOptions: 'options for the mocha reporter. defaults to "null"',
|
|
|
- port: 'runs Cypress on a specific port. overrides any value in the configuration file.',
|
|
|
- env: 'sets environment variables. separate multiple values with a comma. overrides any value in the configuration file or cypress.env.json',
|
|
|
- config: 'sets configuration values. separate multiple values with a comma. overrides any value in the configuration file.',
|
|
|
- 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.',
|
|
|
browserOpenMode: 'path to a custom browser to be added to the list of available browsers in Cypress',
|
|
|
- detached: 'runs Cypress application in detached mode',
|
|
|
- project: 'path to the project',
|
|
|
- global: 'force Cypress into global mode as if its globally installed',
|
|
|
+ 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.',
|
|
|
+ cacheClear: 'delete all cached binaries',
|
|
|
+ cacheList: 'list cached binary versions',
|
|
|
+ cachePath: 'print the path to the binary cache',
|
|
|
+ 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',
|
|
|
+ config: 'sets configuration values. separate multiple values with a comma. overrides any value in cypress.json.',
|
|
|
configFile: 'path to JSON file where configuration values are set. defaults to "cypress.json". pass "false" to disable.',
|
|
|
- version: 'prints Cypress version',
|
|
|
- headed: 'displays the Electron browser instead of running headlessly',
|
|
|
+ detached: 'runs Cypress application in detached mode',
|
|
|
dev: 'runs cypress in development and bypasses binary check',
|
|
|
- forceInstall: 'force install the Cypress binary',
|
|
|
+ env: 'sets environment variables. separate multiple values with a comma. overrides any value in cypress.json or cypress.env.json',
|
|
|
exit: 'keep the browser open after tests finish',
|
|
|
- cachePath: 'print the path to the binary cache',
|
|
|
- cacheList: 'list cached binary versions',
|
|
|
- cacheClear: 'delete all cached binaries',
|
|
|
- group: 'a named group for recorded runs in the Cypress dashboard',
|
|
|
+ forceInstall: 'force install the Cypress binary',
|
|
|
+ global: 'force Cypress into global mode as if its globally installed',
|
|
|
+ group: 'a named group for recorded runs in the Cypress Dashboard',
|
|
|
+ headed: 'displays the browser instead of running headlessly (defaults to true for Chrome-family browsers)',
|
|
|
+ headless: 'hide the browser instead of running headed (defaults to true for Electron)',
|
|
|
+ key: 'your secret Record Key. you can omit this if you set a CYPRESS_RECORD_KEY environment variable.',
|
|
|
parallel: 'enables concurrent runs and automatic load balancing of specs across multiple machines or processes',
|
|
|
- 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'
|
|
|
+ port: 'runs Cypress on a specific port. overrides any value in cypress.json.',
|
|
|
+ project: 'path to the project',
|
|
|
+ record: 'records the run. sends test results, screenshots and videos to your Cypress Dashboard.',
|
|
|
+ reporter: 'runs a specific mocha reporter. pass a path to use a custom reporter. defaults to "spec"',
|
|
|
+ reporterOptions: 'options for the mocha reporter. defaults to "null"',
|
|
|
+ spec: 'runs specific spec file(s). defaults to "all"',
|
|
|
+ tag: 'named tag(s) for recorded runs in the Cypress Dashboard',
|
|
|
+ version: 'prints Cypress version'
|
|
|
};
|
|
|
|
|
|
-var knownCommands = ['version', 'run', 'open', 'install', 'verify', '-v', '--version', 'help', '-h', '--help', 'cache'];
|
|
|
+var knownCommands = ['cache', 'help', '-h', '--help', 'install', 'open', 'run', 'verify', '-v', '--version', 'version'];
|
|
|
|
|
|
var text = function text(description) {
|
|
|
if (!descriptions[description]) {
|
|
@@ -136,7 +148,7 @@ module.exports = {
|
|
|
|
|
|
var program = new commander.Command();
|
|
|
|
|
|
- // bug in commaner not printing name
|
|
|
+ // bug in commander not printing name
|
|
|
// in usage help docs
|
|
|
program._name = 'cypress';
|
|
|
|
|
@@ -148,16 +160,16 @@ module.exports = {
|
|
|
|
|
|
program.option('-v, --version', text('version')).command('version').description(text('version')).action(showVersions);
|
|
|
|
|
|
- program.command('run').usage('[options]').description('Runs Cypress tests from the CLI without the GUI').option('--record [bool]', text('record'), coerceFalse).option('--headed', text('headed')).option('-k, --key <record-key>', text('key')).option('-s, --spec <spec>', text('spec')).option('-r, --reporter <reporter>', text('reporter')).option('-o, --reporter-options <reporter-options>', text('reporterOptions')).option('-p, --port <port>', text('port')).option('-e, --env <env>', text('env')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('-b, --browser <browser-name-or-path>', text('browserRunMode')).option('-P, --project <project-path>', text('project')).option('--parallel', text('parallel')).option('--group <name>', text('group')).option('--ci-build-id <id>', text('ciBuildId')).option('--no-exit', text('exit')).option('--dev', text('dev'), coerceFalse).action(function () {
|
|
|
+ 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 () {
|
|
|
for (var _len = arguments.length, fnArgs = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
fnArgs[_key] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
- debug('running Cypress');
|
|
|
+ debug('running Cypress with args %o', fnArgs);
|
|
|
require('./exec/run').start(parseVariableOpts(fnArgs, args)).then(util.exit).catch(util.logErrorExit1);
|
|
|
});
|
|
|
|
|
|
- program.command('open').usage('[options]').description('Opens Cypress in the interactive GUI.').option('-p, --port <port>', text('port')).option('-e, --env <env>', text('env')).option('-c, --config <config>', text('config')).option('-C, --config-file <config-file>', text('configFile')).option('-d, --detached [bool]', text('detached'), coerceFalse).option('-b, --browser <browser-path>', text('browserOpenMode')).option('-P, --project <project-path>', text('project')).option('--global', text('global')).option('--dev', text('dev'), coerceFalse).action(function (opts) {
|
|
|
+ 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) {
|
|
|
debug('opening Cypress');
|
|
|
require('./exec/open').start(util.parseOpts(opts)).catch(util.logErrorExit1);
|
|
|
});
|