From 660a2e0ed6f9393f06bc3df6bd2425661d33ec8d Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sat, 16 Jul 2022 19:51:35 +0100 Subject: [PATCH 001/108] Allow HTTP Headers not in spec potential fix for #3772 --- .../@node-red/nodes/core/network/21-httprequest.html | 12 ++++++++++++ .../@node-red/nodes/core/network/21-httprequest.js | 4 ++++ .../@node-red/nodes/locales/en-US/messages.json | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html index 8b1320496..b9a44e1b4 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html @@ -91,6 +91,11 @@ +
+ + +
+
@@ -227,6 +232,7 @@ persist: {value:false}, proxy: {type:"http proxy",required: false, label:RED._("node-red:httpin.proxy-config") }, + insecureHTTPParser: {value: false}, authType: {value: ""}, senderr: {value: false}, headers: { value: [] } @@ -338,6 +344,12 @@ } else { $("#node-input-useProxy").prop("checked", false); } + + if (node.insecureHTTPParser) { + $("node-intput-insecureHTTPParser").prop("checked", true) + } else { + $("node-intput-insecureHTTPParser").prop("checked", false) + } updateProxyOptions(); $("#node-input-useProxy").on("click", function() { updateProxyOptions(); diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js index 6a19d2ed2..b94d59dc7 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js @@ -244,6 +244,10 @@ in your Node-RED user directory (${RED.settings.userDir}). delete options.headers[h]; } }) + + if (node.insecureHTTPParser) { + options.insecureHTTPParser = true + } } ], beforeRedirect: [ diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 62d5f351f..b38ab3026 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -554,7 +554,8 @@ }, "status": { "requesting": "requesting" - } + }, + "insecureHTTPParser": "Lenient HTTP Header Parsing" }, "websocket": { "label": { From d546a4a15b9c5d14982ce9d17e3e2b7543589fae Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:14:06 +0100 Subject: [PATCH 002/108] Remove use of Object.hasOwn Fixes #3778 --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8c7ea22a3..949d2473f 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 @@ -4906,7 +4906,7 @@ RED.view = (function() { if (d._def.button) { var buttonEnabled = isButtonEnabled(d); this.__buttonGroup__.classList.toggle("red-ui-flow-node-button-disabled", !buttonEnabled); - if (RED.runtime && Object.hasOwn(RED.runtime,'started')) { + if (RED.runtime && RED.runtime.started !== undefined) { this.__buttonGroup__.classList.toggle("red-ui-flow-node-button-stopped", !RED.runtime.started); } From e120bad779017682d64bf071bc950946c48db93b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:37:40 +0100 Subject: [PATCH 003/108] Ensure quick-add dialog does not obscure ghost node when shifted --- .../@node-red/editor-client/src/js/ui/typeSearch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js index fc5b8e99e..989cb78ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js @@ -269,8 +269,8 @@ RED.typeSearch = (function() { moveCallback = opts.move; RED.events.emit("type-search:open"); //shade.show(); - if ($("#red-ui-main-container").height() - opts.y - 150 < 0) { - opts.y = opts.y - 235; + if ($("#red-ui-main-container").height() - opts.y - 195 < 0) { + opts.y = opts.y - 275; } dialog.css({left:opts.x+"px",top:opts.y+"px"}).show(); searchResultsDiv.slideDown(300); From 5944fdb5dc1446d227344dec33407998472b7027 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:40:20 +0100 Subject: [PATCH 004/108] Properly position quick-add dialog in all cases Fixes #3781 --- .../editor-client/src/js/ui/contextMenu.js | 14 +++++--------- .../@node-red/editor-client/src/js/ui/view.js | 7 +++++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 66ae2b943..8e1d0d19a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -44,14 +44,10 @@ RED.contextMenu = (function () { const canRemoveFromGroup = hasSelection && !!selection.nodes[0].g const offset = $("#red-ui-workspace-chart").offset() - let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft() - let addY = options.y - offset.top + $("#red-ui-workspace-chart").scrollTop() - - if (RED.view.snapGrid) { - const gridSize = RED.view.gridSize() - addX = gridSize * Math.floor(addX / gridSize) - addY = gridSize * Math.floor(addY / gridSize) - } + // addX/addY must be the position in the workspace accounting for both scroll and scale + // The +5 is because we display the contextMenu -5,-5 to actual click position + let addX = (options.x + 5 - offset.left + $("#red-ui-workspace-chart").scrollLeft()) / RED.view.scale() + let addY = (options.y + 5 - offset.top + $("#red-ui-workspace-chart").scrollTop()) / RED.view.scale() const menuItems = [ { onselect: 'core:show-action-list', onpostselect: function () { } }, @@ -144,7 +140,7 @@ RED.contextMenu = (function () { ($(window).width() -MENU_WIDTH)) { direction = "left"; } - + menu = RED.menu.init({ direction: direction, onpreselect: function() { 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 8c7ea22a3..601c625ce 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 @@ -1071,12 +1071,15 @@ RED.view = (function() { RED.view.redraw(); } + // `point` is the place in the workspace the mouse has clicked. + // This takes into account scrolling and scaling of the workspace. var ox = point[0]; var oy = point[1]; + // Need to map that to browser location to position the pop-up const offset = $("#red-ui-workspace-chart").offset() - var clientX = ox + offset.left - $("#red-ui-workspace-chart").scrollLeft() - var clientY = oy + offset.top - $("#red-ui-workspace-chart").scrollTop() + var clientX = (ox * scaleFactor) + offset.left - $("#red-ui-workspace-chart").scrollLeft() + var clientY = (oy * scaleFactor) + offset.top - $("#red-ui-workspace-chart").scrollTop() if (RED.settings.get("editor").view['view-snap-grid']) { // eventLayer.append("circle").attr("cx",point[0]).attr("cy",point[1]).attr("r","2").attr('fill','red') From 8d3c5d09f695622bed0507299d0f5f7dd3501c90 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:47:57 +0100 Subject: [PATCH 005/108] Do not flag hasUsers=false nodes as unused in search Fixes #3777 --- .../@node-red/editor-client/src/js/ui/search.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 217fb5a4e..f9cc79f08 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -187,7 +187,7 @@ RED.search = (function() { } if (flags.hasOwnProperty("unused")) { var isUnused = (node.node.type === 'subflow' && node.node.instances.length === 0) || - (isConfigNode && node.node.users.length === 0) + (isConfigNode && node.node.users.length === 0 && node.node._def.hasUsers !== false) if (flags.unused !== isUnused) { continue; } @@ -538,7 +538,7 @@ RED.search = (function() { $(previousActiveElement).trigger("focus"); } previousActiveElement = null; - } + } if(!keepSearchToolbar) { clearActiveSearch(); } @@ -630,7 +630,7 @@ RED.search = (function() { $("#red-ui-sidebar-shade").on('mousedown',hide); $("#red-ui-view-searchtools-close").on("click", function close() { - clearActiveSearch(); + clearActiveSearch(); updateSearchToolbar(); }); $("#red-ui-view-searchtools-close").trigger("click"); From 39b2fe45a5639824ce58583227f92fc35ffc4a30 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 11:11:44 +0100 Subject: [PATCH 006/108] Ensure all typedInput buttons have button type set Fixes #3780 Otherwise they act as type="submit" and the browser will click on them when enter is pressed in an input --- .../editor-client/src/js/ui/common/typedInput.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 549479d85..ef1be05bc 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -90,10 +90,10 @@ optEl.append(generateSpans(srcMatch)); optEl.appendTo(element); } - matches.push({ - value: optVal, - label: element, - i: (valMatch.found ? valMatch.index : srcMatch.index) + matches.push({ + value: optVal, + label: element, + i: (valMatch.found ? valMatch.index : srcMatch.index) }); } }) @@ -501,7 +501,7 @@ this.options.types = this.options.types||Object.keys(allOptions); } - this.selectTrigger = $('').prependTo(this.uiSelect); + this.selectTrigger = $('').prependTo(this.uiSelect); $('').toggle(this.options.types.length > 1).appendTo(this.selectTrigger); this.selectLabel = $('').appendTo(this.selectTrigger); @@ -570,7 +570,7 @@ }) // explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline' - this.optionSelectTrigger = $('').appendTo(this.uiSelect); + this.optionSelectTrigger = $('').appendTo(this.uiSelect); this.optionSelectLabel = $('').prependTo(this.optionSelectTrigger); // RED.popover.tooltip(this.optionSelectLabel,function() { // return that.optionValue; @@ -591,7 +591,7 @@ that.uiSelect.addClass('red-ui-typedInput-focus'); }); - this.optionExpandButton = $('').appendTo(this.uiSelect); + this.optionExpandButton = $('').appendTo(this.uiSelect); this.optionExpandButtonIcon = $('').appendTo(this.optionExpandButton); this.type(this.typeField.val() || this.options.default||this.typeList[0].value); From 7c5413e568eab28c1fe892c51e39557492cbaaef Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:29:16 +0100 Subject: [PATCH 007/108] ensure red-ui-editor-stack is focusable --- packages/node_modules/@node-red/editor-client/src/js/red.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 55446418b..7544434b7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -766,7 +766,7 @@ var RED = (function() { $('
').appendTo(header); $('
'+ '
'+ - '
'+ + '
'+ '
'+ '
'+ '
'+ From 1b53b5b92792b714600869f5d0b8822f1e140079 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:30:15 +0100 Subject: [PATCH 008/108] focus stack when re-showing nested editor --- .../node_modules/@node-red/editor-client/src/js/ui/editor.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index fb4c200f5..be114c4a8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -1105,6 +1105,10 @@ RED.editor = (function() { if (editing_node) { RED.sidebar.info.refresh(editing_node); RED.sidebar.help.show(editing_node.type, false); + //ensure focused element is NOT body (for keyboard scope to operate correctly) + if (document.activeElement.tagName === 'BODY') { + $('#red-ui-editor-stack').trigger('focus') + } } } } From 273404e24df2ca863ef7397a82cc1b344fed50ac Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:30:52 +0100 Subject: [PATCH 009/108] focus search input when opened via context menu --- .../@node-red/editor-client/src/js/ui/contextMenu.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 66ae2b943..1ace19a75 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -67,6 +67,10 @@ RED.contextMenu = (function () { splice: isSingleLink ? selection.links[0] : undefined, // spliceMultiple: isMultipleLinks }) + }, + onpostselect: function() { + // ensure quick add dialog search input has focus + $('#red-ui-type-search-input').trigger('focus') } }, (hasLinks) ? { // has least 1 wire selected From f7120b32f54cb1a919e82b3e25b25c7b404418f5 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 13:58:03 +0100 Subject: [PATCH 010/108] Allow `mode` and `title` to be empty fixes #3774 --- .../editor-client/src/js/ui/editors/code-editors/monaco.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 701e3da44..497116125 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 @@ -764,7 +764,7 @@ RED.editor.codeEditor.monaco = (function() { if(!options.stateId && options.stateId !== false) { - options.stateId = RED.editor.generateViewStateId("monaco", options, (options.mode || options.title).split("/").pop()); + options.stateId = RED.editor.generateViewStateId("monaco", options, (options.mode || options.title || "").split("/").pop()); } var el = options.element || $("#"+options.id)[0]; var toolbarRow = $("
").appendTo(el); From af4f07cb263f98d27ed424fca48a3eb1212afa6a Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 09:29:51 +0100 Subject: [PATCH 011/108] include flows stop/start state --- .../node_modules/@node-red/runtime/lib/api/diagnostics.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js index cbf9fc9d7..443751ecc 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js +++ b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js @@ -100,9 +100,13 @@ function buildDiagnosticReport(scope, callback) { version: os.version(), }, runtime: { - isStarted: runtime.isStarted(), - modules: modules, version: runtime.settings.version, + isStarted: runtime.isStarted(), + flows: { + state: runtime.flows && runtime.flows.state(), + started: runtime.flows && runtime.flows.started, + }, + modules: modules, settings: { available: runtime.settings.available(), apiMaxLength: runtime.settings.apiMaxLength || "UNSET", From a4d66622a5130728e5391e0478db8fa6746e4d45 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 09:30:49 +0100 Subject: [PATCH 012/108] add a handful of missing settings to basic report --- .../node_modules/@node-red/runtime/lib/api/diagnostics.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js index 443751ecc..b0debf96e 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js +++ b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js @@ -118,6 +118,11 @@ function buildDiagnosticReport(scope, callback) { flowFile: runtime.settings.flowFile || "UNSET", mqttReconnectTime: runtime.settings.mqttReconnectTime || "UNSET", serialReconnectTime: runtime.settings.serialReconnectTime || "UNSET", + socketReconnectTime: runtime.settings.socketReconnectTime || "UNSET", + socketTimeout: runtime.settings.socketTimeout || "UNSET", + tcpMsgQueueSize: runtime.settings.tcpMsgQueueSize || "UNSET", + inboundWebSocketTimeout: runtime.settings.inboundWebSocketTimeout || "UNSET", + runtimeState: runtime.settings.runtimeState || "UNSET", adminAuth: runtime.settings.adminAuth ? "SET" : "UNSET", @@ -135,6 +140,7 @@ function buildDiagnosticReport(scope, callback) { uiHost: runtime.settings.uiHost ? "SET" : "UNSET", uiPort: runtime.settings.uiPort ? "SET" : "UNSET", userDir: runtime.settings.userDir ? "SET" : "UNSET", + nodesDir: runtime.settings.nodesDir && runtime.settings.nodesDir.length ? "SET" : "UNSET", } } } From bcd31610f69c81edf6e2abc5cb625457964eae25 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 10:07:40 +0100 Subject: [PATCH 013/108] update tests for sys info diagnostics ammendments --- .../runtime/lib/api/diagnostics_spec.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js b/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js index 07e499344..136e4826c 100644 --- a/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js +++ b/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js @@ -33,6 +33,11 @@ describe("runtime-api/diagnostics", function() { flowFile: "flows.json", mqttReconnectTime: 321, serialReconnectTime: 432, + socketReconnectTime: 2222, + socketTimeout: 3333, + tcpMsgQueueSize: 4444, + inboundWebSocketTimeout: 5555, + runtimeState: {enabled: true, ui: false}, adminAuth: {},//should be sanitised to "SET" httpAdminRoot: "/admin/root/", httpAdminCors: {},//should be sanitised to "SET" @@ -45,6 +50,7 @@ describe("runtime-api/diagnostics", function() { uiHost: "something.secret.com",//should be sanitised to "SET" uiPort: 1337,//should be sanitised to "SET" userDir: "/var/super/secret/",//should be sanitised to "SET", + nodesDir: "/var/super/secret/",//should be sanitised to "SET", contextStorage: { default : { module: "memory" }, file: { module: "localfilesystem" }, @@ -73,8 +79,9 @@ describe("runtime-api/diagnostics", function() { //result.runtime.xxxxx const runtimeCount = Object.keys(result.runtime).length; - runtimeCount.should.eql(4);//ensure no more than 4 keys are present in runtime + runtimeCount.should.eql(5);//ensure 5 keys are present in runtime result.runtime.should.have.property('isStarted',true) + result.runtime.should.have.property('flows') result.runtime.should.have.property('modules').type("object"); result.runtime.should.have.property('settings').type("object"); result.runtime.should.have.property('version','7.7.7'); @@ -87,7 +94,7 @@ describe("runtime-api/diagnostics", function() { //result.runtime.settings.xxxxx const settingsCount = Object.keys(result.runtime.settings).length; - settingsCount.should.eql(21);//ensure no more than the 21 settings listed below are present in the settings object + settingsCount.should.eql(27);//ensure no more than the 21 settings listed below are present in the settings object result.runtime.settings.should.have.property('available',true); result.runtime.settings.should.have.property('apiMaxLength', "UNSET");//deliberately disabled to ensure UNSET is returned result.runtime.settings.should.have.property('debugMaxLength', 1111); @@ -96,6 +103,11 @@ describe("runtime-api/diagnostics", function() { result.runtime.settings.should.have.property('flowFile', "flows.json"); result.runtime.settings.should.have.property('mqttReconnectTime', 321); result.runtime.settings.should.have.property('serialReconnectTime', 432); + result.runtime.settings.should.have.property('socketReconnectTime', 2222); + result.runtime.settings.should.have.property('socketTimeout', 3333); + result.runtime.settings.should.have.property('tcpMsgQueueSize', 4444); + result.runtime.settings.should.have.property('inboundWebSocketTimeout', 5555); + result.runtime.settings.should.have.property('runtimeState', {enabled: true, ui: false}); result.runtime.settings.should.have.property("adminAuth", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property("httpAdminCors", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property('httpAdminRoot', "/admin/root/"); @@ -109,6 +121,7 @@ describe("runtime-api/diagnostics", function() { result.runtime.settings.should.have.property("uiPort", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property("userDir", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property('contextStorage').type("object"); + result.runtime.settings.should.have.property('nodesDir', "SET") //result.runtime.settings.contextStorage.xxxxx const contextCount = Object.keys(result.runtime.settings.contextStorage).length; From bc7852c1cc0889ec9f4686d0efca00592a99a0d0 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 14:44:29 +0100 Subject: [PATCH 014/108] Allow codeEditor theme to be set missing from settings.js --- .../node_modules/@node-red/editor-api/lib/editor/theme.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 7be8868d3..c21a7e6e7 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -327,9 +327,8 @@ module.exports = { themeContext.header.url = themePlugin.header.url || themeContext.header.url } } - if(theme.codeEditor) { - theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); - } + theme.codeEditor = theme.codeEditor || {} + theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); } activeThemeInitialised = true; } From da65bf7292428fe8d9b64bd2bfe2260ec8aa045a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 22 Jul 2022 09:50:37 +0100 Subject: [PATCH 015/108] Update changelog and bump for 3.0.1 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- .../node_modules/@node-red/registry/package.json | 4 ++-- .../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, 31 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c6f52aeb..a6a9016d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +#### 3.0.1: Maintenance Release + +Editor + + - Allow codeEditor theme to be set even if `codeEditor` is not set in settings.js (#3794) @Steve-Mcl + - Sys info (diagnostics report) amendments (#3793) @Steve-Mcl + - Allow `mode` and `title` to be omitted in `options` argument for `createEditor` (#3791) @Steve-Mcl + - Fix focus issues (#3789) @Steve-Mcl + - Ensure all typedInput buttons have button type set (#3788) @knolleary + - Do not flag hasUsers=false nodes as unused in search (#3787) @knolleary + - Properly position quick-add dialog in all cases (#3786) @knolleary + - Ensure quick-add dialog does not obscure ghost node when shifted (#3785) @knolleary + - Remove use of Object.hasOwn (#3784) @knolleary + #### 3.0.0: Milestone Release Editor diff --git a/package.json b/package.json index 8b64aa743..d5ab3bf5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.0", + "version": "3.0.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 fd2f7d469..e95604bab 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": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "3.0.0", - "@node-red/editor-client": "3.0.0", + "@node-red/util": "3.0.1", + "@node-red/editor-client": "3.0.1", "bcryptjs": "2.4.3", "body-parser": "1.20.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 a72fedc96..a06359c0c 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": "3.0.0", + "version": "3.0.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 ff0161f86..c7a31fa10 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": "3.0.0", + "version": "3.0.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 f9ab44be8..c8c582ebe 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": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "3.0.0", + "@node-red/util": "3.0.1", "clone": "2.1.2", "fs-extra": "10.1.0", "semver": "7.3.7", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index f33cb5175..8b1991a5c 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": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "3.0.0", - "@node-red/util": "3.0.0", + "@node-red/registry": "3.0.1", + "@node-red/util": "3.0.1", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.18.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 9ce885200..8d677e2cd 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": "3.0.0", + "version": "3.0.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 dfd98f6fb..faa98c48d 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": "3.0.0", + "version": "3.0.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": "3.0.0", - "@node-red/runtime": "3.0.0", - "@node-red/util": "3.0.0", - "@node-red/nodes": "3.0.0", + "@node-red/editor-api": "3.0.1", + "@node-red/runtime": "3.0.1", + "@node-red/util": "3.0.1", + "@node-red/nodes": "3.0.1", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.18.1", From 4fb40f9077d687cde6231b7439e708758a533d92 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 23 Jul 2022 21:39:07 +0900 Subject: [PATCH 016/108] Support color reset to the default in subflow --- .../@node-red/editor-client/src/js/ui/editors/colorPicker.js | 3 +++ .../editor-client/src/js/ui/editors/panes/appearance.js | 1 + .../node_modules/@node-red/editor-client/src/js/ui/group.js | 3 +++ 3 files changed, 7 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js index 4b2e19e5c..5b76d020b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js @@ -76,6 +76,9 @@ RED.editor.colorPicker = RED.colorPicker = (function() { var focusTarget = colorInput; colorInput.on("change", function (e) { var color = colorInput.val(); + if (options.defaultValue && !color.match(/^([a-z]+|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3})$/)) { + color = options.defaultValue; + } colorHiddenInput.val(color).trigger('change'); refreshDisplay(color); }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js index 912fa3528..e1e6b2ba3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js @@ -235,6 +235,7 @@ RED.editor.colorPicker.create({ id: "red-ui-editor-node-color", value: color, + defaultValue: "#DDAA99", palette: recommendedColors, sortPalette: function (a, b) {return a.l - b.l;} }).appendTo(colorRow); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js index add6da6c9..a35098e52 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js @@ -101,6 +101,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-stroke", value: style.stroke || defaultGroupStyle.stroke || "#a4a4a4", + defaultValue: "#a4a4a4", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, @@ -112,6 +113,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-fill", value: style.fill || defaultGroupStyle.fill ||"none", + defaultValue: "none", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, @@ -129,6 +131,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-color", value: style.color || defaultGroupStyle.color ||"#a4a4a4", + defaultValue: "#a4a4a4", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, From b50ba3e0e44c34034cb73603a4a9f81c152062d6 Mon Sep 17 00:00:00 2001 From: Dennis Neufeld Date: Sat, 23 Jul 2022 18:53:39 +0200 Subject: [PATCH 017/108] Update german translation --- .../editor-client/locales/de/editor.json | 77 +++++++++++-------- .../@node-red/runtime/locales/de/runtime.json | 32 ++++---- 2 files changed, 60 insertions(+), 49 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 41fe1459a..36bf537de 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -105,7 +105,7 @@ "search": "Flows durchsuchen", "searchInput": "Flows durchsuchen", "subflows": "Subflow", - "createSubflow": "Subflow", + "createSubflow": "Subflow hinzufügen", "selectionToSubflow": "Auswahl in Subflow umwandeln", "flows": "Flow", "add": "Hinzufügen", @@ -152,7 +152,8 @@ "zoom-in": "Vergrößern", "search-flows": "Flows durchsuchen", "search-prev": "Vorherige", - "search-next": "Nächste" + "search-next": "Nächste", + "search-counter": "\"__term__\" __result__ von __count__" }, "user": { "loggedInAs": "Angemeldet als __name__", @@ -168,7 +169,11 @@ } }, "notification": { - "warning": "Warnung: __message__", + "state": { + "flowsStopped": "Flows gestoppt", + "flowsStarted": "Flows gestartet" + }, + "warning": "Warnung: __message__", "warnings": { "undeployedChanges": "Node hat nicht übernommene (deploy) Änderungen", "nodeActionDisabled": "Node-Aktionen deaktiviert", @@ -177,15 +182,15 @@ "missing-modules": "

Flows angehalten aufgrund fehlender Module

", "safe-mode": "

Flows sind im abgesicherten Modus gestoppt.

Flows können bearbeitet und übernommen (deploy) werden, um sie neu zu starten.

", "restartRequired": "Node-RED muss neu gestartet werden, damit die Module nach Upgrade aktiviert werden", - "credentials_load_failed": "

Flows gestoppt, da die Berechtigungen nicht entschlüsselt werden konnten.

Die Datei mit dem Flow-Berechtigungen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", - "credentials_load_failed_reset": "

Die Berechtigungen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Berechtigungen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Berechtigungen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Berechtigungen werden gelöscht.

", + "credentials_load_failed": "

Flows gestoppt, da die Anmeldeinformationen nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", + "credentials_load_failed_reset": "

Die Anmeldeinformationen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Anmeldeinformationen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Anmeldeinformationen werden gelöscht.

", "missing_flow_file": "

Die Flow-Datei des Projekts wurde nicht gefunden.

Das Projekt ist nicht mit einer Flow-Datei konfiguriert.

", "missing_package_file": "

Die Paket-Datei des Projekts wurde nicht gefunden.

In dem Projekt fehlt die 'package.json'-Datei.

", "project_empty": "

Das Projekt ist leer.

Soll ein Standardsatz an Projektdateien erstellen werden?
Andernfalls müssen die Dateien manuell außerhalb des Editors dem Projekt hinzugefügt werden.

", "project_not_found": "

Das Projekt '__project__' wurde nicht gefunden.

", "git_merge_conflict": "

Der automatische Merge der Änderungen ist fehlgeschlagen.

Die Merge-Konflikte müssen behoben und die Ergebnisse ins Repository übertragen werden (commit).

" }, - "error": "Fehler: __message__", + "error": "Fehler: __message__", "errors": { "lostConnection": "Verbindung zum Server verloren. Verbindung wird erneut hergestellt ...", "lostConnectionReconnect": "Verbindung zum Server verloren. Wiederherstellung der Verbindung in __time__s.", @@ -203,7 +208,7 @@ "pull": "Projekt '__project__' erneut geladen", "revert": "Änderungen im Projekt '__project__' rückgängig gemacht", "merge-complete": "Git-Merge abgeschlossen", - "setupCredentials": "Berechtigungen einrichten", + "setupCredentials": "Anmeldeinformationen einrichten", "setupProjectFiles": "Projektdateien einrichten", "no": "Nein, Danke", "createDefault": "Standardprojektdateien erstellen", @@ -211,7 +216,7 @@ }, "label": { "manage-project-dep": "Projektabhängigkeiten verwalten", - "setup-cred": "Berechtigungen einrichten", + "setup-cred": "Anmeldeinformationen einrichten", "setup-project": "Projektdateien einrichten", "create-default-package": "Standardpaketdatei erstellen", "no-thanks": "Nein, Danke", @@ -295,6 +300,10 @@ "modifiedFlowsDesc": "Übernimmt nur Flows, die geänderte Nodes enthalten", "modifiedNodes": "Geänderte Nodes", "modifiedNodesDesc": "Übernimmt nur Nodes, die sich geändert haben", + "startFlows": "Start", + "startFlowsDesc": "Flows starten", + "stopFlows": "Stop", + "stopFlowsDesc": "Flows stoppen", "restartFlows": "Flows neustarten", "restartFlowsDesc": "Startet die aktuell übernommenen Flows (ohne vorheriges Deploy)", "successfulDeploy": "Erfolgreich übernommen (deploy)", @@ -376,7 +385,7 @@ "confirmDelete": "Sind Sie sicher mit dem Löschen dieses Subflows?", "info": "Beschreibung", "category": "Kategorie", - "module": "Module", + "module": "Modul", "license": "Lizenz", "licenseNone": "Keine", "licenseOther": "Andere", @@ -434,7 +443,7 @@ "icon": "Icon", "inputType": "Eingangstyp", "selectType": "Wähle Typen ...", - "loadCredentials": "Lade Node-Berechtigungen", + "loadCredentials": "Lade Node-Anmeldeinformationen", "inputs": { "input": "Eingang", "select": "Auswahl", @@ -450,7 +459,7 @@ "json": "JSON", "bin": "buffer", "env": "Umgebungsvariable", - "cred": "Berechtigung" + "cred": "Anmeldeinformation" }, "menu": { "input": "Eingang", @@ -470,7 +479,7 @@ "errors": { "scopeChange": "Wenn Sie den Geltungsbereich (scope) ändern, wird er für Nodes in anderen Flows nicht verfügbar sein", "invalidProperties": "Ungültige Eigenschaften:", - "credentialLoadFailed": "Laden der Node-Berechtigungen fehlgeschlagen" + "credentialLoadFailed": "Laden der Node-Anmeldeinformationen fehlgeschlagen" } }, "keyboard": { @@ -683,7 +692,8 @@ "showHelp": "Hilfe zeigen", "showInOutline": "Zeige im Editor", "showTopics": "Zeige Hilfethemen", - "noHelp": "Kein Hilfethema ausgewählt" + "noHelp": "Kein Hilfethema ausgewählt", + "changeLog": "Änderungsprotokoll" }, "config": { "name": "Konfigurations-Node", @@ -737,7 +747,7 @@ "addToProject": "Zu Projekt hinzufügen", "files": "Dateien", "flow": "Flow", - "credentials": "Berechtigungen", + "credentials": "Anmeldeinformationen", "package": "Paket", "packageCreate": "Datei wird erstellt beim Speichern der Änderungen", "fileNotExist": "Datei existiert nicht", @@ -750,7 +760,7 @@ "changeTheEncryptionKey": "Schlüssel ändern", "currentKey": "Aktueller Schlüssel", "newKey": "Neuer Schlüssel", - "credentialsAlert": "Dadurch werden alle vorhandenen Berechtigungen gelöscht", + "credentialsAlert": "Dadurch werden alle vorhandenen Anmeldeinformationen gelöscht", "versionControl": "Versionsverwaltung (Git)", "branches": "Branches", "noBranches": "Keine Branches", @@ -886,7 +896,7 @@ "date": "timestamp", "jsonata": "JSONata", "env": "Umgebungsvariable", - "cred": "Berechtigung" + "cred": "Anmeldeinformation" } }, "editableList": { @@ -1026,7 +1036,7 @@ "passphrase": "Passphrase", "ssh-key-desc": "Bevor Sie ein Repository über SSH lokal klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zugreifen zu können", "ssh-key-add": "SSH-Schlüssel hinzufügen", - "credential-key": "Schlüssel für Berechtigungen", + "credential-key": "Schlüssel für Anmeldeinformationen", "cant-get-ssh-key": "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden", "already-exists2": "bereits vorhanden", "git-error": "Git-Fehler", @@ -1038,27 +1048,27 @@ "create": "Erstellen Sie Ihre Projektdateien", "desc0": "Ein Projekt enthält Ihre Flow-Dateien, eine README-Datei und die 'package.json'-Datei.", "desc1": "Es kann alle anderen Dateien enthalten, die im Git-Repository verwaltet werden sollen.", - "desc2": "Ihre vorhandenen Flow- und Berechtigungs-Dateien werden in das Projekt kopiert.", + "desc2": "Ihre vorhandenen Flow- und Anmeldeinformations-Dateien werden in das Projekt kopiert.", "flow-file": "Flow-Datei", - "credentials-file": "Datei mit Berechtigungen" + "credentials-file": "Datei mit Anmeldeinformationen" }, "encryption-config": { - "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Berechtigungen", - "desc0": "Die Datei mit den Flow-Berechtigungen kann verschlüsselt werden, um ihren Inhalt zu schützen.", - "desc1": "Wenn Sie diese Berechtigungen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", - "desc2": "Die Datei mit den Flow-Berechtigungen ist derzeit nicht verschlüsselt.", + "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Anmeldeinformationen", + "desc0": "Die Datei mit den Flow-Anmeldeinformationen kann verschlüsselt werden, um ihren Inhalt zu schützen.", + "desc1": "Wenn Sie diese Anmeldeinformationen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", + "desc2": "Die Datei mit den Flow-Anmeldeinformationen ist derzeit nicht verschlüsselt.", "desc3": "D.h. ihr Inhalt (z.B. Passwörter und Zugriffs-Tokens) kann von jedem mit Zugriff auf die Datei gelesen werden.", - "desc4": "Wenn Sie diese Berechtigungen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", - "desc5": "Ihre Datei mit den Flow-Berechtigungen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", - "desc6": "Die Datei mit den Flow-Berechtigungen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", + "desc4": "Wenn Sie diese Anmeldeinformationen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", + "desc5": "Ihre Datei mit den Flow-Anmeldeinformationen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", + "desc6": "Die Datei mit den Flow-Anmeldeinformationen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", "desc7": "Der Schlüssel wird separat von den Projektdateien gespeichert. Sie müssen den Schlüssel angeben, damit dieses Projekt auch in einem anderen Node-RED-System verwendet werden kann.", - "credentials": "Berechtigung", + "credentials": "Anmeldeinformationen", "enable": "Verschlüsselung aktivieren", "disable": "Verschlüsselung deaktivieren", "disabled": "deaktiviert", "copy": "Vorhandenen Schlüssel ersetzen", "use-custom": "Eigenen Schlüssel verwenden", - "desc8": "Die Datei mit den Berechtigungen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden", + "desc8": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "create-project-files": "Projektdateien erstellen", "create-project": "Projekt erstellen", "already-exists": "bereits vorhanden", @@ -1083,12 +1093,12 @@ "desc": "Beschreibung", "opt": "Optional", "flow-file": "Flow-Datei", - "credentials": "Berechtigungen", + "credentials": "Anmeldeinformationen", "enable-encryption": "Verschlüsselung aktivieren", "disable-encryption": "Verschlüsselung deaktivieren", "encryption-key": "Schlüssel", - "desc0": "Eine Floskel, mit der Sie Ihre Berechtigungen schützen", - "desc1": "Die Datei mit den Berechtigungen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden", + "desc0": "Eine Ausdruck, mit der Sie Ihre Anmeldeinformationen schützen", + "desc1": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "git-url": "Git-Repository-URL", "protocols": "https://, ssh:// oder file://", "auth-failed": "Authentifizierung fehlgeschlagen", @@ -1098,7 +1108,7 @@ "passphrase": "Passphrase", "desc2": "Bevor Sie ein Repository über SSH klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen", "add-ssh-key": "Einen SSH-Schlüssel hinzufügen", - "credentials-encryption-key": "Schlüssel für Berechtigungen", + "credentials-encryption-key": "Schlüssel für Anmeldeinformationen", "already-exists-2": "bereits vorhanden", "git-error": "Git-Fehler", "con-failed": "Verbindung fehlgeschlagen", @@ -1156,7 +1166,8 @@ "tourGuide": { "takeATour": "Tour starten", "start": "Start", - "next": "Nächste" + "next": "Nächste", + "welcomeTours": "Willkommens-Touren" }, "diagnostics": { "title": "System-Informationen" diff --git a/packages/node_modules/@node-red/runtime/locales/de/runtime.json b/packages/node_modules/@node-red/runtime/locales/de/runtime.json index 6811ba86a..99800c628 100755 --- a/packages/node_modules/@node-red/runtime/locales/de/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/de/runtime.json @@ -1,6 +1,6 @@ { "runtime": { - "welcome": "Willkommen bei Node-RED!", + "welcome": "Willkommen bei Node-RED", "version": "__component__ Version: __version__", "unsupported_version": "Nicht unterstützte Version von __component__. Erforderlich: __requires__, jedoch gefunden: __version__", "paths": { @@ -8,7 +8,6 @@ "httpStatic": "HTTP-Statisch: __path__" } }, - "server": { "loading": "Paletten-Nodes werden geladen", "palette-editor": { @@ -34,17 +33,19 @@ "install-failed-not-found": "Das Modul $t(server.install.install-failed-long) wurde nicht gefunden", "install-failed-name": "$t(server.install.install-failed-long). Ungültiger Modulname: __name__", "install-failed-url": "$t(server.install.install-failed-long). Ungültige URL: __url__", + "post-install-error": "Fehler bei der Ausführung des 'postInstall'-Hooks:", "upgrading": "Upgrade von Modul __name__ auf Version __version__ gestartet", "upgraded": "Upgrade von Modul __name__ war erfolgreich. Neustart von Node-RED für die Verwendung der neuen Version erforderlich.", "upgrade-failed-not-found": "Upgrade fehlgeschlagen. $t(server.install.install-failed-long). Version nicht gefunden.", "uninstalling": "Das Modul __name__ wird deinstalliert", "uninstall-failed": "Deinstallation fehlgeschlagen", "uninstall-failed-long": "Die Deinstallation des Moduls __name__ ist fehlgeschlagen:", - "uninstalled": "Das Modul __name__ ist deinstalliert" + "uninstalled": "Das Modul __name__ ist deinstalliert", + "old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nNode-RED 1.3 Verzeichnis externer Module erkannt:\n __oldDir__\nDieses Verzeichnis wird nicht mehr verwendet. Die externen Module werden\nin Ihrem Node-RED-Benutzerverzeichnis neu installiert:\n __newDir__\nLöschen Sie das alte externalModules-Verzeichnis, um diese Meldung abzustellen.\n---------------------------------------------------------------------\n" }, "deprecatedOption": "Die Verwendung von __old__ ist abgekündigt. Stattdessen __new__ verwenden.", "unable-to-listen": "Überwachen (listen) von __listenpath__ nicht möglich", - "port-in-use": "FEHLER: Port wird verwendet", + "port-in-use": "Fehler: Port wird verwendet", "uncaught-exception": "Nicht abgefangene Ausnahmebedingung:", "admin-ui-disabled": "Administrator-Benutzeroberfläche deaktiv", "now-running": "Server wird jetzt auf __listenpath__ ausgeführt", @@ -55,11 +56,10 @@ "refresh-interval": "Erneuerung der https-Einstellungen erfolgt alle __interval__ Stunden", "settings-refreshed": "https-Einstellungen wurden erneuert", "refresh-failed": "Erneuerung der https-Einstellungen fehlgeschlagen: __message__", - "nodejs-version": "httpsRefreshInterval erfordert Node.js 11 or later", + "nodejs-version": "httpsRefreshInterval erfordert Node.js 11 oder höher", "function-required": "httpsRefreshInterval erfordert die https-Eigenschaft in Form einer Funktion" } }, - "api": { "flows": { "error-save": "Fehler beim Speichern der Flows: __message__", @@ -77,17 +77,16 @@ "error-enable": "Der Node konnte nicht aktiviert werden:" } }, - "comms": { "error": "Kommunikationskanal-Fehler: __message__", "error-server": "Kommunikationsserver-Fehler: __message__", "error-send": "Kommunikationsende-Fehler: __message__" }, - "settings": { "user-not-available": "Einstellungen konnten nicht gespeichert werden: __message__", "not-available": "Einstellungen nicht verfügbar", - "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt" + "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt", + "readonly-mode": "Laufzeitumgebung im Nur-Lese-Modus. Änderungen werden nicht gespeichert." }, "library": { "unknownLibrary": "Unbekannte Bibliothek (Library): __library__", @@ -98,10 +97,12 @@ }, "nodes": { "credentials": { - "error": "Fehler beim Laden der Berechtigungen: __message__", - "error-saving": "Fehler beim Speichern der Berechtigungen: __message__", - "not-registered": "Der Berechtigung-Typ '__type__' ist nicht registriert", - "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Berechtigungen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Berechtigungen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nBerechtigungen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Berechtigungen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------" + "error": "Fehler beim Laden der Anmeldeinformationen: __message__", + "error-saving": "Fehler beim Speichern der Anmeldeinformationen: __message__", + "not-registered": "Der Anmeldeinformations-Typ '__type__' ist nicht registriert", + "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Anmeldeinformationen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Anmeldeinformationen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nAnmeldeinformationen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Anmeldeinformationen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", + "unencrypted": "Verwende unverschlüsselte Anmeldeinformationen", + "encryptedNotFound": "Verschlüsselte Anmeldeinformationen nicht gefunden" }, "flows": { "safe-mode": "Die Flows sind gestoppt im abgesicherten Modus. Übernahme (deploy) zum Starten.", @@ -121,6 +122,7 @@ "stopped-flows": "Flows sind gestoppt", "stopped": "gestoppt", "stopping-error": "Fehler beim Stoppen des Nodes: __message__", + "updated-flows": "Flows aktualisiert", "added-flow": "Flow wird hinzugefügt: __label__", "updated-flow": "Aktualisierter Flow: __label__", "removed-flow": "Entfernter Flow: __label__", @@ -145,7 +147,6 @@ } } }, - "storage": { "index": { "forbidden-flow-name": "Unzulässiger Flow-Name" @@ -159,6 +160,7 @@ "restore": "Die '__type__'-Dateisicherung wird wiederhergestellt: __path__", "restore-fail": "Die Wiederherstellung der '__type__'-Dateisicherung ist fehlgeschlagen: __message__", "fsync-fail": "Die Übertragung der Datei __path__ auf das Laufwerk ist fehlgeschlagen: __message__", + "warn_name": "Flows Dateiname nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", "projects": { "changing-project": "Aktives Projekt wird festgelegt: __project__", "active-project": "Aktives Projekt: __project__", @@ -174,7 +176,6 @@ } } }, - "context": { "log-store-init": "Kontextspeicher: __name__ [__info__]", "error-loading-module": "Fehler beim Laden des Kontextspeichers: __message__", @@ -189,5 +190,4 @@ "error-write": "Fehler beim Schreiben des Kontextes: __message__" } } - } From fe5132be1dad0eced29995fba7091b376a8a1139 Mon Sep 17 00:00:00 2001 From: Dennis Neufeld Date: Sun, 24 Jul 2022 16:31:01 +0200 Subject: [PATCH 018/108] Update german translation 2 --- .../editor-client/locales/de/editor.json | 56 +++++++++---------- .../@node-red/runtime/locales/de/runtime.json | 16 +++--- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 36bf537de..93a2f5946 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -105,7 +105,7 @@ "search": "Flows durchsuchen", "searchInput": "Flows durchsuchen", "subflows": "Subflow", - "createSubflow": "Subflow hinzufügen", + "createSubflow": "Hinzufügen", "selectionToSubflow": "Auswahl in Subflow umwandeln", "flows": "Flow", "add": "Hinzufügen", @@ -182,8 +182,8 @@ "missing-modules": "

Flows angehalten aufgrund fehlender Module

", "safe-mode": "

Flows sind im abgesicherten Modus gestoppt.

Flows können bearbeitet und übernommen (deploy) werden, um sie neu zu starten.

", "restartRequired": "Node-RED muss neu gestartet werden, damit die Module nach Upgrade aktiviert werden", - "credentials_load_failed": "

Flows gestoppt, da die Anmeldeinformationen nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", - "credentials_load_failed_reset": "

Die Anmeldeinformationen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Anmeldeinformationen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Anmeldeinformationen werden gelöscht.

", + "credentials_load_failed": "

Flows gestoppt, da die Credentials nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Credentials ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", + "credentials_load_failed_reset": "

Die Credentials konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Credentials ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Credentials wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Credentials werden gelöscht.

", "missing_flow_file": "

Die Flow-Datei des Projekts wurde nicht gefunden.

Das Projekt ist nicht mit einer Flow-Datei konfiguriert.

", "missing_package_file": "

Die Paket-Datei des Projekts wurde nicht gefunden.

In dem Projekt fehlt die 'package.json'-Datei.

", "project_empty": "

Das Projekt ist leer.

Soll ein Standardsatz an Projektdateien erstellen werden?
Andernfalls müssen die Dateien manuell außerhalb des Editors dem Projekt hinzugefügt werden.

", @@ -208,7 +208,7 @@ "pull": "Projekt '__project__' erneut geladen", "revert": "Änderungen im Projekt '__project__' rückgängig gemacht", "merge-complete": "Git-Merge abgeschlossen", - "setupCredentials": "Anmeldeinformationen einrichten", + "setupCredentials": "Credentials einrichten", "setupProjectFiles": "Projektdateien einrichten", "no": "Nein, Danke", "createDefault": "Standardprojektdateien erstellen", @@ -216,7 +216,7 @@ }, "label": { "manage-project-dep": "Projektabhängigkeiten verwalten", - "setup-cred": "Anmeldeinformationen einrichten", + "setup-cred": "Credentials einrichten", "setup-project": "Projektdateien einrichten", "create-default-package": "Standardpaketdatei erstellen", "no-thanks": "Nein, Danke", @@ -443,7 +443,7 @@ "icon": "Icon", "inputType": "Eingangstyp", "selectType": "Wähle Typen ...", - "loadCredentials": "Lade Node-Anmeldeinformationen", + "loadCredentials": "Lade Node-Credentials", "inputs": { "input": "Eingang", "select": "Auswahl", @@ -459,7 +459,7 @@ "json": "JSON", "bin": "buffer", "env": "Umgebungsvariable", - "cred": "Anmeldeinformation" + "cred": "Credentials" }, "menu": { "input": "Eingang", @@ -479,7 +479,7 @@ "errors": { "scopeChange": "Wenn Sie den Geltungsbereich (scope) ändern, wird er für Nodes in anderen Flows nicht verfügbar sein", "invalidProperties": "Ungültige Eigenschaften:", - "credentialLoadFailed": "Laden der Node-Anmeldeinformationen fehlgeschlagen" + "credentialLoadFailed": "Laden der Node-Credentials fehlgeschlagen" } }, "keyboard": { @@ -747,7 +747,7 @@ "addToProject": "Zu Projekt hinzufügen", "files": "Dateien", "flow": "Flow", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "package": "Paket", "packageCreate": "Datei wird erstellt beim Speichern der Änderungen", "fileNotExist": "Datei existiert nicht", @@ -760,7 +760,7 @@ "changeTheEncryptionKey": "Schlüssel ändern", "currentKey": "Aktueller Schlüssel", "newKey": "Neuer Schlüssel", - "credentialsAlert": "Dadurch werden alle vorhandenen Anmeldeinformationen gelöscht", + "credentialsAlert": "Dadurch werden alle vorhandenen Credentials gelöscht", "versionControl": "Versionsverwaltung (Git)", "branches": "Branches", "noBranches": "Keine Branches", @@ -896,7 +896,7 @@ "date": "timestamp", "jsonata": "JSONata", "env": "Umgebungsvariable", - "cred": "Anmeldeinformation" + "cred": "Credentials" } }, "editableList": { @@ -1036,7 +1036,7 @@ "passphrase": "Passphrase", "ssh-key-desc": "Bevor Sie ein Repository über SSH lokal klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zugreifen zu können", "ssh-key-add": "SSH-Schlüssel hinzufügen", - "credential-key": "Schlüssel für Anmeldeinformationen", + "credential-key": "Schlüssel für Credentials", "cant-get-ssh-key": "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden", "already-exists2": "bereits vorhanden", "git-error": "Git-Fehler", @@ -1048,27 +1048,27 @@ "create": "Erstellen Sie Ihre Projektdateien", "desc0": "Ein Projekt enthält Ihre Flow-Dateien, eine README-Datei und die 'package.json'-Datei.", "desc1": "Es kann alle anderen Dateien enthalten, die im Git-Repository verwaltet werden sollen.", - "desc2": "Ihre vorhandenen Flow- und Anmeldeinformations-Dateien werden in das Projekt kopiert.", + "desc2": "Ihre vorhandenen Flow- und Credential-Dateien werden in das Projekt kopiert.", "flow-file": "Flow-Datei", - "credentials-file": "Datei mit Anmeldeinformationen" + "credentials-file": "Datei mit Credentials" }, "encryption-config": { - "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Anmeldeinformationen", - "desc0": "Die Datei mit den Flow-Anmeldeinformationen kann verschlüsselt werden, um ihren Inhalt zu schützen.", - "desc1": "Wenn Sie diese Anmeldeinformationen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", - "desc2": "Die Datei mit den Flow-Anmeldeinformationen ist derzeit nicht verschlüsselt.", + "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Credentials", + "desc0": "Die Datei mit den Flow-Credentials kann verschlüsselt werden, um ihren Inhalt zu schützen.", + "desc1": "Wenn Sie diese Credentials in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", + "desc2": "Die Datei mit den Flow-Credentials ist derzeit nicht verschlüsselt.", "desc3": "D.h. ihr Inhalt (z.B. Passwörter und Zugriffs-Tokens) kann von jedem mit Zugriff auf die Datei gelesen werden.", - "desc4": "Wenn Sie diese Anmeldeinformationen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", - "desc5": "Ihre Datei mit den Flow-Anmeldeinformationen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", - "desc6": "Die Datei mit den Flow-Anmeldeinformationen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", + "desc4": "Wenn Sie diese Credentials in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", + "desc5": "Ihre Datei mit den Flow-Credentials wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", + "desc6": "Die Datei mit den Flow-Credentials wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", "desc7": "Der Schlüssel wird separat von den Projektdateien gespeichert. Sie müssen den Schlüssel angeben, damit dieses Projekt auch in einem anderen Node-RED-System verwendet werden kann.", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "enable": "Verschlüsselung aktivieren", "disable": "Verschlüsselung deaktivieren", "disabled": "deaktiviert", "copy": "Vorhandenen Schlüssel ersetzen", "use-custom": "Eigenen Schlüssel verwenden", - "desc8": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", + "desc8": "Die Datei mit den Credentials wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "create-project-files": "Projektdateien erstellen", "create-project": "Projekt erstellen", "already-exists": "bereits vorhanden", @@ -1093,12 +1093,12 @@ "desc": "Beschreibung", "opt": "Optional", "flow-file": "Flow-Datei", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "enable-encryption": "Verschlüsselung aktivieren", "disable-encryption": "Verschlüsselung deaktivieren", "encryption-key": "Schlüssel", - "desc0": "Eine Ausdruck, mit der Sie Ihre Anmeldeinformationen schützen", - "desc1": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", + "desc0": "Eine Ausdruck, mit der Sie Ihre Credentials schützen", + "desc1": "Die Datei mit den Credentials wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "git-url": "Git-Repository-URL", "protocols": "https://, ssh:// oder file://", "auth-failed": "Authentifizierung fehlgeschlagen", @@ -1108,7 +1108,7 @@ "passphrase": "Passphrase", "desc2": "Bevor Sie ein Repository über SSH klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen", "add-ssh-key": "Einen SSH-Schlüssel hinzufügen", - "credentials-encryption-key": "Schlüssel für Anmeldeinformationen", + "credentials-encryption-key": "Schlüssel für Credentials", "already-exists-2": "bereits vorhanden", "git-error": "Git-Fehler", "con-failed": "Verbindung fehlgeschlagen", @@ -1167,7 +1167,7 @@ "takeATour": "Tour starten", "start": "Start", "next": "Nächste", - "welcomeTours": "Willkommens-Touren" + "welcomeTours": "Welcome Tours" }, "diagnostics": { "title": "System-Informationen" diff --git a/packages/node_modules/@node-red/runtime/locales/de/runtime.json b/packages/node_modules/@node-red/runtime/locales/de/runtime.json index 99800c628..0249d638d 100755 --- a/packages/node_modules/@node-red/runtime/locales/de/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/de/runtime.json @@ -85,7 +85,7 @@ "settings": { "user-not-available": "Einstellungen konnten nicht gespeichert werden: __message__", "not-available": "Einstellungen nicht verfügbar", - "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt", + "property-read-only": "Die Eigenschaft '__prop__' ist schreibgeschützt", "readonly-mode": "Laufzeitumgebung im Nur-Lese-Modus. Änderungen werden nicht gespeichert." }, "library": { @@ -97,12 +97,12 @@ }, "nodes": { "credentials": { - "error": "Fehler beim Laden der Anmeldeinformationen: __message__", - "error-saving": "Fehler beim Speichern der Anmeldeinformationen: __message__", - "not-registered": "Der Anmeldeinformations-Typ '__type__' ist nicht registriert", - "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Anmeldeinformationen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Anmeldeinformationen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nAnmeldeinformationen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Anmeldeinformationen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", - "unencrypted": "Verwende unverschlüsselte Anmeldeinformationen", - "encryptedNotFound": "Verschlüsselte Anmeldeinformationen nicht gefunden" + "error": "Fehler beim Laden der Credentials: __message__", + "error-saving": "Fehler beim Speichern der Credentials: __message__", + "not-registered": "Der Credentials-Typ '__type__' ist nicht registriert", + "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Credentials wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Credentials nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nCredentials müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Credentials\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", + "unencrypted": "Verwende unverschlüsselte Credentials", + "encryptedNotFound": "Verschlüsselte Credentials nicht gefunden" }, "flows": { "safe-mode": "Die Flows sind gestoppt im abgesicherten Modus. Übernahme (deploy) zum Starten.", @@ -160,7 +160,7 @@ "restore": "Die '__type__'-Dateisicherung wird wiederhergestellt: __path__", "restore-fail": "Die Wiederherstellung der '__type__'-Dateisicherung ist fehlgeschlagen: __message__", "fsync-fail": "Die Übertragung der Datei __path__ auf das Laufwerk ist fehlgeschlagen: __message__", - "warn_name": "Flows Dateiname nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", + "warn_name": "Name der Flows-Datei nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", "projects": { "changing-project": "Aktives Projekt wird festgelegt: __project__", "active-project": "Aktives Projekt: __project__", From f454c29b8c37942175ff0f764facf5249a00b9cd Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Thu, 28 Jul 2022 10:56:38 -0400 Subject: [PATCH 019/108] Hide scrollbars until they're needed --- .../@node-red/editor-client/src/js/ui/common/editableList.js | 2 +- .../@node-red/editor-client/src/js/ui/tab-help.js | 2 +- .../@node-red/editor-client/src/js/ui/tab-info.js | 2 +- .../node_modules/@node-red/editor-client/src/sass/debug.scss | 2 +- .../node_modules/@node-red/editor-client/src/sass/editor.scss | 4 ++-- .../@node-red/editor-client/src/sass/projects.scss | 4 ++-- .../@node-red/editor-client/src/sass/tab-context.scss | 2 +- .../@node-red/editor-client/src/sass/userSettings.scss | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index ea1938e5c..f308614d7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -160,7 +160,7 @@ this.element.css("maxHeight",null); } if (this.options.height !== 'auto') { - this.uiContainer.css("overflow-y","scroll"); + this.uiContainer.css("overflow-y","auto"); if (!isNaN(this.options.height)) { this.uiHeight = this.options.height; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js index e5199b5bc..7ed93f48d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js @@ -50,7 +50,7 @@ RED.sidebar.help = (function() { tocPanel = $("
", {class: "red-ui-sidebar-help-toc"}).appendTo(stackContainer); var helpPanel = $("
").css({ - "overflow-y": "scroll" + "overflow-y": "auto" }).appendTo(stackContainer); panels = RED.panels.create({ diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index dfd4b1e43..cc8539363 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -98,7 +98,7 @@ RED.sidebar.info = (function() { propertiesPanelContent = $("
").css({ "flex":"1 1 auto", - "overflow-y":"scroll", + "overflow-y":"auto", }).appendTo(propertiesPanel); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss index 58099877f..eb550c6f5 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss @@ -30,7 +30,7 @@ bottom: 0px; left:0px; right: 0px; - overflow-y: scroll; + overflow-y: auto; } .red-ui-debug-filter-box { position:absolute; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index 1730b9e35..b6d12faf2 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -368,7 +368,7 @@ button.red-ui-button-small border:1px solid var(--red-ui-secondary-border-color); border-radius:5px; height: calc(100% - 21px); - overflow-y: scroll; + overflow-y: auto; background: var(--red-ui-secondary-background); } @@ -562,7 +562,7 @@ div.red-ui-button-small.red-ui-color-picker-opacity-slider-handle { .red-ui-icon-list { width: 308px; height: 200px; - overflow-y: scroll; + overflow-y: auto; line-height: 0px; position: relative; &.red-ui-icon-list-dark { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/projects.scss b/packages/node_modules/@node-red/editor-client/src/sass/projects.scss index ee43c7a87..a32fd53b4 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/projects.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/projects.scss @@ -26,7 +26,7 @@ } } #red-ui-project-settings-tab-settings { - overflow-y: scroll; + overflow-y: auto; } .red-ui-sidebar-vc-shade { background: var(--red-ui-primary-background); @@ -183,7 +183,7 @@ } .red-ui-projects-dialog-project-list-inner-container { flex-grow: 1 ; - overflow-y: scroll; + overflow-y: auto; position:relative; .red-ui-editableList-border { border: none; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss index fc4c78afb..94450f337 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss @@ -20,7 +20,7 @@ bottom: 0; left: 0; right: 0; - overflow-y: scroll; + overflow-y: auto; .red-ui-palette-category { &:not(.expanded) button { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss index 36ab67e3f..5e0c7fa47 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss @@ -67,7 +67,7 @@ left: 0; bottom: 0; padding: 8px 20px 20px; - overflow-y: scroll; + overflow-y: auto; } .red-ui-settings-row { padding: 5px 10px 2px; From 5ea0c6fca1c8bf3bf5ccb5672bfd0b4696878625 Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Fri, 29 Jul 2022 09:49:59 -0400 Subject: [PATCH 020/108] Fix workspace chart bottom property --- .../@node-red/editor-client/src/sass/workspace.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 24e156b1e..a5734570d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -29,7 +29,7 @@ #red-ui-workspace-chart { overflow: auto; position: absolute; - bottom:25px; + bottom:26px; top: 35px; left:0px; right:0px; From 14a33668508d68efa5caf286eb214d96dd3cac05 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 1 Aug 2022 20:54:05 +0100 Subject: [PATCH 021/108] Include junctins/groups when exporting subflows plus related fixes Fixes #3805 --- .../@node-red/editor-client/src/js/nodes.js | 15 ++++++--------- .../@node-red/editor-client/src/js/ui/subflow.js | 8 ++++++++ 2 files changed, 14 insertions(+), 9 deletions(-) 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 9da5aad05..d387f01b3 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 @@ -868,14 +868,7 @@ RED.nodes = (function() { var node; if (allNodes.hasTab(id)) { - removedNodes = allNodes.getNodes(id).filter(n => { - if (n.type === 'junction') { - removedJunctions.push(n) - return false - } else { - return true - } - }) + removedNodes = allNodes.getNodes(id).slice() } for (i in configNodes) { if (configNodes.hasOwnProperty(i)) { @@ -885,6 +878,7 @@ RED.nodes = (function() { } } } + removedJunctions = RED.nodes.junctions(id) for (i=0;i Date: Mon, 1 Aug 2022 21:05:52 +0100 Subject: [PATCH 022/108] Allow generateNodeNames to handle names containing regex control characters Fixes #3813 --- .../@node-red/editor-client/src/js/ui/view-tools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js index bc81d4a43..3588b38bf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js @@ -1015,7 +1015,7 @@ RED.view.tools = (function() { const nodeDef = n._def || RED.nodes.getType(n.type) if (nodeDef && nodeDef.defaults && nodeDef.defaults.name) { const paletteLabel = RED.utils.getPaletteLabel(n.type, nodeDef) - const defaultNodeNameRE = new RegExp('^'+paletteLabel+' (\\d+)$') + const defaultNodeNameRE = new RegExp('^'+paletteLabel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')+' (\\d+)$') if (!typeIndex.hasOwnProperty(n.type)) { const existingNodes = RED.nodes.filterNodes({type: n.type}) let maxNameNumber = 0; From 5c29feec635387dfdbd436da3a4879a33bd266f8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 2 Aug 2022 00:05:21 +0100 Subject: [PATCH 023/108] Register subflow module instance node with parent flow Fixes #3798 --- packages/node_modules/@node-red/runtime/lib/flows/util.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 0f3435b77..7c98fc041 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/util.js @@ -134,10 +134,12 @@ function createNode(flow,config) { subflowInstanceConfig, instanceConfig ); + // Register this subflow as an instance node of the parent flow. + // This allows nodes inside the subflow to get ahold of each other + // such as a node accessing its config node + flow.subflowInstanceNodes[config.id] = subflow subflow.start(); return subflow.node; - - Log.error(Log._("nodes.flow.unknown-type", {type:type})); } } catch(err) { Log.error(err); From b008a6a2aa39e6f355bea887c93328cddb91ce63 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Thu, 4 Aug 2022 11:05:27 +0100 Subject: [PATCH 024/108] remove console.log fixes #3819 --- .../node_modules/@node-red/editor-client/src/js/ui/subflow.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index ca4f651ab..772985101 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -932,7 +932,6 @@ RED.subflow = (function() { function buildEnvUIRow(row, tenv, ui, node) { - console.log(tenv, ui) ui.label = ui.label||{}; if ((tenv.type === "cred" || (tenv.parent && tenv.parent.type === "cred")) && !ui.type) { ui.type = "cred"; From abccdc7f215ccde8a358f7f6aa69ca4567c435b0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Aug 2022 13:10:05 +0100 Subject: [PATCH 025/108] Update packages/node_modules/@node-red/nodes/locales/en-US/messages.json --- .../node_modules/@node-red/nodes/locales/en-US/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index b38ab3026..282485ca2 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -555,7 +555,7 @@ "status": { "requesting": "requesting" }, - "insecureHTTPParser": "Lenient HTTP Header Parsing" + "insecureHTTPParser": "Disable strict HTTP parsing" }, "websocket": { "label": { From c9b0a7c2ddc272eb133907c42b9b68de34aa925a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Aug 2022 13:50:31 +0100 Subject: [PATCH 026/108] Bump for 3.0.2 --- CHANGELOG.md | 20 +++++++++++++++++++ package.json | 12 +++++------ .../@node-red/editor-api/package.json | 6 +++--- .../@node-red/editor-client/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 4 ++-- .../@node-red/registry/package.json | 6 +++--- .../@node-red/runtime/package.json | 6 +++--- .../node_modules/@node-red/util/package.json | 4 ++-- packages/node_modules/node-red/package.json | 10 +++++----- 9 files changed, 45 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a9016d9..630d91b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +#### 3.0.2: Maintenance Release + +Editor + + - Fix workspace chart bottom property (#3812) @bonanitech + - Update german translation (#3802) @Dennis14e + - Support color reset to the default in subflow and group (#3801) @kazuhitoyokoi + - Allow generateNodeNames to handle names containing regex control chars (#3817) @knolleary + - Hide scrollbars until they're needed (#3808) @bonanitech + - Include junctions/groups when exporting subflows plus related fixes (#3816) @knolleary + - remove console.log (#3820) @Steve-Mcl + +Runtime + + - Register subflow module instance node with parent flow (#3818) @knolleary + +Nodes + + - HTTP Request: Allow HTTP Headers not in spec (#3776) @hardillb + #### 3.0.1: Maintenance Release Editor diff --git a/package.json b/package.json index d5ab3bf5d..a57de03c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.1", + "version": "3.0.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", + "denque": "2.1.0", "express": "4.18.1", "express-session": "1.17.3", "form-data": "4.0.0", @@ -49,7 +49,7 @@ "hash-sum": "2.0.0", "hpagent": "1.0.0", "https-proxy-agent": "5.0.1", - "i18next": "21.8.14", + "i18next": "21.8.16", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "4.1.0", @@ -76,7 +76,7 @@ "semver": "7.3.7", "tar": "6.1.11", "tough-cookie": "4.0.0", - "uglify-js": "3.16.2", + "uglify-js": "3.16.3", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23" @@ -85,7 +85,7 @@ "bcrypt": "5.0.1" }, "devDependencies": { - "dompurify": "2.3.9", + "dompurify": "2.3.10", "grunt": "1.5.3", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", @@ -114,7 +114,7 @@ "node-red-node-test-helper": "^0.3.0", "nodemon": "2.0.19", "proxy": "^1.0.2", - "sass": "1.53.0", + "sass": "1.54.2", "should": "13.2.3", "sinon": "11.1.2", "stoppable": "^1.1.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index e95604bab..e2c53fe84 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": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "3.0.1", - "@node-red/editor-client": "3.0.1", + "@node-red/util": "3.0.2", + "@node-red/editor-client": "3.0.2", "bcryptjs": "2.4.3", "body-parser": "1.20.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 a06359c0c..0ef939fb3 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": "3.0.1", + "version": "3.0.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 c7a31fa10..818110f2f 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": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "repository": { "type": "git", @@ -25,7 +25,7 @@ "cookie": "0.5.0", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", + "denque": "2.1.0", "form-data": "4.0.0", "fs-extra": "10.1.0", "got": "11.8.5", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index c8c582ebe..6b707a87e 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": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,11 +16,11 @@ } ], "dependencies": { - "@node-red/util": "3.0.1", + "@node-red/util": "3.0.2", "clone": "2.1.2", "fs-extra": "10.1.0", "semver": "7.3.7", "tar": "6.1.11", - "uglify-js": "3.16.2" + "uglify-js": "3.16.3" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 8b1991a5c..c7d02e948 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": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "3.0.1", - "@node-red/util": "3.0.1", + "@node-red/registry": "3.0.2", + "@node-red/util": "3.0.2", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.18.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 8d677e2cd..66f5750b8 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": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "repository": { "type": "git", @@ -16,7 +16,7 @@ ], "dependencies": { "fs-extra": "10.1.0", - "i18next": "21.8.14", + "i18next": "21.8.16", "json-stringify-safe": "5.0.1", "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index faa98c48d..aaaccad22 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": "3.0.1", + "version": "3.0.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": "3.0.1", - "@node-red/runtime": "3.0.1", - "@node-red/util": "3.0.1", - "@node-red/nodes": "3.0.1", + "@node-red/editor-api": "3.0.2", + "@node-red/runtime": "3.0.2", + "@node-red/util": "3.0.2", + "@node-red/nodes": "3.0.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.18.1", From 598bcf675fe9635164e8b6c8abcb2dd1da1fb472 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 15:45:12 +0100 Subject: [PATCH 027/108] fix searching by type when type name has a space --- .../editor-client/src/js/ui/palette.js | 14 +++++- .../editor-client/src/js/ui/search.js | 46 +++++++++++++------ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 9f20cc674..322283fcb 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -175,9 +175,19 @@ RED.palette = (function() { $('').appendTo(popOverContent) } - var safeType = type.replace(/'/g,"\\'"); + const safeType = type.replace(/'/g,"\\'"); + function wrapStr(str) { + if(str.indexOf(' ') >= 0) { + return '"' + str + '"' + } + return str + } - $('').appendTo(popOverContent) + $('') + .appendTo(popOverContent) + .on('click', function() { + RED.search.show('type:' + wrapStr(safeType)) + }) $('').appendTo(popOverContent) $('

',{style:"font-size: 0.8em"}).text(metaData).appendTo(popOverContent); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index f9cc79f08..d8035908a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -106,14 +106,26 @@ RED.search = (function() { return val; } + function extractType(val, flags) { + // extracts: type:XYZ & type:"X Y Z" + console.log(`extractType(val, flags): val:${val}`) + const regEx = /(?:type):\s*(?:"([^"]+)"|([^" ]+))/; + let m + while ((m = regEx.exec(val)) !== null) { + // avoid infinite loops with zero-width matches + if (m.index === regEx.lastIndex) { + regEx.lastIndex++; + } + val = val.replace(m[0]," ").trim() + const flag = m[2] || m[1] // quoted entries in capture group 1, unquoted in capture group 2 + flags.type = flags.type || []; + flags.type.push(flag); + } + return val; + } + function search(val) { var results = []; - var typeFilter; - var m = /(?:^| )type:([^ ]+)/.exec(val); - if (m) { - val = val.replace(/(?:^| )type:[^ ]+/,""); - typeFilter = m[1]; - } var flags = {}; val = extractFlag(val,"invalid",flags); val = extractFlag(val,"unused",flags); @@ -121,18 +133,20 @@ RED.search = (function() { val = extractFlag(val,"subflow",flags); val = extractFlag(val,"hidden",flags); val = extractFlag(val,"modified",flags); - val = extractValue(val,"flow",flags);// flow:active or flow: + val = extractValue(val,"flow",flags);// flow:current or flow: val = extractValue(val,"uses",flags);// uses: + val = extractType(val,flags);// uses: val = val.trim(); var hasFlags = Object.keys(flags).length > 0; if (flags.flow && flags.flow.indexOf("current") >= 0) { let idx = flags.flow.indexOf("current"); - flags.flow[idx] = RED.workspaces.active();//convert active to flow ID + flags.flow[idx] = RED.workspaces.active();//convert 'current' to active flow ID } if (flags.flow && flags.flow.length) { flags.flow = [ ...new Set(flags.flow) ]; //deduplicate } - if (val.length > 0 || typeFilter || hasFlags) { + const hasTypeFilter = flags.type && flags.type.length > 0 + if (val.length > 0 || hasFlags) { val = val.toLowerCase(); var i; var j; @@ -146,8 +160,8 @@ RED.search = (function() { } for (i=0;i -1) { + var kpos = val ? keys[i].indexOf(val) : -1; + if (kpos > -1 || (val === "" && hasTypeFilter)) { var ids = Object.keys(index[key]||{}); for (j=0;j -1) { + nodes[node.node.id] = nodes[node.node.id] || { node: node.node, label: node.label }; - nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos); + nodes[node.node.id].index = Math.min(nodes[node.node.id].index || Infinity, typeIndex > -1 ? typeIndex : kpos); } } } From 7d4c857a43c61002844a841af6a1a8f1dd7a62c9 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 15:47:15 +0100 Subject: [PATCH 028/108] ensure sessionExpiry(Interval) is applied --- .../node_modules/@node-red/nodes/core/network/10-mqtt.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 9e6195b5d..dccf1310b 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 @@ -474,7 +474,6 @@ module.exports = function(RED) { setIfHasProperty(opts, node, "protocolVersion", init); setIfHasProperty(opts, node, "keepalive", init); setIfHasProperty(opts, node, "cleansession", init); - setIfHasProperty(opts, node, "sessionExpiry", init); setIfHasProperty(opts, node, "topicAliasMaximum", init); setIfHasProperty(opts, node, "maximumPacketSize", init); setIfHasProperty(opts, node, "receiveMaximum", init); @@ -484,6 +483,11 @@ module.exports = function(RED) { } else if (hasProperty(opts, "userProps")) { node.userProperties = opts.userProps; } + if (hasProperty(opts, "sessionExpiry")) { + node.sessionExpiryInterval = opts.sessionExpiry; + } else if (hasProperty(opts, "sessionExpiryInterval")) { + node.sessionExpiryInterval = opts.sessionExpiryInterval + } function createLWT(topic, payload, qos, retain, v5opts, v5SubPropName) { let message = undefined; From 5a36e8fb119c79a1f6c99ee08baaf8d7076253f4 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:20:11 +0100 Subject: [PATCH 029/108] add tests for MQTT v5 (sessionExpiry property) --- test/nodes/core/network/21-mqtt_spec.js | 49 ++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/test/nodes/core/network/21-mqtt_spec.js b/test/nodes/core/network/21-mqtt_spec.js index 655cc9c73..44154a802 100644 --- a/test/nodes/core/network/21-mqtt_spec.js +++ b/test/nodes/core/network/21-mqtt_spec.js @@ -27,7 +27,7 @@ describe('MQTT Nodes', function () { } catch (error) { } }); - it('should be loaded and have default values', function (done) { + it('should be loaded and have default values (MQTT V4)', function (done) { this.timeout = 2000; const { flow, nodes } = buildBasicMQTTSendRecvFlow({ id: "mqtt.broker", name: "mqtt_broker", autoConnect: false }, { id: "mqtt.in", topic: "in_topic" }, { id: "mqtt.out", topic: "out_topic" }); helper.load(mqttNodes, flow, function () { @@ -61,6 +61,52 @@ describe('MQTT Nodes', function () { mqttBroker.options.clientId.should.containEql('nodered_'); mqttBroker.options.should.have.property('keepalive').type("number"); mqttBroker.options.should.have.property('reconnectPeriod').type("number"); + //as this is not a v5 connection, ensure v5 properties are not present + mqttBroker.options.should.not.have.property('protocolVersion', 5); + mqttBroker.options.should.not.have.property('properties'); + done(); + } catch (error) { + done(error) + } + }); + }); + it('should be loaded and have default values (MQTT V5)', function (done) { + this.timeout = 2000; + const { flow, nodes } = buildBasicMQTTSendRecvFlow({ id: "mqtt.broker", name: "mqtt_broker", autoConnect: false, cleansession: false, clientid: 'clientid', keepalive: 35, sessionExpiry: '6000', protocolVersion: '5', userProps: {"prop": "val"}}, { id: "mqtt.in", topic: "in_topic" }, { id: "mqtt.out", topic: "out_topic" }); + helper.load(mqttNodes, flow, function () { + try { + const mqttIn = helper.getNode("mqtt.in"); + const mqttOut = helper.getNode("mqtt.out"); + const mqttBroker = helper.getNode("mqtt.broker"); + + should(mqttIn).be.type("object", "mqtt in node should be an object") + mqttIn.should.have.property('broker', nodes.mqtt_broker.id); //should be the id of the broker node + mqttIn.should.have.property('datatype', 'utf8'); //default: 'utf8' + mqttIn.should.have.property('isDynamic', false); //default: false + mqttIn.should.have.property('inputs', 0); //default: 0 + mqttIn.should.have.property('qos', 2); //default: 2 + mqttIn.should.have.property('topic', "in_topic"); + mqttIn.should.have.property('wires', [["helper.node"]]); + + should(mqttOut).be.type("object", "mqtt out node should be an object") + mqttOut.should.have.property('broker', nodes.mqtt_broker.id); //should be the id of the broker node + mqttOut.should.have.property('topic', "out_topic"); + + should(mqttBroker).be.type("object", "mqtt broker node should be an object") + mqttBroker.should.have.property('broker', BROKER_HOST); + mqttBroker.should.have.property('port', BROKER_PORT); + mqttBroker.should.have.property('brokerurl'); + // mqttBroker.should.have.property('autoUnsubscribe', true);//default: true + mqttBroker.should.have.property('autoConnect', false);//Set "autoConnect:false" in brokerOptions + mqttBroker.should.have.property('options'); + mqttBroker.options.should.have.property('clean', false); + mqttBroker.options.should.have.property('clientId', 'clientid'); + mqttBroker.options.should.have.property('keepalive').type("number", 35); + mqttBroker.options.should.have.property('reconnectPeriod').type("number"); + //as this IS a v5 connection, ensure v5 properties are not present + mqttBroker.options.should.have.property('protocolVersion', 5); + mqttBroker.options.should.have.property('properties'); + mqttBroker.options.properties.should.have.property('sessionExpiryInterval'); done(); } catch (error) { done(error) @@ -666,6 +712,7 @@ function buildMQTTBrokerNode(id, name, brokerHost, brokerPort, options) { node.cleansession = String(options.cleansession) == "false" ? false : true; node.autoUnsubscribe = String(options.autoUnsubscribe) == "false" ? false : true; node.autoConnect = String(options.autoConnect) == "false" ? false : true; + node.sessionExpiry = options.sessionExpiry ? options.sessionExpiry : undefined; if (options.birthTopic) { node.birthTopic = options.birthTopic; From 5c6b8e9e50dfd26e5acbac5dec6bd3b65c468048 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:21:36 +0100 Subject: [PATCH 030/108] opportunistic tidy up MQTT tests --- test/nodes/core/network/21-mqtt_spec.js | 29 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/test/nodes/core/network/21-mqtt_spec.js b/test/nodes/core/network/21-mqtt_spec.js index 44154a802..fd1309b74 100644 --- a/test/nodes/core/network/21-mqtt_spec.js +++ b/test/nodes/core/network/21-mqtt_spec.js @@ -219,7 +219,7 @@ describe('MQTT Nodes', function () { topic: nextTopic(), payload: '{prop:"value3", "num":3}', // send invalid JSON ... } - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { done: null, beforeLoad: null, afterLoad: null, afterConnect: null } hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { helperNode.on("input", function (msg) { try { @@ -345,7 +345,7 @@ describe('MQTT Nodes', function () { topic: nextTopic(), payload: '{prop:"value3", "num":3}', contentType: "application/json", // send invalid JSON ... } - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { done: null, beforeLoad: null, afterLoad: null, afterConnect: null } hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { helperNode.on("input", function (msg) { try { @@ -431,7 +431,7 @@ describe('MQTT Nodes', function () { if (skipTests) { return this.skip() } this.timeout = 2000; const options = {} - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { beforeLoad: null, afterLoad: null, afterConnect: null } hooks.beforeLoad = (flow) => { //add a status node pointed at MQTT Out node (to watch for connection status change) flow.push({ "id": "status.node", "type": "status", "name": "status_node", "scope": ["mqtt.out"], "wires": [["helper.node"]] });//add status node to watch mqtt_out } @@ -462,18 +462,31 @@ describe('MQTT Nodes', function () { this.timeout = 2000; const baseTopic = nextTopic(); const brokerOptions = { + autoConnect: false, protocolVersion: 4, birthTopic: baseTopic + "/birth", - birthPayload: "broker connected", + birthPayload: "broker birth", birthQos: 2, } - const options = {}; - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null }; - options.expectMsg = { + const expectMsg = { topic: brokerOptions.birthTopic, payload: brokerOptions.birthPayload, qos: brokerOptions.birthQos }; + const options = { }; + const hooks = { }; + hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { + helperNode.on("input", function (msg) { + try { + compareMsgToExpected(msg, expectMsg); + done(); + } catch (error) { + done(error) + } + }) + mqttIn.receive({ "action": "connect" }); //now request connect action + return true; //handled + } testSendRecv(brokerOptions, { topic: brokerOptions.birthTopic }, {}, options, hooks); }); itConditional('should publish close message', function (done) { @@ -807,8 +820,8 @@ function waitBrokerConnect(broker, timeLimit) { let waitConnected = (broker, timeLimit) => { const brokers = Array.isArray(broker) ? broker : [broker]; timeLimit = timeLimit || 1000; - let timer, resolved = false; return new Promise( (resolve, reject) => { + let timer, resolved = false; timer = wait(); function wait() { if (brokers.every(e => e.connected == true)) { From 31b17faa2ade0e8a22b588ae29ae6c86e6eac0e8 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:23:07 +0100 Subject: [PATCH 031/108] fix MQTT test fail due to birth sent before connection done --- packages/node_modules/@node-red/nodes/core/network/10-mqtt.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 dccf1310b..50b1d690f 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 @@ -786,7 +786,9 @@ module.exports = function(RED) { // Send any birth message if (node.birthMessage) { - node.publish(node.birthMessage); + setTimeout(() => { + node.publish(node.birthMessage); + }, 1); } }); node._clientOn("reconnect", function() { From 9540cfe74931720aa34f1b0e8dbbef566cb91c8b Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sat, 13 Aug 2022 18:09:11 +0100 Subject: [PATCH 032/108] fix flags search without val --- .../editor-client/src/js/ui/search.js | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index d8035908a..7d147bde9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -125,8 +125,8 @@ RED.search = (function() { } function search(val) { - var results = []; - var flags = {}; + const results = []; + const flags = {}; val = extractFlag(val,"invalid",flags); val = extractFlag(val,"unused",flags); val = extractFlag(val,"config",flags); @@ -137,7 +137,8 @@ RED.search = (function() { val = extractValue(val,"uses",flags);// uses: val = extractType(val,flags);// uses: val = val.trim(); - var hasFlags = Object.keys(flags).length > 0; + const hasFlags = Object.keys(flags).length > 0; + const hasTypeFilter = flags.type && flags.type.length > 0 if (flags.flow && flags.flow.indexOf("current") >= 0) { let idx = flags.flow.indexOf("current"); flags.flow[idx] = RED.workspaces.active();//convert 'current' to active flow ID @@ -145,13 +146,12 @@ RED.search = (function() { if (flags.flow && flags.flow.length) { flags.flow = [ ...new Set(flags.flow) ]; //deduplicate } - const hasTypeFilter = flags.type && flags.type.length > 0 if (val.length > 0 || hasFlags) { val = val.toLowerCase(); - var i; - var j; - var list = []; - var nodes = {}; + let i; + let j; + let list = []; + const nodes = {}; let keys = []; if (flags.uses) { keys = flags.uses; @@ -159,10 +159,10 @@ RED.search = (function() { keys = Object.keys(index); } for (i=0;i -1 || (val === "" && hasTypeFilter)) { - var ids = Object.keys(index[key]||{}); + const key = keys[i]; + const kpos = val ? keys[i].indexOf(val) : -1; + if (kpos > -1 || (val === "" && hasFlags)) { + const ids = Object.keys(index[key]||{}); for (j=0;j Date: Sun, 14 Aug 2022 15:02:39 +0100 Subject: [PATCH 033/108] Add missing property to node object HTTPRequest Also add tests for broken headers --- .../nodes/core/network/21-httprequest.js | 1 + .../nodes/core/network/21-httprequest_spec.js | 71 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js index b94d59dc7..9eac4da91 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js @@ -86,6 +86,7 @@ in your Node-RED user directory (${RED.settings.userDir}). if (n.paytoqs === true || n.paytoqs === "query") { paytoqs = true; } else if (n.paytoqs === "body") { paytobody = true; } + node.insecureHTTPParser = n.insecureHTTPParser var prox, noprox; if (process.env.http_proxy) { prox = process.env.http_proxy; } diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index 688776289..dff99f3b0 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -31,6 +31,8 @@ var multer = require("multer"); var RED = require("nr-test-utils").require("node-red/lib/red"); var fs = require('fs-extra'); var auth = require('basic-auth'); +const { version } = require("os"); +const net = require('net') describe('HTTP Request Node', function() { var testApp; @@ -2265,4 +2267,73 @@ describe('HTTP Request Node', function() { }); }); }); + + describe('should parse broken headers', function(done) { + + const versions = process.versions.node.split('.') + + if (( versions[0] == 14 && versions[1] >= 20 ) || + ( versions[0] == 16 && versions[1] >= 16 ) || + ( versions[0] == 18 && versions[1] >= 5 ) || + ( versions[0] > 18)) { + // only test if on new enough NodeJS version + + let port = testPort++ + + let server; + + before(function() { + server = net.createServer(function (socket) { + socket.write("HTTP/1.0 200\nContent-Type: text/plain\n\nHelloWorld") + socket.end() + }) + + server.listen(port,'127.0.0.1', function(err) { + }) + }); + + after(function() { + server.close() + }); + + it('should accept broken headers', function (done) { + var flow = [{id:'n1',type:'http request',wires:[['n2']],method:'GET',ret:'obj',url:`http://localhost:${port}/`, insecureHTTPParser: true}, + {id:"n2", type:"helper"}]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on('input', function(msg) { + try { + msg.payload.should.equal('HelloWorld') + done() + } catch (err) { + done(err) + } + }) + n1.receive({payload: 'foo'}) + }); + }); + + it('should reject broken headers', function (done) { + var flow = [{id:'n1',type:'http request',wires:[['n2']],method:'GET',ret:'obj',url:`http://localhost:${port}/`}, + {id:"n2", type:"helper"}]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on('input', function(msg) { + try{ + msg.payload.should.equal('RequestError: Parse Error: Missing expected CR after header value : http://localhost:10234/') + done() + } catch (err) { + done(err) + } + }) + n1.receive({payload: 'foo'}) + + }); + }); + } else { + done() + } + }); }); From 58b951e134ab7815640c7184ea33bd561ec427e3 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sun, 14 Aug 2022 15:09:48 +0100 Subject: [PATCH 034/108] Make port number dynamic in test --- test/nodes/core/network/21-httprequest_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index dff99f3b0..65f8f5814 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -2322,7 +2322,7 @@ describe('HTTP Request Node', function() { var n2 = helper.getNode("n2"); n2.on('input', function(msg) { try{ - msg.payload.should.equal('RequestError: Parse Error: Missing expected CR after header value : http://localhost:10234/') + msg.payload.should.equal(`RequestError: Parse Error: Missing expected CR after header value : http://localhost:${port}/`) done() } catch (err) { done(err) From 0d0d5bafb0f530fdcefe5576b248d63103b4a458 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 18 Aug 2022 01:29:07 +0900 Subject: [PATCH 035/108] Make pre-defined header list sortable in http request node --- .../@node-red/nodes/core/network/21-httprequest.html | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html index b9a44e1b4..eb0aeaf47 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html @@ -417,6 +417,7 @@ }); }, + sortable: true, removable: true }); if (node.headers) { From 266ba17ebb741aef2e5eefb8285eccc55fecff0f Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 18 Aug 2022 11:52:56 +0900 Subject: [PATCH 036/108] Use sortable list in http response node and proxy setting --- .../node_modules/@node-red/nodes/core/network/06-httpproxy.html | 1 + .../node_modules/@node-red/nodes/core/network/21-httpin.html | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html index 7819ab8ec..446cbd324 100644 --- a/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html +++ b/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html @@ -101,6 +101,7 @@ hostField.val(data.host); } }, + sortable: true, removable: true }); if (this.noproxy) { diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httpin.html b/packages/node_modules/@node-red/nodes/core/network/21-httpin.html index ce2f81e12..f828077a1 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httpin.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httpin.html @@ -227,6 +227,7 @@ } }); }, + sortable: true, removable: true }); From d0d22c333c3d9479d19544b3726bff73fa5738fc Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 28 Aug 2022 02:04:13 +0900 Subject: [PATCH 037/108] Add Japanese translation for v3.0.2 --- .../@node-red/editor-client/locales/ja/editor.json | 3 +-- packages/node_modules/@node-red/nodes/locales/ja/messages.json | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index fb3458eed..dc7858250 100644 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -1168,8 +1168,7 @@ "takeATour": "ツアーを開始", "start": "開始", "next": "次へ", - "welcomeTours": "ウェルカムツアー", - "tours": "ツアー" + "welcomeTours": "ウェルカムツアー" }, "diagnostics": { "title": "システム情報" 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 6e16daa6f..76c8f8462 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -554,7 +554,8 @@ }, "status": { "requesting": "要求中" - } + }, + "insecureHTTPParser": "厳密なHTTPパース処理を無効化" }, "websocket": { "label": { From cd8ca8981ba4146de22e79457fb7d46651061005 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 3 Sep 2022 21:03:08 +0900 Subject: [PATCH 038/108] Add button type to the adding SSH key button --- .../@node-red/editor-client/src/js/ui/projects/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js index 190561e15..30a1e51d0 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js @@ -545,7 +545,7 @@ RED.projects = (function() { var sshwarningRow = $('

').hide().appendTo(subrow); $('
'+RED._("projects.clone-project.ssh-key-desc")+'
').appendTo(sshwarningRow); subrow = $('
').appendTo(sshwarningRow); - $('').appendTo(subrow).on("click", function(e) { + $('').appendTo(subrow).on("click", function(e) { e.preventDefault(); dialog.dialog( "close" ); RED.userSettings.show('gitconfig'); From d6bb3a558f6da935e05488cb1708562b0b242ebb Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sat, 3 Sep 2022 21:23:38 +0100 Subject: [PATCH 039/108] fix loading node package in nodesDir on linux fixes #3861 --- .../@node-red/registry/lib/loader.js | 39 ++++++++++--------- .../@node-red/registry/lib/localfilesystem.js | 10 +++++ .../@node-red/registry/lib/registry.js | 11 +++++- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/packages/node_modules/@node-red/registry/lib/loader.js b/packages/node_modules/@node-red/registry/lib/loader.js index 61f28ab86..3f0487750 100644 --- a/packages/node_modules/@node-red/registry/lib/loader.js +++ b/packages/node_modules/@node-red/registry/lib/loader.js @@ -43,37 +43,40 @@ function load(disableNodePathScan) { return loadModuleFiles(modules); } +function splitPath(p) { + return path.posix.normalize((p || '').replace(/\\/g, path.sep)).split(path.sep) +} function loadModuleTypeFiles(module, type) { const things = module[type]; - var first = true; - var promises = []; - for (var thingName in things) { + let first = true; + const promises = []; + for (let thingName in things) { /* istanbul ignore else */ if (things.hasOwnProperty(thingName)) { if (module.name != "node-red" && first) { // Check the module directory exists first = false; - var fn = things[thingName].file; - var parts = fn.split("/"); - var i = parts.length-1; - for (;i>=0;i--) { - if (parts[i] == "node_modules") { - break; - } + let moduleFn = module.path + const fn = things[thingName].file + const parts = splitPath(fn) + const nmi = parts.indexOf('node_modules') + if(nmi > -1) { + moduleFn = parts.slice(0,nmi+2).join(path.sep); + } + if (!moduleFn) { + // shortcut - skip calling statSync on empty string + break; // Module not found, don't attempt to load its nodes } - var moduleFn = parts.slice(0,i+2).join("/"); - try { - var stat = fs.statSync(moduleFn); + const stat = fs.statSync(moduleFn); } catch(err) { - // Module not found, don't attempt to load its nodes - break; + break; // Module not found, don't attempt to load its nodes } } try { - var promise; + let promise; if (type === "nodes") { promise = loadNodeConfig(things[thingName]); } else if (type === "plugins") { @@ -82,8 +85,7 @@ function loadModuleTypeFiles(module, type) { promises.push( promise.then( (function() { - var m = module.name; - var n = thingName; + const n = thingName; return function(nodeSet) { things[n] = nodeSet; return nodeSet; @@ -93,7 +95,6 @@ function loadModuleTypeFiles(module, type) { ); } catch(err) { console.log(err) - // } } } diff --git a/packages/node_modules/@node-red/registry/lib/localfilesystem.js b/packages/node_modules/@node-red/registry/lib/localfilesystem.js index da4006ecc..edb805572 100644 --- a/packages/node_modules/@node-red/registry/lib/localfilesystem.js +++ b/packages/node_modules/@node-red/registry/lib/localfilesystem.js @@ -156,6 +156,16 @@ function scanDirForNodesModules(dir,moduleName,package) { } } } + + // if we have found a package.json, this IS a node_module, lets see if it is a node-red node + if (!isNodeRedModule && files.indexOf('package.json') > -1) { + package = getPackageDetails(dir) // get package details + if(package && package.isNodeRedModule) { + isNodeRedModule = true + files = ['package.json'] // shortcut the file scan + } + } + for (let i=0;i Date: Sat, 3 Sep 2022 21:37:27 +0100 Subject: [PATCH 040/108] add test for specific arrangement of node package --- .../registry/lib/localfilesystem_spec.js | 21 ++++++++++++++- .../@lower-case2/lower-case2/lower-case.html | 26 +++++++++++++++++++ .../@lower-case2/lower-case2/lower-case.js | 11 ++++++++ .../nodesDir2/@lower-case2/package.json | 9 +++++++ .../lower-case/lower-case/lower-case.html | 26 +++++++++++++++++++ .../lower-case/lower-case/lower-case.js | 11 ++++++++ .../nodesDir2/lower-case/package.json | 9 +++++++ 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json diff --git a/test/unit/@node-red/registry/lib/localfilesystem_spec.js b/test/unit/@node-red/registry/lib/localfilesystem_spec.js index 3b1bb63f3..3ce74c158 100644 --- a/test/unit/@node-red/registry/lib/localfilesystem_spec.js +++ b/test/unit/@node-red/registry/lib/localfilesystem_spec.js @@ -329,17 +329,36 @@ describe("red/nodes/registry/localfilesystem",function() { localfilesystem.init({nodesDir:[nodesDir2]}); const nodeModule = localfilesystem.getModuleFiles(); const loaded = Object.keys(nodeModule) - loaded.should.have.a.property("length", 3) loaded.indexOf('@test/testnode').should.greaterThan(-1, "Should load @test/testnode") + loaded.indexOf('lower-case').should.greaterThan(-1, "Should load lower-case") + loaded.indexOf('@lowercase/lower-case2').should.greaterThan(-1, "Should load @lowercase/lower-case2") loaded.indexOf('testnode2').should.greaterThan(-1, "Should load testnode2") loaded.indexOf('test-theme2').should.greaterThan(-1, "Should load test-theme2") + loaded.should.have.a.property("length", 5) + // scoped module with nodes in same dir as package.json nodeModule['@test/testnode'].should.have.a.property('name','@test/testnode'); nodeModule['@test/testnode'].should.have.a.property('version','1.0.0'); nodeModule['@test/testnode'].should.have.a.property('nodes'); nodeModule['@test/testnode'].should.have.a.property('path'); nodeModule['@test/testnode'].should.have.a.property('user', false); + // node-red module with nodes in sub dir + nodeModule['@lowercase/lower-case2'].should.have.a.property('name','@lowercase/lower-case2'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('version','2.0.0'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('nodes'); + nodeModule['@lowercase/lower-case2'].nodes.should.have.a.property('lower-case'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('path'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('user', false); + + // scoped module with nodes in sub dir + nodeModule['lower-case'].should.have.a.property('name', 'lower-case'); + nodeModule['lower-case'].should.have.a.property('version','1.0.0'); + nodeModule['lower-case'].should.have.a.property('nodes'); + nodeModule['lower-case'].nodes.should.have.a.property('lower-case'); + nodeModule['lower-case'].should.have.a.property('path'); + nodeModule['lower-case'].should.have.a.property('user', false); + nodeModule['testnode2'].should.have.a.property('name','testnode2'); nodeModule['testnode2'].should.have.a.property('version','1.0.0'); nodeModule['testnode2'].should.have.a.property('nodes'); diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html new file mode 100644 index 000000000..617f48491 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js new file mode 100644 index 000000000..73579ba04 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js @@ -0,0 +1,11 @@ +module.exports = function(RED) { +function LowerCaseNode(config) { + RED.nodes.createNode(this,config); + var node = this; + node.on('input', function(msg) { + msg.payload = msg.payload.toLowerCase(); + node.send(msg); + }); + } + RED.nodes.registerType("lower-case2",LowerCaseNode); +} \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json new file mode 100644 index 000000000..6b6ce9aa9 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json @@ -0,0 +1,9 @@ +{ + "name" : "@lowercase/lower-case2", + "node-red" : { + "nodes": { + "lower-case": "lower-case2/lower-case.js" + } + }, + "version": "2.0.0" +} \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html new file mode 100644 index 000000000..e57d51131 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html @@ -0,0 +1,26 @@ + + + + + diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js new file mode 100644 index 000000000..006b35eb6 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js @@ -0,0 +1,11 @@ +module.exports = function(RED) { + function LowerCaseNode(config) { + RED.nodes.createNode(this,config); + var node = this; + node.on('input', function(msg) { + msg.payload = msg.payload.toLowerCase(); + node.send(msg); + }); + } + RED.nodes.registerType("lower-case",LowerCaseNode); +} diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json new file mode 100644 index 000000000..a632eaddd --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json @@ -0,0 +1,9 @@ +{ + "name" : "lower-case", + "node-red" : { + "nodes": { + "lower-case": "lower-case/lower-case.js" + } + }, + "version": "1.0.0" +} From 5f159c1fbd4e78373292472263f8caa0d720721d Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 21:54:21 +0100 Subject: [PATCH 041/108] Update packages/node_modules/@node-red/editor-client/src/js/ui/search.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/search.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 7d147bde9..6dcd44b88 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -108,7 +108,6 @@ RED.search = (function() { function extractType(val, flags) { // extracts: type:XYZ & type:"X Y Z" - console.log(`extractType(val, flags): val:${val}`) const regEx = /(?:type):\s*(?:"([^"]+)"|([^" ]+))/; let m while ((m = regEx.exec(val)) !== null) { From c038c99f9dbc54f15c88f6ec8a2b5f379d4e8253 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 21:54:41 +0100 Subject: [PATCH 042/108] Update packages/node_modules/@node-red/editor-client/src/js/ui/search.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 6dcd44b88..3903a4a0a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -134,7 +134,7 @@ RED.search = (function() { val = extractFlag(val,"modified",flags); val = extractValue(val,"flow",flags);// flow:current or flow: val = extractValue(val,"uses",flags);// uses: - val = extractType(val,flags);// uses: + val = extractType(val,flags);// type: val = val.trim(); const hasFlags = Object.keys(flags).length > 0; const hasTypeFilter = flags.type && flags.type.length > 0 From e11f17672c0b208d7560c249ca617ef989b11ee9 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 22:01:54 +0100 Subject: [PATCH 043/108] Update packages/node_modules/@node-red/editor-client/src/js/ui/palette.js --- .../node_modules/@node-red/editor-client/src/js/ui/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 322283fcb..928793610 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -176,7 +176,7 @@ RED.palette = (function() { } const safeType = type.replace(/'/g,"\\'"); - function wrapStr(str) { + const wrapStr = function (str) { if(str.indexOf(' ') >= 0) { return '"' + str + '"' } From a533943a4043cd915ec40e37a424ae168a0b4793 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 4 Sep 2022 01:50:54 +0100 Subject: [PATCH 044/108] add function node monaco types util and promisify fixes #3851 --- .../editor-client/src/js/ui/editors/code-editors/monaco.js | 2 +- .../@node-red/editor-client/src/types/node-red/func.d.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) 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 497116125..68b9a487e 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 @@ -100,7 +100,7 @@ RED.editor.codeEditor.monaco = (function() { "node-red-util": {package: "node-red", module: "util", path: "node-red/util.d.ts" }, "node-red-func": {package: "node-red", module: "func", path: "node-red/func.d.ts" }, } - const defaultServerSideTypes = [ knownModules["node-red-util"], knownModules["node-red-func"], knownModules["globals"], knownModules["console"], knownModules["buffer"] ]; + const defaultServerSideTypes = [ knownModules["node-red-util"], knownModules["node-red-func"], knownModules["globals"], knownModules["console"], knownModules["buffer"] , knownModules["util"] ]; const modulesCache = {}; 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 ae411f33c..fd2adcbd8 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 @@ -14,6 +14,9 @@ declare var msg: NodeMessage; /** @type {string} the id of the incoming `msg` (alias of msg._msgid) */ declare const __msgid__:string; +declare const util:typeof import('util') +declare const promisify:typeof import('util').promisify + /** * @typedef NodeStatus * @type {object} From fbde0091de47a8393e8e541bebc973b51fa0f721 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 4 Sep 2022 11:08:41 +0100 Subject: [PATCH 045/108] fix node-red crash with invalid mqtt birth topic fixes #3865 --- .../@node-red/nodes/core/network/10-mqtt.js | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 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 9e6195b5d..532d54d8e 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 @@ -991,14 +991,21 @@ module.exports = function(RED) { } if (topicOK) { - node.client.publish(msg.topic, msg.payload, options, function(err) { - done && done(err); - return - }); + node.client.publish(msg.topic, msg.payload, options, function (err) { + if (done) { + done(err) + } else { + node.error(err, msg) + } + }) } else { - const error = new Error(RED._("mqtt.errors.invalid-topic")); - error.warn = true; - done(error); + const error = new Error(RED._("mqtt.errors.invalid-topic")) + error.warn = true + if (done) { + done(error) + } else { + node.warn(error, msg) + } } } }; From cc5a770b164e8e55713c37d468ee2c4c717be1b3 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 4 Sep 2022 21:58:02 +0900 Subject: [PATCH 046/108] Add button type to buttons on projects dialog --- .../src/js/ui/projects/projects.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js index 30a1e51d0..6294c4c51 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js @@ -1171,11 +1171,11 @@ RED.projects = (function() { row = $('
').appendTo(container); - var openProject = $('').appendTo(row); - var createAsEmpty = $('').appendTo(row); - // var createAsCopy = $('').appendTo(row); - var createAsClone = $('').appendTo(row); - // var createAsClone = $('').appendTo(row); + var openProject = $('').appendTo(row); + var createAsEmpty = $('').appendTo(row); + // var createAsCopy = $('').appendTo(row); + var createAsClone = $('').appendTo(row); + // var createAsClone = $('').appendTo(row); row.find(".red-ui-projects-dialog-screen-create-type").on("click", function(evt) { evt.preventDefault(); container.find(".red-ui-projects-dialog-screen-create-type").removeClass('selected'); @@ -1397,7 +1397,7 @@ RED.projects = (function() { var sshwarningRow = $('
').hide().appendTo(subrow); $('
'+RED._("projects.create.desc2")+'
').appendTo(sshwarningRow); subrow = $('
').appendTo(sshwarningRow); - $('').appendTo(subrow).on("click", function(e) { + $('').appendTo(subrow).on("click", function(e) { e.preventDefault(); $('#red-ui-projects-dialog-cancel').trigger("click"); RED.userSettings.show('gitconfig'); @@ -1631,14 +1631,14 @@ RED.projects = (function() { function deleteProject(row,name,done) { var cover = $('
').on("click", function(evt) { evt.stopPropagation(); }).appendTo(row); $('').text(RED._("projects.delete.confirm")).appendTo(cover); - $('') + $('') .appendTo(cover) .on("click", function(e) { e.stopPropagation(); cover.remove(); done(true); }); - $('') + $('') .appendTo(cover) .on("click", function(e) { e.stopPropagation(); @@ -1822,7 +1822,7 @@ RED.projects = (function() { header.addClass("selectable"); var tools = $('
').appendTo(header); - $('') + $('') .appendTo(tools) .on("click", function(e) { e.stopPropagation(); From 745607b5bce56c125e76f8e4baf6b0707d542ed5 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 4 Sep 2022 23:21:34 +0900 Subject: [PATCH 047/108] Add button type to buttons on node properties --- .../@node-red/nodes/core/common/24-complete.html | 2 +- .../node_modules/@node-red/nodes/core/common/25-catch.html | 2 +- .../node_modules/@node-red/nodes/core/common/25-status.html | 2 +- .../@node-red/nodes/core/function/10-function.html | 6 +++--- .../@node-red/nodes/core/function/80-template.html | 2 +- .../node_modules/@node-red/nodes/core/network/05-tls.html | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/24-complete.html b/packages/node_modules/@node-red/nodes/core/common/24-complete.html index a6a7a2a45..b2d406bb5 100644 --- a/packages/node_modules/@node-red/nodes/core/common/24-complete.html +++ b/packages/node_modules/@node-red/nodes/core/common/24-complete.html @@ -1,6 +1,6 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html index 1a9c17453..9b64003a5 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html @@ -48,4 +48,7 @@

注: デフォルトでは、mustache形式は置換対象のHTML要素をエスケープします。これを抑止するには{{{三重}}}括弧形式を使います。

もし、コンテンツの中で{{ }}を出力する必要がある場合は、テンプレートで使われる記号文字を変えることもできます。例えば、[[ ]]を代わりに用いるには、テンプレートの先頭に以下の行を追加します。

{{=[[ ]]=}}
+

環境変数の利用

+

templateノードでは、次の構文を用いると環境変数にアクセスできます:

+
私の好きな色は{{env.COLOUR}}です。
From 7507a7b459fdebf22287dda7b9dc4ac939402a4a Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Fri, 16 Sep 2022 02:10:14 +0900 Subject: [PATCH 055/108] Limit number of ports in function node --- .../@node-red/nodes/core/function/10-function.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index fc57895a2..a647bed49 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -451,7 +451,8 @@ tabs.activateTab("func-tab-body"); $( "#node-input-outputs" ).spinner({ - min:0, + min: 0, + max: 10, change: function(event, ui) { var value = this.value; if (!value.match(/^\d+$/)) { value = 1; } From 9fd4989142243d63f914fe523542fc8f03a1abbe Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 15 Sep 2022 21:22:55 +0100 Subject: [PATCH 056/108] Fix autocomplete entry for responseUrl Fixes #3883 --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index ef1be05bc..7440b464e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -146,7 +146,7 @@ { value: "reset", source: ["delay","trigger","join","rbe"] }, { value: "responseCookies", source: ["http request"] }, { value: "responseTopic", source: ["mqtt"] }, - { value: "responseURL", source: ["http request"] }, + { value: "responseUrl", source: ["http request"] }, { value: "restartTimeout", source: ["join"] }, { value: "retain", source: ["mqtt"] }, { value: "schema", source: ["json"] }, From 199caccbc3244fe73ac131bf5bd772c09fe2d112 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 17 Sep 2022 00:25:46 +0900 Subject: [PATCH 057/108] Change the maximum number of ports to 500 --- .../node_modules/@node-red/nodes/core/function/10-function.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index a647bed49..345a77aab 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -452,7 +452,7 @@ $( "#node-input-outputs" ).spinner({ min: 0, - max: 10, + max: 500, change: function(event, ui) { var value = this.value; if (!value.match(/^\d+$/)) { value = 1; } From ce31edc80327d4141d5a46b6f07ef33c5113c1ec Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 02:22:52 +0900 Subject: [PATCH 058/108] Fix handling of max and min values in function outputs --- .../@node-red/nodes/core/function/10-function.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index 345a77aab..43f8c7b39 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -454,9 +454,10 @@ min: 0, max: 500, change: function(event, ui) { - var value = this.value; - if (!value.match(/^\d+$/)) { value = 1; } - else if (value < this.min) { value = this.min; } + var value = parseInt(this.value); + value = isNaN(value) ? 1 : value; + value = Math.max(value, parseInt($(this).attr("aria-valuemin"))); + value = Math.min(value, parseInt($(this).attr("aria-valuemax"))); if (value !== this.value) { $(this).spinner("value", value); } } }); From efc0f1ab9144f6444544095fe7fbdfcd4732f2f0 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 16:24:25 +0900 Subject: [PATCH 059/108] Fix default values for MQTT retain settings --- .../node_modules/@node-red/nodes/core/network/10-mqtt.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html index 03ef4b2e3..cf443f48b 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html @@ -499,17 +499,17 @@ cleansession: {value: true}, birthTopic: {value:"", validate:validateMQTTPublishTopic}, birthQos: {value:"0"}, - birthRetain: {value:false}, + birthRetain: {value:"false"}, birthPayload: {value:""}, birthMsg: { value: {}}, closeTopic: {value:"", validate:validateMQTTPublishTopic}, closeQos: {value:"0"}, - closeRetain: {value:false}, + closeRetain: {value:"false"}, closePayload: {value:""}, closeMsg: { value: {}}, willTopic: {value:"", validate:validateMQTTPublishTopic}, willQos: {value:"0"}, - willRetain: {value:false}, + willRetain: {value:"false"}, willPayload: {value:""}, willMsg: { value: {}}, userProps: { value: ""}, From a81b1aa0cb769b3cc90a562f14c6eb79cbaa00ff Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 17:10:19 +0900 Subject: [PATCH 060/108] Support i18n in MQTT node property --- .../@node-red/nodes/core/network/10-mqtt.html | 8 ++++++-- .../@node-red/nodes/locales/en-US/messages.json | 4 +++- .../node_modules/@node-red/nodes/locales/ja/messages.json | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html index cf443f48b..6492060e2 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html @@ -421,7 +421,11 @@ From 8f27dae7ea20a05c657d672a1408cffce784ffcd Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 16 Jan 2023 00:56:39 +0900 Subject: [PATCH 100/108] Add Japanese translations for v3.0.3 --- .../node_modules/@node-red/runtime/locales/ja/runtime.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/locales/ja/runtime.json b/packages/node_modules/@node-red/runtime/locales/ja/runtime.json index bb5b0badc..8e4bceebe 100644 --- a/packages/node_modules/@node-red/runtime/locales/ja/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/ja/runtime.json @@ -20,6 +20,7 @@ "errors-help": "詳細は -v を指定して実行してください", "missing-modules": "不足しているノードモジュール:", "node-version-mismatch": "ノードモジュールはこのバージョンではロードできません。必要なバージョン: __version__ ", + "set-has-no-types": "セットに型がありません。 名前: '__name__', モジュール: '__module__', ファイル: '__file__'", "type-already-registered": "'__type__' はモジュール __module__ で登録済みです", "removing-modules": "設定からモジュールを削除します", "added-types": "追加したノード:", @@ -134,7 +135,8 @@ "flow": { "unknown-type": "不明なノード: __type__", "missing-types": "欠落したノード", - "error-loop": "メッセージの例外補足回数が最大値を超えました" + "error-loop": "メッセージの例外補足回数が最大値を超えました", + "non-message-returned": "ノードが __type__ 型のメッセージの送信を試みました" }, "index": { "unrecognised-id": "不明なID: __id__", From 10324d8260e5172332fc353f54b67336fede4006 Mon Sep 17 00:00:00 2001 From: Robin Schneider Date: Thu, 19 Jan 2023 10:28:46 +0100 Subject: [PATCH 101/108] Fix typos in settings.js (#4013) * chore: Remove trailing whitespace in settings.js * chore: Fix typos in settings.js * chore: Use consistent terminology in settings.js --- packages/node_modules/node-red/settings.js | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index ec247a672..901e69789 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -181,7 +181,7 @@ module.exports = { /** Some nodes, such as HTTP In, can be used to listen for incoming http requests. * By default, these are served relative to '/'. The following property - * can be used to specifiy a different root path. If set to false, this is + * can be used to specify a different root path. If set to false, this is * disabled. */ //httpNodeRoot: '/red-nodes', @@ -219,17 +219,17 @@ module.exports = { /** When httpAdminRoot is used to move the UI to a different root path, the * following property can be used to identify a directory of static content * that should be served at http://localhost:1880/. - * When httpStaticRoot is set differently to httpAdminRoot, there is no need + * When httpStaticRoot is set differently to httpAdminRoot, there is no need * to move httpAdminRoot */ //httpStatic: '/home/nol/node-red-static/', //single static source /* OR multiple static sources can be created using an array of objects... */ //httpStatic: [ - // {path: '/home/nol/pics/', root: "/img/"}, - // {path: '/home/nol/reports/', root: "/doc/"}, + // {path: '/home/nol/pics/', root: "/img/"}, + // {path: '/home/nol/reports/', root: "/doc/"}, //], - /** + /** * All static routes will be appended to httpStaticRoot * e.g. if httpStatic = "/home/nol/docs" and httpStaticRoot = "/static/" * then "/home/nol/docs" will be served at "/static/" @@ -256,11 +256,11 @@ module.exports = { */ // lang: "de", - /** Configure diagnostics options + /** Configure diagnostics options * - enabled: When `enabled` is `true` (or unset), diagnostics data will - * be available at http://localhost:1880/diagnostics - * - ui: When `ui` is `true` (or unset), the action `show-system-info` will - * be available to logged in users of node-red editor + * be available at http://localhost:1880/diagnostics + * - ui: When `ui` is `true` (or unset), the action `show-system-info` will + * be available to logged in users of node-red editor */ diagnostics: { /** enable or disable diagnostics endpoint. Must be set to `false` to disable */ @@ -268,10 +268,10 @@ module.exports = { /** enable or disable diagnostics display in the node-red editor. Must be set to `false` to disable */ ui: true, }, - /** Configure runtimeState options - * - enabled: When `enabled` is `true` flows runtime can be Started/Stoped - * by POSTing to available at http://localhost:1880/flows/state - * - ui: When `ui` is `true`, the action `core:start-flows` and + /** Configure runtimeState options + * - enabled: When `enabled` is `true` flows runtime can be Started/Stopped + * by POSTing to available at http://localhost:1880/flows/state + * - ui: When `ui` is `true`, the action `core:start-flows` and * `core:stop-flows` will be available to logged in users of node-red editor * Also, the deploy menu (when set to default) will show a stop or start button */ @@ -519,7 +519,7 @@ module.exports = { */ //tlsConfigDisableLocalFiles: true, - /** The following property can be used to verify websocket connection attempts. + /** The following property can be used to verify WebSocket connection attempts. * This allows, for example, the HTTP request headers to be checked to ensure * they include valid authentication information. */ From 8d240ca797e19a837aa992437f875882722b1bf0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 23 Jan 2023 17:44:03 +0000 Subject: [PATCH 102/108] Rename package var to avoid strict more error Fixes #4017 --- .../@node-red/registry/lib/localfilesystem.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/registry/lib/localfilesystem.js b/packages/node_modules/@node-red/registry/lib/localfilesystem.js index edb805572..0c231552f 100644 --- a/packages/node_modules/@node-red/registry/lib/localfilesystem.js +++ b/packages/node_modules/@node-red/registry/lib/localfilesystem.js @@ -106,8 +106,8 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) { // when loading local files, if the path is a valid node-red module // dont include it (will be picked up in scanTreeForNodesModules) if(skipValidNodeRedModules && files.indexOf("package.json") >= 0) { - const package = getPackageDetails(dir) - if(package.isNodeRedModule) { + const packageDetails = getPackageDetails(dir) + if(packageDetails.isNodeRedModule) { return {files: [], icons: []}; } } @@ -135,17 +135,17 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) { return {files: result, icons: icons} } -function scanDirForNodesModules(dir,moduleName,package) { +function scanDirForNodesModules(dir,moduleName,packageDetails) { let results = []; let scopeName; let files try { let isNodeRedModule = false - if(package) { - dir = path.join(package.moduleDir,'..') - files = [path.basename(package.moduleDir)] - moduleName = (package.package ? package.package.name : null) || moduleName - isNodeRedModule = package.isNodeRedModule + if(packageDetails) { + dir = path.join(packageDetails.moduleDir,'..') + files = [path.basename(packageDetails.moduleDir)] + moduleName = (packageDetails.package ? packageDetails.package.name : null) || moduleName + isNodeRedModule = packageDetails.isNodeRedModule } else { files = fs.readdirSync(dir); if (moduleName) { @@ -159,8 +159,8 @@ function scanDirForNodesModules(dir,moduleName,package) { // if we have found a package.json, this IS a node_module, lets see if it is a node-red node if (!isNodeRedModule && files.indexOf('package.json') > -1) { - package = getPackageDetails(dir) // get package details - if(package && package.isNodeRedModule) { + packageDetails = getPackageDetails(dir) // get package details + if(packageDetails && packageDetails.isNodeRedModule) { isNodeRedModule = true files = ['package.json'] // shortcut the file scan } @@ -179,8 +179,8 @@ function scanDirForNodesModules(dir,moduleName,package) { } else { if ((isNodeRedModule || (!moduleName || fn == moduleName)) && (isIncluded(fn) && !isExcluded(fn))) { try { - const moduleDir = isNodeRedModule ? package.moduleDir : path.join(dir,fn); - const pkg = package || getPackageDetails(moduleDir) + const moduleDir = isNodeRedModule ? packageDetails.moduleDir : path.join(dir,fn); + const pkg = packageDetails || getPackageDetails(moduleDir) if(pkg.error) { throw pkg.error } From 0346294c590b2c273bf2acf98de89177d0403658 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 23 Jan 2023 17:50:50 +0000 Subject: [PATCH 103/108] Rename package var --- .../storage/localfilesystem/projects/defaultFileSet.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/defaultFileSet.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/defaultFileSet.js index 04b95e3e0..186c6d781 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/defaultFileSet.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/defaultFileSet.js @@ -18,7 +18,7 @@ var i18n = require("@node-red/util").i18n; module.exports = { "package.json": function(project) { - var package = { + var packageDetails = { "name": project.name, "description": project.summary||i18n._("storage.localfilesystem.projects.summary"), "version": "0.0.1", @@ -30,11 +30,11 @@ module.exports = { }; if (project.files) { if (project.files.flow) { - package['node-red'].settings.flowFile = project.files.flow; - package['node-red'].settings.credentialsFile = project.files.credentials; + packageDetails['node-red'].settings.flowFile = project.files.flow; + packageDetails['node-red'].settings.credentialsFile = project.files.credentials; } } - return JSON.stringify(package,"",4); + return JSON.stringify(packageDetails,"",4); }, "README.md": function(project) { var content = project.name+"\n"+("=".repeat(project.name.length))+"\n\n"; From c7017ee84b47fc458f71f4ef5d7b27bfae398b36 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 23 Jan 2023 20:42:25 +0000 Subject: [PATCH 104/108] Allow Inject node to work with async context stores Fixes #4014 --- .../@node-red/nodes/core/common/20-inject.js | 77 ++++++++++++------- 1 file changed, 48 insertions(+), 29 deletions(-) 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 734bce765..3f2992cd5 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 @@ -95,45 +95,64 @@ module.exports = function(RED) { } this.on("input", function(msg, send, done) { - var errors = []; - var props = this.props; + const errors = []; + let props = this.props; if (msg.__user_inject_props__ && Array.isArray(msg.__user_inject_props__)) { props = msg.__user_inject_props__; } delete msg.__user_inject_props__; - props.forEach(p => { - var property = p.p; - var value = p.v ? p.v : ''; - var valueType = p.vt ? p.vt : 'str'; + props = [...props] + function evaluateProperty(doneEvaluating) { + if (props.length === 0) { + doneEvaluating() + return + } + const p = props.shift() + const property = p.p; + const value = p.v ? p.v : ''; + const valueType = p.vt ? p.vt : 'str'; - if (!property) return; - - if (valueType === "jsonata") { - 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); + if (property) { + if (valueType === "jsonata") { + 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) { + errors.push(err.message); + } } - catch (err) { - errors.push(err.message); + evaluateProperty(doneEvaluating) + } else { + try { + RED.util.evaluateNodeProperty(value, valueType, node, msg, (err, newValue) => { + if (err) { + errors.push(err.toString()) + } else { + RED.util.setMessageProperty(msg,property,newValue,true); + } + evaluateProperty(doneEvaluating) + }) + } catch (err) { + errors.push(err.toString()); + evaluateProperty(doneEvaluating) } } - return; + } else { + evaluateProperty(doneEvaluating) } - try { - RED.util.setMessageProperty(msg,property,RED.util.evaluateNodeProperty(value, valueType, this, msg),true); - } catch (err) { - errors.push(err.toString()); - } - }); - - if (errors.length) { - done(errors.join('; ')); - } else { - send(msg); - done(); } + + evaluateProperty(() => { + if (errors.length) { + done(errors.join('; ')); + } else { + send(msg); + done(); + } + }) }); } From ffff8aeb910010f31ff09bd3b07e2ddcb6045454 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 26 Jan 2023 02:11:34 +0900 Subject: [PATCH 105/108] Fix disabled menu in project feature --- packages/node_modules/@node-red/editor-client/src/js/red.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 7544434b7..497a93c45 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -321,6 +321,8 @@ var RED = (function() { loader.end() RED.notify($("

").text(message)); RED.sidebar.info.refresh() + RED.menu.setDisabled('menu-item-projects-open',false); + RED.menu.setDisabled('menu-item-projects-settings',false); }); }); return; From fd42becbdcb6546351474c4966b189d3ced68c3c Mon Sep 17 00:00:00 2001 From: weibin Date: Mon, 30 Jan 2023 23:02:42 +0800 Subject: [PATCH 106/108] fix .red-ui-notification if flows stopped due to missing too much node types manage-project-dep button display none. --- .../@node-red/editor-client/src/sass/notifications.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss index efae432b2..7d7544e2e 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss @@ -32,7 +32,8 @@ color: var(--red-ui-primary-text-color); border: 1px solid var(--red-ui-notification-border-default); border-left-width: 16px; - overflow: hidden; + overflow: scroll; + max-height: 80vh; .ui-dialog-buttonset { margin-top: 20px; margin-bottom: 10px; From 5bda221f9dcae1e715852fe6217086a226b75790 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Tue, 31 Jan 2023 00:36:18 +0900 Subject: [PATCH 107/108] Use main branch as default in project feature --- .../lib/storage/localfilesystem/projects/git/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js index 8aabcebe2..77b9ad2cd 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js @@ -421,7 +421,10 @@ module.exports = { }); }, initRepo: function(cwd) { - return runGitCommand(["init"],cwd); + var args = ["init", "--initial-branch", "main"]; + return runGitCommand(args, cwd).catch(function () { + return runGitCommand(["init"], cwd); + }); }, setUpstream: function(cwd,remoteBranch) { var args = ["branch","--set-upstream-to",remoteBranch]; From 0f7a1a42e43a6fac1833e65c7de049978e9e2564 Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Wed, 1 Feb 2023 17:50:05 -0500 Subject: [PATCH 108/108] Fix border radius on Modules list header --- .../node_modules/@node-red/nodes/core/function/10-function.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index 43f8c7b39..e17f58aca 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -17,6 +17,8 @@ display: flex; background: var(--red-ui-tertiary-background); padding-right: 75px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } #node-input-libs-container-row .red-ui-editableList-header > div { flex-grow: 1;