@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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/revalidation/tags.ts","../src/revalidation/utils.ts","../src/utils/errors.ts","../src/utils/retry.ts","../src/client.ts","../src/converters/helpers.ts","../src/converters/asset.ts","../src/converters/svgProcessor.ts","../src/converters/iconCollector.ts","../src/api/helpers.ts","../src/utils/arrayUtils.ts","../src/utils/dateUtils.ts","../src/api/article.ts","../src/api/article-type.ts","../src/api/asset.ts","../src/converters/schema.ts","../src/converters/resolver.ts","../src/converters/navigationItem.ts","../src/converters/template.ts","../src/converters/article.ts","../src/converters/collection.ts","../src/converters/component.ts","../src/converters/customType.ts","../src/converters/externalComponent.ts","../src/converters/link.ts","../src/converters/page.ts","../src/converters/person.ts","../src/converters/tag.ts","../src/api/context.ts","../src/api/custom-type.ts","../src/api/links.ts","../src/api/page.ts","../src/api/person.ts","../src/api/preview.ts","../src/api/related-articles.ts","../src/api/sitemap.ts","../src/api/tag.ts","../src/api/template.ts","../src/revalidation/handlers.ts","../src/revalidation/route.ts","../src/revalidation/nextjs-route.ts","../src/revalidation/index.ts"],"names":["delay","sleep","getCacheTagsForProduction","success","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cache tag constants and utilities for Contentful revalidation\n */\n\n// Collection-level cache tags (used for sitemaps and lists)\nexport const PageTag = 'page';\nexport const ArticleTag = 'article';\nexport const ArticleTypeTag = 'articleType';\nexport const ArticleTypeIndexTag = 'articleTypeIndex';\nexport const CustomTypeTag = 'customType';\nexport const TagTag = 'tag';\nexport const PersonTag = 'person';\nexport const AssetTag = 'asset';\nexport const TemplateTag = 'template';\nexport const NavigationTag = 'navigation';\nexport const BannerTag = 'banner';\nexport const LocationTag = 'location';\n\n// Draft mode tag - used when DRAFT_ONLY=true\nexport const GlobalTag = 'global';\n\n/**\n * Individual page cache tag generator\n * @param slug - Page slug\n * @returns Cache tag for the page\n */\nexport function pageTag(slug: string): string {\n return `${PageTag}#${slug}`;\n}\n\n/**\n * Individual article cache tag generator\n * @param slug - Article slug\n * @returns Cache tag for the article\n */\nexport function articleTag(slug: string): string {\n return `${ArticleTag}#${slug}`;\n}\n\n/**\n * Individual article type cache tag generator\n * @param slug - Article type slug\n * @returns Cache tag for the article type\n */\nexport function articleTypeTag(slug: string): string {\n return `${ArticleTypeTag}#${slug}`;\n}\n\n/**\n * Individual article type index page cache tag generator\n * @param slug - Article type index page slug\n * @returns Cache tag for the article type index page\n */\nexport function articleTypeIndexTag(slug: string): string {\n return `${ArticleTypeTag}#index#${slug}`;\n}\n\n/**\n * Individual custom type cache tag generator\n * @param slug - Custom type slug\n * @returns Cache tag for the custom type\n */\nexport function customTypeTag(slug: string): string {\n return `${CustomTypeTag}#${slug}`;\n}\n\n/**\n * Individual tag cache tag generator\n * @param slug - Tag slug\n * @returns Cache tag for the tag\n */\nexport function tagTag(slug: string): string {\n return `${TagTag}#${slug}`;\n}\n\n/**\n * Individual person cache tag generator\n * @param slug - Person slug\n * @returns Cache tag for the person\n */\nexport function personTag(slug: string): string {\n return `${PersonTag}#${slug}`;\n}\n\n/**\n * Individual asset cache tag generator\n * @param assetId - Asset ID\n * @returns Cache tag for the asset\n */\nexport function assetTag(assetId: string): string {\n return `${AssetTag}#${assetId}`;\n}\n\n/**\n * Individual template cache tag generator\n * @param label - Template cmsLabel\n * @returns Cache tag for the template\n */\nexport function templateTag(label: string): string {\n return `${TemplateTag}#${label}`;\n}\n\n/**\n * Individual location cache tag generator\n * @param slug - Location slug\n * @returns Cache tag for the location\n */\nexport function locationTag(slug: string): string {\n return `${LocationTag}#${slug}`;\n}\n\n/**\n * All collection-level cache tags for global revalidation\n */\nexport const AllTags = [\n PageTag,\n ArticleTag,\n ArticleTypeTag,\n ArticleTypeIndexTag,\n CustomTypeTag,\n TagTag,\n PersonTag,\n AssetTag,\n TemplateTag,\n NavigationTag,\n BannerTag,\n LocationTag,\n 'hubspot-forms', // Additional tag from the old implementation\n];\n","import { revalidateTag } from 'next/cache';\nimport {\n ArticleTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeTag,\n assetTag,\n CustomTypeTag,\n customTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n tagTag,\n} from './tags';\n\n/**\n * Get cache tags for preview mode\n * @returns Array containing only the global tag\n */\nexport function getCacheTagsForPreview(): string[] {\n return [GlobalTag];\n}\n\n/**\n * Get cache tags for production mode based on content type and slug\n * @param contentType - The content type ('page', 'article', 'articleType', etc.)\n * @param slug - The slug/identifier for the content\n * @returns Array of cache tags including individual and collection tags\n */\nexport function getCacheTagsForProduction(contentType: string, slug?: string): string[] {\n switch (contentType) {\n case 'page':\n return slug ? [pageTag(slug), PageTag] : [PageTag];\n case 'article':\n return slug ? [articleTag(slug), ArticleTag] : [ArticleTag];\n case 'articleType':\n return slug ? [articleTypeTag(slug), ArticleTypeTag] : [ArticleTypeTag];\n case 'customType':\n return slug ? [customTypeTag(slug), CustomTypeTag] : [CustomTypeTag];\n case 'tag':\n return slug ? [tagTag(slug), TagTag] : [TagTag];\n case 'person':\n return slug ? [personTag(slug), PersonTag] : [PersonTag];\n case 'asset':\n return slug ? [assetTag(slug), AssetTag] : [AssetTag];\n case 'location':\n return slug ? [locationTag(slug), LocationTag] : [LocationTag];\n default:\n // For content types without individual tags, just return the collection tag\n return [contentType];\n }\n}\n\n/**\n * Get cache tags based on preview mode\n * @param contentType - The content type\n * @param slug - The slug/identifier for the content\n * @param preview - Whether to use preview mode\n * @returns Array of cache tags appropriate for the mode\n */\nexport function getCacheTags(\n contentType: string,\n slug?: string,\n preview: boolean = false,\n): string[] {\n if (preview) {\n return getCacheTagsForPreview();\n }\n return getCacheTagsForProduction(contentType, slug);\n}\n\n/**\n * Revalidates multiple Next.js cache tags.\n *\n * Adds a delay between revalidations to prevent overwhelming the cache system.\n * Use this when content changes affect multiple pages or entries.\n *\n * @param tags - Array of cache tags to revalidate\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateTags, pageTag, PageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page and all pages\n * await revalidateTags([pageTag('home'), PageTag], 'Page updated via webhook');\n * ```\n */\nexport async function revalidateTags(tags: string[], reason: string): Promise<void> {\n // Add a delay to prevent overwhelming the cache system\n await delay(500);\n\n for (const tag of tags) {\n console.log(`Revalidating tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n }\n}\n\n/**\n * Revalidates a single Next.js cache tag.\n *\n * Adds a delay before revalidation to prevent overwhelming the cache system.\n * Use this for targeted revalidation of specific content.\n *\n * @param tag - Cache tag to revalidate (e.g., 'page#home', 'article#my-post')\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateSingleTag, pageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page\n * await revalidateSingleTag(pageTag('home'), 'Home page updated');\n * ```\n */\nexport async function revalidateSingleTag(tag: string, reason: string): Promise<void> {\n await delay(500);\n console.log(`Revalidating single tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n}\n\n/**\n * Utility delay function\n * @param ms - Milliseconds to delay\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Custom error classes for Contentful API errors\n */\n\n/**\n * Base error class for all Contentful-related errors\n */\nexport class ContentfulError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ContentfulError';\n Object.setPrototypeOf(this, ContentfulError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitError extends ContentfulError {\n constructor(\n message: string,\n public readonly retryAfter?: number,\n details?: unknown,\n ) {\n super(message, 429, details);\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when entry is not found\n */\nexport class EntryNotFoundError extends ContentfulError {\n constructor(\n public readonly entryId: string,\n public readonly contentType?: string,\n ) {\n super(`Entry not found: ${entryId}${contentType ? ` (${contentType})` : ''}`, 404);\n this.name = 'EntryNotFoundError';\n Object.setPrototypeOf(this, EntryNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthenticationError extends ContentfulError {\n constructor(message = 'Authentication failed') {\n super(message, 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends ContentfulError {\n constructor(\n message: string,\n public readonly validationErrors?: unknown,\n ) {\n super(message, 400, validationErrors);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Checks if an error is a Contentful error\n */\nexport function isContentfulError(error: unknown): error is ContentfulError {\n return error instanceof ContentfulError;\n}\n\n/**\n * Checks if an error is a rate limit error\n */\nexport function isRateLimitError(error: unknown): error is RateLimitError {\n return error instanceof RateLimitError;\n}\n\n/**\n * Checks if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (isRateLimitError(error)) {\n return true;\n }\n\n if (isContentfulError(error)) {\n // Retry on 5xx errors and rate limits\n return error.statusCode !== undefined && (error.statusCode >= 500 || error.statusCode === 429);\n }\n\n return false;\n}\n\n/**\n * Extracts retry-after header value from error\n */\nexport function getRetryAfter(error: unknown): number | undefined {\n if (isRateLimitError(error)) {\n return error.retryAfter;\n }\n return undefined;\n}\n","import type { RetryConfig } from '../types';\nimport { getRetryAfter, isRetryableError } from './errors';\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 30000, // 30 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Sleep utility for async delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Calculates the delay for the next retry attempt using exponential backoff\n *\n * @param attempt - Current retry attempt (0-based)\n * @param config - Retry configuration\n * @param retryAfter - Optional retry-after value from rate limit response\n * @returns Delay in milliseconds\n */\nexport function calculateBackoffDelay(\n attempt: number,\n config: Required<RetryConfig>,\n retryAfter?: number,\n): number {\n // If server specified retry-after, use that\n if (retryAfter !== undefined) {\n return Math.min(retryAfter * 1000, config.maxDelay);\n }\n\n // Calculate exponential backoff\n const exponentialDelay = config.initialDelay * config.backoffMultiplier ** attempt;\n\n // Add jitter (random value between 0 and delay) to prevent thundering herd\n const jitter = Math.random() * exponentialDelay;\n\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n}\n\n/**\n * Executes a function with retry logic\n *\n * @param fn - Async function to execute\n * @param config - Retry configuration\n * @returns Promise resolving to the function result\n *\n * @example\n * ```ts\n * const result = await withRetry(\n * async () => await client.getEntry('id'),\n * { maxRetries: 3, initialDelay: 1000 }\n * );\n * ```\n */\nexport async function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T> {\n const retryConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if it's the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Only retry if the error is retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n const retryAfter = getRetryAfter(error);\n const delay = calculateBackoffDelay(attempt, retryConfig, retryAfter);\n\n // Only log in development mode\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production') {\n console.warn(\n `Retry attempt ${attempt + 1}/${retryConfig.maxRetries} after ${delay}ms`,\n error,\n );\n }\n\n await sleep(delay);\n }\n }\n\n // If we get here, all retries failed\n throw lastError;\n}\n\n/**\n * Queue entry for pending requests\n */\ninterface QueueEntry {\n resolve: () => void;\n}\n\n/**\n * Interval-based rate limiter that enforces minimum time between requests.\n * Unlike token bucket, this prevents bursts entirely by spacing requests evenly.\n * Requests are processed in FIFO order with guaranteed minimum intervals.\n *\n * @example\n * ```ts\n * const limiter = new RateLimiter(14); // 14 req/s = ~71ms between requests\n * await limiter.acquire(); // Wait for permission to make request\n * await fetch(...);\n * ```\n */\nexport class RateLimiter {\n /** Minimum interval between requests in milliseconds */\n private readonly intervalMs: number;\n /** Timestamp when the next request can be made */\n private nextAvailableTime: number = 0;\n /** Queue of pending requests */\n private readonly queue: QueueEntry[] = [];\n /** Whether the queue processor is running */\n private processing = false;\n /** Additional pause time from 429 responses (ms) */\n private pauseUntil: number = 0;\n\n constructor(\n requestsPerSecond: number,\n /** @deprecated Use single parameter - kept for backward compatibility */\n _refillRate?: number,\n ) {\n // Calculate minimum interval between requests\n // Use 80% of theoretical max to leave headroom\n this.intervalMs = Math.ceil(1000 / (requestsPerSecond * 0.8));\n }\n\n /**\n * Calculates how long to wait before the next request can be made\n */\n private getWaitTime(): number {\n const now = Date.now();\n const waitForInterval = Math.max(0, this.nextAvailableTime - now);\n const waitForPause = Math.max(0, this.pauseUntil - now);\n return Math.max(waitForInterval, waitForPause);\n }\n\n /**\n * Processes the queue, releasing requests one at a time with proper spacing\n */\n private async processQueue(): Promise<void> {\n if (this.processing) {\n return;\n }\n\n this.processing = true;\n\n while (this.queue.length > 0) {\n const waitTime = this.getWaitTime();\n\n if (waitTime > 0) {\n await sleep(waitTime);\n }\n\n // Update next available time BEFORE releasing the request\n this.nextAvailableTime = Date.now() + this.intervalMs;\n\n // Release the next queued request\n const entry = this.queue.shift();\n entry?.resolve();\n }\n\n this.processing = false;\n }\n\n /**\n * Acquires permission to make a request.\n * Returns a promise that resolves when the request can proceed.\n * Requests are processed in FIFO order with minimum interval spacing.\n *\n * @returns Promise that resolves when rate limit allows the request\n */\n async acquire(): Promise<void> {\n const waitTime = this.getWaitTime();\n\n // If no wait needed and no queue, proceed immediately\n if (waitTime === 0 && this.queue.length === 0) {\n this.nextAvailableTime = Date.now() + this.intervalMs;\n return;\n }\n\n // Otherwise, queue the request\n return new Promise<void>((resolve) => {\n this.queue.push({ resolve });\n this.processQueue();\n });\n }\n\n /**\n * Gets the number of requests currently waiting in the queue\n */\n getQueueLength(): number {\n return this.queue.length;\n }\n\n /**\n * Pauses the rate limiter for a specified duration.\n * All requests (current and queued) will wait until pause expires.\n * Does NOT block - just sets the pause time and returns.\n *\n * @param seconds - Duration to pause in seconds\n */\n pause(seconds: number): void {\n const pauseUntil = Date.now() + seconds * 1000;\n // Only extend pause, never shorten it\n if (pauseUntil > this.pauseUntil) {\n this.pauseUntil = pauseUntil;\n }\n }\n\n /**\n * Gets the current interval between requests in milliseconds\n */\n getIntervalMs(): number {\n return this.intervalMs;\n }\n}\n\n// ============================================================================\n// Shared Rate Limiter Instances\n// ============================================================================\n\n/**\n * Rate limits for Contentful APIs (requests per second)\n */\nexport const CONTENTFUL_RATE_LIMITS = {\n /** Content Delivery API: 55 requests/second */\n delivery: 55,\n /** Content Preview API: 14 requests/second */\n preview: 14,\n} as const;\n\n/**\n * Shared rate limiter for Contentful Delivery API (55 req/s)\n * Module-level singleton shared across all client instances\n */\nexport const deliveryRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.delivery);\n\n/**\n * Shared rate limiter for Contentful Preview API (14 req/s)\n * Module-level singleton shared across all client instances\n */\nexport const previewRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.preview);\n\n/**\n * Gets the appropriate rate limiter based on preview mode\n *\n * @param preview - Whether using preview API\n * @returns The appropriate rate limiter instance\n */\nexport function getRateLimiter(preview: boolean): RateLimiter {\n return preview ? previewRateLimiter : deliveryRateLimiter;\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: Any ok for now! */\nimport type { ContentfulConfig, FetchOptions } from './types';\nimport {\n AuthenticationError,\n ContentfulError,\n EntryNotFoundError,\n RateLimitError,\n ValidationError,\n} from './utils/errors';\nimport { calculateBackoffDelay, getRateLimiter, type RateLimiter } from './utils/retry';\n\n/**\n * Contentful REST API response structure\n * The items array contains Entry objects when T is an EntrySkeletonType\n */\nexport interface ContentfulResponse<T = any> {\n sys: {\n type: 'Array';\n };\n total: number;\n skip: number;\n limit: number;\n items: T extends import('contentful').EntrySkeletonType\n ? Array<import('contentful').Entry<T, 'WITHOUT_LINK_RESOLUTION', string>>\n : T[];\n includes?: {\n Entry?: any[];\n Asset?: any[];\n };\n}\n\n/**\n * Contentful Asset fields structure\n */\nexport interface ContentfulAssetFields {\n title?: string;\n description?: string;\n file?: {\n url: string;\n fileName: string;\n contentType: string;\n details?: {\n size?: number;\n image?: {\n width: number;\n height: number;\n };\n };\n };\n}\n\n/**\n * Contentful Asset API response structure\n */\nexport interface ContentfulAssetResponse {\n sys: {\n id: string;\n type: 'Asset';\n createdAt: string;\n updatedAt: string;\n };\n fields: ContentfulAssetFields;\n}\n\n/**\n * Query parameters for Contentful API\n */\nexport interface ContentfulQuery {\n content_type?: string;\n locale?: string;\n include?: number;\n limit?: number;\n skip?: number;\n [key: string]: any;\n}\n\n/**\n * Builds query string from query parameters\n */\nfunction buildQueryString(query: ContentfulQuery): string {\n const params = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, String(value));\n }\n });\n\n return params.toString();\n}\n\n/**\n * Sleep utility for async delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry configuration for 429 error handling in getEntries\n */\nconst RETRY_CONFIG = {\n maxRetries: 10,\n initialDelay: 1000,\n maxDelay: 15000,\n backoffMultiplier: 2,\n} as const;\n\n/**\n * Parses retry-after header from response\n *\n * @param response - Fetch response object\n * @returns Retry-after value in seconds, or undefined if not present\n */\nfunction parseRetryAfter(response: Response): number | undefined {\n const retryAfterHeader =\n response.headers.get('X-Contentful-RateLimit-Reset') || response.headers.get('Retry-After');\n if (retryAfterHeader) {\n const parsed = Number.parseInt(retryAfterHeader, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\n/**\n * Parses error response from Contentful API\n */\nasync function parseErrorResponse(response: Response): Promise<ContentfulError> {\n const statusCode = response.status;\n let errorData: any;\n\n try {\n errorData = await response.json();\n } catch {\n errorData = { message: response.statusText };\n }\n\n const message = errorData?.message || `Contentful API error: ${statusCode}`;\n\n switch (statusCode) {\n case 401:\n return new AuthenticationError(message);\n\n case 404:\n return new EntryNotFoundError(\n errorData?.sys?.id || 'unknown',\n errorData?.sys?.contentType?.sys?.id,\n );\n\n case 429: {\n // Parse retry-after header (in seconds)\n const retryAfterHeader =\n response.headers.get('X-Contentful-RateLimit-Reset') || response.headers.get('Retry-After');\n const retryAfter = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : undefined;\n return new RateLimitError(message, retryAfter, errorData);\n }\n\n case 400:\n return new ValidationError(message, errorData);\n\n default:\n return new ContentfulError(message, statusCode, errorData);\n }\n}\n\ntype NextRequestInit = RequestInit & {\n next?: {\n revalidate?: number | false;\n tags?: string[];\n };\n};\n\n/**\n * Fetch-based Contentful client that participates in Next.js caching.\n * Includes proactive rate limiting and automatic retry on 429 errors.\n */\nexport class ContentfulFetchClient {\n private readonly baseUrl: string;\n private readonly accessToken: string;\n private readonly rateLimiter: RateLimiter;\n private readonly isPreview: boolean;\n\n constructor(config: ContentfulConfig, preview = false) {\n const host = config.host || (preview ? 'preview.contentful.com' : 'cdn.contentful.com');\n const environment = config.environment || 'master';\n\n this.baseUrl = `https://${host}/spaces/${config.spaceId}/environments/${environment}`;\n this.accessToken = config.accessToken;\n this.isPreview = preview;\n this.rateLimiter = getRateLimiter(preview);\n }\n\n /**\n * Fetches entries from Contentful with proactive rate limiting\n * and automatic retry on rate limit errors.\n *\n * Rate limits are applied proactively:\n * - Preview API: 14 requests/second\n * - Delivery API: 55 requests/second\n *\n * If a 429 is still received (e.g., due to other processes), retries with backoff.\n */\n async getEntries<T = any>(\n query: ContentfulQuery,\n options?: FetchOptions,\n ): Promise<ContentfulResponse<T>> {\n const queryString = buildQueryString(query);\n const url = `${this.baseUrl}/entries?${queryString}`;\n\n const fetchOptions: NextRequestInit = {\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n };\n\n // Add Next.js cache configuration if provided\n if (options?.next) {\n fetchOptions.next = options.next;\n }\n\n for (let attempt = 0; attempt <= RETRY_CONFIG.maxRetries; attempt++) {\n try {\n // Wait for rate limiter before making request\n await this.rateLimiter.acquire();\n\n const response = await fetch(url, fetchOptions);\n\n if (response.ok) {\n return response.json() as Promise<ContentfulResponse<T>>;\n }\n\n // Handle rate limiting (429) with automatic retry\n if (response.status === 429 && attempt < RETRY_CONFIG.maxRetries) {\n const retryAfter = parseRetryAfter(response);\n const delay = calculateBackoffDelay(attempt, RETRY_CONFIG, retryAfter);\n\n console.warn(\n `[Contentful] Rate limited (429), retrying in ${delay}ms (attempt ${attempt + 1}/${RETRY_CONFIG.maxRetries}). ` +\n `Queue: ${this.rateLimiter.getQueueLength()} waiting. ` +\n `API: ${this.isPreview ? 'preview' : 'delivery'}`,\n );\n\n // Pause the rate limiter - this affects all queued requests\n // Use the longer of retryAfter or 2 seconds as minimum pause\n const pauseSeconds = Math.max(retryAfter ?? 2, 2);\n this.rateLimiter.pause(pauseSeconds);\n\n // Wait before retrying this request\n await sleep(delay);\n continue;\n }\n\n // For non-429 errors or final retry attempt, throw the error\n throw await parseErrorResponse(response);\n } catch (error) {\n if (error instanceof ContentfulError) {\n throw error;\n }\n console.error('[Contentful] Unexpected error in request', error);\n throw new ContentfulError('Unexpected error in request', 500);\n }\n }\n\n // This should never be reached due to the throw in the loop,\n // but TypeScript needs it for type safety\n throw new ContentfulError('Max retries exceeded', 500);\n }\n\n /**\n * Fetches a single asset from Contentful by ID with proactive rate limiting\n * and automatic retry on rate limit errors.\n *\n * @param assetId - The Contentful asset ID\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns The asset response or null if not found\n */\n async getAsset(assetId: string, options?: FetchOptions): Promise<ContentfulAssetResponse | null> {\n const url = `${this.baseUrl}/assets/${assetId}`;\n\n const fetchOptions: NextRequestInit = {\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n };\n\n // Add Next.js cache configuration if provided\n if (options?.next) {\n fetchOptions.next = options.next;\n }\n\n for (let attempt = 0; attempt <= RETRY_CONFIG.maxRetries; attempt++) {\n try {\n // Wait for rate limiter before making request\n await this.rateLimiter.acquire();\n\n const response = await fetch(url, fetchOptions);\n\n if (response.ok) {\n return response.json() as Promise<ContentfulAssetResponse>;\n }\n\n // Return null for 404 (asset not found)\n if (response.status === 404) {\n return null;\n }\n\n // Handle rate limiting (429) with automatic retry\n if (response.status === 429 && attempt < RETRY_CONFIG.maxRetries) {\n const retryAfter = parseRetryAfter(response);\n const delay = calculateBackoffDelay(attempt, RETRY_CONFIG, retryAfter);\n\n console.warn(\n `[Contentful] Rate limited (429), retrying in ${delay}ms (attempt ${attempt + 1}/${RETRY_CONFIG.maxRetries}). ` +\n `Queue: ${this.rateLimiter.getQueueLength()} waiting. ` +\n `API: ${this.isPreview ? 'preview' : 'delivery'}`,\n );\n\n // Pause the rate limiter - this affects all queued requests\n const pauseSeconds = Math.max(retryAfter ?? 2, 2);\n this.rateLimiter.pause(pauseSeconds);\n\n // Wait before retrying this request\n await sleep(delay);\n continue;\n }\n\n // For non-429 errors or final retry attempt, throw the error\n throw await parseErrorResponse(response);\n } catch (error) {\n if (error instanceof ContentfulError) {\n throw error;\n }\n console.error('[Contentful] Unexpected error in asset request', error);\n throw new ContentfulError('Unexpected error in asset request', 500);\n }\n }\n\n throw new ContentfulError('Max retries exceeded', 500);\n }\n}\n\n/**\n * Creates a Contentful Content Delivery API (CDA) client\n *\n * @param config - Configuration object for the Contentful client\n * @returns Contentful CDA client instance\n *\n * @example\n * ```ts\n * const client = createContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, false);\n}\n\n/**\n * Creates a Contentful Content Preview API (CPA) client\n *\n * @param config - Configuration object for the Contentful preview client\n * @returns Contentful CPA client instance\n *\n * @example\n * ```ts\n * const previewClient = createContentfulPreviewClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulPreviewClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, true);\n}\n\n/**\n * Gets the appropriate Contentful client based on preview mode\n *\n * @param config - Configuration for the Contentful client\n * @param preview - Whether to use the preview API\n * @returns Contentful client instance (CDA or CPA)\n *\n * @example\n * ```ts\n * const client = getContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: preview\n * ? process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!\n * : process.env.CONTENTFUL_ACCESS_TOKEN!,\n * }, preview);\n * ```\n */\nexport function getContentfulClient(\n config: ContentfulConfig,\n preview: boolean,\n): ContentfulFetchClient {\n return preview ? createContentfulPreviewClient(config) : createContentfulClient(config);\n}\n","import type {\n IDownloadAsset,\n IInternalLink,\n InternalType,\n ITyped,\n IVisual,\n} from '@se-studio/core-data-types';\nimport type { Asset, Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier, PossibleResolvedEntry } from '../api';\nimport type { BaseContent, BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport type { baseArticleConverter, baseArticleTypeConverter } from './article';\nimport type { baseCollectionConverter } from './collection';\nimport type { baseComponentConverter } from './component';\nimport type { baseCustomTypeConverter } from './customType';\nimport type { baseNavigationItemConverter } from './navigationItem';\nimport type { basePageConverter } from './page';\nimport type { baseTagConverter } from './tag';\n\nexport function resolveBuildYear(value: string) {\n const buildYear = new Date().getFullYear();\n return value.replaceAll('#buildYear#', buildYear.toString());\n}\nexport function makeContentfulTitle(\n title: string | undefined | null,\n id: string,\n prefix = 'Title for ',\n) {\n return title ?? `${prefix}${id}`;\n}\n\nexport function stringOrUndefined(value: string | null | undefined) {\n if (value && value.length > 0) {\n return value;\n }\n return undefined;\n}\nexport function makeContentfulDescription(description: string | undefined | null, id: string) {\n return description ?? `Description for ${id}`;\n}\n\nexport function lookupAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined) {\n if (!asset) return undefined;\n return context.assets.get(asset.sys.id);\n}\n\n/**\n * Looks up an asset that is used as an icon.\n * If the asset is an SVG image, it marks it with isIcon: true so it uses the sprite system.\n */\nexport function lookupIconAsset(\n context: ConverterContext,\n asset: UnresolvedLink<'Asset'> | undefined,\n): IVisual | undefined {\n const visual = lookupAsset(context, asset);\n if (!visual) return undefined;\n\n // Mark SVG images as icons\n if (visual.image?.type === 'Svg image') {\n return {\n ...visual,\n image: {\n ...visual.image,\n isIcon: true,\n },\n };\n }\n\n return visual;\n}\n\n/**\n * Looks up a raw asset and converts it to IDownloadAsset for download functionality.\n * Returns undefined if the asset doesn't exist or doesn't have a valid file.\n */\nexport function lookupDownloadAsset(\n context: ConverterContext,\n asset: UnresolvedLink<'Asset'> | undefined,\n): IDownloadAsset | undefined {\n if (!asset) return undefined;\n\n const rawAsset = context.rawAssets.get(asset.sys.id);\n if (!rawAsset?.fields?.file) return undefined;\n\n // Cast to AssetFile since we're working with resolved assets without link resolution\n const file = rawAsset.fields.file as {\n url?: string;\n fileName?: string;\n contentType?: string;\n details?: { size?: number };\n };\n if (!file.url || !file.fileName || !file.contentType) return undefined;\n\n return {\n assetId: rawAsset.sys.id,\n filename: file.fileName,\n contentType: file.contentType,\n size: file.details?.size,\n url: `https:${file.url}`,\n };\n}\n\n/**\n * Default positioning fields for content items before they are processed\n */\nexport const DEFAULT_POSITION_FIELDS = {\n index: 0,\n isFirst: false,\n isLast: false,\n indexOfType: 0,\n} as const;\n\n/**\n * Creates an internal link object with common fields\n * Used by multiple converters (tag, page, article, person) to reduce duplication\n */\nexport function createInternalLink(\n id: string,\n fields: {\n cmsLabel?: string | null;\n name: string | null;\n useName?: boolean | null;\n title?: string | null;\n featuredImage?: UnresolvedLink<'Asset'>;\n backgroundColour?: string | null;\n textColour?: string | null;\n indexed?: boolean | null;\n hidden?: boolean | null;\n slug: string;\n description?: string | null;\n },\n context: ConverterContext,\n href: string,\n internalType: InternalType,\n // biome-ignore lint/suspicious/noExplicitAny: Used for expanding\n additionalProps?: any,\n): IInternalLink {\n const {\n cmsLabel,\n title,\n name,\n useName,\n featuredImage,\n backgroundColour,\n textColour,\n indexed,\n hidden,\n slug,\n description,\n } = fields;\n\n const text = makeContentfulTitle(title, id);\n return {\n type: 'Internal link',\n internalType,\n id,\n name: name ?? cmsLabel ?? '',\n useName,\n text,\n visual: lookupAsset(context, featuredImage),\n backgroundColour,\n textColour,\n indexed,\n hidden,\n slug,\n href,\n title,\n description,\n ...additionalProps,\n };\n}\n\nexport type ContentResolverFunction = (\n context: ConverterContext,\n entry: Entry<BaseContent, DefaultChainModifier, string>,\n) => unknown; // PageContent\nexport type ContentResolverMap = Map<string, ContentResolverFunction>;\nexport type LinkResolverFunction<TResult extends IInternalLink = IInternalLink> = (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n) => TResult;\nexport type LinkResolverMap = Map<string, LinkResolverFunction>;\n\n/**\n * URL calculators for each content type.\n * Apps can override these to customize URL patterns.\n */\nexport type UrlCalculators = {\n page: (slug: string) => string;\n pageVariant: (slug: string) => string;\n article: (articleTypeSlug: string, slug: string, primaryTagSlug?: string) => string;\n articleType: (slug: string) => string;\n tag: (slug: string) => string;\n person: (slug: string) => string;\n customType: (slug: string) => string;\n};\n\nexport type BaseConverterContext = {\n videoPrefix: string;\n /**\n * Resolves a mask dropdown value (e.g., 'Rounded diamond') to a URL.\n * Each project provides its own implementation with project-specific masks.\n */\n maskResolver?: (maskName: string) => string | undefined;\n /**\n * URL calculators for each content type.\n * Apps can override these to customize URL patterns for links, sitemaps, and preview.\n */\n urlCalculators: UrlCalculators;\n linkResolver: LinkResolverMap;\n contentResolver: Map<\n string,\n (context: ConverterContext, entry: Entry<BaseContent, DefaultChainModifier, string>) => unknown\n >;\n navigationItemResolver: typeof baseNavigationItemConverter;\n pageResolver: typeof basePageConverter;\n articleResolver: typeof baseArticleConverter;\n articleTypeResolver: typeof baseArticleTypeConverter;\n tagResolver: typeof baseTagConverter;\n personResolver: typeof import('./person').basePersonConverter;\n customTypeResolver: typeof baseCustomTypeConverter;\n componentResolver: typeof baseComponentConverter;\n collectionResolver: typeof baseCollectionConverter;\n};\n\nexport type ConverterContext = BaseConverterContext & {\n includes: Map<string, PossibleResolvedEntry>;\n assets: Map<string, IVisual>;\n rawAssets: Map<string, Asset>;\n errors: CmsError[];\n};\n\n/**\n * Adds position metadata to an array of content items\n * Each item gets: index, isFirst, isLast, indexOfType\n *\n * @param items - Array of content items to add metadata to\n * @returns New array with position metadata added to each item\n */\nexport function addPositionMetadata<\n T extends {\n type: string;\n index?: number;\n isFirst?: boolean;\n isLast?: boolean;\n indexOfType?: number;\n },\n>(items: T[]): T[] {\n if (items.length === 0) return items;\n\n // Count items by type for indexOfType calculation\n const typeCount = new Map<string, number>();\n\n return items.map((item, index) => {\n const currentTypeIndex = typeCount.get(item.type) ?? 0;\n typeCount.set(item.type, currentTypeIndex + 1);\n\n return {\n ...item,\n index,\n isFirst: index === 0,\n isLast: index === items.length - 1,\n indexOfType: currentTypeIndex,\n };\n });\n}\n\nexport function calculateContentCount(...contents: ITyped[][]): number {\n return contents.reduce((acc, content) => acc + content.length, 0);\n}\n","import type {\n IAnimation,\n IImage,\n IPicture,\n IResponsiveVisual,\n ISvgImage,\n IVideo,\n IVideoDetails,\n IVisual,\n} from '@se-studio/core-data-types';\nimport type { Asset, AssetFields, AssetFile, AssetSys, Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseConverterContext, ConverterContext } from './helpers';\nimport {\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n stringOrUndefined,\n} from './helpers';\n\nexport function convertAssetToVisual(\n context: BaseConverterContext,\n asset?: Asset<DefaultChainModifier, string>,\n options?: Partial<IImage> | Partial<IVideo> | Partial<IAnimation>,\n): IVisual | undefined {\n if (!asset) return undefined;\n const { fields, sys } = asset;\n if (!fields) return undefined;\n const { id } = sys;\n const { file } = fields as AssetFields;\n if (!file) return undefined;\n const { contentType } = file;\n\n if (contentType?.startsWith('image/')) {\n const image = convertAssetToImage(file, fields as AssetFields, sys, options as Partial<IImage>);\n if (!image) return undefined;\n return {\n id,\n type: 'Visual',\n image,\n };\n }\n\n if (contentType?.startsWith('video/')) {\n const video = convertAssetToVideo(\n file,\n fields as AssetFields,\n sys,\n context,\n options as Partial<IVideo>,\n );\n if (!video) return undefined;\n return {\n id,\n type: 'Visual',\n video,\n };\n }\n\n if (contentType === 'application/json') {\n const animation = convertAssetToAnimation(\n file,\n fields as AssetFields,\n sys,\n options as Partial<IAnimation>,\n );\n if (!animation) return undefined;\n return {\n id,\n type: 'Visual',\n animation,\n };\n }\n return undefined;\n}\n\nfunction convertAssetToAnimation(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IAnimation, 'id' | 'type'>>,\n): IAnimation | undefined {\n const { id } = sys;\n const { title, description } = fields;\n const { url } = file;\n if (!url) return undefined;\n\n return {\n ...options,\n id,\n type: 'Animation',\n animationSrc: `https:${url}`,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IImage | undefined {\n const { contentType } = file;\n if (contentType === 'image/svg+xml') {\n return convertAssetToSvgImage(file, fields, sys, options);\n } else {\n return convertAssetToPicture(file, fields, sys, options);\n }\n}\n\nfunction convertAssetToPicture(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IPicture | undefined {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n if (!details) return undefined;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Picture',\n src: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nfunction convertAssetToSvgImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): ISvgImage | undefined {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n if (!details) return undefined;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Svg image',\n svgSrc: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToVideoDetails(file: AssetFile, sys: AssetSys): IVideoDetails | undefined {\n const { id } = sys;\n const { details, url, contentType, fileName } = file;\n if (!details) return undefined;\n const { size } = details;\n return {\n id,\n videoUrl: `https:${url}`,\n size,\n mimeType: contentType,\n fileName,\n };\n}\n\nfunction convertAssetToVideo(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n context: BaseConverterContext,\n options: Partial<Omit<IVideo, 'id' | 'type'>>,\n): IVideo | undefined {\n const { id } = sys;\n const { title, description } = fields;\n const { details } = file;\n if (!details) {\n return undefined;\n }\n const { image } = details;\n const { width, height } = image || {};\n\n const videoDetails = convertAssetToVideoDetails(file, sys);\n if (!videoDetails) return undefined;\n return {\n ...options,\n id,\n type: 'Local video',\n preview: videoDetails,\n videoPrefix: context.videoPrefix,\n\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nexport function createResponsiveVisual(\n visual: IVisual | undefined,\n mobileVisual: IVisual | undefined,\n customSize?: number | null,\n): IResponsiveVisual | undefined {\n if (!visual) return undefined;\n return {\n visual,\n mobileVisual,\n visualCustomSize: customSize,\n };\n}\n\n/**\n * Converts a baseMedia entry to IVisual by looking up the asset and merging metadata.\n * Resolves mask from either maskImage asset or mask dropdown via project's maskResolver.\n */\nexport function convertMediaEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields) return undefined;\n\n // Lookup the asset from context\n const baseVisual = lookupAsset(context, fields.asset);\n if (!baseVisual) return undefined;\n\n // Destructure mask fields separately so they don't go into metadata\n const { name, mask: maskDropdown, maskImage, ...otherFields } = fields;\n\n // Resolve mask: custom maskImage takes precedence over dropdown\n let mask: string | undefined;\n if (maskImage) {\n // Custom SVG mask from asset\n const maskVisual = lookupAsset(context, maskImage);\n if (maskVisual?.image?.type === 'Svg image') {\n mask = maskVisual.image.svgSrc;\n } else if (maskVisual?.image?.type === 'Picture') {\n mask = maskVisual.image.src;\n }\n } else if (maskDropdown && context.maskResolver) {\n // Predefined mask from dropdown\n mask = context.maskResolver(maskDropdown);\n }\n\n // Extract metadata from the media entry\n const metadata = {\n name: makeContentfulTitle(name, sys.id),\n ...otherFields,\n };\n\n // Merge metadata into the image or video\n const visual: IVisual = {\n ...baseVisual,\n id: sys.id,\n mask,\n };\n\n if (baseVisual.image) {\n visual.image = {\n ...baseVisual.image,\n ...metadata,\n };\n } else if (baseVisual.video) {\n visual.video = {\n ...baseVisual.video,\n ...metadata,\n };\n } else if (baseVisual.animation) {\n visual.animation = {\n ...baseVisual.animation,\n ...metadata,\n };\n }\n\n return visual;\n}\n\n/**\n * Converts a baseExternalVideo entry to IVisual with external video\n */\nexport function convertExternalVideoEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields || !fields.url) return undefined;\n\n // Lookup optional preview and poster assets\n const previewVisual = lookupAsset(context, fields.preview);\n const posterVisual = lookupAsset(context, fields.posterImage);\n\n // Extract preview IVideoDetails if available\n const preview =\n previewVisual?.video?.type === 'Local video' ? previewVisual.video.preview : undefined;\n\n // Extract poster URL if available\n const poster = posterVisual?.image?.type === 'Picture' ? posterVisual.image.src : undefined;\n\n // Map Contentful's \"Center\" to our \"Middle\" type\n const mapHorizontal = (\n value: 'Left' | 'Center' | 'Right' | undefined,\n ): 'Left' | 'Middle' | 'Right' | null => {\n if (!value) return null;\n return value === 'Center' ? 'Middle' : value;\n };\n\n const video: IVideo = {\n id: sys.id,\n type: 'External video',\n name: makeContentfulTitle(fields.name, sys.id),\n nameAsCaption: fields.nameAsCaption ?? null,\n external: fields.url,\n preview,\n poster,\n autoPlay: fields.autoPlay ?? null,\n loop: fields.loop ?? null,\n hideControls: fields.hideControls ?? null,\n dontCrop: fields.dontCrop ?? null,\n verticalCropPosition: fields.verticalCropPosition ?? null,\n horizontalCropPosition: mapHorizontal(fields.horizontalCropPosition),\n horizontalPosition: fields.horizontalPosition ?? null,\n widthPercent: fields.width ?? null,\n };\n\n return {\n id: sys.id,\n type: 'Visual',\n video,\n };\n}\n\n/**\n * Looks up and converts a media or external video entry from an unresolved link\n */\nexport function lookupMediaEntry(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'> | undefined,\n): IVisual | undefined {\n if (!link) return undefined;\n\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n return undefined;\n }\n\n const { type, entry } = possibleEntry;\n\n if (type === 'media') {\n return convertMediaEntryToVisual(\n context,\n entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n }\n\n if (type === 'externalVideo') {\n return convertExternalVideoEntryToVisual(\n context,\n entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n }\n\n return undefined;\n}\n","/**\n * SVG processing utilities for icon sprite generation.\n * These functions fetch and process SVG content during data conversion.\n */\n\n/**\n * Fetches SVG content from a URL.\n * Uses the parent request's cache tags (page-level) for revalidation.\n *\n * @param url - The URL to fetch the SVG from\n * @returns The SVG content as a string\n * @throws Error if the fetch fails\n */\nexport async function fetchSvgContent(url: string): Promise<string> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch SVG from ${url}: ${response.statusText}`);\n }\n return await response.text();\n}\n\n/**\n * Processes SVG content for use in a sprite sheet.\n * Extracts the SVG content and wraps it in a symbol element.\n *\n * @param svgContent - The raw SVG content\n * @param iconId - Unique identifier for the icon\n * @returns Processed SVG symbol element as a string\n */\nexport function processSvgForSprite(svgContent: string, iconId: string): string {\n // Parse the SVG to extract viewBox and content\n // Handle optional spaces around equals sign\n const viewBoxMatch = svgContent.match(/viewBox\\s*=\\s*[\"']([^\"']+)[\"']/i);\n const viewBox = viewBoxMatch ? viewBoxMatch[1] : '0 0 24 24';\n\n // Extract the inner content of the SVG (everything between <svg> tags)\n // Remove the opening <svg> tag and closing </svg> tag\n const innerContentMatch = svgContent.match(/<svg[^>]*>([\\s\\S]*)<\\/svg>/i);\n if (!innerContentMatch) {\n throw new Error(`Invalid SVG content: could not parse SVG structure`);\n }\n\n let innerContent = innerContentMatch[1] ?? '';\n\n // Remove width and height attributes from inner elements if they exist\n // This ensures the symbol scales properly\n innerContent = innerContent.replace(/\\s(width|height)=[\"'][^\"']*[\"']/gi, '');\n\n // Create the symbol element\n const symbolId = `icon-${iconId}`;\n return `<symbol id=\"${symbolId}\" viewBox=\"${viewBox}\">${innerContent}</symbol>`;\n}\n","import type { Block, Inline } from '@contentful/rich-text-types';\nimport type {\n IBaseCollection,\n IBaseComponent,\n INavigation,\n INavigationItem,\n IResponsiveVisual,\n ISvgImage,\n ITyped,\n IVisual,\n} from '@se-studio/core-data-types';\nimport { isSvgImage } from '@se-studio/core-data-types';\nimport type { IContentfulRichText } from '../api';\nimport { fetchSvgContent, processSvgForSprite } from './svgProcessor';\n\n/**\n * Extract SVG image from a visual if it's marked as an icon.\n * Only returns SVG images that have isIcon: true (set during conversion from icon fields).\n *\n * @param visual - Visual to check\n * @returns SVG image if visual contains an icon SVG, undefined otherwise\n */\nexport function extractIconFromVisual(visual: IVisual | undefined): ISvgImage | undefined {\n if (!visual?.image) {\n return undefined;\n }\n // Only return SVG images that are marked as icons\n if (isSvgImage(visual.image) && visual.image.isIcon) {\n return visual.image;\n }\n return undefined;\n}\n\n/**\n * Extract icon SVG images from a responsive visual (both desktop and mobile).\n * Only returns SVG images that have isIcon: true.\n *\n * @param visual - Responsive visual to check\n * @returns Array of icon SVG images found (may contain 0, 1, or 2 items)\n */\nexport function extractIconsFromResponsiveVisual(\n visual: IResponsiveVisual | undefined,\n): ISvgImage[] {\n const icons: ISvgImage[] = [];\n if (visual?.visual) {\n const svg = extractIconFromVisual(visual.visual);\n if (svg) {\n icons.push(svg);\n }\n }\n if (visual?.mobileVisual) {\n const svg = extractIconFromVisual(visual.mobileVisual);\n if (svg) {\n icons.push(svg);\n }\n }\n return icons;\n}\n\n/**\n * Collect icon SVG from a component's icon field.\n *\n * @param component - Component to check\n * @returns Array of icon SVGs found\n */\nexport function collectIconsFromComponent(component: IBaseComponent | undefined): ISvgImage[] {\n if (!component) {\n return [];\n }\n const icon = extractIconFromVisual(component.icon);\n return icon ? [icon] : [];\n}\n\n/**\n * Collect icon SVG from a collection's icon field.\n *\n * @param collection - Collection to check\n * @returns Array of icon SVGs found\n */\nexport function collectIconsFromCollection(collection: IBaseCollection | undefined): ISvgImage[] {\n if (!collection) {\n return [];\n }\n const icon = extractIconFromVisual(collection.icon);\n return icon ? [icon] : [];\n}\n\n/**\n * Recursively collect all SVG icons from navigation structures.\n * This includes icons from navigation item links and nested navigation entries.\n *\n * @param navigation - Navigation structure to scan\n * @returns Array of all SVG icons found\n */\nexport function collectIconsFromNavigation(navigation: INavigation | undefined): ISvgImage[] {\n if (!navigation) {\n return [];\n }\n\n const icons: ISvgImage[] = [];\n const seenIds = new Set<string>();\n\n function addIcon(icon: ISvgImage) {\n // Deduplicate by ID\n if (!seenIds.has(icon.id)) {\n seenIds.add(icon.id);\n icons.push(icon);\n }\n }\n\n function processNavItem(item: INavigationItem) {\n // Check link icon\n if (item.link?.icon) {\n const linkIcons = extractIconsFromResponsiveVisual(item.link.icon);\n for (const icon of linkIcons) {\n addIcon(icon);\n }\n }\n // Recursively process nested entries\n if (item.entries) {\n for (const nestedItem of item.entries) {\n processNavItem(nestedItem);\n }\n }\n }\n\n for (const item of navigation.entries) {\n processNavItem(item);\n }\n\n return icons;\n}\n\n/**\n * Traverse a rich text document and collect icons from embedded entries.\n * This handles embedded-entry-block and embedded-entry-inline nodes that contain\n * resolved content (Components, Collections, etc.) with potential icons.\n *\n * @param richText - Rich text document to traverse\n * @param processContent - Callback to process embedded content items\n */\nfunction collectIconsFromRichText(\n richText: IContentfulRichText | undefined | null,\n processContent: (content: ITyped) => void,\n): void {\n if (!richText?.json) {\n return;\n }\n\n const traverseNode = (node: Block | Inline): void => {\n // Check for embedded entry in data.target (resolved by resolveRichTextDocument)\n if (\n node.data?.target &&\n typeof node.data.target === 'object' &&\n 'type' in node.data.target &&\n 'id' in node.data.target\n ) {\n processContent(node.data.target as ITyped);\n }\n\n // Recurse into child content\n if ('content' in node && Array.isArray(node.content)) {\n for (const child of node.content) {\n if (typeof child === 'object' && child !== null && 'nodeType' in child) {\n traverseNode(child as Block);\n }\n }\n }\n };\n\n // Start traversal from the document root\n traverseNode(richText.json as unknown as Block);\n}\n\n/**\n * Recursively collect all SVG icons from page content.\n * This includes icons from components, collections, nested content,\n * and embedded entries within rich text fields (body, additionalCopy).\n *\n * @param contents - Array of content items to scan\n * @returns Array of all SVG icons found\n */\nexport function collectIconsFromContent(contents: ReadonlyArray<ITyped> | undefined): ISvgImage[] {\n if (!contents) {\n return [];\n }\n\n const icons: ISvgImage[] = [];\n const seenIds = new Set<string>();\n // Track processed content IDs to avoid infinite loops with circular references\n const processedIds = new Set<string>();\n\n function addIcon(icon: ISvgImage) {\n // Deduplicate by ID\n if (!seenIds.has(icon.id)) {\n seenIds.add(icon.id);\n icons.push(icon);\n }\n }\n\n // Process a single content item (used by both main loop and rich text traversal)\n function processContentItem(content: ITyped): void {\n // Skip if already processed (prevents infinite loops)\n if (processedIds.has(content.id)) {\n return;\n }\n processedIds.add(content.id);\n\n // Check component icon field\n if (content.type === 'Component') {\n const componentIcons = collectIconsFromComponent(content as IBaseComponent);\n for (const icon of componentIcons) {\n addIcon(icon);\n }\n\n // Type for component with optional rich text and contents fields\n const component = content as IBaseComponent & {\n contents?: ReadonlyArray<ITyped>;\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n };\n\n // Recursively check nested content if component has contents\n if (component.contents) {\n for (const nested of component.contents) {\n processContentItem(nested);\n }\n }\n\n // Check rich text fields for embedded content\n collectIconsFromRichText(component.body, processContentItem);\n collectIconsFromRichText(component.additionalCopy, processContentItem);\n }\n\n // Check collection icon field\n if (content.type === 'Collection') {\n const collectionIcons = collectIconsFromCollection(content as IBaseCollection);\n for (const icon of collectionIcons) {\n addIcon(icon);\n }\n\n // Type for collection with optional rich text fields\n const collection = content as IBaseCollection & {\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n };\n\n // Recursively check collection contents\n if (collection.contents) {\n for (const nested of collection.contents) {\n if (typeof nested === 'object' && nested !== null && 'type' in nested && 'id' in nested) {\n processContentItem(nested as ITyped);\n }\n }\n }\n\n // Check rich text fields for embedded content\n collectIconsFromRichText(collection.body, processContentItem);\n collectIconsFromRichText(collection.additionalCopy, processContentItem);\n }\n\n // Check links for icon fields (IResponsiveVisual)\n if (\n content.type === 'Internal link' ||\n content.type === 'External link' ||\n content.type === 'Download link' ||\n content.type === 'Blank link'\n ) {\n const link = content as { icon?: IResponsiveVisual };\n if (link.icon) {\n const linkIcons = extractIconsFromResponsiveVisual(link.icon);\n for (const icon of linkIcons) {\n addIcon(icon);\n }\n }\n }\n }\n\n // Process all top-level content items\n for (const content of contents) {\n processContentItem(content);\n }\n\n return icons;\n}\n\n/**\n * Deduplicate icons by ID, preserving order of first occurrence.\n * Takes any number of icon arrays and returns a single deduplicated array.\n *\n * @param iconArrays - Arrays of icons to merge and deduplicate\n * @returns Deduplicated array of icons, or undefined if empty\n */\nexport function deduplicateIcons(\n ...iconArrays: ReadonlyArray<ISvgImage>[]\n): ISvgImage[] | undefined {\n const seenIds = new Set<string>();\n const icons: ISvgImage[] = [];\n\n for (const arr of iconArrays) {\n for (const icon of arr) {\n if (!seenIds.has(icon.id)) {\n seenIds.add(icon.id);\n icons.push(icon);\n }\n }\n }\n\n return icons.length > 0 ? icons : undefined;\n}\n\n/**\n * Process icons by fetching SVG content and generating sprite symbols.\n * This runs during data conversion to pre-process icons for the sprite sheet.\n *\n * @param icons - Array of icon SVG images to process\n * @returns Array of icons with symbolContent populated\n */\nexport async function processIconsForSprite(icons: ReadonlyArray<ISvgImage>): Promise<ISvgImage[]> {\n if (icons.length === 0) {\n return [];\n }\n\n // Process all icons in parallel\n const processedIcons = await Promise.all(\n icons.map(async (icon): Promise<ISvgImage> => {\n try {\n // Fetch SVG content (uses parent request's cache tags)\n const svgContent = await fetchSvgContent(icon.svgSrc);\n // Process into symbol format\n const symbolContent = processSvgForSprite(svgContent, icon.id);\n // Return icon with symbolContent populated\n return {\n ...icon,\n symbolContent,\n };\n } catch (error) {\n // If processing fails, return icon without symbolContent\n // The error will be logged but won't break the page\n console.error(`Failed to process icon ${icon.id}:`, error);\n return icon;\n }\n }),\n );\n\n return processedIcons;\n}\n","import type { IArticleLink, IInternalLink, ISvgImage, IVisual } from '@se-studio/core-data-types';\nimport type { Asset, Entry, EntrySkeletonType } from 'contentful';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport { type ContentfulResponse, getContentfulClient } from '../client';\nimport { convertAssetToVisual } from '../converters/asset';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { processIconsForSprite } from '../converters/iconCollector';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport type { DefaultChainModifier, PossibleResolvedEntry, SingleEntityFetchConfig } from './types';\n\n// ============================================================================\n// CMS Configuration and Options\n// ============================================================================\n\n/**\n * Build fetch options with defaults.\n *\n * @param options - Provided fetch options\n * @param defaultDraftOnly - Default value for preview if not specified\n * @returns Combined fetch options\n */\nexport function buildFetchOptions(\n options: FetchOptions | undefined,\n defaultDraftOnly = false,\n): FetchOptions {\n const preview = options?.preview === undefined ? defaultDraftOnly : options.preview;\n return {\n preview,\n cache: 'force-cache',\n ...options,\n };\n}\n\n/**\n * Get Contentful configuration from environment variables.\n *\n * Supports CONTENTFUL_SPACE_ID, CONTENTFUL_ENVIRONMENT (or CONTENTFUL_ENVIRONMENT_NAME),\n * and access tokens for both delivery and preview.\n *\n * @param preview - Whether to get the preview access token\n * @returns Contentful configuration object\n * @throws Error if required environment variables are missing\n */\nexport function getContentfulConfig(preview: boolean): ContentfulConfig {\n const spaceId = process.env.CONTENTFUL_SPACE_ID;\n const environment = process.env.CONTENTFUL_ENVIRONMENT || process.env.CONTENTFUL_ENVIRONMENT_NAME;\n const accessToken = preview\n ? process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN\n : process.env.CONTENTFUL_ACCESS_TOKEN;\n\n if (!spaceId) {\n throw new Error('CONTENTFUL_SPACE_ID environment variable is required');\n }\n if (!accessToken) {\n if (preview) {\n throw new Error('CONTENTFUL_PREVIEW_ACCESS_TOKEN environment variable is required');\n }\n throw new Error('CONTENTFUL_ACCESS_TOKEN environment variable is required');\n }\n if (!environment) {\n throw new Error(\n 'CONTENTFUL_ENVIRONMENT or CONTENTFUL_ENVIRONMENT_NAME environment variable is required',\n );\n }\n\n return {\n spaceId,\n accessToken,\n environment,\n };\n}\n\n/**\n * Generic fetcher helper that simplifies CMS data fetching in projects.\n *\n * Combines a lower-level fetcher with project-specific context and configuration,\n * handles common error logging pattern, and returns the data directly.\n *\n * @param fetcher - The API function to call\n * @param context - The project's converter context\n * @param config - Contentful configuration\n * @param options - Fetch options\n * @param errorLabel - Human-readable label for error logging (e.g., 'page links')\n * @returns Promise resolving to the fetched data\n */\nexport async function fetchWithErrors<T>(\n fetcher: (\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n ) => Promise<CmsResponse<T>>,\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n errorLabel: string,\n): Promise<T> {\n const response = await fetcher(context, config, options);\n if (response.errors.length > 0) {\n console.warn(`Errors occurred while fetching ${errorLabel}:`, response.errors);\n }\n return response.data;\n}\n\n// ============================================================================\n// Field Selection Constants\n// ============================================================================\n\n/**\n * Field selection constants for link-only fetching.\n * These reduce payload size by excluding content arrays, navigation, templates, etc.\n */\nexport const PAGE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags';\n\nexport const ARTICLE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags,fields.articleType,fields.date,fields.author,fields.externalLink,fields.download';\n\nexport const ARTICLE_TYPE_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nexport const TAG_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nexport const PERSON_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.media,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\n// ============================================================================\n// Asset and Include Conversion\n// ============================================================================\n\nexport function convertAllAssets(\n response: ContentfulResponse<unknown>,\n context: BaseConverterContext,\n): Map<string, IVisual> {\n const visuals = new Map<string, IVisual>();\n const assets = response.includes?.Asset;\n if (assets && assets.length > 0) {\n for (const asset of assets) {\n const visual = convertAssetToVisual(context, asset);\n if (visual) {\n visuals.set(visual.id, visual);\n }\n }\n }\n return visuals;\n}\n\nexport function convertAllRawAssets(response: ContentfulResponse<unknown>): Map<string, Asset> {\n const rawAssets = new Map<string, Asset>();\n const assets = response.includes?.Asset;\n if (assets && assets.length > 0) {\n for (const asset of assets) {\n rawAssets.set(asset.sys.id, asset);\n }\n }\n return rawAssets;\n}\n\nexport function convertAllIncludes(\n response: ContentfulResponse<unknown>,\n): Map<string, PossibleResolvedEntry> {\n const includes = new Map<string, PossibleResolvedEntry>();\n const entries = [...response.items, ...(response.includes?.Entry || [])];\n\n if (entries && entries.length > 0) {\n for (const entry of entries) {\n if (entry?.sys && entry.fields) {\n includes.set(entry.sys.id, {\n id: entry.sys.id,\n type: entry.sys.contentType.sys.id,\n entry,\n });\n }\n }\n }\n return includes;\n}\n\n// ============================================================================\n// Generic Single Entity Fetcher\n// ============================================================================\n\n/**\n * Generic helper for fetching a single entity from Contentful.\n * Handles caching, error handling, retry logic, and conversion consistently.\n *\n * @param context - Base converter context for content transformation\n * @param config - Contentful configuration (spaceId, accessToken, environment)\n * @param fetchConfig - Configuration for this specific fetch\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns Promise resolving to the entity or null if not found, with any conversion errors\n */\nexport async function fetchSingleEntity<TEntry extends EntrySkeletonType, TResult>(\n context: BaseConverterContext,\n config: ContentfulConfig,\n fetchConfig: SingleEntityFetchConfig<TEntry, TResult>,\n options: FetchOptions,\n): Promise<CmsResponse<TResult | null>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request\n const cacheTags = getCacheTags(\n fetchConfig.cacheTagType,\n fetchConfig.cacheTagIdentifier,\n options?.preview,\n );\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = async () => {\n const response = await client.getEntries<TEntry>(\n {\n content_type: fetchConfig.contentType,\n ...fetchConfig.query,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const entry = response.items[0] as Entry<TEntry, DefaultChainModifier, string> | undefined;\n if (!entry || !entry.fields) {\n return { data: null, errors: [] };\n }\n\n try {\n const assets = convertAllAssets(response, context);\n const rawAssets = convertAllRawAssets(response);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n rawAssets,\n errors: [],\n };\n const converted = fetchConfig.resolver(fullContext, entry);\n\n // Process icons if the result has an icons field (e.g., IBasePage)\n if (converted && typeof converted === 'object' && 'icons' in converted) {\n const icons = (converted as { icons?: ReadonlyArray<ISvgImage> }).icons;\n if (icons && Array.isArray(icons) && icons.length > 0) {\n const processedIcons = await processIconsForSprite(icons);\n (converted as { icons?: ReadonlyArray<ISvgImage> }).icons =\n processedIcons.length > 0 ? processedIcons : undefined;\n }\n }\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error(`CMS conversion errors for ${fetchConfig.contentType}:`, {\n entryId: entry.sys.id,\n ...fetchConfig.errorLogContext,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n// ============================================================================\n// Generic All Links Fetcher\n// ============================================================================\n\n/**\n * Shared helper function for paginated Contentful link fetching.\n * Returns links with lastModified metadata from sys.updatedAt.\n */\nexport async function fetchAllLinks<\n TEntry extends EntrySkeletonType =\n | BasePageSkeleton\n | BaseArticleSkeleton\n | BaseArticleTypeSkeleton\n | BaseTagSkeleton\n | BasePersonSkeleton,\n TResult extends IInternalLink | IArticleLink = IInternalLink,\n>(\n contentType: string,\n client: ReturnType<typeof getContentfulClient>,\n requestOptions: FetchOptions | undefined,\n converter: (\n context: ConverterContext,\n entry: Entry<TEntry, DefaultChainModifier, string>,\n ) => TResult,\n context: BaseConverterContext,\n pageSize: number = 100,\n select?: string,\n): Promise<CmsResponse<TResult[]>> {\n const allLinks: TResult[] = [];\n const errors: CmsError[] = [];\n let skip = 0;\n let hasMore = true;\n\n const fetchFn = async () => {\n while (hasMore) {\n try {\n const response = await client.getEntries<TEntry>(\n {\n content_type: contentType,\n include: 2, // Minimal include for link-only fetching\n locale: requestOptions?.locale,\n limit: pageSize,\n skip,\n ...(select && { select }),\n },\n requestOptions,\n );\n\n if (response.items.length === 0) {\n hasMore = false;\n break;\n }\n\n // Convert entries to links\n const includes = convertAllIncludes(response);\n const assets = convertAllAssets(response, context);\n const rawAssets = convertAllRawAssets(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n rawAssets,\n errors: [],\n };\n\n for (const entry of response.items) {\n if (!entry.fields) continue;\n try {\n const converted = converter(\n fullContext,\n entry as Entry<TEntry, DefaultChainModifier, string>,\n );\n // Add lastModified from sys.updatedAt\n converted.lastModified = entry.sys.updatedAt\n ? new Date(entry.sys.updatedAt)\n : undefined;\n allLinks.push(converted);\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown conversion error';\n\n errors.push({\n entryId,\n entryType,\n message: errorMessage,\n error,\n });\n }\n }\n\n skip += pageSize;\n\n // Check if we've fetched all items\n if (skip >= response.total) {\n hasMore = false;\n }\n } catch (error) {\n console.error('Error fetching links', typeof error, error, JSON.stringify(error, null, 2));\n throw error;\n }\n }\n\n return { data: allLinks, errors };\n };\n\n return await fetchFn();\n}\n","export function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {\n if (value === null || value === undefined) return false;\n return true;\n}\n\nexport function arrayOrUndefined<T>(array?: ReadonlyArray<T>) {\n if (array && array.length > 0) {\n return array;\n }\n return undefined;\n}\n","/**\n * Validates if a value can be converted to a valid Date object\n */\nexport function isValidDate(date: unknown): boolean {\n if (date instanceof Date) {\n return !Number.isNaN(date.getTime());\n }\n\n if (typeof date === 'string' || typeof date === 'number') {\n const parsed = new Date(date);\n return !Number.isNaN(parsed.getTime()) && parsed.getTime() > 0;\n }\n\n return false;\n}\n\n/**\n * Safely creates a Date object, returning null if invalid\n */\nexport function safeDate(date: unknown): Date | null {\n if (!isValidDate(date)) {\n return null;\n }\n\n if (date instanceof Date) {\n return date;\n }\n\n return new Date(date as string | number);\n}\n","import type { IBaseArticle } from '@se-studio/core-data-types';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches an article from Contentful by slug and article type slug.\n *\n * @param context - Base converter context for content transformation\n * @param config - Contentful configuration (spaceId, accessToken, environment)\n * @param slug - Article slug to fetch\n * @param articleTypeSlug - Article type slug (e.g., 'blog', 'news')\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns Promise resolving to article data or null if not found, with any conversion errors\n *\n * @example\n * ```ts\n * const article = await contentfulArticleRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'my-article',\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: { tags: ['article#my-article'], revalidate: 3600 }\n * }\n * );\n * ```\n */\nexport async function contentfulArticleRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n articleTypeSlug: string,\n options: FetchOptions,\n): Promise<CmsResponse<IBaseArticle | null>> {\n return fetchSingleEntity<BaseArticleSkeleton, IBaseArticle>(\n context,\n config,\n {\n contentType: 'article',\n cacheTagType: 'article',\n cacheTagIdentifier: slug,\n query: {\n 'fields.slug': slug,\n 'fields.articleType.sys.contentType.sys.id': 'articleType',\n 'fields.articleType.fields.slug': articleTypeSlug,\n },\n resolver: (ctx, entry) => ctx.articleResolver(ctx, entry),\n errorLogContext: { slug, articleTypeSlug },\n },\n options,\n );\n}\n","import type { IBaseArticleType } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport { getContentfulClient } from '../client';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { processIconsForSprite } from '../converters/iconCollector';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport { convertAllAssets, convertAllIncludes, convertAllRawAssets } from './helpers';\nimport type { DefaultChainModifier } from './types';\n\nexport interface ArticleTypeFetchOptions extends FetchOptions {\n customType?: string;\n}\n\n/**\n * Fetches an article type from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Article type slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseArticleType or null if not found\n *\n * @example\n * ```ts\n * const articleType = await contentfulArticleTypeRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['blog-article-type'],\n * revalidate: 3600\n * },\n * customType: 'blog' // Optional custom type\n * }\n * );\n * ```\n */\nexport async function contentfulArticleTypeRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options: ArticleTypeFetchOptions,\n): Promise<CmsResponse<IBaseArticleType | null>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request\n const articleTypeCacheTags = getCacheTags('articleType', slug, options?.preview);\n const customTypeCacheTags = options?.customType\n ? getCacheTags('customType', options.customType, options?.preview)\n : [];\n\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: [...articleTypeCacheTags, ...customTypeCacheTags],\n },\n };\n\n const fetchFn = async () => {\n const articleTypePromise = client.getEntries<BaseArticleTypeSkeleton>(\n {\n content_type: 'articleType',\n 'fields.slug': slug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const customTypePromise = options?.customType\n ? client.getEntries<BaseCustomTypeSkeleton>(\n {\n content_type: 'customType',\n 'fields.slug': options.customType,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n )\n : Promise.resolve(null);\n\n const [articleTypeResponse, customTypeResponse] = await Promise.all([\n articleTypePromise,\n customTypePromise,\n ]);\n\n const articleTypeEntry = articleTypeResponse.items[0] as\n | Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>\n | undefined;\n\n if (!articleTypeEntry || !articleTypeEntry.fields) {\n return { data: null, errors: [] };\n }\n\n const customTypeEntry = customTypeResponse?.items[0] as\n | Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>\n | undefined;\n\n try {\n const assets = convertAllAssets(articleTypeResponse, context);\n const rawAssets = convertAllRawAssets(articleTypeResponse);\n const includes = convertAllIncludes(articleTypeResponse);\n\n if (customTypeResponse) {\n const customAssets = convertAllAssets(customTypeResponse, context);\n const customRawAssets = convertAllRawAssets(customTypeResponse);\n const customIncludes = convertAllIncludes(customTypeResponse);\n\n for (const [key, value] of customAssets) assets.set(key, value);\n for (const [key, value] of customRawAssets) rawAssets.set(key, value);\n for (const [key, value] of customIncludes) includes.set(key, value);\n }\n\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n rawAssets,\n errors: [],\n };\n\n const converted = context.articleTypeResolver(fullContext, articleTypeEntry, customTypeEntry);\n\n // Process icons if the result has an icons field\n if (converted?.icons && converted.icons.length > 0) {\n const processedIcons = await processIconsForSprite(converted.icons);\n converted.icons = processedIcons.length > 0 ? processedIcons : undefined;\n }\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error(`CMS conversion errors for articleType:`, {\n entryId: articleTypeEntry.sys.id,\n slug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = articleTypeEntry?.sys.id || 'unknown';\n const entryType = articleTypeEntry?.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n","/**\n * Contentful Asset API Module\n *\n * Provides functions for fetching and serving Contentful assets\n * with proper caching and Content-Disposition handling.\n */\n\nimport type { NextRequest } from 'next/server';\nimport { type ContentfulAssetResponse, getContentfulClient } from '../client';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { ContentfulConfig, FetchOptions } from '../types';\n\n// Re-export types from client for convenience\nexport type { ContentfulAssetFields, ContentfulAssetResponse } from '../client';\n\n/**\n * Extended RequestInit with Next.js caching options.\n * Next.js augments the global fetch to support these options.\n */\ninterface NextFetchRequestInit extends RequestInit {\n next?: {\n revalidate?: number | false;\n tags?: string[];\n };\n}\n\n/**\n * Content types that browsers can display inline\n */\nconst BROWSER_VIEWABLE_TYPES = [\n 'application/pdf',\n 'text/plain',\n 'text/html',\n 'text/css',\n 'text/javascript',\n 'application/json',\n];\n\n/**\n * Check if a content type can be displayed inline in the browser.\n * Returns true for PDFs, images, videos, and common text formats.\n *\n * @param contentType - MIME type to check\n * @returns true if the browser can display this content type inline\n */\nexport function isBrowserViewable(contentType: string): boolean {\n // All images and videos are viewable\n if (contentType.startsWith('image/') || contentType.startsWith('video/')) {\n return true;\n }\n\n return BROWSER_VIEWABLE_TYPES.includes(contentType);\n}\n\n/**\n * Fetch asset metadata from Contentful by asset ID.\n * Uses the shared Contentful client with rate limiting and retry logic.\n *\n * @param config - Contentful configuration\n * @param assetId - The Contentful asset ID\n * @param options - Optional fetch options (preview, cache settings)\n * @returns The asset response or null if not found\n */\nexport async function contentfulAssetRest(\n config: ContentfulConfig,\n assetId: string,\n options: FetchOptions,\n): Promise<ContentfulAssetResponse | null> {\n const client = getContentfulClient(config, options.preview);\n\n // Get cache tags for this asset\n const cacheTags = getCacheTags('asset', assetId, options?.preview);\n\n return client.getAsset(assetId, {\n ...options,\n next: {\n revalidate: options?.next?.revalidate ?? 86400, // Default 24 hours\n tags: [...cacheTags, ...(options?.next?.tags ?? [])],\n },\n });\n}\n\n/**\n * Configuration for creating a download handler\n */\nexport interface DownloadHandlerConfig {\n /**\n * Function to get the Contentful configuration.\n * Called on each request to allow for dynamic config.\n */\n getConfig: (preview?: boolean) => ContentfulConfig;\n\n /**\n * Default cache revalidation time in seconds.\n * Defaults to 86400 (24 hours).\n */\n revalidate?: number;\n\n /**\n * Whether to use preview API.\n * Defaults to false.\n */\n preview?: boolean;\n}\n\n/**\n * Route params structure for Next.js App Router\n */\nexport interface DownloadRouteParams {\n params: Promise<{\n assetId: string;\n filename: string;\n }>;\n}\n\n/**\n * Creates a Next.js App Router GET handler for downloading/viewing Contentful assets.\n *\n * The handler:\n * - Fetches asset metadata from Contentful (with rate limiting and retry)\n * - Proxies the file stream from Contentful CDN\n * - Sets appropriate Content-Disposition (inline for PDFs/images, attachment for others)\n * - Uses proper cache tags for revalidation\n *\n * @param config - Download handler configuration\n * @returns GET handler function for Next.js route\n *\n * @example\n * ```ts\n * // app/download/[assetId]/[filename]/route.ts\n * import { createDownloadHandler } from '@se-studio/contentful-rest-api';\n * import { getContentfulConfig } from '@/lib/cms';\n *\n * export const GET = createDownloadHandler({\n * getConfig: () => getContentfulConfig(false),\n * });\n * ```\n */\nexport function createDownloadHandler(config: DownloadHandlerConfig) {\n const { getConfig, revalidate = 86400, preview = false } = config;\n\n return async function GET(\n _request: NextRequest,\n { params }: DownloadRouteParams,\n ): Promise<Response> {\n const { assetId, filename } = await params;\n\n // Decode the filename (in case it was URL-encoded)\n const decodedFilename = decodeURIComponent(filename);\n\n try {\n // Get Contentful config\n const contentfulConfig = getConfig(preview);\n\n // Fetch asset metadata from Contentful (uses client with rate limiting)\n const asset = await contentfulAssetRest(contentfulConfig, assetId, {\n preview,\n next: { revalidate },\n });\n\n if (!asset?.fields?.file) {\n return Response.json({ error: 'Asset not found' }, { status: 404 });\n }\n\n const { file } = asset.fields;\n const assetUrl = `https:${file.url}`;\n\n // Fetch the actual file from Contentful CDN\n // Note: This is a direct CDN fetch, not through the Contentful API,\n // so it doesn't need rate limiting\n const cacheTags = getCacheTags('asset', assetId, preview);\n\n const fileFetchOptions: NextFetchRequestInit = {\n next: {\n revalidate,\n tags: cacheTags,\n },\n };\n\n const fileResponse = await fetch(assetUrl, fileFetchOptions);\n\n if (!fileResponse.ok) {\n return Response.json({ error: 'Failed to fetch file' }, { status: 502 });\n }\n\n // Build response headers\n const headers = new Headers();\n\n // Content type from Contentful\n headers.set('Content-Type', file.contentType);\n\n // Content-Disposition: inline opens in browser, attachment forces download\n // Use inline for browser-viewable types (PDFs, images, videos), attachment for others\n const disposition = isBrowserViewable(file.contentType) ? 'inline' : 'attachment';\n headers.set('Content-Disposition', `${disposition}; filename=\"${decodedFilename}\"`);\n\n // Set content length if available\n if (file.details?.size) {\n headers.set('Content-Length', String(file.details.size));\n }\n\n // Cache control\n headers.set('Cache-Control', `public, max-age=${revalidate}, s-maxage=${revalidate}`);\n\n return new Response(fileResponse.body, {\n status: 200,\n headers,\n });\n } catch (error) {\n console.error('[Download] Error proxying file:', error);\n return Response.json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n","import type { ISchema } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseSchemaSkeleton } from '../baseTypes/baseSchema';\nimport type { ConverterContext } from './helpers';\n\n/**\n * Base converter for Schema entries to ISchema type\n *\n * @param context - Converter context\n * @param entry - Contentful entry to convert\n * @returns ISchema object\n */\nexport function baseSchemaConverter(\n _context: ConverterContext,\n entry: Entry<BaseSchemaSkeleton, DefaultChainModifier, string>,\n): ISchema {\n const { sys, fields } = entry;\n const { cmsLabel, markup } = fields;\n\n return {\n id: sys.id,\n name: cmsLabel,\n markup: markup ?? '',\n description: `Schema for ${cmsLabel}`,\n };\n}\n","import type { Block, Document, Inline, Text } from '@contentful/rich-text-types';\nimport type {\n BaseCollectionContent,\n IInternalLink,\n INavigationItem,\n ISchema,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, EntrySkeletonType, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport type { BaseSchemaSkeleton } from '../baseTypes/baseSchema';\nimport type { BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport { arrayOrUndefined } from '../utils';\nimport { convertExternalVideoEntryToVisual, convertMediaEntryToVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset } from './helpers';\nimport { baseSchemaConverter } from './schema';\n\nexport function resolveHelper<TEntrySkeletonType extends EntrySkeletonType, TResult>(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n getResolver: (\n type: string,\n ) =>\n | ((\n context: ConverterContext,\n entry: Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n ) => TResult)\n | undefined,\n): TResult {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n if (!possibleEntry) {\n throw new Error(`Cannot find included entry for link from ${fromId} with id ${id}`);\n }\n if (!possibleEntry.resolved) {\n const resolver = getResolver(possibleEntry.type);\n if (!resolver) {\n throw new Error(\n `No resolver found for link type ${possibleEntry.type} (${JSON.stringify(possibleEntry)}) [${JSON.stringify(entry)}]`,\n );\n }\n if (typeof resolver !== 'function') {\n console.log('Resolver type', possibleEntry.type, typeof resolver, resolver);\n }\n\n const resolved = resolver(\n context,\n possibleEntry.entry as Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n );\n possibleEntry.resolved = resolved;\n return resolved;\n }\n return possibleEntry.resolved as TResult;\n}\n\nexport function resolveSchema(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ISchema {\n return resolveHelper<BaseSchemaSkeleton, ISchema>(\n context,\n fromId,\n entry,\n () => baseSchemaConverter,\n );\n}\n\nexport function resolveLink(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): IInternalLink {\n return resolveHelper<BaseLink, IInternalLink>(context, fromId, entry, (type) =>\n context.linkResolver.get(type),\n );\n}\n\nexport function resolveLinks(\n context: ConverterContext,\n fromId: string,\n entries: UnresolvedLink<'Entry'>[] | undefined,\n): readonly IInternalLink[] | undefined {\n return arrayOrUndefined(entries?.map((entry) => resolveLink(context, fromId, entry)));\n}\n\nexport function resolveContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped {\n return resolveHelper<BaseLink, ITyped>(context, fromId, entry, (type) => {\n const resolver = context.contentResolver.get(type);\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n ) => ITyped;\n });\n}\n\nexport function resolveNavigationItem(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): INavigationItem {\n const result = resolveHelper<BaseNavigationItemSkeleton, INavigationItem>(\n context,\n fromId,\n entry,\n () => context.navigationItemResolver,\n );\n return result;\n}\n\ntype BaseCollectionContentSkeleton = BaseComponentSkeleton | BaseCollectionSkeleton | BaseLink;\nexport function resolveCollectionContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): BaseCollectionContent {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n throw new Error(\n `Cannot find included entry for collection content from ${fromId} with id ${id}`,\n );\n }\n\n // Return cached resolved entry if available\n if (possibleEntry.resolved) {\n return possibleEntry.resolved as BaseCollectionContent;\n }\n\n const { type } = possibleEntry;\n\n // Handle Media - convert to IVisual\n if (type === 'media') {\n const visual = convertMediaEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n throw new Error(`Failed to convert media entry with id ${id}`);\n }\n possibleEntry.resolved = visual;\n return visual;\n }\n\n // Handle ExternalVideo - convert to IVisual\n if (type === 'externalVideo') {\n const visual = convertExternalVideoEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n throw new Error(`Failed to convert externalVideo entry with id ${id}`);\n }\n possibleEntry.resolved = visual;\n return visual;\n }\n\n // Fall back to resolver lookup for other types\n return resolveHelper<BaseCollectionContentSkeleton, BaseCollectionContent>(\n context,\n fromId,\n entry,\n (resolverType) => {\n const resolver = context.contentResolver.get(resolverType);\n if (resolver) {\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContentSkeleton, DefaultChainModifier, string>,\n ) => BaseCollectionContent;\n }\n const linkResolver = context.linkResolver.get(resolverType);\n if (linkResolver) {\n return linkResolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContentSkeleton, DefaultChainModifier, string>,\n ) => BaseCollectionContent;\n }\n return undefined;\n },\n );\n}\n\n/**\n * Resolves a PageContent entry from an unresolved link\n * PageContent can be: Component, Collection, ExternalComponent, Visual (media/externalVideo), or PersonLink\n */\nexport function resolvePageContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped | null {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n const errorMessage = `Cannot find included entry for content from ${fromId} with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: 'unknown',\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n\n const { type } = possibleEntry;\n\n // Handle Media - convert to IVisual\n if (type === 'media') {\n try {\n const visual = convertMediaEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert media entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting media entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // Handle ExternalVideo - convert to IVisual\n if (type === 'externalVideo') {\n try {\n const visual = convertExternalVideoEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert externalVideo entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting externalVideo entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // // Handle ExternalComponent\n // if (type === 'externalComponent') {\n // return resolveHelper<\n // TConfig,\n // BaseExternalComponentSkeleton<TConfig>,\n // TConfig['ExternalComponent']\n // >(context, entry, () => baseExternalComponentConverter);\n // }\n\n try {\n if (context.contentResolver.has(type)) {\n return resolveContent(context, fromId, entry);\n }\n\n if (context.linkResolver.has(type)) {\n return resolveLink(context, fromId, entry);\n }\n\n const errorMessage = `Unknown content type \"${type}\" for entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n } catch (error) {\n const errorMessage = `Error resolving content entry with id ${id} of type ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n}\n\n/**\n * Resolves all embedded entries and assets within a rich text document\n * Recursively traverses the document tree and resolves link references\n *\n * @param context - The converter context with includes and assets maps\n * @param richText - The unresolved rich text document from Contentful\n * @returns The rich text document with all embedded content resolved\n */\nexport function resolveRichTextDocument(\n context: ConverterContext,\n fromId: string,\n richText: Document | undefined,\n) {\n if (!richText) {\n return undefined;\n }\n\n // Track resolved entries to prevent infinite recursion\n const resolvingEntries = new Set<string>();\n const resolvedEntries = new Set<string>();\n\n const resolveNode = (node: Block | Text | Inline): Block | Text | Inline => {\n // Handle embedded-entry-block nodes\n if (!('content' in node)) {\n return node;\n }\n const block = node as Block;\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Entry'\n ) {\n const entryId = block.data.target.sys.id;\n\n // Check for circular references\n if (resolvingEntries.has(entryId)) {\n console.warn(\n `Circular reference detected in rich text resolution for entry ${entryId}. Skipping to prevent infinite recursion.`,\n );\n // Return the node as-is to break the cycle\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n // Check if already resolved\n if (resolvedEntries.has(entryId)) {\n // Entry already resolved, skip to avoid duplicate work\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n try {\n resolvingEntries.add(entryId);\n const resolvedEntry = resolvePageContent(\n context,\n fromId,\n block.data.target as UnresolvedLink<'Entry'>,\n );\n resolvingEntries.delete(entryId);\n resolvedEntries.add(entryId);\n\n // If resolvePageContent returned null due to error, return node as-is\n if (resolvedEntry === null) {\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedEntry,\n },\n content: block.content?.map(resolveNode),\n };\n } catch (error) {\n resolvingEntries.delete(entryId); // Clean up on error\n console.error(`Failed to resolve entry with id ${entryId}:`, error);\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Asset'\n ) {\n try {\n const resolvedAsset = lookupAsset(context, block.data.target as UnresolvedLink<'Asset'>);\n if (resolvedAsset) {\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedAsset,\n },\n content: block.content?.map(resolveNode),\n };\n }\n } catch (error) {\n console.error(\n `Failed to resolve embedded-asset-block with id ${block.data.target.sys.id}:`,\n error,\n );\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n // For all other node types, recursively process content if present\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n };\n\n // Cast the EntryFieldTypes.RichText to our working type\n // Resolve the entire document tree\n const resolved = resolveNode(richText);\n\n // Cast back to the config's RichText type\n return { json: resolved as Document };\n}\n","import type {\n IBlankLink,\n ILinkProps,\n INavigation,\n INavigationItem,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseNavigationSkeleton } from '../baseTypes/baseNavigation';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport { createResponsiveVisual } from './asset';\nimport {\n type ConverterContext,\n lookupIconAsset,\n makeContentfulTitle,\n resolveBuildYear,\n} from './helpers';\nimport { resolveLink, resolveNavigationItem } from './resolver';\n\nfunction createLink(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): ILinkProps | undefined {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n title,\n link,\n text,\n internal,\n icon: navIcon,\n mobileIcon: mobileNavIcon,\n useTitle,\n ...otherFields\n } = fields;\n const icon = createResponsiveVisual(\n lookupIconAsset(context, navIcon),\n lookupIconAsset(context, mobileNavIcon),\n );\n\n const realText = useTitle ? resolveBuildYear(title) : text ? resolveBuildYear(text) : undefined;\n\n if (link) {\n return {\n type: 'External link',\n id,\n href: link,\n icon,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n text: realText,\n };\n }\n if (internal) {\n const resolved = resolveLink(context, id, internal);\n return { ...resolved, icon, id, text: realText };\n }\n const blank = {\n type: 'Blank link',\n nick: true,\n id,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n icon,\n text: realText,\n };\n return blank as IBlankLink;\n}\n\nexport function baseNavigationItemConverter(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): INavigationItem {\n const {\n sys: { id },\n fields,\n } = entry;\n\n const { navigationItems } = fields;\n\n const link = createLink(context, entry);\n\n const resolvedNavigationItems = navigationItems\n ?.map((item) => resolveNavigationItem(context, id, item))\n .filter((item): item is INavigationItem => item !== undefined);\n\n const result = {\n id,\n link,\n entries: resolvedNavigationItems,\n };\n return result;\n}\n\n/**\n * Resolves a navigation entry from an unresolved link\n */\nexport function resolveNavigation(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): INavigation | undefined {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'navigation') {\n return undefined;\n }\n\n const entry = possibleEntry.entry as Entry<BaseNavigationSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return undefined;\n }\n\n // Resolve navigation item entries\n const { name, entries: fieldEntries, ...rest } = fields;\n const entries = fieldEntries?.map((item) => resolveNavigationItem(context, id, item)) ?? [];\n\n return {\n id,\n name,\n entries,\n ...rest,\n };\n}\n","import type { INavigation, ITyped } from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseTemplateSkeleton } from '../baseTypes/baseTemplate';\nimport type { ConverterContext } from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent } from './resolver';\n\n/**\n * Resolved template data structure\n * Templates don't exist as a top-level type in core-data-types,\n * so this is an internal converter type only\n */\nexport interface ResolvedTemplate {\n preContent: ReadonlyArray<ITyped>;\n postContent: ReadonlyArray<ITyped>;\n menu?: INavigation;\n footer?: INavigation;\n backgroundColour?: string;\n textColour?: string;\n stickyNav: boolean;\n}\n\n/**\n * Resolves a template entry from an unresolved link\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param link - Unresolved link to template entry\n * @returns Resolved template data with content arrays and navigation\n */\nexport function resolveTemplate(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): ResolvedTemplate | null {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'template') {\n return null;\n }\n\n const entry = possibleEntry.entry as Entry<BaseTemplateSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return null;\n }\n\n // Resolve content arrays\n const preContent =\n fields.preContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n const postContent =\n fields.postContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n // Resolve navigation entries\n const menu = fields.menu ? resolveNavigation(context, fields.menu) : undefined;\n\n const footer = fields.footer ? resolveNavigation(context, fields.footer) : undefined;\n\n // Check for sticky nav flag\n const stickyNav = fields.flags?.includes('Sticky nav') ?? false;\n\n const { backgroundColour, textColour } = fields;\n return {\n preContent,\n postContent,\n menu,\n footer,\n backgroundColour,\n textColour,\n stickyNav,\n };\n}\n","import type {\n IArticleLink,\n IArticleTypeLink,\n IBaseArticle,\n IBaseArticleType,\n ISchema,\n ITagLink,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport {\n addPositionMetadata,\n type ConverterContext,\n calculateContentCount,\n createInternalLink,\n lookupAsset,\n lookupDownloadAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport {\n collectIconsFromContent,\n collectIconsFromNavigation,\n deduplicateIcons,\n} from './iconCollector';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent, resolveSchema } from './resolver';\nimport { type ResolvedTemplate, resolveTemplate } from './template';\n\n/**\n * Resolves the article template using a hierarchy:\n * 1. Article's explicit template field (if set)\n * 2. ArticleType's articleTemplate field (if set)\n *\n * @param context - Converter context containing includes\n * @param articleTypeLink - Link to the article's ArticleType\n * @param directTemplateLink - Optional direct template link from the article\n * @returns Resolved template or null if no template found in hierarchy\n */\nfunction resolveArticleTemplateHierarchy(\n context: ConverterContext,\n articleTypeLink: UnresolvedLink<'Entry'>,\n directTemplateLink: UnresolvedLink<'Entry'> | undefined,\n): ResolvedTemplate | null {\n // Direct template on article takes precedence\n if (directTemplateLink) {\n return resolveTemplate(context, directTemplateLink);\n }\n\n // Fall back to articleType's articleTemplate\n const articleTypeEntry = context.includes.get(articleTypeLink.sys.id);\n if (!articleTypeEntry) {\n console.warn(`ArticleType entry not found for id: ${articleTypeLink.sys.id}`);\n return null;\n }\n\n const articleTypeFields = (\n articleTypeEntry.entry as Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>\n ).fields;\n\n if (articleTypeFields?.articleTemplate) {\n return resolveTemplate(context, articleTypeFields.articleTemplate);\n }\n\n return null;\n}\n\n/**\n * Base converter for Contentful Article entries to IArticle type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IArticle object\n *\n * @example\n * ```ts\n * const article = baseArticleConverter(contentfulEntry);\n * ```\n */\n\nexport function baseArticleConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IBaseArticle {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n articleType,\n structuredData,\n ...simpleFields\n } = fields;\n const articleTypeLink = resolveLink(context, id, articleType) as IArticleTypeLink;\n\n // Resolve template with hierarchy (article template → articleType template)\n const template = resolveArticleTemplateHierarchy(context, articleType, templateLink);\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const articleContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...articleContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n // Determine final menu and footer (from template)\n const finalMenu = template?.menu;\n const finalFooter = template?.footer;\n\n // Collect and deduplicate all SVG icons from article content and navigation\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(finalMenu),\n collectIconsFromNavigation(finalFooter),\n );\n\n const articleTitle = makeContentfulTitle(title, sys.id);\n const article: IBaseArticle = {\n type: 'Article',\n id,\n slug,\n name: articleTitle,\n title: articleTitle,\n description: makeContentfulDescription(description, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n contentCount: calculateContentCount(topContent, articleContent, bottomContent),\n articleType: articleTypeLink,\n tags: tags?.map((tag) => resolveLink(context, id, tag) as ITagLink),\n contents,\n icons,\n structuredData: structuredData\n ?.map((link) => resolveSchema(context, id, link))\n .filter((item): item is ISchema => item !== null),\n ...simpleFields,\n // Note: summary field exists in Contentful but is not part of IArticle interface\n // Keeping it in simpleFields for potential future use\n menu: finalMenu,\n footer: finalFooter,\n };\n return article;\n}\n\nexport function baseArticleLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IArticleLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'article') {\n throw new Error(`Invalid content type: expected \"article\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const {\n articleType: fieldsArticleType,\n tags: fieldsTags,\n author: fieldsAuthor,\n date,\n externalLink,\n download: fieldsDownload,\n ...simpleFields\n } = fields;\n\n const articleType = resolveLink(context, sys.id, fieldsArticleType);\n const tags = fieldsTags?.map((tag) => resolveLink(context, sys.id, tag));\n const primaryTag = tags?.[0] ?? undefined;\n const author = fieldsAuthor ? resolveLink(context, sys.id, fieldsAuthor) : undefined;\n const download = lookupDownloadAsset(context, fieldsDownload);\n const href = externalLink\n ? externalLink\n : context.urlCalculators.article(articleType.slug, fields.slug, primaryTag?.slug);\n return createInternalLink(\n sys.id,\n { ...simpleFields, name: fields.cmsLabel },\n context,\n href,\n 'Article',\n {\n tags,\n primaryTag,\n articleType,\n date,\n author,\n download,\n },\n ) as IArticleLink;\n}\n\nexport function baseArticleTypeLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n): IArticleTypeLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'articleType') {\n throw new Error(\n `Invalid content type: expected \"articleType\", got \"${sys.contentType.sys.id}\"`,\n );\n }\n\n const { name, cmsLabel, featuredImage, slug, ...simpleFields } = fields;\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel,\n name,\n title: name,\n featuredImage,\n slug,\n ...simpleFields,\n },\n context,\n context.urlCalculators.articleType(slug),\n 'ArticleType',\n ) as IArticleTypeLink;\n}\n\n/**\n * Base converter for Contentful Article Type entries to IArticleType type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing includes\n * @param entry - Contentful entry to convert\n * @param customTypeEntry - Optional custom type entry that defines templates and navigation\n * @returns IBaseArticleType object\n *\n * @example\n * ```ts\n * const articleType = baseArticleTypeConverter(context, contentfulEntry, customTypeEntry);\n * ```\n */\nexport function baseArticleTypeConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n customTypeEntry?: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IBaseArticleType {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n name,\n indexPageDescription,\n indexPageTitle,\n featuredImage,\n menu: menuLink,\n footer: footerLink,\n indexPageTemplate: templateLink,\n indexPageTopContent: topContentLinks,\n structuredData,\n indexPageStructuredData,\n slug,\n ...other\n } = fields;\n\n // Resolve custom type (if provided)\n const customType = customTypeEntry\n ? context.customTypeResolver(context, customTypeEntry)\n : undefined;\n\n // Resolve template (ArticleType template > Custom Type template)\n let template = templateLink ? resolveTemplate(context, templateLink) : null;\n if (!template && customTypeEntry?.fields.template) {\n template = resolveTemplate(context, customTypeEntry.fields.template);\n }\n\n // Resolve navigation (ArticleType > Custom Type > Template)\n const menu = menuLink\n ? resolveNavigation(context, menuLink)\n : customTypeEntry?.fields.menu\n ? resolveNavigation(context, customTypeEntry.fields.menu)\n : template?.menu;\n\n const footer = footerLink\n ? resolveNavigation(context, footerLink)\n : customTypeEntry?.fields.footer\n ? resolveNavigation(context, customTypeEntry.fields.footer)\n : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n // Determine final menu and footer (articleType-level overrides template)\n const finalMenu = menu;\n const finalFooter = footer;\n\n // Collect and deduplicate all SVG icons from article type content and navigation\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(finalMenu),\n collectIconsFromNavigation(finalFooter),\n );\n\n const articleType: IBaseArticleType = {\n type: 'Article type',\n id,\n slug,\n name,\n title: makeContentfulTitle(indexPageTitle, sys.id),\n description: makeContentfulDescription(indexPageDescription, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n contentCount: 0,\n contents,\n icons,\n structuredData: [\n ...(structuredData?.map((link) => resolveSchema(context, id, link)) ?? []),\n ...(indexPageStructuredData?.map((link) => resolveSchema(context, id, link)) ?? []),\n ].filter((item): item is ISchema => item !== null),\n menu: finalMenu,\n footer: finalFooter,\n ...other,\n };\n\n if (customType) {\n // @ts-expect-error - customType is not yet in IBaseArticleType but might be added later or intersection type used\n articleType.customType = customType;\n }\n\n return articleType;\n}\n","import type { BaseCollectionContent, IBaseCollection } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport {\n type ConverterContext,\n DEFAULT_POSITION_FIELDS,\n lookupAsset,\n lookupIconAsset,\n} from './helpers';\nimport { resolveCollectionContent, resolveLink, resolveRichTextDocument } from './resolver';\n\nexport type IContentfulCollection<TContents = BaseCollectionContent> =\n IBaseCollection<TContents> & {\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n };\n\n/**\n * Base converter for Contentful Collection entries to ICollection type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns ICollection object\n *\n * @example\n * ```ts\n * const collection = baseCollectionConverter(context, contentfulEntry);\n * ```\n */\nexport function baseCollectionConverter(\n context: ConverterContext,\n entry: Entry<BaseCollectionSkeleton, DefaultChainModifier, string>,\n): IContentfulCollection {\n const { sys, fields } = entry;\n const { id } = sys;\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n contents: contentsField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n showHeading,\n heading,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const collection: IContentfulCollection = {\n type: 'Collection',\n id,\n name: cmsLabel,\n cmsLabel,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupIconAsset(context, iconField),\n backgroundVisual,\n visual,\n links: linksField?.map((link) => resolveLink(context, id, link)),\n contents: contentsField?.map((content) => resolveCollectionContent(context, id, content)),\n };\n return collection;\n}\n","import type { IBaseComponent } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport { arrayOrUndefined, notEmpty } from '../utils';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport {\n type ConverterContext,\n DEFAULT_POSITION_FIELDS,\n lookupAsset,\n lookupIconAsset,\n} from './helpers';\nimport { resolveLinks, resolveRichTextDocument } from './resolver';\n\nexport type IContentfulComponent = IBaseComponent & {\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n};\n/**\n * Base converter for Contentful Component entries to IComponent type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns IComponent object\n *\n * @example\n * ```ts\n * const component = baseComponentConverter(context, contentfulEntry);\n * ```\n */\nexport function baseComponentConverter(\n context: ConverterContext,\n entry: Entry<BaseComponentSkeleton, DefaultChainModifier, string>,\n): IContentfulComponent {\n const { sys, fields } = entry;\n const { id } = sys;\n\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n // Field name change\n showHeading,\n heading,\n otherMedia: otherMediaField,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const otherMedia = otherMediaField?.map((media) => lookupAsset(context, media));\n\n const component: IContentfulComponent = {\n type: 'Component',\n id,\n name: cmsLabel,\n cmsLabel,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupIconAsset(context, iconField),\n backgroundVisual,\n visual,\n links: resolveLinks(context, id, linksField),\n otherMedia: arrayOrUndefined(otherMedia?.filter(notEmpty)),\n };\n return component;\n}\n","import type { IBaseCustomType, IInternalLink, ISchema, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport {\n collectIconsFromContent,\n collectIconsFromNavigation,\n deduplicateIcons,\n} from './iconCollector';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent, resolveSchema } from './resolver';\nimport { resolveTemplate } from './template';\n\n/**\n * Base converter for Contentful Custom Type entries to IBaseCustomType\n *\n * Custom types represent index pages for categories like Topics or Resources.\n * They provide configuration for both the main index page and potentially\n * individual entry pages.\n *\n * @param context - Converter context containing includes and assets\n * @param entry - Contentful entry to convert\n * @returns IBaseCustomType object\n *\n * @example\n * ```ts\n * const customType = baseCustomTypeConverter(context, contentfulEntry);\n * ```\n */\nexport function baseCustomTypeConverter(\n context: ConverterContext,\n entry: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IBaseCustomType {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n name,\n slug,\n indexPageTitle,\n indexPageDescription,\n featuredImage,\n menu: menuLink,\n footer: footerLink,\n indexPageTemplate: templateLink,\n indexPageTopContent: topContentLinks,\n structuredData,\n indexPageStructuredData,\n ...other\n } = fields;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve navigation\n const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;\n const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n // Collect and deduplicate all SVG icons from custom type content and navigation\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(menu),\n collectIconsFromNavigation(footer),\n );\n\n const title = makeContentfulTitle(indexPageTitle, sys.id);\n const description = makeContentfulDescription(indexPageDescription, sys.id);\n const customType: IBaseCustomType = {\n type: 'Custom type',\n id,\n slug,\n name,\n title,\n description: description,\n featuredImage: lookupAsset(context, featuredImage),\n contentCount: 0,\n contents,\n icons,\n structuredData: [\n ...(structuredData?.map((link) => resolveSchema(context, id, link)) ?? []),\n ...(indexPageStructuredData?.map((link) => resolveSchema(context, id, link)) ?? []),\n ].filter((item): item is ISchema => item !== null),\n menu,\n footer,\n ...other,\n };\n\n return customType;\n}\n\nexport function baseCustomTypeLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'customType') {\n throw new Error(`Invalid content type: expected \"customType\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n fields,\n context,\n context.urlCalculators.customType(fields.slug),\n 'CustomType',\n );\n}\n","import type { IBaseExternalComponent } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseExternalComponentSkeleton } from '../baseTypes/baseExternalComponent';\nimport { createResponsiveVisual } from './asset';\nimport {\n type ConverterContext,\n DEFAULT_POSITION_FIELDS,\n lookupAsset,\n makeContentfulTitle,\n} from './helpers';\n\n/**\n * Base converter for Contentful ExternalComponent entries to IExternalComponent type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns IExternalComponent object\n *\n * @example\n * ```ts\n * const externalComponent = baseExternalComponentConverter(context, contentfulEntry);\n * ```\n */\nexport function baseExternalComponentConverter(\n context: ConverterContext,\n entry: Entry<BaseExternalComponentSkeleton, DefaultChainModifier, string>,\n): IBaseExternalComponent {\n const { sys, fields } = entry;\n\n const {\n cmsLabel,\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n ...simpleFields\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const externalComponent: IBaseExternalComponent = {\n type: 'External component',\n id: sys.id,\n name: makeContentfulTitle(cmsLabel, sys.id),\n cmsLabel: cmsLabel,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n backgroundVisual,\n };\n return externalComponent;\n}\n","import type {\n IBlankLink,\n IDownloadLink,\n IExternalLink,\n IInternalLink,\n} from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseLinkSkeleton } from '../baseTypes/baseLink';\nimport { createResponsiveVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset, lookupIconAsset, makeContentfulTitle, resolveBuildYear } from './helpers';\nimport { resolveLink } from './resolver';\n\n/**\n * Converts a Contentful link entry to an ILinkProps object\n * Handles all link types: internal, external, download, and blank\n */\nexport function baseLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseLinkSkeleton, DefaultChainModifier, string>,\n): IInternalLink | IExternalLink | IDownloadLink | IBlankLink {\n const { sys, fields } = entry;\n\n if (sys.contentType.sys.id !== 'link') {\n throw new Error(`Invalid content type: expected \"link\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const id = sys.id;\n const name = fields.name;\n const useName = fields.useName;\n const text = resolveBuildYear(\n useName\n ? name\n : (fields.linkText ?? makeContentfulTitle(fields.linkText, id, 'Link text for ')),\n );\n const icon = createResponsiveVisual(\n lookupIconAsset(context, fields.icon),\n lookupIconAsset(context, fields.mobileIcon),\n );\n const backgroundColour = fields.backgroundColour ?? null;\n const textColour = fields.textColour ?? null;\n const variant = fields.variant;\n const size = fields.size;\n\n // Common base properties\n const baseProps = {\n id,\n useName,\n name,\n text,\n icon,\n backgroundColour,\n textColour,\n variant,\n size,\n };\n\n // Determine link type based on field priority: internal > external > download > blank\n if (fields.internal) {\n // Internal link: resolve the target entry to get its href\n const internalTarget = resolveLink(context, id, fields.internal);\n return {\n ...baseProps,\n type: 'Internal link',\n internalType: internalTarget.internalType,\n href: internalTarget.href,\n slug: internalTarget.slug,\n indexed: internalTarget.indexed,\n hidden: internalTarget.hidden,\n tags: internalTarget.tags,\n title: internalTarget.title,\n description: internalTarget.description,\n };\n }\n\n if (fields.external) {\n // External link: use the external URL\n return {\n ...baseProps,\n type: 'External link',\n href: fields.external,\n };\n }\n\n if (fields.downloadAsset) {\n // Download link: use the asset URL\n const asset = lookupAsset(context, fields.downloadAsset);\n let href: string | null = null;\n if (asset?.image?.type === 'Picture') {\n href = asset.image.src;\n } else if (asset?.image?.type === 'Svg image') {\n href = asset.image.svgSrc;\n } else if (asset?.video) {\n if (asset.video.type === 'Local video') {\n href = asset.video.preview.videoUrl;\n } else if (asset.video.type === 'Full video') {\n href = asset.video.full.videoUrl;\n } else if (asset.video.type === 'External video') {\n href = asset.video.external;\n }\n }\n return {\n ...baseProps,\n type: 'Download link',\n href,\n visual: asset,\n };\n }\n\n // Blank link: no href\n return {\n ...baseProps,\n type: 'Blank link',\n href: null,\n };\n}\n","import type { IBasePage, IInternalLink, ISchema, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BasePageVariantSkeleton } from '../baseTypes/basePageVariant';\nimport {\n addPositionMetadata,\n type ConverterContext,\n calculateContentCount,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport {\n collectIconsFromContent,\n collectIconsFromNavigation,\n deduplicateIcons,\n} from './iconCollector';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent, resolveSchema } from './resolver';\nimport { resolveTemplate } from './template';\n\n/**\n * Base converter for Contentful Page entries to IPage type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IPage object\n *\n * @example\n * ```ts\n * const page = basePageConverter(contentfulEntry);\n * ```\n */\n\nexport function basePageConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IBasePage {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n menu: pageMenu,\n footer: pageFooter,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n structuredData,\n ...simpleFields\n } = fields;\n\n const pageMenuNav = pageMenu ? resolveNavigation(context, pageMenu) : undefined;\n const pageFooterNav = pageFooter ? resolveNavigation(context, pageFooter) : undefined;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const pageContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...pageContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n // Determine final menu and footer (page-level overrides template)\n const finalMenu = pageMenuNav ?? template?.menu;\n const finalFooter = pageFooterNav ?? template?.footer;\n\n // Collect and deduplicate all SVG icons from page content and navigation\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(finalMenu),\n collectIconsFromNavigation(finalFooter),\n );\n\n const page: IBasePage = {\n type: 'Page',\n id,\n isHomePage: slug === 'index',\n slug,\n name: title,\n title: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n featuredImage: lookupAsset(context, featuredImage),\n tags: tags?.map((tag) => resolveLink(context, id, tag)),\n contentCount: calculateContentCount(topContent, pageContent, bottomContent),\n contents,\n icons,\n structuredData: structuredData\n ?.map((link) => resolveSchema(context, id, link))\n .filter((item): item is ISchema => item !== null),\n ...simpleFields,\n menu: finalMenu,\n footer: finalFooter,\n };\n return page;\n}\n\nexport function calculatePageHref(slug: string) {\n if (slug === 'index') {\n return '/';\n }\n return `/${slug}/`;\n}\n\nexport function basePageLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'page') {\n throw new Error(`Invalid content type: expected \"page\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n ...fields,\n name: fields.cmsLabel,\n },\n context,\n context.urlCalculators.page(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n\n/**\n * Calculates the href for a page variant page\n * @param slug - Page variant slug\n * @returns Page variant href path with trailing slash\n */\nexport function calculatePageVariantHref(slug: string) {\n return `/${slug}/`;\n}\n\n/**\n * Base converter for PageVariant entries to IInternalLink type\n * Used when a page variant is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful page variant entry to convert\n * @returns IInternalLink object representing the page variant link\n *\n * @example\n * ```ts\n * const pageVariantLink = basePageVariantLinkConverter(context, pageVariantEntry);\n * ```\n */\nexport function basePageVariantLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageVariantSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'pageVariant') {\n throw new Error(`Invalid content type: expected \"pageVariant\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n ...fields,\n name: fields.cmsLabel,\n },\n context,\n context.urlCalculators.pageVariant(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n","import type {\n BaseModelLinkOmissions,\n IBasePerson,\n IInternalLink,\n ISchema,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport {\n addPositionMetadata,\n type ConverterContext,\n calculateContentCount,\n createInternalLink,\n lookupAsset,\n makeContentfulTitle,\n} from './helpers';\nimport {\n collectIconsFromContent,\n collectIconsFromNavigation,\n deduplicateIcons,\n} from './iconCollector';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent, resolveRichTextDocument, resolveSchema } from './resolver';\nimport { resolveTemplate } from './template';\n\nexport type IContentfulPerson = IBasePerson & {\n bio?: IContentfulRichText | null;\n};\n\nexport type ContentfulPersonLink = Omit<\n IContentfulPerson,\n BaseModelLinkOmissions | 'structuredData' | 'contents' | 'customType'\n>;\n\n/**\n * Base converter for Person entries to IInternalLink type\n * Used when a person is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @returns IInternalLink object representing the person link\n *\n * @example\n * ```ts\n * const personLink = basePersonLinkConverter(context, personEntry);\n * ```\n */\nexport function basePersonLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n const {\n name,\n bio: fieldsBio,\n jobTitle,\n phoneNumber,\n emailAddress,\n linkedIn,\n location,\n media,\n ...simpleFields\n } = fields;\n if (sys.contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const title = makeContentfulTitle(name, sys.id);\n\n return createInternalLink(\n sys.id,\n {\n ...simpleFields,\n name,\n title,\n featuredImage: media,\n cmsLabel: title,\n },\n context,\n context.urlCalculators.person(fields.slug),\n 'Person',\n {\n bio: resolveRichTextDocument(context, sys.id, fieldsBio),\n jobTitle,\n phoneNumber,\n emailAddress,\n linkedIn,\n location,\n },\n );\n}\n\n/**\n * Base converter for Person entries to IPerson type\n * Used when a complete person object with bio and content is needed\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @param customTypeEntry - Optional custom type entry that defines templates and navigation\n * @returns IPerson object representing the complete person\n *\n * @example\n * ```ts\n * const person = basePersonConverter(context, personEntry, customTypeEntry);\n * ```\n */\nexport function basePersonConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n customTypeEntry?: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IContentfulPerson {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${contentType.sys.id}\"`);\n }\n const {\n slug,\n name,\n description,\n media,\n bio: bioField,\n content: contentLinks,\n structuredData,\n ...rest\n } = fields;\n\n // Resolve custom type (if provided)\n const customType = customTypeEntry\n ? context.customTypeResolver(context, customTypeEntry)\n : undefined;\n\n // Resolve template from custom type (if provided)\n const template = customTypeEntry?.fields.template\n ? resolveTemplate(context, customTypeEntry.fields.template)\n : null;\n\n // Resolve content sections\n const personContent =\n contentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...preContent, ...personContent, ...postContent]);\n\n // Resolve navigation (template level or from custom type)\n // Note: Person doesn't have direct menu/footer overrides, so we rely on the custom type/template\n const menu = customTypeEntry?.fields.menu\n ? resolveNavigation(context, customTypeEntry.fields.menu)\n : template?.menu;\n const footer = customTypeEntry?.fields.footer\n ? resolveNavigation(context, customTypeEntry.fields.footer)\n : template?.footer;\n\n // Collect and deduplicate all SVG icons\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(menu),\n collectIconsFromNavigation(footer),\n );\n\n return {\n type: 'Person',\n id,\n slug,\n name,\n title: makeContentfulTitle(name, id),\n description: description ?? `Description for ${id}`,\n featuredImage: lookupAsset(context, media), // Person uses 'media' not 'featuredImage'\n href: context.urlCalculators.person(slug),\n bio: resolveRichTextDocument(context, id, bioField) ?? null,\n contentCount: calculateContentCount(personContent),\n contents,\n menu,\n footer,\n icons,\n customType,\n structuredData: structuredData\n ?.map((link) => resolveSchema(context, id, link))\n .filter((item): item is ISchema => item !== null),\n ...rest,\n };\n}\n","import type { IBaseTag, IInternalLink, ISchema, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport {\n addPositionMetadata,\n type ConverterContext,\n calculateContentCount,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport {\n collectIconsFromContent,\n collectIconsFromNavigation,\n deduplicateIcons,\n} from './iconCollector';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent, resolveSchema } from './resolver';\nimport { resolveTemplate } from './template';\n\nexport function baseTagLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseTagSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n const { name, cmsLabel, ...simpleFields } = fields;\n if (sys.contentType.sys.id !== 'tag') {\n throw new Error(`Invalid content type: expected \"tag\", got \"${sys.contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n sys.id,\n {\n ...simpleFields,\n cmsLabel,\n name,\n useName: false,\n title: name,\n },\n context,\n context.urlCalculators.tag(fields.slug),\n 'Tag',\n );\n}\n\n/**\n * Base converter for Contentful Tag entries to IBaseTag type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing includes and assets\n * @param entry - Contentful entry to convert\n * @param customTypeEntry - Optional custom type entry that defines templates and navigation\n * @returns IBaseTag object\n *\n * @example\n * ```ts\n * const tag = baseTagConverter(context, contentfulEntry, customTypeEntry);\n * ```\n */\nexport function baseTagConverter(\n context: ConverterContext,\n entry: Entry<BaseTagSkeleton, DefaultChainModifier, string>,\n customTypeEntry?: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IBaseTag {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n name,\n slug,\n description,\n featuredImage,\n tagType,\n menu: menuLink,\n footer: footerLink,\n template: templateLink,\n topContent: topContentLinks,\n structuredData,\n ...rest\n } = fields;\n\n // Resolve custom type (if provided)\n const customType = customTypeEntry\n ? context.customTypeResolver(context, customTypeEntry)\n : undefined;\n\n // Resolve template (Tag template > Custom Type template)\n let template = templateLink ? resolveTemplate(context, templateLink) : null;\n if (!template && customTypeEntry?.fields.template) {\n template = resolveTemplate(context, customTypeEntry.fields.template);\n }\n\n // Resolve navigation (Tag > Custom Type > Template)\n const menu = menuLink\n ? resolveNavigation(context, menuLink)\n : customTypeEntry?.fields.menu\n ? resolveNavigation(context, customTypeEntry.fields.menu)\n : template?.menu;\n\n const footer = footerLink\n ? resolveNavigation(context, footerLink)\n : customTypeEntry?.fields.footer\n ? resolveNavigation(context, customTypeEntry.fields.footer)\n : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n // Collect and deduplicate all SVG icons from tag content and navigation\n const icons = deduplicateIcons(\n collectIconsFromContent(contents),\n collectIconsFromNavigation(menu),\n collectIconsFromNavigation(footer),\n );\n\n // Resolve tag type name if available\n const tagTypeEntry = tagType ? context.includes.get(tagType.sys.id) : null;\n const tagTypeName = tagTypeEntry?.entry?.fields?.name as string | undefined;\n\n const tag: IBaseTag = {\n type: 'Tag',\n id,\n slug,\n name,\n title: makeContentfulTitle(name, sys.id),\n description: makeContentfulDescription(description, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n tagType: tagTypeName ?? null,\n contentCount: calculateContentCount(topContent),\n contents,\n icons,\n structuredData: structuredData\n ?.map((link) => resolveSchema(context, id, link))\n .filter((item): item is ISchema => item !== null),\n ...rest,\n menu,\n footer,\n };\n\n if (customType) {\n // @ts-expect-error - customType is not yet in IBaseTag but might be added later or intersection type used\n tag.customType = customType;\n }\n\n return tag;\n}\n","import type { IArticleLink, IArticleTypeLink } from '@se-studio/core-data-types';\nimport {\n baseArticleConverter,\n baseArticleLinkConverter,\n baseArticleTypeConverter,\n baseArticleTypeLinkConverter,\n} from '../converters/article';\nimport { baseCollectionConverter } from '../converters/collection';\nimport { baseComponentConverter } from '../converters/component';\nimport { baseCustomTypeConverter, baseCustomTypeLinkConverter } from '../converters/customType';\nimport { baseExternalComponentConverter } from '../converters/externalComponent';\nimport type {\n BaseConverterContext,\n ContentResolverFunction,\n ContentResolverMap,\n LinkResolverFunction,\n LinkResolverMap,\n UrlCalculators,\n} from '../converters/helpers';\nimport { baseLinkConverter } from '../converters/link';\nimport { baseNavigationItemConverter } from '../converters/navigationItem';\nimport {\n basePageConverter,\n basePageLinkConverter,\n basePageVariantLinkConverter,\n} from '../converters/page';\nimport { basePersonConverter, basePersonLinkConverter } from '../converters/person';\nimport { baseTagConverter, baseTagLinkConverter } from '../converters/tag';\n\n/**\n * Creates a base converter context with default resolvers for all content types.\n *\n * Sets up default converters for:\n * - Pages, Articles, Article Types\n * - Components, Collections, External Components\n * - Links (pages, articles, tags, people, etc.)\n * - Navigation items\n *\n * Projects can extend this context with custom resolvers for specific content types.\n *\n * @returns Base converter context with all default resolvers configured\n *\n * @example\n * ```ts\n * const context = createBaseConverterContext();\n *\n * // Use with API functions\n * const page = await contentfulPageRest(context, config, 'home');\n * ```\n */\nexport function createBaseConverterContext(urlCalculators: UrlCalculators): BaseConverterContext {\n const linkResolver: LinkResolverMap = new Map();\n linkResolver.set('page', basePageLinkConverter as LinkResolverFunction);\n linkResolver.set('article', baseArticleLinkConverter as LinkResolverFunction<IArticleLink>);\n linkResolver.set(\n 'articleType',\n baseArticleTypeLinkConverter as LinkResolverFunction<IArticleTypeLink>,\n );\n linkResolver.set('tag', baseTagLinkConverter as LinkResolverFunction);\n linkResolver.set('person', basePersonLinkConverter as LinkResolverFunction);\n linkResolver.set('pageVariant', basePageVariantLinkConverter as LinkResolverFunction);\n linkResolver.set('link', baseLinkConverter as LinkResolverFunction);\n linkResolver.set('customType', baseCustomTypeLinkConverter as LinkResolverFunction);\n\n const contentResolver: ContentResolverMap = new Map();\n contentResolver.set('collection', baseCollectionConverter as ContentResolverFunction);\n contentResolver.set('component', baseComponentConverter as ContentResolverFunction);\n contentResolver.set(\n 'externalComponent',\n baseExternalComponentConverter as ContentResolverFunction,\n );\n\n return {\n pageResolver: basePageConverter,\n navigationItemResolver: baseNavigationItemConverter,\n articleResolver: baseArticleConverter,\n articleTypeResolver: baseArticleTypeConverter,\n tagResolver: baseTagConverter,\n personResolver: basePersonConverter,\n customTypeResolver: baseCustomTypeConverter,\n componentResolver: baseComponentConverter,\n collectionResolver: baseCollectionConverter,\n linkResolver,\n contentResolver,\n urlCalculators,\n videoPrefix: '',\n };\n}\n","import type { IBaseCustomType } from '@se-studio/core-data-types';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches a custom type from Contentful by slug\n *\n * Custom types represent index pages for categories like Topics or Resources.\n * They provide configuration for both the main index page and potentially\n * individual entry pages.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Custom type's slug to fetch (e.g., 'topics', 'resources')\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseCustomType or null if not found\n *\n * @example\n * ```ts\n * const customType = await contentfulCustomTypeRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'topics',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['topics-custom-type'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulCustomTypeRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options: FetchOptions,\n): Promise<CmsResponse<IBaseCustomType | null>> {\n return fetchSingleEntity<BaseCustomTypeSkeleton, IBaseCustomType>(\n context,\n config,\n {\n contentType: 'customType',\n cacheTagType: 'customType',\n cacheTagIdentifier: slug,\n query: { 'fields.slug': slug },\n resolver: (ctx, entry) => ctx.customTypeResolver(ctx, entry),\n errorLogContext: { slug },\n },\n options,\n );\n}\n","import type { IArticleLink, IArticleTypeLink, IInternalLink } from '@se-studio/core-data-types';\nimport { getContentfulClient } from '../client';\nimport { baseArticleLinkConverter, baseArticleTypeLinkConverter } from '../converters/article';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport { basePageLinkConverter } from '../converters/page';\nimport { basePersonLinkConverter } from '../converters/person';\nimport { baseTagLinkConverter } from '../converters/tag';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport {\n ARTICLE_LINK_FIELDS,\n ARTICLE_TYPE_LINK_FIELDS,\n fetchAllLinks,\n PAGE_LINK_FIELDS,\n PERSON_LINK_FIELDS,\n TAG_LINK_FIELDS,\n} from './helpers';\n\n/**\n * Fetches all page links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of page links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPageLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful page links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPageLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request - use page collection tag\n const cacheTags = getCacheTags('page', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'page',\n client,\n requestOptions,\n basePageLinkConverter,\n context,\n 100,\n PAGE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n): Promise<CmsResponse<IArticleLink[]>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request - use article collection tag\n const cacheTags = getCacheTags('article', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'article',\n client,\n requestOptions,\n baseArticleLinkConverter,\n context,\n 100,\n ARTICLE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all tag links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of tag links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllTagLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful tag links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllTagLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request - use tag collection tag\n const cacheTags = getCacheTags('tag', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'tag',\n client,\n requestOptions,\n baseTagLinkConverter,\n context,\n 100,\n TAG_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all person links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of person links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPersonLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful person links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPersonLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request - use person collection tag\n const cacheTags = getCacheTags('person', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'person',\n client,\n requestOptions,\n basePersonLinkConverter,\n context,\n 100,\n PERSON_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article type links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article type links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleTypeLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article type links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleTypeLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options: FetchOptions,\n): Promise<CmsResponse<IArticleTypeLink[]>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request - use articleType collection tag\n const cacheTags = getCacheTags('articleType', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'articleType',\n client,\n requestOptions,\n baseArticleTypeLinkConverter,\n context,\n 100,\n ARTICLE_TYPE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n","import type { IBasePage } from '@se-studio/core-data-types';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches a page from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Page slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBasePage or null if not found\n *\n * @example\n * ```ts\n * const page = await contentfulPageRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'home',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['home-page'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulPageRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options: FetchOptions,\n): Promise<CmsResponse<IBasePage | null>> {\n return fetchSingleEntity<BasePageSkeleton, IBasePage>(\n context,\n config,\n {\n contentType: 'page',\n cacheTagType: 'page',\n cacheTagIdentifier: slug,\n query: { 'fields.slug': slug },\n resolver: (ctx, entry) => ctx.pageResolver(ctx, entry),\n errorLogContext: { slug },\n },\n options,\n );\n}\n","import type { Entry } from 'contentful';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport { getContentfulClient } from '../client';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { processIconsForSprite } from '../converters/iconCollector';\nimport type { IContentfulPerson } from '../converters/person';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport { convertAllAssets, convertAllIncludes, convertAllRawAssets } from './helpers';\nimport type { DefaultChainModifier } from './types';\n\nexport interface PersonFetchOptions extends FetchOptions {\n customType?: string;\n}\n\n/**\n * Fetches a person from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Person slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IContentfulPerson or null if not found\n *\n * @example\n * ```ts\n * const person = await contentfulPersonRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'john-doe',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['person#john-doe'],\n * revalidate: 3600\n * },\n * customType: 'team-member' // Optional custom type for templates\n * }\n * );\n * ```\n */\nexport async function contentfulPersonRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options: PersonFetchOptions,\n): Promise<CmsResponse<IContentfulPerson | null>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request\n const personCacheTags = getCacheTags('person', slug, options?.preview);\n const customTypeCacheTags = options?.customType\n ? getCacheTags('customType', options.customType, options?.preview)\n : [];\n\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: [...personCacheTags, ...customTypeCacheTags],\n },\n };\n\n const fetchFn = async () => {\n const personPromise = client.getEntries<BasePersonSkeleton>(\n {\n content_type: 'person',\n 'fields.slug': slug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const customTypePromise = options?.customType\n ? client.getEntries<BaseCustomTypeSkeleton>(\n {\n content_type: 'customType',\n 'fields.slug': options.customType,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n )\n : Promise.resolve(null);\n\n const [personResponse, customTypeResponse] = await Promise.all([\n personPromise,\n customTypePromise,\n ]);\n\n const personEntry = personResponse.items[0] as\n | Entry<BasePersonSkeleton, DefaultChainModifier, string>\n | undefined;\n\n if (!personEntry || !personEntry.fields) {\n return { data: null, errors: [] };\n }\n\n const customTypeEntry = customTypeResponse?.items[0] as\n | Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>\n | undefined;\n\n try {\n const assets = convertAllAssets(personResponse, context);\n const rawAssets = convertAllRawAssets(personResponse);\n const includes = convertAllIncludes(personResponse);\n\n if (customTypeResponse) {\n const customAssets = convertAllAssets(customTypeResponse, context);\n const customRawAssets = convertAllRawAssets(customTypeResponse);\n const customIncludes = convertAllIncludes(customTypeResponse);\n\n for (const [key, value] of customAssets) assets.set(key, value);\n for (const [key, value] of customRawAssets) rawAssets.set(key, value);\n for (const [key, value] of customIncludes) includes.set(key, value);\n }\n\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n rawAssets,\n errors: [],\n };\n\n const converted = context.personResolver(fullContext, personEntry, customTypeEntry);\n\n // Process icons if the result has an icons field (e.g., IBasePage)\n if (converted?.icons && converted.icons.length > 0) {\n const processedIcons = await processIconsForSprite(converted.icons);\n converted.icons = processedIcons.length > 0 ? processedIcons : undefined;\n }\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error(`CMS conversion errors for person:`, {\n entryId: personEntry.sys.id,\n slug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = personEntry?.sys.id || 'unknown';\n const entryType = personEntry?.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n","/**\n * Preview page utilities for Contentful\n *\n * Provides functionality to look up an entry by ID and calculate the\n * appropriate URL for preview redirects.\n */\n\nimport { getContentfulClient } from '../client';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { ContentfulConfig, FetchOptions } from '../types';\n\n/**\n * Supported content types for preview lookup\n */\nexport type PreviewContentType =\n | 'page'\n | 'pageVariant'\n | 'article'\n | 'articleType'\n | 'tag'\n | 'person'\n | 'customType';\n\n/**\n * Information about an entry for preview purposes\n */\nexport interface PreviewEntryInfo {\n /** The content type of the entry */\n contentType: PreviewContentType;\n /** The Contentful entry ID */\n entryId: string;\n /** The slug of the entry */\n slug: string;\n /** For articles, the article type's slug (needed for URL calculation) */\n articleTypeSlug?: string;\n /** The calculated URL for this entry */\n href: string;\n}\n\n/**\n * Raw entry structure from Contentful API response\n */\ninterface RawEntry {\n sys: {\n id: string;\n contentType: {\n sys: {\n id: string;\n };\n };\n };\n fields: {\n slug?: string;\n articleType?: {\n sys: {\n id: string;\n };\n fields?: {\n slug?: string;\n };\n };\n };\n}\n\n/**\n * Looks up a Contentful entry by ID and returns information needed for preview redirect.\n *\n * Makes a single API call to fetch the entry by ID, determines its content type,\n * extracts the relevant slug fields, and calculates the URL using the context's\n * URL calculators.\n *\n * @param context - Base converter context containing URL calculators\n * @param config - Contentful configuration (spaceId, accessToken, etc.)\n * @param entryId - The Contentful entry ID to look up\n * @param options - Optional fetch options (preview mode is always enabled for this function)\n * @returns PreviewEntryInfo with content type, slug, and calculated href, or null if not found\n *\n * @example\n * ```ts\n * const context = createBaseConverterContext();\n * const info = await getPreviewEntryInfo(\n * context,\n * { spaceId: '...', accessToken: '...' },\n * 'abc123'\n * );\n * if (info) {\n * redirect(info.href);\n * }\n * ```\n */\nexport async function getPreviewEntryInfo(\n context: BaseConverterContext,\n config: ContentfulConfig,\n entryId: string,\n options?: Omit<FetchOptions, 'preview'>,\n): Promise<PreviewEntryInfo | null> {\n // Always use preview API for preview lookups\n const client = getContentfulClient(config, true);\n\n const response = await client.getEntries<RawEntry>(\n {\n 'sys.id': entryId,\n include: 1, // Need 1 level for Article → ArticleType slug\n },\n {\n ...options,\n preview: true,\n },\n );\n\n const entry = response.items[0];\n if (!entry) {\n return null;\n }\n\n const contentTypeId = entry.sys.contentType.sys.id;\n const { fields } = entry;\n\n // Map Contentful content type ID to our PreviewContentType\n // and extract the relevant slug and calculate href\n switch (contentTypeId) {\n case 'page': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'page',\n entryId,\n slug,\n href: context.urlCalculators.page(slug),\n };\n }\n\n case 'pageVariant': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'pageVariant',\n entryId,\n slug,\n href: context.urlCalculators.pageVariant(slug),\n };\n }\n\n case 'article': {\n const slug = fields.slug;\n // For articles, we need the articleType's slug from the included entry\n const articleTypeSlug = getArticleTypeSlug(entry, response.includes?.Entry);\n if (!slug || !articleTypeSlug) return null;\n return {\n contentType: 'article',\n entryId,\n slug,\n articleTypeSlug,\n href: context.urlCalculators.article(articleTypeSlug, slug),\n };\n }\n\n case 'articleType': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'articleType',\n entryId,\n slug,\n href: context.urlCalculators.articleType(slug),\n };\n }\n\n case 'tag': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'tag',\n entryId,\n slug,\n href: context.urlCalculators.tag(slug),\n };\n }\n\n case 'person': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'person',\n entryId,\n slug,\n href: context.urlCalculators.person(slug),\n };\n }\n\n case 'customType': {\n const slug = fields.slug;\n if (!slug) return null;\n return {\n contentType: 'customType',\n entryId,\n slug,\n href: context.urlCalculators.customType(slug),\n };\n }\n\n default:\n // Unknown content type - not supported for preview\n return null;\n }\n}\n\n/**\n * Extracts the article type slug from an article entry.\n * Looks in the entry's articleType field, falling back to includes if needed.\n */\nfunction getArticleTypeSlug(entry: RawEntry, includes: RawEntry[] | undefined): string | undefined {\n // First, check if articleType is resolved in the entry\n const articleTypeField = entry.fields.articleType;\n if (!articleTypeField) {\n return undefined;\n }\n\n // If the articleType has fields (resolved), get slug from there\n if (articleTypeField.fields?.slug) {\n return articleTypeField.fields.slug;\n }\n\n // Otherwise, look it up in includes\n const articleTypeId = articleTypeField.sys?.id;\n if (!articleTypeId || !includes) {\n return undefined;\n }\n\n const articleTypeEntry = includes.find((inc) => inc.sys.id === articleTypeId);\n return articleTypeEntry?.fields?.slug as string | undefined;\n}\n","import type { IArticleLink } from '@se-studio/core-data-types';\nimport type { RelatedArticlesOptions } from './types';\n\n/**\n * Filters and ranks articles based on related article criteria.\n * Articles with more matching tags are ranked higher.\n *\n * @param articles - Array of article links with metadata\n * @param options - Filtering options\n * @returns Filtered and ranked array of article links\n *\n * @example\n * ```ts\n * const relatedArticles = filterRelatedArticles(allArticles, {\n * articleTypeIds: ['blog-type-id'],\n * tagIds: ['tag-1', 'tag-2'],\n * excludeArticleIds: [currentArticle.id],\n * count: 3,\n * });\n * ```\n */\nexport function filterRelatedArticles(\n articles: IArticleLink[],\n options: RelatedArticlesOptions,\n): IArticleLink[] {\n const {\n excludeArticleIds,\n articleTypeIds: rawArticleTypeIds,\n tagIds: rawTagIds,\n authorIds: rawAuthorIds,\n before,\n after,\n count,\n } = options;\n\n // Extract and deduplicate IDs from link objects\n const excludeIds = excludeArticleIds ? [...new Set(excludeArticleIds)] : [];\n const articleTypeIds = rawArticleTypeIds ? [...new Set(rawArticleTypeIds)] : [];\n const tagIds = rawTagIds ? [...new Set(rawTagIds)] : [];\n const authorIds = rawAuthorIds ? [...new Set(rawAuthorIds)] : [];\n\n // Score and filter articles\n const scoredArticles = articles\n .map((article) => {\n let score = 0;\n\n // Filter: Exclude specific articles\n if (excludeIds.length > 0 && excludeIds.includes(article.id)) {\n return null;\n }\n\n // Filter: Article type (match any of the provided types)\n if (articleTypeIds.length > 0) {\n if (!article.articleType?.id || !articleTypeIds.includes(article.articleType.id)) {\n return null;\n }\n }\n\n // Filter: Date range\n if (article.date) {\n const articleDate = new Date(article.date);\n if (before && articleDate > before) {\n return null;\n }\n if (after && articleDate < after) {\n return null;\n }\n }\n\n // Score: Tag matching (more matches = higher score)\n if (tagIds.length > 0 && article.tags) {\n const articleTagIds = article.tags.map((tag) => tag.id);\n const matchingTags = tagIds.filter((tagId) => articleTagIds.includes(tagId));\n score += matchingTags.length * 10; // Each matching tag adds 10 points\n }\n\n // Score: Author matching (match any of the provided authors)\n if (authorIds.length > 0 && article.author?.id) {\n if (authorIds.includes(article.author.id)) {\n score += 5; // Matching author adds 5 points\n }\n }\n\n return { article, score };\n })\n .filter((item): item is { article: IArticleLink; score: number } => item !== null);\n\n // Sort by score (descending), then by date (descending)\n scoredArticles.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n // If scores are equal, sort by date (newest first)\n if (a.article.date && b.article.date) {\n const articleDateA = new Date(a.article.date);\n const articleDateB = new Date(b.article.date);\n return articleDateB.getTime() - articleDateA.getTime();\n }\n return 0;\n });\n\n // Take top N articles (or all if count is undefined)\n const topArticles = count !== undefined ? scoredArticles.slice(0, count) : scoredArticles;\n\n return topArticles.map(({ article }) => article);\n}\n","import type { IInternalLink } from '@se-studio/core-data-types';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport {\n contentfulAllArticleLinks,\n contentfulAllArticleTypeLinks,\n contentfulAllPageLinks,\n contentfulAllPersonLinks,\n contentfulAllTagLinks,\n} from './links';\nimport type {\n ISitemapEntry,\n SitemapConfig,\n SitemapContentTypeConfig,\n SitemapEntryProvider,\n} from './types';\n\n// ============================================================================\n// Sitemap Entry Helpers\n// ============================================================================\n\n/**\n * Helper function to convert internal links to sitemap entries.\n * Filters to only include indexed and non-hidden entries.\n *\n * @param links - Array of internal links with metadata\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns Array of sitemap entries\n */\nfunction linksToSitemapEntries(\n links: IInternalLink[],\n sitemapConfig?: SitemapContentTypeConfig,\n): ISitemapEntry[] {\n return links\n .filter((link) => link.indexed !== false && link.hidden !== true && link.href)\n .map((link) => ({\n url: link.href as string,\n lastModified: link.lastModified,\n changeFrequency: sitemapConfig?.changeFrequency,\n priority: sitemapConfig?.priority,\n }));\n}\n\n// ============================================================================\n// Sitemap Entry Fetchers\n// ============================================================================\n\n/**\n * Fetches all page sitemap entries from Contentful.\n * Only includes pages that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulPageSitemapEntries(\n * context,\n * config,\n * { priority: 0.8, changeFrequency: 'weekly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulPageSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPageLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article sitemap entries from Contentful.\n * Only includes articles that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulArticleSitemapEntries(\n * context,\n * config,\n * { priority: 0.6, changeFrequency: 'monthly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulArticleSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article type sitemap entries from Contentful.\n * Only includes article types that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulArticleTypeSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleTypeLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all tag sitemap entries from Contentful.\n * Only includes tags that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulTagSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllTagLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all person sitemap entries from Contentful.\n * Only includes people that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulPersonSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPersonLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n// ============================================================================\n// Sitemap Registry Functions\n// ============================================================================\n\n/**\n * Collects sitemap entries from multiple providers.\n * This allows projects to register custom content types for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Configuration with array of provider functions\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with all sitemap entries combined\n *\n * @example\n * ```ts\n * const { data: entries, errors } = await getAllSitemapEntries(\n * context,\n * config,\n * {\n * providers: [\n * (ctx, cfg, opts) => contentfulPageSitemapEntries(ctx, cfg, { priority: 0.8 }, opts),\n * (ctx, cfg, opts) => contentfulArticleSitemapEntries(ctx, cfg, { priority: 0.6 }, opts),\n * // Custom content type provider\n * async (ctx, cfg, opts) => {\n * const links = await fetchCustomContentLinks(ctx, cfg, opts);\n * return { data: links.map(l => ({ url: l.href, lastModified: l.lastModified })), errors: [] };\n * },\n * ],\n * },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function getAllSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapConfig,\n options: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const allEntries: ISitemapEntry[] = [];\n const allErrors: CmsError[] = [];\n\n // Fetch from all providers in parallel for better performance\n const results = await Promise.all(\n sitemapConfig.providers.map((provider) => provider(context, config, options)),\n );\n\n // Combine all results\n for (const result of results) {\n allEntries.push(...result.data);\n allErrors.push(...result.errors);\n }\n\n return { data: allEntries, errors: allErrors };\n}\n\n/**\n * Creates a sitemap entry provider with pre-configured options.\n * Useful for creating providers with specific priority and changeFrequency settings.\n *\n * @param fetcher - The sitemap entry fetcher function to wrap\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns A sitemap entry provider function\n *\n * @example\n * ```ts\n * const pageProvider = createSitemapProvider(\n * contentfulPageSitemapEntries,\n * { priority: 0.8, changeFrequency: 'weekly' }\n * );\n *\n * const { data: entries } = await getAllSitemapEntries(context, config, {\n * providers: [pageProvider, articleProvider],\n * });\n * ```\n */\nexport function createSitemapProvider(\n fetcher: (\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapContentTypeConfig,\n options: FetchOptions,\n ) => Promise<CmsResponse<ISitemapEntry[]>>,\n sitemapConfig: SitemapContentTypeConfig,\n): SitemapEntryProvider {\n return (context, config, options) => fetcher(context, config, sitemapConfig, options);\n}\n","import type { IBaseTag } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport { getContentfulClient } from '../client';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { processIconsForSprite } from '../converters/iconCollector';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport { convertAllAssets, convertAllIncludes, convertAllRawAssets } from './helpers';\nimport type { DefaultChainModifier } from './types';\n\nexport interface TagFetchOptions extends FetchOptions {\n customType?: string;\n}\n\n/**\n * Fetches a tag from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Tag slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseTag or null if not found\n *\n * @example\n * ```ts\n * const tag = await contentfulTagRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'my-tag',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['my-tag'],\n * revalidate: 3600\n * },\n * customType: 'topics' // Optional custom type\n * }\n * );\n * ```\n */\nexport async function contentfulTagRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options: TagFetchOptions,\n): Promise<CmsResponse<IBaseTag | null>> {\n const client = getContentfulClient(config, options.preview);\n\n // Set cache tags for this request\n const tagCacheTags = getCacheTags('tag', slug, options?.preview);\n const customTypeCacheTags = options?.customType\n ? getCacheTags('customType', options.customType, options?.preview)\n : [];\n\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: [...tagCacheTags, ...customTypeCacheTags],\n },\n };\n\n const fetchFn = async () => {\n const tagPromise = client.getEntries<BaseTagSkeleton>(\n {\n content_type: 'tag',\n 'fields.slug': slug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const customTypePromise = options?.customType\n ? client.getEntries<BaseCustomTypeSkeleton>(\n {\n content_type: 'customType',\n 'fields.slug': options.customType,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n )\n : Promise.resolve(null);\n\n const [tagResponse, customTypeResponse] = await Promise.all([tagPromise, customTypePromise]);\n\n const tagEntry = tagResponse.items[0] as\n | Entry<BaseTagSkeleton, DefaultChainModifier, string>\n | undefined;\n\n if (!tagEntry || !tagEntry.fields) {\n return { data: null, errors: [] };\n }\n\n const customTypeEntry = customTypeResponse?.items[0] as\n | Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>\n | undefined;\n\n try {\n const assets = convertAllAssets(tagResponse, context);\n const rawAssets = convertAllRawAssets(tagResponse);\n const includes = convertAllIncludes(tagResponse);\n\n if (customTypeResponse) {\n const customAssets = convertAllAssets(customTypeResponse, context);\n const customRawAssets = convertAllRawAssets(customTypeResponse);\n const customIncludes = convertAllIncludes(customTypeResponse);\n\n for (const [key, value] of customAssets) assets.set(key, value);\n for (const [key, value] of customRawAssets) rawAssets.set(key, value);\n for (const [key, value] of customIncludes) includes.set(key, value);\n }\n\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n rawAssets,\n errors: [],\n };\n\n const converted = context.tagResolver(fullContext, tagEntry, customTypeEntry);\n\n // Process icons if the result has an icons field\n if (converted?.icons && converted.icons.length > 0) {\n const processedIcons = await processIconsForSprite(converted.icons);\n converted.icons = processedIcons.length > 0 ? processedIcons : undefined;\n }\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error(`CMS conversion errors for tag:`, {\n entryId: tagEntry.sys.id,\n slug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = tagEntry?.sys.id || 'unknown';\n const entryType = tagEntry?.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n","import type { INavigation, ISvgImage, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { BaseTemplateSkeleton } from '../baseTypes/baseTemplate';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { collectIconsFromContent, collectIconsFromNavigation } from '../converters/iconCollector';\nimport { resolveNavigation } from '../converters/navigationItem';\nimport { resolvePageContent } from '../converters/resolver';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\nimport type { DefaultChainModifier } from './types';\n\n/**\n * Fetched template data structure\n * Extends the resolved template with id and label for direct fetching\n */\nexport interface IFetchedTemplate {\n id: string;\n cmsLabel: string;\n preContent: ReadonlyArray<ITyped>;\n postContent: ReadonlyArray<ITyped>;\n menu?: INavigation;\n footer?: INavigation;\n backgroundColour?: string;\n textColour?: string;\n stickyNav: boolean;\n icons?: ReadonlyArray<ISvgImage>;\n}\n\n/**\n * Converts a template entry to IFetchedTemplate\n */\nfunction templateConverter(\n context: ConverterContext,\n entry: Entry<BaseTemplateSkeleton, DefaultChainModifier, string>,\n): IFetchedTemplate {\n const { fields, sys } = entry;\n const id = sys.id;\n\n // Resolve content arrays\n const preContent =\n fields.preContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n const postContent =\n fields.postContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n // Resolve navigation entries\n const menu = fields.menu ? resolveNavigation(context, fields.menu) : undefined;\n const footer = fields.footer ? resolveNavigation(context, fields.footer) : undefined;\n\n // Check for sticky nav flag\n const stickyNav = fields.flags?.includes('Sticky nav') ?? false;\n\n // Collect all SVG icons from template content and navigation\n const contentIcons = collectIconsFromContent([...preContent, ...postContent]);\n const menuIcons = collectIconsFromNavigation(menu);\n const footerIcons = collectIconsFromNavigation(footer);\n\n // Merge and deduplicate icons by ID\n const allIcons = [...contentIcons, ...menuIcons, ...footerIcons];\n const seenIconIds = new Set<string>();\n const icons = allIcons.filter((icon) => {\n if (seenIconIds.has(icon.id)) {\n return false;\n }\n seenIconIds.add(icon.id);\n return true;\n });\n\n return {\n id,\n cmsLabel: fields.cmsLabel,\n preContent,\n postContent,\n menu,\n footer,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n stickyNav,\n icons: icons.length > 0 ? icons : undefined,\n };\n}\n\n/**\n * Fetches a template from Contentful by cmsLabel\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param cmsLabel - Template cmsLabel to fetch (e.g., '404')\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IFetchedTemplate or null if not found\n *\n * @example\n * ```ts\n * const template = await contentfulTemplateRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * '404',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['template#404'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulTemplateRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n cmsLabel: string,\n options: FetchOptions,\n): Promise<CmsResponse<IFetchedTemplate | null>> {\n return fetchSingleEntity<BaseTemplateSkeleton, IFetchedTemplate>(\n context,\n config,\n {\n contentType: 'template',\n cacheTagType: 'template',\n cacheTagIdentifier: cmsLabel,\n query: { 'fields.cmsLabel': cmsLabel },\n resolver: (ctx, entry) => templateConverter(ctx, entry),\n errorLogContext: { cmsLabel },\n },\n options,\n );\n}\n","import {\n ArticleTag,\n ArticleTypeIndexTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeIndexTag,\n assetTag,\n BannerTag,\n CustomTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n NavigationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n TemplateTag,\n tagTag,\n templateTag,\n} from './tags';\nimport { revalidateSingleTag, revalidateTags } from './utils';\n\n// Contentful webhook payload types\nexport interface BaseData {\n // metadata: Metadata;\n sys: {\n id: string;\n type: 'Entry' | 'DeletedEntry' | 'Asset' | 'DeletedAsset';\n space: { sys: { id: string } };\n environment: { sys: { id: string } };\n contentType: { sys: { id: string } };\n };\n}\n\ninterface SlugData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n };\n}\n\ninterface PageVariantData extends SlugData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n originalPage?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n articleType?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleTypeData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n };\n}\n\nexport interface AssetData extends BaseData {\n fields?: {\n file?: {\n [key: string]: {\n url: string;\n fileName: string;\n contentType: string;\n };\n };\n };\n}\n\ninterface TemplateData extends BaseData {\n fields?: {\n cmsLabel?: {\n 'en-US': string;\n };\n };\n}\n\n// Content type handler interface\nexport interface IContentTypeHandler<TData extends BaseData, TExtracted> {\n extract(data: TData): TExtracted | Promise<TExtracted>;\n makeTags(extracted: TExtracted): (string | undefined)[] | undefined;\n getGlobalTags(): string[];\n rebuildSearch?: boolean;\n}\n\n// Default locale for Contentful\nconst defaultLocale = 'en-US';\n\n// Content type handlers\n\nconst articleTypeHandler: IContentTypeHandler<\n ArticleTypeData,\n { slug: string | undefined | null }\n> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n }),\n makeTags: (extracted) => [extracted.slug ? articleTypeIndexTag(extracted.slug) : undefined],\n getGlobalTags: () => [ArticleTypeTag, ArticleTypeIndexTag],\n};\n\nconst articleHandler: IContentTypeHandler<ArticleData, { slug: string | undefined | null }> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n }),\n makeTags: (extracted) => [extracted?.slug ? articleTag(extracted.slug) : undefined],\n getGlobalTags: () => [ArticleTag],\n rebuildSearch: true,\n};\n\nconst pageVariantHandler: IContentTypeHandler<PageVariantData, string | undefined> = {\n extract: (data) => {\n const pageVariantSlug = data.fields?.slug?.[defaultLocale];\n return pageVariantSlug;\n },\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n};\n\nconst templateHandler: IContentTypeHandler<TemplateData, string | undefined> = {\n extract: (data) => data.fields?.cmsLabel?.[defaultLocale],\n makeTags: (extracted) => [extracted ? templateTag(extracted) : undefined],\n getGlobalTags: () => [TemplateTag],\n};\n\n// Content type handlers registry\nexport const contentTypeHandlers: Record<\n string,\n IContentTypeHandler<SlugData, string | null | undefined>\n> = {\n page: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n },\n pageVariant: pageVariantHandler as IContentTypeHandler<SlugData, string | null | undefined>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n article: articleHandler as IContentTypeHandler<SlugData, any>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n articleType: articleTypeHandler as IContentTypeHandler<SlugData, any>,\n person: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? personTag(extracted) : undefined],\n getGlobalTags: () => [PersonTag],\n },\n tag: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? tagTag(extracted) : undefined],\n getGlobalTags: () => [TagTag],\n },\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n template: templateHandler as IContentTypeHandler<SlugData, any>,\n customType: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [CustomTypeTag],\n },\n navigation: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [NavigationTag],\n },\n banner: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [BannerTag],\n },\n location: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? locationTag(extracted) : undefined],\n getGlobalTags: () => [LocationTag],\n },\n};\n\n// Asset revalidation handler\nexport async function revalidateAsset(\n content: AssetData,\n message: string,\n preview: boolean = false,\n): Promise<boolean> {\n const id = content.sys.id;\n const fileName = content.fields?.file?.[defaultLocale]?.fileName;\n const tags = [assetTag(id), fileName ? assetTag(fileName) : undefined, AssetTag].filter(\n (tag): tag is string => tag !== undefined,\n );\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, message);\n } else {\n await revalidateTags(tags, message);\n }\n\n return true;\n}\n\n// Entry revalidation handler\nexport async function revalidateEntry(\n handler: IContentTypeHandler<SlugData, string | null | undefined>,\n content: BaseData,\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const extracted = await Promise.resolve(handler.extract(content));\n const tags = handler.makeTags(extracted);\n const validTags = tags?.filter((tag): tag is string => tag !== undefined) ?? [];\n const globalTags = handler.getGlobalTags();\n const tagsToRevalidate = [...validTags, ...globalTags];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `publish ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tagsToRevalidate, `publish ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted entry by content type (collection tags only)\nexport async function revalidateDeletedEntry(\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const { getCacheTagsForProduction } = await import('./utils');\n const tags = getCacheTagsForProduction(contentType);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted asset by ID\nexport async function revalidateDeletedAsset(\n assetId: string,\n preview: boolean = false,\n): Promise<boolean> {\n const tags = [assetTag(assetId), AssetTag];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete asset ${assetId} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete asset ${assetId}`);\n }\n\n return true;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NextResponse } from 'next/server';\nimport {\n type AssetData,\n type BaseData,\n contentTypeHandlers,\n revalidateAsset,\n revalidateDeletedAsset,\n revalidateDeletedEntry,\n revalidateEntry,\n} from './handlers';\nimport { AllTags, GlobalTag } from './tags';\nimport { revalidateSingleTag } from './utils';\n\n// Handle asset publishing\nasync function publishAsset(content: AssetData, preview: boolean): Promise<boolean> {\n return await revalidateAsset(content, 'publish asset', preview);\n}\n\n// Handle asset deletion\nasync function deleteAsset(content: BaseData, preview: boolean): Promise<boolean> {\n return await revalidateDeletedAsset(content.sys.id, preview);\n}\n\n// Handle entry publishing\nasync function publishEntry(content: BaseData, preview: boolean): Promise<boolean> {\n const contentType = content.sys.contentType.sys.id;\n const handler = contentTypeHandlers[contentType];\n if (!handler) {\n console.warn(`Unknown content type: ${contentType}`);\n return false;\n }\n return await revalidateEntry(handler, content, contentType, preview);\n}\n\n// Handle entry deletion\nasync function deleteEntry(content: BaseData, preview: boolean): Promise<boolean> {\n console.log(`Delete entry: ${content.sys.id}`);\n const contentType = content.sys.contentType.sys.id;\n const success = await revalidateDeletedEntry(contentType, preview);\n // Note: Search rebuild logic would go here if needed\n return success;\n}\n\n// Revalidate all tags (for global revalidation)\nasync function revalidateAll(preview: boolean): Promise<boolean> {\n console.log('Revalidating all tags');\n await delay(500);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, 'global revalidation');\n } else {\n for (const tag of AllTags) {\n await revalidateSingleTag(tag, 'global revalidation');\n }\n }\n\n // Note: Search rebuild logic would go here if needed\n return true;\n}\n\n// Utility delay function\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Main revalidation handler function\nexport async function handleRevalidation(\n request: Request,\n preview: boolean = false,\n): Promise<NextResponse> {\n try {\n // Check for global revalidation header\n const all = request.headers.get('REVALIDATE_ALL');\n const single = request.headers.get('REVALIDATION_TAG');\n\n if (all) {\n const success = await revalidateAll(preview);\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n if (single) {\n const success = await revalidateSingleTag(single, 'single tag revalidation');\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n // Parse webhook payload\n const content = (await request.json()) as BaseData;\n\n let success = false;\n switch (content.sys.type) {\n case 'DeletedAsset':\n success = await deleteAsset(content, preview);\n break;\n case 'DeletedEntry':\n success = await deleteEntry(content, preview);\n break;\n case 'Asset':\n success = await publishAsset(content as AssetData, preview);\n break;\n case 'Entry':\n success = await publishEntry(content, preview);\n break;\n default:\n console.warn(`Unknown message type: ${content.sys.type}`);\n return NextResponse.json({ message: 'Unknown message type' }, { status: 400 });\n }\n\n if (!success) {\n return NextResponse.json({ message: 'Unknown content type' }, { status: 400 });\n }\n\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n } catch (error) {\n console.error('Error in revalidation:', error);\n // Send a 200 back as Contentful retries a few times!\n return NextResponse.json({ message: 'Error in revalidation' }, { status: 500 });\n }\n}\n","import { type NextRequest, NextResponse } from 'next/server';\nimport { handleRevalidation } from './route';\n\n/**\n * Configuration for the revalidation route\n */\nexport interface RevalidationConfig {\n /** Secret for validating webhook requests */\n secret?: string;\n /** Whether to validate the secret */\n validateSecret?: boolean;\n /** Whether to run in preview mode */\n preview?: boolean;\n}\n\n/**\n * Create a Next.js API route handler for Contentful revalidation\n *\n * @param config - Configuration options\n * @returns Next.js POST handler function\n *\n * @example\n * ```ts\n * // In your app/api/revalidate/route.ts\n * import { createRevalidationHandler } from '@se-studio/contentful-rest-api';\n *\n * export const POST = createRevalidationHandler({\n * secret: process.env.REVALIDATION_SECRET,\n * validateSecret: true,\n * });\n * ```\n */\nexport function createRevalidationHandler(\n config: RevalidationConfig = {},\n): (request: NextRequest) => Promise<NextResponse> {\n return async function POST(request: NextRequest) {\n const { secret, validateSecret = true, preview = false } = config;\n\n // Validate secret if required\n if (validateSecret && secret) {\n const requestSecret = request.headers.get('REVALIDATION_SECRET');\n if (requestSecret !== secret) {\n return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });\n }\n }\n\n // Handle the revalidation\n return await handleRevalidation(request, preview);\n };\n}\n","// Revalidation utilities exports\n\nexport * from './handlers';\nexport * from './nextjs-route';\nexport * from './route';\nexport * from './tags';\nexport * from './utils';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,gBAAgB;AAChB,OAAO,EAEL,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,+BAA+B,EAC/B,yBAAyB,EACzB,mCAAmC;AACnC,2BAA2B;AAC3B,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,EAC9B,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EAErB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB;AACnB,UAAU;AACV,mBAAmB,EAKnB,iBAAiB,GAWlB,MAAM,OAAO,CAAC;AAGf,iBAAiB;AACjB,OAAO,EAEL,sBAAsB,EACtB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,oBAAoB;AACpB,OAAO,EAEL,iBAAiB,EAEjB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EAItB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,uBAAuB,GAExB,MAAM,cAAc,CAAC;AACtB,yBAAyB;AACzB,OAAO,EACL,OAAO,EACP,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAY;AACZ,oBAAoB;AACpB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,WAAW,EACX,aAAa;AACb,8BAA8B;AAC9B,OAAO,EACP,SAAS,EACT,OAAO,EACP,SAAS,EACT,MAAM,EACN,WAAW,EACX,MAAM,EACN,WAAW,GACZ,MAAM,gBAAgB,CAAC;AASxB,qCAAqC;AACrC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,cAAc,EACd,WAAW,EACX,QAAQ,EACR,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAC"}