@teaui/core
Version:
A high-level terminal UI library for Node
126 lines • 3.67 kB
JavaScript
import { fetchLogs, addListener as addLogListener, removeListener as removeLogListener, } from '../log.js';
import { centerPad } from '../util.js';
import { styled } from '../ansi.js';
import { Container } from '../Container.js';
import { Text } from './Text.js';
import { ScrollableList } from './ScrollableList.js';
import { Collapsible } from './Collapsible.js';
import { Stack } from './Stack.js';
export class Log extends Container {
#logs = [];
#scrollableList = new ScrollableList({
data: this.#logs,
renderItem: log => {
return new LogLineView(log);
},
keepAtBottom: true,
});
constructor(props = {}) {
super(props);
this.add(this.#scrollableList);
}
setLogs(logs) {
this.#logs = logs;
this.#scrollableList.updateData(logs);
}
appendLog(log) {
this.#logs.push(log);
}
clear() {
this.#logs = [];
this.#scrollableList.updateData(this.#logs);
}
}
class LogLineView extends 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 = styled(centerPad(level.toUpperCase(), 7), `black fg;${headerStyle}`);
const lines = args.flatMap(arg => {
return `${arg}`.split('\n').map(line => {
switch (level) {
case 'error':
return styled(line, 'red fg');
case 'warn':
return styled(line, 'yellow fg');
case 'info':
return styled(line, 'white fg');
case 'debug':
return styled(line, 'green fg');
default:
return line;
}
});
});
let logView;
const [firstLine, ..._] = lines;
if (lines.length > 1) {
logView = new Collapsible({
isCollapsed: false,
collapsed: new Text({
text: firstLine,
wrap: false,
}),
expanded: new Text({
lines: lines,
wrap: true,
}),
});
}
else {
logView = new Text({
text: firstLine,
wrap: true,
});
}
this.add(Stack.right({
gap: 1,
children: [
new Text({
text: header,
wrap: false,
}),
logView,
],
}));
}
}
export class ConsoleLog extends Log {
static default;
constructor(props = {}) {
super(props);
}
logDidChange = () => {
this.invalidateSize();
};
didMount(screen) {
addLogListener(this.logDidChange);
super.didMount(screen);
}
didUnmount(screen) {
removeLogListener(this.logDidChange);
super.didUnmount(screen);
}
render(viewport) {
fetchLogs().forEach(log => this.appendLog(log));
super.render(viewport);
}
}
//# sourceMappingURL=Log.js.map