Files
web/packages/trpc/lib/routers/contentstack/schemas/sidebar/content.ts
Linus Flood acdc3dcec1 Merged in fix/book-453-linkconnection (pull request #2972)
fix(BOOK-453): avoid linkConnection invalid

* fix(BOOK-453): avoid linkConnection invalid

* test

* test

* test

* Merge master
2025-10-22 12:39:17 +00:00

87 lines
2.2 KiB
TypeScript

import { z } from "zod"
import { ContentEnum } from "../../../../types/content"
import { SidebarEnums } from "../../../../types/sidebar"
import {
imageContainerRefsSchema,
imageContainerSchema,
} from "../blocks/imageContainer"
import { sysAssetRefsSchema, sysAssetSchema } from "../blocks/sysAsset"
import {
rawLinkRefsUnionSchema,
rawLinkUnionSchema,
transformPageLink,
} from "../pageLinks"
export const contentSchema = z.object({
typename: z
.literal(SidebarEnums.blocks.Content)
.optional()
.default(SidebarEnums.blocks.Content),
content: z
.object({
content: z.object({
json: z.any(), // JSON
embedded_itemsConnection: z.object({
edges: z.array(
z.object({
node: z
.discriminatedUnion("__typename", [
imageContainerSchema,
sysAssetSchema,
...rawLinkUnionSchema.options,
])
.transform((data) => {
const link = transformPageLink(data)
if (link) {
return link
}
return data
}),
})
),
}),
}),
})
.transform((data) => {
return {
embedded_itemsConnection: data.content.embedded_itemsConnection,
json: data.content.json,
}
}),
})
const actualRefs = z.discriminatedUnion("__typename", [
imageContainerRefsSchema,
...rawLinkRefsUnionSchema.options,
])
type Ref = typeof actualRefs._type
type Refs = {
node: Ref
}
export const contentRefsSchema = z.object({
content: z
.object({
content: z.object({
embedded_itemsConnection: z.object({
edges: z.array(
z.object({
node: z.discriminatedUnion("__typename", [
sysAssetRefsSchema,
...actualRefs.options,
]),
})
),
}),
}),
})
.transform((data) => {
const filtered = data.content.embedded_itemsConnection.edges.filter(
(block) => block.node.__typename !== ContentEnum.blocks.SysAsset
) as unknown as Refs[] // TS issues with filtered arrays
return filtered.map((block) => block.node.system)
}),
})