/** Ответ GET /v1/version (см. docs/openapi.yaml VersionInfo). */ export type VersionInfo = { version?: string; api_version?: string; git_sha?: string; build_time?: string; }; const PLACEHOLDER_SHA = new Set(['', 'unknown']); function nonEmptyString(value: unknown): string { if (typeof value === 'string') { const s = value.trim(); return s; } if (value == null) return ''; return String(value).trim(); } /** Semver или legacy api_version; пустая строка, если полей нет. */ export function resolveVersionString(info: VersionInfo | null | undefined): string { if (!info) return ''; return nonEmptyString(info.version) || nonEmptyString(info.api_version); } /** Короткий git SHA; пусто для placeholder «unknown». */ export function resolveGitSha(info: VersionInfo | null | undefined): string { if (!info) return ''; const sha = nonEmptyString(info.git_sha); if (!sha || PLACEHOLDER_SHA.has(sha.toLowerCase())) return ''; return sha; } /** Заголовок карточки «Версия» на /monitoring. */ export function formatVersionHeadline(info: VersionInfo | null | undefined): string { if (!info) return '—'; const ver = resolveVersionString(info); const sha = resolveGitSha(info); if (ver && sha) return `${ver} (${sha.slice(0, 12)})`; if (ver) return ver; if (sha) return sha.slice(0, 12); return '—'; } /** Подпись в сайдбаре (v1.2.3). */ export function formatVersionSidebarLabel(info: VersionInfo | null | undefined): string | null { const ver = resolveVersionString(info); return ver ? `v${ver}` : null; }