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 | 10x 10x 10x 11x 11x 11x 11x 9x 12x 62x 22x 13x 13x 22x 14x 14x 14x 2x 14x 2x 14x 14x 14x 9x 9x 14x 14x 4x 4x 4x 3x 3x 1x 10x | 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 {
if (this.timer) {
// only update with running spinner
this.runningText = text
return this.writeLine()
}
return this
}
}
export const spinner = new Spinner(process.stdout)
|