UNPKG

grind-cli

Version:
124 lines (101 loc) 14.5 kB
"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