graduate.js 2.2 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');
Christopher Chedeau's avatar
Christopher Chedeau committed
12
13

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

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

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

// 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
69
70
71
72
73
74
75
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'];

console.log('Writing package.json...');
fs.writeFileSync(
  path.join(hostPath, 'package.json'),
  JSON.stringify(hostPackage, null, 2)
);

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