cypress 15.1.0 → 15.2.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.
@@ -1,53 +1,61 @@
1
1
  "use strict";
2
-
3
- const Promise = require('bluebird');
4
- const debug = require('debug')('cypress:cli');
5
- const path = require('path');
6
- const util = require('../util');
7
- const state = require('../tasks/state');
8
- const {
9
- throwFormErrorText,
10
- errors
11
- } = require('../errors');
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const bluebird_1 = __importDefault(require("bluebird"));
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const util_1 = __importDefault(require("../util"));
10
+ const state_1 = __importDefault(require("../tasks/state"));
11
+ const errors_1 = require("../errors");
12
+ const debug = (0, debug_1.default)('cypress:cli');
12
13
  const getVersions = () => {
13
- return Promise.try(() => {
14
- if (util.getEnv('CYPRESS_RUN_BINARY')) {
15
- let envBinaryPath = path.resolve(util.getEnv('CYPRESS_RUN_BINARY'));
16
- return state.parseRealPlatformBinaryFolderAsync(envBinaryPath).then(envBinaryDir => {
17
- if (!envBinaryDir) {
18
- return throwFormErrorText(errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))();
14
+ return bluebird_1.default.try(() => {
15
+ if (util_1.default.getEnv('CYPRESS_RUN_BINARY')) {
16
+ let envBinaryPath = path_1.default.resolve(util_1.default.getEnv('CYPRESS_RUN_BINARY'));
17
+ return state_1.default.parseRealPlatformBinaryFolderAsync(envBinaryPath)
18
+ .then((envBinaryDir) => {
19
+ if (!envBinaryDir) {
20
+ return (0, errors_1.throwFormErrorText)(errors_1.errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))();
21
+ }
22
+ debug('CYPRESS_RUN_BINARY has binaryDir:', envBinaryDir);
23
+ return envBinaryDir;
24
+ })
25
+ .catch({ code: 'ENOENT' }, (err) => {
26
+ return (0, errors_1.throwFormErrorText)(errors_1.errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))(err.message);
27
+ });
19
28
  }
20
- debug('CYPRESS_RUN_BINARY has binaryDir:', envBinaryDir);
21
- return envBinaryDir;
22
- }).catch({
23
- code: 'ENOENT'
24
- }, err => {
25
- return throwFormErrorText(errors.CYPRESS_RUN_BINARY.notValid(envBinaryPath))(err.message);
26
- });
27
- }
28
- return state.getBinaryDir();
29
- }).then(state.getBinaryPkgAsync).then(pkg => {
30
- const versions = {
31
- binary: state.getBinaryPkgVersion(pkg),
32
- electronVersion: state.getBinaryElectronVersion(pkg),
33
- electronNodeVersion: state.getBinaryElectronNodeVersion(pkg)
34
- };
35
- debug('binary versions %o', versions);
36
- return versions;
37
- }).then(binaryVersions => {
38
- const buildInfo = util.pkgBuildInfo();
39
- let packageVersion = util.pkgVersion();
40
- if (!buildInfo) packageVersion += ' (development)';else if (!buildInfo.stable) packageVersion += ' (pre-release)';
41
- const versions = {
42
- package: packageVersion,
43
- binary: binaryVersions.binary || 'not installed',
44
- electronVersion: binaryVersions.electronVersion || 'not found',
45
- electronNodeVersion: binaryVersions.electronNodeVersion || 'not found'
46
- };
47
- debug('combined versions %o', versions);
48
- return versions;
49
- });
29
+ return state_1.default.getBinaryDir();
30
+ })
31
+ .then(state_1.default.getBinaryPkgAsync)
32
+ .then((pkg) => {
33
+ const versions = {
34
+ binary: state_1.default.getBinaryPkgVersion(pkg),
35
+ electronVersion: state_1.default.getBinaryElectronVersion(pkg),
36
+ electronNodeVersion: state_1.default.getBinaryElectronNodeVersion(pkg),
37
+ };
38
+ debug('binary versions %o', versions);
39
+ return versions;
40
+ })
41
+ .then((binaryVersions) => {
42
+ const buildInfo = util_1.default.pkgBuildInfo();
43
+ let packageVersion = util_1.default.pkgVersion();
44
+ if (!buildInfo)
45
+ packageVersion += ' (development)';
46
+ else if (!buildInfo.stable)
47
+ packageVersion += ' (pre-release)';
48
+ const versions = {
49
+ package: packageVersion,
50
+ binary: binaryVersions.binary || 'not installed',
51
+ electronVersion: binaryVersions.electronVersion || 'not found',
52
+ electronNodeVersion: binaryVersions.electronNodeVersion || 'not found',
53
+ };
54
+ debug('combined versions %o', versions);
55
+ return versions;
56
+ });
57
+ };
58
+ const versionsModule = {
59
+ getVersions,
50
60
  };
