cypress 3.0.3 → 3.1.3
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 +15 -4
- package/lib/cypress.js +2 -0
- package/lib/errors.js +8 -6
- package/lib/exec/run.js +12 -0
- package/lib/exec/spawn.js +7 -2
- package/lib/exec/versions.js +3 -0
- package/lib/exec/xvfb.js +3 -0
- package/lib/logger.js +3 -0
- package/lib/tasks/cache.js +1 -0
- package/lib/tasks/download.js +23 -2
- package/lib/tasks/install.js +18 -0
- package/lib/tasks/state.js +12 -0
- package/lib/tasks/unzip.js +10 -9
- package/lib/tasks/verify.js +18 -2
- package/lib/util.js +11 -2
- package/package.json +3 -3
- package/types/index.d.ts +36 -4
- package/types/moment.d.ts +11 -0
package/lib/cli.js
CHANGED
@@ -21,6 +21,7 @@ function unknownOption(flag) {
|
|
21
21
|
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'option';
|
22
22
|
|
23
23
|
if (this._allowUnknownOption) return;
|
24
|
+
|
24
25
|
logger.error();
|
25
26
|
logger.error(' error: unknown ' + type + ':', flag);
|
26
27
|
logger.error();
|
@@ -35,7 +36,7 @@ var coerceFalse = function coerceFalse(arg) {
|
|
35
36
|
};
|
36
37
|
|
37
38
|
var parseOpts = function parseOpts(opts) {
|
38
|
-
opts = _.pick(opts, 'project', 'spec', 'reporter', 'reporterOptions', 'path', 'destination', 'port', 'env', 'cypressVersion', 'config', 'record', 'key', 'browser', 'detached', 'headed', 'global', 'dev', 'force', 'exit', 'cachePath', 'cacheList', 'cacheClear');
|
39
|
+
opts = _.pick(opts, 'project', 'spec', 'reporter', 'reporterOptions', 'path', 'destination', 'port', 'env', 'cypressVersion', 'config', 'record', 'key', 'browser', 'detached', 'headed', 'global', 'dev', 'force', 'exit', 'cachePath', 'cacheList', 'cacheClear', 'parallel', 'group', 'ciBuildId');
|
39
40
|
|
40
41
|
if (opts.exit) {
|
41
42
|
opts = _.omit(opts, 'exit');
|
@@ -59,14 +60,17 @@ var descriptions = {
|
|
59
60
|
detached: 'runs Cypress application in detached mode',
|
60
61
|
project: 'path to the project',
|
61
62
|
global: 'force Cypress into global mode as if its globally installed',
|
62
|
-
version: '
|
63
|
+
version: 'prints Cypress version',
|
63
64
|
headed: 'displays the Electron browser instead of running headlessly',
|
64
65
|
dev: 'runs cypress in development and bypasses binary check',
|
65
66
|
forceInstall: 'force install the Cypress binary',
|
66
67
|
exit: 'keep the browser open after tests finish',
|
67
68
|
cachePath: 'print the cypress binary cache path',
|
68
69
|
cacheList: 'list the currently cached versions',
|
69
|
-
cacheClear: 'delete the Cypress binary cache'
|
70
|
+
cacheClear: 'delete the Cypress binary cache',
|
71
|
+
group: 'a named group for recorded runs in the Cypress dashboard',
|
72
|
+
parallel: 'enables concurrent runs and automatic load balancing of specs across multiple machines or processes',
|
73
|
+
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'
|
70
74
|
};
|
71
75
|
|
72
76
|
var knownCommands = ['version', 'run', 'open', 'install', 'verify', '-v', '--version', 'help', '-h', '--help', 'cache'];
|
@@ -85,6 +89,7 @@ function includesVersion(args) {
|
|
85
89
|
|
86
90
|
function showVersions() {
|
87
91
|
debug('printing Cypress version');
|
92
|
+
|
88
93
|
return require('./exec/versions').getVersions().then(function () {
|
89
94
|
var versions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
90
95
|
|
@@ -112,7 +117,7 @@ module.exports = {
|
|
112
117
|
|
113
118
|
program.option('-v, --version', text('version')).command('version').description(text('version')).action(showVersions);
|
114
119
|
|
115
|
-
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('-b, --browser <browser-name>', text('browser')).option('-P, --project <project-path>', text('project')).option('--no-exit', text('exit')).option('--dev', text('dev'), coerceFalse).action(function (opts) {
|
120
|
+
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('-b, --browser <browser-name>', text('browser')).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 (opts) {
|
116
121
|
debug('running Cypress');
|
117
122
|
require('./exec/run').start(parseOpts(opts)).then(util.exit).catch(util.logErrorExit1);
|
118
123
|
});
|
@@ -130,6 +135,7 @@ module.exports = {
|
|
130
135
|
var defaultOpts = { force: true, welcomeMessage: false };
|
131
136
|
var parsedOpts = parseOpts(opts);
|
132
137
|
var options = _.extend(parsedOpts, defaultOpts);
|
138
|
+
|
133
139
|
require('./tasks/verify').start(options).catch(util.logErrorExit1);
|
134
140
|
});
|
135
141
|
|
@@ -137,6 +143,7 @@ module.exports = {
|
|
137
143
|
if (opts.command || !_.includes(['list', 'path', 'clear'], opts)) {
|
138
144
|
unknownOption.call(this, 'cache ' + opts, 'sub-command');
|
139
145
|
}
|
146
|
+
|
140
147
|
cache[opts]();
|
141
148
|
});
|
142
149
|
|
@@ -153,10 +160,12 @@ module.exports = {
|
|
153
160
|
// Deprecated Catches
|
154
161
|
|
155
162
|
var firstCommand = args[2];
|
163
|
+
|
156
164
|
if (!_.includes(knownCommands, firstCommand)) {
|
157
165
|
debug('unknown command %s', firstCommand);
|
158
166
|
logger.error('Unknown command', '"' + firstCommand + '"');
|
159
167
|
program.outputHelp();
|
168
|
+
|
160
169
|
return util.exit(1);
|
161
170
|
}
|
162
171
|
|
@@ -167,7 +176,9 @@ module.exports = {
|
|
167
176
|
// so we have to manually catch '-v, --version'
|
168
177
|
return showVersions();
|
169
178
|
}
|
179
|
+
|
170
180
|
debug('program parsing arguments');
|
181
|
+
|
171
182
|
return program.parse(args);
|
172
183
|
}
|
173
184
|
};
|
package/lib/cypress.js
CHANGED
@@ -15,6 +15,7 @@ var cypressModuleApi = {
|
|
15
15
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
16
16
|
|
17
17
|
options = util.normalizeModuleOptions(options);
|
18
|
+
|
18
19
|
return _open.start(options);
|
19
20
|
},
|
20
21
|
run: function run() {
|
@@ -33,6 +34,7 @@ var cypressModuleApi = {
|
|
33
34
|
message: 'Could not find Cypress test run results'
|
34
35
|
};
|
35
36
|
}
|
37
|
+
|
36
38
|
return output;
|
37
39
|
});
|
38
40
|
});
|
package/lib/errors.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
var _templateObject = _taggedTemplateLiteral(['\n Search for an existing issue or open a GitHub issue at\n\n ', '\n '], ['\n Search for an existing issue or open a GitHub issue at\n\n ', '\n ']),
|
4
4
|
_templateObject2 = _taggedTemplateLiteral(['\n \nPlease reinstall Cypress by running: ', '\n '], ['\n \\nPlease reinstall Cypress by running: ', '\n ']),
|
5
5
|
_templateObject3 = _taggedTemplateLiteral(['\n\n Reasons this may happen:\n \n - node was installed as \'root\' or with \'sudo\'\n - the cypress npm package as \'root\' or with \'sudo\'\n \n Please check that you have the appropriate user permissions.\n '], ['\\n\n Reasons this may happen:\n \n - node was installed as \'root\' or with \'sudo\'\n - the cypress npm package as \'root\' or with \'sudo\'\n \n Please check that you have the appropriate user permissions.\n ']),
|
6
|
-
_templateObject4 = _taggedTemplateLiteral(['\n\n We expected the binary to be installed here: ', '\n \n Reasons it may be missing:\n\n - You\'re caching \'node_modules\' but are not caching this path: ', '\n - You ran \'npm install\' at an earlier build step but did not persist: ', '\n\n Properly caching the binary will fix this error and avoid downloading and unzipping Cypress.\n\n Alternatively, you can run \'cypress install\' to download the binary again.\n\n
|
6
|
+
_templateObject4 = _taggedTemplateLiteral(['\n\n We expected the binary to be installed here: ', '\n \n Reasons it may be missing:\n\n - You\'re caching \'node_modules\' but are not caching this path: ', '\n - You ran \'npm install\' at an earlier build step but did not persist: ', '\n\n Properly caching the binary will fix this error and avoid downloading and unzipping Cypress.\n\n Alternatively, you can run \'cypress install\' to download the binary again.\n\n ', '\n '], ['\\n\n We expected the binary to be installed here: ', '\n \n Reasons it may be missing:\n\n - You\'re caching \'node_modules\' but are not caching this path: ', '\n - You ran \'npm install\' at an earlier build step but did not persist: ', '\n\n Properly caching the binary will fix this error and avoid downloading and unzipping Cypress.\n\n Alternatively, you can run \'cypress install\' to download the binary again.\n\n ', '\n ']),
|
7
7
|
_templateObject5 = _taggedTemplateLiteral(['\n There was a problem spawning Xvfb.\n\n This is likely a problem with your system, permissions, or installation of Xvfb.\n '], ['\n There was a problem spawning Xvfb.\n\n This is likely a problem with your system, permissions, or installation of Xvfb.\n ']),
|
8
8
|
_templateObject6 = _taggedTemplateLiteral(['\n Install XVFB and run Cypress again.\n\n Read our documentation on dependencies for more information:\n\n ', '\n\n If you are using Docker, we provide containers with all required dependencies installed.\n '], ['\n Install XVFB and run Cypress again.\n\n Read our documentation on dependencies for more information:\n\n ', '\n\n If you are using Docker, we provide containers with all required dependencies installed.\n ']),
|
9
9
|
_templateObject7 = _taggedTemplateLiteral(['\n This is usually caused by a missing library or dependency.\n\n The error below should indicate which dependency is missing.\n\n ', '\n\n If you are using Docker, we provide containers with all required dependencies installed.\n '], ['\n This is usually caused by a missing library or dependency.\n\n The error below should indicate which dependency is missing.\n\n ', '\n\n If you are using Docker, we provide containers with all required dependencies installed.\n ']),
|
@@ -42,7 +42,7 @@ var failedDownload = {
|
|
42
42
|
|
43
43
|
var failedUnzip = {
|
44
44
|
description: 'The Cypress App could not be unzipped.',
|
45
|
-
solution: stripIndent(_templateObject, issuesUrl)
|
45
|
+
solution: stripIndent(_templateObject, chalk.blue(issuesUrl))
|
46
46
|
};
|
47
47
|
|
48
48
|
var missingApp = function missingApp(binaryDir) {
|
@@ -62,7 +62,7 @@ var binaryNotExecutable = function binaryNotExecutable(executable) {
|
|
62
62
|
var notInstalledCI = function notInstalledCI(executable) {
|
63
63
|
return {
|
64
64
|
description: 'The cypress npm package is installed, but the Cypress binary is missing.',
|
65
|
-
solution: stripIndent(_templateObject4, chalk.cyan(executable), util.getCacheDir(), util.getCacheDir())
|
65
|
+
solution: stripIndent(_templateObject4, chalk.cyan(executable), util.getCacheDir(), util.getCacheDir(), chalk.blue('https://on.cypress.io/not-installed-ci-error'))
|
66
66
|
};
|
67
67
|
};
|
68
68
|
|
@@ -73,13 +73,13 @@ var nonZeroExitCodeXvfb = {
|
|
73
73
|
|
74
74
|
var missingXvfb = {
|
75
75
|
description: 'Your system is missing the dependency: XVFB',
|
76
|
-
solution: stripIndent(_templateObject6, requiredDependenciesUrl)
|
76
|
+
solution: stripIndent(_templateObject6, chalk.blue(requiredDependenciesUrl))
|
77
77
|
};
|
78
78
|
|
79
79
|
var missingDependency = {
|
80
80
|
description: 'Cypress failed to start.',
|
81
81
|
// this message is too Linux specific
|
82
|
-
solution: stripIndent(_templateObject7, requiredDependenciesUrl)
|
82
|
+
solution: stripIndent(_templateObject7, chalk.blue(requiredDependenciesUrl))
|
83
83
|
};
|
84
84
|
|
85
85
|
var invalidCacheDirectory = {
|
@@ -94,7 +94,7 @@ var versionMismatch = {
|
|
94
94
|
|
95
95
|
var unexpected = {
|
96
96
|
description: 'An unexpected error occurred while verifying the Cypress executable.',
|
97
|
-
solution: stripIndent(_templateObject8, docsUrl, issuesUrl)
|
97
|
+
solution: stripIndent(_templateObject8, chalk.blue(docsUrl), chalk.blue(issuesUrl))
|
98
98
|
};
|
99
99
|
|
100
100
|
var removed = {
|
@@ -111,6 +111,7 @@ var removed = {
|
|
111
111
|
var CYPRESS_RUN_BINARY = {
|
112
112
|
notValid: function notValid(value) {
|
113
113
|
var properFormat = '**/' + state.getPlatformExecutable();
|
114
|
+
|
114
115
|
return {
|
115
116
|
description: 'Could not run binary set by environment variable CYPRESS_RUN_BINARY=' + value,
|
116
117
|
solution: 'Ensure the environment variable is a path to the Cypress binary, matching ' + properFormat
|
@@ -158,6 +159,7 @@ function formErrorText(info, msg) {
|
|
158
159
|
|
159
160
|
var raise = function raise(text) {
|
160
161
|
var err = new Error(text);
|
162
|
+
|
161
163
|
err.known = true;
|
162
164
|
throw err;
|
163
165
|
};
|
package/lib/exec/run.js
CHANGED
@@ -68,6 +68,18 @@ var processRunOptions = function processRunOptions() {
|
|
68
68
|
args.push('--record', options.record);
|
69
69
|
}
|
70
70
|
|
71
|
+
if (options.parallel) {
|
72
|
+
args.push('--parallel');
|
73
|
+
}
|
74
|
+
|
75
|
+
if (options.group) {
|
76
|
+
args.push('--group', options.group);
|
77
|
+
}
|
78
|
+
|
79
|
+
if (options.ciBuildId) {
|
80
|
+
args.push('--ci-build-id', options.ciBuildId);
|
81
|
+
}
|
82
|
+
|
71
83
|
if (options.outputPath) {
|
72
84
|
args.push('--output-path', options.outputPath);
|
73
85
|
}
|
package/lib/exec/spawn.js
CHANGED
@@ -80,6 +80,7 @@ module.exports = {
|
|
80
80
|
}
|
81
81
|
|
82
82
|
var overrides = util.getEnvOverrides();
|
83
|
+
var node11WindowsFix = isPlatform('win32');
|
83
84
|
|
84
85
|
debug('spawning Cypress with executable: %s', executable);
|
85
86
|
debug('spawn forcing env overrides %o', overrides);
|
@@ -93,8 +94,12 @@ module.exports = {
|
|
93
94
|
// also figure out whether we should force stdout and stderr into thinking
|
94
95
|
// it is a tty as opposed to a pipe.
|
95
96
|
options.env = _.extend({}, options.env, overrides);
|
97
|
+
if (node11WindowsFix) {
|
98
|
+
options = _.extend({}, options, { windowsHide: false });
|
99
|
+
}
|
96
100
|
|
97
101
|
var child = cp.spawn(executable, args, options);
|
102
|
+
|
98
103
|
child.on('close', resolve);
|
99
104
|
child.on('error', reject);
|
100
105
|
|
@@ -141,8 +146,8 @@ module.exports = {
|
|
141
146
|
|
142
147
|
if (needsXvfb) {
|
143
148
|
return xvfb.start().then(userFriendlySpawn).finally(xvfb.stop);
|
144
|
-
} else {
|
145
|
-
return userFriendlySpawn();
|
146
149
|
}
|
150
|
+
|
151
|
+
return userFriendlySpawn();
|
147
152
|
}
|
148
153
|
};
|
package/lib/exec/versions.js
CHANGED
@@ -16,10 +16,12 @@ var getVersions = function getVersions() {
|
|
16
16
|
|
17
17
|
if (util.getEnv('CYPRESS_RUN_BINARY')) {
|
18
18
|
var envBinaryPath = path.resolve(util.getEnv('CYPRESS_RUN_BINARY'));
|
19
|
+
|
19
20
|
return state.parseRealPlatformBinaryFolderAsync(envBinaryPath).then(function (envBinaryDir) {
|
20
21
|
if (!envBinaryDir) {
|
21
22
|
return throwFormErrorText(errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))();
|
22
23
|
}
|
24
|
+
|
23
25
|
debug('CYPRESS_RUN_BINARY has binaryDir:', envBinaryDir);
|
24
26
|
|
25
27
|
return envBinaryDir;
|
@@ -27,6 +29,7 @@ var getVersions = function getVersions() {
|
|
27
29
|
return throwFormErrorText(errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))(err.message);
|
28
30
|
});
|
29
31
|
}
|
32
|
+
|
30
33
|
return state.getBinaryDir();
|
31
34
|
}).then(state.getBinaryPkgVersionAsync).then(function (binaryVersion) {
|
32
35
|
return {
|
package/lib/exec/xvfb.js
CHANGED
@@ -27,6 +27,7 @@ module.exports = {
|
|
27
27
|
|
28
28
|
start: function start() {
|
29
29
|
debug('Starting XVFB');
|
30
|
+
|
30
31
|
return xvfb.startAsync().catch({ nonZeroExitCode: true }, throwFormErrorText(errors.nonZeroExitCodeXvfb)).catch(function (err) {
|
31
32
|
if (err.known) {
|
32
33
|
throw err;
|
@@ -37,6 +38,7 @@ module.exports = {
|
|
37
38
|
},
|
38
39
|
stop: function stop() {
|
39
40
|
debug('Stopping XVFB');
|
41
|
+
|
40
42
|
return xvfb.stopAsync();
|
41
43
|
},
|
42
44
|
isNeeded: function isNeeded() {
|
@@ -48,6 +50,7 @@ module.exports = {
|
|
48
50
|
verify: function verify() {
|
49
51
|
return xvfb.startAsync().then(R.T).catch(function (err) {
|
50
52
|
debug('Could not verify xvfb: %s', err.message);
|
53
|
+
|
51
54
|
return false;
|
52
55
|
}).finally(xvfb.stopAsync);
|
53
56
|
}
|
package/lib/logger.js
CHANGED
@@ -24,6 +24,7 @@ var warn = function warn() {
|
|
24
24
|
}
|
25
25
|
|
26
26
|
if (logLevel() === 'silent') return;
|
27
|
+
|
27
28
|
logs.push(messages.join(' '));
|
28
29
|
console.log(chalk.yellow.apply(chalk, messages)); // eslint-disable-line no-console
|
29
30
|
};
|
@@ -36,6 +37,7 @@ var log = function log() {
|
|
36
37
|
}
|
37
38
|
|
38
39
|
if (logLevel() === 'silent' || logLevel() === 'warn') return;
|
40
|
+
|
39
41
|
logs.push(messages.join(' '));
|
40
42
|
(_console = console).log.apply(_console, messages); // eslint-disable-line no-console
|
41
43
|
};
|
@@ -44,6 +46,7 @@ var log = function log() {
|
|
44
46
|
// on each one to allow easy unit testing for specific message
|
45
47
|
var logLines = function logLines(text) {
|
46
48
|
var lines = text.split('\n');
|
49
|
+
|
47
50
|
R.forEach(log, lines);
|
48
51
|
};
|
49
52
|
|
package/lib/tasks/cache.js
CHANGED
package/lib/tasks/download.js
CHANGED
@@ -27,20 +27,37 @@ var _require2 = require('../errors'),
|
|
27
27
|
var fs = require('../fs');
|
28
28
|
var util = require('../util');
|
29
29
|
|
30
|
-
var
|
30
|
+
var defaultBaseUrl = 'https://download.cypress.io/';
|
31
|
+
|
32
|
+
var getBaseUrl = function getBaseUrl() {
|
33
|
+
if (util.getEnv('CYPRESS_DOWNLOAD_MIRROR')) {
|
34
|
+
var baseUrl = util.getEnv('CYPRESS_DOWNLOAD_MIRROR');
|
35
|
+
|
36
|
+
if (!baseUrl.endsWith('/')) {
|
37
|
+
baseUrl += '/';
|
38
|
+
}
|
39
|
+
|
40
|
+
return baseUrl;
|
41
|
+
}
|
42
|
+
|
43
|
+
return defaultBaseUrl;
|
44
|
+
};
|
31
45
|
|
32
46
|
var prepend = function prepend(urlPath) {
|
33
|
-
var endpoint = url.resolve(
|
47
|
+
var endpoint = url.resolve(getBaseUrl(), urlPath);
|
34
48
|
var platform = os.platform();
|
35
49
|
var arch = os.arch();
|
50
|
+
|
36
51
|
return endpoint + '?platform=' + platform + '&arch=' + arch;
|
37
52
|
};
|
38
53
|
|
39
54
|
var getUrl = function getUrl(version) {
|
40
55
|
if (is.url(version)) {
|
41
56
|
debug('version is already an url', version);
|
57
|
+
|
42
58
|
return version;
|
43
59
|
}
|
60
|
+
|
44
61
|
return version ? prepend('desktop/' + version) : prepend('desktop');
|
45
62
|
};
|
46
63
|
|
@@ -50,6 +67,7 @@ var statusMessage = function statusMessage(err) {
|
|
50
67
|
|
51
68
|
var prettyDownloadErr = function prettyDownloadErr(err, version) {
|
52
69
|
var msg = stripIndent(_templateObject, getUrl(version), statusMessage(err));
|
70
|
+
|
53
71
|
debug(msg);
|
54
72
|
|
55
73
|
return throwFormErrorText(errors.failedDownload)(msg);
|
@@ -73,6 +91,7 @@ var downloadFromUrl = function downloadFromUrl(_ref) {
|
|
73
91
|
url: url,
|
74
92
|
followRedirect: function followRedirect(response) {
|
75
93
|
var version = response.headers['x-version'];
|
94
|
+
|
76
95
|
debug('redirect version:', version);
|
77
96
|
if (version) {
|
78
97
|
// set the version in options if we have one.
|
@@ -131,6 +150,7 @@ var start = function start(_ref2) {
|
|
131
150
|
if (!downloadDestination) {
|
132
151
|
la(is.unemptyString(downloadDestination), 'missing download dir', _arguments);
|
133
152
|
}
|
153
|
+
|
134
154
|
if (!progress) {
|
135
155
|
progress = { onProgress: function onProgress() {
|
136
156
|
return {};
|
@@ -138,6 +158,7 @@ var start = function start(_ref2) {
|
|
138
158
|
}
|
139
159
|
|
140
160
|
var url = getUrl(version);
|
161
|
+
|
141
162
|
progress.throttle = 100;
|
142
163
|
|
143
164
|
debug('needed Cypress version: %s', version);
|
package/lib/tasks/install.js
CHANGED
@@ -83,6 +83,7 @@ var downloadAndUnzip = function downloadAndUnzip(_ref) {
|
|
83
83
|
|
84
84
|
return download.start({ version: version, downloadDestination: downloadDestination, progress: progress }).then(function (redirectVersion) {
|
85
85
|
if (redirectVersion) version = redirectVersion;
|
86
|
+
|
86
87
|
debug('finished downloading file: ' + downloadDestination);
|
87
88
|
}).then(function () {
|
88
89
|
// save the download destination for unzipping
|
@@ -100,6 +101,7 @@ var downloadAndUnzip = function downloadAndUnzip(_ref) {
|
|
100
101
|
|
101
102
|
var cleanup = function cleanup() {
|
102
103
|
debug('removing zip file %s', downloadDestination);
|
104
|
+
|
103
105
|
return fs.removeAsync(downloadDestination);
|
104
106
|
};
|
105
107
|
|
@@ -136,18 +138,21 @@ var start = function start() {
|
|
136
138
|
|
137
139
|
var pkgVersion = util.pkgVersion();
|
138
140
|
var needVersion = pkgVersion;
|
141
|
+
|
139
142
|
debug('version in package.json is', needVersion);
|
140
143
|
|
141
144
|
// let this environment variable reset the binary version we need
|
142
145
|
if (util.getEnv('CYPRESS_INSTALL_BINARY')) {
|
143
146
|
|
144
147
|
var envVarVersion = util.getEnv('CYPRESS_INSTALL_BINARY');
|
148
|
+
|
145
149
|
debug('using environment variable CYPRESS_INSTALL_BINARY %s', envVarVersion);
|
146
150
|
|
147
151
|
if (envVarVersion === '0') {
|
148
152
|
debug('environment variable CYPRESS_INSTALL_BINARY = 0, skipping install');
|
149
153
|
logger.log(stripIndent(_templateObject3, chalk.yellow('Note:')));
|
150
154
|
logger.log();
|
155
|
+
|
151
156
|
return Promise.resolve();
|
152
157
|
}
|
153
158
|
|
@@ -162,6 +167,7 @@ var start = function start() {
|
|
162
167
|
|
163
168
|
if (util.getEnv('CYPRESS_CACHE_FOLDER')) {
|
164
169
|
var envCache = util.getEnv('CYPRESS_CACHE_FOLDER');
|
170
|
+
|
165
171
|
logger.log(stripIndent(_templateObject4, chalk.yellow('Note:'), chalk.cyan(envCache)));
|
166
172
|
logger.log();
|
167
173
|
}
|
@@ -178,6 +184,7 @@ var start = function start() {
|
|
178
184
|
|
179
185
|
if (!binaryVersion) {
|
180
186
|
debug('no binary installed under cli version');
|
187
|
+
|
181
188
|
return true;
|
182
189
|
}
|
183
190
|
|
@@ -189,12 +196,14 @@ var start = function start() {
|
|
189
196
|
|
190
197
|
if (options.force) {
|
191
198
|
debug('performing force install over existing binary');
|
199
|
+
|
192
200
|
return true;
|
193
201
|
}
|
194
202
|
|
195
203
|
if (binaryVersion === needVersion || !util.isSemver(needVersion)) {
|
196
204
|
// our version matches, tell the user this is a noop
|
197
205
|
alreadyInstalledMsg();
|
206
|
+
|
198
207
|
return false;
|
199
208
|
}
|
200
209
|
|
@@ -203,6 +212,7 @@ var start = function start() {
|
|
203
212
|
// noop if we've been told not to download
|
204
213
|
if (!shouldInstall) {
|
205
214
|
debug('Not downloading or installing binary');
|
215
|
+
|
206
216
|
return;
|
207
217
|
}
|
208
218
|
|
@@ -218,6 +228,7 @@ var start = function start() {
|
|
218
228
|
}
|
219
229
|
|
220
230
|
var possibleFile = util.formAbsolutePath(needVersion);
|
231
|
+
|
221
232
|
debug('checking local file', possibleFile, 'cwd', process.cwd());
|
222
233
|
|
223
234
|
return fs.pathExistsAsync(possibleFile).then(function (exists) {
|
@@ -226,15 +237,18 @@ var start = function start() {
|
|
226
237
|
if (exists && path.extname(possibleFile) === '.zip') {
|
227
238
|
return possibleFile;
|
228
239
|
}
|
240
|
+
|
229
241
|
return false;
|
230
242
|
});
|
231
243
|
}).then(function (pathToLocalFile) {
|
232
244
|
if (pathToLocalFile) {
|
233
245
|
var absolutePath = path.resolve(needVersion);
|
246
|
+
|
234
247
|
debug('found local file at', absolutePath);
|
235
248
|
debug('skipping download');
|
236
249
|
|
237
250
|
var rendererOptions = getRendererOptions();
|
251
|
+
|
238
252
|
return new Listr([unzipTask({
|
239
253
|
progress: {
|
240
254
|
throttle: 100,
|
@@ -254,6 +268,7 @@ var start = function start() {
|
|
254
268
|
debug('preparing to download and unzip version ', needVersion, 'to path', installDir);
|
255
269
|
|
256
270
|
var downloadDir = os.tmpdir();
|
271
|
+
|
257
272
|
return downloadAndUnzip({ version: needVersion, installDir: installDir, downloadDir: downloadDir });
|
258
273
|
})
|
259
274
|
// delay 1 sec for UX, unless we are testing
|
@@ -272,6 +287,7 @@ var unzipTask = function unzipTask(_ref2) {
|
|
272
287
|
installDir = _ref2.installDir,
|
273
288
|
progress = _ref2.progress,
|
274
289
|
rendererOptions = _ref2.rendererOptions;
|
290
|
+
|
275
291
|
return {
|
276
292
|
title: util.titleize('Unzipping Cypress'),
|
277
293
|
task: function task(ctx, _task3) {
|
@@ -302,9 +318,11 @@ var progessify = function progessify(task, title) {
|
|
302
318
|
// the default
|
303
319
|
var getRendererOptions = function getRendererOptions() {
|
304
320
|
var renderer = util.isCi() ? verbose : 'default';
|
321
|
+
|
305
322
|
if (logger.logLevel() === 'silent') {
|
306
323
|
renderer = 'silent';
|
307
324
|
}
|
325
|
+
|
308
326
|
return {
|
309
327
|
renderer: renderer
|
310
328
|
};
|
package/lib/tasks/state.js
CHANGED
@@ -10,6 +10,7 @@ var util = require('../util');
|
|
10
10
|
|
11
11
|
var getPlatformExecutable = function getPlatformExecutable() {
|
12
12
|
var platform = os.platform();
|
13
|
+
|
13
14
|
switch (platform) {
|
14
15
|
case 'darwin':
|
15
16
|
return 'Contents/MacOS/Cypress';
|
@@ -25,6 +26,7 @@ var getPlatformExecutable = function getPlatformExecutable() {
|
|
25
26
|
|
26
27
|
var getPlatFormBinaryFolder = function getPlatFormBinaryFolder() {
|
27
28
|
var platform = os.platform();
|
29
|
+
|
28
30
|
switch (platform) {
|
29
31
|
case 'darwin':
|
30
32
|
return 'Cypress.app';
|
@@ -40,6 +42,7 @@ var getPlatFormBinaryFolder = function getPlatFormBinaryFolder() {
|
|
40
42
|
|
41
43
|
var getBinaryPkgPath = function getBinaryPkgPath(binaryDir) {
|
42
44
|
var platform = os.platform();
|
45
|
+
|
43
46
|
switch (platform) {
|
44
47
|
case 'darwin':
|
45
48
|
return path.join(binaryDir, 'Contents', 'Resources', 'app', 'package.json');
|
@@ -70,11 +73,14 @@ var getVersionDir = function getVersionDir() {
|
|
70
73
|
|
71
74
|
var getCacheDir = function getCacheDir() {
|
72
75
|
var cache_directory = util.getCacheDir();
|
76
|
+
|
73
77
|
if (util.getEnv('CYPRESS_CACHE_FOLDER')) {
|
74
78
|
var envVarCacheDir = util.getEnv('CYPRESS_CACHE_FOLDER');
|
79
|
+
|
75
80
|
debug('using environment variable CYPRESS_CACHE_FOLDER %s', envVarCacheDir);
|
76
81
|
cache_directory = path.resolve(envVarCacheDir);
|
77
82
|
}
|
83
|
+
|
78
84
|
return cache_directory;
|
79
85
|
};
|
80
86
|
|
@@ -84,9 +90,11 @@ var parseRealPlatformBinaryFolderAsync = function parseRealPlatformBinaryFolderA
|
|
84
90
|
if (!realPath.toString().endsWith(getPlatformExecutable())) {
|
85
91
|
return false;
|
86
92
|
}
|
93
|
+
|
87
94
|
if (os.platform() === 'darwin') {
|
88
95
|
return path.resolve(realPath, '..', '..', '..');
|
89
96
|
}
|
97
|
+
|
90
98
|
return path.resolve(realPath, '..');
|
91
99
|
});
|
92
100
|
};
|
@@ -102,6 +110,7 @@ var getBinaryStatePath = function getBinaryStatePath(binaryDir) {
|
|
102
110
|
var getBinaryStateContentsAsync = function getBinaryStateContentsAsync(binaryDir) {
|
103
111
|
return fs.readJsonAsync(getBinaryStatePath(binaryDir)).catch({ code: 'ENOENT' }, SyntaxError, function () {
|
104
112
|
debug('could not read binary_state.json file');
|
113
|
+
|
105
114
|
return {};
|
106
115
|
});
|
107
116
|
};
|
@@ -129,11 +138,14 @@ var getPathToExecutable = function getPathToExecutable(binaryDir) {
|
|
129
138
|
|
130
139
|
var getBinaryPkgVersionAsync = function getBinaryPkgVersionAsync(binaryDir) {
|
131
140
|
var pathToPackageJson = getBinaryPkgPath(binaryDir);
|
141
|
+
|
132
142
|
debug('Reading binary package.json from:', pathToPackageJson);
|
143
|
+
|
133
144
|
return fs.pathExistsAsync(pathToPackageJson).then(function (exists) {
|
134
145
|
if (!exists) {
|
135
146
|
return null;
|
136
147
|
}
|
148
|
+
|
137
149
|
return fs.readJsonAsync(pathToPackageJson).get('version');
|
138
150
|
});
|
139
151
|
};
|
package/lib/tasks/unzip.js
CHANGED
@@ -35,6 +35,7 @@ var unzip = function unzip(_ref) {
|
|
35
35
|
return new Promise(function (resolve, reject) {
|
36
36
|
return yauzl.open(zipFilePath, function (err, zipFile) {
|
37
37
|
if (err) return reject(err);
|
38
|
+
|
38
39
|
// debug('zipfile.paths:', zipFile)
|
39
40
|
// zipFile.on('entry', debug)
|
40
41
|
// debug(zipFile.readEntry())
|
@@ -90,12 +91,9 @@ var unzip = function unzip(_ref) {
|
|
90
91
|
var copyingFileRe = /^copying file/;
|
91
92
|
|
92
93
|
var sp = cp.spawn('ditto', ['-xkV', zipFilePath, installDir]);
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
unzipWithNode()
|
97
|
-
);
|
98
|
-
});
|
94
|
+
|
95
|
+
// f-it just unzip with node
|
96
|
+
sp.on('error', unzipWithNode);
|
99
97
|
|
100
98
|
sp.on('close', function (code) {
|
101
99
|
if (code === 0) {
|
@@ -139,13 +137,16 @@ var start = function start(_ref2) {
|
|
139
137
|
progress = _ref2.progress;
|
140
138
|
|
141
139
|
la(is.unemptyString(installDir), 'missing installDir');
|
142
|
-
if (!progress)
|
143
|
-
|
144
|
-
|
140
|
+
if (!progress) {
|
141
|
+
progress = { onProgress: function onProgress() {
|
142
|
+
return {};
|
143
|
+
} };
|
144
|
+
}
|
145
145
|
|
146
146
|
return fs.pathExists(installDir).then(function (exists) {
|
147
147
|
if (exists) {
|
148
148
|
debug('removing existing unzipped binary', installDir);
|
149
|
+
|
149
150
|
return fs.removeAsync(installDir);
|
150
151
|
}
|
151
152
|
}).then(function () {
|
package/lib/tasks/verify.js
CHANGED
@@ -32,7 +32,9 @@ var state = require('./state');
|
|
32
32
|
|
33
33
|
var checkExecutable = function checkExecutable(binaryDir) {
|
34
34
|
var executable = state.getPathToExecutable(binaryDir);
|
35
|
+
|
35
36
|
debug('checking if executable exists', executable);
|
37
|
+
|
36
38
|
return util.isExecutableAsync(executable).then(function (isExecutable) {
|
37
39
|
debug('Binary is executable? :', isExecutable);
|
38
40
|
if (!isExecutable) {
|
@@ -42,6 +44,7 @@ var checkExecutable = function checkExecutable(binaryDir) {
|
|
42
44
|
if (util.isCi()) {
|
43
45
|
return throwFormErrorText(errors.notInstalledCI(executable))();
|
44
46
|
}
|
47
|
+
|
45
48
|
return throwFormErrorText(errors.missingApp(binaryDir))(stripIndent(_templateObject, chalk.cyan(executable)));
|
46
49
|
});
|
47
50
|
};
|
@@ -49,29 +52,35 @@ var checkExecutable = function checkExecutable(binaryDir) {
|
|
49
52
|
var runSmokeTest = function runSmokeTest(binaryDir) {
|
50
53
|
debug('running smoke test');
|
51
54
|
var cypressExecPath = state.getPathToExecutable(binaryDir);
|
55
|
+
|
52
56
|
debug('using Cypress executable %s', cypressExecPath);
|
53
57
|
|
54
58
|
var onXvfbError = function onXvfbError(err) {
|
55
59
|
debug('caught xvfb error %s', err.message);
|
60
|
+
|
56
61
|
return throwFormErrorText(errors.missingXvfb)('Caught error trying to run XVFB: "' + err.message + '"');
|
57
62
|
};
|
58
63
|
|
59
64
|
var onSmokeTestError = function onSmokeTestError(err) {
|
60
65
|
debug('Smoke test failed:', err);
|
66
|
+
|
61
67
|
return throwFormErrorText(errors.missingDependency)(err.stderr || err.message);
|
62
68
|
};
|
63
69
|
|
64
70
|
var needsXvfb = xvfb.isNeeded();
|
71
|
+
|
65
72
|
debug('needs XVFB?', needsXvfb);
|
66
73
|
|
67
74
|
var spawn = function spawn() {
|
68
75
|
var random = _.random(0, 1000);
|
69
76
|
var args = ['--smoke-test', '--ping=' + random];
|
70
77
|
var smokeTestCommand = cypressExecPath + ' ' + args.join(' ');
|
78
|
+
|
71
79
|
debug('smoke test command:', smokeTestCommand);
|
72
80
|
|
73
81
|
return Promise.resolve(util.exec(cypressExecPath, args)).catch(onSmokeTestError).then(function (result) {
|
74
82
|
var smokeTestReturned = result.stdout;
|
83
|
+
|
75
84
|
debug('smoke test stdout "%s"', smokeTestReturned);
|
76
85
|
|
77
86
|
if (!util.stdoutLineMatches(String(random), smokeTestReturned)) {
|
@@ -85,9 +94,9 @@ var runSmokeTest = function runSmokeTest(binaryDir) {
|
|
85
94
|
return xvfb.start().catch(onXvfbError).then(spawn).finally(function () {
|
86
95
|
return xvfb.stop().catch(onXvfbError);
|
87
96
|
});
|
88
|
-
} else {
|
89
|
-
return spawn();
|
90
97
|
}
|
98
|
+
|
99
|
+
return spawn();
|
91
100
|
};
|
92
101
|
|
93
102
|
function testBinary(version, binaryDir) {
|
@@ -101,6 +110,7 @@ function testBinary(version, binaryDir) {
|
|
101
110
|
// the verbose renderer else use
|
102
111
|
// the default
|
103
112
|
var renderer = util.isCi() ? verbose : 'default';
|
113
|
+
|
104
114
|
if (logger.logLevel() === 'silent') renderer = 'silent';
|
105
115
|
|
106
116
|
var rendererOptions = {
|
@@ -111,11 +121,13 @@ function testBinary(version, binaryDir) {
|
|
111
121
|
title: util.titleize('Verifying Cypress can run', chalk.gray(binaryDir)),
|
112
122
|
task: function task(ctx, _task) {
|
113
123
|
debug('clearing out the verified version');
|
124
|
+
|
114
125
|
return state.clearBinaryStateAsync(binaryDir).then(function () {
|
115
126
|
return Promise.all([runSmokeTest(binaryDir), Promise.resolve().delay(1500)] // good user experience
|
116
127
|
);
|
117
128
|
}).then(function () {
|
118
129
|
debug('write verified: true');
|
130
|
+
|
119
131
|
return state.writeBinaryVerifiedAsync(true, binaryDir);
|
120
132
|
}).then(function () {
|
121
133
|
util.setTaskTitle(_task, util.titleize(chalk.green('Verified Cypress!'), chalk.gray(binaryDir)), rendererOptions.renderer);
|
@@ -134,6 +146,7 @@ var maybeVerify = function maybeVerify(installedVersion, binaryDir) {
|
|
134
146
|
debug('is Verified ?', isVerified);
|
135
147
|
|
136
148
|
var shouldVerify = !isVerified;
|
149
|
+
|
137
150
|
// force verify if options.force
|
138
151
|
if (options.force) {
|
139
152
|
debug('force verify');
|
@@ -166,6 +179,7 @@ var start = function start() {
|
|
166
179
|
|
167
180
|
var parseBinaryEnvVar = function parseBinaryEnvVar() {
|
168
181
|
var envBinaryPath = util.getEnv('CYPRESS_RUN_BINARY');
|
182
|
+
|
169
183
|
debug('CYPRESS_RUN_BINARY exists, =', envBinaryPath);
|
170
184
|
logger.log(stripIndent(_templateObject4, chalk.yellow('Note:'), chalk.white('CYPRESS_RUN_BINARY='), chalk.cyan(envBinaryPath)));
|
171
185
|
logger.log();
|
@@ -181,6 +195,7 @@ var start = function start() {
|
|
181
195
|
if (!envBinaryDir) {
|
182
196
|
return throwFormErrorText(errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))();
|
183
197
|
}
|
198
|
+
|
184
199
|
debug('CYPRESS_RUN_BINARY has binaryDir:', envBinaryDir);
|
185
200
|
|
186
201
|
binaryDir = envBinaryDir;
|
@@ -204,6 +219,7 @@ var start = function start() {
|
|
204
219
|
|
205
220
|
if (!binaryVersion) {
|
206
221
|
debug('no Cypress binary found for cli version ', packageVersion);
|
222
|
+
|
207
223
|
return throwFormErrorText(errors.missingApp(binaryDir))('\n Cannot read binary version from: ' + chalk.cyan(state.getBinaryPkgPath(binaryDir)) + '\n ');
|
208
224
|
}
|
209
225
|
|
package/lib/util.js
CHANGED
@@ -35,6 +35,7 @@ function normalizeModuleOptions() {
|
|
35
35
|
function stdoutLineMatches(expectedLine, stdout) {
|
36
36
|
var lines = stdout.split('\n').map(R.trim);
|
37
37
|
var lineMatches = R.equals(expectedLine);
|
38
|
+
|
38
39
|
return lines.some(lineMatches);
|
39
40
|
}
|
40
41
|
|
@@ -175,9 +176,9 @@ var util = {
|
|
175
176
|
}).catch(function () {
|
176
177
|
return os.release();
|
177
178
|
});
|
178
|
-
} else {
|
179
|
-
return os.release();
|
180
179
|
}
|
180
|
+
|
181
|
+
return os.release();
|
181
182
|
});
|
182
183
|
},
|
183
184
|
|
@@ -190,24 +191,32 @@ var util = {
|
|
190
191
|
if (path.isAbsolute(filename)) {
|
191
192
|
return filename;
|
192
193
|
}
|
194
|
+
|
193
195
|
return path.join(process.cwd(), '..', '..', filename);
|
194
196
|
},
|
195
197
|
getEnv: function getEnv(varName) {
|
196
198
|
var envVar = process.env[varName];
|
197
199
|
var configVar = process.env['npm_config_' + varName];
|
198
200
|
var packageConfigVar = process.env['npm_package_config_' + varName];
|
201
|
+
|
199
202
|
if (envVar) {
|
200
203
|
debug('Using ' + varName + ' from environment variable');
|
204
|
+
|
201
205
|
return envVar;
|
202
206
|
}
|
207
|
+
|
203
208
|
if (configVar) {
|
204
209
|
debug('Using ' + varName + ' from npm config');
|
210
|
+
|
205
211
|
return configVar;
|
206
212
|
}
|
213
|
+
|
207
214
|
if (packageConfigVar) {
|
208
215
|
debug('Using ' + varName + ' from package.json config');
|
216
|
+
|
209
217
|
return packageConfigVar;
|
210
218
|
}
|
219
|
+
|
211
220
|
return undefined;
|
212
221
|
},
|
213
222
|
getCacheDir: function getCacheDir() {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "cypress",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.1.3",
|
4
4
|
"main": "index.js",
|
5
5
|
"bin": {
|
6
6
|
"cypress": "bin/cypress"
|
@@ -26,7 +26,7 @@
|
|
26
26
|
"@types/bluebird": "3.5.18",
|
27
27
|
"@types/chai": "4.0.8",
|
28
28
|
"@types/chai-jquery": "1.1.35",
|
29
|
-
"@types/jquery": "3.
|
29
|
+
"@types/jquery": "3.3.6",
|
30
30
|
"@types/lodash": "4.14.87",
|
31
31
|
"@types/minimatch": "3.0.3",
|
32
32
|
"@types/mocha": "2.2.44",
|
@@ -52,7 +52,7 @@
|
|
52
52
|
"lodash": "4.17.10",
|
53
53
|
"log-symbols": "2.2.0",
|
54
54
|
"minimist": "1.2.0",
|
55
|
-
"
|
55
|
+
"moment": "2.22.2",
|
56
56
|
"ramda": "0.24.1",
|
57
57
|
"request": "2.87.0",
|
58
58
|
"request-progress": "0.3.1",
|
package/types/index.d.ts
CHANGED
@@ -10,12 +10,14 @@
|
|
10
10
|
/// <reference path="./blob-util.d.ts" />
|
11
11
|
/// <reference path="./bluebird.d.ts" />
|
12
12
|
/// <reference path="./minimatch.d.ts" />
|
13
|
+
/// <reference path="./moment.d.ts" />
|
13
14
|
|
14
15
|
/// <reference types="chai" />
|
15
16
|
/// <reference types="chai-jquery" />
|
16
17
|
/// <reference types="jquery" />
|
17
18
|
/// <reference types="lodash" />
|
18
19
|
/// <reference types="mocha" />
|
20
|
+
/// <reference types="moment" />
|
19
21
|
/// <reference types="sinon" />
|
20
22
|
/// <reference types="sinon-chai" />
|
21
23
|
|
@@ -100,7 +102,7 @@ declare namespace Cypress {
|
|
100
102
|
* @example
|
101
103
|
* const todaysDate = Cypress.moment().format("MMM DD, YYYY")
|
102
104
|
*/
|
103
|
-
moment:
|
105
|
+
moment: Moment.MomentStatic
|
104
106
|
/**
|
105
107
|
* Cypress automatically includes Bluebird and exposes it as Cypress.Promise.
|
106
108
|
*
|
@@ -1104,7 +1106,7 @@ declare namespace Cypress {
|
|
1104
1106
|
* cy.screenshot()
|
1105
1107
|
* cy.get(".post").screenshot()
|
1106
1108
|
*/
|
1107
|
-
screenshot(options?: Partial<Loggable & Timeoutable>): Chainable<null>
|
1109
|
+
screenshot(options?: Partial<Loggable & Timeoutable & ScreenshotOptions>): Chainable<null>
|
1108
1110
|
/**
|
1109
1111
|
* Take a screenshot of the application under test and the Cypress Command Log and save under given filename.
|
1110
1112
|
*
|
@@ -1512,13 +1514,13 @@ declare namespace Cypress {
|
|
1512
1514
|
*
|
1513
1515
|
* @see https://on.cypress.io/wait
|
1514
1516
|
*/
|
1515
|
-
wait(alias: string, options?: Partial<Loggable & Timeoutable>): Chainable<WaitXHR>
|
1517
|
+
wait(alias: string, options?: Partial<Loggable & Timeoutable & TimeoutableXHR>): Chainable<WaitXHR>
|
1516
1518
|
/**
|
1517
1519
|
* Wait for list of XHR requests to complete.
|
1518
1520
|
*
|
1519
1521
|
* @see https://on.cypress.io/wait
|
1520
1522
|
*/
|
1521
|
-
wait(alias: string[], options?: Partial<Loggable & Timeoutable>): Chainable<WaitXHR[]>
|
1523
|
+
wait(alias: string[], options?: Partial<Loggable & Timeoutable & TimeoutableXHR>): Chainable<WaitXHR[]>
|
1522
1524
|
|
1523
1525
|
/**
|
1524
1526
|
* Get the window object of the page that is currently active.
|
@@ -1566,6 +1568,16 @@ declare namespace Cypress {
|
|
1566
1568
|
* })
|
1567
1569
|
*/
|
1568
1570
|
wrap<E extends Node = HTMLElement>(element: E | JQuery<E>, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
|
1571
|
+
/**
|
1572
|
+
* Yield the element passed into `.wrap()` to the next command in the Cypress chain.
|
1573
|
+
*
|
1574
|
+
* @see https://on.cypress.io/wrap
|
1575
|
+
* @example
|
1576
|
+
* cy.wrap(new Promise((resolve, reject) => {
|
1577
|
+
* setTimeout(resolve, 1000);
|
1578
|
+
* }).then(result => {})
|
1579
|
+
*/
|
1580
|
+
wrap<F extends Promise<S>, S>(promise: F, options?: Partial<Loggable & Timeoutable>): Chainable<S>
|
1569
1581
|
/**
|
1570
1582
|
* Yields whatever is passed into `.wrap()` to the next command in the Cypress chain.
|
1571
1583
|
*
|
@@ -1645,6 +1657,26 @@ declare namespace Cypress {
|
|
1645
1657
|
timeout: number
|
1646
1658
|
}
|
1647
1659
|
|
1660
|
+
/**
|
1661
|
+
* Options that control how long the Test Runner waits for an XHR request and response to succeed
|
1662
|
+
*/
|
1663
|
+
interface TimeoutableXHR {
|
1664
|
+
/**
|
1665
|
+
* Time to wait for the request (ms)
|
1666
|
+
*
|
1667
|
+
* @default {@link Timeoutable#timeout}
|
1668
|
+
* @see https://docs.cypress.io/guides/references/configuration.html#Timeouts
|
1669
|
+
*/
|
1670
|
+
requestTimeout: number,
|
1671
|
+
/**
|
1672
|
+
* Time to wait for the response (ms)
|
1673
|
+
*
|
1674
|
+
* @default {@link Timeoutable#timeout}
|
1675
|
+
* @see https://docs.cypress.io/guides/references/configuration.html#Timeouts
|
1676
|
+
*/
|
1677
|
+
responseTimeout: number
|
1678
|
+
}
|
1679
|
+
|
1648
1680
|
/**
|
1649
1681
|
* Options to force an event, skipping Actionability check
|
1650
1682
|
* @see https://docs.cypress.io/guides/core-concepts/interacting-with-elements.html#Actionability
|
@@ -0,0 +1,11 @@
|
|
1
|
+
// Shim definition to export a namespace. Cypress is actually a global module
|
2
|
+
// so import/export isn't allowed there. We import here and define a global module
|
3
|
+
// so that Cypress can get and use the Moment type
|
4
|
+
// tslint:disable-next-line:no-implicit-dependencies
|
5
|
+
import * as moment from 'moment'
|
6
|
+
export = Moment
|
7
|
+
export as namespace Moment
|
8
|
+
|
9
|
+
declare namespace Moment {
|
10
|
+
type MomentStatic = typeof moment
|
11
|
+
}
|