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