@prismicio/mock
Version:
Generate mock Prismic documents, fields, Slices, and models for development and testing environments
76 lines (67 loc) • 1.95 kB
text/typescript
import * as prismic from "@prismicio/client"
import { createFaker, type Faker } from "../lib/createFaker"
import type { MockValueStateConfig, MockValueConfig } from "../types"
import { richText } from "./richText"
export type MockTableValueConfig<
Model extends prismic.CustomTypeModelTableField = prismic.CustomTypeModelTableField,
State extends prismic.FieldState = prismic.FieldState,
> = MockValueConfig<Model> & MockValueStateConfig<State>
export type MockTableValue<State extends prismic.FieldState = prismic.FieldState> =
prismic.TableField<State>
export const table = <
Model extends prismic.CustomTypeModelTableField = prismic.CustomTypeModelTableField,
State extends prismic.FieldState = "filled",
>(
config: MockTableValueConfig<Model, State>,
): MockTableValue<State> => {
const faker = config.faker || createFaker(config.seed)
const cells = faker.range(1, 10)
const bodyRows = faker.range(1, 10)
return (
config.state === "empty"
? null
: {
head: {
rows: [
{
cells: Array.from({ length: cells }, () =>
mockTableCell({
type: "header",
faker,
}),
),
},
],
},
body: {
rows: Array.from({ length: bodyRows }, () => ({
cells: Array.from({ length: cells }, () =>
mockTableCell({
type: "data",
faker,
}),
),
})),
},
}
) as MockTableValue<State>
}
// Only exported for testing purposes, to ensure the model used is in sync with the internal one.
export const TableCell = {
type: "StructuredText",
config: {
multi: [
prismic.RichTextNodeType.paragraph,
prismic.RichTextNodeType.strong,
prismic.RichTextNodeType.em,
prismic.RichTextNodeType.hyperlink,
].join(","),
},
} as const
const mockTableCell = ({ type, faker }: { type: "header" | "data"; faker: Faker }) => ({
type,
content: richText({
faker,
model: TableCell,
}),
})