graduate.js 2.36 KB
Newer Older
Christopher Chedeau's avatar
Christopher Chedeau committed
1
2
3
4
5
6
7
8
9
10
/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

var fs = require('fs');
Dan Abramov's avatar
Dan Abramov committed
11
var path = require('path');
Dan Abramov's avatar
Dan Abramov committed
12
var spawnSync = require('child_process').spawnSync;
Christopher Chedeau's avatar
Christopher Chedeau committed
13

Dan Abramov's avatar
Dan Abramov committed
14
console.log('Graduating...');
Dan Abramov's avatar
Dan Abramov committed
15
console.log();
Christopher Chedeau's avatar
Christopher Chedeau committed
16

Dan Abramov's avatar
Dan Abramov committed
17
18
var selfPath = path.join(__dirname, '..');
var hostPath = path.join(selfPath, '..', '..');
Christopher Chedeau's avatar
Christopher Chedeau committed
19
20
21

var files = [
  'scripts',
Dan Abramov's avatar
Dan Abramov committed
22
23
  'webpack.config.dev.js',
  'webpack.config.prod.js',
24
  '.eslintrc'
Christopher Chedeau's avatar
Christopher Chedeau committed
25
26
27
28
];

// Ensure that the host folder is clean and we won't override any files
files.forEach(function(file) {
Dan Abramov's avatar
Dan Abramov committed
29
  if (fs.existsSync(path.join(hostPath, file))) {
Christopher Chedeau's avatar
Christopher Chedeau committed
30
    console.error(
Dan Abramov's avatar
Dan Abramov committed
31
32
      '`' + file + '` already exists in your app folder. We cannot ' +
      'continue as you would lose all the changes in that file or directory. ' +
Christopher Chedeau's avatar
Christopher Chedeau committed
33
34
35
36
37
38
39
40
41
      'Please delete it (maybe make a copy for backup) and run this ' +
      'command again.'
    );
    process.exit(1);
  }
});

// Move the files over
files.forEach(function(file) {
Dan Abramov's avatar
Dan Abramov committed
42
43
  console.log('Moving ' + file + ' to ' + hostPath);
  fs.renameSync(path.join(selfPath, file), path.join(hostPath, file));
Christopher Chedeau's avatar
Christopher Chedeau committed
44
45
});

Dan Abramov's avatar
Dan Abramov committed
46
47
48
// These are unnecessary after graduation
fs.unlinkSync(path.join(hostPath, 'scripts', 'init.js'));
fs.unlinkSync(path.join(hostPath, 'scripts', 'graduate.js'));
Christopher Chedeau's avatar
Christopher Chedeau committed
49

Dan Abramov's avatar
Dan Abramov committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
console.log();

var selfPackage = require(path.join(selfPath, 'package.json'));
var hostPackage = require(path.join(hostPath, 'package.json'));

console.log('Removing dependency: create-react-app-scripts');
delete hostPackage.devDependencies['create-react-app-scripts'];

Object.keys(selfPackage.dependencies).forEach(function (key) {
  console.log('Adding dependency: ' + key);
  hostPackage.devDependencies[key] = selfPackage.dependencies[key];
});

console.log('Updating scripts');
Object.keys(hostPackage.scripts).forEach(function (key) {
  hostPackage.scripts[key] = 'node ./scripts/' + key + '.js'
});
delete hostPackage.scripts['graduate'];

Dan Abramov's avatar
Dan Abramov committed
69
console.log('Writing package.json');
Dan Abramov's avatar
Dan Abramov committed
70
71
72
73
fs.writeFileSync(
  path.join(hostPath, 'package.json'),
  JSON.stringify(hostPackage, null, 2)
);
Dan Abramov's avatar
Dan Abramov committed
74
console.log();
Dan Abramov's avatar
Dan Abramov committed
75

Dan Abramov's avatar
Dan Abramov committed
76
77
78
console.log('Running npm install...');
spawnSync('rm', ['-rf', selfPath]);
spawnSync('npm', ['install'], {stdio: 'inherit'});
Dan Abramov's avatar
Dan Abramov committed
79
console.log();
Dan Abramov's avatar
Dan Abramov committed
80

Christopher Chedeau's avatar
Christopher Chedeau committed
81
console.log('Done!');