mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Merge branch 'master' into dev
This commit is contained in:
@@ -43,37 +43,40 @@ function load(disableNodePathScan) {
|
||||
return loadModuleFiles(modules);
|
||||
}
|
||||
|
||||
function splitPath(p) {
|
||||
return path.posix.normalize((p || '').replace(/\\/g, path.sep)).split(path.sep)
|
||||
}
|
||||
|
||||
function loadModuleTypeFiles(module, type) {
|
||||
const things = module[type];
|
||||
var first = true;
|
||||
var promises = [];
|
||||
for (var thingName in things) {
|
||||
let first = true;
|
||||
const promises = [];
|
||||
for (let thingName in things) {
|
||||
/* istanbul ignore else */
|
||||
if (things.hasOwnProperty(thingName)) {
|
||||
if (module.name != "node-red" && first) {
|
||||
// Check the module directory exists
|
||||
first = false;
|
||||
var fn = things[thingName].file;
|
||||
var parts = fn.split("/");
|
||||
var i = parts.length-1;
|
||||
for (;i>=0;i--) {
|
||||
if (parts[i] == "node_modules") {
|
||||
break;
|
||||
}
|
||||
let moduleFn = module.path
|
||||
const fn = things[thingName].file
|
||||
const parts = splitPath(fn)
|
||||
const nmi = parts.indexOf('node_modules')
|
||||
if(nmi > -1) {
|
||||
moduleFn = parts.slice(0,nmi+2).join(path.sep);
|
||||
}
|
||||
if (!moduleFn) {
|
||||
// shortcut - skip calling statSync on empty string
|
||||
break; // Module not found, don't attempt to load its nodes
|
||||
}
|
||||
var moduleFn = parts.slice(0,i+2).join("/");
|
||||
|
||||
try {
|
||||
var stat = fs.statSync(moduleFn);
|
||||
const stat = fs.statSync(moduleFn);
|
||||
} catch(err) {
|
||||
// Module not found, don't attempt to load its nodes
|
||||
break;
|
||||
break; // Module not found, don't attempt to load its nodes
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
var promise;
|
||||
let promise;
|
||||
if (type === "nodes") {
|
||||
promise = loadNodeConfig(things[thingName]);
|
||||
} else if (type === "plugins") {
|
||||
@@ -82,8 +85,7 @@ function loadModuleTypeFiles(module, type) {
|
||||
promises.push(
|
||||
promise.then(
|
||||
(function() {
|
||||
var m = module.name;
|
||||
var n = thingName;
|
||||
const n = thingName;
|
||||
return function(nodeSet) {
|
||||
things[n] = nodeSet;
|
||||
return nodeSet;
|
||||
@@ -93,7 +95,6 @@ function loadModuleTypeFiles(module, type) {
|
||||
);
|
||||
} catch(err) {
|
||||
console.log(err)
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,38 +126,24 @@ function loadModuleFiles(modules) {
|
||||
}
|
||||
var pluginList;
|
||||
var nodeList;
|
||||
|
||||
return Promise.all(pluginPromises).then(function(results) {
|
||||
pluginList = results.filter(r => !!r);
|
||||
// Initial plugin load has happened. Ensure modules that provide
|
||||
// plugins are in the registry now.
|
||||
for (var module in modules) {
|
||||
if (modules.hasOwnProperty(module)) {
|
||||
if (modules[module].plugins && Object.keys(modules[module].plugins).length > 0) {
|
||||
// Add the modules for plugins
|
||||
if (!modules[module].err) {
|
||||
registry.addModule(modules[module]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return loadNodeSetList(pluginList);
|
||||
}).then(function() {
|
||||
return Promise.all(nodePromises);
|
||||
return Promise.all(nodePromises)
|
||||
}).then(function(results) {
|
||||
nodeList = results.filter(r => !!r);
|
||||
// Initial node load has happened. Ensure remaining modules are in the registry
|
||||
for (var module in modules) {
|
||||
if (modules.hasOwnProperty(module)) {
|
||||
if (!modules[module].plugins || Object.keys(modules[module].plugins).length === 0) {
|
||||
if (!modules[module].err) {
|
||||
registry.addModule(modules[module]);
|
||||
}
|
||||
if (!modules[module].err) {
|
||||
registry.addModule(modules[module]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}).then(function() {
|
||||
return loadNodeSetList(pluginList);
|
||||
}).then(function() {
|
||||
return loadNodeSetList(nodeList);
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
async function loadPluginTemplate(plugin) {
|
||||
|
||||
@@ -106,8 +106,8 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) {
|
||||
// when loading local files, if the path is a valid node-red module
|
||||
// dont include it (will be picked up in scanTreeForNodesModules)
|
||||
if(skipValidNodeRedModules && files.indexOf("package.json") >= 0) {
|
||||
const package = getPackageDetails(dir)
|
||||
if(package.isNodeRedModule) {
|
||||
const packageDetails = getPackageDetails(dir)
|
||||
if(packageDetails.isNodeRedModule) {
|
||||
return {files: [], icons: []};
|
||||
}
|
||||
}
|
||||
@@ -135,17 +135,17 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) {
|
||||
return {files: result, icons: icons}
|
||||
}
|
||||
|
||||
function scanDirForNodesModules(dir,moduleName,package) {
|
||||
function scanDirForNodesModules(dir,moduleName,packageDetails) {
|
||||
let results = [];
|
||||
let scopeName;
|
||||
let files
|
||||
try {
|
||||
let isNodeRedModule = false
|
||||
if(package) {
|
||||
dir = path.join(package.moduleDir,'..')
|
||||
files = [path.basename(package.moduleDir)]
|
||||
moduleName = (package.package ? package.package.name : null) || moduleName
|
||||
isNodeRedModule = package.isNodeRedModule
|
||||
if(packageDetails) {
|
||||
dir = path.join(packageDetails.moduleDir,'..')
|
||||
files = [path.basename(packageDetails.moduleDir)]
|
||||
moduleName = (packageDetails.package ? packageDetails.package.name : null) || moduleName
|
||||
isNodeRedModule = packageDetails.isNodeRedModule
|
||||
} else {
|
||||
files = fs.readdirSync(dir);
|
||||
if (moduleName) {
|
||||
@@ -156,6 +156,16 @@ function scanDirForNodesModules(dir,moduleName,package) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if we have found a package.json, this IS a node_module, lets see if it is a node-red node
|
||||
if (!isNodeRedModule && files.indexOf('package.json') > -1) {
|
||||
packageDetails = getPackageDetails(dir) // get package details
|
||||
if(packageDetails && packageDetails.isNodeRedModule) {
|
||||
isNodeRedModule = true
|
||||
files = ['package.json'] // shortcut the file scan
|
||||
}
|
||||
}
|
||||
|
||||
for (let i=0;i<files.length;i++) {
|
||||
let fn = files[i];
|
||||
if (!isNodeRedModule && /^@/.test(fn)) {
|
||||
@@ -169,8 +179,8 @@ function scanDirForNodesModules(dir,moduleName,package) {
|
||||
} else {
|
||||
if ((isNodeRedModule || (!moduleName || fn == moduleName)) && (isIncluded(fn) && !isExcluded(fn))) {
|
||||
try {
|
||||
const moduleDir = isNodeRedModule ? package.moduleDir : path.join(dir,fn);
|
||||
const pkg = package || getPackageDetails(moduleDir)
|
||||
const moduleDir = isNodeRedModule ? packageDetails.moduleDir : path.join(dir,fn);
|
||||
const pkg = packageDetails || getPackageDetails(moduleDir)
|
||||
if(pkg.error) {
|
||||
throw pkg.error
|
||||
}
|
||||
|
||||
@@ -185,10 +185,17 @@ 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) {
|
||||
for (const setName in module.nodes) {
|
||||
if (module.nodes.hasOwnProperty(setName)) {
|
||||
var set = module.nodes[setName];
|
||||
const set = module.nodes[setName];
|
||||
if (!set.types) {
|
||||
const err = new Error("Set has no types")
|
||||
err.code = "set_has_no_types"
|
||||
err.details = {
|
||||
...set
|
||||
}
|
||||
set.err = err
|
||||
}
|
||||
moduleNodes[module.name].push(set.name);
|
||||
nodeList.push(set.id);
|
||||
if (!set.err) {
|
||||
|
||||
Reference in New Issue
Block a user