18d307f52SEvan Baconimport ProgressBar from 'progress'; 28d307f52SEvan Bacon 38d307f52SEvan Baconlet currentProgress: ProgressBar | null = null; 48d307f52SEvan Bacon 58d307f52SEvan Baconexport function setProgressBar(bar: ProgressBar | null): void { 68d307f52SEvan Bacon currentProgress = bar; 78d307f52SEvan Bacon} 88d307f52SEvan Bacon 98d307f52SEvan Baconexport function getProgressBar(): ProgressBar | null { 108d307f52SEvan Bacon return currentProgress; 118d307f52SEvan Bacon} 12*53b4c0b0SEvan Bacon 13*53b4c0b0SEvan Baconexport function createProgressBar(barFormat: string, options: ProgressBar.ProgressBarOptions) { 14*53b4c0b0SEvan Bacon if (process.stderr.clearLine == null) { 15*53b4c0b0SEvan Bacon return null; 16*53b4c0b0SEvan Bacon } 17*53b4c0b0SEvan Bacon 18*53b4c0b0SEvan Bacon const bar = new ProgressBar(barFormat, options); 19*53b4c0b0SEvan Bacon 20*53b4c0b0SEvan Bacon const logReal = console.log; 21*53b4c0b0SEvan Bacon const infoReal = console.info; 22*53b4c0b0SEvan Bacon const warnReal = console.warn; 23*53b4c0b0SEvan Bacon const errorReal = console.error; 24*53b4c0b0SEvan Bacon 25*53b4c0b0SEvan Bacon const wrapNativeLogs = (): void => { 26*53b4c0b0SEvan Bacon // @ts-expect-error 27*53b4c0b0SEvan Bacon console.log = (...args: any) => bar.interrupt(...args); 28*53b4c0b0SEvan Bacon // @ts-expect-error 29*53b4c0b0SEvan Bacon console.info = (...args: any) => bar.interrupt(...args); 30*53b4c0b0SEvan Bacon // @ts-expect-error 31*53b4c0b0SEvan Bacon console.warn = (...args: any) => bar.interrupt(...args); 32*53b4c0b0SEvan Bacon // @ts-expect-error 33*53b4c0b0SEvan Bacon console.error = (...args: any) => bar.interrupt(...args); 34*53b4c0b0SEvan Bacon }; 35*53b4c0b0SEvan Bacon 36*53b4c0b0SEvan Bacon const resetNativeLogs = (): void => { 37*53b4c0b0SEvan Bacon console.log = logReal; 38*53b4c0b0SEvan Bacon console.info = infoReal; 39*53b4c0b0SEvan Bacon console.warn = warnReal; 40*53b4c0b0SEvan Bacon console.error = errorReal; 41*53b4c0b0SEvan Bacon }; 42*53b4c0b0SEvan Bacon 43*53b4c0b0SEvan Bacon const originalTerminate = bar.terminate.bind(bar); 44*53b4c0b0SEvan Bacon bar.terminate = () => { 45*53b4c0b0SEvan Bacon resetNativeLogs(); 46*53b4c0b0SEvan Bacon setProgressBar(null); 47*53b4c0b0SEvan Bacon originalTerminate(); 48*53b4c0b0SEvan Bacon }; 49*53b4c0b0SEvan Bacon 50*53b4c0b0SEvan Bacon wrapNativeLogs(); 51*53b4c0b0SEvan Bacon setProgressBar(bar); 52*53b4c0b0SEvan Bacon return bar; 53*53b4c0b0SEvan Bacon} 54