mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Add RED.import to support importing ES6 modules
This commit is contained in:
@@ -48,7 +48,7 @@ async function refreshExternalModules() {
|
||||
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 = {};
|
||||
}
|
||||
@@ -101,6 +101,31 @@ function requireModule(module) {
|
||||
const moduleDir = path.join(externalModuleDir,"node_modules",module);
|
||||
return require(moduleDir);
|
||||
}
|
||||
function importModule(module) {
|
||||
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) {
|
||||
var match = /((?:@[^/]+\/)?[^/@]+)(?:@([\s\S]+))?/.exec(module);
|
||||
@@ -254,5 +279,6 @@ module.exports = {
|
||||
register: register,
|
||||
registerSubflow: registerSubflow,
|
||||
checkFlowDependencies: checkFlowDependencies,
|
||||
require: requireModule
|
||||
require: requireModule,
|
||||
import: importModule
|
||||
}
|
||||
|
@@ -50,6 +50,16 @@ function requireModule(name) {
|
||||
return require("./externalModules").require(name);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
function createNodeApi(node) {
|
||||
var red = {
|
||||
@@ -61,6 +71,7 @@ function createNodeApi(node) {
|
||||
util: runtime.util,
|
||||
version: runtime.version,
|
||||
require: requireModule,
|
||||
import: importModule,
|
||||
comms: {
|
||||
publish: function(topic,data,retain) {
|
||||
events.emit("comms",{
|
||||
|
Reference in New Issue
Block a user