UNPKG

choo-shortcache

Version:

choo nanocomponent cache shortcut

165 lines (138 loc) 4.04 kB
var assert = require('assert') var xtend = require('xtend') var emojis = { trace: '🔍', debug: '🐛', info: '✨', warn: '⚠️', error: '🚨', fatal: '💀' } var levels = { trace: 10, debug: 20, info: 30, warn: 40, error: 50, fatal: 60 } var defaultColors = { foreground: '#d3c0c8', background: '#2d2d2d', black: '#2d2d2d', red: '#f2777a', green: '#99cc99', yellow: '#ffcc66', blue: '#6699cc', magenta: '#cc99cc', cyan: '#66cccc', white: '#d3d0c8', brightBlack: '#747369' } module.exports = Nanologger function Nanologger (name, opts) { opts = opts || {} if (!(this instanceof Nanologger)) return new Nanologger(name, opts) assert.equal(typeof opts, 'object', 'nanologger: opts should be type object') this._name = name || '' this._colors = xtend(defaultColors, opts.colors || {}) try { this.logLevel = window.localStorage.getItem('logLevel') || 'info' } catch (e) { this.logLevel = 'info' } this._logLevel = levels[this.logLevel] } Nanologger.prototype.trace = function () { var args = [ 'trace' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype.debug = function () { var args = [ 'debug' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype.info = function () { var args = [ 'info' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype.warn = function () { var args = [ 'warn' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype.error = function () { var args = [ 'error' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype.fatal = function () { var args = [ 'fatal' ] for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i]) this._print.apply(this, args) } Nanologger.prototype._print = function (level) { if (levels[level] < this._logLevel) return var time = getTimeStamp() var emoji = emojis[level] var name = this._name || 'unknown' var msgColor = (level === 'error' || level.fatal) ? this._colors.red : level === 'warn' ? this._colors.yellow : this._colors.green var objs = [] var args = [ null ] var msg = '%c%s ' + emoji + ' %c%s' args.push(color(this._colors.brightBlack), time) args.push(color(this._colors.magenta), name) for (var i = 1, len = arguments.length; i < len; i++) { var arg = arguments[i] if (typeof arg === 'string') { if (i === 1) { // first string argument is in color msg += ' %c%s' args.push(color(msgColor)) args.push(arg) } else if (/ms$/.test(arg)) { // arguments finishing with 'ms', grey out msg += ' %c%s' args.push(color(this._colors.brightBlack)) args.push(arg) } else { // normal colors msg += ' %c%s' args.push(color(this._colors.white)) args.push(arg) } } else if (typeof arg === 'number') { msg += ' %c%d' args.push(color(this._colors.magenta)) args.push(arg) } else { objs.push(arg) } } args[0] = msg objs.forEach(function (obj) { args.push(obj) }) // In IE/Edge console functions don't inherit from Function.prototype // so this is necessary to get all the args applied. Function.prototype.apply.apply(console.log, [console, args]) } function color (color) { return 'color: ' + color + ';' } function getTimeStamp () { var date = new Date() var hours = pad(date.getHours().toString()) var minutes = pad(date.getMinutes().toString()) var seconds = pad(date.getSeconds().toString()) return hours + ':' + minutes + ':' + seconds } function pad (str) { return str.length !== 2 ? 0 + str : str }