From 7959d18248301c234f8e839252e49724dea769e5 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Wed, 2 Feb 2022 11:34:58 +0900 Subject: [PATCH 01/18] hide tooltip after removing subflow tab --- .../@node-red/editor-client/src/js/ui/common/popover.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js index f060af37d..5871abcde 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js @@ -350,6 +350,15 @@ RED.popover = (function() { } } + target.on("remove", function (ev) { + if (timer) { + clearTimeout(timer); + } + if (active) { + active = false; + setTimeout(closePopup,delay.hide); + } + }); if (trigger === 'hover') { target.on('mouseenter',function(e) { clearTimeout(timer); From fb81121bd344f9d6ac837c4efb8ce1c055115e84 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 4 Feb 2022 17:45:00 +0900 Subject: [PATCH 02/18] fix node validation to be applied to config node --- .../node_modules/@node-red/editor-client/src/js/ui/deploy.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index a407fc6cd..e69e853d0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -334,6 +334,9 @@ RED.deploy = (function() { var invalidNodes = []; RED.nodes.eachConfig(function(node) { + if (!node.hasOwnProperty("valid")) { + RED.editor.validateNode(node); + } if (!node.valid && !node.d) { invalidNodes.push(getNodeInfo(node)); } From dc73997be366eb946594ebccd3d204c190c8e05a Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 8 Feb 2022 09:21:52 +0900 Subject: [PATCH 03/18] fix not to use hasOwnProperty --- .../node_modules/@node-red/editor-client/src/js/ui/deploy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index e69e853d0..592075dfd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -334,7 +334,7 @@ RED.deploy = (function() { var invalidNodes = []; RED.nodes.eachConfig(function(node) { - if (!node.hasOwnProperty("valid")) { + if (node.valid === undefined) { RED.editor.validateNode(node); } if (!node.valid && !node.d) { From e5e383280960f4057ae86576e50bedd440a02801 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sun, 13 Feb 2022 01:13:59 +0900 Subject: [PATCH 04/18] fix Japanese message of delay node (#3434) --- .../node_modules/@node-red/nodes/locales/ja/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 70b813554..7784dbe4b 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -291,8 +291,8 @@ "hour": "時間", "days": "日", "day": "日", - "between": "頻度", - "and": "回/", + "between": "範囲", + "and": "〜", "rate": "流量", "msgper": "メッセージ/", "queuemsg": "中間メッセージをキューに追加", From b3f1401ab4fd924b614f4dbbf35cad419450c1dd Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 13 Feb 2022 16:56:26 +0000 Subject: [PATCH 05/18] Dont add wires to undo buffer twice Fixes #3433 --- .../@node-red/editor-client/src/js/ui/view.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 5b9285152..a3c838ce1 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2338,14 +2338,21 @@ RED.view = (function() { var removedSubflowStatus; var subflowInstances = []; var historyEvents = []; - + var addToRemovedLinks = function(links) { + if(!links) { return; } + var _links = Array.isArray(links) ? links : [links]; + _links.forEach(function(l) { + removedLinks.push(l); + selectedLinks.remove(l); + }) + } if (reconnectWires) { var reconnectResult = RED.nodes.detachNodes(movingSet.nodes()) var addedLinks = reconnectResult.newLinks; if (addedLinks.length > 0) { historyEvents.push({ t:'add', links: addedLinks }) } - removedLinks = removedLinks.concat(reconnectResult.removedLinks) + addToRemovedLinks(reconnectResult.removedLinks) } var startDirty = RED.nodes.dirty(); @@ -2377,7 +2384,7 @@ RED.view = (function() { var removedEntities = RED.nodes.remove(node.id); removedNodes.push(node); removedNodes = removedNodes.concat(removedEntities.nodes); - removedLinks = removedLinks.concat(removedEntities.links); + addToRemovedLinks(removedNodes.removedLinks); if (node.g) { var group = RED.nodes.group(node.g); if (selectedGroups.indexOf(group) === -1) { @@ -2410,20 +2417,20 @@ RED.view = (function() { if (removedSubflowOutputs.length > 0) { result = RED.subflow.removeOutput(removedSubflowOutputs); if (result) { - removedLinks = removedLinks.concat(result.links); + addToRemovedLinks(result.links); } } // Assume 0/1 inputs if (removedSubflowInputs.length == 1) { result = RED.subflow.removeInput(); if (result) { - removedLinks = removedLinks.concat(result.links); + addToRemovedLinks(result.links); } } if (removedSubflowStatus) { result = RED.subflow.removeStatus(); if (result) { - removedLinks = removedLinks.concat(result.links); + addToRemovedLinks(result.links); } } From 1388b03cf20dd981494c34f7a1c25e85aa4525c5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 14 Feb 2022 10:46:08 +0000 Subject: [PATCH 06/18] Remove console.log when ignoring disabled module --- packages/node_modules/@node-red/registry/lib/loader.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/registry/lib/loader.js b/packages/node_modules/@node-red/registry/lib/loader.js index 6e2e4d8d8..fc508aa57 100644 --- a/packages/node_modules/@node-red/registry/lib/loader.js +++ b/packages/node_modules/@node-red/registry/lib/loader.js @@ -353,7 +353,6 @@ async function loadPluginConfig(fileInfo) { */ function loadNodeSet(node) { if (!node.enabled) { - console.log("BAIL ON",node.id) return Promise.resolve(node); } else { } From 4d84926ed2e131925a163bdad353ae5e97cd97c1 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Mon, 14 Feb 2022 13:38:37 +0000 Subject: [PATCH 07/18] Update monaco for Predefined Environment Variables - add Predefined Environment Variables to snippet suggestions - update jsdoc for `env.get` --- .../src/js/ui/editors/code-editors/monaco.js | 2 +- .../editor-client/src/types/node-red/func.d.ts | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js index 35ca607a0..0e17fec75 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js @@ -577,7 +577,7 @@ RED.editor.codeEditor.monaco = (function() { createMonacoCompletionItem("set (flow context)", 'flow.set("${1:name}", ${1:value});','Set a value in flow context',range), createMonacoCompletionItem("get (global context)", 'global.get("${1:name}");','Get a value from global context',range), createMonacoCompletionItem("set (global context)", 'global.set("${1:name}", ${1:value});','Set a value in global context',range), - createMonacoCompletionItem("get (env)", 'env.get("${1:name}");','Get env variable value',range), + createMonacoCompletionItem("get (env)", 'env.get("${1|NR_NODE_ID,NR_NODE_NAME,NR_NODE_PATH,NR_GROUP_ID,NR_GROUP_NAME,NR_FLOW_ID,NR_FLOW_NAME|}");','Get env variable value',range), createMonacoCompletionItem("cloneMessage (RED.util)", 'RED.util.cloneMessage(${1:msg});', ["```typescript", "RED.util.cloneMessage(msg: T): T", diff --git a/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts b/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts index 6ac0d8b02..ae411f33c 100644 --- a/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts +++ b/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts @@ -263,6 +263,20 @@ declare class global { static keys(store: string, callback: Function); } declare class env { - /** Get an environment variable value */ - static get(name:string); + /** + * Get an environment variable value + * + * Predefined node-red variables... + * * `NR_NODE_ID` - the ID of the node + * * `NR_NODE_NAME` - the Name of the node + * * `NR_NODE_PATH` - the Path of the node + * * `NR_GROUP_ID` - the ID of the containing group + * * `NR_GROUP_NAME` - the Name of the containing group + * * `NR_FLOW_ID` - the ID of the flow the node is on + * * `NR_FLOW_NAME` - the Name of the flow the node is on + * @param name Name of the environment variable to get + * @example + * ```const flowName = env.get("NR_FLOW_NAME");``` + */ + static get(name:string) :string; } From 0261105c526ad5cc7e0447f7d2a79e4398474a92 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 14 Feb 2022 20:35:47 +0000 Subject: [PATCH 08/18] Prevent duplicate links being added between nodes --- .../node_modules/@node-red/editor-client/src/js/nodes.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 78b9deae6..ab7fae401 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -600,6 +600,14 @@ RED.nodes = (function() { RED.events.emit('nodes:add',n); } function addLink(l) { + if (nodeLinks[l.source.id]) { + const isUnique = nodeLinks[l.source.id].out.every(function(link) { + return link.sourcePort !== l.sourcePort || link.target.id !== l.target.id + }) + if (!isUnique) { + return + } + } links.push(l); if (l.source) { // Possible the node hasn't been added yet From be11fda8149b5a9b38ee3af7071142ec154088f5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 14 Feb 2022 20:44:55 +0000 Subject: [PATCH 09/18] Allow nbRateUnits to be undefined when validating Fixes #3407 --- .../node_modules/@node-red/nodes/core/function/89-delay.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-delay.html b/packages/node_modules/@node-red/nodes/core/function/89-delay.html index 8ee404924..d5b69dffd 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-delay.html +++ b/packages/node_modules/@node-red/nodes/core/function/89-delay.html @@ -115,7 +115,7 @@ timeoutUnits: {value:"seconds"}, rate: {value:"1", required:true, validate:function(v) { return RED.validators.number(v) && (v >= 0); }}, nbRateUnits: {value:"1", required:false, - validate:function(v) { return RED.validators.number(v) && (v >= 0); }}, + validate:function(v) { return v === undefined || (RED.validators.number(v) && (v >= 0)); }}, rateUnits: {value: "second"}, randomFirst: {value:"1", required:true, validate:function(v) { return RED.validators.number(v) && (v >= 0); }}, randomLast: {value:"5", required:true, validate:function(v) { return RED.validators.number(v) && (v >= 0); }}, From f2dde705efbed1840e48d4b94d977b35148c2ab3 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 14 Feb 2022 20:59:43 +0000 Subject: [PATCH 10/18] Handle mixed-cased filter terms in keyboard shortcut dialog Fixes #3400 --- .../node_modules/@node-red/editor-client/src/js/ui/keyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index cecb408bd..d9511269d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -625,7 +625,7 @@ RED.keyboard = (function() { pane.find("#red-ui-settings-tab-keyboard-filter").searchBox({ delay: 100, change: function() { - var filterValue = $(this).val().trim(); + var filterValue = $(this).val().trim().toLowerCase(); if (filterValue === "") { shortcutList.editableList('filter', null); } else { From 6a41cbebc9c84ab7268483394b7fd10fb231f8b4 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 15 Feb 2022 14:23:01 +0900 Subject: [PATCH 11/18] evaluate env var after path initialization --- .../node_modules/@node-red/runtime/lib/flows/util.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/util.js b/packages/node_modules/@node-red/runtime/lib/flows/util.js index be436eb22..0f3435b77 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/util.js @@ -77,15 +77,16 @@ function createNode(flow,config) { if (typeof nodeTypeConstructor === "function") { var conf = clone(config); delete conf.credentials; - for (var p in conf) { - if (conf.hasOwnProperty(p)) { - mapEnvVarProperties(conf,p,flow,conf); - } - } try { Object.defineProperty(conf,'_module', {value: typeRegistry.getNodeInfo(type), enumerable: false, writable: true }) Object.defineProperty(conf,'_flow', {value: flow, enumerable: false, writable: true }) Object.defineProperty(conf,'_path', {value: `${flow.path}/${config._alias||config.id}`, enumerable: false, writable: true }) + + for (var p in conf) { + if (conf.hasOwnProperty(p)) { + mapEnvVarProperties(conf,p,flow,conf); + } + } newNode = new nodeTypeConstructor(conf); } catch (err) { Log.log({ From 0f1aea3e0d127392447cc92a8032bc44573d6449 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 15 Feb 2022 14:41:03 +0900 Subject: [PATCH 12/18] add test case --- test/nodes/core/common/20-inject_spec.js | 136 +++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/test/nodes/core/common/20-inject_spec.js b/test/nodes/core/common/20-inject_spec.js index 8b0143ce9..cb14690d0 100644 --- a/test/nodes/core/common/20-inject_spec.js +++ b/test/nodes/core/common/20-inject_spec.js @@ -242,6 +242,142 @@ describe('inject node', function() { }); + it('inject name of node as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_NODE_NAME}", payloadType: "str", wires: [["n2"]], z: "flow"}, + {id: "n2", type: "helper"}]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "NAME"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('inject id of node as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_NODE_ID}", payloadType: "str", wires: [["n2"]], z: "flow"}, + {id: "n2", type: "helper"}]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "n1"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('inject path of node as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_NODE_PATH}", payloadType: "str", wires: [["n2"]], z: "flow"}, + {id: "n2", type: "helper"}]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "flow/n1"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + + it('inject name of flow as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_FLOW_NAME}", payloadType: "str", wires: [["n2"]], z: "flow"}, + {id: "n2", type: "helper"}, + {id: "flow", type: "tab", label: "FLOW" }, + ]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "FLOW"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('inject id of flow as environment variable ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_FLOW_ID}", payloadType: "str", wires: [["n2"]], z: "flow"}, + {id: "n2", type: "helper"}, + {id: "flow", type: "tab", name: "FLOW" }, + ]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "flow"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('inject name of group as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_GROUP_NAME}", payloadType: "str", wires: [["n2"]], z: "flow", g: "g0"}, + {id: "n2", type: "helper"}, + {id: "g0", type: "group", name: "GROUP" }, + ]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "GROUP"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('inject id of group as environment variable by substitution ', function (done) { + var flow = [{id: "n1", type: "inject", name: "NAME", topnic: "t1", payload: "${NR_GROUP_ID}", payloadType: "str", wires: [["n2"]], z: "flow", g: "g0"}, + {id: "n2", type: "helper"}, + {id: "g0", type: "group", name: "GROUP" }, + ]; + helper.load(injectNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + try { + msg.should.have.property("payload", "g0"); + done(); + } catch (err) { + done(err); + } + }); + n1.receive({}); + }); + }); + + it('sets the value of flow context property', function (done) { var flow = [{id: "n1", type: "inject", topic: "t1", payload: "flowValue", payloadType: "flow", wires: [["n2"]], z: "flow"}, {id: "n2", type: "helper"}]; From efd8c1229d77822186b212879d1b7ffaef051c42 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Tue, 15 Feb 2022 10:51:18 +0000 Subject: [PATCH 13/18] improve "Unexpected Node Error" logging - fixes #3389 - adds additional info to aid sourcing the issue - removes lots of undefined info when node type is incorrect - stores and reports original stack before internal try/catch exception - ensure this._flow is something before attempting to call `handleError` --- .../@node-red/runtime/lib/nodes/Node.js | 60 +++++++++++++------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js index 837e36386..f20359b8a 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js @@ -503,10 +503,25 @@ function log_helper(self, level, msg) { o.name = self.name; } // See https://github.com/node-red/node-red/issues/3327 + // See https://github.com/node-red/node-red/issues/3389 + + let srcError; + if (msg instanceof Error) { + srcError = msg;//use existing err object for actual stack + } else { + srcError = new Error(msg);//generate a new error for generate a stack + } try { - self._flow.log(o); + if(self instanceof Node && self._flow) { + self._flow.log(o); + } else { + //if self._flow is not present, this is not a node-red Node + //Set info to "Node object is not a node-red Node" to point out the `Node type` problem in log + logUnexpectedError(self, srcError, "Node object is not a node-red Node") + } } catch(err) { - logUnexpectedError(self, err) + //build an unexpected error report indicating using the original error (for better stack trace) + logUnexpectedError(self, srcError, `An error occured attempting to make a log entry: ${err}`) } } /** @@ -531,7 +546,7 @@ Node.prototype.error = function(logMessage,msg) { logMessage = logMessage || ""; } var handled = false; - if (msg && typeof msg === 'object') { + if (this._flow && msg && typeof msg === 'object') { handled = this._flow.handleError(this,logMessage,msg); } if (!handled) { @@ -619,27 +634,34 @@ function inspectObject(flow) { } } -function logUnexpectedError(node, error) { - let moduleInfo = node._module?`${node._module.module}@${node._module.version}`:"undefined" - Log.error(` +function logUnexpectedError(node, error, info) { + const header = ` ******************************************************************** Unexpected Node Error -${error.stack} -Node: - Type: ${node.type} - Module: ${moduleInfo} - ID: ${node._alias||node.id} - Properties: - ${inspectObject(node)} -Flow: ${node._flow?node._flow.path:'undefined'} - Type: ${node._flow?node._flow.TYPE:'undefined'} - Properties: - ${node._flow?inspectObject(node._flow):'undefined'} +********************************************************************`; + const footer = ` Please report this issue, including the information logged above: https://github.com/node-red/node-red/issues/ -******************************************************************** -`) +********************************************************************`; + + let detail = [`Info:\n ${info || 'No additional info'}`]; + + //Include Error info? + if(error && error.stack){ + detail.push(`Stack:\n ${error.stack}`) + } + //Include Node info? + if(node && (node._module || node.type)){ + const moduleInfo = node._module?`${node._module.module}@${node._module.version}`:"undefined"; + const id = node._alias||node.id||"undefined"; + detail.push(`Node:\n Type: ${node.type}\n Module: ${moduleInfo}\n ID: ${id}\n Properties:\n ${inspectObject(node)}`) + } + //Include Flow info? + if(node && node._flow){ + detail.push(`Flow: ${node._flow.path}\n Type: ${node._flow.TYPE}\n Properties:\n ${inspectObject(node._flow)}`) + } + Log.error(`${header}\n${detail.join("\n")}\n${footer}`); } module.exports = Node; From 2b958f57241f403e0005b8663290f867683de71d Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Tue, 15 Feb 2022 12:40:34 +0000 Subject: [PATCH 14/18] Improve module location parsing when adding hook - fixes #3401 - handles brackets and no brackets in stack line - handles short stack --- .../node_modules/@node-red/util/lib/hooks.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/util/lib/hooks.js b/packages/node_modules/@node-red/util/lib/hooks.js index 6dc1a37c9..d8fb6541c 100644 --- a/packages/node_modules/@node-red/util/lib/hooks.js +++ b/packages/node_modules/@node-red/util/lib/hooks.js @@ -67,8 +67,25 @@ function add(hookId, callback) { throw new Error("Hook "+hookId+" already registered") } // Get location of calling code + let callModule; const stack = new Error().stack; - const callModule = stack.split("\n")[2].split("(")[1].slice(0,-1); + const stackEntries = stack.split("\n").slice(1);//drop 1st line (error message) + const stackEntry2 = stackEntries[1];//get 2nd stack entry + if (stackEntry2) { + try { + if (stackEntry2.indexOf(" (") >= 0) { + callModule = stackEntry2.split("(")[1].slice(0, -1); + } else { + callModule = stackEntry2.split(" ").slice(-1)[0]; + } + } catch (error) { + Log.debug(`Unable to determined module when adding hook '${hookId}'. Stack:\n${stackEntries.join("\n")}`); + callModule = "unknown:0:0"; + } + } else { + Log.debug(`Unable to determined module when adding hook '${hookId}'. Stack:\n${stackEntries.join("\n")}`); + callModule = "unknown:0:0"; + } Log.debug(`Adding hook '${hookId}' from ${callModule}`); const hookItem = {cb:callback, location: callModule, previousHook: null, nextHook: null } From bee21ddc9e27ee4f5d59381f9791b43254965ef3 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 15 Feb 2022 13:36:05 +0000 Subject: [PATCH 15/18] Update dependencies --- package.json | 24 +++++++++---------- .../@node-red/editor-api/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 8 +++---- .../@node-red/registry/package.json | 2 +- .../node_modules/@node-red/util/package.json | 4 ++-- packages/node_modules/node-red/package.json | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index d3b1c7b14..e08144d61 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "dependencies": { "acorn": "8.7.0", "acorn-walk": "8.2.0", - "ajv": "8.9.0", + "ajv": "8.10.0", "async-mutex": "0.3.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", @@ -36,7 +36,7 @@ "cheerio": "1.0.0-rc.10", "clone": "2.1.2", "content-type": "1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", @@ -50,32 +50,32 @@ "hash-sum": "2.0.0", "hpagent": "0.1.2", "https-proxy-agent": "5.0.0", - "i18next": "21.6.10", + "i18next": "21.6.11", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "3.14.1", "json-stringify-safe": "5.0.1", - "jsonata": "1.8.5", + "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", "media-typer": "1.1.0", - "memorystore": "1.6.6", + "memorystore": "1.6.7", "mime": "3.0.0", "moment-timezone": "0.5.34", - "mqtt": "4.3.4", + "mqtt": "4.3.5", "multer": "1.4.4", "mustache": "4.2.0", - "node-red-admin": "^2.2.2", + "node-red-admin": "^2.2.3", "nopt": "5.0.0", "oauth2orize": "1.11.1", "on-headers": "1.0.2", "passport": "0.5.2", "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", - "raw-body": "2.4.2", + "raw-body": "2.4.3", "semver": "7.3.5", "tar": "6.1.11", "tough-cookie": "4.0.0", - "uglify-js": "3.15.0", + "uglify-js": "3.15.1", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23" @@ -84,7 +84,7 @@ "bcrypt": "5.0.1" }, "devDependencies": { - "dompurify": "2.3.4", + "dompurify": "2.3.5", "grunt": "1.4.1", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", @@ -113,11 +113,11 @@ "node-red-node-test-helper": "^0.2.7", "nodemon": "2.0.15", "proxy": "^1.0.2", - "sass": "1.49.0", + "sass": "1.49.7", "should": "13.2.3", "sinon": "11.1.2", "stoppable": "^1.1.0", - "supertest": "6.2.1" + "supertest": "6.2.2" }, "engines": { "node": ">=12" diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 0436f2871..450b5b07a 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -24,7 +24,7 @@ "cors": "2.8.5", "express-session": "1.17.2", "express": "4.17.2", - "memorystore": "1.6.6", + "memorystore": "1.6.7", "mime": "3.0.0", "multer": "1.4.4", "mustache": "4.2.0", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 93a8c9593..00d53e41f 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -17,12 +17,12 @@ "dependencies": { "acorn": "8.7.0", "acorn-walk": "8.2.0", - "ajv": "8.9.0", + "ajv": "8.10.0", "body-parser": "1.19.1", "cheerio": "1.0.0-rc.10", "content-type": "1.0.4", "cookie-parser": "1.4.6", - "cookie": "0.4.1", + "cookie": "0.4.2", "cors": "2.8.5", "cronosjs": "1.7.1", "denque": "2.0.1", @@ -36,11 +36,11 @@ "is-utf8": "0.2.1", "js-yaml": "3.14.1", "media-typer": "1.1.0", - "mqtt": "4.3.4", + "mqtt": "4.3.5", "multer": "1.4.4", "mustache": "4.2.0", "on-headers": "1.0.2", - "raw-body": "2.4.2", + "raw-body": "2.4.3", "tough-cookie": "4.0.0", "uuid": "8.3.2", "ws": "7.5.6", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index d332591bc..2b617e50e 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -21,6 +21,6 @@ "fs-extra": "10.0.0", "semver": "7.3.5", "tar": "6.1.11", - "uglify-js": "3.15.0" + "uglify-js": "3.15.1" } } diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index e2cc4e3c2..599a3cb6b 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -16,9 +16,9 @@ ], "dependencies": { "fs-extra": "10.0.0", - "i18next": "21.6.10", + "i18next": "21.6.11", "json-stringify-safe": "5.0.1", - "jsonata": "1.8.5", + "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", "moment-timezone": "0.5.34" } diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index bbace8b23..cc29fa78a 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -39,7 +39,7 @@ "bcryptjs": "2.4.3", "express": "4.17.2", "fs-extra": "10.0.0", - "node-red-admin": "^2.2.2", + "node-red-admin": "^2.2.3", "nopt": "5.0.0", "semver": "7.3.5" }, From fcf299401555e4ee02241999bb42fca80a1634b2 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 15 Feb 2022 13:41:53 +0000 Subject: [PATCH 16/18] Bump for 2.2.1 --- CHANGELOG.md | 25 +++++++++++++++++++ package.json | 2 +- .../@node-red/editor-api/package.json | 6 ++--- .../@node-red/editor-client/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 2 +- .../@node-red/registry/package.json | 4 +-- .../@node-red/runtime/package.json | 6 ++--- .../node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 ++++---- 9 files changed, 42 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 747f78261..215369faa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +#### 2.2.1: Maintenance Release + +Editor + + - Handle mixed-cased filter terms in keyboard shortcut dialog (#3444) @knolleary + - Prevent duplicate links being added between nodes (#3442) @knolleary + - Fix to hide tooltip after removing subflow tab (#3391) @HiroyasuNishiyama + - Fix node validation to be applied to config node (#3397) @HiroyasuNishiyama + - Fix: Dont add wires to undo buffer twice (#3437) @Steve-Mcl + +Runtime + + - Improve module location parsing (of stack info) when adding hook (#3447) @Steve-Mcl + - Fix substitution of NR_NODE_PATH (#3445) @HiroyasuNishiyama + - Remove console.log when ignoring disabled module (#3439) @knolleary + - Improve "Unexpected Node Error" logging (#3446) @Steve-Mcl + +Nodes + + - Debug: Fix no-prototype-builtins bug in debug node and utils (#3394) @Alkarex + - Delay: Fix Japanese message of delay node (#3434) + - Allow nbRateUnits to be undefined when validating (#3443) @knolleary + - Coding help for recently added node-red Predefined Environment Variables (#3440) @Steve-Mcl + + #### 2.2.0: Milestone Release Editor diff --git a/package.json b/package.json index e08144d61..793ebc758 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "2.2.0", + "version": "2.2.1", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 450b5b07a..742f308d3 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "2.2.0", - "@node-red/editor-client": "2.2.0", + "@node-red/util": "2.2.1", + "@node-red/editor-client": "2.2.1", "bcryptjs": "2.4.3", "body-parser": "1.19.1", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 03bba0d2a..504561a6f 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 00d53e41f..3b60c111d 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 2b617e50e..cfe712979 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "2.2.0", + "@node-red/util": "2.2.1", "clone": "2.1.2", "fs-extra": "10.0.0", "semver": "7.3.5", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 3062b17f9..6fcc58f5a 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "2.2.0", - "@node-red/util": "2.2.0", + "@node-red/registry": "2.2.1", + "@node-red/util": "2.2.1", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.17.2", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 599a3cb6b..206710250 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index cc29fa78a..201fc7ec7 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "2.2.0", + "version": "2.2.1", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "2.2.0", - "@node-red/runtime": "2.2.0", - "@node-red/util": "2.2.0", - "@node-red/nodes": "2.2.0", + "@node-red/editor-api": "2.2.1", + "@node-red/runtime": "2.2.1", + "@node-red/util": "2.2.1", + "@node-red/nodes": "2.2.1", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.17.2", From 669aa769c2c3ce568e635eaf77af00b792de1c2a Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 17 Feb 2022 10:18:46 +0000 Subject: [PATCH 17/18] Fix close timeout on MQTT nodes fixes #2934 --- .../@node-red/nodes/core/network/10-mqtt.js | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index 5546dc868..bdf2b0e5b 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -637,24 +637,8 @@ module.exports = function(RED) { node.deregister = function(mqttNode,done) { delete node.users[mqttNode.id]; - if (node.closing) { - return done(); - } - if (Object.keys(node.users).length === 0) { - if (node.client && node.client.connected) { - // Send close message - if (node.closeMessage) { - node.publish(node.closeMessage,function(err) { - node.client.end(done); - }); - } else { - node.client.end(done); - } - return; - } else { - if (node.client) { node.client.end(); } - return done(); - } + if (!node.closing && node.connected && Object.keys(node.users).length === 0) { + node.disconnect(); } done(); }; @@ -663,6 +647,7 @@ module.exports = function(RED) { } node.connect = function (callback) { if (node.canConnect()) { + node.closing = false; node.connecting = true; setStatusConnecting(node, true); try { @@ -672,6 +657,7 @@ module.exports = function(RED) { let callbackDone = false; //prevent re-connects causing node.client.on('connect' firing callback multiple times // Register successful connect or reconnect handler node.client.on('connect', function (connack) { + node.closing = false; node.connecting = false; node.connected = true; if(!callbackDone && typeof callback == "function") { @@ -740,6 +726,7 @@ module.exports = function(RED) { reasonCode: rc, reasonString: rs } + node.connected = false; node.log(RED._("mqtt.state.broker-disconnected", details)); setStatusDisconnected(node, true); }); @@ -764,25 +751,31 @@ module.exports = function(RED) { } }; node.disconnect = function (callback) { - const _callback = function () { + const _callback = function (resetNodeConnectedState) { setStatusDisconnected(node, true); - node.connecting = false; - node.connected = false; + if(resetNodeConnectedState) { + node.closing = true; + node.connecting = false; + node.connected = false; + } callback && typeof callback == "function" && callback(); }; - if(node.client) { - if(node.client.connected && node.closeMessage) { - node.publish(node.closeMessage, function (err) { - node.client.end(_callback); - }); - } else if(node.client.connected || node.client.reconnecting) { - node.client.end(_callback); - } else if(node.client.disconnecting || node.client.connected === false) { - _callback(); - } + if(node.closing) { + return _callback(false); + } + var endCallBack = function endCallBack() { + } + if(node.connected && node.closeMessage) { + node.publish(node.closeMessage, function (err) { + node.client.end(endCallBack); + _callback(true); + }); + } else if(node.connected) { + node.client.end(endCallBack); + _callback(true); } else { - _callback(); + _callback(false); } } node.subscriptionIds = {}; @@ -1074,6 +1067,8 @@ module.exports = function(RED) { node.brokerConn.unsubscribe(node.topic,node.id, removed); } node.brokerConn.deregister(node, done); + } else { + done(); } }); } else { @@ -1134,7 +1129,11 @@ module.exports = function(RED) { } node.brokerConn.register(node); node.on('close', function(done) { - node.brokerConn.deregister(node,done); + if (node.brokerConn) { + node.brokerConn.deregister(node,done); + } else { + done(); + } }); } else { node.error(RED._("mqtt.errors.missing-config")); From 5f0ea85f47296f32a2f2cf71a99edaf6a6397651 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 18 Feb 2022 14:46:01 +0000 Subject: [PATCH 18/18] Bump for 2.2.2 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 9 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 215369faa..9eabbaaac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +#### 2.2.2: Maintenance Release + +Nodes + + - Fix "close timed out" error when performing full deploy or modifying broker node. (#3451) @Steve-Mcl + + #### 2.2.1: Maintenance Release Editor diff --git a/package.json b/package.json index 793ebc758..df031ca2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "2.2.1", + "version": "2.2.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 742f308d3..468585284 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "2.2.1", - "@node-red/editor-client": "2.2.1", + "@node-red/util": "2.2.2", + "@node-red/editor-client": "2.2.2", "bcryptjs": "2.4.3", "body-parser": "1.19.1", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 504561a6f..347fe9112 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 3b60c111d..2c6aeb307 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index cfe712979..e96d8e396 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "2.2.1", + "@node-red/util": "2.2.2", "clone": "2.1.2", "fs-extra": "10.0.0", "semver": "7.3.5", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 6fcc58f5a..c06ab74bf 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "2.2.1", - "@node-red/util": "2.2.1", + "@node-red/registry": "2.2.2", + "@node-red/util": "2.2.2", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.17.2", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 206710250..b7d817f07 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "2.2.1", + "version": "2.2.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 201fc7ec7..cae0721af 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "2.2.1", + "version": "2.2.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "2.2.1", - "@node-red/runtime": "2.2.1", - "@node-red/util": "2.2.1", - "@node-red/nodes": "2.2.1", + "@node-red/editor-api": "2.2.2", + "@node-red/runtime": "2.2.2", + "@node-red/util": "2.2.2", + "@node-red/nodes": "2.2.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.17.2",