UNPKG

jsexpr

Version:

String and JSON expression interpolator and evaluator. Interpolates or evaluates a string against a json object, or transforms an object into another based on a json template

70 lines (64 loc) 1.9 kB
const CACHE = {} function fneval(obj, key) { try { return eval("this." + key); } catch (err) { return undefined; } } function cacheeval(obj,key) { if(!CACHE[key]) { let rkey = key.replace(/'/g,"\\'"); let rx = /^[a-zA-Z$_@]/; let fn = eval(`(function(){ let rx = /^[a-zA-Z$_]/; return '${rkey}'.startsWith('this.') || '${rkey}'=='this' || !rx.test('${rkey}')? function() { let r = undefined; try {r=${key};} catch(err){} return r; } : function() { let r = undefined; try {r=this.${rx.test(key)? key:'$___$'};} catch(err){try{r=${key};}catch(err){}} return r; } })()`); CACHE[key] = fn; } return CACHE[key].call(obj); } const EVALS = { eval(obj,key) { let v = fneval.call(obj,obj,key); return v===undefined? "" : v; }, iteval(obj,key) { var arr = key.split("."); arr.forEach(key=>{ if(obj==null || obj==undefined) return; else obj = obj[key]; }); let v = obj || undefined; return v===undefined? "" : v; }, ceval(obj,key) { let v = cacheeval(obj,key); return v===undefined? "" : v; }, valwalk(src,ops,path) { if(!src) return src; for(let k in src) { let newpath = `${path}${path?'.':''}${k}`; let rop = ops[newpath]; if(rop!==undefined) src[k] = rop; else if(typeof(src[k])=="object") EVALS.valwalk(src[k],ops,newpath); }; return src; } } module.exports = EVALS;