From 7d5e1796618aba914309a1b0aafd79546570c999 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 16 Apr 2026 18:20:47 +0200 Subject: [PATCH] refactor(ui-common): derive UIServerConfigurationSection from Zod schema Make uiServerConfigSchema the single source of truth for the UI server configuration shape. The hand-written interface in ConfigurationType.ts is removed; UIServerConfigurationSection is now inferred via z.infer<>. - Tighten schema: protocol and version use z.enum() instead of z.string() (follows existing z.enum(AuthenticationType) pattern, Zod v4) - Export UIServerConfigurationSection as the primary inferred type - Export UIServerConfig as a backward-compat alias - ConfigurationType.ts imports UIServerConfigurationSection from schema.ts and re-exports only ConfigurationData - CLI defaults.ts uses Protocol.UI and ProtocolVersion['0.0.1'] enum values instead of plain string literals to satisfy the tightened type - CLI lifecycle.test.ts updated to use enum values in typed config literal Zero duplicate field definitions. All quality gates pass. --- ui/cli/src/config/defaults.ts | 6 ++++-- ui/cli/tests/lifecycle.test.ts | 8 +++++++- ui/common/src/config/schema.ts | 9 +++++---- ui/common/src/types/ConfigurationType.ts | 17 +---------------- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/ui/cli/src/config/defaults.ts b/ui/cli/src/config/defaults.ts index 075fbabf..5e16be88 100644 --- a/ui/cli/src/config/defaults.ts +++ b/ui/cli/src/config/defaults.ts @@ -1,5 +1,7 @@ +import { Protocol, ProtocolVersion } from 'ui-common' + export const DEFAULT_HOST = 'localhost' export const DEFAULT_PORT = 8080 -export const DEFAULT_PROTOCOL = 'ui' -export const DEFAULT_VERSION = '0.0.1' +export const DEFAULT_PROTOCOL = Protocol.UI +export const DEFAULT_VERSION = ProtocolVersion['0.0.1'] export const DEFAULT_SECURE = false diff --git a/ui/cli/tests/lifecycle.test.ts b/ui/cli/tests/lifecycle.test.ts index d5f4a4ad..3f12b313 100644 --- a/ui/cli/tests/lifecycle.test.ts +++ b/ui/cli/tests/lifecycle.test.ts @@ -36,9 +36,15 @@ await describe('lifecycle', async () => { }) await it('should reject executeCommand with NaN timeout', async () => { + const { Protocol, ProtocolVersion } = await import('ui-common') await assert.rejects( executeCommand({ - config: { host: 'localhost', port: 8080, protocol: 'ui', version: '0.0.1' }, + config: { + host: 'localhost', + port: 8080, + protocol: Protocol.UI, + version: ProtocolVersion['0.0.1'], + }, formatter: { error: () => undefined, output: () => undefined }, payload: {}, procedureName: 'listChargingStations' as never, diff --git a/ui/common/src/config/schema.ts b/ui/common/src/config/schema.ts index 34e9f852..c94d57f7 100644 --- a/ui/common/src/config/schema.ts +++ b/ui/common/src/config/schema.ts @@ -1,6 +1,6 @@ import { z } from 'zod' -import { AuthenticationType } from '../types/UIProtocol.js' +import { AuthenticationType, Protocol, ProtocolVersion } from '../types/UIProtocol.js' export const authenticationConfigSchema = z .object({ @@ -29,9 +29,9 @@ export const uiServerConfigSchema = z.object({ host: z.string().min(1), name: z.string().optional(), port: z.number().int().min(1).max(65535), - protocol: z.string().min(1), + protocol: z.enum(Protocol), secure: z.boolean().optional(), - version: z.string().min(1), + version: z.enum(ProtocolVersion), }) export const configurationSchema = z.object({ @@ -39,4 +39,5 @@ export const configurationSchema = z.object({ }) export type Configuration = z.infer -export type UIServerConfig = z.infer +export type UIServerConfig = UIServerConfigurationSection +export type UIServerConfigurationSection = z.infer diff --git a/ui/common/src/types/ConfigurationType.ts b/ui/common/src/types/ConfigurationType.ts index 084449d8..5c75b5d3 100644 --- a/ui/common/src/types/ConfigurationType.ts +++ b/ui/common/src/types/ConfigurationType.ts @@ -1,21 +1,6 @@ -import type { AuthenticationType, Protocol, ProtocolVersion } from './UIProtocol.js' +import type { UIServerConfigurationSection } from '../config/schema.js' export interface ConfigurationData { theme?: string uiServer: UIServerConfigurationSection | UIServerConfigurationSection[] } - -export interface UIServerConfigurationSection { - authentication?: { - enabled: boolean - password?: string - type: AuthenticationType - username?: string - } - host: string - name?: string - port: number - protocol: Protocol - secure?: boolean - version: ProtocolVersion -} -- 2.53.0