/** Strapi query fragments. Only the fields the pages actually render are requested. */ const list = (prefix: string, names: readonly string[]) => names.map((name, i) => `${prefix}[${i}]=${name}`).join('&') const IMAGE_FIELDS = ['url', 'alternativeText', 'width', 'height'] as const export const ARTICLE_SUMMARY_QUERY = [ list('fields', ['title', 'slug', 'publishedAt']), list('populate[cover][fields]', IMAGE_FIELDS), list('populate[category][fields]', ['name', 'slug']), 'sort[0]=publishedAt:desc', ].join('&') export const ARTICLE_DETAIL_QUERY = [ list('fields', ['title', 'slug', 'content', 'publishedAt']), list('populate[cover][fields]', IMAGE_FIELDS), list('populate[category][fields]', ['name', 'slug']), // The byline is the admin user who created the entry; Strapi exposes the // name fields only because the content type sets populateCreatorFields. list('populate[createdBy][fields]', ['firstname', 'lastname']), ].join('&') export const PAGE_SIZE = 12 export const pagination = (page: number, pageSize = PAGE_SIZE) => `pagination[page]=${page}&pagination[pageSize]=${pageSize}` /** Reads a positive integer query param, falling back to 1. */ export const pageParam = (value: unknown): number => { const page = Number(value) return Number.isInteger(page) && page > 0 ? page : 1 } export type Locale = 'it' | 'en' /** Reads the `lang` query param, falling back to the site default `it`. */ export const localeParam = (value: unknown): Locale => (value === 'en' ? 'en' : 'it')