@teaui/core
Version:
A high-level terminal UI library for Node
129 lines • 3.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConsoleLog = exports.Log = void 0;
const log_1 = require("../log");
const util_1 = require("../util");
const ansi_1 = require("../ansi");
const Container_1 = require("../Container");
const Text_1 = require("./Text");
const ScrollableList_1 = require("./ScrollableList");
const Collapsible_1 = require("./Collapsible");
const Stack_1 = require("./Stack");
class Log extends Container_1.Container {
#logs = [];
#scrollableList = new ScrollableList_1.ScrollableList({
scrollHeight: 10,
items: this.#logs,
cellForItem: log => {
return new LogLineView(log);
},
keepAtBottom: true,
});
constructor(props = {}) {
super(props);
this.add(this.#scrollableList);
}
setLogs(logs) {
this.#logs = logs;
this.#scrollableList.updateItems(logs);
}
appendLog(log) {
this.#logs.push(log);
}
clear() {
this.#logs = [];
this.#scrollableList.updateItems(this.#logs);
}
}
exports.Log = Log;
class LogLineView extends Container_1.Container {
constructor({ level, args }) {
super({});
let headerStyle;
switch (level) {
case 'error':
headerStyle = 'red bg';
break;
case 'warn':
headerStyle = 'yellow bg';
break;
case 'info':
headerStyle = 'white bg';
break;
case 'debug':
headerStyle = 'green bg';
break;
default:
headerStyle = 'white bg';
break;
}
const header = (0, ansi_1.styled)((0, util_1.centerPad)(level.toUpperCase(), 7), `black fg;${headerStyle}`);
const lines = args.flatMap(arg => {
return `${arg}`.split('\n').map(line => {
switch (level) {
case 'error':
return (0, ansi_1.styled)(line, 'red fg');
case 'warn':
return (0, ansi_1.styled)(line, 'yellow fg');
case 'info':
return (0, ansi_1.styled)(line, 'white fg');
case 'debug':
return (0, ansi_1.styled)(line, 'green fg');
default:
return line;
}
});
});
let logView;
const [firstLine, ..._] = lines;
if (lines.length > 1) {
logView = new Collapsible_1.Collapsible({
isCollapsed: false,
collapsed: new Text_1.Text({
text: firstLine,
wrap: false,
}),
expanded: new Text_1.Text({
lines: lines,
wrap: true,
}),
});
}
else {
logView = new Text_1.Text({
text: firstLine,
wrap: true,
});
}
this.add(Stack_1.Stack.right({
gap: 1,
children: [
new Text_1.Text({
text: header,
wrap: false,
}),
logView,
],
}));
}
}
class ConsoleLog extends Log {
static default;
constructor(props = {}) {
super(props);
}
didMount(screen) {
(0, log_1.addListener)(this.invalidateSize);
super.didMount(screen);
}
didUnmount(screen) {
(0, log_1.removeListener)(this.invalidateSize);
super.didUnmount(screen);
}
render(viewport) {
(0, log_1.fetchLogs)().forEach(log => this.appendLog(log));
super.render(viewport);
}
}
exports.ConsoleLog = ConsoleLog;
//# sourceMappingURL=Log.js.map