piuma-log
Version:
Piuma Logging Function
158 lines (156 loc) • 6.97 kB
JavaScript
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;
}