UNPKG

cz-conventional-changelog-befe

Version:
358 lines (300 loc) 12.5 kB
'use strict'; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @file suggest * @author Cuttle Cong * @date 2018/10/24 * */ var cliWidth = require('cli-width'); var fuzzy = require('fuzzy'); var sliceInput = require('@moyuyc/inquirer-autocomplete-prompt/slice-input'); var terminalLink = require('terminal-link'); var namedRegexp = require('named-js-regexp'); var stringWidth = require('string-width'); var ConfigStore = require('configstore'); var isEqual = require('lodash.isequalwith'); var memoize = require('./memoize'); var storeFirstCallAsync = require('./storeFirstCallAsync'); var pkg = require('../package'); var debug = require('./debug'); var _require = require('./parsePlaceholder'), parse = _require.parse; var _require2 = require('./utils'), newTable = _require2.newTable, sliceString = _require2.sliceString, trimRight = _require2.trimRight; function linkify() { var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; return '#__link__#' + text + '#__link__#'; } function lastOfLink(string) { return string.lastIndexOf('#__link__#'); } function unlinkify(text) { var replacer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (m) { return m; }; var reg = /#__link__#(.*)?#__link__#/g; var i = 0; return text.replace(reg, function (_, m) { return replacer(m, { times: ++i, endIndex: RegExp.lastMatch.length }); }); } var INCREASE_LEN = linkify('').length; function namify() { var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; return name.replace(/\./g, '\\.'); } var defaultConf = new ConfigStore(pkg.name); function makeStoreAdaptorFetch(adaptor) { var conf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultConf; var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref$updateIntervalMs = _ref.updateIntervalMs, updateIntervalMs = _ref$updateIntervalMs === undefined ? 1000 * 60 * 60 * 24 * 3 : _ref$updateIntervalMs; var lowerName = String(adaptor.name).toLowerCase(); var storeNameSpace = namify(lowerName) + '.' + namify(adaptor.namespace); return storeFirstCallAsync(adaptor.fetch.bind(adaptor), { get: function get() { var confData = conf.get(storeNameSpace); if (confData && isEqual(confData.req, adaptor.data)) { if (Date.now() - confData.timestamp < updateIntervalMs) { return confData.res; } // Out of Date, Delete it! conf.delete(storeNameSpace); } }, set: function set(list) { conf.set(storeNameSpace, { req: adaptor.data, res: list, timestamp: Date.now() }); } }); } /** * * @param adaptor {AdaptorInterface} * @param opts * @return {Function} */ function makeSuggest(adaptor) { var suggest = function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(input) { var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, cursor = _ref4.cursor; var _sliceInput, leftIndex, rightIndex, matching, namespace, isStartIssue, isSuggestTitle, match, inputData, groups, linkEnabled, list, parsed, colWidths, table, choices, tableLines; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: input = input || ''; _sliceInput = sliceInput(input, { cursor: cursor, delimiter: '\\s,' }), leftIndex = _sliceInput.leftIndex, rightIndex = _sliceInput.rightIndex, matching = _sliceInput.matching; namespace = adaptor.namespace; isStartIssue = false; isSuggestTitle = false; match = void 0; adaptor.matchRegexps.some(function (rgx) { match = namedRegexp(rgx).exec(matching); if (match) { debug('matched regexp', rgx); } return !!match; }); inputData = { namespace: namespace, matching: matching }; if (match) { // /^([a-zA-Z][\w-]+)-(.*)$/ isStartIssue = true; groups = match.groups() || {}; inputData = (0, _extends3.default)({}, inputData, groups, { namespace: typeof groups.namespace === 'string' ? groups.namespace : namespace, matching: typeof groups.matching === 'string' ? groups.matching : matching }); } else if (suggestTitle) { isStartIssue = true; isSuggestTitle = true; } if (!(!always && !isStartIssue)) { _context.next = 11; break; } return _context.abrupt('return', Promise.resolve([])); case 11: linkEnabled = cliWidth() > 140; if (inputData.namespace) { _context.next = 14; break; } return _context.abrupt('return', Promise.resolve([])); case 14: debug('input data:%O', inputData); debug('请求数据:%O', adaptor.data); list = []; _context.prev = 17; _context.next = 20; return controller.fn.call(adaptor, inputData); case 20: list = _context.sent; debug('响应数据:%o', list); _context.next = 28; break; case 24: _context.prev = 24; _context.t0 = _context['catch'](17); debug(_context.t0); throw _context.t0; case 28: if (!(!list || !Array.isArray(list))) { _context.next = 30; break; } return _context.abrupt('return', Promise.resolve([])); case 30: parsed = parse(adaptor.options.placeholder || adaptor.config.placeholder); colWidths = parsed.map(function (d) { var width = null; if (d.type === 'data') { if (d.data.hasOwnProperty('w')) { if (d.data.w.trim().endsWith('%')) { width = parseInt(parseInt(d.data.w) * 0.01 * cliWidth()); } else { width = parseInt(d.data.w); } // link 会加上 包裹符,所以 width 需要加上包裹符的长度 if (d.data.link && linkEnabled) { width += INCREASE_LEN; } } } return width; }); table = newTable({ colWidths: colWidths }); choices = list.map(function (data) { // card.title = htmlDecode(card.title) var flattenData = adaptor.flattenIncomeData(data, inputData); var row = []; parsed.forEach(function (d) { if (d.type === 'data') { if (flattenData.hasOwnProperty(d.value)) { var str = '' + (d.prefix || '') + String(flattenData[d.value]) + (d.suffix || ''); if (d.data.link && linkEnabled) { str = linkify(str); } if (typeof d.data.align === 'string') { str = { hAlign: d.data.align, content: str }; } row.push(str); } else { row.push('{' + d.value + '}'); } } else { row.push(d.value); } }); table.push(row); var leftStr = !isSuggestTitle ? input.slice(0, leftIndex) + (flattenData.issueId || '#' + flattenData.number) : input.slice(0, leftIndex) + (flattenData.title || '').replace(/^[a-zA-Z]+?: /, ''); return { row: row, flattenData: flattenData, value: leftStr + input.slice(rightIndex), cursor: leftStr.length }; }); tableLines = table.toString().split('\n'); // debug(tableLines) debug('choices.length: %d, tableLines.length: %d.', choices.length, tableLines.length); choices = choices.map(function (data, index) { var line = null; var len = cliWidth() - 10; /* the length of `prefix + suffix` */ if (tableLines[index]) { len = Math.min(len, tableLines[index].length); line = unlinkify(tableLines[index], function (str, _ref5) { var endIndex = _ref5.endIndex, times = _ref5.times; var end = endIndex - times * INCREASE_LEN; if (end < len && data.flattenData.issueURL) { return terminalLink(str, data.flattenData.issueURL, { fallback: function fallback(text) { return text; } }); } return str; }); } var name = line; if (line == null) { name = data.row.map(function (cell) { var str = ''; if (typeof cell === 'string') { str = cell; } else if (cell && typeof cell.content === 'string') { str = cell.content; } return unlinkify(str); }).join(''); // name = sliceString(trimRight(name), len) } return { data: data.flattenData, name: sliceString(trimRight(name), len), value: data.value, cursor: data.cursor }; }); return _context.abrupt('return', fuzzy.filter(inputData.matching.replace(/\+/g, ' '), choices, { extract: function extract(el) { var data = el.data; return data.searchText || [data.issueId || '', data.number || '', data.title || '' // data.type, // data.status, // String(data.responsiblePeople) ].join(' '); } }).map(function (x) { delete x.original.data; return x.original; })); case 38: case 'end': return _context.stop(); } } }, _callee, this, [[17, 24]]); })); return function suggest(_x8) { return _ref3.apply(this, arguments); }; }(); var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, always = _ref2.always, _ref2$suggestTitle = _ref2.suggestTitle, suggestTitle = _ref2$suggestTitle === undefined ? false : _ref2$suggestTitle, conf = _ref2.conf; var updateIntervalMs = adaptor.options.updateIntervalMs; var bindFetch = adaptor.fetch.bind(adaptor); var controller = memoize(bindFetch); controller.fn = makeStoreAdaptorFetch((0, _extends3.default)({}, adaptor, { name: adaptor.name, fetch: controller.fn }), conf, { updateIntervalMs: updateIntervalMs }); return suggest; } module.exports = makeSuggest; if (process.env.NODE_ENV === 'test') { module.exports.makeStoreAdaptorFetch = makeStoreAdaptorFetch; module.exports.namify = namify; module.exports.defaultConf = defaultConf; }