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"