import { SliceItemContent, SlicesContent, SlicesContentType, } from "@prismicio/types-internal/lib/content" import type { SharedSlice } from "@prismicio/types-internal/lib/customtypes" import type { DynamicSlices } from "@prismicio/types-internal/lib/customtypes/widgets/slices/Slices" import { v4 as uuid } from "uuid" import type { SlicesMock } from "../Mock" import type { MockConfig } from "../MockConfig" import { GroupMock, SharedSliceMock, SharedSliceMockConfig } from "." import { NestableWidgetMock } from "./nestable" export type SlicesMockConfig = MockConfig< DynamicSlices["type"], Partial> > export const SliceZoneMock: SlicesMock< DynamicSlices, SlicesContent, SlicesMockConfig > = { generate( def: DynamicSlices, sharedSlices: Partial> = {}, config?: SlicesMockConfig, ): SlicesContent { if (!def.config?.choices) return { __TYPE__: SlicesContentType, value: [], } const result: SliceItemContent[] = Object.entries( def.config.choices, ).reduce>((acc, [sliceKey, sliceDef]) => { const sliceMockConfig = config?.value && config.value[sliceKey] const widget: SliceItemContent["widget"] | undefined = (() => { switch (sliceDef.type) { case "SharedSlice": { const sharedSliceDef = sharedSlices[sliceKey] if (!sharedSliceDef) { console.error( `You must provide the definition of the Shared Slice ${sliceKey} to get mocks.`, ) return } return SharedSliceMock.generate(sharedSliceDef, sliceMockConfig) } case "Slice": return // we don't generate mocks for composite slice yet. case "Group": return GroupMock.generate(sliceDef) default: return NestableWidgetMock.generate(sliceDef) } })() if (!widget) return acc return acc.concat({ key: `${sliceKey}$${uuid()}`, name: sliceKey, maybeLabel: undefined, widget, }) }, []) return { __TYPE__: SlicesContentType, value: result, } }, }