c-log
Version:
Pretty colorful cli logger for NodeJS(with table, success and more...)
116 lines (103 loc) • 2.8 kB
JavaScript
;
var colors = require('colors');
var Table = require('cli-table');
var _ = require('./utils');
/**
* @type Object
*/
var levels = {
log: { name: '» LOG: '.blueBG, cmd: false },
info: { name: '» INFO: '.magentaBG, cmd: false },
warn: { name: '» WARN: '.whiteBG.red, cmd: false },
error: { name: '✘ '.red, cmd: false },
success: { name: '✔ '.green, cmd: false },
time: { name: "» TIMEOUT ".greenBG, cmd: 'time' },
timeEnd: { name: "» TIMEOUT ".greenBG, cmd: 'timeEnd' },
enjoy: { name: "", cmd: false }
};
/**
* Make sure that message pass as a string
* @param msg
* @returns {String}
*/
function message(msg) {
return typeof msg !== 'string'
? JSON.stringify(msg)
: msg;
}
/**
* truncate string
* @param str {String}
* @param len {Number}
* @param suf {String}
* @returns {String}
*/
function truncate(str, len, suf) {
return str.length <= len
? str
: str.substr(0, 10) + suf + str.substr(str.length-1)
}
/**
* Generate array of object into cli-table and print it
* keys as table head, value as table rows
* @param arr
*/
function generateTable(arr) {
//const word for object indexing
// Head handling
var keys = arr.map(function(obj) {
return Object.keys(obj);
});
var head = _.uniq(_.flatten(keys, 0));
var table = new Table({
head: ['(index)'.green].concat(head.map(function(str) {
return str.cyan;
})),
chars: {
'top': '═' , 'top-mid': '╤' , 'top-left': '╔' , 'top-right': '╗',
'bottom': '═' , 'bottom-mid': '╧' , 'bottom-left': '╚' , 'bottom-right': '╝',
'left': '║' , 'left-mid': '╟' , 'mid': '─' , 'mid-mid': '┼',
'right': '║' , 'right-mid': '╢' , 'middle': '│'
}
});
// Body handling
arr.forEach(function(obj, i) {
var body = [i].concat(head.map(function(key) {
return _.isObject(obj[key])
? truncate(JSON.stringify(obj[key]), 10, '...')
: _.isUndefined(obj[key]) ? ' ' : String(obj[key]);
}));
table.push(body);
});
// Print it
console.log(table.toString());
}
/**
* @constructor
*/
function Console() {
for(var key in levels) {
this[key] = (function(val) {
return function(msg) {
msg = message(msg);
//fn arguments
var args = [val.name, val.name ? msg : msg['rainbow']];
var cmd = val.cmd || 'log';
//apply fn
console[cmd].apply(console, args);
};
})(levels[key])
}
}
/**
* @param arr
*/
Console.prototype.table = function(arr) {
return Array.isArray(arr)
? generateTable(arr)
: this.log(arr)
};
/**
* @export
*/
module.exports = Console;