@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
39 lines (36 loc) • 1.61 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 }
: {}),
}
}