export function stringOrNull(value: unknown): string | null { return typeof value === "string" && value.trim() ? value.trim() : null; } export function normalizeArray(values: readonly string[] | undefined): string[] { return (values ?? []).map((value) => value.trim()).filter(Boolean); } export function parseStringArray(value: unknown): string[] { if (!Array.isArray(value)) { return []; } return value.filter( (entry): entry is string => typeof entry === "string" && entry.trim().length > 0, ); } export function coerceNumber(value: unknown, field: string): number { if (typeof value === "number" && Number.isFinite(value)) { return value; } throw new Error(`Receipt field ${field} must be a finite number`); } export function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null; }