UNPKG

mozjexl

Version:

Javascript Expression Language: Powerful context-based expression parser and evaluator

67 lines (65 loc) 2.38 kB
/* * Jexl * Copyright (c) 2015 TechnologyAdvice */ /** * A map of all expression elements to their properties. Note that changes * here may require changes in the Lexer or Parser. * @type {{}} */ exports.elements = { '.': {type: 'dot'}, '[': {type: 'openBracket'}, ']': {type: 'closeBracket'}, '|': {type: 'pipe'}, '{': {type: 'openCurl'}, '}': {type: 'closeCurl'}, ':': {type: 'colon'}, ',': {type: 'comma'}, '(': {type: 'openParen'}, ')': {type: 'closeParen'}, '?': {type: 'question'}, '+': {type: 'binaryOp', precedence: 30, eval: function(left, right) { return left + right; }}, '-': {type: 'binaryOp', precedence: 30, eval: function(left, right) { return left - right; }}, '*': {type: 'binaryOp', precedence: 40, eval: function(left, right) { return left * right; }}, '/': {type: 'binaryOp', precedence: 40, eval: function(left, right) { return left / right; }}, '//': {type: 'binaryOp', precedence: 40, eval: function(left, right) { return Math.floor(left / right); }}, '%': {type: 'binaryOp', precedence: 50, eval: function(left, right) { return left % right; }}, '^': {type: 'binaryOp', precedence: 50, eval: function(left, right) { return Math.pow(left, right); }}, '==': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left == right; }}, '!=': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left != right; }}, '>': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left > right; }}, '>=': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left >= right; }}, '<': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left < right; }}, '<=': {type: 'binaryOp', precedence: 20, eval: function(left, right) { return left <= right; }}, '&&': {type: 'binaryOp', precedence: 10, eval: function(left, right) { return left && right; }}, '||': {type: 'binaryOp', precedence: 10, eval: function(left, right) { return left || right; }}, 'in': {type: 'binaryOp', precedence: 20, eval: function(left, right) { if (typeof right === 'string') return right.indexOf(left) !== -1; if (Array.isArray(right)) { return right.some(function(elem) { return elem == left; }); } return false; }}, '!': {type: 'unaryOp', precedence: Infinity, eval: function(right) { return !right; }} };