xref: /expo/packages/create-expo/src/utils/log.ts (revision b7d15820)
1import ora, { Ora } from 'ora';
2
3import { env } from './env';
4
5export function withSectionLog<T>(
6  action: (spinner: Ora) => Promise<T>,
7  message: {
8    pending: string;
9    success: string;
10    error: (errror: Error) => string;
11  }
12) {
13  const disabled = env.CI || env.EXPO_DEBUG;
14  const spinner = ora({
15    text: message.pending,
16    // Ensure our non-interactive mode emulates CI mode.
17    isEnabled: !disabled,
18    // In non-interactive mode, send the stream to stdout so it prevents looking like an error.
19    stream: disabled ? process.stdout : process.stderr,
20  });
21
22  spinner.start();
23
24  return action(spinner).then(
25    (result) => {
26      spinner.succeed(message.success);
27      return result;
28    },
29    (error) => {
30      spinner.fail(message.error(error));
31      throw error;
32    }
33  );
34}
35