Skip to content

Commit

Permalink
feat: update asLink to handle documents
Browse files Browse the repository at this point in the history
  • Loading branch information
lihbr committed Sep 24, 2021
1 parent 04003d2 commit ae14694
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 13 deletions.
19 changes: 13 additions & 6 deletions src/asLink.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { LinkField, LinkType } from "@prismicio/types";
import { LinkField, LinkType, PrismicDocument } from "@prismicio/types";
import { documentToLinkField } from "./documentToLinkField";
import { LinkResolverFunction } from "./types";

/**
* Resolves any type of link field to a URL
* Resolves any type of link field or document to a URL
*
* @param linkField - Any kind of link field to resolve
* @param [linkResolver] - An optional link resolver function, without it you're expected to use the `routes` options from the API
* @param linkFieldOrDocument - Any kind of link field or a document to resolve
* @param linkResolver - An optional link resolver function, without it you're expected to use the `routes` options from the API
*
* @returns Resolved URL, null if provided link is empty
*
Expand All @@ -15,13 +16,19 @@ import { LinkResolverFunction } from "./types";
* @see Prismic API `routes` options documentation: {@link https://prismic.io/docs/technologies/route-resolver-nuxtjs}
*/
export const asLink = <LinkResolverFunctionReturnType = string>(
linkField: LinkField,
linkFieldOrDocument: LinkField | PrismicDocument,
linkResolver?: LinkResolverFunction<LinkResolverFunctionReturnType> | null,
): LinkResolverFunctionReturnType | string | null => {
if (!linkField) {
if (!linkFieldOrDocument) {
return null;
}

// Converts document to link field if needed
const linkField: LinkField =
"link_type" in linkFieldOrDocument
? linkFieldOrDocument
: documentToLinkField(linkFieldOrDocument);

switch (linkField.link_type) {
case LinkType.Media:
case LinkType.Web:
Expand Down
16 changes: 9 additions & 7 deletions src/documentToLinkField.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ import {
*
* @returns The equivalent link field to use with `asLink()`
*
* @typeParam Document - Specific interface of the provided document
* @typeParam TDocument - Specific interface of the provided document
*
* @internal
*/
export const documentToLinkField = <Document extends PrismicDocument>(
prismicDocument: Document,
export const documentToLinkField = <TDocument extends PrismicDocument>(
prismicDocument: TDocument,
): FilledLinkToDocumentField<
Document["type"],
Document["lang"],
Document["data"]
TDocument["type"],
TDocument["lang"],
TDocument["data"]
> => {
return {
link_type: LinkType.Document,
Expand All @@ -29,7 +31,7 @@ export const documentToLinkField = <Document extends PrismicDocument>(
tags: prismicDocument.tags,
lang: prismicDocument.lang,
url: prismicDocument.url ?? undefined,
slug: prismicDocument.slugs[0], // Slug field not available with GraphQl
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.
...(Object.keys(prismicDocument.data).length > 0
? { data: prismicDocument.data }
Expand Down
7 changes: 7 additions & 0 deletions test/asLink.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import test from "ava";

import { documentFixture } from "./__fixtures__/document";
import { linkResolver } from "./__testutils__/linkResolver";

import { asLink } from "../src";
Expand Down Expand Up @@ -98,3 +99,9 @@ test("resolves a link to media field", (t) => {

t.is(asLink(field, linkResolver), "https://prismic.io");
});

test("resolves a document", (t) => {
const document = { ...documentFixture.empty };

t.is(asLink(document), "/test");
});

0 comments on commit ae14694

Please sign in to comment.