UNPKG

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
'use strict'; 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() }); }