@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
55 lines (48 loc) • 1.57 kB
text/typescript
import type { RichTextField } from "../types/value/richText"
import type { RichTextFunctionSerializer, TreeNode } from "./types"
import { asTree } from "./asTree"
/**
* Serializes a rich text or title field with a given serializer
*
* @remarks
* This is a low level helper mainly intended to be used by higher level
* packages Most users aren't expected to this function directly
*
* @typeParam SerializerReturnType - Return type of the serializer
*
* @param richTextField - A rich text or title field from Prismic
* @param serializer - A function serializer to apply
*
* @returns An array of serialized nodes
*
* @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
*/
export const serialize = <SerializerReturnType>(
richTextField: RichTextField,
serializer: RichTextFunctionSerializer<SerializerReturnType>,
): SerializerReturnType[] => {
return serializeTreeNodes<SerializerReturnType>(
asTree(richTextField).children,
serializer,
)
}
const serializeTreeNodes = <T>(
nodes: TreeNode[],
serializer: RichTextFunctionSerializer<T>,
): T[] => {
const serializedTreeNodes: T[] = []
for (let i = 0; i < nodes.length; i++) {
const treeNode = nodes[i]
const serializedTreeNode = serializer(
treeNode.type,
treeNode.node,
treeNode.text,
serializeTreeNodes(treeNode.children, serializer),
treeNode.key,
)
if (serializedTreeNode != null) {
serializedTreeNodes.push(serializedTreeNode)
}
}
return serializedTreeNodes
}