react-native/local-cli/eject/eject.js
function eject() {

  const doesIOSExist = fs.existsSync(path.resolve('ios'));
  const doesAndroidExist = fs.existsSync(path.resolve('android'));
  if (doesIOSExist && doesAndroidExist) {
    console.error(
      'Both the iOS and Android folders already exist! Please delete `ios` and/or `android` ' +
      'before ejecting.'
    );
    process.exit(1);
  }

  let appConfig = null;
  try {
    appConfig = require(path.resolve('app.json'));
  } catch(e) {
    console.error(
      `Eject requires an \`app.json\` config file to be located at ` +
      `${path.resolve('app.json')}, and it must at least specify a \`name\` for the project ` +
      `name, and a \`displayName\` for the app's home screen label.`
    );
    process.exit(1);
  }

  const appName = appConfig.name;
  if (!appName) {
    console.error(
      `App \`name\` must be defined in the \`app.json\` config file to define the project name. `+
      `It must not contain any spaces or dashes.`
    );
    process.exit(1);
  }
  const displayName = appConfig.displayName;
  if (!displayName) {
    console.error(
      `App \`displayName\` must be defined in the \`app.json\` config file, to define the label ` +
      `of the app on the home screen.`
    );
    process.exit(1);
  }

  const templateOptions = { displayName };

  if (!doesIOSExist) {
    console.log('Generating the iOS folder.');
    copyProjectTemplateAndReplace(
      path.resolve('node_modules', 'react-native', 'local-cli', 'templates', 'HelloWorld', 'ios'),
      path.resolve('ios'),
      appName,
      templateOptions
    );
  }

  if (!doesAndroidExist) {
    console.log('Generating the Android folder.');
    copyProjectTemplateAndReplace(
      path.resolve('node_modules', 'react-native', 'local-cli', 'templates', 'HelloWorld', 'android'),
      path.resolve('android'),
      appName,
      templateOptions
    );
  }

}
function eject() {

  const doesIOSExist = fs.existsSync(path.resolve('ios'));
  const doesAndroidExist = fs.existsSync(path.resolve('android'));
  if (doesIOSExist && doesAndroidExist) {
    console.error(
      'Both the iOS and Android folders already exist! Please delete `ios` and/or `android` ' +
      'before ejecting.'
    );
    process.exit(1);
  }

  let appConfig = null;
  try {
    appConfig = require(path.resolve('app.json'));
  } catch(e) {
    console.error(
      `Eject requires an \`app.json\` config file to be located at ` +
      `${path.resolve('app.json')}, and it must at least specify a \`name\` for the project ` +
      `name, and a \`displayName\` for the app's home screen label.`
    );
    process.exit(1);
  }

  const appName = appConfig.name;
  if (!appName) {
    console.error(
      `App \`name\` must be defined in the \`app.json\` config file to define the project name. `+
      `It must not contain any spaces or dashes.`
    );
    process.exit(1);
  }
  const displayName = appConfig.displayName;
  if (!displayName) {
    console.error(
      `App \`displayName\` must be defined in the \`app.json\` config file, to define the label ` +
      `of the app on the home screen.`
    );
    process.exit(1);
  }

  const templateOptions = { displayName };

  if (!doesIOSExist) {
    console.log('Generating the iOS folder.');
    copyProjectTemplateAndReplace(
      path.resolve('node_modules', 'react-native', 'local-cli', 'templates', 'HelloWorld', 'ios'),
      path.resolve('ios'),
      appName,
      templateOptions
    );
  }

  if (!doesAndroidExist) {
    console.log('Generating the Android folder.');
    copyProjectTemplateAndReplace(
      path.resolve('node_modules', 'react-native', 'local-cli', 'templates', 'HelloWorld', 'android'),
      path.resolve('android'),
      appName,
      templateOptions
    );
  }

}
function eject ( ) { const doesIOSExist = fs . existsSync ( path . resolve ( 'ios' ) ) ; const doesAndroidExist = fs . existsSync ( path . resolve ( 'android' ) ) ; if ( doesIOSExist && doesAndroidExist ) { console . error ( 'Both the iOS and Android folders already exist! Please delete `ios` and/or `android` ' + 'before ejecting.' ) ; process . exit ( 1 ) ; } let appConfig = null ; try { appConfig = require ( path . resolve ( 'app.json' ) ) ; } catch ( e ) { console . error ( ` \` \` ` + ` ${ path . resolve ( 'app.json' ) } \` \` ` + ` \` \` ` ) ; process . exit ( 1 ) ; } const appName = appConfig . name ; if ( ! appName ) { console . error ( ` \` \` \` \` ` + ` ` ) ; process . exit ( 1 ) ; } const displayName = appConfig . displayName ; if ( ! displayName ) { console . error ( ` \` \` \` \` ` + ` ` ) ; process . exit ( 1 ) ; } const templateOptions = { displayName } ; if ( ! doesIOSExist ) { console . log ( 'Generating the iOS folder.' ) ; copyProjectTemplateAndReplace ( path . resolve ( 'node_modules' , 'react-native' , 'local-cli' , 'templates' , 'HelloWorld' , 'ios' ) , path . resolve ( 'ios' ) , appName , templateOptions ) ; } if ( ! doesAndroidExist ) { console . log ( 'Generating the Android folder.' ) ; copyProjectTemplateAndReplace ( path . resolve ( 'node_modules' , 'react-native' , 'local-cli' , 'templates' , 'HelloWorld' , 'android' ) , path . resolve ( 'android' ) , appName , templateOptions ) ; } }
The eject command re-creates the `android` and `ios` native folders. Because native code can be
difficult to maintain, this new script allows an `app.json` to be defined for the project, which
is used to configure the native app.

The `app.json` config may contain the following keys:

- `name` - The short name used for the project, should be TitleCase
- `displayName` - The app's name on the home screen
The eject command re - creates the android and ios native folders . Because native code can be difficult to maintain this new script allows an app . json to be defined for the project which is used to configure the native app .