From 2a14f769641d63edece20e64a90ad7c1f7c3fe9a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 19 Apr 2026 04:59:40 +0100 Subject: [PATCH] refactor: share plugin validation diagnostics --- src/plugins/channel-validation.ts | 22 ++++---------------- src/plugins/provider-validation.ts | 30 +++++++-------------------- src/plugins/validation-diagnostics.ts | 16 ++++++++++++++ 3 files changed, 28 insertions(+), 40 deletions(-) create mode 100644 src/plugins/validation-diagnostics.ts diff --git a/src/plugins/channel-validation.ts b/src/plugins/channel-validation.ts index ed6913ac324..8e424ca3ea3 100644 --- a/src/plugins/channel-validation.ts +++ b/src/plugins/channel-validation.ts @@ -7,21 +7,7 @@ import { normalizeStringifiedOptionalString, } from "../shared/string-coerce.js"; import type { PluginDiagnostic } from "./manifest-types.js"; - -function pushChannelDiagnostic(params: { - level: PluginDiagnostic["level"]; - pluginId: string; - source: string; - message: string; - pushDiagnostic: (diag: PluginDiagnostic) => void; -}) { - params.pushDiagnostic({ - level: params.level, - pluginId: params.pluginId, - source: params.source, - message: params.message, - }); -} +import { pushPluginValidationDiagnostic } from "./validation-diagnostics.js"; function resolveBundledChannelMeta(id: string): ChannelMeta | undefined { return listChatChannels().find((meta) => meta.id === id); @@ -55,7 +41,7 @@ export function normalizeRegisteredChannelPlugin(params: { normalizeStringifiedOptionalString(params.plugin?.id) ?? ""; if (!id) { - pushChannelDiagnostic({ + pushPluginValidationDiagnostic({ level: "error", pluginId: params.pluginId, source: params.source, @@ -68,7 +54,7 @@ export function normalizeRegisteredChannelPlugin(params: { const rawMeta = params.plugin.meta as Partial | undefined; const rawMetaId = normalizeOptionalString(rawMeta?.id); if (rawMetaId && rawMetaId !== id) { - pushChannelDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, @@ -79,7 +65,7 @@ export function normalizeRegisteredChannelPlugin(params: { const missingFields = collectMissingChannelMetaFields(rawMeta); if (missingFields.length > 0) { - pushChannelDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, diff --git a/src/plugins/provider-validation.ts b/src/plugins/provider-validation.ts index fd01736cf6b..411bc1db9b6 100644 --- a/src/plugins/provider-validation.ts +++ b/src/plugins/provider-validation.ts @@ -2,26 +2,12 @@ import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeTrimmedStringList } from "../shared/string-normalization.js"; import type { PluginDiagnostic } from "./manifest-types.js"; import type { ProviderAuthMethod, ProviderPlugin } from "./types.js"; +import { pushPluginValidationDiagnostic } from "./validation-diagnostics.js"; type ProviderWizardSetup = NonNullable["setup"]>; type ProviderWizardModelPicker = NonNullable["modelPicker"]>; type ProviderWizardModelAllowlist = NonNullable; -function pushProviderDiagnostic(params: { - level: PluginDiagnostic["level"]; - pluginId: string; - source: string; - message: string; - pushDiagnostic: (diag: PluginDiagnostic) => void; -}) { - params.pushDiagnostic({ - level: params.level, - pluginId: params.pluginId, - source: params.source, - message: params.message, - }); -} - function normalizeTextList(values: string[] | undefined): string[] | undefined { const normalized = Array.from(new Set(normalizeTrimmedStringList(values))); return normalized.length > 0 ? normalized : undefined; @@ -78,7 +64,7 @@ function resolveWizardMethodId(params: { if (params.auth.some((method) => method.id === params.methodId)) { return params.methodId; } - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, @@ -166,7 +152,7 @@ function normalizeProviderWizardSetup(params: { return undefined; } if (!hasAuthMethods) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, @@ -203,7 +189,7 @@ function normalizeProviderAuthMethods(params: { for (const method of params.auth) { const methodId = normalizeOptionalString(method.id); if (!methodId) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "error", pluginId: params.pluginId, source: params.source, @@ -213,7 +199,7 @@ function normalizeProviderAuthMethods(params: { continue; } if (seenMethodIds.has(methodId)) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "error", pluginId: params.pluginId, source: params.source, @@ -282,7 +268,7 @@ function normalizeProviderWizard(params: { return undefined; } if (!hasAuthMethods) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, @@ -324,7 +310,7 @@ export function normalizeRegisteredProvider(params: { }): ProviderPlugin | null { const id = normalizeOptionalString(params.provider.id); if (!id) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "error", pluginId: params.pluginId, source: params.source, @@ -359,7 +345,7 @@ export function normalizeRegisteredProvider(params: { const catalog = params.provider.catalog; const discovery = params.provider.discovery; if (catalog && discovery) { - pushProviderDiagnostic({ + pushPluginValidationDiagnostic({ level: "warn", pluginId: params.pluginId, source: params.source, diff --git a/src/plugins/validation-diagnostics.ts b/src/plugins/validation-diagnostics.ts new file mode 100644 index 00000000000..bc8b9dcebf0 --- /dev/null +++ b/src/plugins/validation-diagnostics.ts @@ -0,0 +1,16 @@ +import type { PluginDiagnostic } from "./manifest-types.js"; + +export function pushPluginValidationDiagnostic(params: { + level: PluginDiagnostic["level"]; + pluginId: string; + source: string; + message: string; + pushDiagnostic: (diag: PluginDiagnostic) => void; +}) { + params.pushDiagnostic({ + level: params.level, + pluginId: params.pluginId, + source: params.source, + message: params.message, + }); +}