@prismicio/mock
Version:
Generate mock Prismic documents, fields, Slices, and models for development and testing environments
58 lines (50 loc) • 1.81 kB
text/typescript
import * as prismic from "@prismicio/client";
import { capitalCase, sentenceCase } from "../lib/changeCase";
import { createFaker } from "../lib/createFaker";
import { MockModelConfig } from "../types";
export type MockRichTextModelConfig<
WithMultipleBlocks extends boolean = boolean,
> = {
withMultipleBlocks?: WithMultipleBlocks;
} & MockModelConfig;
export const richText = <WithMultipleBlocks extends boolean = boolean>(
config: MockRichTextModelConfig<WithMultipleBlocks>,
): WithMultipleBlocks extends true
? prismic.CustomTypeModelRichTextMultiField
: prismic.CustomTypeModelRichTextSingleField => {
const faker = config.faker || createFaker(config.seed);
const blockTypes = faker
.randomElements([
prismic.RichTextNodeType.heading1,
prismic.RichTextNodeType.heading2,
prismic.RichTextNodeType.heading3,
prismic.RichTextNodeType.heading4,
prismic.RichTextNodeType.heading5,
prismic.RichTextNodeType.heading6,
prismic.RichTextNodeType.paragraph,
prismic.RichTextNodeType.preformatted,
prismic.RichTextNodeType.strong,
prismic.RichTextNodeType.em,
prismic.RichTextNodeType.listItem,
prismic.RichTextNodeType.oListItem,
prismic.RichTextNodeType.image,
prismic.RichTextNodeType.embed,
prismic.RichTextNodeType.hyperlink,
])
.join(",");
const blockTypeConfig =
config.withMultipleBlocks ?? faker.boolean()
? { multi: blockTypes }
: { single: blockTypes };
return {
type: prismic.CustomTypeModelFieldType.StructuredText,
config: {
label: capitalCase(faker.word()),
placeholder: sentenceCase(faker.words(3)),
allowTargetBlank: faker.boolean() ? true : undefined,
...blockTypeConfig,
},
} as WithMultipleBlocks extends true
? prismic.CustomTypeModelRichTextMultiField
: prismic.CustomTypeModelRichTextSingleField;
};