xref: /expo/packages/@expo/cli/src/utils/progress.ts (revision 53b4c0b0)
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