grind-cli
Version:
CLI provider for Grind
124 lines (101 loc) • 14.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.OutputFormatter = void 0;
var _OutputFormatterStyle = require("./OutputFormatterStyle.js");
// Adopted from Symfony: https://github.com/symfony/console/blob/40b3aca/Formatter/OutputFormatter.php
class OutputFormatter {
constructor(decorated = true, styles = {}) {
this.decorated = null;
this.styles = {};
this.styleStack = [];
this.decorated = decorated;
this.setStyle('error', new _OutputFormatterStyle.OutputFormatterStyle('white', 'red'));
this.setStyle('info', new _OutputFormatterStyle.OutputFormatterStyle());
this.setStyle('comment', new _OutputFormatterStyle.OutputFormatterStyle('blue'));
this.setStyle('warn', new _OutputFormatterStyle.OutputFormatterStyle('yellow'));
this.setStyle('success', new _OutputFormatterStyle.OutputFormatterStyle('green'));
this.setStyle('question', new _OutputFormatterStyle.OutputFormatterStyle('magenta'));
this.setStyle('questionDefaultValue', new _OutputFormatterStyle.OutputFormatterStyle(null, null, ['dim']));
this.setStyle('blue', new _OutputFormatterStyle.OutputFormatterStyle('blue'));
this.setStyle('cyan', new _OutputFormatterStyle.OutputFormatterStyle('cyan'));
this.setStyle('gray', new _OutputFormatterStyle.OutputFormatterStyle('gray'));
this.setStyle('green', new _OutputFormatterStyle.OutputFormatterStyle('green'));
this.setStyle('magenta', new _OutputFormatterStyle.OutputFormatterStyle('magenta'));
this.setStyle('red', new _OutputFormatterStyle.OutputFormatterStyle('red'));
this.setStyle('white', new _OutputFormatterStyle.OutputFormatterStyle('white'));
this.setStyle('yellow', new _OutputFormatterStyle.OutputFormatterStyle('yellow'));
this.setStyle('groupTitle', new _OutputFormatterStyle.OutputFormatterStyle('magenta'));
this.setStyle('groupItem', new _OutputFormatterStyle.OutputFormatterStyle('blue'));
this.setStyle('groupItemHelp', new _OutputFormatterStyle.OutputFormatterStyle());
this.setStyle('groupItemValue', new _OutputFormatterStyle.OutputFormatterStyle('yellow'));
for (const [name, style] in Object.entries(styles)) {
this.setStyle(name, style);
}
}
static escapeText(text) {
return text.replace(/([^\\\\]?)</, '$1\\<');
}
setStyle(name, style) {
this.styles[name] = style;
}
hasStyle(name) {
return !!this.styles[name];
}
getStyle(name) {
return this.styles[name];
}
format(message) {
message = message.toString();
let offset = 0;
let output = '';
const tagRegex = '[a-z][a-z0-9_=-]*';
message.replace(new RegExp(`<((${tagRegex})|/(${tagRegex})?)>`, 'ig'), ($0, $1, $2, $3, index) => {
if (index !== 0 && message[index - 1] === '\\') {
return;
} // add the text up to the next tag
output += this._applyCurrentStyle(message.substring(offset, index));
offset = index + $0.length; // opening tag?
const open = $1.substring(0, 1) !== '/';
let tag = null;
if (open) {
tag = $2;
} else {
tag = $3 || '';
}
if (!open && tag.length === 0) {
// </>
this.styleStack.pop();
return;
}
const style = this._createStyleFromString(tag);
if (!style) {
output += this._applyCurrentStyle($1);
} else if (open) {
this.styleStack.push(style);
} else {
this.styleStack.pop(style);
}
});
output += this._applyCurrentStyle(message.substring(offset));
return output.replace(/\\</g, '<');
}
_createStyleFromString(string) {
return this.styles[string];
}
_applyCurrentStyle(text) {
if (this.styleStack.length === 0) {
return text;
}
return this._applyStyle(text, this.styleStack[this.styleStack.length - 1]);
}
_applyStyle(text, style) {
if (this.decorated && text.length > 0) {
return style.apply(text);
}
return text;
}
}
exports.OutputFormatter = OutputFormatter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9PdXRwdXQvT3V0cHV0Rm9ybWF0dGVyLmpzIl0sIm5hbWVzIjpbIk91dHB1dEZvcm1hdHRlciIsImNvbnN0cnVjdG9yIiwiZGVjb3JhdGVkIiwic3R5bGVzIiwic3R5bGVTdGFjayIsInNldFN0eWxlIiwiT3V0cHV0Rm9ybWF0dGVyU3R5bGUiLCJuYW1lIiwic3R5bGUiLCJPYmplY3QiLCJlbnRyaWVzIiwiZXNjYXBlVGV4dCIsInRleHQiLCJyZXBsYWNlIiwiaGFzU3R5bGUiLCJnZXRTdHlsZSIsImZvcm1hdCIsIm1lc3NhZ2UiLCJ0b1N0cmluZyIsIm9mZnNldCIsIm91dHB1dCIsInRhZ1JlZ2V4IiwiUmVnRXhwIiwiJDAiLCIkMSIsIiQyIiwiJDMiLCJpbmRleCIsIl9hcHBseUN1cnJlbnRTdHlsZSIsInN1YnN0cmluZyIsImxlbmd0aCIsIm9wZW4iLCJ0YWciLCJwb3AiLCJfY3JlYXRlU3R5bGVGcm9tU3RyaW5nIiwicHVzaCIsInN0cmluZyIsIl9hcHBseVN0eWxlIiwiYXBwbHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBSU8sTUFBTUEsZUFBTixDQUFzQjtBQUs1QkMsRUFBQUEsV0FBVyxDQUFDQyxTQUFTLEdBQUcsSUFBYixFQUFtQkMsTUFBTSxHQUFHLEVBQTVCLEVBQWdDO0FBQUEsU0FKM0NELFNBSTJDLEdBSi9CLElBSStCO0FBQUEsU0FIM0NDLE1BRzJDLEdBSGxDLEVBR2tDO0FBQUEsU0FGM0NDLFVBRTJDLEdBRjlCLEVBRThCO0FBQzFDLFNBQUtGLFNBQUwsR0FBaUJBLFNBQWpCO0FBRUEsU0FBS0csUUFBTCxDQUFjLE9BQWQsRUFBdUIsSUFBSUMsMENBQUosQ0FBeUIsT0FBekIsRUFBa0MsS0FBbEMsQ0FBdkI7QUFDQSxTQUFLRCxRQUFMLENBQWMsTUFBZCxFQUFzQixJQUFJQywwQ0FBSixFQUF0QjtBQUNBLFNBQUtELFFBQUwsQ0FBYyxTQUFkLEVBQXlCLElBQUlDLDBDQUFKLENBQXlCLE1BQXpCLENBQXpC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QUFBLE1BQU0sSUFBSSxLQUFLUSxrQkFBTCxDQUF3QlgsT0FBTyxDQUFDWSxTQUFSLENBQWtCVixNQUFsQixDQUF4QixDQUFWO0FBQ0EsV0FBT0MsTUFBTSxDQUFDUCxPQUFQLENBQWUsTUFBZixFQUF1QixHQUF2QixDQUFQO0FBQ0E7O0FBRURxQixFQUFBQSxzQkFBc0IsQ0FBQ0UsTUFBRCxFQUFTO0FBQzlCLFdBQU8sS0FBS2pDLE1BQUwsQ0FBWWlDLE1BQVosQ0FBUDtBQUNBOztBQUVEUixFQUFBQSxrQkFBa0IsQ0FBQ2hCLElBQUQsRUFBTztBQUN4QixRQUFJLEtBQUtSLFVBQUwsQ0FBZ0IwQixNQUFoQixLQUEyQixDQUEvQixFQUFrQztBQUNqQyxhQUFPbEIsSUFBUDtBQUNBOztBQUVELFdBQU8sS0FBS3lCLFdBQUwsQ0FBaUJ6QixJQUFqQixFQUF1QixLQUFLUixVQUFMLENBQWdCLEtBQUtBLFVBQUwsQ0FBZ0IwQixNQUFoQixHQUF5QixDQUF6QyxDQUF2QixDQUFQO0FBQ0E7O0FBRURPLEVBQUFBLFdBQVcsQ0FBQ3pCLElBQUQsRUFBT0osS0FBUCxFQUFjO0FBQ3hCLFFBQUksS0FBS04sU0FBTCxJQUFrQlUsSUFBSSxDQUFDa0IsTUFBTCxHQUFjLENBQXBDLEVBQXVDO0FBQ3RDLGFBQU90QixLQUFLLENBQUM4QixLQUFOLENBQVkxQixJQUFaLENBQVA7QUFDQTs7QUFFRCxXQUFPQSxJQUFQO0FBQ0E7O0FBdkgyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vICBBZG9wdGVkIGZyb20gU3ltZm9ueTogaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvY29uc29sZS9ibG9iLzQwYjNhY2EvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlci5waHBcblxuaW1wb3J0ICcuL091dHB1dEZvcm1hdHRlclN0eWxlJ1xuXG5leHBvcnQgY2xhc3MgT3V0cHV0Rm9ybWF0dGVyIHtcblx0ZGVjb3JhdGVkID0gbnVsbFxuXHRzdHlsZXMgPSB7fVxuXHRzdHlsZVN0YWNrID0gW11cblxuXHRjb25zdHJ1Y3RvcihkZWNvcmF0ZWQgPSB0cnVlLCBzdHlsZXMgPSB7fSkge1xuXHRcdHRoaXMuZGVjb3JhdGVkID0gZGVjb3JhdGVkXG5cblx0XHR0aGlzLnNldFN0eWxlKCdlcnJvcicsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnd2hpdGUnLCAncmVkJykpXG5cdFx0dGhpcy5zZXRTdHlsZSgnaW5mbycsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgpKVxuXHRcdHRoaXMuc2V0U3R5bGUoJ2NvbW1lbnQnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsdWUnKSlcblx0XHR0aGlzLnNldFN0eWxlKCd3YXJuJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCd5ZWxsb3cnKSlcblx0XHR0aGlzLnNldFN0eWxlKCdzdWNjZXNzJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdncmVlbicpKVxuXHRcdHRoaXMuc2V0U3R5bGUoJ3F1ZXN0aW9uJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdtYWdlbnRhJykpXG5cdFx0dGhpcy5zZXRTdHlsZSgncXVlc3Rpb25EZWZhdWx0VmFsdWUnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUobnVsbCwgbnVsbCwgWydkaW0nXSkpXG5cblx0XHR0aGlzLnNldFN0eWxlKCdibHVlJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibHVlJykpXG5cdFx0dGhpcy5zZXRTdHlsZSgnY3lhbicsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnY3lhbicpKVxuXHRcdHRoaXMuc2V0U3R5bGUoJ2dyYXknLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2dyYXknKSlcblx0XHR0aGlzLnNldFN0eWxlKCdncmVlbicsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnZ3JlZW4nKSlcblx0XHR0aGlzLnNldFN0eWxlKCdtYWdlbnRhJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdtYWdlbnRhJykpXG5cdFx0dGhpcy5zZXRTdHlsZSgncmVkJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdyZWQnKSlcblx0XHR0aGlzLnNldFN0eWxlKCd3aGl0ZScsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnd2hpdGUnKSlcblx0XHR0aGlzLnNldFN0eWxlKCd5ZWxsb3cnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3llbGxvdycpKVxuXG5cdFx0dGhpcy5zZXRTdHlsZSgnZ3JvdXBUaXRsZScsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnbWFnZW50YScpKVxuXHRcdHRoaXMuc2V0U3R5bGUoJ2dyb3VwSXRlbScsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnYmx1ZScpKVxuXHRcdHRoaXMuc2V0U3R5bGUoJ2dyb3VwSXRlbUhlbHAnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoKSlcblx0XHR0aGlzLnNldFN0eWxlKCdncm91cEl0ZW1WYWx1ZScsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgneWVsbG93JykpXG5cblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBzdHlsZV0gaW4gT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdFx0dGhpcy5zZXRTdHlsZShuYW1lLCBzdHlsZSlcblx0XHR9XG5cdH1cblxuXHRzdGF0aWMgZXNjYXBlVGV4dCh0ZXh0KSB7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSgvKFteXFxcXFxcXFxdPyk8LywgJyQxXFxcXDwnKVxuXHR9XG5cblx0c2V0U3R5bGUobmFtZSwgc3R5bGUpIHtcblx0XHR0aGlzLnN0eWxlc1tuYW1lXSA9IHN0eWxlXG5cdH1cblxuXHRoYXNTdHlsZShuYW1lKSB7XG5cdFx0cmV0dXJuICEhdGhpcy5zdHlsZXNbbmFtZV1cblx0fVxuXG5cdGdldFN0eWxlKG5hbWUpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHlsZXNbbmFtZV1cblx0fVxuXG5cdGZvcm1hdChtZXNzYWdlKSB7XG5cdFx0bWVzc2FnZSA9IG1lc3NhZ2UudG9TdHJpbmcoKVxuXG5cdFx0bGV0IG9mZnNldCA9IDBcblx0XHRsZXQgb3V0cHV0ID0gJydcblx0XHRjb25zdCB0YWdSZWdleCA9ICdbYS16XVthLXowLTlfPS1dKidcblxuXHRcdG1lc3NhZ2UucmVwbGFjZShcblx0XHRcdG5ldyBSZWdFeHAoYDwoKCR7dGFnUmVnZXh9KXwvKCR7dGFnUmVnZXh9KT8pPmAsICdpZycpLFxuXHRcdFx0KCQwLCAkMSwgJDIsICQzLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRpZiAoaW5kZXggIT09IDAgJiYgbWVzc2FnZVtpbmRleCAtIDFdID09PSAnXFxcXCcpIHtcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGFkZCB0aGUgdGV4dCB1cCB0byB0aGUgbmV4dCB0YWdcblx0XHRcdFx0b3V0cHV0ICs9IHRoaXMuX2FwcGx5Q3VycmVudFN0eWxlKG1lc3NhZ2Uuc3Vic3RyaW5nKG9mZnNldCwgaW5kZXgpKVxuXHRcdFx0XHRvZmZzZXQgPSBpbmRleCArICQwLmxlbmd0aFxuXG5cdFx0XHRcdC8vIG9wZW5pbmcgdGFnP1xuXHRcdFx0XHRjb25zdCBvcGVuID0gJDEuc3Vic3RyaW5nKDAsIDEpICE9PSAnLydcblx0XHRcdFx0bGV0IHRhZyA9IG51bGxcblxuXHRcdFx0XHRpZiAob3Blbikge1xuXHRcdFx0XHRcdHRhZyA9ICQyXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFnID0gJDMgfHwgJydcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghb3BlbiAmJiB0YWcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gPC8+XG5cdFx0XHRcdFx0dGhpcy5zdHlsZVN0YWNrLnBvcCgpXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzdHlsZSA9IHRoaXMuX2NyZWF0ZVN0eWxlRnJvbVN0cmluZyh0YWcpXG5cblx0XHRcdFx0aWYgKCFzdHlsZSkge1xuXHRcdFx0XHRcdG91dHB1dCArPSB0aGlzLl9hcHBseUN1cnJlbnRTdHlsZSgkMSlcblx0XHRcdFx0fSBlbHNlIGlmIChvcGVuKSB7XG5cdFx0XHRcdFx0dGhpcy5zdHlsZVN0YWNrLnB1c2goc3R5bGUpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zdHlsZVN0YWNrLnBvcChzdHlsZSlcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHQpXG5cblx0XHRvdXRwdXQgKz0gdGhpcy5fYXBwbHlDdXJyZW50U3R5bGUobWVzc2FnZS5zdWJzdHJpbmcob2Zmc2V0KSlcblx0XHRyZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcXFw8L2csICc8Jylcblx0fVxuXG5cdF9jcmVhdGVTdHlsZUZyb21TdHJpbmcoc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3R5bGVzW3N0cmluZ11cblx0fVxuXG5cdF9hcHBseUN1cnJlbnRTdHlsZSh0ZXh0KSB7XG5cdFx0aWYgKHRoaXMuc3R5bGVTdGFjay5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0ZXh0XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2FwcGx5U3R5bGUodGV4dCwgdGhpcy5zdHlsZVN0YWNrW3RoaXMuc3R5bGVTdGFjay5sZW5ndGggLSAxXSlcblx0fVxuXG5cdF9hcHBseVN0eWxlKHRleHQsIHN0eWxlKSB7XG5cdFx0aWYgKHRoaXMuZGVjb3JhdGVkICYmIHRleHQubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHN0eWxlLmFwcGx5KHRleHQpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHRcblx0fVxufVxuIl19