UNPKG

stumpy

Version:
1 lines 14.3 kB
if(typeof sprintf==="undefined"){var sprintf=null}(function(sprintf){"use strict";var Console=null;var defaultFormatFunc=null;var defaultDateStringFunc=null;var defaultFormat=null;var clc=null;var util=null;var stackTrace=null;var isBrowser=true;if(typeof require!=="undefined"&&typeof module!=="undefined"){util=require("util");stackTrace=require("stack-trace");clc=require("cli-color");isBrowser=false;Console=console;try{sprintf=require("sprintf-js").sprintf}catch(err){}defaultFormat="[:date]{name} :name - {/name}{group}:group{/group}:args{trace} (:trace){/trace}";defaultFormatFunc=serverFormatFunc;defaultDateStringFunc=getDateString;module.exports=Stumpy}else{if(hasConsole()){Console=console}else{Console={};Console["log"]=function(){};Console["warn"]=function(){};Console["error"]=function(){};Console["info"]=function(){};Console["trace"]=function(){};Console["group"]=function(){};Console["groupEnd"]=function(){}}defaultFormat="{name} :name - {/name}:args{trace} (:trace){/trace}";defaultFormatFunc=browserFormatFunc;defaultDateStringFunc=getDateString}if(typeof window!=="undefined"){window.Stumpy=Stumpy}function Stumpy(opts,opts2){if(!(this instanceof Stumpy)){return new Stumpy(opts,opts2)}this._options=this._getDefaultOptions();this._data={buffer:[],groups:[]};this._id=0;this._consoleFunc={};this._addLogType("log");this._addLogType("warn");this._addLogType("error");this._addLogType("info");this._addLogType("trace");this._addLogType("group");this._addLogType("groupEnd");if(opts){if(isString(opts)){if(!opts2){opts2={}}opts2.name=opts;opts=opts2}this.setOptions(opts)}}Stumpy.prototype.shadow=function(opts,opts2){var shadow=new Stumpy(opts,opts2);shadow._data=this._data;return shadow};Stumpy.prototype.clearBuffer=function(){this._data.buffer=[];return true};Stumpy.prototype.getRawBuffer=function(){return this._data.buffer};Stumpy.prototype.getBuffer=function(){return this._dump(false)};Stumpy.prototype.printBuffer=function(){return this._dump(true)};Stumpy.prototype.setEnv=function(env){if(this._options.schema.hasOwnProperty(env)){this._options.env=env;var formatFunc=this._options.formatFunc;var dateStringFunc=this._options.dateStringFunc;this._options=mergeObj(this._options,this._options.schema[env]);this._options.formatFunc=formatFunc;this._options.dateStringFunc=dateStringFunc;return true}return false};Stumpy.prototype.getOptions=function(){return this._options};Stumpy.prototype.hideAll=function(type){if(this._options&&this._options.display&&this._options.display.hasOwnProperty(type)){this._options.display[type]=false}};Stumpy.prototype.showAll=function(type){if(this._options&&this._options.display&&this._options.display.hasOwnProperty(type)){this._options.display[type]=true}};Stumpy.prototype.setOptions=function(topts){var opts=JSON.parse(JSON.stringify(topts));if(isFunction(topts.formatFunc)){opts.formatFunc=topts.formatFunc}if(isFunction(topts.dateStringFunc)){opts.dateStringFunc=topts.dateStringFunc}if(isObject(opts)){if(isBrowser){this._options.syncLogs=true}if(opts.hasOwnProperty("name")){this._options.name=opts.name||this._options.name}if(opts.hasOwnProperty("env")){if(isString(opts.env)){this.setEnv(opts.env)}}if(opts.hasOwnProperty("getTrace")){if(typeof opts.getTrace==="boolean"){this._options.getTrace=opts.getTrace}}if(opts.hasOwnProperty("showTrace")){if(typeof opts.showTrace==="boolean"){this._options.showTrace=opts.showTrace;if(!this._options.getTrace){this._options.getTrace=true}}}if(opts.hasOwnProperty("showTraceOnError")){if(typeof opts.showTraceOnError==="boolean"){this._options.showTraceOnError=opts.showTraceOnError;if(!this._options.getTrace){this._options.getTrace=true}}}if(opts.hasOwnProperty("showDateTime")){if(typeof opts.showDateTime==="boolean"){this._options.showDateTime=opts.showDateTime}}if(opts.hasOwnProperty("showLogId")){if(typeof opts.showLogId==="boolean"){this._options.showLogId=opts.showLogId}}if(opts.hasOwnProperty("showLogType")){if(typeof opts.showLogType==="boolean"){this._options.showLogType=opts.showLogType}}if(opts.hasOwnProperty("syncLogs")){if(typeof opts.syncLogs==="boolean"){this._options.syncLogs=opts.syncLogs}}if(opts.hasOwnProperty("replaceConsole")){this._options.replaceConsole=opts.replaceConsole;if(this._options.replaceConsole&&hasConsole()){try{for(var d in this){console[d]=this[d]}}catch(err){console.log("Stumpy Could not overwrite global console - err:",err)}}}if(opts.hasOwnProperty("schema")){this._options.schema=mergeObj(this._options.schema,opts.schema)}if(opts.hasOwnProperty("formatFunc")&&isFunction(opts.formatFunc)){this._options.formatFunc=opts.formatFunc}if(opts.hasOwnProperty("dateStringFunc")&&isFunction(opts.dateStringFunc)){this._options.dateStringFunc=opts.dateStringFunc}if(opts.hasOwnProperty("onHandlers")){if(typeof opts.onHandlers==="object"){this._options.onHandlers=mergeObj(this._options.onHandlers,opts.onHandlers)}}if(opts.hasOwnProperty("display")){if(typeof opts.display==="boolean"){for(var d in this._options.display){this._options.display[d]=opts.display}}else if(typeof opts.display==="object"){this._options.display=mergeObj(this._options.display,opts.display)}}if(opts.hasOwnProperty("colors")){if(typeof opts.colors==="object"){this._options.colors=mergeObj(this._options.colors,opts.colors)}}if(opts.hasOwnProperty("group")){if(typeof opts.group==="object"){this._options.group=mergeObj(this._options.group,opts.group)}}if(opts.hasOwnProperty("buffer")){if(typeof opts.buffer==="boolean"){if(!opts.buffer)opts.buffer.size=0}else if(typeof opts.buffer==="number"){this._options.buffer.size=opts.buffer}else if(typeof opts.buffer==="object"){this._options.buffer=mergeObj(this._options.buffer,opts.buffer)}if(this._options.buffer.showTrace&&!this._options.buffer.getTrace){this._options.buffer.getTrace=true}}}};Stumpy.prototype._getDefaultOptions=function(){var options={name:"",env:"dev",replaceConsole:false,getTrace:false,showTrace:false,showTraceOnError:!isBrowser,showDateTime:!isBrowser,showLogId:false,showLogType:false,syncLogs:false,warnIsLog:true,display:{},format:defaultFormat,onHandlers:{addLog:null,delLog:null,addBuffer:null,delBuffer:null},transport:{},colors:{log:"whiteBright",info:"blue",warn:"yellow",error:"red",trace:"magenta",group:"green",groupEnd:"green"},group:{autoIndent:true,indent:{line:" |",inner:" |",start:"+->",split:" |",end:"<-+",join:" |"}},buffer:{size:0,formatFunc:null,dateStringFunc:null,getTrace:false,showTrace:false,deepCopy:false},schema:{dev:{display:{log:true,info:true,warn:true,error:true,trace:true,group:true,groupEnd:true}},stage:{display:{log:false,info:false,warn:true,error:true,trace:true,group:true,groupEnd:true}},prod:{display:{log:false,info:false,warn:false,error:true,trace:true,group:false,groupEnd:false}}}};options=JSON.parse(JSON.stringify(options));options.formatFunc=defaultFormatFunc;options.dateStringFunc=defaultDateStringFunc;return options};Stumpy.prototype._addLogType=function(type){if(Console&&Console[type]){this._consoleFunc[type]=Console[type]}else{this._consoleFunc[type]=function(){if(this._consoleFunc["log"]){this._consoleFunc["log"].apply(Console,arguments)}}.bind(this)}this._options.display[type]=true;this[type]=function Logger(){this._id++;var logStr="";var log={id:this._id,date:new Date,type:type,args:Array.prototype.slice.call(arguments,0),stackTrace:null};if(this._options.display[type]){logStr=log.args;if(log.type==="trace"||this._options.getTrace||log.type==="error"&&this._options.showTraceOnError){log.stackTrace=this._getTrace()}if(type==="group"){if(log.args.length<1){log.args.push("group")}this._data.groups.push(log.args[0])}log.groups=JSON.parse(JSON.stringify(this._data.groups));if(type==="groupEnd"){var groupName=this._data.groups.pop();if(log.args.length<1){log.args=[groupName]}}if(isFunction(this._options.formatFunc)){logStr=this._options.formatFunc.apply(this._options.formatFunc,[log,this._options])}if(isString(logStr)){logStr=[logStr]}this._consoleWrapper(type,logStr)}this._triggerHandler("add","Log",log);this._triggerHandler("add","Buffer",log);if(this._options.buffer.size>0){if(this._data.buffer.length>=this._options.buffer.size){var removeLog=this._data.buffer.shift();this._triggerHandler("del","Log",removeLog);this._triggerHandler("del","Buffer",removeLog)}if(!log.stackTrace&&(this._options.buffer.getTrace||log.type==="trace")){log.stackTrace=this._getTrace()}if(this._options.buffer.deepCopy){log.args=JSON.parse(JSON.stringify(log.args))}if(type!="group"&&type!="groupEnd"){this._data.buffer.push(log)}}}.bind(this)};Stumpy.prototype._triggerHandler=function(trigger,type,log){var funcName=trigger+type;if(this._options.onHandlers[funcName]&&isFunction(this._options.onHandlers[funcName])){var formatFunc=null;if(type==="Log"){formatFunc=this._options.formatFunc}else if(type==="Buffer"){formatFunc=this._options.buffer.formatFunc}if(isFunction(formatFunc)){var args=formatFunc.call(formatFunc,log,this._options);var logStr=argsToString(args,this._options,log.type,this._options.showTraceOnError);this._options.onHandlers[funcName].call(this._options.onHandlers[funcName],logStr,log)}}};Stumpy.prototype._dump=function(display){var out=[];if(Console&&this._data.buffer.length==0){this._consoleFunc["log"].call(Console,"Empty buffer");return out}for(var b in this._data.buffer){var log=this._data.buffer[b];if(log.type!=null){var row=log.args;if(isFunction(this._options.buffer.formatFunc)){row=this._options.buffer.formatFunc.apply(this._options.buffer.formatFunc,[log,this._options])}if(isString(row)){row=[row]}if(display){var outDisplay=[];if(isFunction(this._options.formatFunc)){outDisplay=this._options.formatFunc.apply(this._options.formatFunc,[log,this._options])}this._consoleWrapper(log.type,outDisplay)}for(var a=0;a<row.length;a++){if(typeof row[a]==="object"){row[a]=JSON.stringify(row[a])}}row=argsToString(row,this._options,log.type,false);out.push(row)}}return out};Stumpy.prototype._getTrace=function(depth){var stack=null,traceOut=null;if(stackTrace){stack=stackTrace.get();if(!depth){depth=2}var traceItem=stack[depth];var filename=traceItem.getFileName();var linenum=traceItem.getLineNumber();var colnum=traceItem.getColumnNumber();traceOut=filename+":"+linenum+":"+colnum;return{trace:traceOut,stack:stack}}else{try{trigger.error=1/0}catch(e){stack=e.stack.toString();traceOut=stack.split("\n");traceOut=traceOut.pop();traceOut=traceOut.replace("at","");traceOut=traceOut.replace(/^\s+|\s+$/g,"");return{trace:traceOut,stack:stack}}}};Stumpy.prototype._consoleWrapper=function(type,args){if(Console&&!isBrowser&&this._options.colors[type]&&clc){var color=null;if(isString(this._options.colors[type])){color=clc[this._options.colors[type]]}args=argsToString(args,this._options,type,this._options.showTraceOnError);if(color){args=color(args)}if(isString(args)){args=[args]}if(this._options.warnIsLog&&type==="warn"){type="log"}if(this._options.syncLogs&&(type==="trace"||type==="error")){this._consoleFunc["log"].apply(Console,args)}else{this._consoleFunc[type].apply(Console,args)}}else{this._consoleFunc[type].apply(Console,args)}};function browserFormatFunc(log,options){var out=[];var a=0;if(options.name){if(isString(log.args[0])){out.push(options.name+" - "+log.args[0]);a++}}for(;a<log.args.length;a++){out.push(log.args[a])}if(options.showTrace||log.type==="error"&&options.showTraceOnError){out.push("-> "+log.stackTrace.trace)}return out}function serverFormatFunc(log,options){var firstArg="";var indentStr="";var out=[];var a=0;if(options.showDateTime){var td="";if(isFunction(options.dateStringFunc)){td=options.dateStringFunc(log.date)}else{td=getDateString(log.date)}firstArg+="["+td+"]"}if(options.showLogId){firstArg+=" #"+padLeft(log.id,5)+" "}if(options.showLogType){firstArg+=padLeft(log.type,8," ")}if(options.name){firstArg+=" "+options.name+" -"}if(options.group.autoIndent){if(log.groups&&log.groups.length){if(log.type==="group"||log.type==="groupEnd"){log.args[0]=log.args[0]}for(var i=0;i<log.groups.length-1;i++){if(i+1==log.groups.length-1&&log.type==="group"){indentStr+=options.group.indent.split}else if(i+1==log.groups.length-1&&log.type==="groupEnd"){indentStr+=options.group.indent.join}else{indentStr+=options.group.indent.inner}}if(log.type==="group"){indentStr+=options.group.indent.start}else if(log.type==="groupEnd"){indentStr+=options.group.indent.end}else{indentStr+=options.group.indent.line}firstArg+=" "+indentStr}}if(isString(log.args[0])){firstArg+=" "+log.args[0];a++}if(firstArg.length){out.push(firstArg)}for(;a<log.args.length;a++){out.push(log.args[a])}if(log.type!=="trace"&&options.showTrace||log.type==="error"&&options.showTraceOnError){out.push("-> "+log.stackTrace.trace)}else if(log.type==="trace"){out.push("-> "+log.stackTrace.stack.join("\n"))}return out}function argsToString(args,options,type,showTraceOnError){if(isString(args[0])&&args[0].indexOf("%")!==-1){var trace="";if(options.showTrace||type==="error"&&showTraceOnError){trace=args.pop()}if(sprintf){args=sprintf.apply(sprintf,args)}else if(util){args[0]=args[0].replace("%f","%d");args=util.format.apply(this,args)}if(options.showTrace||type==="error"&&showTraceOnError){args+=" "+trace}}else{for(var i=0;i<args.length;i++){if(isObject(args[i])){args[i]=JSON.stringify(args[i])}}args=args.join(" ")}return args}function hasConsole(){return!(typeof console==="undefined")}function isFunction(func){return typeof func==="function"}function isObject(obj){return Object.prototype.toString.call(obj)==="[object Object]"}function isString(str){return Object.prototype.toString.call(str)==="[object String]"}function mergeObj(desc,src){var ndesc={};if(desc instanceof Object){ndesc=JSON.parse(JSON.stringify(desc))}for(var i in src){if(src[i]&&src[i]instanceof Object&&!isFunction(src[i])){ndesc[i]=mergeObj(ndesc[i],src[i])}else{ndesc[i]=src[i]}}return ndesc}function padLeft(item,padding,padChar){padding=padding||10;var size=padding-String(item).length+1;if(size){var a=new Array(size);return a.join(padChar||"0")+item}}function getDateString(date){function pad(number){if(number<10){return"0"+number}return number}return date.getUTCFullYear()+"-"+pad(date.getUTCMonth()+1)+"-"+pad(date.getUTCDate())+" "+pad(date.getUTCHours())+":"+pad(date.getUTCMinutes())+":"+pad(date.getUTCSeconds())+"."+(date.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}})(sprintf);