@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
155 lines (153 loc) • 5.76 kB
JavaScript
import { RichTextNodeType } from "../types/value/richText.js";
import { LinkType } from "../types/value/link.js";
import { PrismicMigrationAsset } from "../types/migration/Asset.js";
import { PrismicMigrationDocument } from "../types/migration/Document.js";
import { link } from "../helpers/isFilled.js";
import { contentRelationship, image, linkToMedia, rtImageNode } from "./isMigrationValue.js";
import { getOptionalLinkProperties } from "./getOptionalLinkProperties.js";
//#region src/lib/resolveMigrationDocumentData.ts
/**
* Resolves a migration content relationship to a content relationship field.
*
* @param relation - Content relationship to resolve.
*
* @returns Resolved content relationship field.
*/
async function resolveMigrationContentRelationship(relation) {
if (typeof relation === "function") return resolveMigrationContentRelationship(await relation());
if (relation instanceof PrismicMigrationDocument) return relation.document.id ? {
link_type: LinkType.Document,
id: relation.document.id
} : { link_type: LinkType.Any };
const optionalLinkProperties = relation && "link_type" in relation ? getOptionalLinkProperties(relation) : void 0;
if (relation) {
if (contentRelationship(relation.id) || typeof relation.id !== "string") return {
...optionalLinkProperties,
...await resolveMigrationContentRelationship(relation.id)
};
return {
...optionalLinkProperties,
link_type: LinkType.Document,
id: relation.id
};
}
return {
...optionalLinkProperties,
link_type: LinkType.Any
};
}
/**
* Resolves a migration image to an image field.
*
* @param migrationAsset - Asset to resolve.
* @param migration - Migration instance.
* @param withThumbnails - Whether to include thumbnails.
*
* @returns Resolved image field.
*/
const resolveMigrationImage = (image$1, migration, withThumbnails) => {
var _migration$_assets$ge;
const { id: master,...thumbnails } = image$1 instanceof PrismicMigrationAsset ? { id: image$1 } : image$1;
const asset = (_migration$_assets$ge = migration._assets.get(master.config.id)) === null || _migration$_assets$ge === void 0 ? void 0 : _migration$_assets$ge.asset;
const maybeInitialField = master.originalField;
if (asset) {
const parameters = ((maybeInitialField === null || maybeInitialField === void 0 ? void 0 : maybeInitialField.url) || asset.url).split("?")[1];
const url = `${asset.url.split("?")[0]}${parameters ? `?${parameters}` : ""}`;
const dimensions = {
width: asset.width,
height: asset.height
};
const edit = maybeInitialField && "edit" in maybeInitialField ? maybeInitialField === null || maybeInitialField === void 0 ? void 0 : maybeInitialField.edit : {
x: 0,
y: 0,
zoom: 1,
background: "transparent"
};
const alt = master.config.alt || asset.alt || null;
const resolvedThumbnails = {};
if (withThumbnails) for (const [name, thumbnail] of Object.entries(thumbnails)) {
const resolvedThumbnail = resolveMigrationImage(thumbnail, migration);
if (resolvedThumbnail) resolvedThumbnails[name] = resolvedThumbnail;
}
return {
id: asset.id,
url,
dimensions,
edit,
alt,
copyright: asset.credits || null,
...resolvedThumbnails
};
}
};
/**
* Resolves a migration rich text image node to a regular rich text image node.
*
* @param rtImageNode - Migration rich text image node to resolve.
* @param migration - Migration instance.
*
* @returns Resolved rich text image node.
*/
const resolveMigrationRTImageNode = async (rtImageNode$1, migration) => {
const image$1 = resolveMigrationImage(rtImageNode$1.id, migration);
if (image$1) {
const linkTo = await resolveMigrationDocumentData(rtImageNode$1.linkTo, migration);
return {
...image$1,
type: RichTextNodeType.image,
linkTo: link(linkTo) ? linkTo : void 0
};
}
};
/**
* Resolves a migration link to media to a regular link to media field.
*
* @param linkToMedia - Migration link to media to resolve.
* @param migration - Migration instance.
*
* @returns Resolved link to media field.
*/
const resolveMigrationLinkToMedia = (linkToMedia$1, migration) => {
var _migration$_assets$ge2;
const asset = (_migration$_assets$ge2 = migration._assets.get(linkToMedia$1.id.config.id)) === null || _migration$_assets$ge2 === void 0 ? void 0 : _migration$_assets$ge2.asset;
const optionalLinkProperties = getOptionalLinkProperties(linkToMedia$1);
if (asset) return {
...optionalLinkProperties,
id: asset.id,
link_type: LinkType.Media
};
return {
...optionalLinkProperties,
link_type: LinkType.Any
};
};
/**
* Resolves a migration document data to actual data ready to be sent to the
* Migration API.
*
* @param input - Migration link to media to resolve.
* @param migration - Migration instance.
*
* @returns Resolved data.
*/
async function resolveMigrationDocumentData(input, migration) {
if (contentRelationship(input)) return resolveMigrationContentRelationship(input);
if (image(input)) return resolveMigrationImage(input, migration, true);
if (linkToMedia(input)) return resolveMigrationLinkToMedia(input, migration);
if (rtImageNode(input)) return resolveMigrationRTImageNode(input, migration);
if (typeof input === "function") return await resolveMigrationDocumentData(await input(), migration);
if (Array.isArray(input)) {
const res = [];
for (const element of input) res.push(await resolveMigrationDocumentData(element, migration));
return res.filter(Boolean);
}
if (input && typeof input === "object") {
const res = {};
for (const key in input) res[key] = await resolveMigrationDocumentData(input[key], migration);
return res;
}
return input;
}
//#endregion
export { resolveMigrationContentRelationship, resolveMigrationDocumentData };
//# sourceMappingURL=resolveMigrationDocumentData.js.map