react-static
Version:
A progressive static site generator for React
54 lines (51 loc) • 1.51 kB
JavaScript
import Progress from 'progress'
export default (total, label, options) => {
if (!options) {
options = {}
}
if (!options.format) {
options.format = `${
label ? `${label} ` : ''
}[:bar] :current/:total :percent :rate/s :etas `
}
const stream = options.stream || process.stdout
if (stream.isTTY && !options.forceNonTTY) {
options.total = total
return new Progress(options.format, options)
}
let curr = 0
let percent = 0
const start = new Date()
return {
tick: () => {
curr += 1
const ratio = Math.min(Math.max(curr / total, 0), 1)
const value = Math.floor(ratio * 100)
if (value >= percent + 5) {
percent = value
const elapsed = new Date() - start
const eta = percent === 100 ? 0 : elapsed * (total / curr - 1)
const rate = curr / (elapsed / 1000)
stream.write(
`${options.format
.replace('[:bar] ', '')
.replace('[:bar]', '')
.replace(':current', curr)
.replace(':total', total)
.replace(
':elapsed',
Number.isNaN(elapsed) ? '0.0' : (elapsed / 1000).toFixed(1)
)
.replace(
':eta',
Number.isNaN(eta) || !Number.isFinite(eta)
? '0.0'
: (eta / 1000).toFixed(1)
)
.replace(':percent', `${percent.toFixed(0)}%`)
.replace(':rate', Math.round(rate))}\n`
)
}
},
}
}