@nacelle/compatibility-connector
Version:
Connect @nacelle/client-js-sdk to Nacelle's v2 back end with minimal code changes
94 lines (84 loc) • 2.5 kB
text/typescript
import { destructureNacelleEntryId } from '.';
import { flattenContentfulMedia, isContentfulMedia } from './transformMedia';
import { isObject } from './transformContent';
import type { AnyObject, NacelleContentEntry } from '.';
interface ReconstructedContentfulEntry {
fields: AnyObject;
metadata: {
tags: string[];
};
sys: {
id: string;
type: 'Entry';
contentType: {
sys: {
id: string;
linkType: 'ContentType';
type: 'Link';
};
};
};
}
export type ContentfulEntry = AnyObject & {
fields: AnyObject;
sys: AnyObject & { type: string; id: string };
};
const isContentfulEntry = (x: unknown): x is ContentfulEntry =>
isObject((x as ContentfulEntry)?.fields) &&
isObject((x as ContentfulEntry)?.sys);
export function flattenContentfulContent(entry: AnyObject): AnyObject {
if (!isObject(entry?.fields)) {
return entry;
}
const newEntry: AnyObject = {};
for (const [key, value] of Object.entries(entry.fields)) {
if (isContentfulMedia(value)) {
newEntry[key] = flattenContentfulMedia(value);
} else if (isContentfulEntry(value)) {
newEntry[key] = flattenContentfulContent(value.fields);
} else {
newEntry[key] = value;
}
}
if (isContentfulEntry(entry)) {
// extract required properties from the `sys` object
const { createdAt = 0, updatedAt = 0 } = entry.sys;
newEntry.createdAt = createdAt;
newEntry.updatedAt = updatedAt;
} else {
newEntry.createdAt = 0;
newEntry.updatedAt = 0;
}
return flattenContentfulContent(newEntry);
}
/**
* Reshapes a Nacelle v2 content entry reference to a Contentful entry format.
* There are properties of `sys` that we can't reconstruct from a Nacelle v2
* content entry reference, but this function reconstructs as much as possible.
* @param content a Nacelle v2 reference to a content entry that originates from Contentful.
* @returns a mostly-reconstructed Contentful entry.
*/
export function reconstructContentfulEntry(
content: NacelleContentEntry
): ReconstructedContentfulEntry {
const { sourceEntryId } = destructureNacelleEntryId(
content.nacelleEntryId as string
);
return {
fields: content.fields as AnyObject,
metadata: {
tags: content.tags ?? []
},
sys: {
id: sourceEntryId,
type: 'Entry',
contentType: {
sys: {
id: content.type ?? '',
linkType: 'ContentType',
type: 'Link'
}
}
}
};
}