smooth-release
Version:
Smart CLI tool to safely and automatically do every step to release a new version of a library hosted on GitHub and published on npm
248 lines (188 loc) • 7.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.rl = exports.github = exports.octokat = exports.getGithubOwnerAndRepo = exports.getPackageJsonScripts = exports.getPackageJsonFiles = exports.getPackageJsonVersion = exports.getPackageJsonName = exports.getRootFolderPath = exports.isVersionTag = exports.getCurrentBranch = exports.onError = exports.SmoothReleaseError = exports.exec = exports.status = exports.bold = exports.emptyLine = exports.title = exports.error = exports.warning = exports.info = exports.log = undefined;
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
exports.checkForUpdates = checkForUpdates;
var _child_process = require('child_process');
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _elegantStatus = require('elegant-status');
var _elegantStatus2 = _interopRequireDefault(_elegantStatus);
var _octokat = require('octokat');
var _octokat2 = _interopRequireDefault(_octokat);
var _betterConsole = require('better-console');
var _betterConsole2 = _interopRequireDefault(_betterConsole);
var _cliColor = require('cli-color');
var _cliColor2 = _interopRequireDefault(_cliColor);
var _inquirer = require('inquirer');
var _inquirer2 = _interopRequireDefault(_inquirer);
var _lodash = require('lodash');
var _errorEx = require('error-ex');
var _errorEx2 = _interopRequireDefault(_errorEx);
var _updateNotifier = require('update-notifier');
var _updateNotifier2 = _interopRequireDefault(_updateNotifier);
var _package = require('../package.json');
var _package2 = _interopRequireDefault(_package);
var _config = require('./config');
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// LOGS
var log = exports.log = _betterConsole2.default.log;
var info = exports.info = _betterConsole2.default.info;
var warning = exports.warning = _betterConsole2.default.warn;
var error = exports.error = _betterConsole2.default.error;
var title = exports.title = function title(_title) {
return warning('\n' + _title.toUpperCase() + '\n' + _title.split('').map(function () {
return '-';
}).join('') + '\n');
};
var emptyLine = exports.emptyLine = function emptyLine() {
return log('');
};
// LOGS MODIFIERS
var bold = exports.bold = _cliColor2.default.bold;
// STATUS
var Status = function Status() {
var steps = null;
var done = null;
var runNextStep = function runNextStep() {
if (steps.length > 0) {
done = (0, _elegantStatus2.default)(steps.shift());
}
};
return {
addSteps: function addSteps(newSteps) {
!done && steps && emptyLine();
steps = (steps || []).concat(newSteps.filter(function (x) {
return x;
}));
!done && runNextStep(); // if idle run first step in the list
},
doneStep: function doneStep(res) {
done(res);
done = null;
runNextStep();
},
stop: function stop() {
steps = [];
done && done(false);
}
};
};
var status = exports.status = Status();
// EXEC INTERFACE
var exec = exports.exec = function exec(command, settings) {
return new _promise2.default(function (resolve, reject) {
(0, _child_process.exec)(command, settings, function (error, stdout) {
if (error) {
reject(error);
} else {
resolve(stdout);
}
});
});
};
// CUSTOM ERROR
var SmoothReleaseError = exports.SmoothReleaseError = (0, _errorEx2.default)('SmoothReleaseError');
var onError = exports.onError = function onError(e) {
status.stop();
if (e instanceof SmoothReleaseError) {
error('\nError: ' + e.message + '\n');
} else {
error('\n', e.stack);
}
process.exit(1);
};
// UTILS
var getCurrentBranch = exports.getCurrentBranch = function getCurrentBranch() {
return (0, _child_process.execSync)('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim();
};
var isVersionTag = exports.isVersionTag = function isVersionTag(tag) {
return (0, _lodash.startsWith)(tag.name, 'v') && (0, _lodash.every)(tag.name.slice(1).split('.'), function (s) {
return typeof parseInt(s) === 'number';
});
};
var getRootFolderPath = exports.getRootFolderPath = function getRootFolderPath() {
return (0, _child_process.execSync)('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
};
var getPackageJson = function getPackageJson() {
return JSON.parse(_fs2.default.readFileSync(getRootFolderPath() + '/package.json'));
};
var getPackageJsonName = exports.getPackageJsonName = function getPackageJsonName() {
return getPackageJson().name;
};
var getPackageJsonVersion = exports.getPackageJsonVersion = function getPackageJsonVersion() {
return getPackageJson().version;
};
var getPackageJsonFiles = exports.getPackageJsonFiles = function getPackageJsonFiles() {
return getPackageJson().files;
};
var getPackageJsonScripts = exports.getPackageJsonScripts = function getPackageJsonScripts() {
return getPackageJson().scripts;
};
var hasBeenInstalledGlobally = function hasBeenInstalledGlobally() {
var npmRoot = (0, _child_process.execSync)('npm root -g', { encoding: 'utf8' }).trim();
return __dirname === npmRoot + '/smooth-release/lib';
};
// OCTOKAT
var getGithubOwnerAndRepo = exports.getGithubOwnerAndRepo = function getGithubOwnerAndRepo() {
var remoteOriginUrl = (0, _child_process.execSync)('git config --get remote.origin.url', {
encoding: 'utf8'
}).trim().replace('.git', '');
var _remoteOriginUrl$slic = remoteOriginUrl.slice((0, _lodash.startsWith)(remoteOriginUrl, 'https') ? 19 : 15, remoteOriginUrl.length).split('/'),
_remoteOriginUrl$slic2 = (0, _slicedToArray3.default)(_remoteOriginUrl$slic, 2),
owner = _remoteOriginUrl$slic2[0],
repo = _remoteOriginUrl$slic2[1];
return { owner: owner, repo: repo };
};
var octokat = exports.octokat = new _octokat2.default({ token: _config2.default.github.token });
var _getGithubOwnerAndRep = getGithubOwnerAndRepo(),
owner = _getGithubOwnerAndRep.owner,
repo = _getGithubOwnerAndRep.repo;
var github = exports.github = octokat.repos(owner + '/' + repo);
// RL INTERFACE
function rlinterface() {
return {
question: function question(message, defaultInput) {
return new _promise2.default(function (resolve) {
var question = {
message: message,
name: Date.now(),
type: 'input',
default: defaultInput || null
};
_inquirer2.default.prompt([question], function (a) {
return resolve(a[question.name]);
});
});
},
confirmation: function confirmation(message, defaultInput) {
return new _promise2.default(function (resolve) {
var question = {
message: message + ' (y/n)',
name: Date.now(),
type: 'input',
default: defaultInput || 'n'
};
_inquirer2.default.prompt([question], function (a) {
return resolve(a[question.name] === 'y');
});
});
}
};
}
var rl = exports.rl = rlinterface();
// UPDATE NOTIFIER
function checkForUpdates() {
var notifier = (0, _updateNotifier2.default)({
pkg: _package2.default
});
notifier.notify({
isGlobal: hasBeenInstalledGlobally()
});
}