Skip to content

Commit

Permalink
feat: allow nullish field in asHTML and asText
Browse files Browse the repository at this point in the history
  • Loading branch information
angeloashmore committed Dec 6, 2021
1 parent 57f2db6 commit 4c7c8bc
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 17 deletions.
32 changes: 18 additions & 14 deletions src/asHTML.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,22 +120,26 @@ const wrapMapSerializerWithStringChildren = (
* @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
*/
export const asHTML = (
richTextField: RichTextField,
richTextField: RichTextField | null | undefined,
linkResolver?: LinkResolverFunction<string> | null,
htmlSerializer?: HTMLFunctionSerializer | HTMLMapSerializer | null,
): string => {
let serializer: RichTextFunctionSerializer<string>;
if (htmlSerializer) {
serializer = composeSerializers(
typeof htmlSerializer === "object"
? wrapMapSerializerWithStringChildren(htmlSerializer)
: (type, node, text, children, key) =>
htmlSerializer(type, node, text, children.join(""), key),
createDefaultHTMLSerializer(linkResolver),
);
): string | null => {
if (richTextField) {
let serializer: RichTextFunctionSerializer<string>;
if (htmlSerializer) {
serializer = composeSerializers(
typeof htmlSerializer === "object"
? wrapMapSerializerWithStringChildren(htmlSerializer)
: (type, node, text, children, key) =>
htmlSerializer(type, node, text, children.join(""), key),
createDefaultHTMLSerializer(linkResolver),
);
} else {
serializer = createDefaultHTMLSerializer(linkResolver);
}

return serialize(richTextField, serializer).join("");
} else {
serializer = createDefaultHTMLSerializer(linkResolver);
return null;
}

return serialize(richTextField, serializer).join("");
};
22 changes: 22 additions & 0 deletions src/asText.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { asText as baseAsText } from "@prismicio/richtext";
import { RichTextField } from "@prismicio/types";

/**
* Serializes a rich text or title field to a plain text string
*
* @param richTextField - A rich text or title field from Prismic
* @param separator - Separator used to join each element, defaults to a space
*
* @returns Plain text equivalent of the provided rich text or title field
* @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
*/
export const asText = (
richTextField: RichTextField | null | undefined,
separator?: string,
): string | null => {
if (richTextField) {
return baseAsText(richTextField, separator);
} else {
return null;
}
};
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export { asDate } from "./asDate";
export { asLink } from "./asLink";
export { asText } from "@prismicio/richtext";
export { asText } from "./asText";
export { asHTML } from "./asHTML";

export { documentToLinkField } from "./documentToLinkField";
Expand Down
5 changes: 5 additions & 0 deletions test/asHTML.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,8 @@ test("serializes with a custom map serializer", (t) => {
test("escapes external links to prevent XSS", (t) => {
t.snapshot(asHTML(richTextFixture.xss, linkResolver));
});

test("returns null for nullish inputs", (t) => {
t.is(asHTML(null), null);
t.is(asHTML(undefined), null);
});
14 changes: 12 additions & 2 deletions test/asText.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import test from "ava";
import * as prismicR from "@prismicio/richtext";

import { richTextFixture } from "./__fixtures__/richText";

import * as prismicH from "../src";

test("is an alias for @prismicio/richtext's `asText` function", (t) => {
t.is(prismicH.asText, prismicR.asText);
test("is an alias for @prismicio/richtext's `asText` function for non-nullish inputs", (t) => {
t.is(
prismicH.asText(richTextFixture.en),
prismicR.asText(richTextFixture.en),
);
});

test("returns null for nullish inputs", (t) => {
t.is(prismicH.asText(null), null);
t.is(prismicH.asText(undefined), null);
});

0 comments on commit 4c7c8bc

Please sign in to comment.