@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
50 lines (47 loc) • 1.64 kB
text/typescript
import type { FilledContentRelationshipField } from "../types/value/contentRelationship"
import type { PrismicDocument } from "../types/value/document"
import { LinkType } from "../types/value/link"
type SetOptional<T, Keys extends keyof T> = Omit<T, Keys> &
Partial<Pick<T, Keys>>
/**
* Converts a document into a link field, this is useful when crawling the API
* for document links
*
* @typeParam TDocument - Specific interface of the provided document
*
* @param prismicDocument - A document coming from Prismic
*
* @returns The equivalent link field to use with `asLink()`
*
* @internal
*/
export const documentToLinkField = <
TDocument extends SetOptional<PrismicDocument, "slugs">,
>(
prismicDocument: TDocument,
): FilledContentRelationshipField<
TDocument["type"],
TDocument["lang"],
TDocument["data"]
> => {
return {
link_type: LinkType.Document,
id: prismicDocument.id,
uid: prismicDocument.uid || undefined,
type: prismicDocument.type,
tags: prismicDocument.tags,
lang: prismicDocument.lang,
url: prismicDocument.url == null ? undefined : prismicDocument.url,
slug: prismicDocument.slugs?.[0], // Slug field is not available with GraphQL
// The REST API does not include a `data` property if the data
// object is empty.
//
// A presence check for `prismicDocument.data` is done to
// support partial documents. While `documentToLinkField` is
// not typed to accept partial documents, passing a partial
// document can happen in untyped projects.
...(prismicDocument.data && Object.keys(prismicDocument.data).length > 0
? { data: prismicDocument.data }
: {}),
}
}