electron-log
Version:
Just a simple logging module for your Electron application
107 lines (91 loc) • 2.52 kB
JavaScript
;
/* eslint-disable no-console */
const {
concatFirstStringElements,
format,
} = require('../../core/transforms/format');
const { maxDepth, toJSON } = require('../transforms/object');
const {
applyAnsiStyles,
removeStyles,
} = require('../../core/transforms/style');
const { transform } = require('../../core/transforms/transform');
const consoleMethods = {
error: console.error,
warn: console.warn,
info: console.info,
verbose: console.info,
debug: console.debug,
silly: console.debug,
log: console.log,
};
module.exports = consoleTransportFactory;
const separator = process.platform === 'win32' ? '>' : '›';
const DEFAULT_FORMAT = `%c{h}:{i}:{s}.{ms}{scope}%c ${separator} {text}`;
Object.assign(consoleTransportFactory, {
DEFAULT_FORMAT,
});
function consoleTransportFactory(logger) {
return Object.assign(transport, {
colorMap: {
error: 'red',
warn: 'yellow',
info: 'cyan',
verbose: 'unset',
debug: 'gray',
silly: 'gray',
default: 'unset',
},
format: DEFAULT_FORMAT,
level: 'silly',
transforms: [
addTemplateColors,
format,
formatStyles,
concatFirstStringElements,
maxDepth,
toJSON,
],
useStyles: process.env.FORCE_STYLES,
writeFn({ message }) {
const consoleLogFn = consoleMethods[message.level] || consoleMethods.info;
consoleLogFn(...message.data);
},
});
function transport(message) {
const data = transform({ logger, message, transport });
transport.writeFn({
message: { ...message, data },
});
}
}
function addTemplateColors({ data, message, transport }) {
if (
typeof transport.format !== 'string'
|| !transport.format.includes('%c')
) {
return data;
}
return [
`color:${levelToStyle(message.level, transport)}`,
'color:unset',
...data,
];
}
function canUseStyles(useStyleValue, level) {
if (typeof useStyleValue === 'boolean') {
return useStyleValue;
}
const useStderr = level === 'error' || level === 'warn';
const stream = useStderr ? process.stderr : process.stdout;
return stream && stream.isTTY;
}
function formatStyles(args) {
const { message, transport } = args;
const useStyles = canUseStyles(transport.useStyles, message.level);
const nextTransform = useStyles ? applyAnsiStyles : removeStyles;
return nextTransform(args);
}
function levelToStyle(level, transport) {
return transport.colorMap[level] || transport.colorMap.default;
}