From b63d243e33ec4f377444eacc8e071e722a97c07e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 26 Jun 2017 13:55:22 +0100 Subject: [PATCH] Update JSONata to 1.2.4 Closes #1275 --- Gruntfile.js | 7 +- editor/vendor/jsonata/formatter.js | 75 ++++++++++++--------- editor/vendor/jsonata/mode-jsonata.js | 2 +- editor/vendor/jsonata/snippets-jsonata.js | 2 +- editor/vendor/jsonata/worker-jsonata.js | 4 +- package.json | 2 +- red/api/locales/en-US/jsonata.json | 82 +++++++++++++++++++++-- 7 files changed, 131 insertions(+), 43 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 98006b0b2..1a0dc6ed9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -171,8 +171,12 @@ module.exports = function(grunt) { // bootstrap/FA/jquery ], "public/vendor/jsonata/jsonata.min.js": [ - "node_modules/jsonata/jsonata.min.js", + "node_modules/jsonata/jsonata-es5.min.js", "editor/vendor/jsonata/formatter.js" + ], + "public/vendor/ace/worker-jsonata.js": [ + "node_modules/jsonata/jsonata-es5.min.js", + "editor/vendor/jsonata/worker-jsonata.js" ] } } @@ -183,7 +187,6 @@ module.exports = function(grunt) { 'public/red/red.min.js': 'public/red/red.js', 'public/red/main.min.js': 'public/red/main.js', 'public/vendor/ace/mode-jsonata.js': 'editor/vendor/jsonata/mode-jsonata.js', - 'public/vendor/ace/worker-jsonata.js': 'editor/vendor/jsonata/worker-jsonata.js', 'public/vendor/ace/snippets/jsonata.js': 'editor/vendor/jsonata/snippets-jsonata.js' } } diff --git a/editor/vendor/jsonata/formatter.js b/editor/vendor/jsonata/formatter.js index 3210f7e74..0a31594b9 100644 --- a/editor/vendor/jsonata/formatter.js +++ b/editor/vendor/jsonata/formatter.js @@ -107,36 +107,51 @@ jsonata.format = formatExpression; jsonata.functions = { - '$append':{ args:['array','array'] }, - '$average':{ args:['value'] }, - '$boolean':{ args:['value'] }, - '$contains':{ args:['str','pattern']}, - '$count':{ args:['array'] }, - '$exists':{ args:['value'] }, - '$flowContext': {args:['string']}, - '$globalContext': {args:['string']}, - '$join':{ args:['array','separator'] }, - '$keys':{ args:['object'] }, - '$length':{ args:['string'] }, - '$lookup':{ args:['object','key'] }, - '$lowercase':{ args:['string'] }, - '$match':{ args:['str','pattern','limit']}, - '$map':{ args:[] }, - '$max':{ args:['array'] }, - '$min':{ args:['array'] }, - '$not':{ args:['value'] }, - '$number':{ args:['value'] }, - '$reduce':{ args:[] }, - '$replace':{ args:['str','pattern','replacement','limit']}, - '$split':{ args:['string','separator','limit'] }, - '$spread':{ args:['object'] }, - '$string':{ args:['value'] }, - '$substring':{ args:['string','start','length'] }, - '$substringAfter':{ args:['string','chars'] }, - '$substringBefore':{ args:['string','chars'] }, - '$sum':{ args:['array'] }, - '$trim': { args:['str'] }, - '$uppercase':{ args:['string'] } + '$abs':{ args:[ 'number' ]}, + '$append':{ args:[ 'array1', 'array2' ]}, + '$average':{ args:[ 'array' ]}, + '$base64decode':{ args:[ ]}, + '$base64encode':{ args:[ ]}, + '$boolean':{ args:[ 'arg' ]}, + '$ceil':{ args:[ 'number' ]}, + '$contains':{ args:[ 'str', 'pattern' ]}, + '$count':{ args:[ 'array' ]}, + '$each':{ args:[ 'object', 'function' ]}, + '$exists':{ args:[ 'arg' ]}, + '$filter':{ args:[ 'array', 'function' ]}, + '$floor':{ args:[ 'number' ]}, + '$join':{ args:[ 'array', 'separator' ]}, + '$keys':{ args:[ 'object' ]}, + '$length':{ args:[ 'str' ]}, + '$lookup':{ args:[ 'object', 'key' ]}, + '$lowercase':{ args:[ 'str' ]}, + '$map':{ args:[ 'array', 'function' ]}, + '$match':{ args:[ 'str', 'pattern', 'limit' ]}, + '$max':{ args:[ 'array' ]}, + '$min':{ args:[ 'array' ]}, + '$not':{ args:[ 'arg' ]}, + '$now':{ args:[ ]}, + '$number':{ args:[ 'arg' ]}, + '$power':{ args:[ 'base', 'exponent' ]}, + '$random':{ args:[ ]}, + '$reduce':{ args:[ 'array', 'function' , 'init' ]}, + '$replace':{ args:[ 'str', 'pattern', 'replacement', 'limit' ]}, + '$reverse':{ args:[ 'array' ]}, + '$round':{ args:[ 'number', 'precision' ]}, + '$shuffle':{ args:[ 'array' ]}, + '$sift':{ args:[ 'object', 'function' ]}, + '$sort':{ args:[ 'array', 'function' ]}, + '$split':{ args:[ 'str', 'separator', 'limit' ]}, + '$spread':{ args:[ 'object' ]}, + '$sqrt':{ args:[ 'number' ]}, + '$string':{ args:[ 'arg' ]}, + '$substring':{ args:[ 'str', 'start', 'length' ]}, + '$substringAfter':{ args:[ 'str', 'chars' ]}, + '$substringBefore':{ args:[ 'str', 'chars' ]}, + '$sum':{ args:[ 'array' ]}, + '$trim':{ args:[ 'str' ]}, + '$uppercase':{ args:[ 'str' ]}, + '$zip':{ args:[ 'array1' ]} } jsonata.getFunctionSnippet = function(fn) { var snippetText = ""; diff --git a/editor/vendor/jsonata/mode-jsonata.js b/editor/vendor/jsonata/mode-jsonata.js index 7f0c832f1..2a90e4ce7 100644 --- a/editor/vendor/jsonata/mode-jsonata.js +++ b/editor/vendor/jsonata/mode-jsonata.js @@ -1,4 +1,4 @@ -define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/worker/worker_client","ace/mode/text"], function(require, exports, module) { +ace.define("ace/mode/jsonata",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/worker/worker_client","ace/mode/text"], function(require, exports, module) { "use strict"; diff --git a/editor/vendor/jsonata/snippets-jsonata.js b/editor/vendor/jsonata/snippets-jsonata.js index a8d0e8737..eda3b1f4f 100644 --- a/editor/vendor/jsonata/snippets-jsonata.js +++ b/editor/vendor/jsonata/snippets-jsonata.js @@ -1,4 +1,4 @@ -define("ace/snippets/jsonata",["require","exports","module"], function(require, exports, module) { +ace.define("ace/snippets/jsonata",["require","exports","module"], function(require, exports, module) { "use strict"; var snippetText = ""; for (var fn in jsonata.functions) { diff --git a/editor/vendor/jsonata/worker-jsonata.js b/editor/vendor/jsonata/worker-jsonata.js index 0ef181c11..ca0fe70f4 100644 --- a/editor/vendor/jsonata/worker-jsonata.js +++ b/editor/vendor/jsonata/worker-jsonata.js @@ -1,3 +1,5 @@ +// jsonata-es5.min.js is prepended to this file as part of the Grunt build + ;(function(window) { if (typeof window.window != "undefined" && window.document) return; @@ -2103,8 +2105,6 @@ define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_del var oop = require("../lib/oop"); var Mirror = require("../worker/mirror").Mirror; - var jsonata=function(){"use strict";function e(e){for(var n=1,t=[],r={},a=r;n");a.subtype=e.substring(n+1,c),n=c}n++}var p="^"+t.map(function(e){return"("+e.regex+")"}).join("")+"$",l=new RegExp(p),d=function(e){var n;if(T(e))n="f";else{var t=typeof e;switch(t){case"string":n="s";break;case"number":n="n";break;case"boolean":n="b";break;case"object":n=null===e?"l":Array.isArray(e)?"a":"o";break;case"undefined":n="m"}}return n},h=function(e,n){for(var r="^",a=0,o=0;o0){var a=d(s[0]);if(a!==t.subtype.charAt(0))r=!1;else{var f=s.filter(function(e){return d(e)!==a});r=0===f.length}}if(!r)throw{code:"T0412",stack:(new Error).stack,value:s,index:i+1,type:t.subtype};"a"!==n&&(s=[s])}o.push(s),i++}else o.push(s),i++})}),o}h(e,r)}}}function n(e){var n=!1;if("number"==typeof e){var t=parseFloat(e);if(n=!isNaN(t),n&&!isFinite(t))throw{code:"D1001",value:e,stack:(new Error).stack}}return n}function t(e){var t=!1;return Array.isArray(e)&&(t=0===e.filter(function(e){return!n(e)}).length),t}function r(e,n,t){var r,p=t.lookup("__evaluate_entry");switch(p&&p(e,n,t),e.type){case"path":r=a(e,n,t);break;case"binary":r=i(e,n,t);break;case"unary":r=s(e,n,t);break;case"name":r=u(e,n,t);break;case"literal":r=f(e,n,t);break;case"wildcard":r=c(e,n,t);break;case"descendant":r=l(e,n,t);break;case"condition":r=x(e,n,t);break;case"block":r=E(e,n,t);break;case"regex":r=A(e,n,t);break;case"function":r=O(e,n,t);break;case"variable":r=S(e,n,t);break;case"lambda":r=$(e,n,t);break;case"partial":r=I(e,n,t)}e.hasOwnProperty("predicate")&&(r=o(e.predicate,r,t)),e.hasOwnProperty("group")&&(r=k(e.group,r,t));var d=t.lookup("__evaluate_exit");return d&&d(e,n,t,r),r}function a(e,n,t){var a,o,i=!1;"variable"===e[0].type?e[0].absolute=!0:"unary"===e[0].type&&"["===e[0].value&&(n=[null]);for(var s=0;s1&&"literal"===u.type&&(u.type="name"),o.forEach(function(e){var n=r(u,e,t);"undefined"!=typeof n&&(Array.isArray(n)&&"["!==u.value?n.forEach(function(e){"undefined"!=typeof e&&f.push(e)}):f.push(n))}),1===f.length?a=i?f:f[0]:f.length>1&&(a=f),"undefined"==typeof a)break;n=a}return a}function o(e,a,o){var i,s=a,u=[];return e.forEach(function(e){if(Array.isArray(s)||(s=[s]),u=[],i=void 0,"literal"===e.type&&n(e.value)){var a=e.value;Number.isInteger(a)||(a=Math.floor(a)),a<0&&(a=s.length+a),i=s[a]}else s.forEach(function(a,i){var f=r(e,a,o);n(f)&&(f=[f]),t(f)?f.forEach(function(e){Number.isInteger(e)||(e=Math.floor(e)),e<0&&(e=s.length+e),e===i&&u.push(a)}):ie(f)&&u.push(a)});1===u.length?i=u[0]:u.length>1&&(i=u),s=i}),i}function i(e,n,t){var r;switch(e.value){case"+":case"-":case"*":case"/":case"%":r=h(e,n,t);break;case"=":case"!=":case"<":case"<=":case">":case">=":r=v(e,n,t);break;case"&":r=g(e,n,t);break;case"and":case"or":r=b(e,n,t);break;case"..":r=m(e,n,t);break;case":=":r=w(e,n,t);break;case"in":r=y(e,n,t);break;case"~>":r=j(e,n,t)}return r}function s(e,t,a){var o;switch(e.value){case"-":if(o=r(e.expression,t,a),!n(o))throw{code:"D1002",stack:(new Error).stack,position:e.position,token:e.value,value:o};o=-o;break;case"[":o=[],e.lhs.forEach(function(e){var n=r(e,t,a);"undefined"!=typeof n&&("["===e.value?o.push(n):o=le(o,n))});break;case"{":o=k(e,t,a)}return o}function u(e,n,t){var r;if(Array.isArray(n)){var a=[];n.forEach(function(n){var r=u(e,n,t);"undefined"!=typeof r&&a.push(r)}),1===a.length?r=a[0]:a.length>1&&(r=a)}else null!==n&&"object"==typeof n&&(r=n[e.value]);return r}function f(e){return e.value}function c(e,n){var t,r=[];return null!==n&&"object"==typeof n&&Object.keys(n).forEach(function(e){var t=n[e];Array.isArray(t)?(t=p(t),r=le(r,t)):r.push(t)}),1===r.length?t=r[0]:r.length>1&&(t=r),t}function p(e,n){return"undefined"==typeof n&&(n=[]),Array.isArray(e)?e.forEach(function(e){p(e,n)}):n.push(e),n}function l(e,n){var t,r=[];return"undefined"!=typeof n&&(d(n,r),t=1===r.length?r[0]:r),t}function d(e,n){Array.isArray(e)||n.push(e),Array.isArray(e)?e.forEach(function(e){d(e,n)}):null!==e&&"object"==typeof e&&Object.keys(e).forEach(function(t){d(e[t],n)})}function h(e,t,a){var o,i=r(e.lhs,t,a),s=r(e.rhs,t,a);if("undefined"==typeof i||"undefined"==typeof s)return o;if(!n(i))throw{code:"T2001",stack:(new Error).stack,position:e.position,token:e.value,value:i};if(!n(s))throw{code:"T2002",stack:(new Error).stack,position:e.position,token:e.value,value:s};switch(e.value){case"+":o=i+s;break;case"-":o=i-s;break;case"*":o=i*s;break;case"/":o=i/s;break;case"%":o=i%s}return o}function v(e,n,t){var a,o=r(e.lhs,n,t),i=r(e.rhs,n,t);if("undefined"==typeof o||"undefined"==typeof i)return!1;switch(e.value){case"=":a=o===i;break;case"!=":a=o!==i;break;case"<":a=o":a=o>i;break;case">=":a=o>=i}return a}function y(e,n,t){var a=!1,o=r(e.lhs,n,t),i=r(e.rhs,n,t);if("undefined"==typeof o||"undefined"==typeof i)return!1;Array.isArray(i)||(i=[i]);for(var s=0;si)return a;if(!Number.isInteger(o))throw{code:"T2003",stack:(new Error).stack,position:e.position,token:e.value,value:o};if(!Number.isInteger(i))throw{code:"T2004",stack:(new Error).stack,position:e.position,token:e.value,value:i};a=new Array(i-o+1);for(var s=o,u=0;s<=i;s++,u++)a[u]=s;return a}function w(e,n,t){var a=r(e.rhs,n,t);if("variable"!==e.lhs.type)throw{code:"D2005",stack:(new Error).stack,position:e.position,token:e.value,value:"path"===e.lhs.type?e.lhs[0].value:e.lhs.value};return t.bind(e.lhs.value,a),a}function x(e,n,t){var a,o=r(e.condition,n,t);return ie(o)?a=r(e.then,n,t):"undefined"!=typeof e.else&&(a=r(e.else,n,t)),a}function E(e,n,t){var a,o=ve(t);return e.expressions.forEach(function(e){a=r(e,n,o)}),a}function A(e){e.value.lastIndex=0;var n=function(t){var r,a=e.value,o=a.exec(t);if(null!==o){if(r={match:o[0],start:o.index,end:o.index+o[0].length,groups:[]},o.length>1)for(var i=1;i=t.length)){var r=n(t);if(r&&""===r.match&&a.lastIndex===e.value.lastIndex)throw{code:"D1004",stack:(new Error).stack,position:e.position,value:e.value.source};return r}}}return r};return n}function S(e,n,t){var r;return r=""===e.value?n:t.lookup(e.value)}function j(e,n,t){var a,o=r(e.lhs,n,t);if("function"===e.rhs.type)a=O(e.rhs,n,t,{context:o});else{var i=r(e.rhs,n,t);if(!T(i))throw{code:"T2006",stack:(new Error).stack,position:e.position,value:i};a=T(o)?D(Ee,[o,i],t,null):D(i,[o],t,null)}return a}function T(e){return e&&(e._jsonata_function===!0||e._jsonata_lambda===!0)||"function"==typeof e}function _(e){return e&&e._jsonata_lambda===!0}function O(e,n,t,a){var o,i=[];e.arguments.forEach(function(e){i.push(r(e,n,t))}),a&&i.unshift(a.context);var s=r(e.procedure,n,t);if("undefined"==typeof s&&"path"===e.procedure.type&&t.lookup(e.procedure[0].value))throw{code:"T1005",stack:(new Error).stack,position:e.position,token:e.procedure[0].value};try{var u=i;s&&(u=F(s.signature,i,n)),o=D(s,u,n)}catch(n){throw n.position=e.position,n.token="path"===e.procedure.type?e.procedure[0].value:e.procedure.value,n}return o}function D(e,n,t){var a;for(a=N(e,n,t);_(a)&&a.thunk===!0;){var o=r(a.body.procedure,a.input,a.environment),i=[];a.body.arguments.forEach(function(e){i.push(r(e,a.input,a.environment))}),a=N(o,i,t)}return a}function N(e,n,t){var r;if(_(e))r=M(e,n);else if(e&&e._jsonata_function===!0)r=e.implementation.apply(t,n);else{if("function"!=typeof e)throw{code:"T1006",stack:(new Error).stack};r=e.apply(t,n)}return r}function $(e,n,t){var r={_jsonata_lambda:!0,input:n,environment:t,arguments:e.arguments,signature:e.signature,body:e.body};return e.thunk===!0&&(r.thunk=!0),r}function I(e,n,t){var a,o=[];e.arguments.forEach(function(e){"operator"===e.type&&"?"===e.value?o.push(e):o.push(r(e,n,t))});var i=r(e.procedure,n,t);if("undefined"==typeof i&&"path"===e.procedure.type&&t.lookup(e.procedure[0].value))throw{code:"T1007",stack:(new Error).stack,position:e.position,token:e.procedure[0].value};if(_(i))a=P(i,o);else if(i&&i._jsonata_function===!0)a=R(i.implementation,o);else{if("function"!=typeof i)throw{code:"T1008",stack:(new Error).stack,position:e.position,token:"path"===e.procedure.type?e.procedure[0].value:e.procedure.value};a=R(i,o)}return a}function F(e,n,t){if("undefined"==typeof e)return n;var r=e.validate(n,t);return r}function M(e,n){var t,a=ve(e.environment);return e.arguments.forEach(function(e,t){a.bind(e.value,n[t])}),t="function"==typeof e.body?C(e.body,a):r(e.body,e.input,a)}function P(e,n){var t=ve(e.environment),r=[];e.arguments.forEach(function(e,a){var o=n[a];o&&"operator"===o.type&&"?"===o.value?r.push(e):t.bind(e.value,o)});var a={_jsonata_lambda:!0,input:e.input,environment:t,arguments:r,body:e.body};return a}function R(e,n){var t=U(e);t=t.map(function(e){return"$"+e.trim()});var r="function("+t.join(", ")+"){ _ }",a=we(r);a.body=e;var o=P(a,n);return o}function C(e,n){var t=U(e),r=t.map(function(e){return n.lookup(e.trim())}),a=e.apply(null,r);return a}function U(e){var n=e.toString(),t=/\(([^\)]*)\)/.exec(n)[1],r=t.split(",");return r}function H(n,t){var r={_jsonata_function:!0,implementation:n};return"undefined"!=typeof t&&(r.signature=e(t)),r}function L(e){if("undefined"!=typeof e){var n=0;return e.forEach(function(e){n+=e}),n}}function q(e){return"undefined"==typeof e?0:e.length}function z(e){if("undefined"!=typeof e&&0!==e.length)return Math.max.apply(Math,e)}function G(e){if("undefined"!=typeof e&&0!==e.length)return Math.min.apply(Math,e)}function B(e){if("undefined"!=typeof e&&0!==e.length){var n=0;return e.forEach(function(e){n+=e}),n/e.length}}function J(e){if("undefined"!=typeof e){var t;if("string"==typeof e)t=e;else if(T(e))t="";else{if("number"==typeof e&&!isFinite(e))throw{code:"D3001",value:e,stack:(new Error).stack};t=JSON.stringify(e,function(e,t){return"undefined"!=typeof t&&null!==t&&t.toPrecision&&n(t)?Number(t.toPrecision(13)):t&&T(t)?"":t})}return t}}function K(e,n,t){if("undefined"!=typeof e)return e.substr(n,t)}function Q(e,n){if("undefined"!=typeof e){var t=e.indexOf(n);return t>-1?e.substr(0,t):e}}function V(e,n){if("undefined"!=typeof e){var t=e.indexOf(n);return t>-1?e.substr(t+n.length):e}}function W(e){if("undefined"!=typeof e)return e.toLowerCase()}function X(e){if("undefined"!=typeof e)return e.toUpperCase()}function Y(e){if("undefined"!=typeof e)return e.length}function Z(e){if("undefined"!=typeof e){var n=e.replace(/[ \t\n\r]+/gm," ");return" "===n.charAt(0)&&(n=n.substring(1))," "===n.charAt(n.length-1)&&(n=n.substring(0,n.length-1)),n}}function ee(e,n){if("undefined"!=typeof e){var t;if("string"==typeof n)t=e.indexOf(n)!==-1;else{var r=n(e);t="undefined"!=typeof r}return t}}function ne(e,n,t){if("undefined"!=typeof e){if(t<0)throw{stack:(new Error).stack,value:t,code:"D3040",index:3};var r=[];if("undefined"==typeof t||t>0){var a=0,o=n(e);if("undefined"!=typeof o)for(;"undefined"!=typeof o&&("undefined"==typeof t||a1&&a>e.groups.length&&(a=parseInt(t.substring(r,r+i-1),10)),isNaN(a))n+="$";else{if(e.groups.length>0){var s=e.groups[a-1];"undefined"!=typeof s&&(n+=s)}r+=a.toString().length}}a=t.indexOf("$",r)}return n+=t.substring(r)}:t;var o="",i=0;if("undefined"==typeof r||r>0){var s=0;if("string"==typeof n){for(var u=e.indexOf(n,i);u!==-1&&("undefined"==typeof r||s0)if("string"==typeof n)r=e.split(n,t);else{var a=0,o=n(e);if("undefined"!=typeof o){for(var i=0;"undefined"!=typeof o&&("undefined"==typeof t||a1){var r=e.filter(function(e){return ie(e)});t=r.length>0}}else"string"==typeof e?e.length>0&&(t=!0):n(e)?0!==e&&(t=!0):null!==e&&"object"==typeof e?Object.keys(e).length>0&&(_(e)||e._jsonata_function||(t=!0)):"boolean"==typeof e&&e===!0&&(t=!0);return t}}function se(e){return!ie(e)}function ue(e,n){var t=arguments,r=[],a=n;a=[];for(var o=1;o0?(r=n[0],a=1):(r=t,a=0);a":40,"`":80,"**":60,"..":20,":=":10,"!=":40,"<=":40,">=":40,"~>":40,and:30,or:25,in:40,"&":50,"!":0,"~":0},ke={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"},me=function(e){var n=0,t=e.length,r=function(e,t){var r={type:e,value:t,position:n};return r},a=function(){for(var r,a,o=n,i=0;n=t)return null;for(var i=e.charAt(n);n-1;)n++,i=e.charAt(n);if(o!==!0&&"/"===i)return n++,r("regex",a());if("."===i&&"."===e.charAt(n+1))return n+=2,r("operator","..");if(":"===i&&"="===e.charAt(n+1))return n+=2,r("operator",":=");if("!"===i&&"="===e.charAt(n+1))return n+=2,r("operator","!=");if(">"===i&&"="===e.charAt(n+1))return n+=2,r("operator",">=");if("<"===i&&"="===e.charAt(n+1))return n+=2,r("operator","<=");if("*"===i&&"*"===e.charAt(n+1))return n+=2,r("operator","**");if("~"===i&&">"===e.charAt(n+1))return n+=2,r("operator","~>");if(ge.hasOwnProperty(i))return n++,r("operator",i);if('"'===i||"'"===i){var s=i;n++;for(var u="";n-1||ge.hasOwnProperty(h)){if("$"===e.charAt(n))return v=e.substring(n+1,y),n=y,r("variable",v);switch(v=e.substring(n,y),n=y,v){case"or":case"in":case"and":return r("operator",v);case"true":return r("value",!0);case"false":return r("value",!1);case"null":return r("value",null);default:return n===t&&""===v?null:r("name",v)}}else y++};return o},we=function(t){var r,a,o={},i={nud:function(){return this}},s=function(e,n){var t=o[e];return n=n||0,t?n>=t.lbp&&(t.lbp=n):(t=Object.create(i),t.id=t.value=e,t.lbp=n,o[e]=t),t},u=function(e,n){if(e&&r.id!==e){var i;throw i="(end)"===r.id?"S0203":"S0202",{code:i,stack:(new Error).stack,position:r.position,token:r.id,value:e}}var s=a(n);if(null===s)return r=o["(end)"],r.position=t.length,r;var u,f=s.value,c=s.type;switch(c){case"name":case"variable":u=o["(name)"];break;case"operator":if(u=o[f],!u)throw{code:"S0204",stack:(new Error).stack,position:s.position,token:f};break;case"string":case"number":case"value":c="literal",u=o["(literal)"];break;case"regex":c="regex",u=o["(regex)"];break;default:throw{code:"S0205",stack:(new Error).stack,position:s.position,token:f}}return r=Object.create(u),r.value=f,r.type=c,r.position=s.position,r},f=function(e){var n,t=r;for(u(null,!0),n=t.nud();e"),c("!="),c("<="),c(">="),c("&"),c("and"),c("or"),c("in"),p(":="),l("-"),c("~>"),l("*",function(){return this.type="wildcard",this}),l("**",function(){return this.type="descendant",this}),c("(",ge["("],function(n){if(this.procedure=n,this.type="function",this.arguments=[],")"!==r.id)for(;"operator"===r.type&&"?"===r.id?(this.type="partial",this.arguments.push(r),u("?")):this.arguments.push(f(0)),","===r.id;)u(",");if(u(")",!0),"name"===n.type&&("function"===n.value||"λ"===n.value)){if(this.arguments.forEach(function(e,n){if("variable"!==e.type)throw{code:"S0208",stack:(new Error).stack,position:e.position,token:e.value,value:n+1}}),this.type="lambda","<"===r.id){for(var t=r.position,a=1,o="<";a>0&&"{"!==r.id&&"(end)"!==r.id;){var i=u();">"===i.id?a--:"<"===i.id&&a++,o+=i.value}u(">");try{this.signature=e(o)}catch(e){throw e.position=t+e.offset,e}}u("{"),this.body=f(0),u("}")}return this}),l("(",function(){for(var e=[];")"!==r.id&&(e.push(f(0)),";"===r.id);)u(";");return u(")",!0),this.type="block",this.expressions=e,this}),l("[",function(){var e=[];if("]"!==r.id)for(;;){var n=f(0);if(".."===r.id){var t={type:"binary",value:"..",position:r.position,lhs:n};u(".."),t.rhs=f(0),n=t}if(e.push(n),","!==r.id)break;u(",")}return u("]",!0),this.lhs=e,this.type="unary",this}),c("[",ge["["],function(e){if("]"===r.id){for(var n=e;n&&"binary"===n.type&&"["===n.value;)n=n.lhs;return n.keepArray=!0,u("]"),e}return this.lhs=e,this.rhs=f(ge["]"]),this.type="binary",u("]",!0),this});var d=function(e){var n=[];if("}"!==r.id)for(;;){var t=f(0);u(":");var a=f(0);if(n.push([t,a]),","!==r.id)break;u(",")}return u("}",!0),"undefined"==typeof e?(this.lhs=n,this.type="unary"):(this.lhs=e,this.rhs=n,this.type="binary"),this};l("{",d),c("{",ge["{"],d),c("?",ge["?"],function(e){return this.type="condition",this.condition=e,this.then=f(0),":"===r.id&&(u(":"),this.else=f(0)),this});var h=function(e){var n;if("function"===e.type){var t={type:"lambda",thunk:!0,arguments:[],position:e.position};t.body=e,n=t}else if("condition"===e.type)e.then=h(e.then),e.else=h(e.else),n=e;else if("block"===e.type){var r=e.expressions.length;r>0&&(e.expressions[r-1]=h(e.expressions[r-1])),n=e}else n=e;return n},v=function(e){var t=[];switch(e.type){case"binary":switch(e.value){case".":var r=v(e.lhs);"path"===r.type?Array.prototype.push.apply(t,r):t.push(r);var a=v(e.rhs);"path"!==a.type&&(a=[a]),Array.prototype.push.apply(t,a),t.type="path";break;case"[":t=v(e.lhs);var o=t;if("path"===t.type&&(o=t[t.length-1]),"undefined"!=typeof o.group)throw{code:"S0209",stack:(new Error).stack,position:e.position};"undefined"==typeof o.predicate&&(o.predicate=[]),o.predicate.push(v(e.rhs));break;case"{":if(t=v(e.lhs),"undefined"!=typeof t.group)throw{code:"S0210",stack:(new Error).stack,position:e.position};t.group={lhs:e.rhs.map(function(e){return[v(e[0]),v(e[1])]}),position:e.position};break;default:t={type:e.type,value:e.value,position:e.position},t.lhs=v(e.lhs),t.rhs=v(e.rhs)}break;case"unary":t={type:e.type,value:e.value,position:e.position},"["===e.value?t.lhs=e.lhs.map(function(e){return v(e)}):"{"===e.value?t.lhs=e.lhs.map(function(e){return[v(e[0]),v(e[1])]}):(t.expression=v(e.expression),"-"===e.value&&"literal"===t.expression.type&&n(t.expression.value)&&(t=t.expression,t.value=-t.value));break;case"function":case"partial":t={type:e.type,name:e.name,value:e.value,position:e.position},t.arguments=e.arguments.map(function(e){return v(e)}),t.procedure=v(e.procedure);break;case"lambda":t={type:e.type,arguments:e.arguments,signature:e.signature,position:e.position};var i=v(e.body);t.body=h(i);break;case"condition":t={type:e.type,position:e.position},t.condition=v(e.condition),t.then=v(e.then),"undefined"!=typeof e.else&&(t.else=v(e.else));break;case"block":t={type:e.type,position:e.position},t.expressions=e.expressions.map(function(e){return v(e)});break;case"name":t=[e],t.type="path";break;case"literal":case"wildcard":case"descendant":case"variable":case"regex":t=e;break;case"operator":if("and"===e.value||"or"===e.value||"in"===e.value)e.type="name",t=v(e);else{if("?"!==e.value)throw{code:"S0201",stack:(new Error).stack,position:e.position,token:e.value};t=e}break;default:var s="S0206";throw"(end)"===e.id&&(s="S0207"),{code:s,stack:(new Error).stack,position:e.position,token:e.value}}return t};a=me(t),u();var y=f(0);if("(end)"!==r.id)throw{code:"S0201",stack:(new Error).stack,position:r.position,token:r.value};return y=v(y)},xe=ve(null);Number.isInteger=Number.isInteger||function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e};var Ee=r(we("function($f, $g) { function($x){ $g($f($x)) } }"),null,xe);xe.bind("sum",H(L,":n>")),xe.bind("count",H(q,"")),xe.bind("max",H(z,":n>")),xe.bind("min",H(G,":n>")),xe.bind("average",H(B,":n>")),xe.bind("string",H(J,"")),xe.bind("substring",H(K,"")),xe.bind("substringBefore",H(Q,"")),xe.bind("substringAfter",H(V,"")),xe.bind("lowercase",H(W,"")),xe.bind("uppercase",H(X,"")),xe.bind("length",H(Y,"")),xe.bind("trim",H(Z,"")),xe.bind("match",H(ne,"n?:a>")),xe.bind("contains",H(ee,"")),xe.bind("replace",H(te,"")),xe.bind("split",H(re,">")),xe.bind("join",H(ae,"s?:s>")),xe.bind("number",H(oe,"<(ns)-:n>")),xe.bind("boolean",H(ie,"")),xe.bind("not",H(se,"")),xe.bind("map",H(ue,"")),xe.bind("reduce",H(fe,"")),xe.bind("keys",H(ce,">")),xe.bind("lookup",H(pe,"")),xe.bind("append",H(le,"")),xe.bind("exists",H(de,"")),xe.bind("spread",H(he,">"));var Ae={S0101:"No terminating quote found in string literal",S0102:"Number out of range: {{token}}",S0103:"unsupported escape sequence: \\{{token}}",S0104:"The escape sequence \\u must be followed by 4 hex digits",S0203:"Syntax error: expected '{{value}}' before end of expression",S0202:"Syntax error: expected '{{value}}', got '{{token}}'",S0204:"Unknown operator: {{token}}",S0205:"Unexpected token: {{token}}",S0208:"Parameter {{value}} of function definition must be a variable name (start with $)",S0209:"A predicate cannot follow a grouping expression in a step.",S0210:"Each step can only have one grouping expression.",S0201:"Syntax error: {{token}}",S0206:"Unknown expression type: {{token}}",S0207:"Syntax error: unexpected end of expression",S0301:"Empty regular expressions are not allowed",S0302:"No terminating / in regular expression",S0402:"Choice groups containing parameterized types not supported",S0401:"Type parameters can only be applied to functions and arrays",T0410:"Argument {{index}} of function '{{token}}' does not match function signature",T0411:"Context value is not a compatible type with argument {{index}} of function '{{token}}'",T0412:"Argument {{index}} of function '{{token}}' must be an array of {{type}}",D1001:"Number out of range: {{value}}",D1002:"Cannot negate a non-numeric value: {{value}}",T2001:"LHS of {{token}} operator must evaluate to a number",T2002:"RHS of {{token}} operator must evaluate to a number",T1003:"Key in object structure must evaluate to a string. Got: {{value}}",T2003:"LHS of range operator (..) must evaluate to an integer",T2004:"RHS of range operator (..) must evaluate to an integer",D2005:"Left hand side of := must be a variable name (start with $)",D1004:"Regular expression matches zero length string",T2006:"RHS of function application operator ~> is not a function",T1005:"Attempted to invoke a non-function. Did you mean '${{token}}'?",T1006:"Attempted to invoke a non-function",T1007:"Attempted to partially apply a non-function. Did you mean '${{token}}'?",T1008:"Attempted to partially apply a non-function",D3001:"Attempting to invoke string function on Infinity or NaN",D3010:"Second argument of replace function cannot be an empty string",D3011:"Forth argument of replace function must evaluate to a positive number",D3012:"Attempted to replace a matched string with a non-string value",D3020:"Third argument of split function must evaluate to a positive number",D3030:"Unable to cast value to a number: {{value}}"};return be.parser=we,be}();"undefined"!=typeof module&&(module.exports=jsonata); - var JSONataWorker = exports.JSONataWorker = function(sender) { Mirror.call(this, sender); this.setTimeout(200); diff --git a/package.json b/package.json index 9e8190709..d685b2e43 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "is-utf8":"0.2.1", "js-yaml": "3.7.0", "json-stringify-safe":"5.0.1", - "jsonata":"1.1.1", + "jsonata":"1.2.4", "media-typer": "0.3.0", "mqtt": "2.2.1", "multer": "1.2.1", diff --git a/red/api/locales/en-US/jsonata.json b/red/api/locales/en-US/jsonata.json index 3591ac65c..4065f814a 100644 --- a/red/api/locales/en-US/jsonata.json +++ b/red/api/locales/en-US/jsonata.json @@ -51,12 +51,50 @@ "args": "str, pattern, replacement [, limit]", "desc": "Finds occurrences of `pattern` within `str` and replaces them with `replacement`. " }, - - + "$now": { + "args":"", + "desc":"Generates a timestamp in ISO 8601 compatible format and returns it as a string." + }, + "$base64encode": { + "args":"string", + "desc":"Converts an ASCII string to a base 64 representation. Each each character in the string is treated as a byte of binary data. This requires that all characters in the string are in the 0x00 to 0xFF range, which includes all characters in URI encoded strings. Unicode characters outside of that range are not supported." + }, + "$base64decode": { + "args":"string", + "desc":"Converts base 64 encoded bytes to a string, using a UTF-8 Unicode codepage." + }, "$number": { "args": "arg", "desc": "Casts the `arg` parameter to a number using the following casting rules:\n\n - Numbers are unchanged\n - Strings that contain a sequence of characters that represent a legal JSON number are converted to that number\n - All other values cause an error to be thrown." }, + "$abs": { + "args":"number", + "desc":"Returns the absolute value of the `number` parameter." + }, + "$floor": { + "args":"number", + "desc":"Returns the value of `number` rounded down to the nearest integer that is smaller or equal to `number`." + }, + "$ceil": { + "args":"number", + "desc":"Returns the value of `number` rounded up to the nearest integer that is greater than or equal to `number`." + }, + "$round": { + "args":"number [, precision]", + "desc":"Returns the value of the `number` parameter rounded to the number of decimal places specified by the optional `precision` parameter." + }, + "$power": { + "args":"base, exponent", + "desc":"Returns the value of `base` raised to the power of `exponent`." + }, + "$sqrt": { + "args":"number", + "desc":"Returns the square root of the value of the `number` parameter." + }, + "$random": { + "args":"", + "desc":"Returns a pseudo random number greater than or equal to zero and less than one." + }, "$sum": { "args": "array", "desc": "Returns the arithmetic sum of an `array` of numbers. It is an error if the input `array` contains an item which isn't a number." @@ -86,7 +124,6 @@ "args": "arg", "desc": "Returns Boolean `true` if the `arg` expression evaluates to a value, or `false` if the expression does not match anything (e.g. a path to a non-existent field reference)." }, - "$count": { "args": "array", "desc": "Returns the number of items in the array" @@ -95,21 +132,54 @@ "args": "array, array", "desc": "Appends two arrays" }, - + "$sort": { + "args":"array [, function]", + "desc":"Returns an array containing all the values in the `array` parameter, but sorted into order.\n\nIf a comparator `function` is supplied, then it must be a function that takes two parameters:\n\n`function(left, right)`\n\nThis function gets invoked by the sorting algorithm to compare two values left and right. If the value of left should be placed after the value of right in the desired sort order, then the function must return Boolean `true` to indicate a swap. Otherwise it must return `false`." + }, + "$reverse": { + "args":"array", + "desc":"Returns an array containing all the values from the `array` parameter, but in reverse order." + }, + "$shuffle": { + "args":"array", + "desc":"Returns an array containing all the values from the `array` parameter, but shuffled into random order." + }, + "$zip": { + "args":"array, ...", + "desc":"Returns a convolved (zipped) array containing grouped arrays of values from the `array1` … `arrayN` arguments from index 0, 1, 2...." + }, "$keys": { "args": "object", "desc": "Returns an array containing the keys in the object. If the argument is an array of objects, then the array returned contains a de-duplicated list of all the keys in all of the objects." }, - "$lookup": { "args": "object, key", "desc": "Returns the value associated with key in object. If the first argument is an array of objects, then all of the objects in the array are searched, and the values associated with all occurrences of key are returned." }, - "$spread": { "args": "object", "desc": "Splits an object containing key/value pairs into an array of objects, each of which has a single key/value pair from the input object. If the parameter is an array of objects, then the resultant array contains an object for every key/value pair in every object in the supplied array." }, + "$sift": { + "args":"object, function", + "desc":"Returns an object that contains only the key/value pairs from the `object` parameter that satisfy the predicate `function` passed in as the second parameter.\n\nThe function that is supplied as the second parameter must have the following signature:\n\n`function(value [, key [, object]])`" + }, + "$each": { + "args":"object, function", + "desc":"Returns an array containing the values return by the `function` when applied to each key/value pair in the `object`." + }, + "$map": { + "args":"array, function", + "desc":"Returns an array containing the results of applying the `function` parameter to each value in the `array` parameter.\n\nThe `function` that is supplied as the second parameter must have the following signature:\n\n`function(value [, index [, array]])`" + }, + "$filter": { + "args":"array, function", + "desc":"Returns an array containing only the values in the array parameter that satisfy the `function` predicate.\n\nThe function that is supplied as the second parameter must have the following signature:\n\n`function(value [, index [, array]])`" + }, + "$reduce": { + "args":"array, function [, init]", + "desc":"Returns an aggregated value derived from applying the `function` parameter successively to each value in `array` in combination with the result of the previous application of the function.\n\nThe function must accept two arguments, and behaves like an infix operator between each value within the `array`." + }, "$flowContext": { "args": "string", "desc": "Retrieves a flow context property."