@node-red/registry
Advanced tools
Comparing version 2.0.0-beta.2 to 2.0.0
@@ -15,3 +15,2 @@ // This module handles the management of modules required by the runtime and flows. | ||
const BUILTIN_MODULES = require('module').builtinModules; | ||
const EXTERNAL_MODULES_DIR = "externalModules"; | ||
@@ -31,12 +30,33 @@ // TODO: outsource running npm to a plugin | ||
let IMPORT_SUPPORTED = true; | ||
const nodeVersionParts = process.versions.node.split(".").map(v => parseInt(v)); | ||
if (nodeVersionParts[0] < 12 || (nodeVersionParts[0] === 12 && nodeVersionParts[1] < 17)) { | ||
IMPORT_SUPPORTED = false; | ||
} | ||
function getInstallDir() { | ||
return path.resolve(path.join(settings.userDir || process.env.NODE_RED_HOME || ".", "externalModules")); | ||
return path.resolve(settings.userDir || process.env.NODE_RED_HOME || "."); | ||
} | ||
let loggedLegacyWarning = false; | ||
async function refreshExternalModules() { | ||
const externalModuleDir = path.resolve(path.join(settings.userDir || process.env.NODE_RED_HOME || ".", EXTERNAL_MODULES_DIR)); | ||
if (!loggedLegacyWarning) { | ||
loggedLegacyWarning = true; | ||
const oldExternalModulesDir = path.join(path.resolve(settings.userDir || process.env.NODE_RED_HOME || "."),"externalModules"); | ||
if (fs.existsSync(oldExternalModulesDir)) { | ||
try { | ||
log.warn(log._("server.install.old-ext-mod-dir-warning",{oldDir:oldExternalModulesDir, newDir:getInstallDir()})) | ||
} catch(err) {console.log(err)} | ||
} | ||
} | ||
const externalModuleDir = getInstallDir(); | ||
try { | ||
const pkgFile = JSON.parse(await fs.readFile(path.join(externalModuleDir,"package.json"),"utf-8")); | ||
knownExternalModules = pkgFile.dependencies; | ||
knownExternalModules = pkgFile.dependencies || {}; | ||
} catch(err) { | ||
knownExternalModules = {}; | ||
} | ||
@@ -49,2 +69,3 @@ } | ||
installEnabled = true; | ||
if (settings.externalModules && settings.externalModules.modules) { | ||
@@ -88,7 +109,42 @@ if (settings.externalModules.modules.allowList || settings.externalModules.modules.denyList) { | ||
} | ||
const externalModuleDir = path.resolve(path.join(settings.userDir || process.env.NODE_RED_HOME || ".", EXTERNAL_MODULES_DIR)); | ||
const externalModuleDir = getInstallDir(); | ||
const moduleDir = path.join(externalModuleDir,"node_modules",module); | ||
return require(moduleDir); | ||
} | ||
function importModule(module) { | ||
if (!IMPORT_SUPPORTED) { | ||
// On Node < 12.17 - fall back to try a require | ||
return new Promise((resolve, reject) => { | ||
try { | ||
const mod = requireModule(module); | ||
resolve(mod); | ||
} catch(err) { | ||
reject(err); | ||
} | ||
}); | ||
} | ||
if (!registryUtil.checkModuleAllowed( module, null,installAllowList,installDenyList)) { | ||
const e = new Error("Module not allowed"); | ||
e.code = "module_not_allowed"; | ||
throw e; | ||
} | ||
const parsedModule = parseModuleName(module); | ||
if (BUILTIN_MODULES.indexOf(parsedModule.module) !== -1) { | ||
return import(parsedModule.module); | ||
} | ||
if (!knownExternalModules[parsedModule.module]) { | ||
const e = new Error("Module not allowed"); | ||
e.code = "module_not_allowed"; | ||
throw e; | ||
} | ||
const externalModuleDir = getInstallDir(); | ||
const moduleDir = path.join(externalModuleDir,"node_modules",module); | ||
// Import needs the full path to the module's main .js file | ||
const moduleFile = require.resolve(moduleDir); | ||
return import(moduleFile); | ||
} | ||
function parseModuleName(module) { | ||
@@ -221,2 +277,5 @@ var match = /((?:@[^/]+\/)?[^/@]+)(?:@([\s\S]+))?/.exec(module); | ||
log.info(log._("server.install.installed", { name: installSpec })); | ||
const runtimeInstalledModules = settings.get("modules") || {}; | ||
runtimeInstalledModules[moduleDetails.module] = moduleDetails; | ||
settings.set("modules",runtimeInstalledModules) | ||
}).catch(result => { | ||
@@ -243,7 +302,8 @@ var output = result.stderr || result.toString(); | ||
module.exports = { | ||
init: init, | ||
register: register, | ||
registerSubflow: registerSubflow, | ||
checkFlowDependencies: checkFlowDependencies, | ||
require: requireModule | ||
init, | ||
register, | ||
registerSubflow, | ||
checkFlowDependencies, | ||
require: requireModule, | ||
import: importModule | ||
} |
@@ -226,4 +226,4 @@ /** | ||
// node.err = "Error: "+node.template+" does not exist"; | ||
node.types = node.types || []; | ||
if (err.code !== 'ENOENT') { | ||
node.types = []; | ||
node.err = err.toString(); | ||
@@ -267,3 +267,3 @@ } | ||
} | ||
isEnabled = info.enabled; | ||
isEnabled = !(info.enabled === false); | ||
} | ||
@@ -358,2 +358,3 @@ | ||
if (!node.enabled) { | ||
console.log("BAIL ON",node.id) | ||
return Promise.resolve(node); | ||
@@ -360,0 +361,0 @@ } else { |
@@ -197,3 +197,3 @@ /** | ||
if (nodeTypeToId.hasOwnProperty(t)) { | ||
set.err = "Type already registered"; | ||
set.err = new Error("Type already registered"); | ||
set.err.code = "type_already_registered"; | ||
@@ -200,0 +200,0 @@ set.err.details = { |
@@ -53,2 +53,12 @@ /** | ||
} | ||
function importModule(name) { | ||
var moduleInfo = require("./index").getModuleInfo(name); | ||
if (moduleInfo && moduleInfo.path) { | ||
var relPath = path.relative(__dirname, moduleInfo.path); | ||
return import(relPath); | ||
} else { | ||
// Require it here to avoid the circular dependency | ||
return require("./externalModules").import(name); | ||
} | ||
} | ||
@@ -65,2 +75,3 @@ function createNodeApi(node) { | ||
require: requireModule, | ||
import: importModule, | ||
comms: { | ||
@@ -67,0 +78,0 @@ publish: function(topic,data,retain) { |
{ | ||
"name": "@node-red/registry", | ||
"version": "2.0.0-beta.2", | ||
"version": "2.0.0", | ||
"license": "Apache-2.0", | ||
@@ -19,3 +19,5 @@ "main": "./lib/index.js", | ||
"dependencies": { | ||
"@node-red/util": "2.0.0-beta.2", | ||
"@node-red/util": "2.0.0", | ||
"clone": "2.1.2", | ||
"fs-extra": "10.0.0", | ||
"semver": "7.3.5", | ||
@@ -22,0 +24,0 @@ "tar": "6.1.0", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
133947
3322
1
6
+ Addedclone@2.1.2
+ Addedfs-extra@10.0.0
+ Added@node-red/util@2.0.0(transitive)
+ Addedfs-extra@10.0.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedjsonfile@6.1.0(transitive)
+ Addeduniversalify@2.0.1(transitive)
- Removed@node-red/util@2.0.0-beta.2(transitive)
Updated@node-red/util@2.0.0