From b007ff1dbadc469aa0854794bcc58297946b8bda Mon Sep 17 00:00:00 2001 From: Angelo Ashmore Date: Fri, 2 Jul 2021 13:13:01 -1000 Subject: [PATCH] fix: optional Link Resolver for asLink and asHTML (#22) Closes #21 --- src/asHTML.ts | 4 ++-- src/asLink.ts | 14 +++----------- src/graphql/asLink.ts | 9 ++------- src/lib/ArgumentError.ts | 14 -------------- src/lib/serializerHelpers.ts | 4 ++-- test/asLink.test.ts | 25 +++++++++---------------- test/graphql-asLink.test.ts | 27 +++++++++++---------------- 7 files changed, 29 insertions(+), 68 deletions(-) delete mode 100644 src/lib/ArgumentError.ts diff --git a/src/asHTML.ts b/src/asHTML.ts index e7ad5b8..1487e30 100644 --- a/src/asHTML.ts +++ b/src/asHTML.ts @@ -22,7 +22,7 @@ import { } from "./types"; function defaultHTMLSerializer( - linkResolver: LinkResolverFunction, + linkResolver: LinkResolverFunction | undefined, _type: Parameters[0], node: Parameters[1], content: Parameters[2], @@ -74,7 +74,7 @@ function defaultHTMLSerializer( export function asHTML( richTextField: RichTextField, - linkResolver: LinkResolverFunction, + linkResolver?: LinkResolverFunction, htmlSerializer?: HTMLFunctionSerializer | HTMLMapSerializer, ): string { let serializer: RichTextFunctionSerializer; diff --git a/src/asLink.ts b/src/asLink.ts index cbb78ce..658de24 100644 --- a/src/asLink.ts +++ b/src/asLink.ts @@ -1,5 +1,4 @@ import { LinkField, LinkType } from "@prismicio/types"; -import { ArgumentError } from "./lib/ArgumentError"; import { LinkResolverFunction } from "./types"; /** @@ -17,15 +16,8 @@ import { LinkResolverFunction } from "./types"; */ export const asLink = ( linkField: LinkField, - linkResolver: LinkResolverFunction, -): - | ReturnType> - | string - | null => { - if (typeof linkResolver !== "function") { - throw new ArgumentError("linkResolver", "function", typeof linkResolver); - } - + linkResolver?: LinkResolverFunction, +): LinkResolverFunctionReturnType | string | null => { if (!linkField) { return null; } @@ -41,7 +33,7 @@ export const asLink = ( return linkField.url; } else if ("id" in linkField) { // ...when not... - return linkResolver(linkField); + return linkResolver ? linkResolver(linkField) : null; } else { // ...when empty return null; diff --git a/src/graphql/asLink.ts b/src/graphql/asLink.ts index 98787b1..35083cf 100644 --- a/src/graphql/asLink.ts +++ b/src/graphql/asLink.ts @@ -4,7 +4,6 @@ import { LinkField, LinkType, } from "@prismicio/types/dist/graphql"; -import { ArgumentError } from "../lib/ArgumentError"; import { LinkResolverFunction } from "./types"; /** @@ -26,7 +25,7 @@ export const asLink = < LinkResolverFunctionReturnType = string, >( linkField: LinkField, - linkResolver: LinkResolverFunction< + linkResolver?: LinkResolverFunction< LinkResolverLinkToDocumentField, LinkResolverFunctionReturnType >, @@ -39,10 +38,6 @@ export const asLink = < > | string | null => { - if (typeof linkResolver !== "function") { - throw new ArgumentError("linkResolver", "function", typeof linkResolver); - } - if (!linkField) { return null; } @@ -50,7 +45,7 @@ export const asLink = < if ("url" in linkField) { return linkField.url; } else if (linkField._linkType === LinkType.Document) { - return linkResolver(linkField); + return linkResolver ? linkResolver(linkField) : null; } else { return null; } diff --git a/src/lib/ArgumentError.ts b/src/lib/ArgumentError.ts deleted file mode 100644 index 4f066ad..0000000 --- a/src/lib/ArgumentError.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @internal - */ -export class ArgumentError extends Error { - constructor( - argumentName: string, - expectedType: string, - receivedType: string, - ) { - super( - `Expected argument \`${argumentName}\` to be of type \`${expectedType}\` but received type \`${receivedType}\``, - ); - } -} diff --git a/src/lib/serializerHelpers.ts b/src/lib/serializerHelpers.ts index ead54a7..79deec2 100644 --- a/src/lib/serializerHelpers.ts +++ b/src/lib/serializerHelpers.ts @@ -32,7 +32,7 @@ export const serializePreFormatted = (node: RTPreformattedNode): string => { // TODO: Check link behavior with image + maybe rewrap with paragraph export const serializeImage = ( - _linkResolver: LinkResolverFunction, + _linkResolver: LinkResolverFunction | undefined, node: RTImageNode, ): string => { return `${node.alt} { }; export const serializeHyperlink = ( - linkResolver: LinkResolverFunction, + linkResolver: LinkResolverFunction | undefined, node: RTLinkNode, children: string[], ): string => { diff --git a/test/asLink.test.ts b/test/asLink.test.ts index 6f4fc8d..a771013 100644 --- a/test/asLink.test.ts +++ b/test/asLink.test.ts @@ -3,22 +3,6 @@ import test from "ava"; import { linkResolver } from "./__testutils__/linkResolver"; import { asLink } from "../src"; -import { ArgumentError } from "../src/lib/ArgumentError"; - -test("throws when no linkResolver is provided", (t) => { - const error = t.throws( - () => { - // @ts-expect-error testing JavaScript failsafe on purpose - asLink(); - }, - { instanceOf: ArgumentError }, - ); - - t.is( - error.message, - "Expected argument `linkResolver` to be of type `function` but received type `undefined`", - ); -}); test("returns null when link field is falsy", (t) => { const field = undefined; @@ -82,6 +66,15 @@ test("resolves a link to document field with `apiOptions.routes`", (t) => { t.is(asLink(field, linkResolver), "/test"); }); +test("returns null when given a document field and linkResolver is not provided ", (t) => { + const field = { + id: "XvoFFREAAM0WGBng", + link_type: "Document", + }; + + t.is(asLink(field), null); +}); + test("resolves a link to web field", (t) => { const field = { link_type: "Web", diff --git a/test/graphql-asLink.test.ts b/test/graphql-asLink.test.ts index 31e1591..ea10832 100644 --- a/test/graphql-asLink.test.ts +++ b/test/graphql-asLink.test.ts @@ -2,7 +2,6 @@ import { FilledMinimalLinkToDocumentField } from "@prismicio/types/dist/graphql" import test from "ava"; import { asLink, LinkResolverFunction } from "../src/graphql"; -import { ArgumentError } from "../src/lib/ArgumentError"; interface MyLinkToDocumentField extends FilledMinimalLinkToDocumentField { _meta: { @@ -13,21 +12,6 @@ interface MyLinkToDocumentField extends FilledMinimalLinkToDocumentField { const linkResolver: LinkResolverFunction = (doc) => `/${doc._meta.uid}`; -test("throws when no linkResolver is provided", (t) => { - const error = t.throws( - () => { - // @ts-expect-error testing JavaScript failsafe - asLink(); - }, - { instanceOf: ArgumentError }, - ); - - t.is( - error.message, - "Expected argument `linkResolver` to be of type `function` but received type `undefined`", - ); -}); - test("returns null when link field is falsy", (t) => { const field = undefined; @@ -81,3 +65,14 @@ test("resolves a link to document field", (t) => { t.is(asLink(field, linkResolver), "/test"); }); + +test("returns null when given a document field and linkResolver is not provided ", (t) => { + const field = { + _linkType: "Link.document", + _meta: { + uid: "test", + }, + } as const; + + t.is(asLink(field), null); +});