From 4f77bbeb2b9da0e9d1c261c1e5a8cbfcfe44dd0c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 18 May 2021 11:52:49 +0100 Subject: [PATCH 1/7] Update for 1.3.5 --- CHANGELOG.md | 32 +++++++++++++++++++ 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, 49 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc175a79b..78ce7d480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +### 1.3.5 Maintenance Release + +Editor + + - Open subflow tab next to active tab rather than at the end + - Shrink default notification box + - Support mousewheel scroll in tab bar + - Revert some of #2967 to fix treeList gutter width calculation + - Prevent unknown node from breaking editor + - Stop module with missing types from preventing editor load + - Handle sidebar tab that no longer exists when setting first active + - Fix plugin loading when browser sends unrecognised lang + - Prevent error whilst drag/drop importing from leaving dropTarget visible Fixes #2982 + - Fix scaling issues when dragging nodes into scaled workspace + - Fix incorrect shortcut keys in info tips (#2980) @kazuhitoyokoi + - Reduce code duplication around node/label generation + - Fix theme handling when no editorTheme.page setting + - Fix jshint error in treeList + +Runtime + + - Fix error handling in runtime/lib/api/nodes + - Add Node 16 with sass fixed + - Migrate from node-sass to sass (#2984) + - Fix "installRetry" was declared a constant and changed (#2974) @aheissenberger + +Nodes + + - Function: Fix 'SyntaxError' in Function node when last line of on-stop is a comment + - Function: Fix Function tab label names in the node help text Closes #2978 + - Function: Update Japanese info text of function node (#2985) @HiroyasuNishiyama + ### 1.3.4 Maintenance Release Editor diff --git a/package.json b/package.json index 39bbd2fe5..1e87b5a30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "1.3.4", + "version": "1.3.5", "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 185e1e36a..333ddbba3 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": "1.3.4", + "version": "1.3.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "1.3.4", - "@node-red/editor-client": "1.3.4", + "@node-red/util": "1.3.5", + "@node-red/editor-client": "1.3.5", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "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 44f9a4fe8..a46e35fb2 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": "1.3.4", + "version": "1.3.5", "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 52dfeb8f2..30d00f038 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": "1.3.4", + "version": "1.3.5", "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 cb59f50be..b3c6b4f19 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": "1.3.4", + "version": "1.3.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "1.3.4", + "@node-red/util": "1.3.5", "semver": "6.3.0", "tar": "6.1.0", "uglify-js": "3.13.3" diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index abfcaa1e8..c138d23ac 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": "1.3.4", + "version": "1.3.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "1.3.4", - "@node-red/util": "1.3.4", + "@node-red/registry": "1.3.5", + "@node-red/util": "1.3.5", "async-mutex": "0.3.1", "clone": "2.1.2", "express": "4.17.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 15d457309..2d0d12c9c 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": "1.3.4", + "version": "1.3.5", "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 a770e68e2..20c183c19 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": "1.3.4", + "version": "1.3.5", "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": "1.3.4", - "@node-red/runtime": "1.3.4", - "@node-red/util": "1.3.4", - "@node-red/nodes": "1.3.4", + "@node-red/editor-api": "1.3.5", + "@node-red/runtime": "1.3.5", + "@node-red/util": "1.3.5", + "@node-red/nodes": "1.3.5", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.17.1", From 4dbebefb4537686bde25bb8716c395cd9c6ea15b Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sun, 23 May 2021 10:01:45 +0900 Subject: [PATCH 2/7] fix handling empty rules --- .../node_modules/@node-red/nodes/core/function/10-switch.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-switch.js b/packages/node_modules/@node-red/nodes/core/function/10-switch.js index 95071731d..aa1972221 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-switch.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-switch.js @@ -217,6 +217,10 @@ module.exports = function(RED) { function applyRules(node, msg, property,state,done) { if (!state) { + if (node.rules.length === 0) { + done(undefined, []); + return; + } state = { currentRule: 0, elseflag: true, From bb1b3727cbb5e98d9f74736e33566b354f3d7055 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sun, 23 May 2021 10:42:28 +0900 Subject: [PATCH 3/7] add test case --- test/nodes/core/function/10-switch_spec.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/nodes/core/function/10-switch_spec.js b/test/nodes/core/function/10-switch_spec.js index dfcc55572..180ec9d36 100644 --- a/test/nodes/core/function/10-switch_spec.js +++ b/test/nodes/core/function/10-switch_spec.js @@ -1134,4 +1134,20 @@ describe('switch Node', function() { }); }); + + it('should handle empty rule', function(done) { + var flow = [{id:"switchNode1",type:"switch",name:"switchNode",property:"payload",rules:[],checkall:true,outputs:0,wires:[]}]; + helper.load(switchNode, flow, function() { + var n1 = helper.getNode("switchNode1"); + setTimeout(function() { + var logEvents = helper.log().args.filter(function (evt) { + return evt[0].type == "switch"; + }); + if (logEvents.length === 0) { + done(); + } + }, 150); + n1.receive({payload:1}); + }); + }); }); From 3e6a55f78e142c5c0c0508a57cc683597add3d4e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 2 Jun 2021 11:58:51 +0100 Subject: [PATCH 4/7] Update to latest 6.x ws module --- package.json | 2 +- packages/node_modules/@node-red/editor-api/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 1e87b5a30..2468fcbd2 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "semver": "6.3.0", "tar": "6.1.0", "uglify-js": "3.13.3", - "ws": "6.2.1", + "ws": "6.2.2", "xml2js": "0.4.23" }, "optionalDependencies": { diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 333ddbba3..4e705fbb1 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -32,7 +32,7 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "passport": "0.4.1", - "ws": "6.2.1" + "ws": "6.2.2" }, "optionalDependencies": { "bcrypt": "3.0.6" diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 30d00f038..747e584a9 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -37,7 +37,7 @@ "on-headers": "1.0.2", "raw-body": "2.4.1", "request": "2.88.0", - "ws": "6.2.1", + "ws": "6.2.2", "xml2js": "0.4.23", "iconv-lite": "0.6.2" } From 12698dc3474ca2c527c3dfeb54836ce9ee74dcb7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 2 Jun 2021 12:32:44 +0100 Subject: [PATCH 5/7] Add full ast parsing in Function node to spot node.done calls Fixes #2998 --- package.json | 2 ++ .../nodes/core/function/10-function.js | 29 ++++++++++++++----- .../node_modules/@node-red/nodes/package.json | 2 ++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2468fcbd2..856120695 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ } ], "dependencies": { + "acorn": "8.3.0", + "acorn-walk": "8.1.0", "ajv": "6.12.6", "async-mutex": "0.3.1", "basic-auth": "2.0.1", diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index 1b3dc3ba9..c1c20f266 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -19,6 +19,8 @@ module.exports = function(RED) { var util = require("util"); var vm = require("vm"); + var acorn = require("acorn"); + var acornWalk = require("acorn-walk"); function sendResults(node,send,_msgid,msgs,cloneFirstMessage) { if (msgs == null) { @@ -102,14 +104,7 @@ module.exports = function(RED) { throw new Error(RED._("function.error.externalModuleNotAllowed")); } - var handleNodeDoneCall = true; - // Check to see if the Function appears to call `node.done()`. If so, - // we will assume it is well written and does actually call node.done(). - // Otherwise, we will call node.done() after the function returns regardless. - if (/node\.done\s*\(\s*\)/.test(node.func)) { - handleNodeDoneCall = false; - } var functionText = "var results = null;"+ "results = (async function(msg,__send__,__done__){ "+ @@ -130,6 +125,26 @@ module.exports = function(RED) { "};\n"+ node.func+"\n"+ "})(msg,__send__,__done__);"; + + var handleNodeDoneCall = true; + + // Check to see if the Function appears to call `node.done()`. If so, + // we will assume it is well written and does actually call node.done(). + // Otherwise, we will call node.done() after the function returns regardless. + if (/node\.done\s*\(\s*\)/.test(functionText)) { + // We have spotted the code contains `node.done`. It could be in a comment + // so need to do the extra work to parse the AST and examine it properly. + acornWalk.simple(acorn.parse(functionText,{ecmaVersion: "latest"} ), { + CallExpression(astNode) { + if (astNode.callee && astNode.callee.object) { + if (astNode.callee.object.name === "node" && astNode.callee.property.name === "done") { + handleNodeDoneCall = false; + } + } + } + }) + } + var finScript = null; var finOpt = null; node.topic = n.topic; diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 747e584a9..223c07e96 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -15,6 +15,8 @@ } ], "dependencies": { + "acorn": "8.3.0", + "acorn-walk": "8.1.0", "ajv": "6.12.6", "body-parser": "1.19.0", "cheerio": "0.22.0", From a92f8f36c197047e426aca7fadc27f29636b69f7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 2 Jun 2021 14:07:22 +0100 Subject: [PATCH 6/7] Keep proper track of moved/changed state in undo/redo history Fixes #2999 --- .../@node-red/editor-client/src/js/history.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index 7fedf84be..338d955e1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -66,12 +66,14 @@ RED.history = (function() { var importedResult = RED.nodes.import(ev.config,{importMap: importMap}) inverseEv = { t: 'replace', - config: importedResult.removedNodes + config: importedResult.removedNodes, + dirty: RED.nodes.dirty() } } } else if (ev.t == 'add') { inverseEv = { t: "delete", + dirty: RED.nodes.dirty() }; if (ev.nodes) { inverseEv.nodes = []; @@ -158,7 +160,8 @@ RED.history = (function() { } else if (ev.t == "delete") { inverseEv = { - t: "add" + t: "add", + dirty: RED.nodes.dirty() }; if (ev.workspaces) { inverseEv.workspaces = []; @@ -300,11 +303,12 @@ RED.history = (function() { } else if (ev.t == "move") { inverseEv = { t: 'move', - nodes: [] + nodes: [], + dirty: RED.nodes.dirty() }; for (i=0;i Date: Wed, 2 Jun 2021 14:48:54 +0100 Subject: [PATCH 7/7] Fix handling of boolean subflow module properties Fixes #3000 --- packages/node_modules/@node-red/runtime/lib/flows/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 79c70fb02..00b54bc32 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/util.js @@ -110,7 +110,7 @@ function createNode(flow,config) { switch(typeof config[nodeProp.name]) { case "string": nodePropType = "str"; break; case "number": nodePropType = "num"; break; - case "boolean": nodePropType = "bool"; nodePropValue = nodeProp?"true":"false"; break; + case "boolean": nodePropType = "bool"; nodePropValue == nodeProp?"true":"false"; break; default: nodePropType = config[nodeProp.name].type; nodePropValue = config[nodeProp.name].value;