diff --git a/packages/node_modules/@node-red/registry/lib/externalModules.js b/packages/node_modules/@node-red/registry/lib/externalModules.js index f794f1fc6..1e9ec4ebe 100644 --- a/packages/node_modules/@node-red/registry/lib/externalModules.js +++ b/packages/node_modules/@node-red/registry/lib/externalModules.js @@ -6,6 +6,7 @@ const fs = require("fs-extra"); const registryUtil = require("./util"); const path = require("path"); +const clone = require("clone"); const exec = require("@node-red/util").exec; const log = require("@node-red/util").log; @@ -16,6 +17,7 @@ const EXTERNAL_MODULES_DIR = "externalModules"; const NPM_COMMAND = (process.platform === "win32") ? "npm.cmd" : "npm"; let registeredTypes = {}; +let subflowTypes = {}; let settings; let knownExternalModules = {}; @@ -58,6 +60,10 @@ function register(type, dynamicModuleListProperty) { registeredTypes[type] = dynamicModuleListProperty; } +function registerSubflow(type, subflowConfig) { + subflowTypes[type] = subflowConfig; +} + function requireModule(module) { if (!registryUtil.checkModuleAllowed( module, null,installAllowList,installDenyList)) { const e = new Error("Module not allowed"); @@ -95,15 +101,21 @@ function isInstalled(moduleDetails) { return moduleDetails.builtin || moduleDetails.known; } + async function checkFlowDependencies(flowConfig) { + let nodes = clone(flowConfig); await refreshExternalModules(); const checkedModules = {}; const promises = []; const errors = []; - - flowConfig.forEach(n => { - if (registeredTypes[n.type]) { + const checkedSubflows = {}; + while (nodes.length > 0) { + let n = nodes.shift(); + if (subflowTypes[n.type] && !checkedSubflows[n.type]) { + checkedSubflows[n.type] = true; + nodes = nodes.concat(subflowTypes[n.type].flow) + } else if (registeredTypes[n.type]) { let nodeModules = n[registeredTypes[n.type]] || []; if (!Array.isArray(nodeModules)) { nodeModules = [nodeModules] @@ -135,8 +147,7 @@ async function checkFlowDependencies(flowConfig) { } }) } - }) - + } return Promise.all(promises).then(refreshExternalModules).then(() => { if (errors.length > 0) { throw errors; @@ -205,6 +216,7 @@ async function installModule(moduleDetails) { module.exports = { init: init, register: register, + registerSubflow: registerSubflow, checkFlowDependencies: checkFlowDependencies, require: requireModule } \ No newline at end of file diff --git a/packages/node_modules/@node-red/registry/lib/registry.js b/packages/node_modules/@node-red/registry/lib/registry.js index a4d504fac..82de4e442 100644 --- a/packages/node_modules/@node-red/registry/lib/registry.js +++ b/packages/node_modules/@node-red/registry/lib/registry.js @@ -456,6 +456,9 @@ function registerSubflow(nodeSet, subflow) { nodeSetInfo.config = result.config; } subflowModules[result.type] = result; + externalModules.registerSubflow(result.type,subflow); + + events.emit("type-registered",result.type); return result; } diff --git a/test/resources/subflow/package/package.json b/test/resources/subflow/package/package.json index 92ff33e2b..831428c6a 100644 --- a/test/resources/subflow/package/package.json +++ b/test/resources/subflow/package/package.json @@ -1,6 +1,6 @@ { "name": "test-subflow-mod", - "version": "1.0.1", + "version": "1.0.2", "description": "", "keywords": [], "license": "ISC", @@ -13,6 +13,7 @@ ] }, "dependencies": { - "node-red-node-random": "*" + "node-red-node-random": "*", + "cowsay2": "*" } } diff --git a/test/resources/subflow/package/subflow.json b/test/resources/subflow/package/subflow.json index e5c6b25ab..db43cdff4 100644 --- a/test/resources/subflow/package/subflow.json +++ b/test/resources/subflow/package/subflow.json @@ -189,6 +189,7 @@ "noerr": 0, "initialize": "", "finalize": "", + "libs": [ {"var":"cowsay2","module":"cowsay2"}], "x": 240, "y": 100, "wires": [ diff --git a/test/resources/subflow/test-subflow-mod-1.0.1.tgz b/test/resources/subflow/test-subflow-mod-1.0.1.tgz deleted file mode 100644 index daa53b77a..000000000 Binary files a/test/resources/subflow/test-subflow-mod-1.0.1.tgz and /dev/null differ diff --git a/test/resources/subflow/test-subflow-mod-1.0.2.tgz b/test/resources/subflow/test-subflow-mod-1.0.2.tgz new file mode 100644 index 000000000..093e12f92 Binary files /dev/null and b/test/resources/subflow/test-subflow-mod-1.0.2.tgz differ