From c744af161de584f798f5adc5044d24108cc3fe78 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 19 Feb 2021 11:59:49 +0000 Subject: [PATCH] Add support for settings object in plugin definition --- .../@node-red/registry/lib/index.js | 3 +- .../@node-red/registry/lib/plugins.js | 64 +++++++++++++++++-- .../@node-red/runtime/lib/api/settings.js | 1 + .../@node-red/runtime/lib/plugins.js | 1 + 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/registry/lib/index.js b/packages/node_modules/@node-red/registry/lib/index.js index 251b04971..18c30f0fc 100644 --- a/packages/node_modules/@node-red/registry/lib/index.js +++ b/packages/node_modules/@node-red/registry/lib/index.js @@ -304,7 +304,8 @@ module.exports = { getPluginsByType: plugins.getPluginsByType, getPluginList: plugins.getPluginList, getPluginConfigs: plugins.getPluginConfigs, - + exportPluginSettings: plugins.exportPluginSettings, + deprecated: require("./deprecated") }; diff --git a/packages/node_modules/@node-red/registry/lib/plugins.js b/packages/node_modules/@node-red/registry/lib/plugins.js index 82b230011..182ad5bb6 100644 --- a/packages/node_modules/@node-red/registry/lib/plugins.js +++ b/packages/node_modules/@node-red/registry/lib/plugins.js @@ -1,11 +1,13 @@ const registry = require("./registry"); -const {events} = require("@node-red/util") +const {events} = require("@node-red/util"); +const clone = require("clone"); -var pluginConfigCache = {}; -var pluginToId = {}; -var plugins = {}; -var pluginsByType = {}; -var settings; +let pluginConfigCache = {}; +let pluginToId = {}; +let plugins = {}; +let pluginsByType = {}; +let pluginSettings = {}; +let settings; function init(_settings) { settings = _settings; @@ -13,6 +15,7 @@ function init(_settings) { pluginConfigCache = {}; pluginToId = {}; pluginsByType = {}; + pluginSettings = {}; } function registerPlugin(nodeSetId,id,definition) { @@ -32,6 +35,11 @@ function registerPlugin(nodeSetId,id,definition) { pluginsByType[definition.type] = pluginsByType[definition.type] || []; pluginsByType[definition.type].push(definition); } + if (definition.settings) { + pluginSettings[id] = definition.settings; + } + + if (definition.onadd && typeof definition.onadd === 'function') { definition.onadd(); } @@ -93,11 +101,53 @@ function getPluginList() { return list; } +function exportPluginSettings(safeSettings) { + for (let id in pluginSettings) { + if (pluginSettings.hasOwnProperty(id)) { + if (settings.hasOwnProperty(id) && !safeSettings.hasOwnProperty(id)) { + let pluginTypeSettings = pluginSettings[id]; + let exportedSet = {}; + let defaultExportable = false; + if (pluginTypeSettings['*'] && pluginTypeSettings['*'].hasOwnProperty("exportable")) { + defaultExportable = pluginTypeSettings['*'].exportable; + } + if (defaultExportable) { + exportedSet = clone(settings[id]); + } + for (let property in pluginTypeSettings) { + if (pluginTypeSettings.hasOwnProperty(property)) { + let setting = pluginTypeSettings[property]; + if (defaultExportable) { + if (setting.exportable === false) { + delete exportedSet[property] + } else if (!exportedSet.hasOwnProperty(property) && setting.hasOwnProperty('value')) { + exportedSet[property] = setting.value; + } + } else if (setting.exportable) { + if (settings[id].hasOwnProperty(property)) { + exportedSet[property] = settings[id][property]; + } else if (setting.hasOwnProperty('value')) { + exportedSet[property] = setting.value; + } + } + } + } + if (Object.keys(exportedSet).length > 0) { + safeSettings[id] = exportedSet; + } + } + } + } + + return safeSettings; +} + module.exports = { init, registerPlugin, getPlugin, getPluginsByType, getPluginConfigs, - getPluginList + getPluginList, + exportPluginSettings } \ No newline at end of file diff --git a/packages/node_modules/@node-red/runtime/lib/api/settings.js b/packages/node_modules/@node-red/runtime/lib/api/settings.js index 07d09e379..02f991722 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/settings.js +++ b/packages/node_modules/@node-red/runtime/lib/api/settings.js @@ -130,6 +130,7 @@ var api = module.exports = { safeSettings.flowEncryptionType = runtime.nodes.getCredentialKeyType(); runtime.settings.exportNodeSettings(safeSettings); + runtime.plugins.exportPluginSettings(safeSettings); } return safeSettings; diff --git a/packages/node_modules/@node-red/runtime/lib/plugins.js b/packages/node_modules/@node-red/runtime/lib/plugins.js index 738a64fa7..bedeabb4c 100644 --- a/packages/node_modules/@node-red/runtime/lib/plugins.js +++ b/packages/node_modules/@node-red/runtime/lib/plugins.js @@ -7,4 +7,5 @@ module.exports = { getPluginsByType: registry.getPluginsByType, getPluginList: registry.getPluginList, getPluginConfigs: registry.getPluginConfigs, + exportPluginSettings: registry.exportPluginSettings } \ No newline at end of file