@se-studio/contentful-rest-api 1.0.46 → 1.0.48

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.
Files changed (298) hide show
  1. package/CHANGELOG.md +424 -0
  2. package/dist/api/article-type.d.ts +37 -0
  3. package/dist/api/article-type.d.ts.map +1 -0
  4. package/dist/api/article-type.js +134 -0
  5. package/dist/api/article-type.js.map +1 -0
  6. package/dist/api/article.d.ts +32 -0
  7. package/dist/api/article.d.ts.map +1 -0
  8. package/dist/api/article.js +43 -0
  9. package/dist/api/article.js.map +1 -0
  10. package/dist/api/asset.d.ts +28 -0
  11. package/dist/api/asset.d.ts.map +1 -0
  12. package/dist/api/asset.js +55 -0
  13. package/dist/api/asset.js.map +1 -0
  14. package/dist/api/context.d.ts +24 -0
  15. package/dist/api/context.d.ts.map +1 -0
  16. package/dist/api/context.js +62 -0
  17. package/dist/api/context.js.map +1 -0
  18. package/dist/api/custom-type.d.ts +37 -0
  19. package/dist/api/custom-type.d.ts.map +1 -0
  20. package/dist/api/custom-type.js +44 -0
  21. package/dist/api/custom-type.js.map +1 -0
  22. package/dist/api/helpers.d.ts +73 -0
  23. package/dist/api/helpers.d.ts.map +1 -0
  24. package/dist/api/helpers.js +296 -0
  25. package/dist/api/helpers.js.map +1 -0
  26. package/dist/api/index.d.ts +22 -0
  27. package/dist/api/index.d.ts.map +1 -0
  28. package/dist/api/index.js +28 -0
  29. package/dist/api/index.js.map +1 -0
  30. package/dist/api/links.d.ts +109 -0
  31. package/dist/api/links.d.ts.map +1 -0
  32. package/dist/api/links.js +199 -0
  33. package/dist/api/links.js.map +1 -0
  34. package/dist/api/page.d.ts +33 -0
  35. package/dist/api/page.d.ts.map +1 -0
  36. package/dist/api/page.js +40 -0
  37. package/dist/api/page.js.map +1 -0
  38. package/dist/api/person.d.ts +37 -0
  39. package/dist/api/person.d.ts.map +1 -0
  40. package/dist/api/person.js +134 -0
  41. package/dist/api/person.js.map +1 -0
  42. package/dist/api/preview.d.ts +55 -0
  43. package/dist/api/preview.d.ts.map +1 -0
  44. package/dist/api/preview.js +160 -0
  45. package/dist/api/preview.js.map +1 -0
  46. package/dist/api/related-articles.d.ts +22 -0
  47. package/dist/api/related-articles.d.ts.map +1 -0
  48. package/dist/api/related-articles.js +82 -0
  49. package/dist/api/related-articles.js.map +1 -0
  50. package/dist/api/server-asset.d.ts +40 -0
  51. package/dist/api/server-asset.d.ts.map +1 -0
  52. package/dist/api/server-asset.js +65 -0
  53. package/dist/api/server-asset.js.map +1 -0
  54. package/dist/api/sitemap.d.ts +131 -0
  55. package/dist/api/sitemap.d.ts.map +1 -0
  56. package/dist/api/sitemap.js +199 -0
  57. package/dist/api/sitemap.js.map +1 -0
  58. package/dist/api/tag.d.ts +37 -0
  59. package/dist/api/tag.d.ts.map +1 -0
  60. package/dist/api/tag.js +131 -0
  61. package/dist/api/tag.js.map +1 -0
  62. package/dist/api/template.d.ts +49 -0
  63. package/dist/api/template.d.ts.map +1 -0
  64. package/dist/api/template.js +88 -0
  65. package/dist/api/template.js.map +1 -0
  66. package/dist/api/types.d.ts +98 -0
  67. package/dist/api/types.d.ts.map +1 -0
  68. package/dist/api/types.js +2 -0
  69. package/dist/api/types.js.map +1 -0
  70. package/dist/baseTypes/baseAlternatePageContent.d.ts +24 -0
  71. package/dist/baseTypes/baseAlternatePageContent.d.ts.map +1 -0
  72. package/dist/baseTypes/baseAlternatePageContent.js +2 -0
  73. package/dist/baseTypes/baseAlternatePageContent.js.map +1 -0
  74. package/dist/baseTypes/baseArticle.d.ts +179 -0
  75. package/dist/baseTypes/baseArticle.d.ts.map +1 -0
  76. package/dist/baseTypes/baseArticle.js +2 -0
  77. package/dist/baseTypes/baseArticle.js.map +1 -0
  78. package/dist/baseTypes/baseArticleType.d.ts +156 -0
  79. package/dist/baseTypes/baseArticleType.d.ts.map +1 -0
  80. package/dist/baseTypes/baseArticleType.js +2 -0
  81. package/dist/baseTypes/baseArticleType.js.map +1 -0
  82. package/dist/baseTypes/baseBanner.d.ts +76 -0
  83. package/dist/baseTypes/baseBanner.d.ts.map +1 -0
  84. package/dist/baseTypes/baseBanner.js +2 -0
  85. package/dist/baseTypes/baseBanner.js.map +1 -0
  86. package/dist/baseTypes/baseCollection.d.ts +132 -0
  87. package/dist/baseTypes/baseCollection.d.ts.map +1 -0
  88. package/dist/baseTypes/baseCollection.js +2 -0
  89. package/dist/baseTypes/baseCollection.js.map +1 -0
  90. package/dist/baseTypes/baseComponent.d.ts +130 -0
  91. package/dist/baseTypes/baseComponent.d.ts.map +1 -0
  92. package/dist/baseTypes/baseComponent.js +2 -0
  93. package/dist/baseTypes/baseComponent.js.map +1 -0
  94. package/dist/baseTypes/baseCustomType.d.ts +126 -0
  95. package/dist/baseTypes/baseCustomType.d.ts.map +1 -0
  96. package/dist/baseTypes/baseCustomType.js +2 -0
  97. package/dist/baseTypes/baseCustomType.js.map +1 -0
  98. package/dist/baseTypes/baseExternalComponent.d.ts +66 -0
  99. package/dist/baseTypes/baseExternalComponent.d.ts.map +1 -0
  100. package/dist/baseTypes/baseExternalComponent.js +2 -0
  101. package/dist/baseTypes/baseExternalComponent.js.map +1 -0
  102. package/dist/baseTypes/baseExternalVideo.d.ts +85 -0
  103. package/dist/baseTypes/baseExternalVideo.d.ts.map +1 -0
  104. package/dist/baseTypes/baseExternalVideo.js +2 -0
  105. package/dist/baseTypes/baseExternalVideo.js.map +1 -0
  106. package/dist/baseTypes/baseLink.d.ts +90 -0
  107. package/dist/baseTypes/baseLink.d.ts.map +1 -0
  108. package/dist/baseTypes/baseLink.js +2 -0
  109. package/dist/baseTypes/baseLink.js.map +1 -0
  110. package/dist/baseTypes/baseMedia.d.ts +92 -0
  111. package/dist/baseTypes/baseMedia.d.ts.map +1 -0
  112. package/dist/baseTypes/baseMedia.js +2 -0
  113. package/dist/baseTypes/baseMedia.js.map +1 -0
  114. package/dist/baseTypes/baseNavigation.d.ts +36 -0
  115. package/dist/baseTypes/baseNavigation.d.ts.map +1 -0
  116. package/dist/baseTypes/baseNavigation.js +2 -0
  117. package/dist/baseTypes/baseNavigation.js.map +1 -0
  118. package/dist/baseTypes/baseNavigationItem.d.ts +96 -0
  119. package/dist/baseTypes/baseNavigationItem.d.ts.map +1 -0
  120. package/dist/baseTypes/baseNavigationItem.js +2 -0
  121. package/dist/baseTypes/baseNavigationItem.js.map +1 -0
  122. package/dist/baseTypes/basePage.d.ts +120 -0
  123. package/dist/baseTypes/basePage.d.ts.map +1 -0
  124. package/dist/baseTypes/basePage.js +2 -0
  125. package/dist/baseTypes/basePage.js.map +1 -0
  126. package/dist/baseTypes/basePageTest.d.ts +66 -0
  127. package/dist/baseTypes/basePageTest.d.ts.map +1 -0
  128. package/dist/baseTypes/basePageTest.js +2 -0
  129. package/dist/baseTypes/basePageTest.js.map +1 -0
  130. package/dist/baseTypes/basePageVariant.d.ts +123 -0
  131. package/dist/baseTypes/basePageVariant.d.ts.map +1 -0
  132. package/dist/baseTypes/basePageVariant.js +2 -0
  133. package/dist/baseTypes/basePageVariant.js.map +1 -0
  134. package/dist/baseTypes/basePerson.d.ts +111 -0
  135. package/dist/baseTypes/basePerson.d.ts.map +1 -0
  136. package/dist/baseTypes/basePerson.js +2 -0
  137. package/dist/baseTypes/basePerson.js.map +1 -0
  138. package/dist/baseTypes/baseSchema.d.ts +18 -0
  139. package/dist/baseTypes/baseSchema.d.ts.map +1 -0
  140. package/dist/baseTypes/baseSchema.js +2 -0
  141. package/dist/baseTypes/baseSchema.js.map +1 -0
  142. package/dist/baseTypes/baseShared.d.ts +30 -0
  143. package/dist/baseTypes/baseShared.d.ts.map +1 -0
  144. package/dist/baseTypes/baseShared.js +2 -0
  145. package/dist/baseTypes/baseShared.js.map +1 -0
  146. package/dist/baseTypes/baseTag.d.ts +108 -0
  147. package/dist/baseTypes/baseTag.d.ts.map +1 -0
  148. package/dist/baseTypes/baseTag.js +2 -0
  149. package/dist/baseTypes/baseTag.js.map +1 -0
  150. package/dist/baseTypes/baseTagType.d.ts +11 -0
  151. package/dist/baseTypes/baseTagType.d.ts.map +1 -0
  152. package/dist/baseTypes/baseTagType.js +2 -0
  153. package/dist/baseTypes/baseTagType.js.map +1 -0
  154. package/dist/baseTypes/baseTemplate.d.ts +55 -0
  155. package/dist/baseTypes/baseTemplate.d.ts.map +1 -0
  156. package/dist/baseTypes/baseTemplate.js +2 -0
  157. package/dist/baseTypes/baseTemplate.js.map +1 -0
  158. package/dist/client.d.ts +143 -0
  159. package/dist/client.d.ts.map +1 -0
  160. package/dist/client.js +268 -0
  161. package/dist/client.js.map +1 -0
  162. package/dist/converters/article.d.ts +42 -0
  163. package/dist/converters/article.d.ts.map +1 -0
  164. package/dist/converters/article.js +220 -0
  165. package/dist/converters/article.js.map +1 -0
  166. package/dist/converters/asset.d.ts +22 -0
  167. package/dist/converters/asset.d.ts.map +1 -0
  168. package/dist/converters/asset.js +282 -0
  169. package/dist/converters/asset.js.map +1 -0
  170. package/dist/converters/collection.d.ts +26 -0
  171. package/dist/converters/collection.d.ts.map +1 -0
  172. package/dist/converters/collection.js +50 -0
  173. package/dist/converters/collection.js.map +1 -0
  174. package/dist/converters/component.d.ts +26 -0
  175. package/dist/converters/component.d.ts.map +1 -0
  176. package/dist/converters/component.js +54 -0
  177. package/dist/converters/component.js.map +1 -0
  178. package/dist/converters/customType.d.ts +24 -0
  179. package/dist/converters/customType.d.ts.map +1 -0
  180. package/dist/converters/customType.js +71 -0
  181. package/dist/converters/customType.js.map +1 -0
  182. package/dist/converters/externalComponent.d.ts +22 -0
  183. package/dist/converters/externalComponent.d.ts.map +1 -0
  184. package/dist/converters/externalComponent.js +34 -0
  185. package/dist/converters/externalComponent.js.map +1 -0
  186. package/dist/converters/helpers.d.ts +116 -0
  187. package/dist/converters/helpers.d.ts.map +1 -0
  188. package/dist/converters/helpers.js +128 -0
  189. package/dist/converters/helpers.js.map +1 -0
  190. package/dist/converters/iconCollector.d.ts +65 -0
  191. package/dist/converters/iconCollector.d.ts.map +1 -0
  192. package/dist/converters/iconCollector.js +282 -0
  193. package/dist/converters/iconCollector.js.map +1 -0
  194. package/dist/converters/index.d.ts +18 -0
  195. package/dist/converters/index.d.ts.map +1 -0
  196. package/dist/converters/index.js +18 -0
  197. package/dist/converters/index.js.map +1 -0
  198. package/dist/converters/link.d.ts +11 -0
  199. package/dist/converters/link.d.ts.map +1 -0
  200. package/dist/converters/link.js +96 -0
  201. package/dist/converters/link.js.map +1 -0
  202. package/dist/converters/navigationItem.d.ts +11 -0
  203. package/dist/converters/navigationItem.d.ts.map +1 -0
  204. package/dist/converters/navigationItem.js +73 -0
  205. package/dist/converters/navigationItem.js.map +1 -0
  206. package/dist/converters/page.d.ts +44 -0
  207. package/dist/converters/page.d.ts.map +1 -0
  208. package/dist/converters/page.js +121 -0
  209. package/dist/converters/page.js.map +1 -0
  210. package/dist/converters/person.d.ts +40 -0
  211. package/dist/converters/person.d.ts.map +1 -0
  212. package/dist/converters/person.js +109 -0
  213. package/dist/converters/person.js.map +1 -0
  214. package/dist/converters/resolver.d.ts +29 -0
  215. package/dist/converters/resolver.d.ts.map +1 -0
  216. package/dist/converters/resolver.js +317 -0
  217. package/dist/converters/resolver.js.map +1 -0
  218. package/dist/converters/schema.d.ts +14 -0
  219. package/dist/converters/schema.d.ts.map +1 -0
  220. package/dist/converters/schema.js +18 -0
  221. package/dist/converters/schema.js.map +1 -0
  222. package/dist/converters/svgProcessor.d.ts +23 -0
  223. package/dist/converters/svgProcessor.d.ts.map +1 -0
  224. package/dist/converters/svgProcessor.js +47 -0
  225. package/dist/converters/svgProcessor.js.map +1 -0
  226. package/dist/converters/tag.d.ts +25 -0
  227. package/dist/converters/tag.d.ts.map +1 -0
  228. package/dist/converters/tag.js +98 -0
  229. package/dist/converters/tag.js.map +1 -0
  230. package/dist/converters/template.d.ts +26 -0
  231. package/dist/converters/template.d.ts.map +1 -0
  232. package/dist/converters/template.js +44 -0
  233. package/dist/converters/template.js.map +1 -0
  234. package/dist/index.d.ts +28 -721
  235. package/dist/index.d.ts.map +1 -0
  236. package/dist/index.js +37 -3634
  237. package/dist/index.js.map +1 -1
  238. package/dist/revalidation/handlers.d.ts +52 -0
  239. package/dist/revalidation/handlers.d.ts.map +1 -0
  240. package/dist/revalidation/handlers.js +130 -0
  241. package/dist/revalidation/handlers.js.map +1 -0
  242. package/dist/revalidation/index.d.ts +3 -0
  243. package/dist/revalidation/index.d.ts.map +1 -0
  244. package/dist/revalidation/index.js +4 -0
  245. package/dist/revalidation/index.js.map +1 -0
  246. package/dist/revalidation/nextjs-route.d.ts +31 -0
  247. package/dist/revalidation/nextjs-route.d.ts.map +1 -0
  248. package/dist/revalidation/nextjs-route.js +34 -0
  249. package/dist/revalidation/nextjs-route.js.map +1 -0
  250. package/dist/revalidation/route.d.ts +3 -0
  251. package/dist/revalidation/route.d.ts.map +1 -0
  252. package/dist/revalidation/route.js +97 -0
  253. package/dist/revalidation/route.js.map +1 -0
  254. package/dist/revalidation/server-utils.d.ts +22 -0
  255. package/dist/revalidation/server-utils.d.ts.map +1 -0
  256. package/dist/revalidation/server-utils.js +41 -0
  257. package/dist/revalidation/server-utils.js.map +1 -0
  258. package/dist/revalidation/tags.d.ts +81 -0
  259. package/dist/revalidation/tags.d.ts.map +1 -0
  260. package/dist/revalidation/tags.js +117 -0
  261. package/dist/revalidation/tags.js.map +1 -0
  262. package/dist/revalidation/utils.d.ts +21 -0
  263. package/dist/revalidation/utils.d.ts.map +1 -0
  264. package/dist/revalidation/utils.js +51 -0
  265. package/dist/revalidation/utils.js.map +1 -0
  266. package/dist/server.d.ts +7 -0
  267. package/dist/server.d.ts.map +1 -0
  268. package/dist/server.js +10 -0
  269. package/dist/server.js.map +1 -0
  270. package/dist/types.d.ts +67 -0
  271. package/dist/types.d.ts.map +1 -0
  272. package/dist/types.js +2 -0
  273. package/dist/types.js.map +1 -0
  274. package/dist/utils/arrayUtils.d.ts +3 -0
  275. package/dist/utils/arrayUtils.d.ts.map +1 -0
  276. package/dist/utils/arrayUtils.js +12 -0
  277. package/dist/utils/arrayUtils.js.map +1 -0
  278. package/dist/utils/dateUtils.d.ts +9 -0
  279. package/dist/utils/dateUtils.d.ts.map +1 -0
  280. package/dist/utils/dateUtils.js +26 -0
  281. package/dist/utils/dateUtils.js.map +1 -0
  282. package/dist/utils/errors.d.ts +56 -0
  283. package/dist/utils/errors.d.ts.map +1 -0
  284. package/dist/utils/errors.js +100 -0
  285. package/dist/utils/errors.js.map +1 -0
  286. package/dist/utils/index.d.ts +8 -0
  287. package/dist/utils/index.d.ts.map +1 -0
  288. package/dist/utils/index.js +8 -0
  289. package/dist/utils/index.js.map +1 -0
  290. package/dist/utils/json-utils.d.ts +17 -0
  291. package/dist/utils/json-utils.d.ts.map +1 -0
  292. package/dist/utils/json-utils.js +43 -0
  293. package/dist/utils/json-utils.js.map +1 -0
  294. package/dist/utils/retry.d.ts +112 -0
  295. package/dist/utils/retry.d.ts.map +1 -0
  296. package/dist/utils/retry.js +221 -0
  297. package/dist/utils/retry.js.map +1 -0
  298. 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