mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Handle subflow modules with their own npm dependencies
This commit is contained in:
@@ -58,7 +58,8 @@ function filterNodeInfo(n) {
|
||||
name: n.name,
|
||||
types: n.types,
|
||||
enabled: n.enabled,
|
||||
local: n.local||false
|
||||
local: n.local||false,
|
||||
user: n.user || false
|
||||
};
|
||||
if (n.hasOwnProperty("module")) {
|
||||
r.module = n.module;
|
||||
@@ -94,6 +95,7 @@ function saveNodeList() {
|
||||
name: module,
|
||||
version: moduleConfigs[module].version,
|
||||
local: moduleConfigs[module].local||false,
|
||||
user: moduleConfigs[module].user||false,
|
||||
nodes: {}
|
||||
};
|
||||
if (moduleConfigs[module].hasOwnProperty('pending_version')) {
|
||||
@@ -179,6 +181,7 @@ function loadNodeConfigs() {
|
||||
function addModule(module) {
|
||||
moduleNodes[module.name] = [];
|
||||
moduleConfigs[module.name] = module;
|
||||
// console.log("registry.js.addModule",module.name,"user?",module.user,"usedBy",module.usedBy,"dependencies",module.dependencies)
|
||||
for (var setName in module.nodes) {
|
||||
if (module.nodes.hasOwnProperty(setName)) {
|
||||
var set = module.nodes[setName];
|
||||
@@ -240,21 +243,47 @@ function removeNode(id) {
|
||||
return filterNodeInfo(config);
|
||||
}
|
||||
|
||||
function removeModule(module) {
|
||||
function removeModule(name,skipSave) {
|
||||
if (!settings.available()) {
|
||||
throw new Error("Settings unavailable");
|
||||
}
|
||||
var nodes = moduleNodes[module];
|
||||
if (!nodes) {
|
||||
throw new Error("Unrecognised module: "+module);
|
||||
}
|
||||
var infoList = [];
|
||||
for (var i=0;i<nodes.length;i++) {
|
||||
infoList.push(removeNode(module+"/"+nodes[i]));
|
||||
var module = moduleConfigs[name];
|
||||
var nodes = moduleNodes[name];
|
||||
if (!nodes) {
|
||||
throw new Error("Unrecognised module: "+name);
|
||||
}
|
||||
if (module.usedBy && module.usedBy > 0) {
|
||||
// We are removing a module that is used by other modules... so whilst
|
||||
// this module should be removed from the editor palette, it needs to
|
||||
// stay in the runtime... for now.
|
||||
module.user = false;
|
||||
for (var i=0;i<nodes.length;i++) {
|
||||
infoList.push(filterNodeInfo(nodes[i]));
|
||||
}
|
||||
} else {
|
||||
if (module.dependencies) {
|
||||
module.dependencies.forEach(function(dep) {
|
||||
// Check each dependency of this module to see if it is a non-user-installed
|
||||
// module that we can expect to disappear once npm uninstall is run
|
||||
if (!moduleConfigs[dep].user) {
|
||||
moduleConfigs[dep].usedBy = moduleConfigs[dep].usedBy.filter(m => m !== name);
|
||||
if (moduleConfigs[dep].usedBy.length === 0) {
|
||||
// Remove the dependency
|
||||
removeModule(dep,true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
for (var i=0;i<nodes.length;i++) {
|
||||
infoList.push(removeNode(name+"/"+nodes[i]));
|
||||
}
|
||||
delete moduleNodes[name];
|
||||
delete moduleConfigs[name];
|
||||
}
|
||||
if (!skipSave) {
|
||||
saveNodeList();
|
||||
}
|
||||
delete moduleNodes[module];
|
||||
delete moduleConfigs[module];
|
||||
saveNodeList();
|
||||
return infoList;
|
||||
}
|
||||
|
||||
@@ -307,6 +336,9 @@ function getNodeList(filter) {
|
||||
for (var module in moduleConfigs) {
|
||||
/* istanbul ignore else */
|
||||
if (moduleConfigs.hasOwnProperty(module)) {
|
||||
if (!moduleConfigs[module].user && (moduleConfigs[module].usedBy && moduleConfigs[module].usedBy.length > 0)) {
|
||||
continue;
|
||||
}
|
||||
var nodes = moduleConfigs[module].nodes;
|
||||
for (var node in nodes) {
|
||||
/* istanbul ignore else */
|
||||
@@ -346,9 +378,13 @@ function getModuleInfo(module) {
|
||||
name: module,
|
||||
version: moduleConfigs[module].version,
|
||||
local: moduleConfigs[module].local,
|
||||
user: moduleConfigs[module].user,
|
||||
path: moduleConfigs[module].path,
|
||||
nodes: []
|
||||
};
|
||||
if (moduleConfigs[module].dependencies) {
|
||||
m.dependencies = moduleConfigs[module].dependencies;
|
||||
}
|
||||
if (moduleConfigs[module] && moduleConfigs[module].pending_version) {
|
||||
m.pending_version = moduleConfigs[module].pending_version;
|
||||
}
|
||||
@@ -425,7 +461,13 @@ function getAllNodeConfigs(lang) {
|
||||
var script = "";
|
||||
for (var i=0;i<nodeList.length;i++) {
|
||||
var id = nodeList[i];
|
||||
var config = moduleConfigs[getModule(id)].nodes[getNode(id)];
|
||||
|
||||
var module = moduleConfigs[getModule(id)]
|
||||
if (!module.user && (module.usedBy && module.usedBy.length > 0)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var config = module.nodes[getNode(id)];
|
||||
if (config.enabled && !config.err) {
|
||||
result += "\n<!-- --- [red-module:"+id+"] --- -->\n";
|
||||
result += config.config;
|
||||
@@ -587,6 +629,17 @@ function setModulePendingUpdated(module,version) {
|
||||
});
|
||||
}
|
||||
|
||||
function setUserInstalled(module,userInstalled) {
|
||||
moduleConfigs[module].user = userInstalled;
|
||||
return saveNodeList().then(function() {
|
||||
return getModuleInfo(module);
|
||||
});
|
||||
}
|
||||
function addModuleDependency(module,usedBy) {
|
||||
moduleConfigs[module].usedBy = moduleConfigs[module].usedBy || [];
|
||||
moduleConfigs[module].usedBy.push(usedBy);
|
||||
}
|
||||
|
||||
var icon_paths = { };
|
||||
var iconCache = {};
|
||||
|
||||
@@ -648,6 +701,9 @@ var registry = module.exports = {
|
||||
disableNodeSet: disableNodeSet,
|
||||
|
||||
setModulePendingUpdated: setModulePendingUpdated,
|
||||
setUserInstalled: setUserInstalled,
|
||||
addModuleDependency:addModuleDependency,
|
||||
|
||||
removeModule: removeModule,
|
||||
|
||||
getNodeInfo: getNodeInfo,
|
||||
|
Reference in New Issue
Block a user