import type { NestableContent } from "@prismicio/types-internal/lib/content/fields/nestable/NestableContent" import type { NestableWidget } from "@prismicio/types-internal/lib/customtypes" import { DiffOperation, NestableWidgetDiff, } from "@prismicio/types-internal/lib/customtypes/diff" import type { WidgetMockWithDiff } from "../../Mock" import { type BooleanMockConfig, BooleanMock } from "./BooleanField" import { type ColorMockConfig, ColorMock } from "./Color" import { type DateMockConfig, DateMock } from "./Date" import { type EmbedMockConfig, EmbedMock } from "./Embed" import { type GeoPointMockConfig, GeoPointMock } from "./GeoPoint" import { ImageMock } from "./Image" import { type IntegrationFieldMockConfig, IntegrationFieldMock, } from "./IntegrationField" import { type LinkMockConfig, LinkMock } from "./Link" import { type NumberMockConfig, NumberMock } from "./Number" import { type RangeMockConfig, RangeMock } from "./Range" import { RepeatableMock, RepeatableMockConfig } from "./Repeatable" import { type RichTextMockConfig, RichTextMock } from "./RichText" import { type SelectMockConfig, SelectMock } from "./Select" import { SeparatorMock } from "./Separator" import { TableMock, TableMockConfig } from "./Table" import { type TextMockConfig, TextMock } from "./Text" import { type TimestampMockConfig, TimestampMock } from "./Timestamp" export * from "./BooleanField" export * from "./Color" export * from "./Date" export * from "./Embed" export * from "./GeoPoint" export * from "./Image" export * from "./IntegrationField" export * from "./Link" export * from "./Number" export * from "./Range" export * from "./Repeatable" export * from "./RichText" export * from "./Select" export * from "./Separator" export * from "./Text" export * from "./Timestamp" export type NestableWidgetMockConfig = | BooleanMockConfig | ColorMockConfig | LinkMockConfig | DateMockConfig | EmbedMockConfig | GeoPointMockConfig | IntegrationFieldMockConfig | NumberMockConfig | RangeMockConfig | RichTextMockConfig | SelectMockConfig | TableMockConfig | TextMockConfig | TimestampMockConfig | RepeatableMockConfig export const NestableWidgetMock: WidgetMockWithDiff< NestableWidget, NestableContent, NestableWidgetMockConfig > = { generate( def: NestableWidget, config?: NestableWidgetMockConfig, ): NestableContent { switch (def.type) { case "Boolean": return BooleanMock.generate( def, config?.type === "Boolean" ? config : undefined, ) case "Color": return ColorMock.generate( def, config?.type === "Color" ? config : undefined, ) case "Link": if (def.config?.repeat) { return RepeatableMock.generate( def, config?.type === "Repeatable" ? config : undefined, ) } return LinkMock.generate( def, config?.type === "Link" ? config : undefined, ) case "Date": return DateMock.generate( def, config?.type === "Date" ? config : undefined, ) case "Embed": return EmbedMock.generate( def, config?.type === "Embed" ? config : undefined, ) case "GeoPoint": return GeoPointMock.generate( def, config?.type === "GeoPoint" ? config : undefined, ) case "Image": return ImageMock.generate(def) case "IntegrationFields": return IntegrationFieldMock.generate( def, config?.type === "IntegrationFields" ? config : undefined, ) case "Number": return NumberMock.generate( def, config?.type === "Number" ? config : undefined, ) case "Range": return RangeMock.generate( def, config?.type === "Range" ? config : undefined, ) case "StructuredText": return RichTextMock.generate( def, config?.type === "StructuredText" ? config : undefined, ) case "Select": return SelectMock.generate( def, config?.type === "Select" ? config : undefined, ) case "Table": return TableMock.generate( def, config?.type === "Table" ? config : undefined, ) case "Text": return TextMock.generate( def, config?.type === "Text" ? config : undefined, ) case "Timestamp": return TimestampMock.generate( def, config?.type === "Timestamp" ? config : undefined, ) case "Separator": return SeparatorMock.generate(def) } }, patch( diff: NestableWidgetDiff, content?: NestableContent, config?: NestableWidgetMockConfig, ) { if (diff.op === DiffOperation.Removed) return const data = { diff, content, config } const patched = ColorMock.applyPatch(data) || DateMock.applyPatch(data) || TimestampMock.applyPatch(data) || SelectMock.applyPatch(data) || RangeMock.applyPatch(data) || TextMock.applyPatch(data) || NumberMock.applyPatch(data) || BooleanMock.applyPatch(data) || RichTextMock.applyPatch(data) || LinkMock.applyPatch(data) || EmbedMock.applyPatch(data) || GeoPointMock.applyPatch(data) || ImageMock.applyPatch(data) || IntegrationFieldMock.applyPatch(data) || SeparatorMock.applyPatch(data) || TableMock.applyPatch(data) || RepeatableMock.applyPatch(data) return patched?.result }, }