From bed26b716bfca7e3bb8ea3569d9ac4814f89d485 Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Wed, 4 Mar 2026 11:35:57 -0500 Subject: [PATCH 01/10] Remove IE7 CSS hacks --- .../@node-red/editor-client/src/sass/forms.scss | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/forms.scss b/packages/node_modules/@node-red/editor-client/src/sass/forms.scss index 3fa8bcc65..04dc78e5b 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/forms.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/forms.scss @@ -38,7 +38,6 @@ button, div[contenteditable="true"], input { - *overflow: visible; line-height: normal; } @@ -452,7 +451,6 @@ .input-prepend .uneditable-input { position: relative; margin-bottom: 0; - *margin-left: 0; vertical-align: top; border-radius: 0 4px 4px 0; } @@ -612,10 +610,8 @@ .form-inline .input-append, .form-horizontal .input-append { display: inline-block; - *display: inline; margin-bottom: 0; vertical-align: middle; - *zoom: 1; } .form-search .hide, @@ -667,7 +663,6 @@ .form-horizontal .control-group { margin-bottom: 20px; - *zoom: 1; } .form-horizontal .control-group:before, @@ -689,14 +684,7 @@ } .form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; margin-left: 180px; - *margin-left: 0; - } - - .form-horizontal .controls:first-child { - *padding-left: 180px; } .form-horizontal .help-block { From 9023c723c54a55db842b6ddf134c74abaa816d2d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 5 Mar 2026 11:35:17 +0000 Subject: [PATCH 02/10] Update tar/multer deps --- package-lock.json | 36 +++++++------------ package.json | 4 +-- .../@node-red/editor-api/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 2 +- .../@node-red/registry/package.json | 2 +- 5 files changed, 18 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28a2951cc..498744409 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "moment": "2.30.1", "moment-timezone": "0.5.48", "mqtt": "5.15.0", - "multer": "2.0.2", + "multer": "2.1.1", "mustache": "4.2.0", "node-red-admin": "^4.1.3", "node-watch": "0.7.4", @@ -59,7 +59,7 @@ "raw-body": "3.0.0", "rfdc": "1.4.1", "semver": "7.7.4", - "tar": "7.5.9", + "tar": "7.5.10", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -7802,33 +7802,22 @@ "license": "MIT" }, "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.6.0", "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" + "type-is": "^1.6.18" }, "engines": { "node": ">= 10.16.0" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mustache": { @@ -10928,9 +10917,9 @@ "dev": true }, "node_modules/tar": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -11746,6 +11735,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4" diff --git a/package.json b/package.json index 644ac4fbd..e80ec3b1b 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "moment": "2.30.1", "moment-timezone": "0.5.48", "mqtt": "5.15.0", - "multer": "2.0.2", + "multer": "2.1.1", "mustache": "4.2.0", "node-red-admin": "^4.1.3", "node-watch": "0.7.4", @@ -76,7 +76,7 @@ "raw-body": "3.0.0", "rfdc": "1.4.1", "semver": "7.7.4", - "tar": "7.5.9", + "tar": "7.5.10", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 8ecd4de83..05ebb30fc 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -26,7 +26,7 @@ "express": "4.22.1", "memorystore": "1.6.7", "mime": "3.0.0", - "multer": "2.0.2", + "multer": "2.1.1", "mustache": "4.2.0", "oauth2orize": "1.12.0", "passport-http-bearer": "1.0.1", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 2abf14d3f..3750b9523 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -36,7 +36,7 @@ "js-yaml": "4.1.1", "media-typer": "1.1.0", "mqtt": "5.15.0", - "multer": "2.0.2", + "multer": "2.1.1", "mustache": "4.2.0", "node-watch": "0.7.4", "on-headers": "1.1.0", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index e48b00a75..efabe9a12 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -20,7 +20,7 @@ "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.4", - "tar": "7.5.9", + "tar": "7.5.10", "uglify-js": "3.19.3" } } From 60656d7f61ab02c38d2fb65dcf90dfb2e2299f11 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 5 Mar 2026 15:26:32 +0000 Subject: [PATCH 03/10] Do not cache subflow colors as each subflow can have its own --- .../node_modules/@node-red/editor-client/src/js/ui/utils.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index 436cd3221..a70b36136 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -1309,6 +1309,9 @@ RED.utils = (function() { function getNodeColor(type, def) { def = def || {}; + if (type === 'subflow') { + return def.color + } if (!nodeColorCache.hasOwnProperty(type)) { const paletteTheme = RED.settings.theme('palette.theme') || []; if (paletteTheme.length > 0) { From 47afd1b3459814513dc6246b5800362d47ad312c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 5 Mar 2026 15:39:44 +0000 Subject: [PATCH 04/10] Bump i18next version --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 498744409..187d1f58a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "hash-sum": "2.0.0", "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", - "i18next": "24.2.3", + "i18next": "25.8.14", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "4.1.1", @@ -5642,9 +5642,9 @@ "license": "MIT" }, "node_modules/i18next": { - "version": "24.2.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", - "integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==", + "version": "25.8.14", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.14.tgz", + "integrity": "sha512-paMUYkfWJMsWPeE/Hejcw+XLhHrQPehem+4wMo+uELnvIwvCG019L9sAIljwjCmEMtFQQO3YeitJY8Kctei3iA==", "funding": [ { "type": "individual", @@ -5661,7 +5661,7 @@ ], "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.10" + "@babel/runtime": "^7.28.4" }, "peerDependencies": { "typescript": "^5" diff --git a/package.json b/package.json index e80ec3b1b..1bd14bf74 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "hash-sum": "2.0.0", "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", - "i18next": "24.2.3", + "i18next": "25.8.14", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "4.1.1", From 1ae8820e2679961d860c41f079c790b983543d24 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 5 Mar 2026 15:43:16 +0000 Subject: [PATCH 05/10] Update package --- packages/node_modules/@node-red/util/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 574381ac4..1024ab815 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -17,7 +17,7 @@ "dependencies": { "chalk": "^4.1.2", "fs-extra": "11.3.0", - "i18next": "24.2.3", + "i18next": "25.8.14", "json-stringify-safe": "5.0.1", "jsonata": "2.0.6", "lodash.clonedeep": "^4.5.0", From 98a48d6b3aea4b964c0f3eda4ad99423a487cadc Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 5 Mar 2026 16:16:45 +0000 Subject: [PATCH 06/10] Set showSupportNotice option on i18n --- packages/node_modules/@node-red/util/lib/i18n.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/util/lib/i18n.js b/packages/node_modules/@node-red/util/lib/i18n.js index 7207d4990..2f68cea10 100644 --- a/packages/node_modules/@node-red/util/lib/i18n.js +++ b/packages/node_modules/@node-red/util/lib/i18n.js @@ -160,6 +160,7 @@ function init(settings) { initPromise = new Promise((resolve,reject) => { i18n.use(MessageFileLoader); var opt = { + showSupportNotice: false, // debug: true, defaultNS: "runtime", ns: [], From 653d8a5b45183909cf22cb8d8cce9e0627e4998a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 6 Mar 2026 09:37:01 +0000 Subject: [PATCH 07/10] Allow palette.categories to be set via theme plugin --- .../node_modules/@node-red/editor-api/lib/editor/theme.js | 4 ++++ 1 file changed, 4 insertions(+) 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 05f4a9053..d3f158a23 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 @@ -198,6 +198,10 @@ async function loadThemePlugin () { } }) } + if (Array.isArray(themePlugin.palette?.categories)) { + themeSettings.palette = themeSettings.palette || {}; + themeSettings.palette.categories = themePlugin.palette.categories; + } // These settings are not exposed under `editorTheme`, so we don't have a merge strategy for them // If they're defined in the theme plugin, they replace any settings.js values. From b95d65e4d8823d79e746dc3cc870fcbd44aa2d6f Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 6 Mar 2026 11:28:37 +0000 Subject: [PATCH 08/10] Do not block touch events on ports --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index c5ef6f5d3..1460697ab 100644 --- 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 @@ -3226,7 +3226,8 @@ RED.view = (function() { clearSuggestedFlow(); RED.contextMenu.hide(); evt = evt || d3.event; - if (evt.button !== 0) { + + if (!evt.touches && evt.button !== 0) { return; } if (mouse_mode === RED.state.SELECTING_NODE) { @@ -4082,7 +4083,7 @@ RED.view = (function() { d3.event.stopPropagation(); return; } - if (d3.event.button !== 0) { + if (!d3.event.touches && d3.event.button !== 0) { return } mousedown_link = d; From 9933617eeab3905ce97608efbddecb7322e89826 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 6 Mar 2026 11:35:20 +0000 Subject: [PATCH 09/10] Suppress i18n notice in frontend --- packages/node_modules/@node-red/editor-client/src/js/i18n.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/i18n.js b/packages/node_modules/@node-red/editor-client/src/js/i18n.js index e5b479ea5..631be51ac 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/i18n.js +++ b/packages/node_modules/@node-red/editor-client/src/js/i18n.js @@ -27,6 +27,7 @@ RED.i18n = (function() { apiRootUrl = options.apiRootUrl||""; var preferredLanguage = localStorage.getItem("editor-language") || detectLanguage(); var opts = { + showSupportNotice: false, backend: { loadPath: apiRootUrl+'locales/__ns__?lng=__lng__', }, From aa52779a8cf147a7846f9948a284afd59374efac Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 6 Mar 2026 11:41:51 +0000 Subject: [PATCH 10/10] Bump for 4.1.7 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 4 ++-- package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 10 files changed, 30 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48b1d684f..97f6c618e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +#### 4.1.7: Maintenance Release + + - Do not block touch events on ports (#5527) @knolleary + - Allow palette.categories to be set via theme plugin (#5526) @knolleary + - Bump i18next version (#5519) @knolleary + - Suppress i18n notice in frontend (#5528) @knolleary + - Set showSupportNotice option on i18n (#5520) @knolleary + - Do not cache subflow colors as each subflow can have its own (#5518) @knolleary + - Update tar/multer deps (#5515) @knolleary + - Remove IE7 CSS hacks (#5511) @bonanitech + #### 4.1.6: Maintenance Release - Allow palette.theme to be set via theme plugin and include icons (#5500) @knolleary diff --git a/package-lock.json b/package-lock.json index 187d1f58a..ad5e7301c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red", - "version": "4.1.6", + "version": "4.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red", - "version": "4.1.6", + "version": "4.1.7", "license": "Apache-2.0", "dependencies": { "acorn": "8.16.0", diff --git a/package.json b/package.json index 1bd14bf74..768319c3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.6", + "version": "4.1.7", "description": "Low-code programming for event-driven applications", "homepage": "https://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 05ebb30fc..16aef623a 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": "4.1.6", + "version": "4.1.7", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.1.6", - "@node-red/editor-client": "4.1.6", + "@node-red/util": "4.1.7", + "@node-red/editor-client": "4.1.7", "bcryptjs": "3.0.3", "body-parser": "1.20.4", "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 e1ad69867..7529a3ed5 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": "4.1.6", + "version": "4.1.7", "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 3750b9523..15c03819e 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": "4.1.6", + "version": "4.1.7", "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 efabe9a12..b16a8fb1e 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": "4.1.6", + "version": "4.1.7", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "4.1.6", + "@node-red/util": "4.1.7", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.4", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index f9e30ee7d..da35cd07e 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": "4.1.6", + "version": "4.1.7", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.1.6", - "@node-red/util": "4.1.6", + "@node-red/registry": "4.1.7", + "@node-red/util": "4.1.7", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 1024ab815..52fb9ebec 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": "4.1.6", + "version": "4.1.7", "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 c68daf52c..1317b9f2a 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": "4.1.6", + "version": "4.1.7", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "4.1.6", - "@node-red/runtime": "4.1.6", - "@node-red/util": "4.1.6", - "@node-red/nodes": "4.1.6", + "@node-red/editor-api": "4.1.7", + "@node-red/runtime": "4.1.7", + "@node-red/util": "4.1.7", + "@node-red/nodes": "4.1.7", "basic-auth": "2.0.1", "bcryptjs": "3.0.3", "cors": "2.8.5",