UNPKG

cz-conventional-changelog-befe

Version:
363 lines (301 loc) 13.1 kB
'use strict'; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var wrap = require('word-wrap'); var inquirerStore = require('inquirer-store'); var FileStore = require('inquirer-store/FileStore'); var fuzzy = require('fuzzy'); var autoComplete = require('@moyuyc/inquirer-autocomplete-prompt'); var nps = require('path'); var minimist = require('minimist'); var omit = require('lodash.omit'); var getCommitLintTypes = require('conventional-commit-types-befe'); var osLocale = require('os-locale'); var findUp = require('find-up'); var loadJson = require('load-json-file'); var _require = require('../package'), name = _require.name; var getGitRemoteUrl = require('./gitRemoteUrl'); var utils = require('./utils'); var makeSuggest = require('./makeSuggest'); var i = require('./i18n'); var i18n = i.i18n; var filter = function filter(array) { return array.filter(function (x) { return x; }); }; var args = minimist(process.argv.slice(2), { boolean: ['read'] }); function removeArgv() { var flags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; flags.forEach(function (flag) { while (true) { var readIndex = process.argv.findIndex(function (x) { return x === flag || x.startsWith(flag + '='); }); if (readIndex >= 0) { process.argv.splice(readIndex, 1); } else { break; } } }); } removeArgv(['--read', '--retry']); function catchError(fn) { return (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { var _args = arguments; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return fn.apply(this, _args); case 3: return _context.abrupt('return', _context.sent); case 6: _context.prev = 6; _context.t0 = _context['catch'](0); console.error(_context.t0); case 9: case 'end': return _context.stop(); } } }, _callee, this, [[0, 6]]); })); } // This can be any kind of SystemJS compatible module. // We use Commonjs here, but ES6 or AMD would do just // fine. module.exports = function () { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, pkg = _ref2.pkg, gitRemoteUrl = _ref2.gitRemoteUrl, _ref2$suggestAdaptors = _ref2.suggestAdaptors, suggestAdaptors = _ref2$suggestAdaptors === undefined ? require('./suggest-adaptor') : _ref2$suggestAdaptors, _ref2$userc = _ref2.userc, userc = _ref2$userc === undefined ? true : _ref2$userc; return { prompter: catchError(function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(cz, commit) { var lang, _getCommitLintTypes, typeKeys, typeObjects, set, typeChoices, config, rcPath, adaptorConfig, enabledSuggest, isEveryDisabled, makeSuggestLocal, type, store, scopeProps, prompt; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: prompt = function prompt() { return Promise.resolve(inquirerStore(cz.prompt, [{ type: 'auto-complete', name: 'type', message: i18n('feat.hint'), source: function source(answers, input) { return fuzzy.filter(input || '', typeChoices, { extract: function extract(el) { return (el.value || '') + ' ' + el.name; } }).map(function (x) { return x.original; }); } }, (0, _extends3.default)({ name: 'scope', noResultText: null, message: i18n('scope.hint') }, scopeProps), { type: type, noResultText: null, suggestOnly: true, name: 'subject', source: makeSuggestLocal({ suggestTitle: true }), validate: function validate(input) { if (!input) { return i18n('subject.error'); } return true; }, message: i18n('subject.hint') }, { type: 'input', name: 'body', message: i18n('body.hint') }, { type: 'confirm', default: false, name: 'hasBreaking', message: i18n('has-breaking.hint') }, { type: 'input', when: function when(ans) { return ans.hasBreaking; }, name: 'breaking', message: i18n('breaking.change.hint') // noResultText: null, // suggestOnly: true, // source: makeSuggest() }, { type: 'confirm', default: false, name: 'hasIssues', message: i18n('has-issues.hint') }, { when: function when(ans) { return ans.hasIssues; }, type: type, suggestOnly: true, // noResultText: null, name: 'issues', source: makeSuggestLocal({ always: true }), message: i18n('issues.hint') }], { mode: args['read'] ? 'duplex' : 'write', store: store })); }; makeSuggestLocal = function makeSuggestLocal(options) { if (!enabledSuggest) { return null; } var suggest = makeSuggest(enabledSuggest, options); return function (answers, input, rl) { return suggest(input, rl); }; }; lang = (osLocale.sync() || '').toLowerCase().trim().startsWith('zh') ? 'zh' : 'en'; pkg.lang = pkg.lang || lang; i.setLanguage(utils.getLanguage(pkg.lang)); _getCommitLintTypes = getCommitLintTypes(pkg.lang), typeKeys = _getCommitLintTypes.typeKeys, typeObjects = _getCommitLintTypes.typeObjects; // Convert `Fix` to `fix` set = new Set(); typeKeys.forEach(function (type) { set.add(type.toLowerCase()); }); typeKeys = Array.from(set); typeChoices = utils.rightPadTypes(typeObjects, typeKeys, pkg.lang); config = pkg.config && pkg.config[name]; if (!(!config && userc)) { _context2.next = 19; break; } _context2.next = 14; return findUp('.' + name + 'rc'); case 14: rcPath = _context2.sent; if (!rcPath) { _context2.next = 19; break; } _context2.next = 18; return loadJson(rcPath); case 18: config = _context2.sent; case 19: config = Object.assign({ scopeSuggestOnly: false, remoteName: 'origin' }, config); adaptorConfig = omit(config, ['scopes', 'scopeSuggestOnly', 'remoteName']); _context2.t0 = gitRemoteUrl; if (_context2.t0) { _context2.next = 26; break; } _context2.next = 25; return getGitRemoteUrl(null, { remoteName: config.remoteName }); case 25: _context2.t0 = _context2.sent; case 26: gitRemoteUrl = _context2.t0; suggestAdaptors = suggestAdaptors.map(function (Class) { return new Class(adaptorConfig, pkg, gitRemoteUrl); }); enabledSuggest = suggestAdaptors.find(function (adaptor) { return adaptor.isEnabled(); }); isEveryDisabled = suggestAdaptors.every(function (adaptor) { return !adaptor.options.suggestEnabled; }); if (enabledSuggest) { console.log(i18n('succ.suggest-enabled', [enabledSuggest.name, enabledSuggest.namespace ? '(' + enabledSuggest.namespace + ')' : ''].join(' '))); } else if (!isEveryDisabled) { console.warn(i18n('warn.suggest-disabled')); } console.log(i18n('first.hint')); type = enabledSuggest ? 'auto-complete' : 'input'; cz.registerPrompt('auto-complete', autoComplete); store = new FileStore({ storePath: nps.join(__dirname, '../inquirer-cache.json'), key: utils.getGitRootPath() || pkg && pkg.name }); scopeProps = { type: 'input' }; if (Array.isArray(config.scopes) && config.scopes.length) { scopeProps.type = 'auto-complete'; scopeProps.suggestOnly = config.scopeSuggestOnly; scopeProps.source = function (answers, input) { return fuzzy.filter(input || '', config.scopes, { extract: function extract(el) { return typeof el === 'string' ? el : el.value + (' ' + el.name || ''); } }).map(function (x) { return x.original; }); }; } prompt().then(function () { var answers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var maxLineWidth = 100; var wrapOptions = { trim: true, newline: '\n', indent: '', width: maxLineWidth // parentheses are only needed when a scope is present };var scope = (answers.scope || '').trim(); scope = scope ? '(' + answers.scope.trim() + ')' : ''; // Hard limit this line var head = ((answers.type || '') + scope + ': ' + (answers.subject || '').trim()).slice(0, maxLineWidth); // Wrap these lines at 100 characters var body = wrap(answers.body, wrapOptions); // Apply breaking change prefix, removing it if already present var breaking = answers.breaking ? answers.breaking.trim() : ''; breaking = breaking ? 'BREAKING CHANGE: ' + breaking.replace(/^BREAKING CHANGE: /, '') : ''; breaking = wrap(breaking, wrapOptions); var issues = answers.issues || ''; issues = issues ? wrap(issues, wrapOptions) : ''; var footer = filter([breaking, issues]).join('\n\n'); var message = head; if (body) { message += '\n\n' + body; } if (footer) { message += '\n\n' + footer; } var transform = enabledSuggest && enabledSuggest.transformCommitMessage.bind(enabledSuggest) || function (m) { return m; }; return Promise.resolve(transform(message)).then(function (message) { typeof commit === 'function' && commit(message, { args: process.argv.slice(2) }); }); }).catch(console.error); case 38: case 'end': return _context2.stop(); } } }, _callee2, this); })); return function (_x3, _x4) { return _ref3.apply(this, arguments); }; }()) }; };