john-test-upgrade
Version:
Upgrade tool for Babel
297 lines (240 loc) • 8.47 kB
JavaScript
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }
var globby = require('globby');
var path = require('path');
var readPkgUp = require('read-pkg-up');
var sortKeys = require('sort-keys');
var fs = require('fs');
var pify = require('pify');
var JSON5 = require('json5');
var writeJsonFile = require('write-json-file');
var semver = require('semver');
var writeFile = require('write');
var upgradeDeps = require('./upgradeDeps');
var upgradeConfig = require('./upgradeConfig');
var installDeps = require('./installDeps');
function isAcceptedNodeVersion() {
return semver.satisfies(process.version, '>= 4');
}
function getLatestVersion() {
return "7.0.0-beta.39";
}
function replaceMocha(str) {
return str.replace('--compilers js:babel-core/register', '--compilers js:@babel/register').replace('--compilers js:babel-register', '--compilers js:@babel/register').replace('--require babel-register', '--require @babel/register').replace('--require babel-polyfill', '--require @babel/polyfill');
}
function upgradeScripts(scripts) {
var _arr = Object.keys(scripts);
for (var _i = 0; _i < _arr.length; _i++) {
var script = _arr[_i];
scripts[script] = replaceMocha(scripts[script]);
}
return scripts;
}
function updatePackageJSON(_x) {
return _updatePackageJSON.apply(this, arguments);
}
function _updatePackageJSON() {
_updatePackageJSON = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee(pkg) {
var flowConfigs, upgradeDepOptions, devDeps;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (process.env.NODE_ENV !== 'test') {
console.log("Updating closest package.json dependencies");
}
if (!pkg) {
console.log("package.json not found");
process.exit(1);
}
if (pkg.scripts) {
pkg.scripts = upgradeScripts(pkg.scripts);
if (Object.values(pkg.scripts).some(function (s) {
return s.includes('babel-node');
})) {
if (pkg.devDependencies) {
pkg.devDependencies["@babel/node"] = getLatestVersion();
}
}
}
_context.next = 5;
return globby(['**/.flowconfig', '!./node_modules/**']);
case 5:
flowConfigs = _context.sent;
upgradeDepOptions = {
hasFlow: flowConfigs.length > 0
};
if (pkg.devDependencies) {
pkg.devDependencies = upgradeDeps(pkg.devDependencies, getLatestVersion(), upgradeDepOptions);
devDeps = Object.keys(pkg.devDependencies); // use babel-bridge for jest
// maybe should do this for other tools?
if (devDeps.includes("jest") && !devDeps.includes("babel-core")) {
pkg.devDependencies["babel-core"] = "^7.0.0-bridge.0";
}
pkg.devDependencies = sortKeys(pkg.devDependencies);
}
if (pkg.dependencies) {
pkg.dependencies = sortKeys(upgradeDeps(pkg.dependencies, getLatestVersion(), upgradeDepOptions));
}
return _context.abrupt("return", pkg);
case 10:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return _updatePackageJSON.apply(this, arguments);
}
function writePackageJSON() {
return _writePackageJSON.apply(this, arguments);
}
function _writePackageJSON() {
_writePackageJSON = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee2() {
var _ref, pkg, path;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return readPkgUp({
normalize: false
});
case 2:
_ref = _context2.sent;
pkg = _ref.pkg;
path = _ref.path;
_context2.next = 7;
return updatePackageJSON(pkg);
case 7:
pkg = _context2.sent;
if (pkg.babel) {
console.log("Updating package.json 'babel' config");
pkg.babel = upgradeConfig(pkg.babel);
}
_context2.next = 11;
return writeJsonFile(path, pkg, {
detectIndent: true
});
case 11:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return _writePackageJSON.apply(this, arguments);
}
function readBabelRC(_x2) {
return _readBabelRC.apply(this, arguments);
}
function _readBabelRC() {
_readBabelRC = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee3(configPath) {
var rawFile;
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
_context3.next = 3;
return pify(fs.readFile)(configPath);
case 3:
rawFile = _context3.sent.toString('utf8');
return _context3.abrupt("return", JSON5.parse(rawFile));
case 7:
_context3.prev = 7;
_context3.t0 = _context3["catch"](0);
throw new Error(`babel-upgrade: ${configPath} does not contain a valid .babelrc file. ${_context3.t0.stack}`);
case 10:
case "end":
return _context3.stop();
}
}
}, _callee3, this, [[0, 7]]);
}));
return _readBabelRC.apply(this, arguments);
}
function writeBabelRC(_x3) {
return _writeBabelRC.apply(this, arguments);
}
function _writeBabelRC() {
_writeBabelRC = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee4(configPath) {
var json;
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.prev = 0;
_context4.next = 3;
return readBabelRC(configPath);
case 3:
json = _context4.sent;
_context4.next = 8;
break;
case 6:
_context4.prev = 6;
_context4.t0 = _context4["catch"](0);
case 8:
if (!json) {
_context4.next = 13;
break;
}
console.log(`Updating .babelrc config at ${configPath}`);
json = upgradeConfig(json);
_context4.next = 13;
return writeJsonFile(configPath, json, {
detectIndent: true
});
case 13:
case "end":
return _context4.stop();
}
}
}, _callee4, this, [[0, 6]]);
}));
return _writeBabelRC.apply(this, arguments);
}
function writeMochaOpts(_x4) {
return _writeMochaOpts.apply(this, arguments);
}
function _writeMochaOpts() {
_writeMochaOpts = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee5(configPath) {
var rawFile;
return regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return pify(fs.readFile)(configPath);
case 2:
rawFile = _context5.sent.toString('utf8');
_context5.next = 5;
return writeFile(configPath, replaceMocha(rawFile));
case 5:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
return _writeMochaOpts.apply(this, arguments);
}
module.exports = {
isAcceptedNodeVersion,
updatePackageJSON,
writePackageJSON,
readBabelRC,
writeBabelRC,
getLatestVersion,
writeMochaOpts,
installDeps
};