cz-conventional-changelog-befe
Version:
cz adaptor for baidu BEFE
358 lines (300 loc) • 12.5 kB
JavaScript
;
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;
}