UNPKG

piuma-js-mapper

Version:

Piuma Object Function Library

188 lines (184 loc) 5.76 kB
module.exports = new PiumaLogTypOfMapper(); // ········································································ type of var // @ : @ : @ // undefined : native : @ // boolean : native | object : @ // fuction : native : @ // number : native | object : invalid | @ // string : native | object : blank | empty | @ // null : object : @ // array : object : length // object : object : noclass | <class> // ···················································································· const typofa = ["boolean","number","string"]; function typof(obj) { var typarr = ["@","@","@"]; typarr[0] = typeof obj; typarr[1] = (typarr[0] !== "object") ? "native" : "object"; if (typarr[1] == "object") { // null case if (obj === null) typarr[0] = "null"; else // array case if (Array.isArray(obj)) { typarr[0] = "array"; typarr[2] = obj.length; } else { // object cases try { var cls = obj.constructor.name + ""; if (cls == "") typarr[2] = "noclass"; else if (cls == "Boolean") typarr[0] = "boolean"; else if (cls == "String") typarr[0] = "string"; else if (cls == "Number") typarr[0] = "number"; else typarr[2] = cls; } catch(e) { typarr[2] = "noclass"; } } } // number verify if (typarr[0] == "number") { if ( (""+obj == "NaN") || (""+obj == "Infinity") ) typarr[2] = "invalid"; } // string verify else if (typarr[0] == "string") { if (obj === "") typarr[2] = "blank"; else if (obj.trim() === "") typarr[2] = "empty"; } // final return return typarr; } // ···················································································· // ············································································· mapper // mapping obj in default properties and return // ···················································································· function mapper(def,obj) { /////////////////////////////////////////////////////////////////////// checks var deftyp = typof(def); if ( (deftyp[0] === "undefined") || (deftyp[0] === "null") ) return null; // null when not default given or null var objtyp = typof(obj); if ( (objtyp[0] !== deftyp[0]) || ( (deftyp[0] === "array" ) && (deftyp[2] > 0) && (deftyp[2] !== objtyp[2]) ) || ( (deftyp[0] === "string") && (objtyp[2] === "@") && (objtyp[2] !== "@") ) || ( (deftyp[0] === "number") && (objtyp[2] !== "@") ) ) return def; // def when type not match // or array size not match if default is > 0 // or string blank/empty if default not is blank/empty // or number invalid /////////////////////////////////////////////////////////////////////// mapping var resp = null; if (deftyp[1] === "native") resp = obj; else if (deftyp[0] === "array") { resp = []; if (deftyp[2] > 0) { resp.push.apply(resp,def); for(var i=0;i<resp.length;i++) { var defitem = resp[i]; var objitem = obj[i]; resp[i] = mapper(defitem,objitem); } } else resp.push.apply(resp,obj); } else { resp = {}; for (var prop in def) resp[prop] = def[prop]; for (var prop in resp) { var defitem = resp[prop]; var objitem = obj[prop]; resp[prop] = mapper(defitem,objitem); } } return resp; } // ···················································································· export function PiumaLogTypOfMapper() { this.typof = typof; this.mapper = mapper; } // ···················································································· tests /* console.log('################################### typof tests'); var tests = [ true ,function(){return 1;} ,"ciao" ,{isobj:true} ,["big",3,true] ,null ,NaN ,"" ," " ,[] ,new String("fabio") ,new Number(43) ,new Boolean(true) ]; for(var i=0;i<tests.length;i++) { console.log(tests[i]) console.log("------------------------------------->",typof(tests[i])); } console.log('################################### mapping tests'); var def = { breadcum : { active : false ,separator : "‒▸" ,mode : "full" ,noname : "·" ,limits : [ "{" , "}" ] } ,epoch : { active : true ,seconds : false ,limits : [ "[" , "]" ] } ,level : { active : true ,mode : "compact" ,limits : [ "(" , ")" ] } ,bolds : { active : true ,chars : "‘’«»,;|<>.:·-‒▸()[]{}='^?!\"$&%/\\+#@" } ,italic : { active : true ,limits : [ "«" , "»" ] } ,uline : { active : true ,limits : [ "‘" , "’" ] } }; var obj = { epoch : { limits : [ "<<<" , ">>>" ] } }; var mapped = mapper(def,obj); console.log(mapped); */