diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/index.js b/packages/node_modules/@node-red/editor-api/lib/editor/index.js
index dbf4c18f2..d29ab0b1b 100644
--- a/packages/node_modules/@node-red/editor-api/lib/editor/index.js
+++ b/packages/node_modules/@node-red/editor-api/lib/editor/index.js
@@ -93,9 +93,8 @@ module.exports = {
// Library
var library = require("./library");
library.init(runtimeAPI);
- editorApp.get("/library/flows",needsPermission("library.read"),library.getAll,apiUtil.errorHandler);
- editorApp.get(/library\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
- editorApp.post(/library\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
+ editorApp.get(/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
+ editorApp.post(/library\/([^\/]+)\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
// Credentials
diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/library.js b/packages/node_modules/@node-red/editor-api/lib/editor/library.js
index e8b09424a..47a41bb7b 100644
--- a/packages/node_modules/@node-red/editor-api/lib/editor/library.js
+++ b/packages/node_modules/@node-red/editor-api/lib/editor/library.js
@@ -25,23 +25,12 @@ module.exports = {
init: function(_runtimeAPI) {
runtimeAPI = _runtimeAPI;
},
-
- getAll: function(req,res) {
- var opts = {
- user: req.user,
- type: 'flows'
- }
- runtimeAPI.library.getEntries(opts).then(function(result) {
- res.json(result);
- }).catch(function(err) {
- apiUtils.rejectHandler(req,res,err);
- });
- },
getEntry: function(req,res) {
var opts = {
user: req.user,
- type: req.params[0],
- path: req.params[1]||""
+ library: req.params[0],
+ type: req.params[1],
+ path: req.params[2]||""
}
runtimeAPI.library.getEntry(opts).then(function(result) {
if (typeof result === "string") {
@@ -62,8 +51,9 @@ module.exports = {
saveEntry: function(req,res) {
var opts = {
user: req.user,
- type: req.params[0],
- path: req.params[1]||""
+ library: req.params[0],
+ type: req.params[1],
+ path: req.params[2]||""
}
// TODO: horrible inconsistencies between flows and all other types
if (opts.type === "flows") {
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js
index fd339c5c3..5ace86456 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js
@@ -78,7 +78,7 @@ RED.clipboard = (function() {
var filename = $("#clipboard-dialog-tab-library-name").val().trim();
var saveFlow = function() {
$.ajax({
- url:'library/flows/'+selectedPath.path + filename,
+ url:'library/'+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path + filename,
type: "POST",
data: flowToExport,
contentType: "application/json; charset=utf-8"
@@ -139,7 +139,7 @@ RED.clipboard = (function() {
} else {
var selectedPath = libraryBrowser.getSelected();
if (selectedPath.path) {
- $.get('library/flows/'+selectedPath.path, function(data) {
+ $.get('library/'+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path, function(data) {
RED.view.importNodes(data,addNewFlow);
});
}
@@ -609,59 +609,39 @@ RED.clipboard = (function() {
$("#clipboard-dialog-download").show();
}
- function transformFlowList(list,label,root,includeExamples) {
- var result = {
- icon: root===""?"fa fa-archive":'fa fa-folder',
- label: label,
- path: root
- };
- result.children = [];
-
- if (list.f) {
- list.f.forEach(function(f) {
- result.children.push({
- icon: 'fa fa-file-o',
- label: f,
- path: root+f
- });
- });
- }
- if (list.d) {
- for (var l in list.d) {
- if (list.d.hasOwnProperty(l)) {
- if (root+l !== "_examples_") {
- result.children.push(transformFlowList(list.d[l], l,root+l+"/",includeExamples))
- } else if (includeExamples) {
- result._examples = transformFlowList(list.d[l], l,root+l+"/",includeExamples)
- }
- }
- }
- }
- result.children.sort(function(A,B){
- if (A.children && !B.children) {
- return -1;
- } else if (!A.children && B.children) {
- return 1;
- } else {
- return A.label.localeCompare(B.label);
- }
- });
- return result;
- }
function loadFlowLibrary(browser,includeExamples) {
- $.getJSON("library/flows", function(data) {
- var listing = [transformFlowList(data,RED._("library.types.local"),"",includeExamples)];
- listing[0].expanded = true;
- if (includeExamples && listing[0]._examples) {
- var examples = listing[0]._examples;
- delete listing[0]._examples;
- examples.label = RED._("library.types.examples");
- examples.icon = "fa fa-archive";
- listing.unshift(examples)
+ var listing = [];
+ if (includeExamples) {
+ listing.push({
+ library: "_examples_",
+ type: "flows",
+ icon: 'fa fa-hdd-o',
+ label: RED._("library.types.examples"),
+ path: "",
+ children: function(item,done) {
+ RED.library.loadLibraryFolder("_examples_","flows","",function(children) {
+ item.children = children;
+ done(children);
+ })
+ }
+ })
+ }
+ listing.push({
+ library: "local",
+ type: "flows",
+ icon: 'fa fa-hdd-o',
+ label: RED._("library.types.local"),
+ path: "",
+ expanded: true,
+ children: function(item,done) {
+ RED.library.loadLibraryFolder("local","flows","",function(children) {
+ item.children = children;
+ done(children);
+ })
}
- browser.data(listing);
- });
+ })
+ browser.data(listing);
}
function hideDropTarget() {
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
index 7c8b5d811..b78a31a8b 100755
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
@@ -58,7 +58,6 @@ RED.library = (function() {
}
var filename = $("#node-dialog-library-save-filename").val().trim()
var selectedPath = saveLibraryBrowser.getSelected();
- console.log(selectedPath);
if (!selectedPath.children) {
selectedPath = selectedPath.parent;
}
@@ -75,7 +74,7 @@ RED.library = (function() {
data.text = activeLibrary.editor.getValue();
var saveFlow = function() {
$.ajax({
- url:"library/"+activeLibrary.url+'/'+selectedPath.path + filename,
+ url:"library/"+selectedPath.library+'/'+selectedPath.type+'/'+selectedPath.path + filename,
type: "POST",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8"
@@ -89,8 +88,6 @@ RED.library = (function() {
}
});
}
- console.log(filename);
- console.log(selectedPath);
if (selectedPath.children) {
var exists = false;
selectedPath.children.forEach(function(f) {
@@ -125,16 +122,18 @@ RED.library = (function() {
}
}
- function loadLibraryFolder(url,root,done) {
- $.getJSON("library/"+url+"/"+root,function(data) {
+ function loadLibraryFolder(library,type,root,done) {
+ $.getJSON("library/"+library+"/"+type+"/"+root,function(data) {
var items = data.map(function(d) {
if (typeof d === "string") {
return {
+ library: library,
+ type: type,
icon: 'fa fa-folder',
label: d,
path: root+d+"/",
children: function(item,done) {
- loadLibraryFolder(url,root+d+"/", function(children) {
+ loadLibraryFolder(library,type,root+d+"/", function(children) {
item.children = children; // TODO: should this be done by treeList for us
done(children);
})
@@ -142,6 +141,8 @@ RED.library = (function() {
};
} else {
return {
+ library: library,
+ type: type,
icon: 'fa fa-file-o',
label: d.fn,
path: root+d.fn,
@@ -209,9 +210,11 @@ RED.library = (function() {
$('#node-input-'+options.type+'-menu-open-library').click(function(e) {
activeLibrary = options;
- loadLibraryFolder(options.url, "", function(items) {
+ loadLibraryFolder("local",options.url, "", function(items) {
var listing = [{
- icon: 'fa fa-archive',
+ library: "local",
+ type: options.url,
+ icon: 'fa fa-hdd-o',
label: RED._("library.types.local"),
path: "",
expanded: true,
@@ -255,7 +258,7 @@ RED.library = (function() {
}
$("#node-dialog-library-save-filename").attr("value",filename+".js");
- loadLibraryFolder(options.url, "", function(items) {
+ loadLibraryFolder("local",options.url, "", function(items) {
var listing = [{
icon: 'fa fa-archive',
label: RED._("library.types.local"),
@@ -483,7 +486,7 @@ RED.library = (function() {
var table = $("#node-dialog-library-load-preview-details-table").empty();
selectedLibraryItem = file.props;
if (file && file.label && !file.children) {
- $.get("library/"+activeLibrary.url+"/"+file.path, function(data) {
+ $.get("library/"+file.library+"/"+file.type+"/"+file.path, function(data) {
//TODO: nls + sanitize
var propRow = $('
Type | |
').appendTo(table);
$(propRow.children()[1]).text(activeLibrary.type);
@@ -516,6 +519,7 @@ RED.library = (function() {
},
create: createUI,
createBrowser:createBrowser,
- export: exportFlow
+ export: exportFlow,
+ loadLibraryFolder: loadLibraryFolder
}
})();
diff --git a/packages/node_modules/@node-red/registry/lib/library.js b/packages/node_modules/@node-red/registry/lib/library.js
index 9f7c6e8b2..1eea6ed56 100644
--- a/packages/node_modules/@node-red/registry/lib/library.js
+++ b/packages/node_modules/@node-red/registry/lib/library.js
@@ -16,7 +16,6 @@
var fs = require('fs');
var fspath = require('path');
-var when = require('when');
var runtime;
@@ -24,7 +23,7 @@ var exampleRoots = {};
var exampleFlows = null;
function getFlowsFromPath(path) {
- return when.promise(function(resolve,reject) {
+ return new Promise(function(resolve,reject) {
var result = {};
fs.readdir(path,function(err,files) {
var promises = [];
@@ -37,11 +36,11 @@ function getFlowsFromPath(path) {
promises.push(getFlowsFromPath(fullPath));
} else if (/\.json$/.test(file)){
validFiles.push(file);
- promises.push(when.resolve(file.split(".")[0]))
+ promises.push(Promise.resolve(file.split(".")[0]))
}
})
var i=0;
- when.all(promises).then(function(results) {
+ Promise.all(promises).then(function(results) {
results.forEach(function(r) {
if (typeof r === 'string') {
result.f = result.f||[];
@@ -62,21 +61,20 @@ function getFlowsFromPath(path) {
function addNodeExamplesDir(module,path) {
exampleRoots[module] = path;
return getFlowsFromPath(path).then(function(result) {
- exampleFlows = exampleFlows||{d:{}};
- exampleFlows.d[module] = result;
+ exampleFlows = exampleFlows||{};
+ exampleFlows[module] = result;
});
}
function removeNodeExamplesDir(module) {
delete exampleRoots[module];
- if (exampleFlows && exampleFlows.d) {
- delete exampleFlows.d[module];
+ if (exampleFlows) {
+ delete exampleFlows[module];
}
- if (exampleFlows && Object.keys(exampleFlows.d).length === 0) {
+ if (exampleFlows && Object.keys(exampleFlows).length === 0) {
exampleFlows = null;
}
}
-
function init() {
exampleRoots = {};
exampleFlows = null;
diff --git a/packages/node_modules/@node-red/runtime/lib/api/library.js b/packages/node_modules/@node-red/runtime/lib/api/library.js
index 6f6571463..31037858b 100644
--- a/packages/node_modules/@node-red/runtime/lib/api/library.js
+++ b/packages/node_modules/@node-red/runtime/lib/api/library.js
@@ -29,6 +29,7 @@ var api = module.exports = {
* Gets an entry from the library.
* @param {Object} opts
* @param {User} opts.user - the user calling the api
+ * @param {String} opts.library - the library
* @param {String} opts.type - the type of entry
* @param {String} opts.path - the path of the entry
* @return {Promise} - resolves when complete
@@ -36,12 +37,12 @@ var api = module.exports = {
*/
getEntry: function(opts) {
return new Promise(function(resolve,reject) {
- runtime.library.getEntry(opts.type,opts.path).then(function(result) {
- runtime.log.audit({event: "library.get",type:opts.type,path:opts.path});
+ runtime.library.getEntry(opts.library,opts.type,opts.path).then(function(result) {
+ runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path});
return resolve(result);
}).catch(function(err) {
if (err) {
- runtime.log.warn(runtime.log._("api.library.error-load-entry",{path:opts.path,message:err.toString()}));
+ runtime.log.warn(runtime.log._("api.library.error-load-entry",{library:opts.library,type:opts.type,path:opts.path,message:err.toString()}));
if (err.code === 'forbidden') {
err.status = 403;
return reject(err);
@@ -50,10 +51,10 @@ var api = module.exports = {
} else {
err.status = 400;
}
- runtime.log.audit({event: "library.get",type:opts.type,path:opts.path,error:err.code});
+ runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,path:opts.path,error:err.code});
return reject(err);
}
- runtime.log.audit({event: "library.get",type:opts.type,error:"not_found"});
+ runtime.log.audit({event: "library.get",library:opts.library,type:opts.type,error:"not_found"});
var error = new Error();
error.code = "not_found";
error.status = 404;
@@ -66,6 +67,7 @@ var api = module.exports = {
* Saves an entry to the library
* @param {Object} opts
* @param {User} opts.user - the user calling the api
+ * @param {String} opts.library - the library
* @param {String} opts.type - the type of entry
* @param {String} opts.path - the path of the entry
* @param {Object} opts.meta - any meta data associated with the entry
@@ -75,7 +77,7 @@ var api = module.exports = {
*/
saveEntry: function(opts) {
return new Promise(function(resolve,reject) {
- runtime.library.saveEntry(opts.type,opts.path,opts.meta,opts.body).then(function() {
+ runtime.library.saveEntry(opts.library,opts.type,opts.path,opts.meta,opts.body).then(function() {
runtime.log.audit({event: "library.set",type:opts.type,path:opts.path});
return resolve();
}).catch(function(err) {
@@ -91,30 +93,5 @@ var api = module.exports = {
return reject(error);
});
})
- },
- /**
- * Returns a complete listing of all entries of a given type in the library.
- * @param {Object} opts
- * @param {User} opts.user - the user calling the api
- * @param {String} opts.type - the type of entry
- * @return {Promise