/** * 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. **/ const {events} = require("@node-red/util") const knownTypes = {}; const libraries = {}; const libraryPlugins = {}; // Libraries defined in the settings file. Their configurations // cannot be modified in the editor. let runtimeLibraries = []; // Libraries defined by the user in the editor. let userLibraries = []; function init(runtime) { events.on("registry:plugin-added", function(id) { const plugin = runtime.plugins.getPlugin(id); if (plugin.type === "node-red-library-source") { libraryPlugins[plugin.id] = plugin; runtimeLibraries.forEach(library => { if (library.type === id) { library.local = false; libraries[library.id] = new plugin.class(library) if (libraries[library.id].init) { libraries[library.id].init(); } } }) } }) knownTypes.flows = 'node-red'; libraries["examples"] = require("./examples"); libraries["examples"].init(runtime); libraries["local"] = require("./local"); libraries["local"].init(runtime); try { runtimeLibraries = runtime.settings.editorTheme.library.sources; } catch(err) { runtimeLibraries = []; } // userLibraries = runtime.settings.get("library") } function registerType(id,type) { // TODO: would like to enforce this, but currently the tests register the same type multiple // times and have no way to remove themselves. // if (knownTypes.hasOwnProperty(type)) { // throw new Error(`Library type '${type}' already registered by ${id}'`) // } knownTypes[type] = id; } 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 { throw new Error(`Unknown library '${library}'`); } } 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].saveEntry) { return libraries[library].saveEntry(type,path,meta,body); } else { throw new Error(`Library '${library}' is read-only`); } } else { throw new Error(`Unknown library '${library}'`); } } 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'] } ]; 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 }) } } } return libraryList; } module.exports = { init: init, getLibraries: getLibraries, register: registerType, getEntry: getEntry, saveEntry: saveEntry }