@zvenigora/jse-eval
Version:
JavaScript expression parsing and evaluation.
3 lines (2 loc) • 16.3 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("jsep")):"function"==typeof define&&define.amd?define(["exports","jsep"],n):n((e||self).jseEval={},e.jsep)}(this,function(e,n){function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=/*#__PURE__*/t(n);function i(){return i=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},i.apply(this,arguments)}function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}var a={undefined:void 0,null:null,true:!0,false:!1},s=/*#__PURE__*/function(){function e(){}return e.getValue=function(n,t,r){var i=e.getScopedKeyValue(n,t,r);if(void 0!==i){var o=i[1],a=e.getBindFunction(o,t,r,i[2]);return"function"==typeof a?a:o}},e.getScopePair=function(n,t,r){if(void 0!==n&&null!=r&&r.scopes){var i=e.getKeyValue(r.scopes,t,r);if(void 0!==i){var o=i[1];if(o)return[i[0],o]}}},e.getBindFunction=function(n,t,r,i){var o,a=e.hasProperty(null==r?void 0:r.scopes,i)?null==r||null==(o=r.scopes[i])?void 0:o.options:r;if("function"==typeof n&&null!=a&&a.functionBindings){var s=e.getKeyValue(a.functionBindings,t,r);if(void 0!==s){var u=s[1];if(u){var l=u;return null!=l&&l.arguments?n.bind.apply(n,[null==l?void 0:l.thisRef].concat(l.arguments)):n.bind(null==l?void 0:l.thisRef)}}}},e.hasProperty=function(e,n){return!(!e||!n)&&Object.prototype.hasOwnProperty.call(e,n)},e.getScopedKeyValue=function(n,t,r){var i=[""],o=e.hasProperty(n,null==r?void 0:r.currentScopeName)&&e.hasProperty(null==r?void 0:r.scopes,null==r?void 0:r.currentScopeName),a=e.hasProperty(n,null==r?void 0:r.globalScopeName)&&e.hasProperty(null==r?void 0:r.scopes,null==r?void 0:r.globalScopeName);o&&i.push(null==r?void 0:r.currentScopeName),a&&i.push(null==r?void 0:r.globalScopeName);for(var s=0,u=i;s<u.length;s++){var l=u[s],c=this.getKeyValue(l?n[l]:n,t,r);if(void 0!==c)return[c[0],c[1],l]}},e.getKeyValue=function(n,t,r){if(e.blockListTest(n,t,r),e.allowListTest(n,t,r),null!=r&&r.caseSensitive||"string"!=typeof t)return[t,n[t]];if("string"==typeof t){var i=n;do{var o=Object.getOwnPropertyNames(i);if(Array.isArray(o)){var a=o.find(function(e){return 0===e.localeCompare(t,"en",{sensitivity:"base"})});if(a)return[a,i[a]]}}while(i=Object.getPrototypeOf(i))}},e.getLiteralKeyValue=function(n,t,r){if(e.blockListTest(n,t,r),e.allowListTest(n,t,r),null!=r&&r.caseSensitive)return[t,n[t]];for(var i=0,o=Object.entries(n);i<o.length;i++){var a=o[i],s=a[0],u=a[1];if(0===s.localeCompare(t,"en",{sensitivity:"base"}))return[s,u]}},e.blockListTest=function(e,n,t){if(null!=t&&t.blockList&&"string"==typeof n&&t.blockList.find(t.caseSensitive?function(e){return e===n}:function(e){return 0===e.localeCompare(n,"en",{sensitivity:"base"})}))throw Error('Access to member "'+n+'" from blockList is not permitted.')},e.allowListTest=function(e,n,t){if(null!=t&&t.allowList&&"string"==typeof n&&!t.allowList.find(null!=t&&t.caseSensitive?function(e){return e===n}:function(e){return 0===e.localeCompare(n,"en",{sensitivity:"base"})}))throw Error('Access to member "'+n+'" not in allowList is not permitted.')},e}(),u=/*#__PURE__*/function(){function e(n,t,r){this.context=void 0,this.isAsync=void 0,this.options=void 0,this.context=n,this.isAsync=t,this.options=r||e.defaultOptions}e.addUnaryOp=function(n,t){r.default.addUnaryOp(n),e.unops[n]=t},e.addBinaryOp=function(n,t,i,o){var a,s,u;"function"==typeof t?u=t:(a=t,"function"==typeof i?u=i:(s=i,u=o)),r.default.addBinaryOp(n,a||1,s),e.binops[n]=u},e.addEvaluator=function(n,t){e.evaluators[n]=t},e.addConditionalEvaluator=function(n,t,r){e.conditionalEvaluators[n]||(e.conditionalEvaluators[n]=[]),e.conditionalEvaluators[n].push({evaluator:r,predicate:t})},e.registerPlugin=function(){[].slice.call(arguments).forEach(function(n){n.init&&e.parse.plugins.register(n),n.initEval&&n.initEval.call(e,e)})},e.addOptions=function(n){e.defaultOptions=n},e.eval=function(n,t,r){return new e(t,void 0,r).eval(n)},e.evalAsync=function(n,t,r){try{return Promise.resolve(new e(t,!0,r).eval(n))}catch(e){return Promise.reject(e)}},e.compile=function(n){return e.eval.bind(null,e.jsep(n))},e.compileAsync=function(n){return e.evalAsync.bind(null,e.jsep(n))},e.evalExpr=function(n,t){return e.compile(n)(t)},e.evalExprAsync=function(n,t){return e.compileAsync(n)(t)};var n,t,u=e.prototype;return u.eval=function(n,t){void 0===t&&(t=function(e){return e});var r=e.conditionalEvaluators[n.type];if(r)for(var i,a=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return o(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,n):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(r);!(i=a()).done;){var s=i.value;if(s.predicate.call(this,n,this.context))return this.evalSyncAsync(s.evaluator.bind(this)(n,this.context),function(e){return n._value=e,t(e)})}var u=e.evaluators[n.type];if(void 0===u)throw new Error("unknown node type: "+JSON.stringify(n,null,2));return this.evalSyncAsync(u.bind(this)(n,this.context),function(e){return n._value=e,t(e)})},u.evalSyncAsync=function(e,n){return this.isAsync?Promise.resolve(e).then(n):n(e)},u.evalArrayExpression=function(e){return this.evalArray(e.elements)},u.evalArray=function(e){var n=this,t=e.map(function(e){return n.eval(e)}),r=function(n){return n.reduce(function(n,t,r){return"SpreadElement"===e[r].type?[].concat(n,t):(n.push(t),n)},[])};return this.isAsync?Promise.all(t).then(r):r(t)},u.evalBinaryExpression=function(n){var t=this;if("||"===n.operator)return this.eval(n.left,function(e){return e||t.eval(n.right)});if("&&"===n.operator)return this.eval(n.left,function(e){return e&&t.eval(n.right)});var r=[this.eval(n.left),this.eval(n.right)],i=function(t){return e.binops[n.operator](t[0],t[1])};return this.isAsync?Promise.all(r).then(i):i(r)},u.evalCompoundExpression=function(e){var n=this;return this.isAsync?e.body.reduce(function(e,t){return e.then(function(){return n.eval(t)})},Promise.resolve()):e.body.map(function(e){return n.eval(e)})[e.body.length-1]},u.evalCallExpression=function(e){var n=this;return this.evalSyncAsync(this.evalCall(e.callee),function(t){var r=t[0],i=t[1];return n.evalSyncAsync(n.evalArray(e.arguments),function(t){return r.apply(i===e.callee?n.context:i,t)})})},u.evalCall=function(n){if("MemberExpression"===n.type)return this.evalSyncAsync(this.evaluateMember(n),function(t){return e.validateFnAndCall(t[1],t[0],n)});if("Identifier"===n.type){var t=s.getValue(this.context,n.name,this.options);return e.validateFnAndCall(t,n)}return this.eval(n,function(t){return e.validateFnAndCall(t,n)})},u.evalConditionalExpression=function(e){var n=this;return this.eval(e.test,function(t){return n.eval(t?e.consequent:e.alternate)})},u.evalIdentifier=function(e){if(this.caseSensitive)return s.getValue(this.context,e.name,this.options);if(0===e.name.localeCompare("this","en",{sensitivity:"base"}))return this.evalThisExpression();var n=s.getLiteralKeyValue(a,e.name,this.options);if(n)return n[1];var t=s.getValue(this.context,e.name,this.options);if(void 0!==t&&this.options.scopes){var r=s.getScopePair(this.context,e.name,this.options);r&&(e._scope=r[1])}return t},e.evalLiteral=function(e){return e.value},u.evalMemberExpression=function(e){return this.evalSyncAsync(this.evaluateMember(e),function(e){return e[1]})},u.evaluateMember=function(e){var n=this;return this.eval(e.object,function(t){return n.evalSyncAsync(e.computed?n.eval(e.property):e.property.name,function(r){if(/^__proto__|prototype|constructor$/.test(r))throw Error('Access to member "'+r+'" disallowed.');var o=e.optional?t||{}:t,a=e.object._scope,u=a?i({},n.options,a.options):n.options,l=s.getValue(o,r,u);return[t,l,r]})})},u.evalThisExpression=function(){return this.context},u.evalUnaryExpression=function(n){return this.eval(n.argument,function(t){return e.unops[n.operator](t)})},u.evalArrowFunctionExpression=function(n){var t=this;return this.isAsync!==n.async?e[n.async?"evalAsync":"eval"](n,this.context):function(){var r=t.evalArrowContext(n,[].slice.call(arguments));return e[n.async?"evalAsync":"eval"](n.body,r)}},u.evalArrowContext=function(e,n){var t=this,r=i({},this.context);return(e.params||[]).forEach(function(e,o){if("AssignmentExpression"===e.type&&(void 0===n[o]&&(n[o]=t.eval(e.right)),e=e.left),"Identifier"===e.type)r[e.name]=n[o];else if("ArrayExpression"===e.type)e.elements.forEach(function(e,i){var a=n[o][i];if("AssignmentExpression"===e.type&&(void 0===a&&(a=t.eval(e.right)),e=e.left),"Identifier"!==e.type)throw new Error("Unexpected arrow function argument");r[e.name]=a});else if("ObjectExpression"===e.type){var a=[];e.properties.forEach(function(e){var s,u=e;if("AssignmentExpression"===u.type&&(u=u.left),"Property"===u.type)s="Identifier"===u.key.type?u.key.name:t.eval(u.key).toString();else if("Identifier"===u.type)s=u.name;else{if("SpreadElement"!==u.type||"Identifier"!==u.argument.type)throw new Error("Unexpected arrow function argument");s=u.argument.name}var l=n[o][s];"SpreadElement"===u.type?(l=i({},n[o]),a.forEach(function(e){delete l[e]})):void 0===l&&"AssignmentExpression"===e.type&&(l=t.eval(e.right)),r[s]=l,a.push(s)})}else{if("SpreadElement"!==e.type||"Identifier"!==e.argument.type)throw new Error("Unexpected arrow function argument");r[e.argument.name]=n.slice(o)}}),r},u.evalAssignmentExpression=function(n){var t=this;return this.evalSyncAsync(this.getContextAndKey(n.left),function(r){var i=r[0],o=r[1];return t.eval(n.right,function(t){return e.assignOps[n.operator](i,o,t)})})},u.evalUpdateExpression=function(n){return this.evalSyncAsync(this.getContextAndKey(n.argument),function(t){return e.evalUpdateOperation(n,t[0],t[1])})},u.evalAwaitExpression=function(n){return e.evalAsync(n.argument,this.context)},e.evalUpdateOperation=function(e,n,t){return e.prefix?"++"===e.operator?++n[t]:--n[t]:"++"===e.operator?n[t]++:n[t]--},u.getContextAndKey=function(e){var n=this;if("MemberExpression"===e.type)return this.evalSyncAsync(this.evaluateMember(e),function(e){var t=e[0],r=e[2];return[t,(s.getKeyValue(t,r,n.options)||[r,void 0])[0]]});if("Identifier"===e.type){var t=s.getKeyValue(this.context,e.name,this.options);return[this.context,(t||[e.name,void 0])[0]]}if("ConditionalExpression"===e.type)return this.eval(e.test,function(t){return n.getContextAndKey(t?e.consequent:e.alternate)});throw new Error("Invalid Member Key")},u.evalNewExpression=function(n){var t=this;return this.evalSyncAsync(this.evalCall(n.callee),function(r){var i=r[0];return t.evalSyncAsync(t.evalArray(n.arguments),function(t){return e.construct(i,t,n)})})},u.evalObjectExpression=function(n){var t=this,r={},i=n.properties.map(function(n){if("SpreadElement"===n.type)Object.assign(r,e.eval(n.argument,t.context,t.options));else if("Property"===n.type)return t.evalSyncAsync("Identifier"===n.key.type?n.key.name:t.eval(n.key),function(e){return t.eval(n.shorthand?n.key:n.value,function(n){r[e]=n})})});return this.isAsync?Promise.all(i).then(function(){return r}):r},u.evalSpreadElement=function(e){return this.eval(e.argument)},u.evalTaggedTemplateExpression=function(e){var n=[this.evalCall(e.tag),this.evalSyncAsync(this.evalArray(e.quasi.expressions),function(n){return[e.quasi.quasis.map(function(e){return e.value.cooked})].concat(n)})],t=function(e){var n=e[0];return n[0].apply(n[1],e[1])};return this.isAsync?Promise.all(n).then(t):t(n)},u.evalTemplateLiteral=function(e){return this.evalSyncAsync(this.evalArray(e.expressions),function(n){return e.quasis.reduce(function(e,t,r){return e+=t.value.cooked,t.tail||(e+=n[r]),e},"")})},e.construct=function(n,t,r){try{return new(Function.prototype.bind.apply(n,[null].concat(t)))}catch(n){throw new Error(e.nodeFunctionName(r.callee)+" is not a constructor")}},e.validateFnAndCall=function(n,t,r){if("function"!=typeof n){if(!n&&r&&r.optional)return[function(){},t];var i=e.nodeFunctionName(r||t);throw new Error("'"+i+"' is not a function")}return[n,t]},e.nodeFunctionName=function(e){return e&&(e.name||e.property&&e.property.name)},e.getKeyValue=function(e,n,t){return s.getKeyValue(e,n,t)},n=e,(t=[{key:"caseSensitive",get:function(){return!(!this.options||!this.options.caseSensitive)}}])&&function(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),Object.defineProperty(n,"prototype",{writable:!1}),e}();u.jsep=r.default,u.parse=r.default,u.evaluate=u.eval,u.evaluators={ArrayExpression:u.prototype.evalArrayExpression,LogicalExpression:u.prototype.evalBinaryExpression,BinaryExpression:u.prototype.evalBinaryExpression,CallExpression:u.prototype.evalCallExpression,Compound:u.prototype.evalCompoundExpression,ConditionalExpression:u.prototype.evalConditionalExpression,Identifier:u.prototype.evalIdentifier,Literal:u.evalLiteral,OptionalMemberExpression:u.prototype.evalMemberExpression,MemberExpression:u.prototype.evalMemberExpression,ThisExpression:u.prototype.evalThisExpression,UnaryExpression:u.prototype.evalUnaryExpression,ArrowFunctionExpression:u.prototype.evalArrowFunctionExpression,AssignmentExpression:u.prototype.evalAssignmentExpression,UpdateExpression:u.prototype.evalUpdateExpression,AwaitExpression:u.prototype.evalAwaitExpression,NewExpression:u.prototype.evalNewExpression,ObjectExpression:u.prototype.evalObjectExpression,SpreadElement:u.prototype.evalSpreadElement,TaggedTemplateExpression:u.prototype.evalTaggedTemplateExpression,TemplateLiteral:u.prototype.evalTemplateLiteral},u.conditionalEvaluators={},u.DEFAULT_PRECEDENCE={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},u.binops={"||":function(e,n){return e||n},"&&":function(e,n){return e&&n},"|":function(e,n){return e|n},"^":function(e,n){return e^n},"&":function(e,n){return e&n},"==":function(e,n){return e==n},"!=":function(e,n){return e!=n},"===":function(e,n){return e===n},"!==":function(e,n){return e!==n},"<":function(e,n){return e<n},">":function(e,n){return e>n},"<=":function(e,n){return e<=n},">=":function(e,n){return e>=n},"<<":function(e,n){return e<<n},">>":function(e,n){return e>>n},">>>":function(e,n){return e>>>n},"+":function(e,n){return e+n},"-":function(e,n){return e-n},"*":function(e,n){return e*n},"/":function(e,n){return e/n},"%":function(e,n){return e%n}},u.unops={"-":function(e){return-e},"+":function(e){return+e},"~":function(e){return~e},"!":function(e){return!e}},u.assignOps={"=":function(e,n,t){return e[n]=t},"*=":function(e,n,t){return e[n]*=t},"**=":function(e,n,t){var r;return e[r=n]=Math.pow(e[r],t)},"/=":function(e,n,t){return e[n]/=t},"%=":function(e,n,t){return e[n]%=t},"+=":function(e,n,t){return e[n]+=t},"-=":function(e,n,t){return e[n]-=t},"<<=":function(e,n,t){return e[n]<<=t},">>=":function(e,n,t){return e[n]>>=t},">>>=":function(e,n,t){return e[n]>>>=t},"&=":function(e,n,t){return e[n]&=t},"^=":function(e,n,t){return e[n]^=t},"|=":function(e,n,t){return e[n]|=t}},u.defaultOptions={caseSensitive:!0};var l=u.DEFAULT_PRECEDENCE,c=u.evaluators,p=u.binops,f=u.unops,v=u.assignOps,y=u.addUnaryOp,d=u.addBinaryOp,h=u.addEvaluator,m=u.registerPlugin,E=u.addOptions,g=u.eval,x=u.evalAsync,A=u.compile,b=u.compileAsync,w=u.evalExpr,S=u.evalExprAsync,O=u.getKeyValue;Object.defineProperty(e,"jsep",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return r.default}}),e.DEFAULT_PRECEDENCE=l,e.addBinaryOp=d,e.addEvaluator=h,e.addOptions=E,e.addUnaryOp=y,e.assignOps=v,e.binops=p,e.compile=A,e.compileAsync=b,e.default=u,e.evalAsync=x,e.evalExpr=w,e.evalExprAsync=S,e.evaluate=g,e.evaluators=c,e.getKeyValue=O,e.registerPlugin=m,e.unops=f});
//# sourceMappingURL=jse-eval.umd.js.map