UNPKG

piuma-log

Version:

Piuma Logging Function

158 lines (156 loc) 6.97 kB
const pjm = require('piuma-js-mapper'); const chalk = require('chalk'); var exports = module.exports = generate; exports.defaults = defaults; //····································································· defaults function defaults() { var obj = { colors : true ,epoch : { active : true ,seconds : true ,limits : [ "[" , "]" ] } ,level : { active : true ,mode : "compact" ,limits : [ "(" , ")" ] } ,breadcam : { active : true ,separator : "‒▸" ,mode : "full" ,noname : "×" ,limits : [ "{" , "}" ] } ,area : { active : true ,path : [ "«" , "»" ] ,quote : [ "‘" , "’" ] ,hotword : [ "“" , "”" ] ,numbers : true ,bools : true ,grammars : ".:,;?!@#<>(){}&%+-\"$_*^|" } } return obj; } //····································································· generate const breadcamModes = [ "this", "parent", "three" , "four", "full" ]; const levelModes = [ "char", "compact", "full" ]; const levelTags = { char : [ "I" , "E" , "W" , "D" , "V" ] /*****/ /*****/ /*****/ /*****/ /*****/ ,compact : [ "INFOR", "ERROR", "WARNG", "DEBUG", "VERBS" ] /***********/ /***********/ /***********/ /***********/ /***********/ ,full : [ "INFORMATION"," ERROR "," WARNING "," DEBUG " ," VERBOSE " ] } function escapeRegExp(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } function generate(options) { // create configuration var def = defaults(); options = pjm.mapper(def,options); if (breadcamModes.indexOf(options.breadcam.mode)<0) options.breadcam.mode = def.breadcam.mode; if (levelModes.indexOf(options.level.mode)<0) options.level.mode = def.level.mode; // generate logger function var logger = function() { //-------------------------------------------------------- init if (!arguments||arguments.length==0) return; chalk.enabled = options.colors; var args = []; args.push.apply(args,arguments); var tagId = 0; var typ = pjm.typof(args[0]); if (typ[0] == "string" && typ[2] == "@") { var tag = args[0].trim().toUpperCase(); tagId = levelTags.char.indexOf(tag); if (tagId>=0) { args.shift(); if (args.length==0) return; } else tagId=0; } var spool = []; //-------------------------------------------------------- epoch if (options.epoch.active) { var epoch = "0000000000000" + (new Date().valueOf()); epoch = epoch.substr(epoch.length-13); if (options.epoch.seconds) epoch = epoch.substr(0,10); var lm = options.epoch.limits; spool.push(chalk`{gray {bold ${lm[0]}}${epoch}{bold ${lm[1]}}}`); } //-------------------------------------------------------- level if (options.level.active) { var level = levelTags[options.level.mode][tagId]; switch (tagId) { /*ERROR*/ case 1 : level = chalk`{redBright ${level}}` ; break; /*WARNG*/ case 2 : level = chalk`{yellowBright ${level}}`; break; /*DEBUG*/ case 3 : level = chalk`{greenBright ${level}}` ; break; /*VERBS*/ case 4 : level = chalk`{blueBright ${level}}` ; break; /*INFOR*/ default : level = chalk`{cyanBright ${level}}` ; } level = options.level.limits.join(level); spool.push(chalk`{bold ${level}}`); } //-------------------------------------------------------- compact args args = args.join(" "); //-------------------------------------------------------- area if (options.area.active) { var rex = null; var areas = {path:[],quote:[],hotword:[]}; // ***************************************************** path rex = escapeRegExp(options.area.path.join("_REG_EX_")); rex = rex.replace("_REG_EX_",".+?"); rex = new RegExp(rex,"g"); args = args.replace(rex,function(x){areas.path.push(chalk`{green ${x}}`);return "·AREA·PATH·";}); // ***************************************************** quote rex = escapeRegExp(options.area.quote.join("_REG_EX_")); rex = rex.replace("_REG_EX_",".+?"); rex = new RegExp(rex,"g"); args = args.replace(rex,function(x){areas.quote.push(chalk`{yellow ${x}}`);return "·AREA·QUOTE·";}); // ***************************************************** hotword rex = escapeRegExp(options.area.hotword.join("_REG_EX_")); rex = rex.replace("_REG_EX_",".+?"); rex = new RegExp(rex,"g"); args = args.replace(rex,function(x){areas.hotword.push(chalk`{blue ${x}}`);return "·AREA·HOTWORD·";}); // ***************************************************** numbers if (options.area.numbers) args=args.replace(/[0-9]+/g,function(x){return chalk`{bold.cyanBright ${x}}`}); // ***************************************************** bools if (options.area.bools) args=args.replace(/true|false/g,function(x) {return(x=="true")?chalk`{bold.greenBright ${x}}`:chalk`{bold.redBright ${x}}`;}); // ***************************************************** grammars rex = escapeRegExp(options.area.grammars); rex = new RegExp("["+rex+"]+","g"); args = args.replace(rex,function(x){return chalk`{bold.blueBright ${x}}`;}); // ***************************************************** remap vectors while(areas.path.length>0)args=args.replace("·AREA·PATH·",areas.path.shift()); while(areas.quote.length>0)args=args.replace("·AREA·QUOTE·",areas.quote.shift()); while(areas.hotword.length>0)args=args.replace("·AREA·HOTWORD·",areas.hotword.shift()); } //-------------------------------------------------------- compact spool spool = spool.join("")+" "+chalk`{cyan ${args}}`; //-------------------------------------------------------- breadcam if (options.breadcam.active) { var breadcam = []; var ownerfnc = arguments.callee.caller; breadcam.push(ownerfnc.name||options.breadcam.noname); var modeId = breadcamModes.indexOf(options.breadcam.mode); if (modeId == breadcamModes.length-1) modeId=-1; while(modeId!=0&&ownerfnc!=null) { ownerfnc = ownerfnc.caller; if (ownerfnc !== null) breadcam.unshift(ownerfnc.name||options.breadcam.noname); modeId--; } var spoolbc = breadcam.join(chalk`{bold ${options.breadcam.separator}}`); spoolbc = " " + options.breadcam.limits.join(chalk`{italic.magenta ${spoolbc}}`); spool += spoolbc; } //-------------------------------------------------------- write log console.log(spool); } return logger; }