Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | 4x 4x 4x 4x 4x 4x 4x 140x 70x 35x 35x 70x 35x 35x 35x 1x 35x 35x 35x 35x 35x 35x 30x 5x 4x | import type { AnyLoggerConfig, TextFunction } from '../interfaces/interfaces' import type { PrinterWriteStream } from '../interfaces/printer.interfaces' import { isTextFunction } from '../utils/typeguards' import { Printer } from './printer' export class Spinner extends Printer<Spinner> { private readonly SPINNER_STATES = '⠏⠋⠙⠹⠸⠼⠴⠦⠧⠇' private runningText: string | undefined private successText: string | undefined | TextFunction private errorText: string | undefined | TextFunction private timer: ReturnType<typeof setTimeout> | null = null private count = 0 public constructor(stdio: PrinterWriteStream) { super(stdio) } private increaseCount(): void { this.count = (this.count + 1) % (this.SPINNER_STATES.length - 1) } private writeLine(): Spinner { return this.clearLine() .write(`${this.SPINNER_STATES[this.count]} ${this.runningText}`) } protected self(): Spinner { return this } protected stop(): Spinner { if (this.timer) { clearInterval(this.timer) this.timer = null } return this } public start(loggingConfig: AnyLoggerConfig): Spinner { const { start, success, fail } = loggingConfig this.runningText = start this.successText = isTextFunction(success) ? (text: string) => this.SUCCESS_FN(success(text)) : this.SUCCESS_FN(success) this.errorText = isTextFunction(fail) ? (text: string) => this.ERROR_FN(fail(text)) : this.ERROR_FN(fail) this.stop() this.count = 0 this.timer = setInterval(() => { this.increaseCount() this.writeLine() }, 100) this.write(`${this.SPINNER_STATES[0]} ${this.runningText}`) return this } public success(text?: string): Spinner { return this.clearLine() .stop() .write(isTextFunction(this.successText) ? this.successText(text || '') : this.successText) .newline() } public error(text?: string): Spinner { return this.clearLine() .stop() .write(isTextFunction(this.errorText) ? this.errorText(text || '') : this.errorText) .newline() } public update(text: string): Spinner { Iif (this.timer) { // only update with running spinner this.runningText = text return this.writeLine() } return this } } export const spinner = new Spinner(process.stdout) |