rsnext/packages/next/build/spinner.ts

64 lines
1.7 KiB
TypeScript
Raw Normal View History

2020-03-29 01:53:00 +01:00
import ora from 'next/dist/compiled/ora'
const dotsSpinner = {
frames: ['.', '..', '...'],
interval: 200,
}
export default function createSpinner(
text: string | { prefixText: string },
options: ora.Options = {},
logFn: (...data: any[]) => void = console.log
) {
let spinner: undefined | ora.Ora
let prefixText = text && typeof text === 'object' && text.prefixText
if (process.stdout.isTTY) {
spinner = ora({
text: typeof text === 'string' ? text : undefined,
prefixText: typeof prefixText === 'string' ? prefixText : undefined,
spinner: dotsSpinner,
stream: process.stdout,
...options,
}).start()
// Add capturing of console.log/warn/error to allow pausing
// the spinner before logging and then restarting spinner after
const origLog = console.log
const origWarn = console.warn
const origError = console.error
const origStop = spinner.stop.bind(spinner)
const origStopAndPersist = spinner.stopAndPersist.bind(spinner)
const logHandle = (method: any, args: any[]) => {
origStop()
method(...args)
spinner!.start()
}
console.log = (...args: any) => logHandle(origLog, args)
console.warn = (...args: any) => logHandle(origWarn, args)
console.error = (...args: any) => logHandle(origError, args)
const resetLog = () => {
console.log = origLog
console.warn = origWarn
console.error = origError
}
spinner.stop = (): ora.Ora => {
origStop()
resetLog()
return spinner!
}
spinner.stopAndPersist = (): ora.Ora => {
origStopAndPersist()
resetLog()
return spinner!
}
} else if (prefixText || text) {
logFn(prefixText ? prefixText + '...' : text)
}
return spinner
}