text: /**
   * Copyright (c) 2014-present, Facebook, Inc.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   */
  'use strict';
  
  // Based on similar script in Jest
  // https://github.com/facebook/jest/blob/master/scripts/prettier.js
  
  const chalk = require('chalk');
  const glob = require('glob');
  const execFileSync = require('child_process').execFileSync;
  const prettier = require('prettier');
  const fs = require('fs');
  
  const mode = process.argv[2] || 'check';
  const shouldWrite = mode === 'write' || mode === 'write-changed';
  const onlyChanged = mode === 'check-changed' || mode === 'write-changed';
  
  const defaultOptions = {
    bracketSpacing: false,
    singleQuote: true,
    jsxBracketSameLine: true,
    trailingComma: 'all',
    printWidth: 80,
  };
  const config = {
    default: {
      patterns: [
        // Internal forwarding modules
        'packages/*/*.js',
        // Source files
        'packages/*/src/**/*.js',
        'packages/shared/**/*.js',
      ],
      ignore: ['**/node_modules/**'],
    },
    scripts: {
      patterns: [
        // Forwarding modules that get published to npm (must be ES5)
        'packages/*/npm/**/*.js',
        // Need to work on Node
        'scripts/**/*.js',
        'fixtures/**/*.js',
      ],
      ignore: [
        '**/node_modules/**',
        // Built files and React repo clone
        'scripts/bench/benchmarks/**',
      ],
      options: {
        trailingComma: 'es5',
      },
    },
  };
  
  function exec(command, args) {
    console.log('> ' + [command].concat(args).join(' '));
    var options = {
      cwd: process.cwd(),
      env: process.env,
      stdio: 'pipe',
      encoding: 'utf-8',
    };
    return execFileSync(command, args, options);
  }
  
  var mergeBase = exec('git', ['merge-base', 'HEAD', 'master']).trim();
  var changedFiles = new Set(
    exec('git', [
      'diff',
      '-z',
      '--name-only',
      '--diff-filter=ACMRTUB',
      mergeBase,
    ]).match(/[^\0]+/g)
  );
  
  let didWarn = false;
  let didError = false;
  Object.keys(config).forEach(key => {
    const patterns = config[key].patterns;
    const options = config[key].options;
    const ignore = config[key].ignore;
  
    const globPattern =
      patterns.length > 1 ? `{${patterns.join(',')}}` : `${patterns.join(',')}`;
    const files = glob
      .sync(globPattern, {ignore})
      .filter(f => !onlyChanged || changedFiles.has(f));
  
    if (!files.length) {
      return;
    }
  
    const args = Object.assign({}, defaultOptions, options);
    files.forEach(file => {
      try {
        const input = fs.readFileSync(file, 'utf8');
        if (shouldWrite) {
          const output = prettier.format(input, args);
          if (output !== input) {
            fs.writeFileSync(file, output, 'utf8');
          }
        } else {
          if (!prettier.check(input, args)) {
            if (!didWarn) {
              console.log(
                '\n' +
                  chalk.red(
                    `  This project uses prettier to format all JavaScript code.\n`
                  ) +
                  chalk.dim(`    Please run `) +
                  chalk.reset('yarn prettier-all') +
                  chalk.dim(
                    ` and add changes to files listed below to your commit:`
                  ) +
                  `\n\n`
              );
              didWarn = true;
            }
            console.log(file);
          }
        }
      } catch (error) {
        didError = true;
        console.log('\n\n' + error.message);
        console.log(file);
      }
    });
  });
  
  if (didWarn || didError) {
    process.exit(1);
  }
  