@se-studio/contentful-rest-api 1.0.45 → 1.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +416 -0
- package/dist/api/article-type.d.ts +37 -0
- package/dist/api/article-type.d.ts.map +1 -0
- package/dist/api/article-type.js +134 -0
- package/dist/api/article-type.js.map +1 -0
- package/dist/api/article.d.ts +32 -0
- package/dist/api/article.d.ts.map +1 -0
- package/dist/api/article.js +43 -0
- package/dist/api/article.js.map +1 -0
- package/dist/api/asset.d.ts +28 -0
- package/dist/api/asset.d.ts.map +1 -0
- package/dist/api/asset.js +55 -0
- package/dist/api/asset.js.map +1 -0
- package/dist/api/context.d.ts +24 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +62 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/custom-type.d.ts +37 -0
- package/dist/api/custom-type.d.ts.map +1 -0
- package/dist/api/custom-type.js +44 -0
- package/dist/api/custom-type.js.map +1 -0
- package/dist/api/helpers.d.ts +73 -0
- package/dist/api/helpers.d.ts.map +1 -0
- package/dist/api/helpers.js +296 -0
- package/dist/api/helpers.js.map +1 -0
- package/dist/api/index.d.ts +22 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +28 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/links.d.ts +109 -0
- package/dist/api/links.d.ts.map +1 -0
- package/dist/api/links.js +199 -0
- package/dist/api/links.js.map +1 -0
- package/dist/api/page.d.ts +33 -0
- package/dist/api/page.d.ts.map +1 -0
- package/dist/api/page.js +40 -0
- package/dist/api/page.js.map +1 -0
- package/dist/api/person.d.ts +37 -0
- package/dist/api/person.d.ts.map +1 -0
- package/dist/api/person.js +134 -0
- package/dist/api/person.js.map +1 -0
- package/dist/api/preview.d.ts +55 -0
- package/dist/api/preview.d.ts.map +1 -0
- package/dist/api/preview.js +160 -0
- package/dist/api/preview.js.map +1 -0
- package/dist/api/related-articles.d.ts +22 -0
- package/dist/api/related-articles.d.ts.map +1 -0
- package/dist/api/related-articles.js +82 -0
- package/dist/api/related-articles.js.map +1 -0
- package/dist/api/server-asset.d.ts +40 -0
- package/dist/api/server-asset.d.ts.map +1 -0
- package/dist/api/server-asset.js +65 -0
- package/dist/api/server-asset.js.map +1 -0
- package/dist/api/sitemap.d.ts +131 -0
- package/dist/api/sitemap.d.ts.map +1 -0
- package/dist/api/sitemap.js +199 -0
- package/dist/api/sitemap.js.map +1 -0
- package/dist/api/tag.d.ts +37 -0
- package/dist/api/tag.d.ts.map +1 -0
- package/dist/api/tag.js +131 -0
- package/dist/api/tag.js.map +1 -0
- package/dist/api/template.d.ts +49 -0
- package/dist/api/template.d.ts.map +1 -0
- package/dist/api/template.js +88 -0
- package/dist/api/template.js.map +1 -0
- package/dist/api/types.d.ts +98 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/baseTypes/baseAlternatePageContent.d.ts +24 -0
- package/dist/baseTypes/baseAlternatePageContent.d.ts.map +1 -0
- package/dist/baseTypes/baseAlternatePageContent.js +2 -0
- package/dist/baseTypes/baseAlternatePageContent.js.map +1 -0
- package/dist/baseTypes/baseArticle.d.ts +179 -0
- package/dist/baseTypes/baseArticle.d.ts.map +1 -0
- package/dist/baseTypes/baseArticle.js +2 -0
- package/dist/baseTypes/baseArticle.js.map +1 -0
- package/dist/baseTypes/baseArticleType.d.ts +156 -0
- package/dist/baseTypes/baseArticleType.d.ts.map +1 -0
- package/dist/baseTypes/baseArticleType.js +2 -0
- package/dist/baseTypes/baseArticleType.js.map +1 -0
- package/dist/baseTypes/baseBanner.d.ts +76 -0
- package/dist/baseTypes/baseBanner.d.ts.map +1 -0
- package/dist/baseTypes/baseBanner.js +2 -0
- package/dist/baseTypes/baseBanner.js.map +1 -0
- package/dist/baseTypes/baseCollection.d.ts +132 -0
- package/dist/baseTypes/baseCollection.d.ts.map +1 -0
- package/dist/baseTypes/baseCollection.js +2 -0
- package/dist/baseTypes/baseCollection.js.map +1 -0
- package/dist/baseTypes/baseComponent.d.ts +130 -0
- package/dist/baseTypes/baseComponent.d.ts.map +1 -0
- package/dist/baseTypes/baseComponent.js +2 -0
- package/dist/baseTypes/baseComponent.js.map +1 -0
- package/dist/baseTypes/baseCustomType.d.ts +126 -0
- package/dist/baseTypes/baseCustomType.d.ts.map +1 -0
- package/dist/baseTypes/baseCustomType.js +2 -0
- package/dist/baseTypes/baseCustomType.js.map +1 -0
- package/dist/baseTypes/baseExternalComponent.d.ts +66 -0
- package/dist/baseTypes/baseExternalComponent.d.ts.map +1 -0
- package/dist/baseTypes/baseExternalComponent.js +2 -0
- package/dist/baseTypes/baseExternalComponent.js.map +1 -0
- package/dist/baseTypes/baseExternalVideo.d.ts +85 -0
- package/dist/baseTypes/baseExternalVideo.d.ts.map +1 -0
- package/dist/baseTypes/baseExternalVideo.js +2 -0
- package/dist/baseTypes/baseExternalVideo.js.map +1 -0
- package/dist/baseTypes/baseLink.d.ts +90 -0
- package/dist/baseTypes/baseLink.d.ts.map +1 -0
- package/dist/baseTypes/baseLink.js +2 -0
- package/dist/baseTypes/baseLink.js.map +1 -0
- package/dist/baseTypes/baseMedia.d.ts +92 -0
- package/dist/baseTypes/baseMedia.d.ts.map +1 -0
- package/dist/baseTypes/baseMedia.js +2 -0
- package/dist/baseTypes/baseMedia.js.map +1 -0
- package/dist/baseTypes/baseNavigation.d.ts +36 -0
- package/dist/baseTypes/baseNavigation.d.ts.map +1 -0
- package/dist/baseTypes/baseNavigation.js +2 -0
- package/dist/baseTypes/baseNavigation.js.map +1 -0
- package/dist/baseTypes/baseNavigationItem.d.ts +96 -0
- package/dist/baseTypes/baseNavigationItem.d.ts.map +1 -0
- package/dist/baseTypes/baseNavigationItem.js +2 -0
- package/dist/baseTypes/baseNavigationItem.js.map +1 -0
- package/dist/baseTypes/basePage.d.ts +120 -0
- package/dist/baseTypes/basePage.d.ts.map +1 -0
- package/dist/baseTypes/basePage.js +2 -0
- package/dist/baseTypes/basePage.js.map +1 -0
- package/dist/baseTypes/basePageTest.d.ts +66 -0
- package/dist/baseTypes/basePageTest.d.ts.map +1 -0
- package/dist/baseTypes/basePageTest.js +2 -0
- package/dist/baseTypes/basePageTest.js.map +1 -0
- package/dist/baseTypes/basePageVariant.d.ts +123 -0
- package/dist/baseTypes/basePageVariant.d.ts.map +1 -0
- package/dist/baseTypes/basePageVariant.js +2 -0
- package/dist/baseTypes/basePageVariant.js.map +1 -0
- package/dist/baseTypes/basePerson.d.ts +111 -0
- package/dist/baseTypes/basePerson.d.ts.map +1 -0
- package/dist/baseTypes/basePerson.js +2 -0
- package/dist/baseTypes/basePerson.js.map +1 -0
- package/dist/baseTypes/baseSchema.d.ts +18 -0
- package/dist/baseTypes/baseSchema.d.ts.map +1 -0
- package/dist/baseTypes/baseSchema.js +2 -0
- package/dist/baseTypes/baseSchema.js.map +1 -0
- package/dist/baseTypes/baseShared.d.ts +30 -0
- package/dist/baseTypes/baseShared.d.ts.map +1 -0
- package/dist/baseTypes/baseShared.js +2 -0
- package/dist/baseTypes/baseShared.js.map +1 -0
- package/dist/baseTypes/baseTag.d.ts +108 -0
- package/dist/baseTypes/baseTag.d.ts.map +1 -0
- package/dist/baseTypes/baseTag.js +2 -0
- package/dist/baseTypes/baseTag.js.map +1 -0
- package/dist/baseTypes/baseTagType.d.ts +11 -0
- package/dist/baseTypes/baseTagType.d.ts.map +1 -0
- package/dist/baseTypes/baseTagType.js +2 -0
- package/dist/baseTypes/baseTagType.js.map +1 -0
- package/dist/baseTypes/baseTemplate.d.ts +55 -0
- package/dist/baseTypes/baseTemplate.d.ts.map +1 -0
- package/dist/baseTypes/baseTemplate.js +2 -0
- package/dist/baseTypes/baseTemplate.js.map +1 -0
- package/dist/client.d.ts +143 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +268 -0
- package/dist/client.js.map +1 -0
- package/dist/converters/article.d.ts +42 -0
- package/dist/converters/article.d.ts.map +1 -0
- package/dist/converters/article.js +220 -0
- package/dist/converters/article.js.map +1 -0
- package/dist/converters/asset.d.ts +22 -0
- package/dist/converters/asset.d.ts.map +1 -0
- package/dist/converters/asset.js +282 -0
- package/dist/converters/asset.js.map +1 -0
- package/dist/converters/collection.d.ts +26 -0
- package/dist/converters/collection.d.ts.map +1 -0
- package/dist/converters/collection.js +50 -0
- package/dist/converters/collection.js.map +1 -0
- package/dist/converters/component.d.ts +26 -0
- package/dist/converters/component.d.ts.map +1 -0
- package/dist/converters/component.js +54 -0
- package/dist/converters/component.js.map +1 -0
- package/dist/converters/customType.d.ts +24 -0
- package/dist/converters/customType.d.ts.map +1 -0
- package/dist/converters/customType.js +71 -0
- package/dist/converters/customType.js.map +1 -0
- package/dist/converters/externalComponent.d.ts +22 -0
- package/dist/converters/externalComponent.d.ts.map +1 -0
- package/dist/converters/externalComponent.js +34 -0
- package/dist/converters/externalComponent.js.map +1 -0
- package/dist/converters/helpers.d.ts +116 -0
- package/dist/converters/helpers.d.ts.map +1 -0
- package/dist/converters/helpers.js +128 -0
- package/dist/converters/helpers.js.map +1 -0
- package/dist/converters/iconCollector.d.ts +65 -0
- package/dist/converters/iconCollector.d.ts.map +1 -0
- package/dist/converters/iconCollector.js +282 -0
- package/dist/converters/iconCollector.js.map +1 -0
- package/dist/converters/index.d.ts +18 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +18 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/link.d.ts +11 -0
- package/dist/converters/link.d.ts.map +1 -0
- package/dist/converters/link.js +96 -0
- package/dist/converters/link.js.map +1 -0
- package/dist/converters/navigationItem.d.ts +11 -0
- package/dist/converters/navigationItem.d.ts.map +1 -0
- package/dist/converters/navigationItem.js +73 -0
- package/dist/converters/navigationItem.js.map +1 -0
- package/dist/converters/page.d.ts +44 -0
- package/dist/converters/page.d.ts.map +1 -0
- package/dist/converters/page.js +121 -0
- package/dist/converters/page.js.map +1 -0
- package/dist/converters/person.d.ts +40 -0
- package/dist/converters/person.d.ts.map +1 -0
- package/dist/converters/person.js +109 -0
- package/dist/converters/person.js.map +1 -0
- package/dist/converters/resolver.d.ts +29 -0
- package/dist/converters/resolver.d.ts.map +1 -0
- package/dist/converters/resolver.js +317 -0
- package/dist/converters/resolver.js.map +1 -0
- package/dist/converters/schema.d.ts +14 -0
- package/dist/converters/schema.d.ts.map +1 -0
- package/dist/converters/schema.js +18 -0
- package/dist/converters/schema.js.map +1 -0
- package/dist/converters/svgProcessor.d.ts +23 -0
- package/dist/converters/svgProcessor.d.ts.map +1 -0
- package/dist/converters/svgProcessor.js +47 -0
- package/dist/converters/svgProcessor.js.map +1 -0
- package/dist/converters/tag.d.ts +25 -0
- package/dist/converters/tag.d.ts.map +1 -0
- package/dist/converters/tag.js +98 -0
- package/dist/converters/tag.js.map +1 -0
- package/dist/converters/template.d.ts +26 -0
- package/dist/converters/template.d.ts.map +1 -0
- package/dist/converters/template.js +44 -0
- package/dist/converters/template.js.map +1 -0
- package/dist/index.d.ts +28 -718
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -3602
- package/dist/index.js.map +1 -1
- package/dist/revalidation/handlers.d.ts +52 -0
- package/dist/revalidation/handlers.d.ts.map +1 -0
- package/dist/revalidation/handlers.js +130 -0
- package/dist/revalidation/handlers.js.map +1 -0
- package/dist/revalidation/index.d.ts +3 -0
- package/dist/revalidation/index.d.ts.map +1 -0
- package/dist/revalidation/index.js +4 -0
- package/dist/revalidation/index.js.map +1 -0
- package/dist/revalidation/nextjs-route.d.ts +31 -0
- package/dist/revalidation/nextjs-route.d.ts.map +1 -0
- package/dist/revalidation/nextjs-route.js +34 -0
- package/dist/revalidation/nextjs-route.js.map +1 -0
- package/dist/revalidation/route.d.ts +3 -0
- package/dist/revalidation/route.d.ts.map +1 -0
- package/dist/revalidation/route.js +97 -0
- package/dist/revalidation/route.js.map +1 -0
- package/dist/revalidation/server-utils.d.ts +22 -0
- package/dist/revalidation/server-utils.d.ts.map +1 -0
- package/dist/revalidation/server-utils.js +41 -0
- package/dist/revalidation/server-utils.js.map +1 -0
- package/dist/revalidation/tags.d.ts +81 -0
- package/dist/revalidation/tags.d.ts.map +1 -0
- package/dist/revalidation/tags.js +117 -0
- package/dist/revalidation/tags.js.map +1 -0
- package/dist/revalidation/utils.d.ts +21 -0
- package/dist/revalidation/utils.d.ts.map +1 -0
- package/dist/revalidation/utils.js +51 -0
- package/dist/revalidation/utils.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/arrayUtils.d.ts +3 -0
- package/dist/utils/arrayUtils.d.ts.map +1 -0
- package/dist/utils/arrayUtils.js +12 -0
- package/dist/utils/arrayUtils.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +9 -0
- package/dist/utils/dateUtils.d.ts.map +1 -0
- package/dist/utils/dateUtils.js +26 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +56 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +100 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-utils.d.ts +17 -0
- package/dist/utils/json-utils.d.ts.map +1 -0
- package/dist/utils/json-utils.js +43 -0
- package/dist/utils/json-utils.js.map +1 -0
- package/dist/utils/retry.d.ts +112 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +221 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { addPositionMetadata, calculateContentCount, createInternalLink, lookupAsset, makeContentfulDescription, makeContentfulTitle, } from './helpers';
|
|
2
|
+
import { collectIconsFromContent, collectIconsFromNavigation, deduplicateIcons, } from './iconCollector';
|
|
3
|
+
import { resolveNavigation } from './navigationItem';
|
|
4
|
+
import { resolveLink, resolvePageContent, resolveSchema } from './resolver';
|
|
5
|
+
import { resolveTemplate } from './template';
|
|
6
|
+
/**
|
|
7
|
+
* Base converter for Contentful Page entries to IPage type
|
|
8
|
+
*
|
|
9
|
+
* This is a minimal implementation that can be extended using
|
|
10
|
+
* the functional composition pattern.
|
|
11
|
+
*
|
|
12
|
+
* @param entry - Contentful entry to convert
|
|
13
|
+
* @returns IPage object
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const page = basePageConverter(contentfulEntry);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function basePageConverter(context, entry) {
|
|
21
|
+
const { sys: { id }, fields, } = entry;
|
|
22
|
+
const { slug, title, description, featuredImage, tags, content, menu: pageMenu, footer: pageFooter, template: templateLink, topContent: topContentLinks, bottomContent: bottomContentLinks, structuredData, ...simpleFields } = fields;
|
|
23
|
+
const pageMenuNav = pageMenu ? resolveNavigation(context, pageMenu) : undefined;
|
|
24
|
+
const pageFooterNav = pageFooter ? resolveNavigation(context, pageFooter) : undefined;
|
|
25
|
+
// Resolve template (if exists)
|
|
26
|
+
const template = templateLink ? resolveTemplate(context, templateLink) : null;
|
|
27
|
+
// Resolve all content sections
|
|
28
|
+
const topContent = topContentLinks
|
|
29
|
+
?.map((c) => resolvePageContent(context, id, c))
|
|
30
|
+
.filter((item) => item !== null) ?? [];
|
|
31
|
+
const pageContent = content
|
|
32
|
+
?.map((c) => resolvePageContent(context, id, c))
|
|
33
|
+
.filter((item) => item !== null) ?? [];
|
|
34
|
+
const bottomContent = bottomContentLinks
|
|
35
|
+
?.map((c) => resolvePageContent(context, id, c))
|
|
36
|
+
.filter((item) => item !== null) ?? [];
|
|
37
|
+
const preContent = template?.preContent ?? [];
|
|
38
|
+
const postContent = template?.postContent ?? [];
|
|
39
|
+
// Merge in correct order and add position metadata
|
|
40
|
+
const contents = addPositionMetadata([
|
|
41
|
+
...topContent,
|
|
42
|
+
...preContent,
|
|
43
|
+
...pageContent,
|
|
44
|
+
...postContent,
|
|
45
|
+
...bottomContent,
|
|
46
|
+
]);
|
|
47
|
+
// Determine final menu and footer (page-level overrides template)
|
|
48
|
+
const finalMenu = pageMenuNav ?? template?.menu;
|
|
49
|
+
const finalFooter = pageFooterNav ?? template?.footer;
|
|
50
|
+
// Collect and deduplicate all SVG icons from page content and navigation
|
|
51
|
+
const icons = deduplicateIcons(collectIconsFromContent(contents), collectIconsFromNavigation(finalMenu), collectIconsFromNavigation(finalFooter));
|
|
52
|
+
const page = {
|
|
53
|
+
type: 'Page',
|
|
54
|
+
id,
|
|
55
|
+
isHomePage: slug === 'index',
|
|
56
|
+
slug,
|
|
57
|
+
name: title,
|
|
58
|
+
title: makeContentfulTitle(title, id),
|
|
59
|
+
description: makeContentfulDescription(description, id),
|
|
60
|
+
featuredImage: lookupAsset(context, featuredImage),
|
|
61
|
+
tags: tags?.map((tag) => resolveLink(context, id, tag)),
|
|
62
|
+
contentCount: calculateContentCount(topContent, pageContent, bottomContent),
|
|
63
|
+
contents,
|
|
64
|
+
icons,
|
|
65
|
+
structuredData: structuredData
|
|
66
|
+
?.map((link) => resolveSchema(context, id, link))
|
|
67
|
+
.filter((item) => item !== null),
|
|
68
|
+
...simpleFields,
|
|
69
|
+
menu: finalMenu,
|
|
70
|
+
footer: finalFooter,
|
|
71
|
+
};
|
|
72
|
+
return page;
|
|
73
|
+
}
|
|
74
|
+
export function calculatePageHref(slug) {
|
|
75
|
+
if (slug === 'index') {
|
|
76
|
+
return '/';
|
|
77
|
+
}
|
|
78
|
+
return `/${slug}/`;
|
|
79
|
+
}
|
|
80
|
+
export function basePageLinkConverter(context, entry) {
|
|
81
|
+
const { sys: { id, contentType }, fields, } = entry;
|
|
82
|
+
if (contentType.sys.id !== 'page') {
|
|
83
|
+
throw new Error(`Invalid content type: expected "page", got "${contentType.sys.id}"`);
|
|
84
|
+
}
|
|
85
|
+
return createInternalLink(id, {
|
|
86
|
+
...fields,
|
|
87
|
+
name: fields.cmsLabel,
|
|
88
|
+
}, context, context.urlCalculators.page(fields.slug), 'Page', { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) });
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Calculates the href for a page variant page
|
|
92
|
+
* @param slug - Page variant slug
|
|
93
|
+
* @returns Page variant href path with trailing slash
|
|
94
|
+
*/
|
|
95
|
+
export function calculatePageVariantHref(slug) {
|
|
96
|
+
return `/${slug}/`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Base converter for PageVariant entries to IInternalLink type
|
|
100
|
+
* Used when a page variant is referenced as a link in content
|
|
101
|
+
*
|
|
102
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
103
|
+
* @param entry - Contentful page variant entry to convert
|
|
104
|
+
* @returns IInternalLink object representing the page variant link
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* const pageVariantLink = basePageVariantLinkConverter(context, pageVariantEntry);
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export function basePageVariantLinkConverter(context, entry) {
|
|
112
|
+
const { sys: { id, contentType }, fields, } = entry;
|
|
113
|
+
if (contentType.sys.id !== 'pageVariant') {
|
|
114
|
+
throw new Error(`Invalid content type: expected "pageVariant", got "${contentType.sys.id}"`);
|
|
115
|
+
}
|
|
116
|
+
return createInternalLink(id, {
|
|
117
|
+
...fields,
|
|
118
|
+
name: fields.cmsLabel,
|
|
119
|
+
}, context, context.urlCalculators.pageVariant(fields.slug), 'Page', { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) });
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/converters/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BaseModelLinkOmissions, IBasePerson, IInternalLink } from '@se-studio/core-data-types';
|
|
2
|
+
import type { Entry } from 'contentful';
|
|
3
|
+
import type { DefaultChainModifier, IContentfulRichText } from '../api';
|
|
4
|
+
import type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';
|
|
5
|
+
import type { BasePersonSkeleton } from '../baseTypes/basePerson';
|
|
6
|
+
import { type ConverterContext } from './helpers';
|
|
7
|
+
export type IContentfulPerson = IBasePerson & {
|
|
8
|
+
bio?: IContentfulRichText | null;
|
|
9
|
+
};
|
|
10
|
+
export type ContentfulPersonLink = Omit<IContentfulPerson, BaseModelLinkOmissions | 'structuredData' | 'contents' | 'customType'>;
|
|
11
|
+
/**
|
|
12
|
+
* Base converter for Person entries to IInternalLink type
|
|
13
|
+
* Used when a person is referenced as a link in content
|
|
14
|
+
*
|
|
15
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
16
|
+
* @param entry - Contentful person entry to convert
|
|
17
|
+
* @returns IInternalLink object representing the person link
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const personLink = basePersonLinkConverter(context, personEntry);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function basePersonLinkConverter(context: ConverterContext, entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>): IInternalLink;
|
|
25
|
+
/**
|
|
26
|
+
* Base converter for Person entries to IPerson type
|
|
27
|
+
* Used when a complete person object with bio and content is needed
|
|
28
|
+
*
|
|
29
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
30
|
+
* @param entry - Contentful person entry to convert
|
|
31
|
+
* @param customTypeEntry - Optional custom type entry that defines templates and navigation
|
|
32
|
+
* @returns IPerson object representing the complete person
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const person = basePersonConverter(context, personEntry, customTypeEntry);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function basePersonConverter(context: ConverterContext, entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>, customTypeEntry?: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>): IContentfulPerson;
|
|
40
|
+
//# sourceMappingURL=person.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../src/converters/person.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,WAAW,EACX,aAAa,EAGd,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAEL,KAAK,gBAAgB,EAKtB,MAAM,WAAW,CAAC;AAUnB,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,GAAG,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,iBAAiB,EACjB,sBAAsB,GAAG,gBAAgB,GAAG,UAAU,GAAG,YAAY,CACtE,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC,GAC7D,aAAa,CAwCf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAC9D,eAAe,CAAC,EAAE,KAAK,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,CAAC,GAC5E,iBAAiB,CA6EnB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { addPositionMetadata, calculateContentCount, createInternalLink, lookupAsset, makeContentfulTitle, } from './helpers';
|
|
2
|
+
import { collectIconsFromContent, collectIconsFromNavigation, deduplicateIcons, } from './iconCollector';
|
|
3
|
+
import { resolveNavigation } from './navigationItem';
|
|
4
|
+
import { resolvePageContent, resolveRichTextDocument, resolveSchema } from './resolver';
|
|
5
|
+
import { resolveTemplate } from './template';
|
|
6
|
+
/**
|
|
7
|
+
* Base converter for Person entries to IInternalLink type
|
|
8
|
+
* Used when a person is referenced as a link in content
|
|
9
|
+
*
|
|
10
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
11
|
+
* @param entry - Contentful person entry to convert
|
|
12
|
+
* @returns IInternalLink object representing the person link
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const personLink = basePersonLinkConverter(context, personEntry);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function basePersonLinkConverter(context, entry) {
|
|
20
|
+
const { sys, fields } = entry;
|
|
21
|
+
const { name, bio: fieldsBio, jobTitle, phoneNumber, emailAddress, linkedIn, location, media, ...simpleFields } = fields;
|
|
22
|
+
if (sys.contentType.sys.id !== 'person') {
|
|
23
|
+
throw new Error(`Invalid content type: expected "person", got "${sys.contentType.sys.id}"`);
|
|
24
|
+
}
|
|
25
|
+
const title = makeContentfulTitle(name, sys.id);
|
|
26
|
+
return createInternalLink(sys.id, {
|
|
27
|
+
...simpleFields,
|
|
28
|
+
name,
|
|
29
|
+
title,
|
|
30
|
+
featuredImage: media,
|
|
31
|
+
cmsLabel: title,
|
|
32
|
+
}, context, context.urlCalculators.person(fields.slug), 'Person', {
|
|
33
|
+
bio: resolveRichTextDocument(context, sys.id, fieldsBio),
|
|
34
|
+
jobTitle,
|
|
35
|
+
phoneNumber,
|
|
36
|
+
emailAddress,
|
|
37
|
+
linkedIn,
|
|
38
|
+
location,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Base converter for Person entries to IPerson type
|
|
43
|
+
* Used when a complete person object with bio and content is needed
|
|
44
|
+
*
|
|
45
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
46
|
+
* @param entry - Contentful person entry to convert
|
|
47
|
+
* @param customTypeEntry - Optional custom type entry that defines templates and navigation
|
|
48
|
+
* @returns IPerson object representing the complete person
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const person = basePersonConverter(context, personEntry, customTypeEntry);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function basePersonConverter(context, entry, customTypeEntry) {
|
|
56
|
+
const { sys: { id, contentType }, fields, } = entry;
|
|
57
|
+
if (contentType.sys.id !== 'person') {
|
|
58
|
+
throw new Error(`Invalid content type: expected "person", got "${contentType.sys.id}"`);
|
|
59
|
+
}
|
|
60
|
+
const { slug, name, description, media, bio: bioField, content: contentLinks, structuredData, ...rest } = fields;
|
|
61
|
+
// Resolve custom type (if provided)
|
|
62
|
+
const customType = customTypeEntry
|
|
63
|
+
? context.customTypeResolver(context, customTypeEntry)
|
|
64
|
+
: undefined;
|
|
65
|
+
// Resolve template from custom type (if provided)
|
|
66
|
+
const template = customTypeEntry?.fields.template
|
|
67
|
+
? resolveTemplate(context, customTypeEntry.fields.template)
|
|
68
|
+
: null;
|
|
69
|
+
// Resolve content sections
|
|
70
|
+
const personContent = contentLinks
|
|
71
|
+
?.map((c) => resolvePageContent(context, id, c))
|
|
72
|
+
.filter((item) => item !== null) ?? [];
|
|
73
|
+
const preContent = template?.preContent ?? [];
|
|
74
|
+
const postContent = template?.postContent ?? [];
|
|
75
|
+
// Merge in correct order and add position metadata
|
|
76
|
+
const contents = addPositionMetadata([...preContent, ...personContent, ...postContent]);
|
|
77
|
+
// Resolve navigation (template level or from custom type)
|
|
78
|
+
// Note: Person doesn't have direct menu/footer overrides, so we rely on the custom type/template
|
|
79
|
+
const menu = customTypeEntry?.fields.menu
|
|
80
|
+
? resolveNavigation(context, customTypeEntry.fields.menu)
|
|
81
|
+
: template?.menu;
|
|
82
|
+
const footer = customTypeEntry?.fields.footer
|
|
83
|
+
? resolveNavigation(context, customTypeEntry.fields.footer)
|
|
84
|
+
: template?.footer;
|
|
85
|
+
// Collect and deduplicate all SVG icons
|
|
86
|
+
const icons = deduplicateIcons(collectIconsFromContent(contents), collectIconsFromNavigation(menu), collectIconsFromNavigation(footer));
|
|
87
|
+
return {
|
|
88
|
+
type: 'Person',
|
|
89
|
+
id,
|
|
90
|
+
slug,
|
|
91
|
+
name,
|
|
92
|
+
title: makeContentfulTitle(name, id),
|
|
93
|
+
description: description ?? `Description for ${id}`,
|
|
94
|
+
featuredImage: lookupAsset(context, media), // Person uses 'media' not 'featuredImage'
|
|
95
|
+
href: context.urlCalculators.person(slug),
|
|
96
|
+
bio: resolveRichTextDocument(context, id, bioField) ?? null,
|
|
97
|
+
contentCount: calculateContentCount(personContent),
|
|
98
|
+
contents,
|
|
99
|
+
menu,
|
|
100
|
+
footer,
|
|
101
|
+
icons,
|
|
102
|
+
customType,
|
|
103
|
+
structuredData: structuredData
|
|
104
|
+
?.map((link) => resolveSchema(context, id, link))
|
|
105
|
+
.filter((item) => item !== null),
|
|
106
|
+
...rest,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=person.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person.js","sourceRoot":"","sources":["../../src/converters/person.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Document } from '@contentful/rich-text-types';
|
|
2
|
+
import type { BaseCollectionContent, IInternalLink, INavigationItem, ISchema, ITyped } from '@se-studio/core-data-types';
|
|
3
|
+
import type { Entry, EntrySkeletonType, UnresolvedLink } from 'contentful';
|
|
4
|
+
import type { DefaultChainModifier } from '../api';
|
|
5
|
+
import type { ConverterContext } from './helpers';
|
|
6
|
+
export declare function resolveHelper<TEntrySkeletonType extends EntrySkeletonType, TResult>(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>, getResolver: (type: string) => ((context: ConverterContext, entry: Entry<TEntrySkeletonType, DefaultChainModifier, string>) => TResult) | undefined): TResult;
|
|
7
|
+
export declare function resolveSchema(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): ISchema;
|
|
8
|
+
export declare function resolveLink(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): IInternalLink;
|
|
9
|
+
export declare function resolveLinks(context: ConverterContext, fromId: string, entries: UnresolvedLink<'Entry'>[] | undefined): readonly IInternalLink[] | undefined;
|
|
10
|
+
export declare function resolveContent(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): ITyped;
|
|
11
|
+
export declare function resolveNavigationItem(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): INavigationItem;
|
|
12
|
+
export declare function resolveCollectionContent(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): BaseCollectionContent;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a PageContent entry from an unresolved link
|
|
15
|
+
* PageContent can be: Component, Collection, ExternalComponent, Visual (media/externalVideo), or PersonLink
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolvePageContent(context: ConverterContext, fromId: string, entry: UnresolvedLink<'Entry'>): ITyped | null;
|
|
18
|
+
/**
|
|
19
|
+
* Resolves all embedded entries and assets within a rich text document
|
|
20
|
+
* Recursively traverses the document tree and resolves link references
|
|
21
|
+
*
|
|
22
|
+
* @param context - The converter context with includes and assets maps
|
|
23
|
+
* @param richText - The unresolved rich text document from Contentful
|
|
24
|
+
* @returns The rich text document with all embedded content resolved
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveRichTextDocument(context: ConverterContext, fromId: string, richText: Document | undefined): {
|
|
27
|
+
json: Document;
|
|
28
|
+
} | undefined;
|
|
29
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/converters/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,QAAQ,EAAgB,MAAM,6BAA6B,CAAC;AACjF,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,OAAO,EACP,MAAM,EACP,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAWnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIlD,wBAAgB,aAAa,CAAC,kBAAkB,SAAS,iBAAiB,EAAE,OAAO,EACjF,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAC9B,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,KAEV,CAAC,CACC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC,KAC3D,OAAO,CAAC,GACb,SAAS,GACZ,OAAO,CAyBT;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,OAAO,CAOT;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,aAAa,CAIf;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,GAC7C,SAAS,aAAa,EAAE,GAAG,SAAS,CAEtC;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,MAAM,CAQR;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,eAAe,CAQjB;AAGD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,qBAAqB,CAkEvB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAC7B,MAAM,GAAG,IAAI,CA+Hf;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GAAG,SAAS;UA2HH,QAAQ;cACpC"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { arrayOrUndefined } from '../utils';
|
|
2
|
+
import { convertExternalVideoEntryToVisual, convertMediaEntryToVisual } from './asset';
|
|
3
|
+
import { lookupAsset } from './helpers';
|
|
4
|
+
import { baseSchemaConverter } from './schema';
|
|
5
|
+
export function resolveHelper(context, fromId, entry, getResolver) {
|
|
6
|
+
const id = entry.sys.id;
|
|
7
|
+
const possibleEntry = context.includes.get(id);
|
|
8
|
+
if (!possibleEntry) {
|
|
9
|
+
throw new Error(`Cannot find included entry for link from ${fromId} with id ${id}`);
|
|
10
|
+
}
|
|
11
|
+
if (!possibleEntry.resolved) {
|
|
12
|
+
const resolver = getResolver(possibleEntry.type);
|
|
13
|
+
if (!resolver) {
|
|
14
|
+
throw new Error(`No resolver found for link type ${possibleEntry.type} (${JSON.stringify(possibleEntry)}) [${JSON.stringify(entry)}]`);
|
|
15
|
+
}
|
|
16
|
+
if (typeof resolver !== 'function') {
|
|
17
|
+
console.log('Resolver type', possibleEntry.type, typeof resolver, resolver);
|
|
18
|
+
}
|
|
19
|
+
const resolved = resolver(context, possibleEntry.entry);
|
|
20
|
+
possibleEntry.resolved = resolved;
|
|
21
|
+
return resolved;
|
|
22
|
+
}
|
|
23
|
+
return possibleEntry.resolved;
|
|
24
|
+
}
|
|
25
|
+
export function resolveSchema(context, fromId, entry) {
|
|
26
|
+
return resolveHelper(context, fromId, entry, () => baseSchemaConverter);
|
|
27
|
+
}
|
|
28
|
+
export function resolveLink(context, fromId, entry) {
|
|
29
|
+
return resolveHelper(context, fromId, entry, (type) => context.linkResolver.get(type));
|
|
30
|
+
}
|
|
31
|
+
export function resolveLinks(context, fromId, entries) {
|
|
32
|
+
return arrayOrUndefined(entries?.map((entry) => resolveLink(context, fromId, entry)));
|
|
33
|
+
}
|
|
34
|
+
export function resolveContent(context, fromId, entry) {
|
|
35
|
+
return resolveHelper(context, fromId, entry, (type) => {
|
|
36
|
+
const resolver = context.contentResolver.get(type);
|
|
37
|
+
return resolver;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function resolveNavigationItem(context, fromId, entry) {
|
|
41
|
+
const result = resolveHelper(context, fromId, entry, () => context.navigationItemResolver);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export function resolveCollectionContent(context, fromId, entry) {
|
|
45
|
+
const id = entry.sys.id;
|
|
46
|
+
const possibleEntry = context.includes.get(id);
|
|
47
|
+
if (!possibleEntry) {
|
|
48
|
+
throw new Error(`Cannot find included entry for collection content from ${fromId} with id ${id}`);
|
|
49
|
+
}
|
|
50
|
+
// Return cached resolved entry if available
|
|
51
|
+
if (possibleEntry.resolved) {
|
|
52
|
+
return possibleEntry.resolved;
|
|
53
|
+
}
|
|
54
|
+
const { type } = possibleEntry;
|
|
55
|
+
// Handle Media - convert to IVisual
|
|
56
|
+
if (type === 'media') {
|
|
57
|
+
const visual = convertMediaEntryToVisual(context, possibleEntry.entry);
|
|
58
|
+
if (!visual) {
|
|
59
|
+
throw new Error(`Failed to convert media entry with id ${id}`);
|
|
60
|
+
}
|
|
61
|
+
possibleEntry.resolved = visual;
|
|
62
|
+
return visual;
|
|
63
|
+
}
|
|
64
|
+
// Handle ExternalVideo - convert to IVisual
|
|
65
|
+
if (type === 'externalVideo') {
|
|
66
|
+
const visual = convertExternalVideoEntryToVisual(context, possibleEntry.entry);
|
|
67
|
+
if (!visual) {
|
|
68
|
+
throw new Error(`Failed to convert externalVideo entry with id ${id}`);
|
|
69
|
+
}
|
|
70
|
+
possibleEntry.resolved = visual;
|
|
71
|
+
return visual;
|
|
72
|
+
}
|
|
73
|
+
// Fall back to resolver lookup for other types
|
|
74
|
+
return resolveHelper(context, fromId, entry, (resolverType) => {
|
|
75
|
+
const resolver = context.contentResolver.get(resolverType);
|
|
76
|
+
if (resolver) {
|
|
77
|
+
return resolver;
|
|
78
|
+
}
|
|
79
|
+
const linkResolver = context.linkResolver.get(resolverType);
|
|
80
|
+
if (linkResolver) {
|
|
81
|
+
return linkResolver;
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolves a PageContent entry from an unresolved link
|
|
88
|
+
* PageContent can be: Component, Collection, ExternalComponent, Visual (media/externalVideo), or PersonLink
|
|
89
|
+
*/
|
|
90
|
+
export function resolvePageContent(context, fromId, entry) {
|
|
91
|
+
const id = entry.sys.id;
|
|
92
|
+
const possibleEntry = context.includes.get(id);
|
|
93
|
+
if (!possibleEntry) {
|
|
94
|
+
const errorMessage = `Cannot find included entry for content from ${fromId} with id ${id}`;
|
|
95
|
+
const cmsError = {
|
|
96
|
+
entryId: id,
|
|
97
|
+
entryType: 'unknown',
|
|
98
|
+
message: errorMessage,
|
|
99
|
+
error: new Error(errorMessage),
|
|
100
|
+
};
|
|
101
|
+
context.errors.push(cmsError);
|
|
102
|
+
console.error(errorMessage);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const { type } = possibleEntry;
|
|
106
|
+
// Handle Media - convert to IVisual
|
|
107
|
+
if (type === 'media') {
|
|
108
|
+
try {
|
|
109
|
+
const visual = convertMediaEntryToVisual(context, possibleEntry.entry);
|
|
110
|
+
if (!visual) {
|
|
111
|
+
const errorMessage = `Failed to convert media entry with id ${id}`;
|
|
112
|
+
const cmsError = {
|
|
113
|
+
entryId: id,
|
|
114
|
+
entryType: type,
|
|
115
|
+
message: errorMessage,
|
|
116
|
+
error: new Error(errorMessage),
|
|
117
|
+
};
|
|
118
|
+
context.errors.push(cmsError);
|
|
119
|
+
console.error(errorMessage);
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return visual;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const errorMessage = `Error converting media entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
126
|
+
const cmsError = {
|
|
127
|
+
entryId: id,
|
|
128
|
+
entryType: type,
|
|
129
|
+
message: errorMessage,
|
|
130
|
+
error,
|
|
131
|
+
};
|
|
132
|
+
context.errors.push(cmsError);
|
|
133
|
+
console.error(errorMessage);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Handle ExternalVideo - convert to IVisual
|
|
138
|
+
if (type === 'externalVideo') {
|
|
139
|
+
try {
|
|
140
|
+
const visual = convertExternalVideoEntryToVisual(context, possibleEntry.entry);
|
|
141
|
+
if (!visual) {
|
|
142
|
+
const errorMessage = `Failed to convert externalVideo entry with id ${id}`;
|
|
143
|
+
const cmsError = {
|
|
144
|
+
entryId: id,
|
|
145
|
+
entryType: type,
|
|
146
|
+
message: errorMessage,
|
|
147
|
+
error: new Error(errorMessage),
|
|
148
|
+
};
|
|
149
|
+
context.errors.push(cmsError);
|
|
150
|
+
console.error(errorMessage);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
return visual;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const errorMessage = `Error converting externalVideo entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
157
|
+
const cmsError = {
|
|
158
|
+
entryId: id,
|
|
159
|
+
entryType: type,
|
|
160
|
+
message: errorMessage,
|
|
161
|
+
error,
|
|
162
|
+
};
|
|
163
|
+
context.errors.push(cmsError);
|
|
164
|
+
console.error(errorMessage);
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// // Handle ExternalComponent
|
|
169
|
+
// if (type === 'externalComponent') {
|
|
170
|
+
// return resolveHelper<
|
|
171
|
+
// TConfig,
|
|
172
|
+
// BaseExternalComponentSkeleton<TConfig>,
|
|
173
|
+
// TConfig['ExternalComponent']
|
|
174
|
+
// >(context, entry, () => baseExternalComponentConverter);
|
|
175
|
+
// }
|
|
176
|
+
try {
|
|
177
|
+
if (context.contentResolver.has(type)) {
|
|
178
|
+
return resolveContent(context, fromId, entry);
|
|
179
|
+
}
|
|
180
|
+
if (context.linkResolver.has(type)) {
|
|
181
|
+
return resolveLink(context, fromId, entry);
|
|
182
|
+
}
|
|
183
|
+
const errorMessage = `Unknown content type "${type}" for entry with id ${id}`;
|
|
184
|
+
const cmsError = {
|
|
185
|
+
entryId: id,
|
|
186
|
+
entryType: type,
|
|
187
|
+
message: errorMessage,
|
|
188
|
+
error: new Error(errorMessage),
|
|
189
|
+
};
|
|
190
|
+
context.errors.push(cmsError);
|
|
191
|
+
console.error(errorMessage);
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
const errorMessage = `Error resolving content entry with id ${id} of type ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
196
|
+
const cmsError = {
|
|
197
|
+
entryId: id,
|
|
198
|
+
entryType: type,
|
|
199
|
+
message: errorMessage,
|
|
200
|
+
error,
|
|
201
|
+
};
|
|
202
|
+
context.errors.push(cmsError);
|
|
203
|
+
console.error(errorMessage);
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Resolves all embedded entries and assets within a rich text document
|
|
209
|
+
* Recursively traverses the document tree and resolves link references
|
|
210
|
+
*
|
|
211
|
+
* @param context - The converter context with includes and assets maps
|
|
212
|
+
* @param richText - The unresolved rich text document from Contentful
|
|
213
|
+
* @returns The rich text document with all embedded content resolved
|
|
214
|
+
*/
|
|
215
|
+
export function resolveRichTextDocument(context, fromId, richText) {
|
|
216
|
+
if (!richText) {
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
// Track resolved entries to prevent infinite recursion
|
|
220
|
+
const resolvingEntries = new Set();
|
|
221
|
+
const resolvedEntries = new Set();
|
|
222
|
+
const resolveNode = (node) => {
|
|
223
|
+
// Handle embedded-entry-block nodes
|
|
224
|
+
if (!('content' in node)) {
|
|
225
|
+
return node;
|
|
226
|
+
}
|
|
227
|
+
const block = node;
|
|
228
|
+
if (block.data.target &&
|
|
229
|
+
'sys' in block.data.target &&
|
|
230
|
+
block.data.target.sys.linkType === 'Entry') {
|
|
231
|
+
const entryId = block.data.target.sys.id;
|
|
232
|
+
// Check for circular references
|
|
233
|
+
if (resolvingEntries.has(entryId)) {
|
|
234
|
+
console.warn(`Circular reference detected in rich text resolution for entry ${entryId}. Skipping to prevent infinite recursion.`);
|
|
235
|
+
// Return the node as-is to break the cycle
|
|
236
|
+
return {
|
|
237
|
+
...block,
|
|
238
|
+
content: block.content?.map(resolveNode),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// Check if already resolved
|
|
242
|
+
if (resolvedEntries.has(entryId)) {
|
|
243
|
+
// Entry already resolved, skip to avoid duplicate work
|
|
244
|
+
return {
|
|
245
|
+
...block,
|
|
246
|
+
content: block.content?.map(resolveNode),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
resolvingEntries.add(entryId);
|
|
251
|
+
const resolvedEntry = resolvePageContent(context, fromId, block.data.target);
|
|
252
|
+
resolvingEntries.delete(entryId);
|
|
253
|
+
resolvedEntries.add(entryId);
|
|
254
|
+
// If resolvePageContent returned null due to error, return node as-is
|
|
255
|
+
if (resolvedEntry === null) {
|
|
256
|
+
return {
|
|
257
|
+
...block,
|
|
258
|
+
content: block.content?.map(resolveNode),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
...block,
|
|
263
|
+
data: {
|
|
264
|
+
...block.data,
|
|
265
|
+
target: resolvedEntry,
|
|
266
|
+
},
|
|
267
|
+
content: block.content?.map(resolveNode),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
resolvingEntries.delete(entryId); // Clean up on error
|
|
272
|
+
console.error(`Failed to resolve entry with id ${entryId}:`, error);
|
|
273
|
+
// Return the node as-is if resolution fails
|
|
274
|
+
return {
|
|
275
|
+
...block,
|
|
276
|
+
content: block.content?.map(resolveNode),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (block.data.target &&
|
|
281
|
+
'sys' in block.data.target &&
|
|
282
|
+
block.data.target.sys.linkType === 'Asset') {
|
|
283
|
+
try {
|
|
284
|
+
const resolvedAsset = lookupAsset(context, block.data.target);
|
|
285
|
+
if (resolvedAsset) {
|
|
286
|
+
return {
|
|
287
|
+
...block,
|
|
288
|
+
data: {
|
|
289
|
+
...block.data,
|
|
290
|
+
target: resolvedAsset,
|
|
291
|
+
},
|
|
292
|
+
content: block.content?.map(resolveNode),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
console.error(`Failed to resolve embedded-asset-block with id ${block.data.target.sys.id}:`, error);
|
|
298
|
+
// Return the node as-is if resolution fails
|
|
299
|
+
return {
|
|
300
|
+
...block,
|
|
301
|
+
content: block.content?.map(resolveNode),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// For all other node types, recursively process content if present
|
|
306
|
+
return {
|
|
307
|
+
...block,
|
|
308
|
+
content: block.content?.map(resolveNode),
|
|
309
|
+
};
|
|
310
|
+
};
|
|
311
|
+
// Cast the EntryFieldTypes.RichText to our working type
|
|
312
|
+
// Resolve the entire document tree
|
|
313
|
+
const resolved = resolveNode(richText);
|
|
314
|
+
// Cast back to the config's RichText type
|
|
315
|
+
return { json: resolved };
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=resolver.js.map
|