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