react-native-scripts
Version:
Configuration and scripts for Create React Native App.
233 lines (171 loc) • 8.43 kB
JavaScript
;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _fsPromise = require('fs-promise');
var _fsPromise2 = _interopRequireDefault(_fsPromise);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _pathExists = require('path-exists');
var _pathExists2 = _interopRequireDefault(_pathExists);
var _crossSpawn = require('cross-spawn');
var _crossSpawn2 = _interopRequireDefault(_crossSpawn);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// UPDATE DEPENDENCY VERSIONS HERE
var DEFAULT_DEPENDENCIES = {
expo: '^15.1.0',
react: '~15.4.0',
'react-native': '0.42.3'
};
// TODO figure out how this interacts with ejection
var DEFAULT_DEV_DEPENDENCIES = {
'jest-expo': '^0.3.0',
'react-test-renderer': '~15.4.1'
};
module.exports = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(appPath, appName, verbose) {
var cwd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
var ownPackageName, ownPath, useYarn, readmeExists, appPackagePath, appPackage, data, command, args, proc;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
ownPackageName = require('../../package.json').name;
ownPath = _path2.default.join(appPath, 'node_modules', ownPackageName);
_context.next = 4;
return (0, _pathExists2.default)(_path2.default.join(appPath, 'yarn.lock'));
case 4:
useYarn = _context.sent;
_context.next = 7;
return (0, _pathExists2.default)(_path2.default.join(appPath, 'README.md'));
case 7:
readmeExists = _context.sent;
if (!readmeExists) {
_context.next = 11;
break;
}
_context.next = 11;
return _fsPromise2.default.rename(_path2.default.join(appPath, 'README.md'), _path2.default.join(appPath, 'README.old.md'));
case 11:
appPackagePath = _path2.default.join(appPath, 'package.json');
_context.t0 = JSON;
_context.next = 15;
return _fsPromise2.default.readFile(appPackagePath);
case 15:
_context.t1 = _context.sent;
appPackage = _context.t0.parse.call(_context.t0, _context.t1);
// mutate the default package.json in any ways we need to
appPackage.main = './node_modules/react-native-scripts/build/bin/crna-entry.js';
appPackage.scripts = {
start: 'react-native-scripts start',
eject: 'react-native-scripts eject',
android: 'react-native-scripts android',
ios: 'react-native-scripts ios',
test: 'node node_modules/jest/bin/jest.js --watch'
};
appPackage.jest = {
preset: 'jest-expo'
};
if (!appPackage.dependencies) {
appPackage.dependencies = {};
}
if (!appPackage.devDependencies) {
appPackage.devDependencies = {};
}
// react-native-scripts is already in the package.json devDependencies
// so we need to merge instead of assigning
(0, _assign2.default)(appPackage.dependencies, DEFAULT_DEPENDENCIES);
(0, _assign2.default)(appPackage.devDependencies, DEFAULT_DEV_DEPENDENCIES);
// Write the new appPackage after copying so that we can include any existing
_context.next = 26;
return _fsPromise2.default.writeFile(appPackagePath, (0, _stringify2.default)(appPackage, null, 2));
case 26:
_context.next = 28;
return _fsPromise2.default.copy(_path2.default.join(ownPath, 'template'), appPath);
case 28:
_context.prev = 28;
_context.next = 31;
return _fsPromise2.default.rename(_path2.default.join(appPath, 'gitignore'), _path2.default.join(appPath, '.gitignore'));
case 31:
_context.next = 46;
break;
case 33:
_context.prev = 33;
_context.t2 = _context['catch'](28);
if (!(_context.t2.code === 'EEXIST')) {
_context.next = 45;
break;
}
_context.next = 38;
return _fsPromise2.default.readFile(_path2.default.join(appPath, 'gitignore'));
case 38:
data = _context.sent;
_context.next = 41;
return _fsPromise2.default.appendFile(_path2.default.join(appPath, '.gitignore'), data);
case 41:
_context.next = 43;
return _fsPromise2.default.unlink(_path2.default.join(appPath, 'gitignore'));
case 43:
_context.next = 46;
break;
case 45:
throw _context.t2;
case 46:
// Run yarn or npm
command = '';
args = [];
if (useYarn) {
command = 'yarnpkg';
} else {
command = 'npm';
args = ['install', '--save'];
if (verbose) {
args.push('--verbose');
}
}
console.log('Installing dependencies using ' + command + '...');
console.log();
if (command === 'yarnpkg') {
// it's weird to print a yarn alias that no one uses
command = 'yarn';
}
proc = (0, _crossSpawn2.default)(command, args, { stdio: 'inherit' });
proc.on('close', function (code) {
if (code !== 0) {
console.error('`' + command + ' ' + args.join(' ') + '` failed');
return;
}
// display the cleanest way to get to the app dir
// if the cwd + appName is equal to the full path, then just cd into appName
var cdpath = void 0;
if (_path2.default.resolve(cwd, appName) === appPath) {
cdpath = appName;
} else {
cdpath = appPath;
}
console.log('\n\nSuccess! Created ' + appName + ' at ' + appPath + '\nInside that directory, you can run several commands:\n\n ' + _chalk2.default.cyan(command + ' start') + '\n Starts the development server so you can open your app in the Expo\n app on your phone.\n\n ' + _chalk2.default.cyan(command + ' run ios') + '\n (Mac only, requires Xcode)\n Starts the development server and loads your app in an iOS simulator.\n\n ' + _chalk2.default.cyan(command + ' run android') + '\n (Requires Android build tools)\n Starts the development server and loads your app on a connected Android\n device or emulator.\n\n ' + _chalk2.default.cyan(command + ' test') + '\n Starts the test runner.\n\n ' + _chalk2.default.cyan(command + ' run eject') + '\n Removes this tool and copies build dependencies, configuration files\n and scripts into the app directory. If you do this, you can\u2019t go back!\n\nWe suggest that you begin by typing:\n\n ' + _chalk2.default.cyan('cd ' + cdpath) + '\n ' + _chalk2.default.cyan(command + ' start'));
if (readmeExists) {
console.log('\n' + _chalk2.default.yellow('You had a `README.md` file, we renamed it to `README.old.md`'));
}
console.log();
console.log('Happy hacking!');
});
case 54:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[28, 33]]);
}));
return function (_x, _x2, _x3) {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=init.js.map