diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/index.js b/packages/node_modules/@node-red/editor-api/lib/admin/index.js
index 34c47b2cb..5de09acad 100644
--- a/packages/node_modules/@node-red/editor-api/lib/admin/index.js
+++ b/packages/node_modules/@node-red/editor-api/lib/admin/index.js
@@ -67,6 +67,11 @@ module.exports = {
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,apiUtil.errorHandler);
adminApp.put(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,apiUtil.errorHandler);
+ // NPM Modules
+ adminApp.get("/modules", needsPermission("nodes.read"), nodes.listNPMModules, apiUtil.errorHandler);
+ adminApp.delete("/modules/:spec", needsPermission("nodes.write"), nodes.uninstallNPMModule, apiUtil.errorHandler);
+ adminApp.post("/modules", needsPermission("nodes.write"), nodes.updateNPMModule, apiUtil.errorHandler);
+
// Context
adminApp.get("/context/:scope(global)",needsPermission("context.read"),context.get,apiUtil.errorHandler);
adminApp.get("/context/:scope(global)/*",needsPermission("context.read"),context.get,apiUtil.errorHandler);
diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js
index 058053a29..77efedd11 100644
--- a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js
+++ b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js
@@ -191,5 +191,45 @@ module.exports = {
runtimeAPI.nodes.getIconList(opts).then(function(list) {
res.json(list);
});
+ },
+
+ listNPMModules: function(req, res) {
+ var opts = {
+ user: req.user,
+ req: apiUtils.getRequestLogObject(req)
+ }
+ runtimeAPI.nodes.listNPMModules(opts).then(function(list) {
+ res.json(list);
+ }).catch(err => {
+ apiUtils.rejectHandler(req,res,err);
+ });;
+ },
+
+ uninstallNPMModule: function(req, res) {
+ var opts = {
+ user: req.user,
+ spec: req.params.spec,
+ req: apiUtils.getRequestLogObject(req)
+ }
+ runtimeAPI.nodes.uninstallNPMModule(opts).then(function(result) {
+ res.json(result);
+ }).catch(err => {
+ apiUtils.rejectHandler(req,res,err);
+ });
+ },
+
+ updateNPMModule: function(req, res) {
+ var body = req.body;
+ var opts = {
+ user: req.user,
+ spec: body.spec,
+ update: body.update,
+ req: apiUtils.getRequestLogObject(req)
+ }
+ runtimeAPI.nodes.updateNPMModule(opts).then(function(result) {
+ res.json(result);
+ }).catch(err => {
+ apiUtils.rejectHandler(req,res,err);
+ });
}
};
diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html
index 74f2c0f75..e28413790 100644
--- a/packages/node_modules/@node-red/nodes/core/function/10-function.html
+++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html
@@ -1,280 +1,3 @@
-
-
-
-
-
-
diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js
index 708cdba0b..1b53374c2 100644
--- a/packages/node_modules/@node-red/nodes/core/function/10-function.js
+++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js
@@ -17,18 +17,6 @@
module.exports = function(RED) {
"use strict";
- function LibsConfigNode(n) {
- RED.nodes.createNode(this, n);
- this.name = n.name;
- this.libs = n.libs;
- }
- RED.nodes.registerType("library-config", LibsConfigNode);
-
- RED.httpNode.get("/function/modules", function (req, res) {
- var list = RED.nodes.listNPMModules();
- res.send(list);
- });
-
var util = require("util");
var vm = require("vm");
@@ -101,9 +89,8 @@ module.exports = function(RED) {
}
function FunctionNode(n) {
- var libConf = RED.nodes.getNode(n.libs);
- var libs = libConf ? libConf.libs : [];
- n.modules = libs.map(x => x.name).filter(x => (x && (x !== "")));
+ var libs = n.libs || [];
+ n.modules = libs.map(x => x.spec).filter(x => (x && (x !== "")));
var loadPromise = RED.nodes.createNode(this,n);
var node = this;
node.name = n.name;
@@ -301,7 +288,8 @@ module.exports = function(RED) {
});
// wait for module installation
- loadPromise.then(function () {
+ loadPromise.catch(()=>{
+ }).finally(function () {
if (node.hasOwnProperty("libs")) {
var modules = node.libs;
modules.forEach(module => {
@@ -309,11 +297,14 @@ module.exports = function(RED) {
if (vname && (vname !== "")) {
sandbox[vname] = null;
try {
- var lib = RED.require(module.name);
- sandbox[vname] = lib;
+ var spec = module.spec;
+ if (spec && (spec !== "")) {
+ var lib = RED.require(module.spec);
+ sandbox[vname] = lib;
+ }
}
catch (e) {
- node.warn("failed to load library: "+ module.name);
+ node.warn("failed to load library: "+ module.spec);
}
}
});
diff --git a/packages/node_modules/@node-red/registry/lib/util.js b/packages/node_modules/@node-red/registry/lib/util.js
index 8dda6ece5..15eca575b 100644
--- a/packages/node_modules/@node-red/registry/lib/util.js
+++ b/packages/node_modules/@node-red/registry/lib/util.js
@@ -83,7 +83,7 @@ function createNodeApi(node) {
httpAdmin: runtime.adminApp,
server: runtime.server
}
- copyObjectProperties(runtime.nodes,red.nodes,["createNode","getNode","eachNode","addCredentials","getCredentials","deleteCredentials", "listNPMModules"]);
+ copyObjectProperties(runtime.nodes,red.nodes,["createNode","getNode","eachNode","addCredentials","getCredentials","deleteCredentials"]);
red.nodes.registerType = function(type,constructor,opts) {
runtime.nodes.registerType(node.id,type,constructor,opts);
}
diff --git a/packages/node_modules/@node-red/runtime/lib/api/nodes.js b/packages/node_modules/@node-red/runtime/lib/api/nodes.js
index 556e57df9..3e74e3a97 100644
--- a/packages/node_modules/@node-red/runtime/lib/api/nodes.js
+++ b/packages/node_modules/@node-red/runtime/lib/api/nodes.js
@@ -447,5 +447,47 @@ var api = module.exports = {
} else {
return null
}
+ },
+
+ /**
+ * Gets list of NPM modules
+ * @param {Object} opts
+ * @param {User} opts.user - the user calling the api
+ * @param {Object} opts.req - the request to log (optional)
+ * @return {Promise} - list of installed NPM modules
+ * @memberof @node-red/runtime_nodes
+ */
+ listNPMModules: async function(opts) {
+ var promise = runtime.nodes.listNPMModules();
+ return promise;
+ },
+
+ /**
+ * Uninstall NPM modules
+ * @param {Object} opts
+ * @param {User} opts.user - the user calling the api
+ * @param {Object} opts.req - the request to log (optional)
+ * @return {Promise