import type { WidgetKey } from "@prismicio/types-internal/lib/common" import type { WidgetContent } from "@prismicio/types-internal/lib/content" import type { DynamicWidget, SharedSlice, } from "@prismicio/types-internal/lib/customtypes" import { type CustomType, flattenWidgets, } from "@prismicio/types-internal/lib/customtypes" import { GroupMock, GroupMockConfig, NestableWidgetMock, NestableWidgetMockConfig, UIDMock, UIDMockConfig, } from "." import { SlicesMockConfig, SliceZoneMock } from "./widgets/SliceZone" export type DocWidgetMockConfig = | SlicesMockConfig | GroupMockConfig | UIDMockConfig | NestableWidgetMockConfig export interface DocumentMockConfig { value?: Partial> } function randomWidgetContent( fieldDef: DynamicWidget, sharedSlices: Partial>, config?: DocWidgetMockConfig, ): WidgetContent { switch (fieldDef.type) { case "Choice": case "Slices": return SliceZoneMock.generate( fieldDef, sharedSlices, config as SlicesMockConfig, ) case "Group": return GroupMock.generate(fieldDef, config as GroupMockConfig) case "UID": return UIDMock.generate(fieldDef, config as UIDMockConfig) default: return NestableWidgetMock.generate( fieldDef, config as NestableWidgetMockConfig, ) } } function random( customType: CustomType, sharedSlices: Partial>, config?: DocumentMockConfig, ): Partial> { return flattenWidgets(customType) .map<[WidgetKey, WidgetContent]>( ([fieldKey, fieldDef]: [WidgetKey, DynamicWidget]) => { const fieldMockConfig = config?.value && config.value[fieldKey] const content: WidgetContent = randomWidgetContent( fieldDef, sharedSlices, fieldMockConfig, ) return [fieldKey, content] }, ) .reduce>>( (acc, [k, v]) => ({ ...acc, [k]: v }), {}, ) } export const DocumentMock = { generate( def: CustomType, sharedSlices: Partial> = {}, config?: DocumentMockConfig, ): Partial> { return random(def, sharedSlices, config) }, }