90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { tempImageVaultAssetSchema } from "../schemas/imageVault"
|
|
import { getDescription, getImages, getTitle } from "./utils"
|
|
|
|
import { RTETypeEnum } from "@/types/rte/enums"
|
|
|
|
export const rawMetaDataDataSchema = z.object({
|
|
web: z.object({
|
|
seo_metadata: z
|
|
.object({
|
|
title: z.string().optional().nullable(),
|
|
description: z.string().optional().nullable(),
|
|
imageConnection: z
|
|
.object({
|
|
edges: z.array(
|
|
z.object({
|
|
node: z.object({
|
|
url: z.string(),
|
|
dimension: z.object({
|
|
width: z.number(),
|
|
height: z.number(),
|
|
}),
|
|
}),
|
|
})
|
|
),
|
|
})
|
|
.optional()
|
|
.nullable(),
|
|
})
|
|
.optional()
|
|
.nullable(),
|
|
breadcrumbs: z
|
|
.object({
|
|
title: z.string().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,
|
|
blocks: z
|
|
.array(
|
|
z.object({
|
|
content: z
|
|
.object({
|
|
content: z
|
|
.object({
|
|
json: z.object({
|
|
children: z.array(
|
|
z.object({
|
|
type: z.nativeEnum(RTETypeEnum),
|
|
children: z.array(
|
|
z.object({
|
|
text: z.string().optional().nullable(),
|
|
})
|
|
),
|
|
})
|
|
),
|
|
}),
|
|
})
|
|
.optional()
|
|
.nullable(),
|
|
})
|
|
.optional()
|
|
.nullable(),
|
|
})
|
|
)
|
|
.optional()
|
|
.nullable(),
|
|
})
|
|
|
|
export const metaDataSchema = rawMetaDataDataSchema.transform((data) => {
|
|
return {
|
|
title: getTitle(data),
|
|
description: getDescription(data),
|
|
openGraph: {
|
|
images: getImages(data),
|
|
},
|
|
}
|
|
})
|