1import ProgressBar from 'progress'; 2 3let currentProgress: ProgressBar | null = null; 4 5export function setProgressBar(bar: ProgressBar | null): void { 6 currentProgress = bar; 7} 8 9export function getProgressBar(): ProgressBar | null { 10 return currentProgress; 11} 12 13export function createProgressBar(barFormat: string, options: ProgressBar.ProgressBarOptions) { 14 if (process.stderr.clearLine == null) { 15 return null; 16 } 17 18 const bar = new ProgressBar(barFormat, options); 19 20 const logReal = console.log; 21 const infoReal = console.info; 22 const warnReal = console.warn; 23 const errorReal = console.error; 24 25 const wrapNativeLogs = (): void => { 26 // @ts-expect-error 27 console.log = (...args: any) => bar.interrupt(...args); 28 // @ts-expect-error 29 console.info = (...args: any) => bar.interrupt(...args); 30 // @ts-expect-error 31 console.warn = (...args: any) => bar.interrupt(...args); 32 // @ts-expect-error 33 console.error = (...args: any) => bar.interrupt(...args); 34 }; 35 36 const resetNativeLogs = (): void => { 37 console.log = logReal; 38 console.info = infoReal; 39 console.warn = warnReal; 40 console.error = errorReal; 41 }; 42 43 const originalTerminate = bar.terminate.bind(bar); 44 bar.terminate = () => { 45 resetNativeLogs(); 46 setProgressBar(null); 47 originalTerminate(); 48 }; 49 50 wrapNativeLogs(); 51 setProgressBar(bar); 52 return bar; 53} 54