mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Update runtime apis to support multiple libraries
This commit is contained in:
@@ -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
|
||||
|
@@ -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") {
|
||||
|
@@ -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() {
|
||||
|
@@ -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 = $('<tr class="node-info-node-row"><td>Type</td><td></td></tr>').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
|
||||
}
|
||||
})();
|
||||
|
@@ -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;
|
||||
|
@@ -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<String|Object>} - 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<Object>} - the entry listing
|
||||
* @memberof @node-red/runtime_library
|
||||
*/
|
||||
getEntries: function(opts) {
|
||||
return new Promise(function(resolve,reject) {
|
||||
if (opts.type !== 'flows') {
|
||||
return reject(new Error("API only supports flows"));
|
||||
|
||||
}
|
||||
runtime.storage.getAllFlows().then(function(flows) {
|
||||
runtime.log.audit({event: "library.get.all",type:"flow"});
|
||||
var examples = runtime.nodes.getNodeExampleFlows();
|
||||
if (examples) {
|
||||
flows.d = flows.d||{};
|
||||
flows.d._examples_ = examples;
|
||||
}
|
||||
return resolve(flows);
|
||||
});
|
||||
})
|
||||
}
|
||||
}
|
||||
|
101
packages/node_modules/@node-red/runtime/lib/library/examples.js
vendored
Normal file
101
packages/node_modules/@node-red/runtime/lib/library/examples.js
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
var runtime;
|
||||
|
||||
function init(_runtime) {
|
||||
runtime = _runtime;
|
||||
}
|
||||
|
||||
function getEntry(type,path) {
|
||||
var examples = runtime.nodes.getNodeExampleFlows();
|
||||
var result = [];
|
||||
if (path === "") {
|
||||
return Promise.resolve(Object.keys(examples));
|
||||
} else {
|
||||
path = path.replace(/\/$/,"");
|
||||
var parts = path.split("/");
|
||||
var module = parts.shift();
|
||||
if (module[0] === "@") {
|
||||
module = module+"/"+parts.shift();
|
||||
}
|
||||
if (examples.hasOwnProperty(module)) {
|
||||
examples = examples[module];
|
||||
examples = parts.reduce(function(ex,k) {
|
||||
if (ex) {
|
||||
if (ex.d && ex.d[k]) {
|
||||
return ex.d[k]
|
||||
}
|
||||
if (ex.f && ex.f.indexOf(k) > -1) {
|
||||
return runtime.nodes.getNodeExampleFlowPath(module,parts.join("/"));
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},examples);
|
||||
|
||||
if (!examples) {
|
||||
return new Promise(function (resolve,reject) {
|
||||
var error = new Error("not_found");
|
||||
error.code = "not_found";
|
||||
return reject(error);
|
||||
});
|
||||
} else if (typeof examples === 'string') {
|
||||
return new Promise(function(resolve,reject) {
|
||||
try {
|
||||
fs.readFile(examples,'utf8',function(err, data) {
|
||||
runtime.log.audit({event: "library.get",library:"_examples",type:"flow",path:path});
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
return resolve(data);
|
||||
})
|
||||
} catch(err) {
|
||||
return reject(err);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (examples.d) {
|
||||
for (var d in examples.d) {
|
||||
if (examples.d.hasOwnProperty(d)) {
|
||||
result.push(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (examples.f) {
|
||||
examples.f.forEach(function(f) {
|
||||
result.push({fn:f})
|
||||
})
|
||||
}
|
||||
return Promise.resolve(result);
|
||||
}
|
||||
} else {
|
||||
return new Promise(function (resolve,reject) {
|
||||
var error = new Error("not_found");
|
||||
error.code = "not_found";
|
||||
return reject(error);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: '_examples_',
|
||||
init: init,
|
||||
getEntry: getEntry
|
||||
}
|
@@ -14,18 +14,22 @@
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var fs = require('fs');
|
||||
var fspath = require('path');
|
||||
|
||||
var runtime;
|
||||
var knownTypes = {};
|
||||
|
||||
var storage;
|
||||
var libraries = {};
|
||||
|
||||
|
||||
function init(runtime) {
|
||||
knownTypes = {
|
||||
'flows': 'node-red'
|
||||
};
|
||||
|
||||
libraries["_examples_"] = require("./examples");
|
||||
libraries["_examples_"].init(runtime);
|
||||
libraries["local"] = require("./local");
|
||||
libraries["local"].init(runtime);
|
||||
|
||||
function init(_runtime) {
|
||||
runtime = _runtime;
|
||||
storage = runtime.storage;
|
||||
knownTypes = {};
|
||||
}
|
||||
|
||||
function registerType(id,type) {
|
||||
@@ -37,66 +41,34 @@ function registerType(id,type) {
|
||||
knownTypes[type] = id;
|
||||
}
|
||||
|
||||
// function getAllEntries(type) {
|
||||
// if (!knownTypes.hasOwnProperty(type)) {
|
||||
// throw new Error(`Unknown library type '${type}'`);
|
||||
// }
|
||||
// }
|
||||
|
||||
function getEntry(type,path) {
|
||||
if (type !== 'flows') {
|
||||
if (!knownTypes.hasOwnProperty(type)) {
|
||||
throw new Error(`Unknown library type '${type}'`);
|
||||
}
|
||||
return storage.getLibraryEntry(type,path);
|
||||
function getEntry(library,type,path) {
|
||||
if (!knownTypes.hasOwnProperty(type)) {
|
||||
throw new Error(`Unknown library type '${type}'`);
|
||||
}
|
||||
if (libraries.hasOwnProperty(library)) {
|
||||
return libraries[library].getEntry(type,path);
|
||||
} else {
|
||||
return new Promise(function(resolve,reject) {
|
||||
if (path.indexOf("_examples_/") === 0) {
|
||||
var m = /^_examples_\/(@.*?\/[^\/]+|[^\/]+)\/(.*)$/.exec(path);
|
||||
if (m) {
|
||||
var module = m[1];
|
||||
var entryPath = m[2];
|
||||
var fullPath = runtime.nodes.getNodeExampleFlowPath(module,entryPath);
|
||||
if (fullPath) {
|
||||
try {
|
||||
fs.readFile(fullPath,'utf8',function(err, data) {
|
||||
runtime.log.audit({event: "library.get",type:"flow",path:path});
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
return resolve(data);
|
||||
})
|
||||
} catch(err) {
|
||||
return reject(err);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
// IF we get here, we didn't find the file
|
||||
var error = new Error("not_found");
|
||||
error.code = "not_found";
|
||||
return reject(error);
|
||||
} else {
|
||||
resolve(storage.getFlow(path));
|
||||
}
|
||||
});
|
||||
throw new Error(`Unknown library '${library}'`);
|
||||
}
|
||||
}
|
||||
function saveEntry(type,path,meta,body) {
|
||||
if (type !== 'flows') {
|
||||
if (!knownTypes.hasOwnProperty(type)) {
|
||||
throw new Error(`Unknown library type '${type}'`);
|
||||
function saveEntry(library,type,path,meta,body) {
|
||||
if (!knownTypes.hasOwnProperty(type)) {
|
||||
throw new Error(`Unknown library type '${type}'`);
|
||||
}
|
||||
if (libraries.hasOwnProperty(library)) {
|
||||
if (libraries[library].hasOwnProperty("saveEntry")) {
|
||||
return libraries[library].saveEntry(type,path,meta,body);
|
||||
} else {
|
||||
throw new Error(`Library '${library}' is read-only`);
|
||||
}
|
||||
return storage.saveLibraryEntry(type,path,meta,body);
|
||||
} else {
|
||||
return storage.saveFlow(path,body);
|
||||
throw new Error(`Unknown library '${library}'`);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
init: init,
|
||||
register: registerType,
|
||||
// getAllEntries: getAllEntries,
|
||||
getEntry: getEntry,
|
||||
saveEntry: saveEntry
|
||||
|
||||
|
37
packages/node_modules/@node-red/runtime/lib/library/local.js
vendored
Normal file
37
packages/node_modules/@node-red/runtime/lib/library/local.js
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var runtime;
|
||||
var storage;
|
||||
|
||||
function init(_runtime) {
|
||||
runtime = _runtime;
|
||||
storage = runtime.storage;
|
||||
}
|
||||
|
||||
function getEntry(type,path) {
|
||||
return storage.getLibraryEntry(type,path);
|
||||
}
|
||||
function saveEntry(type,path,meta,body) {
|
||||
return storage.saveLibraryEntry(type,path,meta,body);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'local',
|
||||
init: init,
|
||||
getEntry: getEntry,
|
||||
saveEntry: saveEntry
|
||||
}
|
Reference in New Issue
Block a user