51
- module.exports = {
52
- getVersions
53
- };
61
+ exports.default = versionsModule;
package/lib/exec/xvfb.js CHANGED
@@ -1,72 +1,66 @@
1
1
  "use strict";
2
-
3
- const os = require('os');
4
- const Promise = require('bluebird');
5
- const Xvfb = require('@cypress/xvfb');
6
- const {
7
- stripIndent
8
- } = require('common-tags');
9
- const Debug = require('debug');
10
- const {
11
- throwFormErrorText,
12
- errors
13
- } = require('../errors');
14
- const util = require('../util');
15
- const debug = Debug('cypress:cli');
16
- const debugXvfb = Debug('cypress:xvfb');
17
- debug.Debug = debugXvfb.Debug = Debug;
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const os_1 = __importDefault(require("os"));
7
+ const bluebird_1 = __importDefault(require("bluebird"));
8
+ const xvfb_1 = __importDefault(require("@cypress/xvfb"));
9
+ const common_tags_1 = require("common-tags");
10
+ const debug_1 = __importDefault(require("debug"));
11
+ const errors_1 = require("../errors");
12
+ const util_1 = __importDefault(require("../util"));
13
+ const debug = (0, debug_1.default)('cypress:cli');
14
+ const debugXvfb = (0, debug_1.default)('cypress:xvfb');
15
+ debug.Debug = debugXvfb.Debug = debug_1.default;
18
16
  const xvfbOptions = {
19
- displayNum: process.env.XVFB_DISPLAY_NUM,
20
- timeout: 30000,
21
- // milliseconds
22
- // need to explicitly define screen otherwise electron will crash
23
- // https://github.com/cypress-io/cypress/issues/6184
24
- xvfb_args: ['-screen', '0', '1280x1024x24'],
25
- onStderrData(data) {
26
- if (debugXvfb.enabled) {
27
- debugXvfb(data.toString());
28
- }
29
- }
17
+ displayNum: process.env.XVFB_DISPLAY_NUM,
18
+ timeout: 30000, // milliseconds
19
+ // need to explicitly define screen otherwise electron will crash
20
+ // https://github.com/cypress-io/cypress/issues/6184
21
+ xvfb_args: ['-screen', '0', '1280x1024x24'],
22
+ onStderrData(data) {
23
+ if (debugXvfb.enabled) {
24
+ debugXvfb(data.toString());
25
+ }
26
+ },
30
27
  };
