lux-framework
Version:
Build scalable, Node.js-powered REST APIs with almost no code.
76 lines (61 loc) • 1.74 kB
JavaScript
// @flow
import { WriteStream } from 'tty';
import { dim, red, yellow } from 'chalk';
import { WARN, ERROR } from '../constants';
import omit from '../../../utils/omit';
import type { Logger$format } from '../interfaces';
import { STDOUT, STDERR } from './constants';
import formatMessage from './utils/format-message';
import type { Logger$Writer } from './interfaces';
/**
* @private
*/
export function createWriter(format: Logger$format): Logger$Writer {
return function write(data) {
const { level, ...etc } = data;
let { message, timestamp } = etc;
let output;
if (format === 'json') {
output = {};
if (message && typeof message === 'object' && message.message) {
output = {
timestamp,
level,
message: message.message,
...omit(message, 'message')
};
} else {
output = {
timestamp,
level,
message,
...etc
};
}
output = formatMessage(output, 'json');
} else {
let columns = 0;
if (process.stdout instanceof WriteStream) {
columns = process.stdout.columns;
}
message = formatMessage(message, 'text');
switch (level) {
case WARN:
timestamp = yellow(`[${timestamp}]`);
break;
case ERROR:
timestamp = red(`[${timestamp}]`);
break;
default:
timestamp = dim(`[${timestamp}]`);
break;
}
output = `${timestamp} ${message}\n\n${dim('-').repeat(columns)}\n`;
}
if (STDOUT.test(level)) {
process.stdout.write(`${output}\n`);
} else if (STDERR.test(level)) {
process.stderr.write(`${output}\n`);
}
};
}