message-await
Version:
A utility to print message with an async success or failure in node.js
172 lines (171 loc) • 6.11 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var readline_1 = require("readline");
var cli_cursor_1 = require("cli-cursor");
var constants_1 = require("./constants");
__exportStar(require("./contracts"), exports);
// eslint-disable-next-line @typescript-eslint/no-var-requires
var logSymbols = require('log-symbols');
/**
* prints the initial message
* @param message - message to display
* @param options - MessageAwaitOptions
* @returns MessageAwait - options to complete the message when done or update the message with progress info
*/
function print(message, options) {
var requiredOptions = __assign(__assign({}, constants_1.defaultOptions), options);
var timeout;
var isComplete = false;
var dotCount = 3;
function generateMessage() {
var dots = Array.from({ length: dotCount })
.map(function () { return '.'; })
.join('');
while (dots.length < 3) {
dots = dots + ' ';
}
return requiredOptions.format(message + dots);
}
function resetCursor() {
(0, readline_1.cursorTo)(process.stdout, 0);
(0, readline_1.clearLine)(process.stdout, 1);
}
function writeMessage() {
resetCursor();
process.stdout.write(generateMessage());
}
function startTimer() {
dotCount = 0;
writeMessage();
timeout = setInterval(function () {
switch (dotCount) {
case 3:
dotCount = 0;
writeMessage();
break;
default:
dotCount++;
writeMessage();
}
}, 300).unref();
}
function updateMessage(messageUpdate, spinner) {
if (isComplete) {
throw new Error("Progress Message is complete");
}
if (spinner === true && timeout == null) {
startTimer();
}
else if (spinner === false && timeout != null) {
dotCount = 0;
clearInterval(timeout);
timeout = undefined;
}
message = messageUpdate;
writeMessage();
}
function log(logMessage) {
var optional = [];
for (var _i = 1; _i < arguments.length; _i++) {
optional[_i - 1] = arguments[_i];
}
if (isComplete) {
throw new Error("Progress Message is complete");
}
resetCursor();
console.log.apply(console, __spreadArray([logMessage], optional, false));
writeMessage();
}
function complete(success, updateMessage) {
if (success === void 0) { success = true; }
isComplete = true;
if (timeout != null) {
clearInterval(timeout);
}
dotCount = 3;
resetCursor();
message = updateMessage || message;
if (success) {
console.log("".concat(generateMessage(), " ").concat(logSymbols.success));
}
else {
console.log("".concat(generateMessage(), " ").concat(logSymbols.error));
}
if (requiredOptions.hideCursor) {
(0, cli_cursor_1.show)();
}
}
function success(updateMessage) {
return complete(true, updateMessage);
}
function fail(updateMessage) {
return complete(false, updateMessage);
}
function getMessage() {
return message;
}
function await(promise, exitProcess, printError, updateSuccessMessage, updateFailureMessage) {
return (typeof promise === 'function'
? promise({ complete: complete, log: log, updateMessage: updateMessage, getMessage: getMessage, success: success, fail: fail })
: promise)
.then(function (value) {
complete(true, typeof updateSuccessMessage === 'function' ? updateSuccessMessage(value) : updateSuccessMessage);
return value;
})
.catch(function (err) {
complete(false, typeof updateFailureMessage === 'function' ? updateFailureMessage(err) : updateFailureMessage);
if (printError) {
console.error(err);
}
if (exitProcess) {
process.exit();
}
return Promise.reject(err);
});
}
if (requiredOptions.hideCursor) {
(0, cli_cursor_1.hide)();
}
if (requiredOptions.spinner) {
startTimer();
}
else {
writeMessage();
}
return { complete: complete, log: log, updateMessage: updateMessage, getMessage: getMessage, success: success, fail: fail, await: await };
}
exports.default = print;