From ca53712ee9ec52b0e5c935515bc0061a99d100b8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 3 Mar 2023 11:43:06 +0000 Subject: [PATCH] Deprecate synchronous access to jsonata --- .../src/js/ui/editors/expression.js | 57 ++++++++++--------- .../@node-red/nodes/core/common/20-inject.js | 17 ++++-- .../node_modules/@node-red/util/lib/util.js | 14 ++++- 3 files changed, 54 insertions(+), 34 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/expression.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/expression.js index d470e14f2..04e3f11a8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/expression.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/expression.js @@ -294,32 +294,37 @@ } try { - var result = expr.evaluate(legacyMode?{msg:parsedData}:parsedData); - if (usesContext) { - testResultEditor.setValue(RED._("expressionEditor.errors.context-unsupported"),-1); - return; - } - if (usesEnv) { - testResultEditor.setValue(RED._("expressionEditor.errors.env-unsupported"),-1); - return; - } - if (usesMoment) { - testResultEditor.setValue(RED._("expressionEditor.errors.moment-unsupported"),-1); - return; - } - if (usesClone) { - testResultEditor.setValue(RED._("expressionEditor.errors.clone-unsupported"),-1); - return; - } - - var formattedResult; - if (result !== undefined) { - formattedResult = JSON.stringify(result,null,4); - } else { - formattedResult = RED._("expressionEditor.noMatch"); - } - testResultEditor.setValue(formattedResult,-1); - } catch(err) { + expr.evaluate(legacyMode?{msg:parsedData}:parsedData, (err, result) => { + if (err) { + testResultEditor.setValue(RED._("expressionEditor.errors.eval",{message:err.message}),-1); + } else { + if (usesContext) { + testResultEditor.setValue(RED._("expressionEditor.errors.context-unsupported"),-1); + return; + } + if (usesEnv) { + testResultEditor.setValue(RED._("expressionEditor.errors.env-unsupported"),-1); + return; + } + if (usesMoment) { + testResultEditor.setValue(RED._("expressionEditor.errors.moment-unsupported"),-1); + return; + } + if (usesClone) { + testResultEditor.setValue(RED._("expressionEditor.errors.clone-unsupported"),-1); + return; + } + + var formattedResult; + if (result !== undefined) { + formattedResult = JSON.stringify(result,null,4); + } else { + formattedResult = RED._("expressionEditor.noMatch"); + } + testResultEditor.setValue(formattedResult,-1); + } + }); + } catch(err) { testResultEditor.setValue(RED._("expressionEditor.errors.eval",{message:err.message}),-1); } } diff --git a/packages/node_modules/@node-red/nodes/core/common/20-inject.js b/packages/node_modules/@node-red/nodes/core/common/20-inject.js index 3f2992cd5..cde9b2141 100644 --- a/packages/node_modules/@node-red/nodes/core/common/20-inject.js +++ b/packages/node_modules/@node-red/nodes/core/common/20-inject.js @@ -117,14 +117,21 @@ module.exports = function(RED) { if (p.v) { try { var exp = RED.util.prepareJSONataExpression(p.v, node); - var val = RED.util.evaluateJSONataExpression(exp, msg); - RED.util.setMessageProperty(msg, property, val, true); - } - catch (err) { + RED.util.evaluateJSONataExpression(exp, msg, (err, newValue) => { + if (err) { + errors.push(err.toString()) + } else { + RED.util.setMessageProperty(msg,property,newValue,true); + } + evaluateProperty(doneEvaluating) + }); + } catch (err) { errors.push(err.message); + evaluateProperty(doneEvaluating) } + } else { + evaluateProperty(doneEvaluating) } - evaluateProperty(doneEvaluating) } else { try { RED.util.evaluateNodeProperty(value, valueType, node, msg, (err, newValue) => { diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index 002dc099b..ad05d45f1 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -25,7 +25,7 @@ const moment = require("moment-timezone"); const safeJSONStringify = require("json-stringify-safe"); const util = require("util"); const { hasOwnProperty } = Object.prototype; - +const log = require("./log") /** * Safely returns the object construtor name. * @return {String} the name of the object constructor if it exists, empty string otherwise. @@ -671,8 +671,11 @@ function evaluateNodeProperty(value, type, node, msg, callback) { } else if (type === 'bool') { result = /^true$/i.test(value); } else if (type === 'jsonata') { - var expr = prepareJSONataExpression(value,node); - result = evaluateJSONataExpression(expr,msg); + var expr = prepareJSONataExpression(value, node); + result = evaluateJSONataExpression(expr, msg, callback); + if (callback) { + return + } } else if (type === 'env') { result = evaluateEnvProperty(value, node); } @@ -767,6 +770,11 @@ function evaluateJSONataExpression(expr,msg,callback) { }) }); } + } else { + log.warn('Deprecated API warning: Calls to RED.util.evaluateJSONataExpression must include a callback. '+ + 'This will not be optional in Node-RED 4.0. Please identify the node from the following stack '+ + 'and check for an update on npm. If none is available, please notify the node author.') + log.warn(new Error().stack) } return expr.evaluate(context, bindings, callback); }