Files

114 lines
2.8 KiB
JavaScript

var readline = require('readline');
var defaultSpinnerString = 0;
var defaultSpinnerDelay = 60;
var Spinner = function(textToShow){
this.text = textToShow || '';
this.setSpinnerString(defaultSpinnerString);
this.setSpinnerDelay(defaultSpinnerDelay);
};
Spinner.spinners = [
'|/-\\',
'⠂-–—–-',
'◐◓◑◒',
'◴◷◶◵',
'◰◳◲◱',
'▖▘▝▗',
'■□▪▫',
'▌▀▐▄',
'▉▊▋▌▍▎▏▎▍▌▋▊▉',
'▁▃▄▅▆▇█▇▆▅▄▃',
'←↖↑↗→↘↓↙',
'┤┘┴└├┌┬┐',
'◢◣◤◥',
'.oO°Oo.',
'.oO@*',
'🌍🌎🌏',
'◡◡ ⊙⊙ ◠◠',
'☱☲☴',
'⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
'⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓',
'⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆',
'⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋',
'⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁',
'⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈',
'⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈',
'⢄⢂⢁⡁⡈⡐⡠',
'⢹⢺⢼⣸⣇⡧⡗⡏',
'⣾⣽⣻⢿⡿⣟⣯⣷',
'⠁⠂⠄⡀⢀⠠⠐⠈',
'🌑🌒🌓🌔🌕🌝🌖🌗🌘🌚'
];
Spinner.setDefaultSpinnerString = function(value) {
defaultSpinnerString = value;
};
Spinner.setDefaultSpinnerDelay = function(value) {
defaultSpinnerDelay = value;
};
Spinner.prototype.start = function() {
var current = 0;
var self = this;
this.id = setInterval(function() {
var msg = self.text.indexOf('%s') > -1 ? self.text.replace('%s', self.chars[current]) : self.chars[current] + ' ' + self.text;
clearLine();
process.stdout.write(msg);
current = ++current % self.chars.length;
}, this.delay);
};
Spinner.prototype.isSpinning = function() {
return this.id !== undefined;
}
Spinner.prototype.setSpinnerDelay = function(n) {
this.delay = n;
};
Spinner.prototype.setSpinnerString = function(str) {
this.chars = mapToSpinner(str, this.spinners).split('');
};
Spinner.prototype.setSpinnerTitle = function(str) {
this.text = str;
}
Spinner.prototype.stop = function(clear) {
clearInterval(this.id);
this.id = undefined;
if (clear) {
clearLine();
}
};
// Helpers
function isInt(value) {
return (typeof value==='number' && (value%1)===0);
}
function mapToSpinner(value, spinners) {
// Not an integer, return as strng
if (!isInt(value)) {
return value + '';
}
// Check if index is within bounds
value = (value >= Spinner.spinners.length) ? 0 : value;
// If negative, count from the end
value = (value < 0) ? Spinner.spinners.length + value : value;
return Spinner.spinners[value];
}
function clearLine() {
readline.clearLine(process.stdout, 0);
readline.cursorTo(process.stdout, 0);
}
exports.Spinner = Spinner;