navy
Version:
Quick and powerful development environments using Docker and Docker Compose
98 lines (75 loc) • 2.81 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _chalk = _interopRequireDefault(require("chalk"));
var _readline = _interopRequireDefault(require("readline"));
var _cliSpinners = require("cli-spinners");
var _ = require("../");
var _table = _interopRequireDefault(require("../util/table"));
var _hasUpdate = _interopRequireDefault(require("../util/has-update"));
const debug = require('debug')('navy:updates');
let spinnerIndex = 0;
let spinnerFrame = _cliSpinners.dots.frames[0];
function renderStatus(status) {
if (status == null) {
return _chalk.default.yellow(spinnerFrame) + ' ' + _chalk.default.dim('Checking...');
} else if (status === true) {
return _chalk.default.yellow('• Update available');
} else if (status === 'UNKNOWN_REMOTE') {
return _chalk.default.red('• Not found');
} else if (status === 'UNKNOWN_ERROR') {
return _chalk.default.red('• Internal error');
} else if (status === 'NO_IMAGE') {
return _chalk.default.red('• No image for service');
} else {
return _chalk.default.green('✔ Up to date');
}
}
async function _default(opts) {
const navy = (0, _.getNavy)(opts.navy);
const navyFile = await navy.getNavyFile();
const ps = await navy.ps();
const updateStatus = {};
let drawnLines = 0;
function draw() {
drawnLines = 0;
const buffer = (0, _table.default)([['NAME', 'IMAGE', 'UPDATES'], ...ps.map(service => [service.name, service.image, renderStatus(updateStatus[service.id])])]);
drawnLines = buffer.split('\n').length;
console.log(buffer);
}
function redraw() {
_readline.default.clearLine(process.stdout, 0);
_readline.default.cursorTo(process.stdout, 0);
for (let i = 0; i < drawnLines; i++) {
_readline.default.moveCursor(process.stdout, 0, -1);
_readline.default.clearLine(process.stdout, 0);
}
draw();
}
const spinner = setInterval(() => {
spinnerIndex++;
if (spinnerIndex >= _cliSpinners.dots.frames.length) {
spinnerIndex = 0;
}
spinnerFrame = _cliSpinners.dots.frames[spinnerIndex];
redraw();
}, _cliSpinners.dots.interval);
draw();
await Promise.all(ps.map(async service => {
try {
if (!service || !service.raw || !service.raw.Image) {
return updateStatus[service.id] = 'NO_IMAGE';
}
updateStatus[service.id] = await (0, _hasUpdate.default)(service.image, service.raw.Image, navyFile);
} catch (ex) {
debug('Error checking update for', service.name, ex.stack || ex.message);
updateStatus[service.id] = 'UNKNOWN_ERROR';
}
}));
redraw();
clearInterval(spinner);
}
module.exports = exports.default;