import { isLinkContent, LinkContent, LinkContentType, } from "@prismicio/types-internal/lib/content" import type { Link } from "@prismicio/types-internal/lib/customtypes" import { DiffChange, DiffOperation, } from "@prismicio/types-internal/lib/customtypes/diff" import { v4 as uuid } from "uuid" import type { NestableMock, Patch } from "../../../Mock" import type { MockConfig } from "../../../MockConfig" import { DocumentLinkMock } from "./DocumentLink" import { ExternalLinkConfig, ExternalLinkMock } from "./ExternalLink" import { MediaLinkConfig, MediaLinkMock } from "./MediaLink" export interface LinkMockConfig extends MockConfig { select?: "document" | "web" | "media" } export const LinkMock: NestableMock = { generate(def: Link, config?: LinkMockConfig): LinkContent { const linkValue = (() => { switch (def.config?.select) { case "document": return DocumentLinkMock.generate(def) case "web": return ExternalLinkMock.generate( def, config?.value && (config.value as ExternalLinkConfig), ) case "media": return MediaLinkMock.generate( def, config?.value && (config.value as MediaLinkConfig), ) default: return ExternalLinkMock.generate( def, config?.value && (config.value as ExternalLinkConfig), ) } })() return { __TYPE__: LinkContentType, key: uuid(), value: linkValue, } }, applyPatch(data: Patch): | { result: LinkContent | undefined } | undefined { if (data.diff.op === DiffOperation.Removed) return { result: undefined } if (data.diff.value.type !== "Link" || data.diff.value.config?.repeat) return const result = this.patch( data.diff, isLinkContent(data.content) ? data.content : undefined, data.config?.type === "Link" ? data.config : undefined, ) return { result } }, patch( diff: DiffChange, _content: LinkContent, config?: LinkMockConfig, ): LinkContent | undefined { switch (diff.op) { case DiffOperation.Removed: return case DiffOperation.Added: case DiffOperation.Updated: return this.generate(diff.value, config) } }, } export * from "./DocumentLink" export * from "./ExternalLink" export * from "./MediaLink"