import { z } from "zod" import { tempImageVaultAssetSchema } from "../schemas/imageVault" import { getDescription, getImage, getTitle } from "./utils" import type { Metadata } from "next" import { RTETypeEnum } from "@/types/rte/enums" const metaDataJsonSchema = z.object({ children: z.array( z.object({ type: z.nativeEnum(RTETypeEnum), children: z.array( z.object({ text: z.string().optional(), }) ), }) ), }) const metaDataBlocksSchema = z .array( z.object({ content: z .object({ content: z .object({ json: metaDataJsonSchema, }) .optional() .nullable(), }) .optional() .nullable(), }) ) .optional() .nullable() export const rawMetadataSchema = z.object({ web: z .object({ seo_metadata: z .object({ title: z.string().optional().nullable(), description: z.string().optional().nullable(), noindex: z.boolean().optional().nullable(), seo_image: tempImageVaultAssetSchema.nullable(), }) .optional() .nullable(), breadcrumbs: z .object({ title: z.string().optional().nullable(), }) .optional() .nullable(), }) .optional() .nullable(), heading: z.string().optional().nullable(), preamble: z.string().optional().nullable(), header: z .object({ heading: z.string().optional().nullable(), preamble: z.string().optional().nullable(), }) .optional() .nullable(), hero_image: tempImageVaultAssetSchema.nullable(), blocks: metaDataBlocksSchema, hotel_page_id: z.string().optional().nullable(), hotelData: z .object({ name: z.string(), city: z.string(), description: z.string(), image: z.object({ url: z.string(), alt: z.string() }).nullable(), }) .optional() .nullable(), }) export const metadataSchema = rawMetadataSchema.transform(async (data) => { const noIndex = !!data.web?.seo_metadata?.noindex const metadata: Metadata = { title: await getTitle(data), description: await getDescription(data), openGraph: { images: getImage(data), }, } if (noIndex) { metadata.robots = { index: false, follow: true, } } return metadata })