|
"use strict"; |
|
|
|
const state = require('./state'); |
|
const logger = require('../logger'); |
|
const fs = require('../fs'); |
|
const util = require('../util'); |
|
const { |
|
join |
|
} = require('path'); |
|
const Table = require('cli-table3'); |
|
const dayjs = require('dayjs'); |
|
const relativeTime = require('dayjs/plugin/relativeTime'); |
|
const chalk = require('chalk'); |
|
const _ = require('lodash'); |
|
const getFolderSize = require('./get-folder-size'); |
|
const Bluebird = require('bluebird'); |
|
dayjs.extend(relativeTime); |
|
|
|
|
|
const colors = { |
|
titles: chalk.white, |
|
dates: chalk.cyan, |
|
values: chalk.green, |
|
size: chalk.gray |
|
}; |
|
const logCachePath = () => { |
|
logger.always(state.getCacheDir()); |
|
return undefined; |
|
}; |
|
const clear = () => { |
|
return fs.removeAsync(state.getCacheDir()); |
|
}; |
|
const prune = () => { |
|
const cacheDir = state.getCacheDir(); |
|
const checkedInBinaryVersion = util.pkgVersion(); |
|
let deletedBinary = false; |
|
return fs.readdirAsync(cacheDir).then(versions => { |
|
return Bluebird.all(versions.map(version => { |
|
if (version !== checkedInBinaryVersion) { |
|
deletedBinary = true; |
|
const versionDir = join(cacheDir, version); |
|
return fs.removeAsync(versionDir); |
|
} |
|
})); |
|
}).then(() => { |
|
if (deletedBinary) { |
|
logger.always(`Deleted all binary caches except for the ${checkedInBinaryVersion} binary cache.`); |
|
} else { |
|
logger.always(`No binary caches found to prune.`); |
|
} |
|
}).catch({ |
|
code: 'ENOENT' |
|
}, () => { |
|
logger.always(`No Cypress cache was found at ${cacheDir}. Nothing to prune.`); |
|
}); |
|
}; |
|
const fileSizeInMB = size => { |
|
return `${(size / 1024 / 1024).toFixed(1)}MB`; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const list = showSize => { |
|
return getCachedVersions(showSize).then(binaries => { |
|
const head = [colors.titles('version'), colors.titles('last used')]; |
|
if (showSize) { |
|
head.push(colors.titles('size')); |
|
} |
|
const table = new Table({ |
|
head |
|
}); |
|
binaries.forEach(binary => { |
|
const versionString = colors.values(binary.version); |
|
const lastUsed = binary.accessed ? colors.dates(binary.accessed) : 'unknown'; |
|
const row = [versionString, lastUsed]; |
|
if (showSize) { |
|
const size = colors.size(fileSizeInMB(binary.size)); |
|
row.push(size); |
|
} |
|
return table.push(row); |
|
}); |
|
logger.always(table.toString()); |
|
}); |
|
}; |
|
const getCachedVersions = showSize => { |
|
const cacheDir = state.getCacheDir(); |
|
return fs.readdirAsync(cacheDir).filter(util.isSemver).map(version => { |
|
return { |
|
version, |
|
folderPath: join(cacheDir, version) |
|
}; |
|
}).mapSeries(binary => { |
|
|
|
|
|
const binaryDir = state.getBinaryDir(binary.version); |
|
const executable = state.getPathToExecutable(binaryDir); |
|
return fs.statAsync(executable).then(stat => { |
|
const lastAccessedTime = _.get(stat, 'atime'); |
|
if (!lastAccessedTime) { |
|
|
|
|
|
return binary; |
|
} |
|
const accessed = dayjs(lastAccessedTime).fromNow(); |
|
binary.accessed = accessed; |
|
return binary; |
|
}, e => { |
|
|
|
return binary; |
|
}); |
|
}).mapSeries(binary => { |
|
if (showSize) { |
|
const binaryDir = state.getBinaryDir(binary.version); |
|
return getFolderSize(binaryDir).then(size => { |
|
return { |
|
...binary, |
|
size |
|
}; |
|
}); |
|
} |
|
return binary; |
|
}); |
|
}; |
|
module.exports = { |
|
path: logCachePath, |
|
clear, |
|
prune, |
|
list, |
|
getCachedVersions |
|
}; |