docs: function copyProjectTemplateAndReplace(srcPath, destPath, newProjectName, options) {
    if (!srcPath) { throw new Error('Need a path to copy from'); }
    if (!destPath) { throw new Error('Need a path to copy to'); }
    if (!newProjectName) { throw new Error('Need a project name'); }
  
    options = options || {};
  
    walk(srcPath).forEach(absoluteSrcFilePath => {
  
      // 'react-native upgrade'
      if (options.upgrade) {
        // Don't upgrade these files
        const fileName = path.basename(absoluteSrcFilePath);
        // This also includes __tests__/index.*.js
        if (fileName === 'index.ios.js') { return; }
        if (fileName === 'index.android.js') { return; }
      }
  
      const relativeFilePath = path.relative(srcPath, absoluteSrcFilePath);
      const relativeRenamedPath = dotFilePath(relativeFilePath)
        .replace(/HelloWorld/g, newProjectName)
        .replace(/helloworld/g, newProjectName.toLowerCase());
  
      let contentChangedCallback = null;
      if (options.upgrade && (!options.force)) {
        contentChangedCallback = (_, contentChanged) => {
          return upgradeFileContentChangedCallback(
            absoluteSrcFilePath,
            relativeRenamedPath,
            contentChanged,
          );
        };
      }
      copyAndReplace(
        absoluteSrcFilePath,
        path.resolve(destPath, relativeRenamedPath),
        {
          'Hello App Display Name': options.displayName || newProjectName,
          'HelloWorld': newProjectName,
          'helloworld': newProjectName.toLowerCase(),
        },
        contentChangedCallback,
      );
    });
  }