summaryrefslogtreecommitdiff
path: root/src/utils/cli
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/cli')
-rw-r--r--src/utils/cli/indicator.ts35
-rw-r--r--src/utils/cli/progressbar.ts87
2 files changed, 122 insertions, 0 deletions
diff --git a/src/utils/cli/indicator.ts b/src/utils/cli/indicator.ts
new file mode 100644
index 0000000000..3e23f9b274
--- /dev/null
+++ b/src/utils/cli/indicator.ts
@@ -0,0 +1,35 @@
+import * as readline from 'readline';
+
+/**
+ * Indicator
+ */
+export default class {
+ private clock: NodeJS.Timer;
+
+ constructor(text: string) {
+ let i = 0; // Dots counter
+
+ draw();
+ this.clock = setInterval(draw, 300);
+
+ function draw(): void {
+ cll();
+ i = (i + 1) % 4;
+ const dots = new Array(i + 1).join('.');
+ process.stdout.write(text + dots); // Write text
+ }
+ }
+
+ public end(): void {
+ clearInterval(this.clock);
+ cll();
+ }
+}
+
+/**
+ * Clear current line
+ */
+function cll(): void {
+ readline.clearLine(process.stdout, 0); // Clear current text
+ readline.cursorTo(process.stdout, 0, null); // Move cursor to the head of line
+}
diff --git a/src/utils/cli/progressbar.ts b/src/utils/cli/progressbar.ts
new file mode 100644
index 0000000000..19852b3ea3
--- /dev/null
+++ b/src/utils/cli/progressbar.ts
@@ -0,0 +1,87 @@
+import * as ev from 'events';
+import * as readline from 'readline';
+import * as chalk from 'chalk';
+
+/**
+ * Progress bar
+ */
+class ProgressBar extends ev.EventEmitter {
+ public max: number;
+ public value: number;
+ public text: string;
+ private indicator: number;
+
+ constructor(max: number, text: string = null) {
+ super();
+ this.max = max;
+ this.value = 0;
+ this.text = text;
+ this.indicator = 0;
+ this.draw();
+
+ const iclock = setInterval(() => {
+ this.indicator = (this.indicator + 1) % 4;
+ this.draw();
+ }, 200);
+
+ this.on('complete', () => {
+ clearInterval(iclock);
+ });
+ }
+
+ public increment(): void {
+ this.value++;
+ this.draw();
+
+ // Check if it is fulfilled
+ if (this.value === this.max) {
+ this.indicator = null;
+
+ cll();
+ process.stdout.write(`${this.render()} -> ${chalk.bold('Complete')}\n`);
+
+ this.emit('complete');
+ }
+ }
+
+ public draw(): void {
+ const str = this.render();
+ cll();
+ process.stdout.write(str);
+ }
+
+ private render(): string {
+ const width = 30;
+ const t = this.text ? this.text + ' ' : '';
+
+ const v = Math.floor((this.value / this.max) * width);
+ const vs = new Array(v + 1).join('*');
+
+ const p = width - v;
+ const ps = new Array(p + 1).join(' ');
+
+ const percentage = Math.floor((this.value / this.max) * 100);
+ const percentages = chalk.gray(`(${percentage}%)`);
+
+ let i: string;
+ switch (this.indicator) {
+ case 0: i = '-'; break;
+ case 1: i = '\\'; break;
+ case 2: i = '|'; break;
+ case 3: i = '/'; break;
+ case null: i = '+'; break;
+ }
+
+ return `${i} ${t}[${vs}${ps}] ${this.value}/${this.max} ${percentages}`;
+ }
+}
+
+export default ProgressBar;
+
+/**
+ * Clear current line
+ */
+function cll(): void {
+ readline.clearLine(process.stdout, 0); // Clear current text
+ readline.cursorTo(process.stdout, 0, null); // Move cursor to the head of line
+}