From 56df51fd8b501c159f68e178758684add8d960dd Mon Sep 17 00:00:00 2001 From: m93a Date: Wed, 22 Sep 2021 23:47:28 +0200 Subject: [PATCH] add useDotAccessOperator #44 --- dist/browser/filtrex.js | 47 ++++++++++++++++++++++++++++++++++--- dist/browser/filtrex.min.js | 2 +- dist/cjs/filtrex.js | 47 ++++++++++++++++++++++++++++++++++--- dist/esm/filtrex.d.ts | 31 +++++++++++++++++++++++- dist/esm/filtrex.mjs | 46 +++++++++++++++++++++++++++++++++--- src/filtrex.d.ts | 31 +++++++++++++++++++++++- src/filtrex.mjs | 46 +++++++++++++++++++++++++++++++++--- test/misc.js | 15 +++++++++++- 8 files changed, 249 insertions(+), 16 deletions(-) diff --git a/dist/browser/filtrex.js b/dist/browser/filtrex.js index cf5051b..7a34891 100644 --- a/dist/browser/filtrex.js +++ b/dist/browser/filtrex.js @@ -2261,6 +2261,46 @@ var filtrex = (function (exports) { parser.yy = Object.create(std); + /** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ + function useDotAccessOperator(name, get, obj, type) { + // ignore dots inside escaped symbol + if (type === 'single-quoted') + return get(name) + + + const parts = name.split('.'); + + for (const propertyName of parts) { + if (hasOwnProperty(obj ?? {}, propertyName)) { + obj = obj[propertyName]; + } else { + throw new UnknownPropertyError(propertyName) + } + } + + return obj + } + /** * A simple, safe, JavaScript expression engine, allowing end-users to enter arbitrary expressions without p0wning you. @@ -2394,7 +2434,7 @@ var filtrex = (function (exports) { // Metaprogramming functions - function nakedProp(name, obj) { + function nakedProp(name, obj, type) { if (hasOwnProperty(obj ?? {}, name)) return obj[name] @@ -2411,7 +2451,7 @@ var filtrex = (function (exports) { } if (typeof customProp === 'function') { - nakedProp = (name, obj) => customProp(name, safeGetter(obj), obj); + nakedProp = (name, obj, type) => customProp(name, safeGetter(obj), obj, type); } function createCall(fns) { @@ -2427,7 +2467,7 @@ var filtrex = (function (exports) { if (type === 'unescaped' && hasOwnProperty(constants, name)) return constants[name] - return nakedProp(name, obj) + return nakedProp(name, obj, type) } @@ -2448,6 +2488,7 @@ var filtrex = (function (exports) { } exports.compileExpression = compileExpression; + exports.useDotAccessOperator = useDotAccessOperator; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/browser/filtrex.min.js b/dist/browser/filtrex.min.js index 36f566a..17761fe 100644 --- a/dist/browser/filtrex.min.js +++ b/dist/browser/filtrex.min.js @@ -1 +1 @@ -var filtrex=function(t){"use strict";var e=function(){var t={trace:function(){},yy:{},symbols_:{error:2,expressions:3,e:4,EOF:5,"-":6,"+":7,"*":8,"/":9,"^":10,mod:11,and:12,or:13,not:14,if:15,then:16,else:17,in:18,notIn:19,"(":20,")":21,Arguments:22,",":23,Number:24,Symbol:25,String:26,of:27,Relation:28,"%":29,"?":30,":":31,RelationalOperator:32,"==":33,"!=":34,"~=":35,"<":36,"<=":37,">=":38,">":39,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",6:"-",7:"+",8:"*",9:"/",10:"^",11:"mod",12:"and",13:"or",14:"not",15:"if",16:"then",17:"else",18:"in",19:"notIn",20:"(",21:")",23:",",24:"Number",25:"Symbol",26:"String",27:"of",29:"%",30:"?",31:":",33:"==",34:"!=",35:"~=",36:"<",37:"<=",38:">=",39:">"},productions_:[0,[3,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,2],[4,6],[4,3],[4,3],[4,3],[4,5],[4,1],[4,1],[4,1],[4,3],[4,3],[4,4],[4,1],[4,3],[4,5],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[28,3],[28,3],[22,1],[22,3]],performAction:function(t,e,n,r,s,i,o){var a=i.length-1;switch(s){case 1:return i[a-1];case 2:this.$=["(","ops['-'](",i[a],")",")"];break;case 3:case 4:case 5:case 6:case 7:this.$=["(","ops['",i[a-1],"'](",i[a-2],", ",i[a],")",")"];break;case 8:this.$=["(","ops.mod(",i[a-2],", ",i[a],")",")"];break;case 9:this.$=["(","","std.coerceBoolean","(",i[a-2],") && ","std.coerceBoolean","(",i[a],")",")"];break;case 10:this.$=["(","","std.coerceBoolean","(",i[a-2],") || ","std.coerceBoolean","(",i[a],")",")"];break;case 11:this.$=["(","! ","std.coerceBoolean","(",i[a],")",")"];break;case 12:this.$=["(","","std.coerceBoolean","(",i[a-4],") ? ",i[a-2]," : ",i[a],"",")"];break;case 13:this.$=["(","std.isSubset(",i[a-2],", ",i[a],")",")"];break;case 14:this.$=["(","!std.isSubset(",i[a-2],", ",i[a],")",")"];break;case 15:this.$=["(","",i[a-1],"",")"];break;case 16:this.$=["(","[ ",i[a-3],", ",i[a-1]," ]",")"];break;case 17:this.$=["",i[a],""];break;case 18:this.$=["prop(",i[a],", data)"];break;case 19:this.$=["",i[a],""];break;case 20:this.$=["prop(",i[a-2],", ",i[a],")"];break;case 21:this.$=["call(",i[a-2],")"];break;case 22:this.$=["call(",i[a-3],", ",i[a-1],")"];break;case 23:this.$=r.reduceRelation(i[a]);break;case 24:this.$=["std.warnDeprecated('modulo', ops['mod'](",i[a-2],", ",i[a],"))"];break;case 25:this.$=["std.warnDeprecated('ternary', ","std.coerceBoolean","(",i[a-4],") ? ",i[a-2]," : ",i[a],")"];break;case 26:this.$=["=="];break;case 27:this.$=["!="];break;case 28:this.$=["~="];break;case 29:this.$=["<"];break;case 30:this.$=["<="];break;case 31:this.$=[">="];break;case 32:this.$=[">"];break;case 33:this.$=[i[a-2],i[a-1],...i[a]];break;case 34:this.$=[i[a-2],i[a-1],i[a]];break;case 35:this.$=["",i[a],""];break;case 36:this.$=["",i[a-2],", ",i[a],""]}},table:[{3:1,4:2,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{1:[3]},{5:[1,11],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:32,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:33,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:34,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:35,6:[1,3],14:[1,4],15:[1,5],20:[1,6],22:36,24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,17],6:[2,17],7:[2,17],8:[2,17],9:[2,17],10:[2,17],11:[2,17],12:[2,17],13:[2,17],16:[2,17],17:[2,17],18:[2,17],19:[2,17],21:[2,17],23:[2,17],29:[2,17],30:[2,17],31:[2,17],33:[2,17],34:[2,17],35:[2,17],36:[2,17],37:[2,17],38:[2,17],39:[2,17]},{5:[2,18],6:[2,18],7:[2,18],8:[2,18],9:[2,18],10:[2,18],11:[2,18],12:[2,18],13:[2,18],16:[2,18],17:[2,18],18:[2,18],19:[2,18],20:[1,38],21:[2,18],23:[2,18],27:[1,37],29:[2,18],30:[2,18],31:[2,18],33:[2,18],34:[2,18],35:[2,18],36:[2,18],37:[2,18],38:[2,18],39:[2,18]},{5:[2,19],6:[2,19],7:[2,19],8:[2,19],9:[2,19],10:[2,19],11:[2,19],12:[2,19],13:[2,19],16:[2,19],17:[2,19],18:[2,19],19:[2,19],21:[2,19],23:[2,19],29:[2,19],30:[2,19],31:[2,19],33:[2,19],34:[2,19],35:[2,19],36:[2,19],37:[2,19],38:[2,19],39:[2,19]},{5:[2,23],6:[2,23],7:[2,23],8:[2,23],9:[2,23],10:[2,23],11:[2,23],12:[2,23],13:[2,23],16:[2,23],17:[2,23],18:[2,23],19:[2,23],21:[2,23],23:[2,23],29:[2,23],30:[2,23],31:[2,23],33:[2,23],34:[2,23],35:[2,23],36:[2,23],37:[2,23],38:[2,23],39:[2,23]},{1:[2,1]},{4:39,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:40,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:41,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:42,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:43,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:44,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:45,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:46,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:47,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:48,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:49,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:50,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:52,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:51},{6:[2,26],14:[2,26],15:[2,26],20:[2,26],24:[2,26],25:[2,26],26:[2,26]},{6:[2,27],14:[2,27],15:[2,27],20:[2,27],24:[2,27],25:[2,27],26:[2,27]},{6:[2,28],14:[2,28],15:[2,28],20:[2,28],24:[2,28],25:[2,28],26:[2,28]},{6:[2,29],14:[2,29],15:[2,29],20:[2,29],24:[2,29],25:[2,29],26:[2,29]},{6:[2,30],14:[2,30],15:[2,30],20:[2,30],24:[2,30],25:[2,30],26:[2,30]},{6:[2,31],14:[2,31],15:[2,31],20:[2,31],24:[2,31],25:[2,31],26:[2,31]},{6:[2,32],14:[2,32],15:[2,32],20:[2,32],24:[2,32],25:[2,32],26:[2,32]},{5:[2,2],6:[2,2],7:[2,2],8:[2,2],9:[2,2],10:[1,16],11:[2,2],12:[2,2],13:[2,2],16:[2,2],17:[2,2],18:[2,2],19:[2,2],21:[2,2],23:[2,2],29:[2,2],30:[2,2],31:[2,2],32:24,33:[2,2],34:[2,2],35:[2,2],36:[2,2],37:[2,2],38:[2,2],39:[2,2]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[1,16],11:[2,11],12:[2,11],13:[2,11],16:[2,11],17:[2,11],18:[2,11],19:[2,11],21:[2,11],23:[2,11],29:[2,11],30:[2,11],31:[2,11],32:24,33:[2,11],34:[2,11],35:[2,11],36:[2,11],37:[2,11],38:[2,11],39:[2,11]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[1,53],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[1,54],23:[2,35],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{23:[1,55]},{4:56,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:59,6:[1,3],14:[1,4],15:[1,5],20:[1,6],21:[1,57],22:58,24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,3],6:[2,3],7:[2,3],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,3],13:[2,3],16:[2,3],17:[2,3],18:[2,3],19:[2,3],21:[2,3],23:[2,3],29:[1,22],30:[2,3],31:[2,3],32:24,33:[2,3],34:[2,3],35:[2,3],36:[2,3],37:[2,3],38:[2,3],39:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,4],13:[2,4],16:[2,4],17:[2,4],18:[2,4],19:[2,4],21:[2,4],23:[2,4],29:[1,22],30:[2,4],31:[2,4],32:24,33:[2,4],34:[2,4],35:[2,4],36:[2,4],37:[2,4],38:[2,4],39:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[1,16],11:[2,5],12:[2,5],13:[2,5],16:[2,5],17:[2,5],18:[2,5],19:[2,5],21:[2,5],23:[2,5],29:[2,5],30:[2,5],31:[2,5],32:24,33:[2,5],34:[2,5],35:[2,5],36:[2,5],37:[2,5],38:[2,5],39:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[1,16],11:[2,6],12:[2,6],13:[2,6],16:[2,6],17:[2,6],18:[2,6],19:[2,6],21:[2,6],23:[2,6],29:[2,6],30:[2,6],31:[2,6],32:24,33:[2,6],34:[2,6],35:[2,6],36:[2,6],37:[2,6],38:[2,6],39:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[1,16],11:[2,7],12:[2,7],13:[2,7],16:[2,7],17:[2,7],18:[2,7],19:[2,7],21:[2,7],23:[2,7],29:[2,7],30:[2,7],31:[2,7],32:24,33:[2,7],34:[2,7],35:[2,7],36:[2,7],37:[2,7],38:[2,7],39:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[1,16],11:[2,8],12:[2,8],13:[2,8],16:[2,8],17:[2,8],18:[2,8],19:[2,8],21:[2,8],23:[2,8],29:[2,8],30:[2,8],31:[2,8],32:24,33:[2,8],34:[2,8],35:[2,8],36:[2,8],37:[2,8],38:[2,8],39:[2,8]},{5:[2,9],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,9],13:[2,9],16:[2,9],17:[2,9],18:[1,20],19:[1,21],21:[2,9],23:[2,9],29:[1,22],30:[2,9],31:[2,9],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,10],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[2,10],16:[2,10],17:[2,10],18:[1,20],19:[1,21],21:[2,10],23:[2,10],29:[1,22],30:[2,10],31:[2,10],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,13],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,13],13:[2,13],16:[2,13],17:[2,13],18:[2,13],19:[2,13],21:[2,13],23:[2,13],29:[1,22],30:[2,13],31:[2,13],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,14],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,14],13:[2,14],16:[2,14],17:[2,14],18:[2,14],19:[2,14],21:[2,14],23:[2,14],29:[1,22],30:[2,14],31:[2,14],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,24],6:[2,24],7:[2,24],8:[2,24],9:[2,24],10:[1,16],11:[2,24],12:[2,24],13:[2,24],16:[2,24],17:[2,24],18:[2,24],19:[2,24],21:[2,24],23:[2,24],29:[2,24],30:[2,24],31:[2,24],32:24,33:[2,24],34:[2,24],35:[2,24],36:[2,24],37:[2,24],38:[2,24],39:[2,24]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],29:[1,22],30:[1,23],31:[1,60],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,33],6:[2,33],7:[2,33],8:[2,33],9:[2,33],10:[2,33],11:[2,33],12:[2,33],13:[2,33],16:[2,33],17:[2,33],18:[2,33],19:[2,33],21:[2,33],23:[2,33],29:[2,33],30:[2,33],31:[2,33],33:[2,33],34:[2,33],35:[2,33],36:[2,33],37:[2,33],38:[2,33],39:[2,33]},{5:[2,34],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,34],13:[2,34],16:[2,34],17:[2,34],18:[2,34],19:[2,34],21:[2,34],23:[2,34],29:[1,22],30:[2,34],31:[2,34],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:61,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,15],6:[2,15],7:[2,15],8:[2,15],9:[2,15],10:[2,15],11:[2,15],12:[2,15],13:[2,15],16:[2,15],17:[2,15],18:[2,15],19:[2,15],21:[2,15],23:[2,15],29:[2,15],30:[2,15],31:[2,15],33:[2,15],34:[2,15],35:[2,15],36:[2,15],37:[2,15],38:[2,15],39:[2,15]},{4:62,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,20],6:[2,20],7:[2,20],8:[2,20],9:[2,20],10:[2,20],11:[2,20],12:[2,20],13:[2,20],16:[2,20],17:[2,20],18:[2,20],19:[2,20],21:[2,20],23:[2,20],29:[2,20],30:[2,20],31:[2,20],32:24,33:[2,20],34:[2,20],35:[2,20],36:[2,20],37:[2,20],38:[2,20],39:[2,20]},{5:[2,21],6:[2,21],7:[2,21],8:[2,21],9:[2,21],10:[2,21],11:[2,21],12:[2,21],13:[2,21],16:[2,21],17:[2,21],18:[2,21],19:[2,21],21:[2,21],23:[2,21],29:[2,21],30:[2,21],31:[2,21],33:[2,21],34:[2,21],35:[2,21],36:[2,21],37:[2,21],38:[2,21],39:[2,21]},{21:[1,63],23:[1,64]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[2,35],23:[2,35],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:65,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],17:[1,66],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[1,67],23:[2,36],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,22],6:[2,22],7:[2,22],8:[2,22],9:[2,22],10:[2,22],11:[2,22],12:[2,22],13:[2,22],16:[2,22],17:[2,22],18:[2,22],19:[2,22],21:[2,22],23:[2,22],29:[2,22],30:[2,22],31:[2,22],33:[2,22],34:[2,22],35:[2,22],36:[2,22],37:[2,22],38:[2,22],39:[2,22]},{4:68,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,25],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[2,25],17:[2,25],18:[1,20],19:[1,21],21:[2,25],23:[2,25],29:[1,22],30:[1,23],31:[2,25],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:69,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,16],6:[2,16],7:[2,16],8:[2,16],9:[2,16],10:[2,16],11:[2,16],12:[2,16],13:[2,16],16:[2,16],17:[2,16],18:[2,16],19:[2,16],21:[2,16],23:[2,16],29:[2,16],30:[2,16],31:[2,16],33:[2,16],34:[2,16],35:[2,16],36:[2,16],37:[2,16],38:[2,16],39:[2,16]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[2,36],23:[2,36],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,12],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[2,12],17:[2,12],18:[1,20],19:[1,21],21:[2,12],23:[2,12],29:[1,22],30:[1,23],31:[2,12],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]}],defaultActions:{11:[2,1]},parseError:function(t,e){throw new Error(t)},parse:function(t){var e=this,n=[0],r=[null],s=[],i=this.table,o="",a=0,l=0,h=0;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,void 0===this.lexer.yylloc&&(this.lexer.yylloc={});var c=this.lexer.yylloc;s.push(c);var u=this.lexer.options&&this.lexer.options.ranges;function y(){var t;return"number"!=typeof(t=e.lexer.lex()||1)&&(t=e.symbols_[t]||t),t}"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var f,p,g,d,m,b,x,_,w,k,$={};;){if(g=n[n.length-1],this.defaultActions[g]?d=this.defaultActions[g]:(null==f&&(f=y()),d=i[g]&&i[g][f]),void 0===d||!d.length||!d[0]){var v="";if(!h){for(b in w=[],i[g])this.terminals_[b]&&b>2&&w.push("'"+this.terminals_[b]+"'");v=this.lexer.showPosition?"Parse error on line "+(a+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+w.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(a+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(v,{text:this.lexer.match,token:this.terminals_[f]||f,line:this.lexer.yylineno,loc:c,expected:w})}if(3==h){if(1==f)throw new Error(v||"Parsing halted.");l=this.lexer.yyleng,o=this.lexer.yytext,a=this.lexer.yylineno,c=this.lexer.yylloc,f=y()}for(;!(2..toString()in i[g]);){if(0===g)throw new Error(v||"Parsing halted.");k=1,n.length=n.length-2*k,r.length=r.length-k,s.length=s.length-k,g=n[n.length-1]}p=2==f?null:f,f=2,d=i[g=n[n.length-1]]&&i[g][2],h=3}if(d[0]instanceof Array&&d.length>1)throw new Error("Parse Error: multiple actions possible at state: "+g+", token: "+f);switch(d[0]){case 1:n.push(f),r.push(this.lexer.yytext),s.push(this.lexer.yylloc),n.push(d[1]),f=null,p?(f=p,p=null):(l=this.lexer.yyleng,o=this.lexer.yytext,a=this.lexer.yylineno,c=this.lexer.yylloc,h>0&&h--);break;case 2:if(x=this.productions_[d[1]][1],$.$=r[r.length-x],$._$={first_line:s[s.length-(x||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(x||1)].first_column,last_column:s[s.length-1].last_column},u&&($._$.range=[s[s.length-(x||1)].range[0],s[s.length-1].range[1]]),void 0!==(m=this.performAction.call($,o,l,a,this.yy,d[1],r,s)))return m;x&&(n=n.slice(0,-1*x*2),r=r.slice(0,-1*x),s=s.slice(0,-1*x)),n.push(this.productions_[d[1]][0]),r.push($.$),s.push($._$),_=i[n[n.length-2]][n[n.length-1]],n.push(_);break;case 3:return!0}}return!0}},e=function(){var t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t){return this._input=t,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e-1),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this},more:function(){return this._more=!0,this},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},next:function(){if(this.done)return this.EOF;var t,e,n,r,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),o=0;oe[0].length)||(e=n,r=o,this.options.flex));o++);return e?((s=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],t=this.performAction.call(this,this.yy,this,i[r],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),t||void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return void 0!==t?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)},options:{},performAction:function(t,e,n,r){switch(n){case 0:return"*";case 1:return"/";case 2:return"-";case 3:return"+";case 4:return"^";case 5:return"(";case 6:return")";case 7:return",";case 8:return"==";case 9:return"!=";case 10:return"~=";case 11:return">=";case 12:return"<=";case 13:return"<";case 14:return">";case 15:return"notIn";case 16:return"and";case 17:return"or";case 18:return"not";case 19:return"in";case 20:return"of";case 21:return"if";case 22:return"then";case 23:return"else";case 24:return"mod";case 25:break;case 26:return"Number";case 27:return e.yytext=JSON.stringify({name:e.yytext,type:"unescaped"}),"Symbol";case 28:return e.yytext=JSON.stringify({name:t.buildString("'",e.yytext),type:"single-quoted"}),"Symbol";case 29:return e.yytext=JSON.stringify(t.buildString('"',e.yytext)),"String";case 30:return"%";case 31:return"?";case 32:return":";case 33:return"EOF"}},rules:[/^(?:\*)/,/^(?:\/)/,/^(?:-)/,/^(?:\+)/,/^(?:\^)/,/^(?:\()/,/^(?:\))/,/^(?:\,)/,/^(?:==)/,/^(?:\!=)/,/^(?:\~=)/,/^(?:>=)/,/^(?:<=)/,/^(?:<)/,/^(?:>)/,/^(?:not\s+in[^\w])/,/^(?:and[^\w])/,/^(?:or[^\w])/,/^(?:not[^\w])/,/^(?:in[^\w])/,/^(?:of[^\w])/,/^(?:if[^\w])/,/^(?:then[^\w])/,/^(?:else[^\w])/,/^(?:mod[^\w])/,/^(?:\s+)/,/^(?:[0-9]+(?:\.[0-9]+)?(?![0-9\.]))/,/^(?:[a-zA-Z$_][\.a-zA-Z0-9$_]*)/,/^(?:'(?:\\'|\\\\|[^'\\])*')/,/^(?:"(?:\\"|\\\\|[^"\\])*")/,/^(?:\%)/,/^(?:\?)/,/^(?::)/,/^(?:$)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],inclusive:!0}}};return t}();function n(){this.yy={}}return t.lexer=e,n.prototype=t,t.Parser=n,new n}();const n=e;e.Parser;class r extends ReferenceError{I18N_STRING="UNKNOWN_FUNCTION";constructor(t){super(`Unknown function: ${t}()`),this.functionName=t}}class s extends ReferenceError{I18N_STRING="UNKNOWN_PROPERTY";constructor(t){super(`Property “${t}” does not exist.`),this.propertyName=t}}class i extends TypeError{I18N_STRING="UNKNOWN_OPTION";constructor(t){super(`Unknown option: ${t}`),this.keyName=t}}class o extends TypeError{I18N_STRING="UNEXPECTED_TYPE";constructor(t,e){super(`Expected a ${t}, but got a ${e} instead.`),this.expectedType=t,this.recievedType=e}}class a extends Error{I18N_STRING="INTERNAL";constructor(t){super(t)}}function l(t,e){return("object"==typeof t||"function"==typeof t)&&Object.prototype.hasOwnProperty.call(t,e)}function h(t,e){return(t%e+e)%e}function c(t){return Array.isArray(t)&&1===t.length&&(t=t[0]),function(t){return"object"!=typeof t?t:t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():void 0}(t)}function u(t){return void 0===(t=c(t))?"undefined":null===t?"null":!0===t?"true":!1===t?"false":"number"==typeof t?"number":"string"==typeof t?"text":"object"!=typeof t&&"function"!=typeof t?"unknown type":Array.isArray(t)?"list":"object"}function y(t){if("number"==typeof(t=c(t)))return t;throw new o("number",u(t))}function f(t){if("string"==typeof(t=c(t)))return t;throw new o("text",u(t))}function p(t){if("string"==typeof(t=c(t))||"number"==typeof t)return t;throw new o("text or number",u(t))}function g(t){if(null==t)throw new o("list",u(t));return Array.isArray(t)?t:[t]}function d(t){const e=[...t],n=[];for(;e.length;){const t=e.pop();Array.isArray(t)?e.push(...t):n.push(t)}return n.reverse()}const m={isfn:(t,e)=>l(t,e)&&"function"==typeof t[e],unknown(t){throw new r(t)},coerceArray:g,coerceNumber:y,coerceNumberOrString:p,coerceBoolean:function(t){if("boolean"==typeof(t=c(t)))return t;throw new o("logical value (“true” or “false”)",u(t))},isSubset(t,e){const n=g(t),r=g(e);return n.every((t=>r.includes(t)))},warnDeprecated:function(){let t={ternary:0,modulo:0};return(e,n)=>{switch(e){case"ternary":if(t.ternary++>=3)break;console.warn("The use of ? and : as conditional operators has been deprecated in Filtrex v3 in favor of the if..then..else ternary operator. See issue #34 for more information.");break;case"modulo":if(t.modulo++>=3)break;console.warn("The use of '%' as a modulo operator has been deprecated in Filtrex v3 in favor of the 'mod' operator. You can use it like this: '3 mod 2 == 1'. See issue #48 for more information.")}return n}}(),buildString(t,e){t=String(t)[0];let n="";if((e=String(e))[0]!==t||e[e.length-1]!==t)throw new a("Unexpected internal error: String literal doesn't begin/end with the right quotation mark.");for(let r=1;r=e.length-1)throw new a("Unexpected internal error: Unescaped backslash at the end of string literal.");if("\\"===e[r])n+="\\";else{if(e[r]!==t)throw new a(`Unexpected internal error: Invalid escaped character in string literal: ${e[r]}`);n+=t}}else{if(e[r]===t)throw new a("Unexpected internal error: String literal contains unescaped quotation mark.");n+=e[r]}return n},reduceRelation(t){const e=[],n=[];let r=d([t[0]]).join(""),s=0;for(let i=1;i2)throw new TypeError("Too many arguments.");e="object"==typeof e?e:{};const o=["extraFunctions","constants","customProp","operators"];let{extraFunctions:a,constants:c,customProp:u,operators:g}=e;for(const t of Object.keys(e))if(!o.includes(t))throw new i(t);let b={abs:Math.abs,ceil:Math.ceil,floor:Math.floor,log:Math.log,log2:Math.log2,log10:Math.log10,max:Math.max,min:Math.min,round:Math.round,sqrt:Math.sqrt,exists:t=>null!=t,empty:t=>null==t||""===t||Array.isArray(t)&&0===t.length};if(a)for(const t of Object.keys(a))b[t]=a[t];let x={"+":(t,e)=>p(t)+p(e),"-":(t,e)=>void 0===e?-y(t):y(t)-y(e),"*":(t,e)=>y(t)*y(e),"/":(t,e)=>y(t)/y(e),"^":(t,e)=>Math.pow(y(t),y(e)),mod:(t,e)=>h(y(t),y(e)),"==":(t,e)=>t===e,"!=":(t,e)=>t!==e,"<":(t,e)=>y(t)y(t)<=y(e),">=":(t,e)=>y(t)>=y(e),">":(t,e)=>y(t)>y(e),"~=":(t,e)=>RegExp(f(e)).test(f(t))};if(g)for(const t of Object.keys(g))x[t]=g[t];g=x,c=c??{};let _=d(n.parse(t));function w(t,e){if(l(e??{},t))return e[t];throw new s(t)}function k(t){return function(e){if(l(t??{},e))return t[e];throw new s(e)}}function $(t){return function({name:e},...n){if(l(t,e)&&"function"==typeof t[e])return t[e](...n);throw new r(e)}}function v({name:t,type:e},n){return"unescaped"===e&&l(c,t)?c[t]:w(t,n)}_.unshift("return "),_.push(";"),"function"==typeof u&&(w=(t,e)=>u(t,k(e),e));let S=new Function("call","ops","std","prop","data",_.join(""));return function(t){try{return S($(b),g,m,v,t)}catch(t){return t}}},Object.defineProperty(t,"__esModule",{value:!0}),t}({}); \ No newline at end of file +var filtrex=function(t){"use strict";var e=function(){var t={trace:function(){},yy:{},symbols_:{error:2,expressions:3,e:4,EOF:5,"-":6,"+":7,"*":8,"/":9,"^":10,mod:11,and:12,or:13,not:14,if:15,then:16,else:17,in:18,notIn:19,"(":20,")":21,Arguments:22,",":23,Number:24,Symbol:25,String:26,of:27,Relation:28,"%":29,"?":30,":":31,RelationalOperator:32,"==":33,"!=":34,"~=":35,"<":36,"<=":37,">=":38,">":39,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",6:"-",7:"+",8:"*",9:"/",10:"^",11:"mod",12:"and",13:"or",14:"not",15:"if",16:"then",17:"else",18:"in",19:"notIn",20:"(",21:")",23:",",24:"Number",25:"Symbol",26:"String",27:"of",29:"%",30:"?",31:":",33:"==",34:"!=",35:"~=",36:"<",37:"<=",38:">=",39:">"},productions_:[0,[3,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,2],[4,6],[4,3],[4,3],[4,3],[4,5],[4,1],[4,1],[4,1],[4,3],[4,3],[4,4],[4,1],[4,3],[4,5],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[28,3],[28,3],[22,1],[22,3]],performAction:function(t,e,n,r,s,i,o){var a=i.length-1;switch(s){case 1:return i[a-1];case 2:this.$=["(","ops['-'](",i[a],")",")"];break;case 3:case 4:case 5:case 6:case 7:this.$=["(","ops['",i[a-1],"'](",i[a-2],", ",i[a],")",")"];break;case 8:this.$=["(","ops.mod(",i[a-2],", ",i[a],")",")"];break;case 9:this.$=["(","","std.coerceBoolean","(",i[a-2],") && ","std.coerceBoolean","(",i[a],")",")"];break;case 10:this.$=["(","","std.coerceBoolean","(",i[a-2],") || ","std.coerceBoolean","(",i[a],")",")"];break;case 11:this.$=["(","! ","std.coerceBoolean","(",i[a],")",")"];break;case 12:this.$=["(","","std.coerceBoolean","(",i[a-4],") ? ",i[a-2]," : ",i[a],"",")"];break;case 13:this.$=["(","std.isSubset(",i[a-2],", ",i[a],")",")"];break;case 14:this.$=["(","!std.isSubset(",i[a-2],", ",i[a],")",")"];break;case 15:this.$=["(","",i[a-1],"",")"];break;case 16:this.$=["(","[ ",i[a-3],", ",i[a-1]," ]",")"];break;case 17:this.$=["",i[a],""];break;case 18:this.$=["prop(",i[a],", data)"];break;case 19:this.$=["",i[a],""];break;case 20:this.$=["prop(",i[a-2],", ",i[a],")"];break;case 21:this.$=["call(",i[a-2],")"];break;case 22:this.$=["call(",i[a-3],", ",i[a-1],")"];break;case 23:this.$=r.reduceRelation(i[a]);break;case 24:this.$=["std.warnDeprecated('modulo', ops['mod'](",i[a-2],", ",i[a],"))"];break;case 25:this.$=["std.warnDeprecated('ternary', ","std.coerceBoolean","(",i[a-4],") ? ",i[a-2]," : ",i[a],")"];break;case 26:this.$=["=="];break;case 27:this.$=["!="];break;case 28:this.$=["~="];break;case 29:this.$=["<"];break;case 30:this.$=["<="];break;case 31:this.$=[">="];break;case 32:this.$=[">"];break;case 33:this.$=[i[a-2],i[a-1],...i[a]];break;case 34:this.$=[i[a-2],i[a-1],i[a]];break;case 35:this.$=["",i[a],""];break;case 36:this.$=["",i[a-2],", ",i[a],""]}},table:[{3:1,4:2,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{1:[3]},{5:[1,11],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:32,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:33,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:34,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:35,6:[1,3],14:[1,4],15:[1,5],20:[1,6],22:36,24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,17],6:[2,17],7:[2,17],8:[2,17],9:[2,17],10:[2,17],11:[2,17],12:[2,17],13:[2,17],16:[2,17],17:[2,17],18:[2,17],19:[2,17],21:[2,17],23:[2,17],29:[2,17],30:[2,17],31:[2,17],33:[2,17],34:[2,17],35:[2,17],36:[2,17],37:[2,17],38:[2,17],39:[2,17]},{5:[2,18],6:[2,18],7:[2,18],8:[2,18],9:[2,18],10:[2,18],11:[2,18],12:[2,18],13:[2,18],16:[2,18],17:[2,18],18:[2,18],19:[2,18],20:[1,38],21:[2,18],23:[2,18],27:[1,37],29:[2,18],30:[2,18],31:[2,18],33:[2,18],34:[2,18],35:[2,18],36:[2,18],37:[2,18],38:[2,18],39:[2,18]},{5:[2,19],6:[2,19],7:[2,19],8:[2,19],9:[2,19],10:[2,19],11:[2,19],12:[2,19],13:[2,19],16:[2,19],17:[2,19],18:[2,19],19:[2,19],21:[2,19],23:[2,19],29:[2,19],30:[2,19],31:[2,19],33:[2,19],34:[2,19],35:[2,19],36:[2,19],37:[2,19],38:[2,19],39:[2,19]},{5:[2,23],6:[2,23],7:[2,23],8:[2,23],9:[2,23],10:[2,23],11:[2,23],12:[2,23],13:[2,23],16:[2,23],17:[2,23],18:[2,23],19:[2,23],21:[2,23],23:[2,23],29:[2,23],30:[2,23],31:[2,23],33:[2,23],34:[2,23],35:[2,23],36:[2,23],37:[2,23],38:[2,23],39:[2,23]},{1:[2,1]},{4:39,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:40,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:41,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:42,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:43,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:44,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:45,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:46,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:47,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:48,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:49,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:50,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:52,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:51},{6:[2,26],14:[2,26],15:[2,26],20:[2,26],24:[2,26],25:[2,26],26:[2,26]},{6:[2,27],14:[2,27],15:[2,27],20:[2,27],24:[2,27],25:[2,27],26:[2,27]},{6:[2,28],14:[2,28],15:[2,28],20:[2,28],24:[2,28],25:[2,28],26:[2,28]},{6:[2,29],14:[2,29],15:[2,29],20:[2,29],24:[2,29],25:[2,29],26:[2,29]},{6:[2,30],14:[2,30],15:[2,30],20:[2,30],24:[2,30],25:[2,30],26:[2,30]},{6:[2,31],14:[2,31],15:[2,31],20:[2,31],24:[2,31],25:[2,31],26:[2,31]},{6:[2,32],14:[2,32],15:[2,32],20:[2,32],24:[2,32],25:[2,32],26:[2,32]},{5:[2,2],6:[2,2],7:[2,2],8:[2,2],9:[2,2],10:[1,16],11:[2,2],12:[2,2],13:[2,2],16:[2,2],17:[2,2],18:[2,2],19:[2,2],21:[2,2],23:[2,2],29:[2,2],30:[2,2],31:[2,2],32:24,33:[2,2],34:[2,2],35:[2,2],36:[2,2],37:[2,2],38:[2,2],39:[2,2]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[1,16],11:[2,11],12:[2,11],13:[2,11],16:[2,11],17:[2,11],18:[2,11],19:[2,11],21:[2,11],23:[2,11],29:[2,11],30:[2,11],31:[2,11],32:24,33:[2,11],34:[2,11],35:[2,11],36:[2,11],37:[2,11],38:[2,11],39:[2,11]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[1,53],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[1,54],23:[2,35],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{23:[1,55]},{4:56,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{4:59,6:[1,3],14:[1,4],15:[1,5],20:[1,6],21:[1,57],22:58,24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,3],6:[2,3],7:[2,3],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,3],13:[2,3],16:[2,3],17:[2,3],18:[2,3],19:[2,3],21:[2,3],23:[2,3],29:[1,22],30:[2,3],31:[2,3],32:24,33:[2,3],34:[2,3],35:[2,3],36:[2,3],37:[2,3],38:[2,3],39:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,4],13:[2,4],16:[2,4],17:[2,4],18:[2,4],19:[2,4],21:[2,4],23:[2,4],29:[1,22],30:[2,4],31:[2,4],32:24,33:[2,4],34:[2,4],35:[2,4],36:[2,4],37:[2,4],38:[2,4],39:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[1,16],11:[2,5],12:[2,5],13:[2,5],16:[2,5],17:[2,5],18:[2,5],19:[2,5],21:[2,5],23:[2,5],29:[2,5],30:[2,5],31:[2,5],32:24,33:[2,5],34:[2,5],35:[2,5],36:[2,5],37:[2,5],38:[2,5],39:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[1,16],11:[2,6],12:[2,6],13:[2,6],16:[2,6],17:[2,6],18:[2,6],19:[2,6],21:[2,6],23:[2,6],29:[2,6],30:[2,6],31:[2,6],32:24,33:[2,6],34:[2,6],35:[2,6],36:[2,6],37:[2,6],38:[2,6],39:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[1,16],11:[2,7],12:[2,7],13:[2,7],16:[2,7],17:[2,7],18:[2,7],19:[2,7],21:[2,7],23:[2,7],29:[2,7],30:[2,7],31:[2,7],32:24,33:[2,7],34:[2,7],35:[2,7],36:[2,7],37:[2,7],38:[2,7],39:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[1,16],11:[2,8],12:[2,8],13:[2,8],16:[2,8],17:[2,8],18:[2,8],19:[2,8],21:[2,8],23:[2,8],29:[2,8],30:[2,8],31:[2,8],32:24,33:[2,8],34:[2,8],35:[2,8],36:[2,8],37:[2,8],38:[2,8],39:[2,8]},{5:[2,9],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,9],13:[2,9],16:[2,9],17:[2,9],18:[1,20],19:[1,21],21:[2,9],23:[2,9],29:[1,22],30:[2,9],31:[2,9],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,10],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[2,10],16:[2,10],17:[2,10],18:[1,20],19:[1,21],21:[2,10],23:[2,10],29:[1,22],30:[2,10],31:[2,10],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,13],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,13],13:[2,13],16:[2,13],17:[2,13],18:[2,13],19:[2,13],21:[2,13],23:[2,13],29:[1,22],30:[2,13],31:[2,13],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,14],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,14],13:[2,14],16:[2,14],17:[2,14],18:[2,14],19:[2,14],21:[2,14],23:[2,14],29:[1,22],30:[2,14],31:[2,14],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,24],6:[2,24],7:[2,24],8:[2,24],9:[2,24],10:[1,16],11:[2,24],12:[2,24],13:[2,24],16:[2,24],17:[2,24],18:[2,24],19:[2,24],21:[2,24],23:[2,24],29:[2,24],30:[2,24],31:[2,24],32:24,33:[2,24],34:[2,24],35:[2,24],36:[2,24],37:[2,24],38:[2,24],39:[2,24]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],29:[1,22],30:[1,23],31:[1,60],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,33],6:[2,33],7:[2,33],8:[2,33],9:[2,33],10:[2,33],11:[2,33],12:[2,33],13:[2,33],16:[2,33],17:[2,33],18:[2,33],19:[2,33],21:[2,33],23:[2,33],29:[2,33],30:[2,33],31:[2,33],33:[2,33],34:[2,33],35:[2,33],36:[2,33],37:[2,33],38:[2,33],39:[2,33]},{5:[2,34],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[2,34],13:[2,34],16:[2,34],17:[2,34],18:[2,34],19:[2,34],21:[2,34],23:[2,34],29:[1,22],30:[2,34],31:[2,34],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:61,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,15],6:[2,15],7:[2,15],8:[2,15],9:[2,15],10:[2,15],11:[2,15],12:[2,15],13:[2,15],16:[2,15],17:[2,15],18:[2,15],19:[2,15],21:[2,15],23:[2,15],29:[2,15],30:[2,15],31:[2,15],33:[2,15],34:[2,15],35:[2,15],36:[2,15],37:[2,15],38:[2,15],39:[2,15]},{4:62,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,20],6:[2,20],7:[2,20],8:[2,20],9:[2,20],10:[2,20],11:[2,20],12:[2,20],13:[2,20],16:[2,20],17:[2,20],18:[2,20],19:[2,20],21:[2,20],23:[2,20],29:[2,20],30:[2,20],31:[2,20],32:24,33:[2,20],34:[2,20],35:[2,20],36:[2,20],37:[2,20],38:[2,20],39:[2,20]},{5:[2,21],6:[2,21],7:[2,21],8:[2,21],9:[2,21],10:[2,21],11:[2,21],12:[2,21],13:[2,21],16:[2,21],17:[2,21],18:[2,21],19:[2,21],21:[2,21],23:[2,21],29:[2,21],30:[2,21],31:[2,21],33:[2,21],34:[2,21],35:[2,21],36:[2,21],37:[2,21],38:[2,21],39:[2,21]},{21:[1,63],23:[1,64]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[2,35],23:[2,35],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:65,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],17:[1,66],18:[1,20],19:[1,21],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[1,67],23:[2,36],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,22],6:[2,22],7:[2,22],8:[2,22],9:[2,22],10:[2,22],11:[2,22],12:[2,22],13:[2,22],16:[2,22],17:[2,22],18:[2,22],19:[2,22],21:[2,22],23:[2,22],29:[2,22],30:[2,22],31:[2,22],33:[2,22],34:[2,22],35:[2,22],36:[2,22],37:[2,22],38:[2,22],39:[2,22]},{4:68,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,25],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[2,25],17:[2,25],18:[1,20],19:[1,21],21:[2,25],23:[2,25],29:[1,22],30:[1,23],31:[2,25],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{4:69,6:[1,3],14:[1,4],15:[1,5],20:[1,6],24:[1,7],25:[1,8],26:[1,9],28:10},{5:[2,16],6:[2,16],7:[2,16],8:[2,16],9:[2,16],10:[2,16],11:[2,16],12:[2,16],13:[2,16],16:[2,16],17:[2,16],18:[2,16],19:[2,16],21:[2,16],23:[2,16],29:[2,16],30:[2,16],31:[2,16],33:[2,16],34:[2,16],35:[2,16],36:[2,16],37:[2,16],38:[2,16],39:[2,16]},{6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],18:[1,20],19:[1,21],21:[2,36],23:[2,36],29:[1,22],30:[1,23],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]},{5:[2,12],6:[1,13],7:[1,12],8:[1,14],9:[1,15],10:[1,16],11:[1,17],12:[1,18],13:[1,19],16:[2,12],17:[2,12],18:[1,20],19:[1,21],21:[2,12],23:[2,12],29:[1,22],30:[1,23],31:[2,12],32:24,33:[1,25],34:[1,26],35:[1,27],36:[1,28],37:[1,29],38:[1,30],39:[1,31]}],defaultActions:{11:[2,1]},parseError:function(t,e){throw new Error(t)},parse:function(t){var e=this,n=[0],r=[null],s=[],i=this.table,o="",a=0,l=0,c=0;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,void 0===this.lexer.yylloc&&(this.lexer.yylloc={});var h=this.lexer.yylloc;s.push(h);var u=this.lexer.options&&this.lexer.options.ranges;function y(){var t;return"number"!=typeof(t=e.lexer.lex()||1)&&(t=e.symbols_[t]||t),t}"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var f,p,g,d,m,b,x,_,w,k,$={};;){if(g=n[n.length-1],this.defaultActions[g]?d=this.defaultActions[g]:(null==f&&(f=y()),d=i[g]&&i[g][f]),void 0===d||!d.length||!d[0]){var v="";if(!c){for(b in w=[],i[g])this.terminals_[b]&&b>2&&w.push("'"+this.terminals_[b]+"'");v=this.lexer.showPosition?"Parse error on line "+(a+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+w.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(a+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(v,{text:this.lexer.match,token:this.terminals_[f]||f,line:this.lexer.yylineno,loc:h,expected:w})}if(3==c){if(1==f)throw new Error(v||"Parsing halted.");l=this.lexer.yyleng,o=this.lexer.yytext,a=this.lexer.yylineno,h=this.lexer.yylloc,f=y()}for(;!(2..toString()in i[g]);){if(0===g)throw new Error(v||"Parsing halted.");k=1,n.length=n.length-2*k,r.length=r.length-k,s.length=s.length-k,g=n[n.length-1]}p=2==f?null:f,f=2,d=i[g=n[n.length-1]]&&i[g][2],c=3}if(d[0]instanceof Array&&d.length>1)throw new Error("Parse Error: multiple actions possible at state: "+g+", token: "+f);switch(d[0]){case 1:n.push(f),r.push(this.lexer.yytext),s.push(this.lexer.yylloc),n.push(d[1]),f=null,p?(f=p,p=null):(l=this.lexer.yyleng,o=this.lexer.yytext,a=this.lexer.yylineno,h=this.lexer.yylloc,c>0&&c--);break;case 2:if(x=this.productions_[d[1]][1],$.$=r[r.length-x],$._$={first_line:s[s.length-(x||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(x||1)].first_column,last_column:s[s.length-1].last_column},u&&($._$.range=[s[s.length-(x||1)].range[0],s[s.length-1].range[1]]),void 0!==(m=this.performAction.call($,o,l,a,this.yy,d[1],r,s)))return m;x&&(n=n.slice(0,-1*x*2),r=r.slice(0,-1*x),s=s.slice(0,-1*x)),n.push(this.productions_[d[1]][0]),r.push($.$),s.push($._$),_=i[n[n.length-2]][n[n.length-1]],n.push(_);break;case 3:return!0}}return!0}},e=function(){var t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t){return this._input=t,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e-1),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this},more:function(){return this._more=!0,this},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},next:function(){if(this.done)return this.EOF;var t,e,n,r,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),o=0;oe[0].length)||(e=n,r=o,this.options.flex));o++);return e?((s=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],t=this.performAction.call(this,this.yy,this,i[r],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),t||void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return void 0!==t?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)},options:{},performAction:function(t,e,n,r){switch(n){case 0:return"*";case 1:return"/";case 2:return"-";case 3:return"+";case 4:return"^";case 5:return"(";case 6:return")";case 7:return",";case 8:return"==";case 9:return"!=";case 10:return"~=";case 11:return">=";case 12:return"<=";case 13:return"<";case 14:return">";case 15:return"notIn";case 16:return"and";case 17:return"or";case 18:return"not";case 19:return"in";case 20:return"of";case 21:return"if";case 22:return"then";case 23:return"else";case 24:return"mod";case 25:break;case 26:return"Number";case 27:return e.yytext=JSON.stringify({name:e.yytext,type:"unescaped"}),"Symbol";case 28:return e.yytext=JSON.stringify({name:t.buildString("'",e.yytext),type:"single-quoted"}),"Symbol";case 29:return e.yytext=JSON.stringify(t.buildString('"',e.yytext)),"String";case 30:return"%";case 31:return"?";case 32:return":";case 33:return"EOF"}},rules:[/^(?:\*)/,/^(?:\/)/,/^(?:-)/,/^(?:\+)/,/^(?:\^)/,/^(?:\()/,/^(?:\))/,/^(?:\,)/,/^(?:==)/,/^(?:\!=)/,/^(?:\~=)/,/^(?:>=)/,/^(?:<=)/,/^(?:<)/,/^(?:>)/,/^(?:not\s+in[^\w])/,/^(?:and[^\w])/,/^(?:or[^\w])/,/^(?:not[^\w])/,/^(?:in[^\w])/,/^(?:of[^\w])/,/^(?:if[^\w])/,/^(?:then[^\w])/,/^(?:else[^\w])/,/^(?:mod[^\w])/,/^(?:\s+)/,/^(?:[0-9]+(?:\.[0-9]+)?(?![0-9\.]))/,/^(?:[a-zA-Z$_][\.a-zA-Z0-9$_]*)/,/^(?:'(?:\\'|\\\\|[^'\\])*')/,/^(?:"(?:\\"|\\\\|[^"\\])*")/,/^(?:\%)/,/^(?:\?)/,/^(?::)/,/^(?:$)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],inclusive:!0}}};return t}();function n(){this.yy={}}return t.lexer=e,n.prototype=t,t.Parser=n,new n}();const n=e;e.Parser;class r extends ReferenceError{I18N_STRING="UNKNOWN_FUNCTION";constructor(t){super(`Unknown function: ${t}()`),this.functionName=t}}class s extends ReferenceError{I18N_STRING="UNKNOWN_PROPERTY";constructor(t){super(`Property “${t}” does not exist.`),this.propertyName=t}}class i extends TypeError{I18N_STRING="UNKNOWN_OPTION";constructor(t){super(`Unknown option: ${t}`),this.keyName=t}}class o extends TypeError{I18N_STRING="UNEXPECTED_TYPE";constructor(t,e){super(`Expected a ${t}, but got a ${e} instead.`),this.expectedType=t,this.recievedType=e}}class a extends Error{I18N_STRING="INTERNAL";constructor(t){super(t)}}function l(t,e){return("object"==typeof t||"function"==typeof t)&&Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){return(t%e+e)%e}function h(t){return Array.isArray(t)&&1===t.length&&(t=t[0]),function(t){return"object"!=typeof t?t:t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():void 0}(t)}function u(t){return void 0===(t=h(t))?"undefined":null===t?"null":!0===t?"true":!1===t?"false":"number"==typeof t?"number":"string"==typeof t?"text":"object"!=typeof t&&"function"!=typeof t?"unknown type":Array.isArray(t)?"list":"object"}function y(t){if("number"==typeof(t=h(t)))return t;throw new o("number",u(t))}function f(t){if("string"==typeof(t=h(t)))return t;throw new o("text",u(t))}function p(t){if("string"==typeof(t=h(t))||"number"==typeof t)return t;throw new o("text or number",u(t))}function g(t){if(null==t)throw new o("list",u(t));return Array.isArray(t)?t:[t]}function d(t){const e=[...t],n=[];for(;e.length;){const t=e.pop();Array.isArray(t)?e.push(...t):n.push(t)}return n.reverse()}const m={isfn:(t,e)=>l(t,e)&&"function"==typeof t[e],unknown(t){throw new r(t)},coerceArray:g,coerceNumber:y,coerceNumberOrString:p,coerceBoolean:function(t){if("boolean"==typeof(t=h(t)))return t;throw new o("logical value (“true” or “false”)",u(t))},isSubset(t,e){const n=g(t),r=g(e);return n.every((t=>r.includes(t)))},warnDeprecated:function(){let t={ternary:0,modulo:0};return(e,n)=>{switch(e){case"ternary":if(t.ternary++>=3)break;console.warn("The use of ? and : as conditional operators has been deprecated in Filtrex v3 in favor of the if..then..else ternary operator. See issue #34 for more information.");break;case"modulo":if(t.modulo++>=3)break;console.warn("The use of '%' as a modulo operator has been deprecated in Filtrex v3 in favor of the 'mod' operator. You can use it like this: '3 mod 2 == 1'. See issue #48 for more information.")}return n}}(),buildString(t,e){t=String(t)[0];let n="";if((e=String(e))[0]!==t||e[e.length-1]!==t)throw new a("Unexpected internal error: String literal doesn't begin/end with the right quotation mark.");for(let r=1;r=e.length-1)throw new a("Unexpected internal error: Unescaped backslash at the end of string literal.");if("\\"===e[r])n+="\\";else{if(e[r]!==t)throw new a(`Unexpected internal error: Invalid escaped character in string literal: ${e[r]}`);n+=t}}else{if(e[r]===t)throw new a("Unexpected internal error: String literal contains unescaped quotation mark.");n+=e[r]}return n},reduceRelation(t){const e=[],n=[];let r=d([t[0]]).join(""),s=0;for(let i=1;i2)throw new TypeError("Too many arguments.");e="object"==typeof e?e:{};const o=["extraFunctions","constants","customProp","operators"];let{extraFunctions:a,constants:h,customProp:u,operators:g}=e;for(const t of Object.keys(e))if(!o.includes(t))throw new i(t);let b={abs:Math.abs,ceil:Math.ceil,floor:Math.floor,log:Math.log,log2:Math.log2,log10:Math.log10,max:Math.max,min:Math.min,round:Math.round,sqrt:Math.sqrt,exists:t=>null!=t,empty:t=>null==t||""===t||Array.isArray(t)&&0===t.length};if(a)for(const t of Object.keys(a))b[t]=a[t];let x={"+":(t,e)=>p(t)+p(e),"-":(t,e)=>void 0===e?-y(t):y(t)-y(e),"*":(t,e)=>y(t)*y(e),"/":(t,e)=>y(t)/y(e),"^":(t,e)=>Math.pow(y(t),y(e)),mod:(t,e)=>c(y(t),y(e)),"==":(t,e)=>t===e,"!=":(t,e)=>t!==e,"<":(t,e)=>y(t)y(t)<=y(e),">=":(t,e)=>y(t)>=y(e),">":(t,e)=>y(t)>y(e),"~=":(t,e)=>RegExp(f(e)).test(f(t))};if(g)for(const t of Object.keys(g))x[t]=g[t];g=x,h=h??{};let _=d(n.parse(t));function w(t,e,n){if(l(e??{},t))return e[t];throw new s(t)}function k(t){return function(e){if(l(t??{},e))return t[e];throw new s(e)}}function $(t){return function({name:e},...n){if(l(t,e)&&"function"==typeof t[e])return t[e](...n);throw new r(e)}}function v({name:t,type:e},n){return"unescaped"===e&&l(h,t)?h[t]:w(t,n,e)}_.unshift("return "),_.push(";"),"function"==typeof u&&(w=(t,e,n)=>u(t,k(e),e,n));let S=new Function("call","ops","std","prop","data",_.join(""));return function(t){try{return S($(b),g,m,v,t)}catch(t){return t}}},t.useDotAccessOperator=function(t,e,n,r){if("single-quoted"===r)return e(t);const i=t.split(".");for(const t of i){if(!l(n??{},t))throw new s(t);n=n[t]}return n},Object.defineProperty(t,"__esModule",{value:!0}),t}({}); \ No newline at end of file diff --git a/dist/cjs/filtrex.js b/dist/cjs/filtrex.js index 72c75fb..db5da46 100644 --- a/dist/cjs/filtrex.js +++ b/dist/cjs/filtrex.js @@ -2262,6 +2262,46 @@ const std = parser.yy = Object.create(std); +/** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ +function useDotAccessOperator(name, get, obj, type) { + // ignore dots inside escaped symbol + if (type === 'single-quoted') + return get(name) + + + const parts = name.split('.'); + + for (const propertyName of parts) { + if (hasOwnProperty(obj ?? {}, propertyName)) { + obj = obj[propertyName]; + } else { + throw new UnknownPropertyError(propertyName) + } + } + + return obj +} + /** * A simple, safe, JavaScript expression engine, allowing end-users to enter arbitrary expressions without p0wning you. @@ -2395,7 +2435,7 @@ function compileExpression(expression, options) { // Metaprogramming functions - function nakedProp(name, obj) { + function nakedProp(name, obj, type) { if (hasOwnProperty(obj ?? {}, name)) return obj[name] @@ -2412,7 +2452,7 @@ function compileExpression(expression, options) { } if (typeof customProp === 'function') { - nakedProp = (name, obj) => customProp(name, safeGetter(obj), obj); + nakedProp = (name, obj, type) => customProp(name, safeGetter(obj), obj, type); } function createCall(fns) { @@ -2428,7 +2468,7 @@ function compileExpression(expression, options) { if (type === 'unescaped' && hasOwnProperty(constants, name)) return constants[name] - return nakedProp(name, obj) + return nakedProp(name, obj, type) } @@ -2449,3 +2489,4 @@ function compileExpression(expression, options) { } exports.compileExpression = compileExpression; +exports.useDotAccessOperator = useDotAccessOperator; diff --git a/dist/esm/filtrex.d.ts b/dist/esm/filtrex.d.ts index 11f42db..e4c8d23 100644 --- a/dist/esm/filtrex.d.ts +++ b/dist/esm/filtrex.d.ts @@ -106,7 +106,8 @@ export interface Options customProp?: ( name: string, get: (name: string) => any, - object: any + object: any, + type: 'unescaped' | 'single-quoted' ) => any /** @@ -134,3 +135,31 @@ export interface Operators { '~='?: (a: any, b: any) => boolean } + +/** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ +export function useDotAccessOperator( + name: string, + get: (name: string) => any, + object: any, + type: 'unescaped' | 'single-quoted' +) diff --git a/dist/esm/filtrex.mjs b/dist/esm/filtrex.mjs index 848e208..4a56962 100644 --- a/dist/esm/filtrex.mjs +++ b/dist/esm/filtrex.mjs @@ -118,6 +118,46 @@ const std = parser.yy = Object.create(std) +/** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ +export function useDotAccessOperator(name, get, obj, type) { + // ignore dots inside escaped symbol + if (type === 'single-quoted') + return get(name) + + + const parts = name.split('.') + + for (const propertyName of parts) { + if (hasOwnProperty(obj ?? {}, propertyName)) { + obj = obj[propertyName] + } else { + throw new UnknownPropertyError(propertyName) + } + } + + return obj +} + /** * A simple, safe, JavaScript expression engine, allowing end-users to enter arbitrary expressions without p0wning you. @@ -251,7 +291,7 @@ export function compileExpression(expression, options) { // Metaprogramming functions - function nakedProp(name, obj) { + function nakedProp(name, obj, type) { if (hasOwnProperty(obj ?? {}, name)) return obj[name] @@ -268,7 +308,7 @@ export function compileExpression(expression, options) { } if (typeof customProp === 'function') { - nakedProp = (name, obj) => customProp(name, safeGetter(obj), obj) + nakedProp = (name, obj, type) => customProp(name, safeGetter(obj), obj, type) } function createCall(fns) { @@ -284,7 +324,7 @@ export function compileExpression(expression, options) { if (type === 'unescaped' && hasOwnProperty(constants, name)) return constants[name] - return nakedProp(name, obj) + return nakedProp(name, obj, type) } diff --git a/src/filtrex.d.ts b/src/filtrex.d.ts index 11f42db..e4c8d23 100644 --- a/src/filtrex.d.ts +++ b/src/filtrex.d.ts @@ -106,7 +106,8 @@ export interface Options customProp?: ( name: string, get: (name: string) => any, - object: any + object: any, + type: 'unescaped' | 'single-quoted' ) => any /** @@ -134,3 +135,31 @@ export interface Operators { '~='?: (a: any, b: any) => boolean } + +/** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ +export function useDotAccessOperator( + name: string, + get: (name: string) => any, + object: any, + type: 'unescaped' | 'single-quoted' +) diff --git a/src/filtrex.mjs b/src/filtrex.mjs index 848e208..4a56962 100644 --- a/src/filtrex.mjs +++ b/src/filtrex.mjs @@ -118,6 +118,46 @@ const std = parser.yy = Object.create(std) +/** + * A custom prop function which treats dots inside a symbol + * as property accessors. If you want to use the `foo.bar` + * syntax to access properties instead of the default + * `bar of foo`, you can use this function using the following + * code: + * ``` + * import { + * compileExpression, + * useDotAccessOperator + * } from 'filtrex' + * + * const expr = "foo.bar" + * + * const fn = compileExpression(expr, { + * customProp: useDotAccessOperator + * }); + * + * fn({ foo: { bar: 42 } }) // → 42 + * ``` + */ +export function useDotAccessOperator(name, get, obj, type) { + // ignore dots inside escaped symbol + if (type === 'single-quoted') + return get(name) + + + const parts = name.split('.') + + for (const propertyName of parts) { + if (hasOwnProperty(obj ?? {}, propertyName)) { + obj = obj[propertyName] + } else { + throw new UnknownPropertyError(propertyName) + } + } + + return obj +} + /** * A simple, safe, JavaScript expression engine, allowing end-users to enter arbitrary expressions without p0wning you. @@ -251,7 +291,7 @@ export function compileExpression(expression, options) { // Metaprogramming functions - function nakedProp(name, obj) { + function nakedProp(name, obj, type) { if (hasOwnProperty(obj ?? {}, name)) return obj[name] @@ -268,7 +308,7 @@ export function compileExpression(expression, options) { } if (typeof customProp === 'function') { - nakedProp = (name, obj) => customProp(name, safeGetter(obj), obj) + nakedProp = (name, obj, type) => customProp(name, safeGetter(obj), obj, type) } function createCall(fns) { @@ -284,7 +324,7 @@ export function compileExpression(expression, options) { if (type === 'unescaped' && hasOwnProperty(constants, name)) return constants[name] - return nakedProp(name, obj) + return nakedProp(name, obj, type) } diff --git a/test/misc.js b/test/misc.js index 4211c55..73947da 100644 --- a/test/misc.js +++ b/test/misc.js @@ -1,4 +1,7 @@ -const { compileExpression } = require("../dist/cjs/filtrex"); +const { + compileExpression, + useDotAccessOperator, +} = require("../dist/cjs/filtrex"); const { describe, it } = require("mocha"); @@ -204,4 +207,14 @@ describe('Various other things', () => { expect( eval('1 > 2 ? 3 < 4 ? 42 : 420 : 5 > 6 ? 69 : -1/12') ).equals(-1/12); }) + it('useDotAccessOperator works', () => { + const expr = "foo.bar" + + const fn = compileExpression(expr, { + customProp: useDotAccessOperator + }); + + expect( fn({ foo: { bar: 42 } }) ).equals(42) + }) + });