diff --git a/packages/lib/src/config/definitions.ts b/packages/lib/src/config/definitions.ts index 671eec66..cfed9f21 100644 --- a/packages/lib/src/config/definitions.ts +++ b/packages/lib/src/config/definitions.ts @@ -842,6 +842,10 @@ export function addPluginConfigFields(pluginInfos: PluginNodeEnvInfo[] | PluginW if (pluginInfo.instanceEntrypoint) { addPluginFieldDefinitions(pluginInfo, "instanceConfigFields", InstanceConfig); } + if (pluginInfo.ctlConfigFields) { + validateFieldNames(pluginInfo.name, pluginInfo.ctlConfigFields); + Object.assign(CtlConfig.fieldDefinitions, pluginInfo.ctlConfigFields); + } } } diff --git a/test/lib/config/definitions.js b/test/lib/config/definitions.js new file mode 100644 index 00000000..a406f579 --- /dev/null +++ b/test/lib/config/definitions.js @@ -0,0 +1,30 @@ +import assert from "node:assert/strict"; + +import * as lib from "@clusterio/lib"; + + +describe("lib/config/definitions", function() { + describe("addPluginConfigFields()", function() { + after(function() { + delete lib.CtlConfig.fieldDefinitions["ctl_test.field"]; + }); + + it("should add ctl config fields", function() { + lib.addPluginConfigFields([{ + name: "ctl_test", + ctlConfigFields: { "ctl_test.field": { type: "string", initialValue: "value" } }, + }]); + const config = new lib.CtlConfig("control"); + assert.equal(config.get("ctl_test.field"), "value"); + }); + it("should reject ctl config fields not named after the plugin", function() { + assert.throws( + () => lib.addPluginConfigFields([{ + name: "ctl_test", + ctlConfigFields: { "other.field": { type: "string" } }, + }]), + new Error("Expected name of config field 'other.field' for ctl_test to start with 'ctl_test.'") + ); + }); + }); +});