Add partial implementation of adding library sources via editor

This adds lots of commented out code that provides a settings panel
to add new library sources. It is incomplete as it doesn't actually
add/update the library sources on the runtime.

For 1.3, I'm focussing on allowing additional sources get added
via the settings file only. I've done enough work on the editor
side to convince myself more work is needed than I can justify
at this time on what is otherwise not going to be a widely
used feature.
This commit is contained in:
Nick O'Leary
2021-01-22 11:20:28 +00:00
committed by Nick O'Leary
parent 8a076c01ab
commit 3f9a29730f
13 changed files with 393 additions and 39 deletions

View File

@@ -25,6 +25,27 @@ var api = module.exports = {
runtime = _runtime;
},
// /* *
// * Gets the configuration of a library source.
// * @param {Object} opts
// * @param {User} opts.user - the user calling the api
// * @param {String} opts.library - the library
// * @param {Object} opts.req - the request to log (optional)
// * @return {Promise<String|Object>} - resolves when complete
// * @memberof @node-red/runtime_library
// */
// getConfig: async function(opts) {
// runtime.log.audit({event: "library.getConfig",library:opts.library}, opts.req);
// try {
// return runtime.library.getConfig(opts.library)
// } catch(err) {
// var error = new Error();
// error.code = "not_found";
// error.status = 404;
// throw error;
// }
// },
/**
* Gets an entry from the library.
* @param {Object} opts

View File

@@ -95,7 +95,11 @@ function getEntry(type,path) {
}
module.exports = {
name: '_examples_',
id: "examples",
label: "editor:library.types.examples",
icon: "font-awesome/fa-life-ring",
types: ["flows"],
readOnly: true,
init: init,
getEntry: getEntry
}

View File

@@ -18,6 +18,7 @@
const {events} = require("@node-red/util")
const knownTypes = {};
const libraries = {};
const libraryConfigs = {};
const libraryPlugins = {};
// Libraries defined in the settings file. Their configurations
@@ -37,7 +38,9 @@ function init(runtime) {
runtimeLibraries.forEach(library => {
if (library.type === id) {
library.local = false;
libraryConfigs[library.id] = library;
libraries[library.id] = new plugin.class(library)
libraryConfigs[library.id].type = id;
if (libraries[library.id].init) {
libraries[library.id].init();
}
@@ -49,11 +52,13 @@ function init(runtime) {
})
knownTypes.flows = 'node-red';
libraries["local"] = require("./local");
libraries["local"].init(runtime);
libraryConfigs["local"] = libraries["local"]
libraries["examples"] = require("./examples");
libraries["examples"].init(runtime);
libraries["local"] = require("./local");
libraries["local"].init(runtime);
libraryConfigs["examples"] = libraries["examples"]
try {
runtimeLibraries = runtime.settings.editorTheme.library.sources;
@@ -100,42 +105,58 @@ function saveEntry(library,type,path,meta,body) {
}
function getLibraries() {
const libraryList = [
{
id: "local",
label: "editor:library.types.local",
user: false,
icon: "fa fa-bath"
},
{
id: "examples",
label: "editor:library.types.examples",
user: false,
readOnly: true,
types: ['flows']
}
];
const libraryList = []
for (let id in libraries) {
if (libraries.hasOwnProperty(id)) {
if (id !== 'local' && id !== 'examples') {
libraryList.push({
id: id,
label: libraries[id].name || id,
user: false,
icon: libraries[id].icon
})
var config = getConfig(id);
// Don't include the full configuration of each library when providing
// the list of all libraries
delete config.config;
libraryList.push(config);
}
}
return libraryList;
}
function getConfig(id) {
var lib = {
id: id,
label: libraryConfigs[id].label || id,
user: false,
icon: libraryConfigs[id].icon
}
if (libraryConfigs[id].types) {
lib.types = libraryConfigs[id].types
}
if (libraryConfigs[id].readOnly) {
lib.readOnly = libraryConfigs[id].readOnly
}
if (libraryConfigs[id].type) {
lib.type = libraryConfigs[id].type;
var def = libraryPlugins[lib.type];
if (def && def.defaults) {
lib.config = {};
for (var d in def.defaults) {
if (def.defaults.hasOwnProperty(d)) {
if (def.defaults[d].type !== 'password') {
lib.config[d] = libraryConfigs[id][d];
} else if (!!libraryConfigs[id][d]) {
lib.config["has_"+d] = true;
}
}
}
}
}
return libraryList;
return lib;
}
module.exports = {
init: init,
getLibraries: getLibraries,
// getConfig: getConfig,
register: registerType,
getEntry: getEntry,
saveEntry: saveEntry

View File

@@ -30,7 +30,9 @@ function saveEntry(type,path,meta,body) {
}
module.exports = {
name: 'local',
id: "local",
label: "editor:library.types.local",
icon: "font-awesome/fa-hdd-o",
init: init,
getEntry: getEntry,
saveEntry: saveEntry