/** * Converts provider-native Brevo JSON keys to public camelCase recursively. * * @param value - Provider response value. */ export function fromBrevoWire(value: unknown): unknown { if (Array.isArray(value)) return value.map(fromBrevoWire) if (!isPlainObject(value)) return value return Object.fromEntries( Object.entries(value).map(([key, item]) => [ key.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase()), fromBrevoWire(item), ]), ) } /** * Narrows values that can be traversed as JSON objects. * * @param value - Candidate JSON value. */ function isPlainObject(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value) }