summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2016-12-29 07:49:51 +0900
committersyuilo <syuilotan@yahoo.co.jp>2016-12-29 07:49:51 +0900
commitb3f42e62af698a67c2250533c437569559f1fdf9 (patch)
treecdf6937576e99cccf85e6fa3aa8860a1173c7cfb /src/utils
downloadsharkey-b3f42e62af698a67c2250533c437569559f1fdf9.tar.gz
sharkey-b3f42e62af698a67c2250533c437569559f1fdf9.tar.bz2
sharkey-b3f42e62af698a67c2250533c437569559f1fdf9.zip
Initial commit :four_leaf_clover:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/check-dependencies.ts23
-rw-r--r--src/utils/cli/indicator.ts35
-rw-r--r--src/utils/cli/progressbar.ts87
3 files changed, 145 insertions, 0 deletions
diff --git a/src/utils/check-dependencies.ts b/src/utils/check-dependencies.ts
new file mode 100644
index 0000000000..7bcb87a68f
--- /dev/null
+++ b/src/utils/check-dependencies.ts
@@ -0,0 +1,23 @@
+import {logInfo, logDone, logWarn} from 'log-cool';
+import {exec} from 'shelljs';
+
+export default function(): void {
+ checkDependency('Node.js', 'node -v', x => x.match(/^v(.*)\r?\n$/)[1]);
+ checkDependency('npm', 'npm -v', x => x.match(/^(.*)\r?\n$/)[1]);
+ checkDependency('MongoDB', 'mongo --version', x => x.match(/^MongoDB shell version: (.*)\r?\n$/)[1]);
+ checkDependency('Redis', 'redis-server --version', x => x.match(/v=([0-9\.]*)/)[1]);
+ logDone('Successfully checked external dependencies');
+}
+
+function checkDependency(serviceName: string, command: string, transform: (x: string) => string): void {
+ const code = {
+ success: 0,
+ notFound: 127
+ };
+ const x = exec(command, { silent: true }) as any;
+ if (x.code === code.success) {
+ logInfo(`DEPS: ${serviceName} ${transform(x.stdout)}`);
+ } else if (x.code === code.notFound) {
+ logWarn(`Unable to find ${serviceName}`);
+ }
+}
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
+}