diff --git a/Gruntfile.js b/Gruntfile.js index 05be6a58a..e4b664fb5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -133,7 +133,6 @@ module.exports = function(grunt) { src: [ // Ensure editor source files are concatenated in // the right order - "packages/node_modules/@node-red/editor-client/src/js/polyfills.js", "packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js", "packages/node_modules/@node-red/editor-client/src/js/red.js", "packages/node_modules/@node-red/editor-client/src/js/events.js", diff --git a/package.json b/package.json index aa9918b64..91efc9427 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.0.9", + "version": "4.1.0-beta.0", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -33,6 +33,7 @@ "basic-auth": "2.0.1", "bcryptjs": "3.0.2", "body-parser": "1.20.3", + "chalk": "^4.1.2", "cheerio": "1.0.0-rc.10", "clone": "2.1.2", "content-type": "1.0.5", @@ -62,7 +63,7 @@ "moment": "2.30.1", "moment-timezone": "0.5.48", "mqtt": "5.11.0", - "multer": "1.4.5-lts.2", + "multer": "2.0.0", "mustache": "4.2.0", "node-red-admin": "^4.0.2", "node-watch": "0.7.4", @@ -86,7 +87,7 @@ "@node-rs/bcrypt": "1.10.7" }, "devDependencies": { - "dompurify": "2.5.8", + "dompurify": "3.2.5", "grunt": "1.6.1", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.5.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 561ea9baa..14c276d9f 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.9", + "version": "4.1.0-beta.0", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.0.9", - "@node-red/editor-client": "4.0.9", + "@node-red/util": "4.1.0-beta.0", + "@node-red/editor-client": "4.1.0-beta.0", "bcryptjs": "3.0.2", "body-parser": "1.20.3", "clone": "2.1.2", @@ -26,7 +26,7 @@ "express": "4.21.2", "memorystore": "1.6.7", "mime": "3.0.0", - "multer": "1.4.5-lts.2", + "multer": "2.0.0", "mustache": "4.2.0", "oauth2orize": "1.12.0", "passport-http-bearer": "1.0.1", diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index b7cebefb6..035bdf8dd 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -111,6 +111,7 @@ "userSettings": "User Settings", "nodes": "Nodes", "displayStatus": "Show node status", + "displayInfoIcon": "Show node information icon", "displayConfig": "Configuration nodes", "import": "Import", "importExample": "Import example flow", @@ -264,6 +265,8 @@ "download": "Download", "importUnrecognised": "Imported unrecognised type:", "importUnrecognised_plural": "Imported unrecognised types:", + "importWithModuleInfo": "Required dependencies missing", + "importWithModuleInfoDesc": "These nodes are not currently installed in your palette and are required for the imported flow:", "importDuplicate": "Imported duplicate node:", "importDuplicate_plural": "Imported duplicate nodes:", "nodesExported": "Nodes exported to clipboard", @@ -629,6 +632,8 @@ "pluginCount_plural": "__count__ plugins", "moduleCount": "__count__ module available", "moduleCount_plural": "__count__ modules available", + "updateCount": "__count__ update available", + "updateCount_plural": "__count__ updates available", "inuse": "in use", "enableall": "enable all", "disableall": "disable all", @@ -652,6 +657,8 @@ "more": "+ __count__ more", "upload": "Upload module tgz file", "refresh": "Refresh module list", + "deprecated": "deprecated", + "deprecatedTip": "This module has been deprecated", "errors": { "catalogLoadFailed": "

Failed to load node catalogue.

Check the browser console for more information

", "installFailed": "

Failed to install: __module__

__message__

Check the log for more information

", @@ -1274,5 +1281,15 @@ "environment": "Environment", "header": "Global Environment Variables", "revert": "Revert" + }, + "telemetry": { + "label": "Update Notifications", + "settingsTitle": "Enable Update Notifications", + "settingsDescription": "

Node-RED can notify you when there is a new version available. This ensures you keep up to date with the latest features and fixes.

This requires sending anonymised data back to the Node-RED team. It does not include any details of your flows or users.

For full information on what information is collected and how it is used, please see the documentation.

", + "settingsDescription2": "

You can change this setting at any time in the editor settings.

", + "enableLabel": "Yes, enable notifications", + "disableLabel": "No, do not enable notifications", + "updateAvailable": "Update available", + "updateAvailableDesc": "Node-RED __version__ is now available" } } diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index ef2600a54..c50b279a1 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.9", + "version": "4.1.0-beta.0", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/editor-client/src/images/node-red.svg b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg index c62b35866..b74a46a4c 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/node-red.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/packages/node_modules/@node-red/editor-client/src/js/keymap.json b/packages/node_modules/@node-red/editor-client/src/js/keymap.json index 1bedab6e8..4cf28d227 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/keymap.json +++ b/packages/node_modules/@node-red/editor-client/src/js/keymap.json @@ -92,7 +92,6 @@ "ctrl-+": "core:zoom-in", "ctrl--": "core:zoom-out", "ctrl-0": "core:zoom-reset" - }, "red-ui-editor-stack": { "ctrl-enter": "core:confirm-edit-tray", 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 cab3547c2..131d40d18 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 @@ -1495,7 +1495,12 @@ RED.nodes = (function() { /** * Converts the current node selection to an exportable JSON Object **/ - function createExportableNodeSet(set, exportedIds, exportedSubflows, exportedConfigNodes) { + function createExportableNodeSet(set, { + exportedIds, + exportedSubflows, + exportedConfigNodes, + includeModuleConfig = false + } = {}) { var nns = []; exportedIds = exportedIds || {}; @@ -1529,7 +1534,7 @@ RED.nodes = (function() { subflowSet = subflowSet.concat(RED.nodes.junctions(subflowId)) subflowSet = subflowSet.concat(RED.nodes.groups(subflowId)) - var exportableSubflow = createExportableNodeSet(subflowSet, exportedIds, exportedSubflows, exportedConfigNodes); + var exportableSubflow = createExportableNodeSet(subflowSet, { exportedIds, exportedSubflows, exportedConfigNodes }); nns = exportableSubflow.concat(nns); } } @@ -1564,19 +1569,23 @@ RED.nodes = (function() { } nns.push(convertedNode); if (node.type === "group") { - nns = nns.concat(createExportableNodeSet(node.nodes, exportedIds, exportedSubflows, exportedConfigNodes)); + nns = nns.concat(createExportableNodeSet(node.nodes, { exportedIds, exportedSubflows, exportedConfigNodes })); } } else { var convertedSubflow = convertSubflow(node, { credentials: false }); nns.push(convertedSubflow); } } + if (includeModuleConfig) { + updateGlobalConfigModuleList(nns) + } return nns; } // Create the Flow JSON for the current configuration // opts.credentials (whether to include (known) credentials) - default: true // opts.dimensions (whether to include node dimensions) - default: false + // opts.includeModuleConfig (whether to include modules) - default: false function createCompleteNodeSet(opts) { var nns = []; var i; @@ -1608,6 +1617,9 @@ RED.nodes = (function() { RED.nodes.eachNode(function(n) { nns.push(convertNode(n, opts)); }) + if (opts?.includeModuleConfig) { + updateGlobalConfigModuleList(nns); + } return nns; } @@ -1835,6 +1847,7 @@ RED.nodes = (function() { * - id:import - import as-is * - id:copy - import with new id * - id:replace - import over the top of existing + * - modules: map of module:version - hints for unknown nodes */ function importNodes(newNodesObj,options) { // createNewIds,createMissingWorkspace) { const defOpts = { generateIds: false, addFlow: false, markChanged: false, reimport: false, importMap: {} } @@ -1970,12 +1983,58 @@ RED.nodes = (function() { } if (!isInitialLoad && unknownTypes.length > 0) { - var typeList = $("