UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

60 lines (53 loc) 1.61 kB
import {type CliOutputter} from '@sanity/cli' import prettyMs from 'pretty-ms' type ProgressEvent = { step: string update?: boolean current?: number total?: number } interface ProgressSpinner { set: (progress: ProgressEvent) => void update: (progress: ProgressEvent) => void succeed: () => void fail: () => void } const newProgress = (output: CliOutputter, startStep: string): ProgressSpinner => { let spinner = output.spinner(startStep).start() let lastProgress: ProgressEvent = {step: startStep} let start = Date.now() const print = (progress: ProgressEvent) => { const elapsed = prettyMs(Date.now() - start) if (progress.current && progress.current > 0 && progress.total && progress.total > 0) { spinner.text = `${progress.step} (${progress.current}/${progress.total}) [${elapsed}]` } else { spinner.text = `${progress.step} [${elapsed}]` } } return { set: (progress: ProgressEvent) => { if (progress.step !== lastProgress.step) { print(lastProgress) // Print the last progress before moving on spinner.succeed() spinner = output.spinner(progress.step).start() start = Date.now() } else if (progress.step === lastProgress.step && progress.update) { print(progress) } lastProgress = progress }, update: (progress: ProgressEvent) => { print(progress) lastProgress = progress }, succeed: () => { spinner.succeed() start = Date.now() }, fail: () => { spinner.fail() start = Date.now() }, } } export default newProgress