| | |
| | | import truncate from "ansi-truncate" |
| | | import readline from "readline" |
| | | |
| | | export class QuartzLogger { |
| | | verbose: boolean |
| | | private spinnerInterval: NodeJS.Timeout | undefined |
| | | private spinnerText: string = "" |
| | | private updateSuffix: string = "" |
| | | private spinnerIndex: number = 0 |
| | | private readonly spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] |
| | | |
| | | constructor(verbose: boolean) { |
| | | this.verbose = verbose |
| | | const isInteractiveTerminal = |
| | | process.stdout.isTTY && process.env.TERM !== "dumb" && !process.env.CI |
| | | this.verbose = verbose || !isInteractiveTerminal |
| | | } |
| | | |
| | | start(text: string) { |
| | | this.spinnerText = text |
| | | |
| | | if (this.verbose) { |
| | | console.log(text) |
| | | } else { |
| | |
| | | this.spinnerInterval = setInterval(() => { |
| | | readline.clearLine(process.stdout, 0) |
| | | readline.cursorTo(process.stdout, 0) |
| | | process.stdout.write(`${this.spinnerChars[this.spinnerIndex]} ${this.spinnerText}`) |
| | | |
| | | const columns = process.stdout.columns || 80 |
| | | let output = `${this.spinnerChars[this.spinnerIndex]} ${this.spinnerText}` |
| | | if (this.updateSuffix) { |
| | | output += `: ${this.updateSuffix}` |
| | | } |
| | | |
| | | const truncated = truncate(output, columns) |
| | | process.stdout.write(truncated) |
| | | this.spinnerIndex = (this.spinnerIndex + 1) % this.spinnerChars.length |
| | | }, 100) |
| | | }, 20) |
| | | } |
| | | } |
| | | |
| | | updateText(text: string) { |
| | | this.spinnerText = text |
| | | this.updateSuffix = text |
| | | } |
| | | |
| | | end(text?: string) { |