18d307f52SEvan Baconimport { ExpoConfig, modifyConfigAsync } from '@expo/config';
28d307f52SEvan Baconimport chalk from 'chalk';
38d307f52SEvan Bacon
48d307f52SEvan Baconimport { SilentError } from './errors';
5*8a424bebSJames Ideimport * as Log from '../log';
68d307f52SEvan Bacon
78d307f52SEvan Bacon/** Wraps `[@expo/config] modifyConfigAsync()` and adds additional logging. */
88d307f52SEvan Baconexport async function attemptModification(
98d307f52SEvan Bacon  projectRoot: string,
108d307f52SEvan Bacon  edits: Partial<ExpoConfig>,
118d307f52SEvan Bacon  exactEdits: Partial<ExpoConfig>
128d307f52SEvan Bacon): Promise<void> {
138d307f52SEvan Bacon  const modification = await modifyConfigAsync(projectRoot, edits, {
148d307f52SEvan Bacon    skipSDKVersionRequirement: true,
158d307f52SEvan Bacon  });
168d307f52SEvan Bacon  if (modification.type === 'success') {
178d307f52SEvan Bacon    Log.log();
188d307f52SEvan Bacon  } else {
198d307f52SEvan Bacon    warnAboutConfigAndThrow(modification.type, modification.message!, exactEdits);
208d307f52SEvan Bacon  }
218d307f52SEvan Bacon}
228d307f52SEvan Bacon
238d307f52SEvan Baconfunction logNoConfig() {
248d307f52SEvan Bacon  Log.log(
258d307f52SEvan Bacon    chalk.yellow(
268d307f52SEvan Bacon      `No Expo config was found. Please create an Expo config (${chalk.bold`app.json`} or ${chalk.bold`app.config.js`}) in your project root.`
278d307f52SEvan Bacon    )
288d307f52SEvan Bacon  );
298d307f52SEvan Bacon}
308d307f52SEvan Bacon
3109bb6093SEvan Baconexport function warnAboutConfigAndThrow(type: string, message: string, edits: Partial<ExpoConfig>) {
328d307f52SEvan Bacon  Log.log();
338d307f52SEvan Bacon  if (type === 'warn') {
348d307f52SEvan Bacon    // The project is using a dynamic config, give the user a helpful log and bail out.
358d307f52SEvan Bacon    Log.log(chalk.yellow(message));
368d307f52SEvan Bacon  } else {
378d307f52SEvan Bacon    logNoConfig();
388d307f52SEvan Bacon  }
398d307f52SEvan Bacon
408d307f52SEvan Bacon  notifyAboutManualConfigEdits(edits);
418d307f52SEvan Bacon  throw new SilentError();
428d307f52SEvan Bacon}
438d307f52SEvan Bacon
448d307f52SEvan Baconfunction notifyAboutManualConfigEdits(edits: Partial<ExpoConfig>) {
458d307f52SEvan Bacon  Log.log(chalk.cyan(`Please add the following to your Expo config`));
468d307f52SEvan Bacon  Log.log();
478d307f52SEvan Bacon  Log.log(JSON.stringify(edits, null, 2));
488d307f52SEvan Bacon  Log.log();
498d307f52SEvan Bacon}
50