UNPKG

limbojs

Version:

Limbo js is a proof of concept of the method oriented API approach. It allows as to define and delegate methods which then can be called via special query language. One query can be executed by several resolvers chunk by chunk. The query gets splitted int

187 lines (186 loc) 5.16 kB
function lookDeep(key, obj){ let path = key.split('.'), val = obj; for(let i = 0; i < path.length; i++){ if(!val) { break; } val = val[path[i]]; } return val; } module.exports = { lookDeep : lookDeep, getCalls(line){ return (line.match(/\w+\~/g) || []).filter((el, index, arr)=>arr.indexOf(el) == index) .map(el=>el.replace(/\~/g, '')); }, getBalance(line){ return (line.match(/\{/g) || []).length - (line.match(/\}/g) || []).length; }, saveTopLevelFunction(str) { var scope = []; function process(str) { var start = str.indexOf("@{"); if(start == -1) { return str } let counter = 1, current = start+1; while(counter != 0) { current++; counter = counter + ({ "{" : 1, "}" : -1 }[str[current]] || 0); } scope.push(str.substr(start+2, current-start-2)); return str.substr(0, start) + "$"+(scope.length+1) + process(str.substr(current+1)); } var result = process(str); return { str : result, scope : scope } }, generateKey(length) { var text = "", possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; for (var i = 0; i < length; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; }, ops : [ { regExp : /\!(\$?_?\w+)/, //negative handle : (run, args) => { return !(args[0] && args[0] !=="undefined" && JSON.parse(args[0])); } }, { regExp : /(\$?_?[\w\.]+)(\=\=\=?)(\$?_?[\w\.]+)/, //is equal handle : (run, args)=>{ return args[1] == "===" ? ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) === (args[2] === 'undefined' ? undefined : JSON.parse(args[2]))) : ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) == (args[2] === 'undefined' ? undefined : JSON.parse(args[2]))) } }, { regExp : /(\$?_?[\w\.]+)(\!\=\=?)(\$?_?[\w\.]+)/, //is unequal handle : (run, args)=>{ return args[1] == "!==" ? ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) !== (args[2] === 'undefined' ? undefined : JSON.parse(args[2]))) : ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) != (args[2] === 'undefined' ? undefined : JSON.parse(args[2]))) } }, { regExp : /(\$?_?[\w\.]+)\+(\$?_?[\w\.]+)/, //plus handle : (run, args)=>{ var arg1 = args[0] === 'undefined' ? undefined : JSON.parse(args[0]), arg2 = args[1] === 'undefined' ? undefined : JSON.parse(args[1]); if(!Array.isArray(arg1) && !Array.isArray(arg2)) { return arg1 + arg2; } else if(!Array.isArray(arg1)) { arg2.unshift(arg1); return arg2; } else if(!Array.isArray(arg2)) { arg1.push(arg2); return arg1; } else { return arg1.concat(arg2); } } }, { regExp : /(\$?_?[\w\.]+)\-(\$?_?[\w\.]+)/, //minus handle : (run, args)=>{ var arg1 = args[0] === 'undefined' ? undefined : JSON.parse(args[0]), arg2 = args[1] === 'undefined' ? undefined : JSON.parse(args[1]); return arg1 - arg2; } }, { regExp : /(\$?_?[\w\.]+)\*(\$?_?[\w\.]+)/, //multiply handle : (run, args)=>{ var arg1 = args[0] === 'undefined' ? undefined : JSON.parse(args[0]), arg2 = args[1] === 'undefined' ? undefined : JSON.parse(args[1]); return arg1 * arg2; } }, { regExp : /(\$?_?[\w\.]+)\/(\$?_?[\w\.]+)/, //divide handle : (run, args)=>{ var arg1 = args[0] === 'undefined' ? undefined : JSON.parse(args[0]), arg2 = args[1] === 'undefined' ? undefined : JSON.parse(args[1]); return arg1 / arg2; } }, { regExp : /(\$?_?[\w\.]+)\&\&(\$?_?[\w\.]+)/, //and handle : (run, args)=>{ return ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) && (args[1] === 'undefined' ? undefined : JSON.parse(args[1]))) } }, { regExp : /(\$?_?[\w\.]+)\|\|(\$?_?[\w\.]+)/, //or handle : (run, args)=>{ return ((args[0] === 'undefined' ? undefined : JSON.parse(args[0])) || (args[1] === 'undefined' ? undefined : JSON.parse(args[1]))) } }, { regExp : /(\w+)\~(.+)?/, //execute handle : (run, args) => { return run.handle(args[0], (args[1] && JSON.parse(args[1]))) } }, { regExp : /^\?(\$?_?[\w\.]+)(\$_?\w+)(?:\:(\$_\w+))?/, // condition handle : (run, args, stack) =>{ (args[0] && args[0] !== "undefined" && JSON.parse(args[0])) ? stack.add(args[1]) : (args.length > 2 && stack.add(args[2])) } }, { regExp : /\$(\w+)\=(.+)/, //assign handle : (run, args)=>{ if(args[1] === "undefined") { param = null; } else { try { var param = JSON.parse(args[1]); } catch(e) { throw new Error(e); } } run.setVar("$"+args[0], param); return param; } }, { regExp : /^\=\>(.+)/, //return handle : (run, args)=>{ if(args[0] === "undefined") { var res = null; } else { try { var res = JSON.parse(args[0]); } catch(e) { throw e; } } return run.setVar("$__", res); } }, { regExp : /^\-\>@_(\d+)/, //return bookmark handle : (run, args)=>{ return run.setVar("$@", args[0]); } } ] }