31
- const xvfb = Promise.promisifyAll(new Xvfb(xvfbOptions));
32
- module.exports = {
33
- _debugXvfb: debugXvfb,
34
- // expose for testing
35
-
36
- _xvfb: xvfb,
37
- // expose for testing
38
-
39
- _xvfbOptions: xvfbOptions,
40
- // expose for testing
41
-
42
- start() {
43
- debug('Starting Xvfb');
44
- return xvfb.startAsync().return(null).catch({
45
- nonZeroExitCode: true
46
- }, throwFormErrorText(errors.nonZeroExitCodeXvfb)).catch(err => {
47
- if (err.known) {
48
- throw err;
49
- }
50
- return throwFormErrorText(errors.missingXvfb)(err);
51
- });
52
- },
53
- stop() {
54
- debug('Stopping Xvfb');
55
- return xvfb.stopAsync().return(null).catch(() => {
56
- // noop
57
- });
58
- },
59
- isNeeded() {
60
- if (process.env.ELECTRON_RUN_AS_NODE) {
61
- debug('Environment variable ELECTRON_RUN_AS_NODE detected, xvfb is not needed');
62
- return false; // xvfb required for electron processes only.
63
- }
64
- if (os.platform() !== 'linux') {
65
- return false;
66
- }
67
- if (process.env.DISPLAY) {
68
- const issueUrl = util.getGitHubIssueUrl(4034);
69
- const message = stripIndent`
28
+ const xvfb = bluebird_1.default.promisifyAll(new xvfb_1.default(xvfbOptions));
29
+ const xvfbModule = {
30
+ _debugXvfb: debugXvfb, // expose for testing
31
+ _xvfb: xvfb, // expose for testing
32
+ _xvfbOptions: xvfbOptions, // expose for testing
33
+ start() {
34
+ debug('Starting Xvfb');
35
+ return xvfb.startAsync()
36
+ .return(null)
37
+ .catch({ nonZeroExitCode: true }, (0, errors_1.throwFormErrorText)(errors_1.errors.nonZeroExitCodeXvfb))
38
+ .catch((err) => {
39
+ if (err.known) {
40
+ throw err;
41
+ }
42
+ return (0, errors_1.throwFormErrorText)(errors_1.errors.missingXvfb)(err);
43
+ });
44
+ },
45
+ stop() {
46
+ debug('Stopping Xvfb');
47
+ return xvfb.stopAsync()
48
+ .return(null)
49
+ .catch(() => {
50
+ // noop
51
+ });
52
+ },
53
+ isNeeded() {
54
+ if (process.env.ELECTRON_RUN_AS_NODE) {
55
+ debug('Environment variable ELECTRON_RUN_AS_NODE detected, xvfb is not needed');
56
+ return false; // xvfb required for electron processes only.
57
+ }
58
+ if (os_1.default.platform() !== 'linux') {
59
+ return false;
60
+ }
61
+ if (process.env.DISPLAY) {
62
+ const issueUrl = util_1.default.getGitHubIssueUrl(4034);
63
+ const message = (0, common_tags_1.stripIndent) `
70
64
  DISPLAY environment variable is set to ${process.env.DISPLAY} on Linux
71
65
  Assuming this DISPLAY points at working X11 server,
72
66
  Cypress will not spawn own Xvfb
@@ -76,18 +70,22 @@ module.exports = {
76
70
  Solution: Unset the DISPLAY variable and try again:
77
71
  DISPLAY= npx cypress run ...
78
72
  `;
79
- debug(message);
80
- return false;
81
- }
82
- debug('undefined DISPLAY environment variable');
83
- debug('Cypress will spawn its own Xvfb');
84
- return true;
85
- },
86
- // async method, resolved with Boolean
87
- verify() {
88
- return xvfb.startAsync().return(true).catch(err => {
89
- debug('Could not verify xvfb: %s', err.message);
90
- return false;
91
- }).finally(xvfb.stopAsync);
92
- }
93
- };
73
+ debug(message);
74
+ return false;
75
+ }
76
+ debug('undefined DISPLAY environment variable');
77
+ debug('Cypress will spawn its own Xvfb');
78
+ return true;
79
+ },
80
+ // async method, resolved with Boolean
81
+ verify() {
82
+ return xvfb.startAsync()
83
+ .return(true)
84
+ .catch((err) => {
85
+ debug('Could not verify xvfb: %s', err.message);
86
+ return false;
87
+ })
88
+ .finally(xvfb.stopAsync);
89
+ },
90
+ };
91
+ exports.default = xvfbModule;
package/lib/fs.js CHANGED
@@ -1,4 +1,8 @@
1
1
  "use strict";
2
-
3
- const Promise = require('bluebird');
4
- module.exports = Promise.promisifyAll(require('fs-extra'));
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const bluebird_1 = __importDefault(require("bluebird"));
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ exports.default = bluebird_1.default.promisifyAll(fs_extra_1.default);
package/lib/logger.js CHANGED
@@ -1,50 +1,55 @@
1
1
  "use strict";
2
-
3
- const chalk = require('chalk');
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chalk_1 = __importDefault(require("chalk"));
4
7
  let logs = [];
5
8
  const logLevel = () => {
6
- return process.env.npm_config_loglevel || 'notice';
9
+ return (process.env.npm_config_loglevel || 'notice');
7
10
  };
8
11
  const error = (...messages) => {
9
- logs.push(messages.join(' '));
10
- console.log(chalk.red(...messages)); // eslint-disable-line no-console
12
+ logs.push(messages.join(' '));
13
+ console.log(chalk_1.default.red(...messages)); // eslint-disable-line no-console
11
14
  };
12
15
  const warn = (...messages) => {
13
- if (logLevel() === 'silent') return;
14
- logs.push(messages.join(' '));
15
- console.log(chalk.yellow(...messages)); // eslint-disable-line no-console
16
+ if (logLevel() === 'silent')
17
+ return;
18
+ logs.push(messages.join(' '));
19
+ console.log(chalk_1.default.yellow(...messages)); // eslint-disable-line no-console
16
20
  };
17
21
  const log = (...messages) => {
18
- if (logLevel() === 'silent' || logLevel() === 'warn') return;
19
- logs.push(messages.join(' '));
20
- console.log(...messages); // eslint-disable-line no-console
22
+ if (logLevel() === 'silent' || logLevel() === 'warn')
23
+ return;
24
+ logs.push(messages.join(' '));
25
+ console.log(...messages); // eslint-disable-line no-console
21
26
  };
22
27
  const always = (...messages) => {
23
- logs.push(messages.join(' '));
24
- console.log(...messages); // eslint-disable-line no-console
28
+ logs.push(messages.join(' '));
29
+ console.log(...messages); // eslint-disable-line no-console
25
30
  };
26
-
27
31
  // splits long text into lines and calls log()
28
32
  // on each one to allow easy unit testing for specific message
29
- const logLines = text => {
30
- const lines = text.split('\n');
31
- for (const line of lines) {
32
- log(line);
33
- }
33
+ const logLines = (text) => {
34
+ const lines = text.split('\n');
35
+ for (const line of lines) {
36
+ log(line);
37
+ }
34
38
  };
35
39
  const print = () => {
36
- return logs.join('\n');
40
+ return logs.join('\n');
37
41
  };
38
42
  const reset = () => {
39
- logs = [];
40
- };
41
- module.exports = {
42
- log,
43
- warn,
44
- error,
45
- always,
46
- logLines,
47
- print,
48
- reset,
49
- logLevel
50
- };
43
+ logs = [];
44
+ };
45
+ const loggerModule = {
46
+ log,
47
+ warn,
48
+ error,
49
+ always,
50
+ logLines,
51
+ print,
52
+ reset,
53
+ logLevel,
54
+ };
55
+ exports.default = loggerModule;
@@ -1,132 +1,147 @@
1
1
  "use strict";
2
-
3
- const state = require('./state');
4
- const logger = require('../logger');
5
- const fs = require('../fs');
6
- const util = require('../util');
7
- const {
8
- join
9
- } = require('path');
10
- const Table = require('cli-table3');
11
- const dayjs = require('dayjs');
12
- const relativeTime = require('dayjs/plugin/relativeTime');
13
- const chalk = require('chalk');
14
- const _ = require('lodash');
15
- const getFolderSize = require('./get-folder-size');
16
- const Bluebird = require('bluebird');
17
- dayjs.extend(relativeTime);
18
-
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const state_1 = __importDefault(require("./state"));
16
+ const logger_1 = __importDefault(require("../logger"));
17
+ const fs_1 = __importDefault(require("../fs"));
18
+ const util_1 = __importDefault(require("../util"));
19
+ const path_1 = require("path");
20
+ const cli_table3_1 = __importDefault(require("cli-table3"));
21
+ const dayjs_1 = __importDefault(require("dayjs"));
22
+ const relativeTime_1 = __importDefault(require("dayjs/plugin/relativeTime"));
23
+ const chalk_1 = __importDefault(require("chalk"));
24
+ const lodash_1 = __importDefault(require("lodash"));
25
+ const get_folder_size_1 = __importDefault(require("./get-folder-size"));
26
+ dayjs_1.default.extend(relativeTime_1.default);
19
27
  // output colors for the table
20
28
  const colors = {
21
- titles: chalk.white,
22
- dates: chalk.cyan,
23
- values: chalk.green,
24
- size: chalk.gray
29
+ titles: chalk_1.default.white,
30
+ dates: chalk_1.default.cyan,
31
+ values: chalk_1.default.green,
32
+ size: chalk_1.default.gray,
25
33
  };
26
34
  const logCachePath = () => {
27
- logger.always(state.getCacheDir());
28
- return undefined;
35
+ logger_1.default.always(state_1.default.getCacheDir());
36
+ return undefined;
29
37
  };
30
38
  const clear = () => {
31
- return fs.removeAsync(state.getCacheDir());
39
+ return fs_1.default.removeAsync(state_1.default.getCacheDir());
32
40
  };
33
- const prune = () => {
34
- const cacheDir = state.getCacheDir();
35
- const checkedInBinaryVersion = util.pkgVersion();
36
- let deletedBinary = false;
37
- return fs.readdirAsync(cacheDir).then(versions => {
38
- return Bluebird.all(versions.map(version => {
39
- if (version !== checkedInBinaryVersion) {
40
- deletedBinary = true;
41
- const versionDir = join(cacheDir, version);
42
- return fs.removeAsync(versionDir);
43
- }
44
- }));
45
- }).then(() => {
46
- if (deletedBinary) {
47
- logger.always(`Deleted all binary caches except for the ${checkedInBinaryVersion} binary cache.`);
48
- } else {
49
- logger.always(`No binary caches found to prune.`);
41
+ const prune = () => __awaiter(void 0, void 0, void 0, function* () {
42
+ const cacheDir = state_1.default.getCacheDir();
43
+ const checkedInBinaryVersion = util_1.default.pkgVersion();
44
+ let deletedBinary = false;
45
+ try {
46
+ const versions = yield fs_1.default.readdirAsync(cacheDir);
47
+ for (const version of versions) {
48
+ if (version !== checkedInBinaryVersion) {
49
+ deletedBinary = true;
50
+ const versionDir = (0, path_1.join)(cacheDir, version);
51
+ yield fs_1.default.removeAsync(versionDir);
52
+ }
53
+ }
54
+ if (deletedBinary) {
55
+ logger_1.default.always(`Deleted all binary caches except for the ${checkedInBinaryVersion} binary cache.`);
56
+ }
57
+ else {
58
+ logger_1.default.always(`No binary caches found to prune.`);
59
+ }
50
60
  }
51
- }).catch({
52
- code: 'ENOENT'
53
- }, () => {
54
- logger.always(`No Cypress cache was found at ${cacheDir}. Nothing to prune.`);
55
- });
56
- };
57
- const fileSizeInMB = size => {
58
- return `${(size / 1024 / 1024).toFixed(1)}MB`;
61
+ catch (e) {
62
+ if (e.code === 'ENOENT') {
63
+ logger_1.default.always(`No Cypress cache was found at ${cacheDir}. Nothing to prune.`);
64
+ return;
65
+ }
66
+ throw e;
67
+ }
68
+ });
69
+ const fileSizeInMB = (size) => {
70
+ return `${(size / 1024 / 1024).toFixed(1)}MB`;
59
71
  };
60
-
61
72
  /**
62
73
  * Collects all cached versions, finds when each was used
63
74
  * and prints a table with results to the terminal
64
75
  */
65
- const list = showSize => {
66
- return getCachedVersions(showSize).then(binaries => {
67
- const head = [colors.titles('version'), colors.titles('last used')];
68
- if (showSize) {
69
- head.push(colors.titles('size'));
70
- }
71
- const table = new Table({
72
- head
73
- });
74
- binaries.forEach(binary => {
75
- const versionString = colors.values(binary.version);
76
- const lastUsed = binary.accessed ? colors.dates(binary.accessed) : 'unknown';
77
- const row = [versionString, lastUsed];
78
- if (showSize) {
79
- const size = colors.size(fileSizeInMB(binary.size));
80
- row.push(size);
81
- }
82
- return table.push(row);
76
+ const list = (showSize = false) => {
77
+ return getCachedVersions(showSize)
78
+ .then((binaries) => {
79
+ const head = [colors.titles('version'), colors.titles('last used')];
80
+ if (showSize) {
81
+ head.push(colors.titles('size'));
82
+ }
83
+ const table = new cli_table3_1.default({
84
+ head,
85
+ });
86
+ binaries.forEach((binary) => {
87
+ const versionString = colors.values(binary.version);
88
+ const lastUsed = binary.accessed ? colors.dates(binary.accessed) : 'unknown';
89
+ const row = [versionString, lastUsed];
90
+ if (showSize) {
91
+ const size = colors.size(fileSizeInMB(binary.size));
92
+ row.push(size);
93
+ }
94
+ return table.push(row);
95
+ });
96
+ logger_1.default.always(table.toString());
83
97
  });
84
- logger.always(table.toString());
85
- });
86
98
  };
87
- const getCachedVersions = showSize => {
88
- const cacheDir = state.getCacheDir();
89
- return fs.readdirAsync(cacheDir).filter(util.isSemver).map(version => {
90
- return {
91
- version,
92
- folderPath: join(cacheDir, version)
93
- };
94
- }).mapSeries(binary => {
95
- // last access time on the folder is different from last access time
96
- // on the Cypress binary
97
- const binaryDir = state.getBinaryDir(binary.version);
98
- const executable = state.getPathToExecutable(binaryDir);
99
- return fs.statAsync(executable).then(stat => {
100
- const lastAccessedTime = _.get(stat, 'atime');
101
- if (!lastAccessedTime) {
102
- // the test runner has never been opened
103
- // or could be a test simulating missing timestamp
104
- return binary;
105
- }
106
- const accessed = dayjs(lastAccessedTime).fromNow();
107
- binary.accessed = accessed;
108
- return binary;
109
- }, e => {
110
- // could not find the binary or gets its stats
111
- return binary;
112
- });
113
- }).mapSeries(binary => {
114
- if (showSize) {
115
- const binaryDir = state.getBinaryDir(binary.version);
116
- return getFolderSize(binaryDir).then(size => {
99
+ const getCachedVersions = (showSize) => {
100
+ const cacheDir = state_1.default.getCacheDir();
101
+ return fs_1.default
102
+ .readdirAsync(cacheDir)
103
+ .filter(util_1.default.isSemver)
104
+ .map((version) => {
117
105
  return {
118
- ...binary,
119
- size
106
+ version,
107
+ folderPath: (0, path_1.join)(cacheDir, version),
120
108
  };
121
- });
122
- }
123
- return binary;
124
- });
109
+ })
110
+ .mapSeries((binary) => {
111
+ // last access time on the folder is different from last access time
112
+ // on the Cypress binary
113
+ const binaryDir = state_1.default.getBinaryDir(binary.version);
114
+ const executable = state_1.default.getPathToExecutable(binaryDir);
115
+ return fs_1.default.statAsync(executable).then((stat) => {
116
+ const lastAccessedTime = lodash_1.default.get(stat, 'atime');
117
+ if (!lastAccessedTime) {
118
+ // the test runner has never been opened
119
+ // or could be a test simulating missing timestamp
120
+ return binary;
121
+ }
122
+ const accessed = (0, dayjs_1.default)(lastAccessedTime).fromNow();
123
+ binary.accessed = accessed;
124
+ return binary;
125
+ }, (e) => {
126
+ // could not find the binary or gets its stats
127
+ return binary;
128
+ });
129
+ })
130
+ .mapSeries((binary) => {
131
+ if (showSize) {
132
+ const binaryDir = state_1.default.getBinaryDir(binary.version);
133
+ return (0, get_folder_size_1.default)(binaryDir).then((size) => {
134
+ return Object.assign(Object.assign({}, binary), { size });
135
+ });
136
+ }
137
+ return binary;
138
+ });
139
+ };
140
+ const cacheModule = {
141
+ path: logCachePath,
142
+ clear,
143
+ prune,
144
+ list,
145
+ getCachedVersions,
125
146
  };
126
- module.exports = {
127
- path: logCachePath,
128
- clear,
129
- prune,
130
- list,
131
- getCachedVersions
132
- };
147
+ exports.default = cacheModule;