From 32540dd0e6ef97a1e0de19afb31e0ef05460eded Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:16:53 +0200 Subject: [PATCH 01/30] Fix wrong unlock state when event is triggered --- .../@node-red/editor-client/src/js/ui/deploy.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index 25a67907c..e429c1586 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -589,6 +589,7 @@ RED.deploy = (function() { RED.notify('

' + RED._("deploy.successfulDeploy") + '

', "success"); } const flowsToLock = new Set() + // Node's properties cannot be modified if its workspace is locked. function ensureUnlocked(id) { const flow = id && (RED.nodes.workspace(id) || RED.nodes.subflow(id) || null); const isLocked = flow ? flow.locked : false; @@ -645,6 +646,9 @@ RED.deploy = (function() { RED.nodes.eachSubflow(function (subflow) { if (subflow.changed) { subflow.changed = false; + if (flowsToLock.has(subflow)) { + subflow.locked = true; + } RED.events.emit("subflows:change", subflow); } }); @@ -653,9 +657,13 @@ RED.deploy = (function() { ensureUnlocked(ws.z) ws.changed = false; delete ws.added + if (flowsToLock.has(ws)) { + ws.locked = true; + } RED.events.emit("flows:change", ws) } }); + // Ensures all workspaces/subflows to be locked have been locked. flowsToLock.forEach(flow => { flow.locked = true }) From 16c49306f35b389961ad7513bb2db792ec434bf2 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:01:44 +0200 Subject: [PATCH 02/30] Fix link call node can call out of a subflow --- .../node_modules/@node-red/editor-client/src/js/nodes.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 dacd6eeae..25e8c2185 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 @@ -2408,7 +2408,7 @@ RED.nodes = (function() { } // If importing a link node, ensure both ends of each link are either: // - not in a subflow - // - both in the same subflow + // - both in the same subflow (not for link call node) if (/^link /.test(n.type) && n.links) { n.links = n.links.filter(function(id) { const otherNode = node_map[id] || RED.nodes.node(id); @@ -2419,6 +2419,9 @@ RED.nodes = (function() { if (otherNode.z === n.z) { // Both ends in the same flow/subflow return true + } else if (n.type === "link call") { + // Link call node can call out of a subflow + return true } else if (!!getSubflow(n.z) || !!getSubflow(otherNode.z)) { // One end is in a subflow - remove the link return false From cec7a86b54a60a1408704877221f1543e1d19997 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 27 Sep 2024 09:42:07 +0100 Subject: [PATCH 03/30] Update dev dependencies --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 5c41a2999..6597530f2 100644 --- a/package.json +++ b/package.json @@ -86,10 +86,10 @@ "@node-rs/bcrypt": "1.10.4" }, "devDependencies": { - "dompurify": "2.4.1", + "dompurify": "2.5.7", "grunt": "1.6.1", "grunt-chmod": "~1.1.1", - "grunt-cli": "~1.4.3", + "grunt-cli": "~1.5.0", "grunt-concurrent": "3.0.0", "grunt-contrib-clean": "2.0.1", "grunt-contrib-compress": "2.0.0", @@ -100,7 +100,7 @@ "grunt-contrib-watch": "1.1.0", "grunt-jsdoc": "2.4.1", "grunt-jsdoc-to-markdown": "6.0.0", - "grunt-jsonlint": "2.1.3", + "grunt-jsonlint": "3.0.0", "grunt-mkdir": "~1.1.0", "grunt-npm-command": "~0.1.2", "grunt-sass": "~3.1.0", @@ -114,7 +114,7 @@ "minami": "1.2.3", "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.3", - "nodemon": "2.0.20", + "nodemon": "3.1.7", "proxy": "^1.0.2", "sass": "1.62.1", "should": "13.2.3", From 1053fc5121f97e1374df49353d235c21723503ff Mon Sep 17 00:00:00 2001 From: Daniel Caspi Date: Fri, 27 Sep 2024 04:35:51 -0500 Subject: [PATCH 04/30] fix typo: depreciated --- .../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 bc89992e2..d26f0f56b 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 @@ -456,7 +456,7 @@ "staticTopic": "Subscribe to single topic", "dynamicTopic": "Dynamic subscription", "auto-connect": "Connect automatically", - "auto-mode-depreciated": "This option is depreciated. Please use the new auto-detect mode.", + "auto-mode-depreciated": "This option is deprecated. Please use the new auto-detect mode.", "none": "none", "other": "other" }, From e3acc49d5e0aee41c8bab84f34c49b4cf149fef4 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 1 Oct 2024 16:31:28 +0100 Subject: [PATCH 05/30] Allow msg.userProperties to have number values fixes #4899 --- .../node_modules/@node-red/nodes/core/network/10-mqtt.js | 5 ++++- 1 file changed, 4 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 db6cfba73..bc6f9644d 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 @@ -158,9 +158,12 @@ module.exports = function(RED) { if(!keys || !keys.length) return null; keys.forEach(key => { let val = srcUserProperties[key]; - if(typeof val == "string") { + if(typeof val === "string") { count++; _clone[key] = val; + } else if (typeof val === "number") { + count++; + _clone[key] = val.toString(); } }); if(count) properties.userProperties = _clone; From 7650620a7875173152f68b1734748e376b8e7800 Mon Sep 17 00:00:00 2001 From: Joe Bordes Date: Fri, 4 Oct 2024 18:06:01 +0200 Subject: [PATCH 06/30] i18n(App) update with latest language file changes --- .../editor-client/locales/es-ES/editor.json | 55 ++++++- .../nodes/locales/es-ES/messages.json | 141 ++++++++++-------- .../nodes/locales/es-ES/network/31-tcpin.html | 2 + .../nodes/locales/es-ES/parsers/70-CSV.html | 5 +- .../runtime/locales/es-ES/runtime.json | 1 + 5 files changed, 133 insertions(+), 71 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json b/packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json index 2655dfe27..eb2ef79d2 100644 --- a/packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/es-ES/editor.json @@ -27,7 +27,8 @@ "lock": "Bloquear", "unlock": "Desbloquear", "locked": "Bloqueado", - "unlocked": "Desbloqueado" + "unlocked": "Desbloqueado", + "format": "Formato" }, "type": { "string": "texto", @@ -303,7 +304,8 @@ "missingType": "La entrada no es un flujo válido - elemento __index__ falta la propiedad 'type'" }, "conflictNotification1": "Algunos de los nodos que estás importando ya existen en tu espacio de trabajo.", - "conflictNotification2": "Selecciona qué nodos importar y si reemplazar los nodos existentes o importar una copia de los mismos." + "conflictNotification2": "Selecciona qué nodos importar y si reemplazar los nodos existentes o importar una copia de los mismos.", + "alreadyExists": "Este nodo ya existe" }, "copyMessagePath": "Ruta copiada", "copyMessageValue": "Valor copiado", @@ -371,8 +373,12 @@ "deleted": "eliminado", "flowDeleted": "flujo eliminado", "flowAdded": "flujo añadido", + "moved": "movido", "movedTo": "movido a __id__", - "movedFrom": "movido desde __id__" + "movedFrom": "movido desde __id__", + "none": "ninguno", + "position": "posición", + "wires": "conectores" }, "nodeCount": "__count__ nodo", "nodeCount_plural": "__count__ nodos", @@ -381,9 +387,14 @@ "reviewChanges": "Revisar Cambios", "noBinaryFileShowed": "No se puede mostrar el contenido del archivo binario", "viewCommitDiff": "Ver cambios de commit", + "commit": "Commit", "compareChanges": "Comparar Cambios", "saveConflict": "Guardar resolución de conflictos", "conflictHeader": "__resolved__ de __unresolved__ conflictos resueltos", + "localChanges": "Cambios Locales", + "remoteChanges": "Cambios Remotos", + "useLocalChanges": "utilizar cambios locales", + "useRemoteChanges": "utilizar cambios remotos", "commonVersionError": "La versión común no contiene JSON válido:", "oldVersionError": "La versión anterior no contiene JSON válido:", "newVersionError": "La versión nueva no contiene JSON válido:" @@ -551,7 +562,9 @@ "types": { "local": "Local", "examples": "Ejemplos" - } + }, + "type": "Tipo", + "name": "Nombre" }, "palette": { "noInfo": "no hay información disponible", @@ -613,6 +626,8 @@ }, "nodeCount": "__label__ nodo", "nodeCount_plural": "__label__ nodos", + "pluginCount": "__count__ extensión", + "pluginCount_plural": "__count__ extensiones", "moduleCount": "__count__ módulo disponible", "moduleCount_plural": "__count__ módulos disponibles", "inuse": "en uso", @@ -640,6 +655,7 @@ "errors": { "catalogLoadFailed": "

La carga del catálogo de nodos ha fallado

Revise la consola del navegador para mas información

", "installFailed": "

Fallo al instalar: __module__

__message__

Revise el log para mas información

", + "installTimeout": "

La instalación continúa en segundo plano.

Los nodos aparecerán en la paleta cuando finalice. Consulta el registro para obtener más información.

", "removeFailed": "

Fallo al eliminar: __module__

__message__

Revise el log para mas información

", "updateFailed": "

Fallo al actualizar: __module__

__message__

Revise el log para mas información

", "enableFailed": "

Fallo al activar: __module__

__message__

Revise el log para mas información

", @@ -654,6 +670,9 @@ "body":"

Eliminando '__module__'

La eliminación del nodo lo desinstalará de Node-RED. Es posible que el nodo siga utilizando recursos hasta que Node-RED sea reiniciado.

", "title": "Eliminar nodos" }, + "removePlugin": { + "body": "

Extensión __module__ eliminada. Vuelve a cargar el editor para borrar los elementos sobrantes.

" + }, "update": { "body":"

Actualizando '__module__'

La actualización del nodo requerirá un reinicio manual de Node-RED para completarse. Debe ser reiniciado manualmente.

", "title": "Actualizar nodos" @@ -665,7 +684,8 @@ "review": "Abrir información del nodo", "install": "Instalar", "remove": "Eliminar", - "update": "Actualizar" + "update": "Actualizar", + "understood": "Entendido" } } } @@ -718,6 +738,7 @@ "nodeHelp": "Ayuda de nodo", "showHelp": "Mostrar ayuda", "showInOutline": "Mostrar en controno", + "hideTopics": "Esconder temas", "showTopics": "Mostrar temas", "noHelp": "No hay ningun tema de ayuda seleccionado", "changeLog": "Registro de Cambios" @@ -792,6 +813,7 @@ "branches": "Ramas", "noBranches": "Sin ramas", "deleteConfirm": "¿Estás seguro de que quieres eliminar la rama local '__name__'? Esta acción no puede deshacerse.", + "deleteBranch": "Eliminar rama", "unmergedConfirm": "La rama local '__name__' tiene cambios no fusionados que se perderán. ¿Estás seguro de que quieres eliminarla?", "deleteUnmergedBranch": "Eliminar rama no fusionada", "gitRemotes": "Git remotes", @@ -913,6 +935,8 @@ } }, "typedInput": { + "selected": "__count__ seleccionado", + "selected_plural": "__count__ seleccionados", "type": { "str": "texto", "num": "número", @@ -923,7 +947,14 @@ "date": "marca tiempo", "jsonata": "expresión", "env": "variable de entorno", - "cred": "credencial" + "cred": "credencial", + "conf-types": "nodo configuración" + }, + "date": { + "format": { + "timestamp": "milisegundos desde epoch", + "object": "Objeto de fecha de JavaScript" + } } }, "editableList": { @@ -1205,6 +1236,18 @@ "diagnostics": { "title": "Información Sistema" }, + "languages": { + "de": "Deutsch", + "en-US": "English", + "es-ES": "Español (España)", + "fr": "Français", + "ja": "日本語", + "ko": "Korean", + "pt-BR": "Português (Brasil)", + "ru": "Русский", + "zh-CN": "简体中文", + "zh-TW": "繁體中文" + }, "validator": { "errors": { "invalid-json": "Datos JSON inválidos: __error__", diff --git a/packages/node_modules/@node-red/nodes/locales/es-ES/messages.json b/packages/node_modules/@node-red/nodes/locales/es-ES/messages.json index b8ac84f1c..19427e2fc 100644 --- a/packages/node_modules/@node-red/nodes/locales/es-ES/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/es-ES/messages.json @@ -513,15 +513,15 @@ "method": "Método", "url": "URL", "doc": "Docs", - "return": "Return", - "upload": "Accept file uploads?", - "status": "Status code", - "headers": "Headers", + "return": "Devolver", + "upload": "¿Aceptar cargas de archivos?", + "status": "Código de estado", + "headers": "Encabezados", "other": "otro", "paytoqs": { - "ignore": "Ignore", - "query": "Append to query-string parameters", - "body": "Send as request body" + "ignore": "Ignorar", + "query": "Agregar a los parámetros de la cadena de consulta", + "body": "Enviar como cuerpo de la solicitud" }, "utf8String": "texto UTF8", "binaryBuffer": "buffer binario", @@ -529,45 +529,45 @@ "authType": "Tipo", "bearerToken": "Token" }, - "setby": "- set by msg.method -", - "basicauth": "Use authentication", - "use-tls": "Enable secure (SSL/TLS) connection", - "tls-config": "TLS Configuration", - "basic": "basic authentication", - "digest": "digest authentication", - "bearer": "bearer authentication", - "use-proxy": "Use proxy", - "persist": "Enable connection keep-alive", - "proxy-config": "Proxy Configuration", - "use-proxyauth": "Use proxy authentication", - "noproxy-hosts": "Ignore hosts", - "senderr": "Only send non-2xx responses to Catch node", - "utf8": "a UTF-8 string", - "binary": "a binary buffer", - "json": "a parsed JSON object", + "setby": "- establecido por msg.method -", + "basicauth": "Usar autenticación", + "use-tls": "Habilitar conexión segura (SSL/TLS)", + "tls-config": "Configuración TLS", + "basic": "autenticación básica", + "digest": "autenticación digest", + "bearer": "autenticación bearer", + "use-proxy": "Usar proxy", + "persist": "Habilitar conexión activa (keep-alive)", + "proxy-config": "Configuración Proxy", + "use-proxyauth": "Usar autenticación de proxy", + "noproxy-hosts": "Ignorar hosts", + "senderr": "Enviar solo respuestas que no sean 2xx al nodo Catch", + "utf8": "una cadena UTF-8", + "binary": "un búfer binario", + "json": "un objeto JSON analizado", "tip": { - "in": "The url will be relative to ", - "res": "The messages sent to this node must originate from an http input node", + "in": "La URL será relativa a ", + "res": "Los mensajes enviados a este nodo deben originarse desde un nodo de http input", "req": "Tip: If the JSON parse fails the fetched string is returned as-is." }, - "httpreq": "http request", + "httpreq": "solicitud http", "errors": { - "not-created": "Cannot create http-in node when httpNodeRoot set to false", - "missing-path": "missing path", - "no-response": "No response object", - "json-error": "JSON parse error", - "no-url": "No url specified", - "deprecated-call": "Deprecated call to __method__", - "invalid-transport": "non-http transport requested", - "timeout-isnan": "Timeout value is not a valid number, ignoring", - "timeout-isnegative": "Timeout value is negative, ignoring", - "invalid-payload": "Invalid payload", - "invalid-url": "Invalid url" + "not-created": "No se puede crear el nodo http-in cuando httpNodeRoot está establecido en falso", + "missing-path": "falta la ruta", + "no-response": "No hay objeto de respuesta", + "json-error": "Error de análisis en JSON", + "no-url": "No se especificó ninguna URL", + "deprecated-call": "Llamada obsoleta a __method__", + "invalid-transport": "protocolo no-http solicitado", + "timeout-isnan": "El valor de tiempo de espera no es un número válido, se ignora", + "timeout-isnegative": "El valor de tiempo de espera es negativo, se ignora", + "invalid-payload": "payload Invalido", + "invalid-url": "URL Inválida" }, "status": { - "requesting": "requesting" + "requesting": "solicitando" }, - "insecureHTTPParser": "Disable strict HTTP parsing" + "insecureHTTPParser": "Deshabilitar el análisis estricto de HTTP" }, "websocket": { "label": { @@ -576,41 +576,42 @@ "url": "URL", "subprotocol": "Subprotocolo" }, - "listenon": "Listen on", - "connectto": "Connect to", - "sendrec": "Send/Receive", + "listenon": "Escuchar", + "connectto": "Conectar a", + "sendrec": "Enviar/Recibir", "payload": "payload", - "message": "entire message", - "sendheartbeat": "Send heartbeat", + "message": "mensaje completo", + "sendheartbeat": "Enviar latido", "tip": { - "path1": "By default, payload will contain the data to be sent over, or received from a websocket. The listener can be configured to send or receive the entire message object as a JSON formatted string.", - "path2": "This path will be relative to __path__.", - "url1": "URL should use ws:// or wss:// scheme and point to an existing websocket listener.", - "url2": "By default, payload will contain the data to be sent over, or received from a websocket. The client can be configured to send or receive the entire message object as a JSON formatted string." + "path1": "De manera predeterminada, payload contendrá los datos que se enviarán o recibirán de un websocket. El receptor puede configurarse para enviar o recibir el objeto de mensaje completo como una cadena en formato JSON.", + "path2": "Esta ruta será relativa a __path__.", + "url1": "La URL debe usar el esquema ws:// o wss:// y apuntar a un receptor de websocket existente.", + "url2": "De manera predeterminada, payload contendrá los datos que se enviarán o recibirán de un websocket. El cliente puede configurarse para enviar o recibir el objeto de mensaje completo como una cadena en formato JSON", + "headers": "Los encabezados solo se envían durante el mecanismo de actualización del protocolo, de HTTP al protocolo WS/WSS." }, "status": { - "connected": "connected __count__", - "connected_plural": "connected __count__" + "connected": "__count__ conectado", + "connected_plural": "__count__ conectados" }, "errors": { - "connect-error": "An error occurred on the ws connection: ", - "send-error": "An error occurred while sending: ", - "missing-conf": "Missing server configuration", - "duplicate-path": "Cannot have two WebSocket listeners on the same path: __path__", - "missing-server": "Missing server configuration", - "missing-client": "Missing client configuration" + "connect-error": "Se produjo un error en la conexión ws:", + "send-error": "Se produjo un error al enviar: ", + "missing-conf": "Falta la configuración del servidor", + "duplicate-path": "No se pueden tener dos escuchas de WebSocket en la misma ruta: __path__", + "missing-server": "Falta la configuración del servidor", + "missing-client": "Falta la configuración del cliente" } }, "watch": { - "watch": "watch", + "watch": "observar", "label": { - "files": "File(s)", - "recursive": "Watch sub-directories recursively" + "files": "Fichero(s)", + "recursive": "Observar subdirectorios recursivamente" }, "placeholder": { - "files": "Comma-separated list of files and/or directories" + "files": "Lista de archivos y/o directorios separados por comas" }, - "tip": "On Windows you must use double back-slashes \\\\ in any directory names." + "tip": "En Windows, debes utilizar barras invertidas dobles \\\\ en cualquier nombre de directorio." }, "tcpin": { "label": { @@ -849,7 +850,13 @@ "newline": "Nueva línea", "usestrings": "analizar valores numéricos", "include_empty_strings": "incluir cadenas vacías", - "include_null_values": "incluir valores nulos" + "include_null_values": "incluir valores nulos", + "spec": "Analizador" + }, + "spec": { + "rfc": "RFC4180", + "legacy": "Legado", + "legacy_warning": "El modo legado se eliminará en una versión futura." }, "placeholder": { "columns": "nombres de columnas separados por comas" @@ -878,6 +885,7 @@ "once": "enviar encabezados una vez, hasta msg.reset" }, "errors": { + "bad_template": "Plantilla de columnas mal formada.", "csv_js": "Este nodo solo maneja cadenas CSV u objetos JS.", "obj_csv": "No se ha especificado ninguna plantilla de columnas para el objeto -> CSV.", "bad_csv": "Datos CSV con formato incorrecto: la salida probablemente esté corrupta." @@ -887,12 +895,14 @@ "label": { "select": "Selector", "output": "Salida", - "in": "en" + "in": "en", + "prefix": "Nombre de la propiedad para el contenido HTML" }, "output": { "html": "el contenido HTML de los elementos", "text": "sólo el contenido textual de los elementos", - "attr": "un objeto de cualquier atributo de los elementos" + "attr": "un objeto de cualquier atributo de los elementos", + "compl": "un objeto de cualquier atributo de los elementos y contenidos html" }, "format": { "single": "como un mensaje único que contiene una matriz", @@ -1007,6 +1017,7 @@ "objectSend": "Enviar un mensaje para cada par clave/valor", "strBuff": "Texto / Buffer", "array": "Array", + "splitThe": "Dividir el", "splitUsing": "Dividir usando", "splitLength": "Longitud fija de", "stream": "Manejar como un flujo de mensajes", @@ -1036,6 +1047,7 @@ "joinedUsing": "se unió usando", "send": "Enviar el mensaje:", "afterCount": "Después de varias partes del mensaje", + "useparts": "Usar la propiedad msg.parts existente", "count": "contar", "subsequent": "y cada mensaje posterior.", "afterTimeout": "Después de un tiempo de espera trás el primer mensaje", @@ -1102,6 +1114,7 @@ "too-many": "demasiados mensajes pendientes en el nodo de lotes", "unexpected": "modo inesperado", "no-parts": "ninguna propiedad 'parte' en el mensaje", + "honourParts": "Permitir que msg.parts también complete la operación por lotes.", "error": { "invalid-count": "Recuento no válido", "invalid-overlap": "Solapamiento no válido", diff --git a/packages/node_modules/@node-red/nodes/locales/es-ES/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/es-ES/network/31-tcpin.html index 0d25594b4..d9e07902a 100644 --- a/packages/node_modules/@node-red/nodes/locales/es-ES/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/es-ES/network/31-tcpin.html @@ -24,12 +24,14 @@

Solo se envía el msg.payload.

Si msg.payload es una cadena que contiene una codificación Base64 de datos binarios, la opción de decodificación Base64 hará que se vuelva a convertir a binario antes de enviarse.

Si msg._session no está presente, la carga se envía a todos los clientes conectados.

+

En el modo Responder a, configurar msg.reset = true restablecerá la conexión especificada por _session.id, o todas las conexiones si no se especifica _session.id.

Nota: En algunos sistemas, es posible que necesites acceso raíz o de administrador para acceder a los puertos inferiores a 1024.

diff --git a/packages/node_modules/@node-red/nodes/locales/es-ES/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/es-ES/parsers/70-CSV.html index 5dbbb88f0..940c65dfb 100644 --- a/packages/node_modules/@node-red/nodes/locales/es-ES/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/locales/es-ES/parsers/70-CSV.html @@ -35,7 +35,9 @@

Detalles

-

La plantilla de columnas puede contener una lista ordenada de nombres de columnas. Al convertir CSV en un objeto, los nombres de las columnas se utilizarán como nombres de propiedades. Alternativamente, los nombres de las columnas se pueden tomar de la primera fila del CSV.

+

La plantilla de columnas puede contener una lista ordenada de nombres de columnas. Al convertir CSV en un objeto, los nombres de las columnas se utilizarán como nombres de propiedades. Alternativamente, los nombres de las columnas se pueden tomar de la primera fila del CSV. +

Cuando se selecciona el analizador RFC, la plantilla de columna debe ser compatible con RFC4180.

+

Al convertir a CSV, la plantilla de columnas se utiliza para identificar qué propiedades extraer del objeto y en qué orden.

Si la plantilla de columnas está en blanco, puede utilizar una lista simple de propiedades separadas por comas proporcionada en msg.columns para determinar qué extraer y en qué orden. Si ninguno de los dos está presente, todas las propiedades del objeto se muestran en el orden en que se encuentran en la primera fila.

Si la entrada es una matriz, entonces la plantilla de columnas solo se usa para generar opcionalmente una fila de títulos de columnas.

@@ -46,4 +48,5 @@

Si genera varios mensajes, tendrán su propiedad parts configurada y formarán una secuencia de mensajes completa.

Si el nodo está configurado para enviar encabezados de columna solo una vez, si se configura msg.reset en cualquier valor hará que el nodo reenvíe los encabezados.

Nota: la plantilla de columna debe estar separada por comas, incluso si se elige un separador diferente para los datos.

+

Nota: en el modo RFC, se generarán errores detectables para encabezados CSV mal formados y datos de carga útil de entrada no válidos

diff --git a/packages/node_modules/@node-red/runtime/locales/es-ES/runtime.json b/packages/node_modules/@node-red/runtime/locales/es-ES/runtime.json index 9fba64ad3..d1c2c44a9 100644 --- a/packages/node_modules/@node-red/runtime/locales/es-ES/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/es-ES/runtime.json @@ -25,6 +25,7 @@ "removing-modules": "Eliminando módulos de la configuración", "added-types": "Tipos de nodos añadidos:", "removed-types": "Tipos de nodos eliminados:", + "removed-plugins": "Extensiones eliminadas:", "install": { "invalid": "Nombre de módulo no válido", "installing": "Instalando módulo: __name__, versión: __version__", From bdb545d6ebd438189010ea55bd7ffba2c4a41bf8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 7 Oct 2024 16:30:38 +0100 Subject: [PATCH 07/30] Update dependencies --- package.json | 14 +++++++------- packages/node_modules/@node-red/nodes/package.json | 6 +++--- .../node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 6597530f2..952b95bc0 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "cheerio": "1.0.0-rc.10", "clone": "2.1.2", "content-type": "1.0.5", - "cookie": "0.6.0", + "cookie": "0.7.2", "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", @@ -45,7 +45,7 @@ "express-session": "1.18.0", "form-data": "4.0.0", "fs-extra": "11.2.0", - "got": "12.6.0", + "got": "12.6.1", "hash-sum": "2.0.0", "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", @@ -60,7 +60,7 @@ "memorystore": "1.6.7", "mime": "3.0.0", "moment": "2.30.1", - "moment-timezone": "0.5.45", + "moment-timezone": "0.5.46", "mqtt": "5.7.0", "multer": "1.4.5-lts.1", "mustache": "4.2.0", @@ -72,10 +72,10 @@ "passport": "0.7.0", "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", - "raw-body": "2.5.2", + "raw-body": "3.0.0", "rfdc": "^1.3.1", - "semver": "7.5.4", - "tar": "7.2.0", + "semver": "7.6.3", + "tar": "7.4.3", "tough-cookie": "^5.0.0", "uglify-js": "3.17.4", "uuid": "9.0.1", @@ -110,7 +110,7 @@ "jquery-i18next": "1.2.1", "jsdoc-nr-template": "github:node-red/jsdoc-nr-template", "marked": "4.3.0", - "mermaid": "^10.4.0", + "mermaid": "11.3.0", "minami": "1.2.3", "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.3", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index dcbb59b24..72179409c 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -22,13 +22,13 @@ "cheerio": "1.0.0-rc.10", "content-type": "1.0.5", "cookie-parser": "1.4.6", - "cookie": "0.6.0", + "cookie": "0.7.2", "cors": "2.8.5", "cronosjs": "1.7.1", "denque": "2.1.0", "form-data": "4.0.0", "fs-extra": "11.2.0", - "got": "12.6.0", + "got": "12.6.1", "hash-sum": "2.0.0", "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", @@ -40,7 +40,7 @@ "mustache": "4.2.0", "node-watch": "0.7.4", "on-headers": "1.0.2", - "raw-body": "2.5.2", + "raw-body": "3.0.0", "tough-cookie": "^5.0.0", "uuid": "9.0.1", "ws": "7.5.10", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 2515b19b7..7c6e8ebcc 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -19,8 +19,8 @@ "@node-red/util": "4.0.3", "clone": "2.1.2", "fs-extra": "11.2.0", - "semver": "7.5.4", - "tar": "7.2.0", + "semver": "7.6.3", + "tar": "7.4.3", "uglify-js": "3.17.4" } } diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index d747109dd..67ed9d88b 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -21,6 +21,6 @@ "jsonata": "2.0.5", "lodash.clonedeep": "^4.5.0", "moment": "2.30.1", - "moment-timezone": "0.5.45" + "moment-timezone": "0.5.46" } } diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index b6c767e9b..2f61e8468 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -42,7 +42,7 @@ "fs-extra": "11.2.0", "node-red-admin": "^4.0.1", "nopt": "5.0.0", - "semver": "7.5.4" + "semver": "7.6.3" }, "optionalDependencies": { "@node-rs/bcrypt": "1.10.4" From 3812ed5ed3cd7b51b074025ae8eacdda31e6762e Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Mon, 7 Oct 2024 21:13:13 +0200 Subject: [PATCH 08/30] Link call node cannot call a link in a subflow Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/nodes.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 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 25e8c2185..857068d4b 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 @@ -2419,12 +2419,13 @@ RED.nodes = (function() { if (otherNode.z === n.z) { // Both ends in the same flow/subflow return true - } else if (n.type === "link call") { - // Link call node can call out of a subflow - return true + } else if (n.type === "link call" && !!getSubflow(otherNode.z)) { + // Link call node can call out of a subflow as long as otherNode is + // not in a subflow + return false } else if (!!getSubflow(n.z) || !!getSubflow(otherNode.z)) { // One end is in a subflow - remove the link - return false + return false } return true }); From a0b4fc83726e647cfc2a6f6db2a529675d10785b Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 8 Oct 2024 13:58:29 +0100 Subject: [PATCH 09/30] Convert to string --- .../node_modules/@node-red/nodes/core/network/10-mqtt.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 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 bc6f9644d..2b4968483 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 @@ -161,9 +161,13 @@ module.exports = function(RED) { if(typeof val === "string") { count++; _clone[key] = val; - } else if (typeof val === "number") { + } else { count++; - _clone[key] = val.toString(); + try { + _clone[key] = JSON.stringify(val) + } catch (err) { + console.log('MQTT v5 Property value can not be converted to a String') + } } }); if(count) properties.userProperties = _clone; From d50ccea017e97552078a86324c76159957b66614 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 8 Oct 2024 16:51:09 +0100 Subject: [PATCH 10/30] Update packages/node_modules/@node-red/nodes/core/network/10-mqtt.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/nodes/core/network/10-mqtt.js | 6 +++--- 1 file changed, 3 insertions(+), 3 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 2b4968483..afa0066f4 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 @@ -161,12 +161,12 @@ module.exports = function(RED) { if(typeof val === "string") { count++; _clone[key] = val; - } else { - count++; + } else if (val !== undefined && val !== null) { try { _clone[key] = JSON.stringify(val) + count++; } catch (err) { - console.log('MQTT v5 Property value can not be converted to a String') + // Silently drop property } } }); From 49a3eded59e59b6dc1207fcd872233aa0cb2e701 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:10:28 +0200 Subject: [PATCH 11/30] Apply code review + add comments Co-authored-by: Nick O'Leary --- .../@node-red/editor-client/src/js/ui/deploy.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index e429c1586..ed503bcfe 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -591,6 +591,7 @@ RED.deploy = (function() { const flowsToLock = new Set() // Node's properties cannot be modified if its workspace is locked. function ensureUnlocked(id) { + // TODO: `RED.nodes.subflow` is useless const flow = id && (RED.nodes.workspace(id) || RED.nodes.subflow(id) || null); const isLocked = flow ? flow.locked : false; if (flow && isLocked) { @@ -643,27 +644,27 @@ RED.deploy = (function() { delete confNode.credentials; } }); + // Subflow cannot be locked RED.nodes.eachSubflow(function (subflow) { if (subflow.changed) { subflow.changed = false; - if (flowsToLock.has(subflow)) { - subflow.locked = true; - } RED.events.emit("subflows:change", subflow); } }); RED.nodes.eachWorkspace(function (ws) { if (ws.changed || ws.added) { - ensureUnlocked(ws.z) + // Ensure the Workspace is unlocked to modify its properties. + ensureUnlocked(ws.id); ws.changed = false; delete ws.added if (flowsToLock.has(ws)) { ws.locked = true; + flowsToLock.delete(ws); } RED.events.emit("flows:change", ws) } }); - // Ensures all workspaces/subflows to be locked have been locked. + // Ensures all workspaces to be locked have been locked. flowsToLock.forEach(flow => { flow.locked = true }) From a0033697ea435fdd69db51e8edb17439de5eba5a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 9 Oct 2024 10:25:35 +0100 Subject: [PATCH 12/30] Update cookie --- package.json | 6 +++--- packages/node_modules/@node-red/editor-api/package.json | 4 ++-- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/runtime/package.json | 2 +- packages/node_modules/node-red/package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 952b95bc0..229ede53d 100644 --- a/package.json +++ b/package.json @@ -37,12 +37,12 @@ "clone": "2.1.2", "content-type": "1.0.5", "cookie": "0.7.2", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", "cronosjs": "1.7.1", "denque": "2.1.0", - "express": "4.21.0", - "express-session": "1.18.0", + "express": "4.21.1", + "express-session": "1.18.1", "form-data": "4.0.0", "fs-extra": "11.2.0", "got": "12.6.1", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 59a265ca4..02d8cf673 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -22,8 +22,8 @@ "body-parser": "1.20.3", "clone": "2.1.2", "cors": "2.8.5", - "express-session": "1.18.0", - "express": "4.21.0", + "express-session": "1.18.1", + "express": "4.21.1", "memorystore": "1.6.7", "mime": "3.0.0", "multer": "1.4.5-lts.1", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 72179409c..a2f82334a 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -21,7 +21,7 @@ "body-parser": "1.20.3", "cheerio": "1.0.0-rc.10", "content-type": "1.0.5", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cookie": "0.7.2", "cors": "2.8.5", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 67464f496..276e2ecef 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -20,7 +20,7 @@ "@node-red/util": "4.0.3", "async-mutex": "0.5.0", "clone": "2.1.2", - "express": "4.21.0", + "express": "4.21.1", "fs-extra": "11.2.0", "json-stringify-safe": "5.0.1", "rfdc": "^1.3.1" diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 2f61e8468..b3fab303d 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -38,7 +38,7 @@ "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "cors": "2.8.5", - "express": "4.21.0", + "express": "4.21.1", "fs-extra": "11.2.0", "node-red-admin": "^4.0.1", "nopt": "5.0.0", From 90ea3c15b35e042f285aecf1fc7e234738f0ed19 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 9 Oct 2024 10:56:14 +0100 Subject: [PATCH 13/30] Bump for 4.0.4 release --- CHANGELOG.md | 17 +++++++++++++++++ package.json | 2 +- .../@node-red/editor-api/package.json | 6 +++--- .../@node-red/editor-client/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 2 +- .../@node-red/registry/package.json | 4 ++-- .../node_modules/@node-red/runtime/package.json | 6 +++--- .../node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 9 files changed, 34 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eaa3b7fa..5d51c45f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +#### 4.0.4: Maintenance Release + +Editor + + - Fix `link call` node can call out of a subflow (#4892) @GogoVega + - Fix wrong unlock state when event is triggered after deployment (#4889) @GogoVega + - i18n(App) update with latest language file changes (#4903) @joebordes + - fix typo: depreciated (#4895) @dxdc + +Runtime + + - Update dev dependencies (#4893) @knolleary + +Nodes + + - MQTT: Allow msg.userProperties to have number values (#4900) @hardillb + #### 4.0.3: Maintenance Release Editor diff --git a/package.json b/package.json index 229ede53d..9d30315fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.0.3", + "version": "4.0.4", "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 02d8cf673..b1cdd9ad5 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.0.3", + "version": "4.0.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.0.3", - "@node-red/editor-client": "4.0.3", + "@node-red/util": "4.0.4", + "@node-red/editor-client": "4.0.4", "bcryptjs": "2.4.3", "body-parser": "1.20.3", "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 7e65dcc1a..587a32c6a 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.0.3", + "version": "4.0.4", "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 a2f82334a..7fdcb3a3e 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.0.3", + "version": "4.0.4", "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 7c6e8ebcc..229c5d31d 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.0.3", + "version": "4.0.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "4.0.3", + "@node-red/util": "4.0.4", "clone": "2.1.2", "fs-extra": "11.2.0", "semver": "7.6.3", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 276e2ecef..71d36b54a 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.0.3", + "version": "4.0.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.0.3", - "@node-red/util": "4.0.3", + "@node-red/registry": "4.0.4", + "@node-red/util": "4.0.4", "async-mutex": "0.5.0", "clone": "2.1.2", "express": "4.21.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 67ed9d88b..80ae1a517 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.0.3", + "version": "4.0.4", "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 b3fab303d..b7e87be84 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.0.3", + "version": "4.0.4", "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.0.3", - "@node-red/runtime": "4.0.3", - "@node-red/util": "4.0.3", - "@node-red/nodes": "4.0.3", + "@node-red/editor-api": "4.0.4", + "@node-red/runtime": "4.0.4", + "@node-red/util": "4.0.4", + "@node-red/nodes": "4.0.4", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "cors": "2.8.5", From 802b116b0140f8b06da7087b8de07c9f68139b28 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:53:33 +0200 Subject: [PATCH 14/30] Refix link call node can call out of a subflow --- packages/node_modules/@node-red/editor-client/src/js/nodes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 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 857068d4b..12e0a6ef1 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 @@ -2419,10 +2419,10 @@ RED.nodes = (function() { if (otherNode.z === n.z) { // Both ends in the same flow/subflow return true - } else if (n.type === "link call" && !!getSubflow(otherNode.z)) { + } else if (n.type === "link call" && !getSubflow(otherNode.z)) { // Link call node can call out of a subflow as long as otherNode is // not in a subflow - return false + return true } else if (!!getSubflow(n.z) || !!getSubflow(otherNode.z)) { // One end is in a subflow - remove the link return false From fe9354d10b893de689efaddaf120c690bb595049 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 10 Oct 2024 11:05:08 +0100 Subject: [PATCH 15/30] Bump for 4.0.5 --- CHANGELOG.md | 6 ++++++ 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 +++++----- scripts/generate-publish-script.js | 8 +++++--- 10 files changed, 28 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d51c45f9..4b55ac4c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +#### 4.0.5: Maintenance Release + +Editor + + - Refix link call node can call out of a subflow (#4908) @GogoVega + #### 4.0.4: Maintenance Release Editor diff --git a/package.json b/package.json index 9d30315fd..c7fe644f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.0.4", + "version": "4.0.5", "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 b1cdd9ad5..e58f2e9fb 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.0.4", - "@node-red/editor-client": "4.0.4", + "@node-red/util": "4.0.5", + "@node-red/editor-client": "4.0.5", "bcryptjs": "2.4.3", "body-parser": "1.20.3", "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 587a32c6a..b6b7a2c73 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 7fdcb3a3e..84db88466 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 229c5d31d..9437a5beb 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "4.0.4", + "@node-red/util": "4.0.5", "clone": "2.1.2", "fs-extra": "11.2.0", "semver": "7.6.3", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 71d36b54a..a160c402c 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.0.4", - "@node-red/util": "4.0.4", + "@node-red/registry": "4.0.5", + "@node-red/util": "4.0.5", "async-mutex": "0.5.0", "clone": "2.1.2", "express": "4.21.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 80ae1a517..c02ab3805 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.0.4", + "version": "4.0.5", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index b7e87be84..0969024ff 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.0.4", + "version": "4.0.5", "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.0.4", - "@node-red/runtime": "4.0.4", - "@node-red/util": "4.0.4", - "@node-red/nodes": "4.0.4", + "@node-red/editor-api": "4.0.5", + "@node-red/runtime": "4.0.5", + "@node-red/util": "4.0.5", + "@node-red/nodes": "4.0.5", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "cors": "2.8.5", diff --git a/scripts/generate-publish-script.js b/scripts/generate-publish-script.js index 0b2a75cd0..c31b2dd9e 100644 --- a/scripts/generate-publish-script.js +++ b/scripts/generate-publish-script.js @@ -36,10 +36,12 @@ function generateScript() { packages.forEach(name => { const tarName = name.replace(/@/,"").replace(/\//,"-") lines.push(`npm publish ${tarName}-${version}.tgz ${tagArg}\n`); - if (updateNextToLatest) { - lines.push(`npm dist-tag add ${name}@${version} next\n`); - } }) + if (updateNextToLatest) { + packages.forEach(name => { + lines.push(`npm dist-tag add ${name}@${version} next\n`); + }) + } resolve(lines.join("")) }); } From a7b1ce0cf84acf25d1517af1be2ff0b06e5293b5 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:47:42 +0200 Subject: [PATCH 16/30] Improve the node name auto-generated with the first available nb --- .../editor-client/src/js/ui/view-tools.js | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) 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 f503beecb..22cb1eecd 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 @@ -1102,18 +1102,27 @@ RED.view.tools = (function() { const paletteLabel = RED.utils.getPaletteLabel(n.type, nodeDef) const defaultNodeNameRE = new RegExp('^'+paletteLabel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')+' (\\d+)$') if (!typeIndex.hasOwnProperty(n.type)) { - const existingNodes = RED.nodes.filterNodes({type: n.type}) - let maxNameNumber = 0; - existingNodes.forEach(n => { - let match = defaultNodeNameRE.exec(n.name) + const existingNodes = RED.nodes.filterNodes({ type: n.type }); + const existingIds = existingNodes.reduce((ids, node) => { + let match = defaultNodeNameRE.exec(node.name); if (match) { - let nodeNumber = parseInt(match[1]) - if (nodeNumber > maxNameNumber) { - maxNameNumber = nodeNumber + const nodeNumber = parseInt(match[1], 10); + if (!ids.includes(nodeNumber)) { + ids.push(nodeNumber); } } - }) - typeIndex[n.type] = maxNameNumber + 1 + return ids; + }, []).sort((a, b) => a - b); + + let availableNameNumber = 1; + for (let i = 0; i < existingIds.length; i++) { + if (existingIds[i] !== availableNameNumber) { + break; + } + availableNameNumber++; + } + + typeIndex[n.type] = availableNameNumber; } if ((options.renameBlank && n.name === '') || (options.renameClash && defaultNodeNameRE.test(n.name))) { if (generateHistory) { From 2eba7548013a0bfba56369abc1bc58f61f61d3ca Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 12 Oct 2024 16:49:09 +0100 Subject: [PATCH 17/30] Fix trigger node date handling for latest time type input to fix #4914 --- .../@node-red/nodes/core/function/89-trigger.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js index 16a00e99d..0fc6ad6fb 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js @@ -166,7 +166,13 @@ module.exports = function(RED) { if (err) { reject(err); } else { - msg.payload = value; + if (node.op1type === "date") { + let d = new Date(); + if (node.op1 == "1") { msg.payload = Date.now(); } + else if (node.op1 == "iso") { msg.payload = d.toISOString(); } + else { msg.payload = d; } + } + else { msg.payload = value; } resolve(); } }); @@ -213,7 +219,12 @@ module.exports = function(RED) { } else { msg2.payload = node.topics[topic].m2; - if (node.op2type === "date") { msg2.payload = Date.now(); } + if (node.op2type === "date") { + let d = new Date(); + if (node.op2 == "0") { msg2.payload = Date.now(); } + else if (node.op2 == "iso") { msg2.payload = d.toISOString(); } + else { msg2.payload = d; } + } if (node.second === true) { msgInfo.send([null,msg2]); } else { msgInfo.send(msg2); } } From 61fd01b8716e62d5f26fbcc1d56f47ca6d05db5d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 12 Oct 2024 17:09:18 +0100 Subject: [PATCH 18/30] And add some tests --- test/nodes/core/function/89-trigger_spec.js | 24 +++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/test/nodes/core/function/89-trigger_spec.js b/test/nodes/core/function/89-trigger_spec.js index 33401e540..e86ed7a31 100644 --- a/test/nodes/core/function/89-trigger_spec.js +++ b/test/nodes/core/function/89-trigger_spec.js @@ -111,7 +111,15 @@ describe('trigger node', function() { try { if (rval) { msg.should.have.property("payload"); - should.deepEqual(msg.payload, rval); + if (type == "date" && val == "1") { + should.deepEqual(Math.round(msg.payload/10000), Math.round(rval/10000)); + } + else if (type == "date" && val == "iso") { + should.deepEqual(msg.payload.substr(0,11), rval.substr(0,11)); + } + else { + should.deepEqual(msg.payload, rval); + } } else { msg.should.have.property("payload", val); @@ -126,6 +134,7 @@ describe('trigger node', function() { }); it('should output 2st value when triggered ('+type+')', function(done) { + if (type == "date" && val == "1") { val = "0"; } var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", op1:"foo", op1type:"str", op2:val, op2type:type, duration:"20", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; process.env[val] = rval; @@ -142,7 +151,15 @@ describe('trigger node', function() { else { if (rval) { msg.should.have.property("payload"); - should.deepEqual(msg.payload, rval); + if (type == "date" && val == "0") { + should.deepEqual(Math.round(msg.payload/10000), Math.round(rval/10000)); + } + else if (type == "date" && val == "iso") { + should.deepEqual(msg.payload.substr(0,11), rval.substr(0,11)); + } + else { + should.deepEqual(msg.payload, rval); + } } else { msg.should.have.property("payload", val); @@ -166,6 +183,9 @@ describe('trigger node', function() { var val_buf = "[1,2,3,4,5]"; basicTest("bin", val_buf, Buffer.from(JSON.parse(val_buf))); basicTest("env", "NR-TEST", "env-val"); + basicTest("date", "1", Date.now()); + basicTest("date", "iso", (new Date()).toISOString()); + // basicTest("date", "object", Date.now()); it('should output 1 then 0 when triggered (default)', function(done) { var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", duration:"20", wires:[["n2"]] }, From 892933ff758d240109fb0d711d322c73f672250d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 12 Oct 2024 17:22:24 +0100 Subject: [PATCH 19/30] Update 89-trigger_spec.js --- test/nodes/core/function/89-trigger_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/nodes/core/function/89-trigger_spec.js b/test/nodes/core/function/89-trigger_spec.js index e86ed7a31..f78db0423 100644 --- a/test/nodes/core/function/89-trigger_spec.js +++ b/test/nodes/core/function/89-trigger_spec.js @@ -112,7 +112,7 @@ describe('trigger node', function() { if (rval) { msg.should.have.property("payload"); if (type == "date" && val == "1") { - should.deepEqual(Math.round(msg.payload/10000), Math.round(rval/10000)); + should.deepEqual(Math.round(msg.payload/1000000), Math.round(Date.now()/1000000)); } else if (type == "date" && val == "iso") { should.deepEqual(msg.payload.substr(0,11), rval.substr(0,11)); @@ -152,7 +152,7 @@ describe('trigger node', function() { if (rval) { msg.should.have.property("payload"); if (type == "date" && val == "0") { - should.deepEqual(Math.round(msg.payload/10000), Math.round(rval/10000)); + should.deepEqual(Math.round(msg.payload/1000000), parseInt(Date.now()/1000000)); } else if (type == "date" && val == "iso") { should.deepEqual(msg.payload.substr(0,11), rval.substr(0,11)); From d0ad62a82bd2b3afea4183aa99fb2509589d7226 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 21 Oct 2024 16:24:21 +0100 Subject: [PATCH 20/30] Revert trigger node fix --- .../@node-red/nodes/core/function/89-trigger.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js index 0fc6ad6fb..16a00e99d 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js @@ -166,13 +166,7 @@ module.exports = function(RED) { if (err) { reject(err); } else { - if (node.op1type === "date") { - let d = new Date(); - if (node.op1 == "1") { msg.payload = Date.now(); } - else if (node.op1 == "iso") { msg.payload = d.toISOString(); } - else { msg.payload = d; } - } - else { msg.payload = value; } + msg.payload = value; resolve(); } }); @@ -219,12 +213,7 @@ module.exports = function(RED) { } else { msg2.payload = node.topics[topic].m2; - if (node.op2type === "date") { - let d = new Date(); - if (node.op2 == "0") { msg2.payload = Date.now(); } - else if (node.op2 == "iso") { msg2.payload = d.toISOString(); } - else { msg2.payload = d; } - } + if (node.op2type === "date") { msg2.payload = Date.now(); } if (node.second === true) { msgInfo.send([null,msg2]); } else { msgInfo.send(msg2); } } From b3aff3a3e6847f03ef851d98e68c80eafe27573d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 21 Oct 2024 16:26:03 +0100 Subject: [PATCH 21/30] Ensure trigger node properties work with evaluateNodeProperty --- .../@node-red/nodes/core/function/89-trigger.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js index 16a00e99d..f0aaaf393 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js @@ -24,6 +24,14 @@ module.exports = function(RED) { this.op2 = n.op2 || "0"; this.op1type = n.op1type || "str"; this.op2type = n.op2type || "str"; + // If the op1/2type is 'date', then we need to leave op1/2 alone so that + // evaluateNodeProperty works as expected. + if (this.op1type === 'date' && this.op1 === '1') { + this.op1 = '' + } + if (this.op2type === 'date' && this.op2 === '0') { + this.op2 = '' + } this.second = (n.outputs == 2) ? true : false; this.topic = n.topic || "topic"; @@ -213,7 +221,6 @@ module.exports = function(RED) { } else { msg2.payload = node.topics[topic].m2; - if (node.op2type === "date") { msg2.payload = Date.now(); } if (node.second === true) { msgInfo.send([null,msg2]); } else { msgInfo.send(msg2); } } From 2220956007347017a37d273ff8e1389f3bd48158 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 21 Oct 2024 16:35:11 +0100 Subject: [PATCH 22/30] Ensure trigger second output is revaluated for date types --- .../node_modules/@node-red/nodes/core/function/89-trigger.js | 2 +- test/nodes/core/function/89-trigger_spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js index f0aaaf393..8b3625f2d 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js @@ -201,7 +201,7 @@ module.exports = function(RED) { if (node.op2type !== "nul") { var promise = Promise.resolve(); msg2 = RED.util.cloneMessage(msg); - if (node.op2type === "flow" || node.op2type === "global") { + if (node.op2type === "flow" || node.op2type === "global" || node.op2type === "date") { promise = new Promise((resolve,reject) => { RED.util.evaluateNodeProperty(node.op2,node.op2type,node,msg,(err,value) => { if (err) { diff --git a/test/nodes/core/function/89-trigger_spec.js b/test/nodes/core/function/89-trigger_spec.js index f78db0423..913298901 100644 --- a/test/nodes/core/function/89-trigger_spec.js +++ b/test/nodes/core/function/89-trigger_spec.js @@ -152,7 +152,7 @@ describe('trigger node', function() { if (rval) { msg.should.have.property("payload"); if (type == "date" && val == "0") { - should.deepEqual(Math.round(msg.payload/1000000), parseInt(Date.now()/1000000)); + ;(Math.round(msg.payload/1000000)).should.be.approximately(parseInt(Date.now()/1000000), 1); } else if (type == "date" && val == "iso") { should.deepEqual(msg.payload.substr(0,11), rval.substr(0,11)); From 7555e0644f3bc78cfa87f930ecbe9f7e99d3cb6c Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:15:24 +0200 Subject: [PATCH 23/30] Apply `envVarExcludes` setting to `RED.util.getSetting` into the function node --- .../nodes/core/function/10-function.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index 0120d8c92..8d365722f 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -111,8 +111,6 @@ module.exports = function(RED) { throw new Error(RED._("function.error.externalModuleNotAllowed")); } - - var functionText = "var results = null;"+ "results = (async function(msg,__send__,__done__){ "+ "var __msgid__ = msg._msgid;"+ @@ -160,13 +158,26 @@ module.exports = function(RED) { node.outstandingIntervals = []; node.clearStatus = false; + const envVarExcludes = {}; + if (RED.settings.envVarExcludes && Array.isArray(RED.settings.envVarExcludes)) { + RED.settings.envVarExcludes.forEach((e) => envVarExcludes[e] = true); + } + var sandbox = { console:console, util:util, Buffer:Buffer, Date: Date, RED: { - util: RED.util + util: { + ...RED.util, + getSetting: function (node, name, flow) { + if (envVarExcludes[name]) { + return undefined; + } + return RED.util.getSetting(node, name, flow); + } + } }, __node__: { id: node.id, From 2fd7aee4dad20b8eea860f684dd80538e29e6892 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:44:40 +0200 Subject: [PATCH 24/30] Move `envVarExcludes` to the top scope --- .../@node-red/nodes/core/function/10-function.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index 8d365722f..413830b72 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -22,6 +22,11 @@ module.exports = function(RED) { var acorn = require("acorn"); var acornWalk = require("acorn-walk"); + const envVarExcludes = {}; + if (RED.settings.envVarExcludes && Array.isArray(RED.settings.envVarExcludes)) { + RED.settings.envVarExcludes.forEach((e) => envVarExcludes[e] = true); + } + function sendResults(node,send,_msgid,msgs,cloneFirstMessage) { if (msgs == null) { return; @@ -158,11 +163,6 @@ module.exports = function(RED) { node.outstandingIntervals = []; node.clearStatus = false; - const envVarExcludes = {}; - if (RED.settings.envVarExcludes && Array.isArray(RED.settings.envVarExcludes)) { - RED.settings.envVarExcludes.forEach((e) => envVarExcludes[e] = true); - } - var sandbox = { console:console, util:util, From 70aed23ef0a0792d4044a93ec043438dbc586c22 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:31:36 +0100 Subject: [PATCH 25/30] Fix `envVarList` sortable value --- .../@node-red/editor-client/src/js/ui/editors/envVarList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js index dda5d1660..b974fbc50 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js @@ -131,7 +131,7 @@ RED.editor.envVarList = (function() { nameField.trigger('change'); } }, - sortable: ".red-ui-editableList-item-handle", + sortable: true, removable: false }); var parentEnv = {}; From f67268b89ad654fb57b2f10e02ea2ebc7b6b7da7 Mon Sep 17 00:00:00 2001 From: Gauthier Dandele <92022724+GogoVega@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:01:42 +0100 Subject: [PATCH 26/30] Revert and force getSetting to use the local node Co-authored-by: Nick O'Leary --- .../@node-red/nodes/core/function/10-function.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index 413830b72..71f6e15d6 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -22,11 +22,6 @@ module.exports = function(RED) { var acorn = require("acorn"); var acornWalk = require("acorn-walk"); - const envVarExcludes = {}; - if (RED.settings.envVarExcludes && Array.isArray(RED.settings.envVarExcludes)) { - RED.settings.envVarExcludes.forEach((e) => envVarExcludes[e] = true); - } - function sendResults(node,send,_msgid,msgs,cloneFirstMessage) { if (msgs == null) { return; @@ -171,11 +166,9 @@ module.exports = function(RED) { RED: { util: { ...RED.util, - getSetting: function (node, name, flow) { - if (envVarExcludes[name]) { - return undefined; - } - return RED.util.getSetting(node, name, flow); + getSetting: function (_node, name, _flow) { + // Ensure `node` argument is the Function node and do not allow flow to be overridden. + return RED.util.getSetting(node, name); } } }, From a7ee31307e20a1412b928cf8d2e4b7edc3320afe Mon Sep 17 00:00:00 2001 From: Ersin Date: Tue, 29 Oct 2024 13:38:32 +0100 Subject: [PATCH 27/30] missing getSubscriptions in the docs while its implemented See: https://github.com/node-red/node-red/blob/master/packages/node_modules/%40node-red/nodes/core/network/10-mqtt.js#L1288 --- .../@node-red/nodes/locales/en-US/network/10-mqtt.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/en-US/network/10-mqtt.html index f4b0012ce..68f89ae4a 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/network/10-mqtt.html @@ -48,7 +48,8 @@
action string
the name of the action the node should perform. Available actions are: "connect", - "disconnect", "subscribe" and "unsubscribe".
+ "disconnect", "getSubscriptions", "subscribe" and + "unsubscribe".
topic string|object|array
For the "subscribe" and "unsubscribe" actions, this property provides the topic. It can be set as either:
    From 443492d6eb27be98e5a01176384cf3eea7b99645 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Thu, 31 Oct 2024 17:12:13 +0100 Subject: [PATCH 28/30] Fix `setModulePendingUpdated` with plugins --- .../node_modules/@node-red/editor-client/src/js/nodes.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 12e0a6ef1..bcd1f8c5a 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 @@ -73,7 +73,13 @@ RED.nodes = (function() { var exports = { setModulePendingUpdated: function(module,version) { - moduleList[module].pending_version = version; + if (!!RED.plugins.getModule(module)) { + // The module updated is a plugin + RED.plugins.getModule(module).pending_version = version; + } else { + moduleList[module].pending_version = version; + } + RED.events.emit("registry:module-updated",{module:module,version:version}); }, getModule: function(module) { From abe0b60bf7b9f765ef172fe1ecf3b695f12d32a4 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:28:51 +0100 Subject: [PATCH 29/30] Remove disabled node types from QuickAddDialog list --- .../@node-red/editor-client/src/js/ui/typeSearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 216cc3e40..9a83409da 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 @@ -382,7 +382,7 @@ RED.typeSearch = (function() { var items = []; RED.nodes.registry.getNodeTypes().forEach(function(t) { var def = RED.nodes.getType(t); - if (def.category !== 'config' && t !== 'unknown' && t !== 'tab') { + if (def.set.enabled && def.category !== 'config' && t !== 'unknown' && t !== 'tab') { items.push({type:t,def: def, label:getTypeLabel(t,def)}); } }); From 59a133cc13e5e0fc3b7bc8b84272377b9bd820bd Mon Sep 17 00:00:00 2001 From: Gauthier Dandele <92022724+GogoVega@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:28:40 +0100 Subject: [PATCH 30/30] Need to guard against subflows that doesn't have a set property Co-authored-by: Nick O'Leary --- .../@node-red/editor-client/src/js/ui/typeSearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9a83409da..f284f2464 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 @@ -382,7 +382,7 @@ RED.typeSearch = (function() { var items = []; RED.nodes.registry.getNodeTypes().forEach(function(t) { var def = RED.nodes.getType(t); - if (def.set.enabled && def.category !== 'config' && t !== 'unknown' && t !== 'tab') { + if (def.set?.enabled !== false && def.category !== 'config' && t !== 'unknown' && t !== 'tab') { items.push({type:t,def: def, label:getTypeLabel(t,def)}); } });