// View shaping for SSR payloads. Pages run API rows through these in // useAsyncData's transform, so the serialized payload carries only what the // page renders: no raw `content` source and no `translations`. The post // page's view, which sanitizes the body, is in postView.ts, so list pages and // cards that import this file do not load the sanitizer. import type { JournalPost } from './types.ts' /** A post row as a list or card renders it: without body, source or translations. */ export function toListPost(post: JournalPost): JournalPost { return { ...post, content: null, content_html: null, translations: null } } /** * Formats an API timestamp as a long date for `language` (a BCP 47 tag such * as "pl-PL"). UTC on both server and browser, so hydration matches. Returns * "" for a missing or invalid value. */ export function formatJournalDate(iso: string | null | undefined, language: string): string { if (!iso) return '' const d = new Date(iso) if (Number.isNaN(d.getTime())) return '' try { return new Intl.DateTimeFormat(language || 'en', { dateStyle: 'long', timeZone: 'UTC' }).format(d) } catch { return new Intl.DateTimeFormat('en', { dateStyle: 'long', timeZone: 'UTC' }).format(d) } }