piuma-js-mapper
Version:
Piuma Object Function Library
188 lines (184 loc) • 5.76 kB
JavaScript
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);
*/