@se-studio/core-ui 0.0.0-next16-20260822103555

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 (625) hide show
  1. package/ANALYTICS.md +160 -0
  2. package/CHANGELOG.md +2565 -0
  3. package/CMS_INFRASTRUCTURE.md +370 -0
  4. package/CONSENT.md +121 -0
  5. package/README.md +638 -0
  6. package/dist/CmsRendererConfig.d.ts +259 -0
  7. package/dist/CmsRendererConfig.d.ts.map +1 -0
  8. package/dist/CmsRendererConfig.js +2 -0
  9. package/dist/CmsRendererConfig.js.map +1 -0
  10. package/dist/__mocks__/server-only.d.ts +2 -0
  11. package/dist/__mocks__/server-only.d.ts.map +1 -0
  12. package/dist/__mocks__/server-only.js +2 -0
  13. package/dist/__mocks__/server-only.js.map +1 -0
  14. package/dist/analytics/AnalyticsPageTracker.d.ts +11 -0
  15. package/dist/analytics/AnalyticsPageTracker.d.ts.map +1 -0
  16. package/dist/analytics/AnalyticsPageTracker.js +26 -0
  17. package/dist/analytics/AnalyticsPageTracker.js.map +1 -0
  18. package/dist/analytics/AnalyticsProvider.d.ts +18 -0
  19. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -0
  20. package/dist/analytics/AnalyticsProvider.js +48 -0
  21. package/dist/analytics/AnalyticsProvider.js.map +1 -0
  22. package/dist/analytics/adapters/CompositeAnalyticsAdapter.d.ts +13 -0
  23. package/dist/analytics/adapters/CompositeAnalyticsAdapter.d.ts.map +1 -0
  24. package/dist/analytics/adapters/CompositeAnalyticsAdapter.js +35 -0
  25. package/dist/analytics/adapters/CompositeAnalyticsAdapter.js.map +1 -0
  26. package/dist/analytics/adapters/ConsentAwareAdapter.d.ts +20 -0
  27. package/dist/analytics/adapters/ConsentAwareAdapter.d.ts.map +1 -0
  28. package/dist/analytics/adapters/ConsentAwareAdapter.js +35 -0
  29. package/dist/analytics/adapters/ConsentAwareAdapter.js.map +1 -0
  30. package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts +12 -0
  31. package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts.map +1 -0
  32. package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js +22 -0
  33. package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js.map +1 -0
  34. package/dist/analytics/adapters/GoogleTagManagerAdapter.d.ts +53 -0
  35. package/dist/analytics/adapters/GoogleTagManagerAdapter.d.ts.map +1 -0
  36. package/dist/analytics/adapters/GoogleTagManagerAdapter.js +134 -0
  37. package/dist/analytics/adapters/GoogleTagManagerAdapter.js.map +1 -0
  38. package/dist/analytics/adapters/index.d.ts +5 -0
  39. package/dist/analytics/adapters/index.d.ts.map +1 -0
  40. package/dist/analytics/adapters/index.js +5 -0
  41. package/dist/analytics/adapters/index.js.map +1 -0
  42. package/dist/analytics/types.d.ts +42 -0
  43. package/dist/analytics/types.d.ts.map +1 -0
  44. package/dist/analytics/types.js +2 -0
  45. package/dist/analytics/types.js.map +1 -0
  46. package/dist/analytics/useAnalytics.d.ts +44 -0
  47. package/dist/analytics/useAnalytics.d.ts.map +1 -0
  48. package/dist/analytics/useAnalytics.js +69 -0
  49. package/dist/analytics/useAnalytics.js.map +1 -0
  50. package/dist/analytics/video/classifySeek.d.ts +15 -0
  51. package/dist/analytics/video/classifySeek.d.ts.map +1 -0
  52. package/dist/analytics/video/classifySeek.js +32 -0
  53. package/dist/analytics/video/classifySeek.js.map +1 -0
  54. package/dist/analytics/video/createVideoEngagementSession.d.ts +51 -0
  55. package/dist/analytics/video/createVideoEngagementSession.d.ts.map +1 -0
  56. package/dist/analytics/video/createVideoEngagementSession.js +225 -0
  57. package/dist/analytics/video/createVideoEngagementSession.js.map +1 -0
  58. package/dist/analytics/video/index.d.ts +6 -0
  59. package/dist/analytics/video/index.d.ts.map +1 -0
  60. package/dist/analytics/video/index.js +6 -0
  61. package/dist/analytics/video/index.js.map +1 -0
  62. package/dist/analytics/video/loadYouTubeIframeApi.d.ts +50 -0
  63. package/dist/analytics/video/loadYouTubeIframeApi.d.ts.map +1 -0
  64. package/dist/analytics/video/loadYouTubeIframeApi.js +52 -0
  65. package/dist/analytics/video/loadYouTubeIframeApi.js.map +1 -0
  66. package/dist/analytics/video/useHtml5VideoEngagement.d.ts +8 -0
  67. package/dist/analytics/video/useHtml5VideoEngagement.d.ts.map +1 -0
  68. package/dist/analytics/video/useHtml5VideoEngagement.js +67 -0
  69. package/dist/analytics/video/useHtml5VideoEngagement.js.map +1 -0
  70. package/dist/analytics/video/useVideoEngagement.d.ts +19 -0
  71. package/dist/analytics/video/useVideoEngagement.d.ts.map +1 -0
  72. package/dist/analytics/video/useVideoEngagement.js +80 -0
  73. package/dist/analytics/video/useVideoEngagement.js.map +1 -0
  74. package/dist/analytics/video/videoEngagementTypes.d.ts +52 -0
  75. package/dist/analytics/video/videoEngagementTypes.d.ts.map +1 -0
  76. package/dist/analytics/video/videoEngagementTypes.js +45 -0
  77. package/dist/analytics/video/videoEngagementTypes.js.map +1 -0
  78. package/dist/app-helpers.d.ts +196 -0
  79. package/dist/app-helpers.d.ts.map +1 -0
  80. package/dist/app-helpers.js +322 -0
  81. package/dist/app-helpers.js.map +1 -0
  82. package/dist/cmsRegistration.d.ts +302 -0
  83. package/dist/cmsRegistration.d.ts.map +1 -0
  84. package/dist/cmsRegistration.js +242 -0
  85. package/dist/cmsRegistration.js.map +1 -0
  86. package/dist/components/Animation.d.ts +3 -0
  87. package/dist/components/Animation.d.ts.map +1 -0
  88. package/dist/components/Animation.js +2 -0
  89. package/dist/components/Animation.js.map +1 -0
  90. package/dist/components/AnimationComponent.d.ts +9 -0
  91. package/dist/components/AnimationComponent.d.ts.map +1 -0
  92. package/dist/components/AnimationComponent.js +18 -0
  93. package/dist/components/AnimationComponent.js.map +1 -0
  94. package/dist/components/ClientMonitor.d.ts +7 -0
  95. package/dist/components/ClientMonitor.d.ts.map +1 -0
  96. package/dist/components/ClientMonitor.js +368 -0
  97. package/dist/components/ClientMonitor.js.map +1 -0
  98. package/dist/components/CmsCollection.d.ts +68 -0
  99. package/dist/components/CmsCollection.d.ts.map +1 -0
  100. package/dist/components/CmsCollection.js +68 -0
  101. package/dist/components/CmsCollection.js.map +1 -0
  102. package/dist/components/CmsComponent.d.ts +68 -0
  103. package/dist/components/CmsComponent.d.ts.map +1 -0
  104. package/dist/components/CmsComponent.js +68 -0
  105. package/dist/components/CmsComponent.js.map +1 -0
  106. package/dist/components/CmsContent.d.ts +105 -0
  107. package/dist/components/CmsContent.d.ts.map +1 -0
  108. package/dist/components/CmsContent.js +200 -0
  109. package/dist/components/CmsContent.js.map +1 -0
  110. package/dist/components/CmsConversionErrors.d.ts +8 -0
  111. package/dist/components/CmsConversionErrors.d.ts.map +1 -0
  112. package/dist/components/CmsConversionErrors.js +51 -0
  113. package/dist/components/CmsConversionErrors.js.map +1 -0
  114. package/dist/components/CmsDataError.d.ts +14 -0
  115. package/dist/components/CmsDataError.d.ts.map +1 -0
  116. package/dist/components/CmsDataError.js +7 -0
  117. package/dist/components/CmsDataError.js.map +1 -0
  118. package/dist/components/CmsDevLayout.d.ts +23 -0
  119. package/dist/components/CmsDevLayout.d.ts.map +1 -0
  120. package/dist/components/CmsDevLayout.js +26 -0
  121. package/dist/components/CmsDevLayout.js.map +1 -0
  122. package/dist/components/CmsEmbeddedContent.d.ts +10 -0
  123. package/dist/components/CmsEmbeddedContent.d.ts.map +1 -0
  124. package/dist/components/CmsEmbeddedContent.js +51 -0
  125. package/dist/components/CmsEmbeddedContent.js.map +1 -0
  126. package/dist/components/CmsExternalComponent.d.ts +63 -0
  127. package/dist/components/CmsExternalComponent.d.ts.map +1 -0
  128. package/dist/components/CmsExternalComponent.js +68 -0
  129. package/dist/components/CmsExternalComponent.js.map +1 -0
  130. package/dist/components/CmsRoutesLayout.d.ts +16 -0
  131. package/dist/components/CmsRoutesLayout.d.ts.map +1 -0
  132. package/dist/components/CmsRoutesLayout.js +17 -0
  133. package/dist/components/CmsRoutesLayout.js.map +1 -0
  134. package/dist/components/DefaultExternalVideoPlayButton.d.ts +3 -0
  135. package/dist/components/DefaultExternalVideoPlayButton.d.ts.map +1 -0
  136. package/dist/components/DefaultExternalVideoPlayButton.js +6 -0
  137. package/dist/components/DefaultExternalVideoPlayButton.js.map +1 -0
  138. package/dist/components/DotLottieAnimationComponent.d.ts +16 -0
  139. package/dist/components/DotLottieAnimationComponent.d.ts.map +1 -0
  140. package/dist/components/DotLottieAnimationComponent.js +88 -0
  141. package/dist/components/DotLottieAnimationComponent.js.map +1 -0
  142. package/dist/components/ErrorBoundary.d.ts +19 -0
  143. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  144. package/dist/components/ErrorBoundary.js +32 -0
  145. package/dist/components/ErrorBoundary.js.map +1 -0
  146. package/dist/components/ExternalVideoComponent.d.ts +9 -0
  147. package/dist/components/ExternalVideoComponent.d.ts.map +1 -0
  148. package/dist/components/ExternalVideoComponent.js +39 -0
  149. package/dist/components/ExternalVideoComponent.js.map +1 -0
  150. package/dist/components/ExternalVimeoEmbed.d.ts +12 -0
  151. package/dist/components/ExternalVimeoEmbed.d.ts.map +1 -0
  152. package/dist/components/ExternalVimeoEmbed.js +211 -0
  153. package/dist/components/ExternalVimeoEmbed.js.map +1 -0
  154. package/dist/components/ExternalYouTubeEmbed.d.ts +9 -0
  155. package/dist/components/ExternalYouTubeEmbed.d.ts.map +1 -0
  156. package/dist/components/ExternalYouTubeEmbed.js +220 -0
  157. package/dist/components/ExternalYouTubeEmbed.js.map +1 -0
  158. package/dist/components/HeroLoopVideo.d.ts +13 -0
  159. package/dist/components/HeroLoopVideo.d.ts.map +1 -0
  160. package/dist/components/HeroLoopVideo.js +146 -0
  161. package/dist/components/HeroLoopVideo.js.map +1 -0
  162. package/dist/components/HtmlComponent.d.ts +21 -0
  163. package/dist/components/HtmlComponent.d.ts.map +1 -0
  164. package/dist/components/HtmlComponent.js +34 -0
  165. package/dist/components/HtmlComponent.js.map +1 -0
  166. package/dist/components/HtmlComponentScript.d.ts +12 -0
  167. package/dist/components/HtmlComponentScript.d.ts.map +1 -0
  168. package/dist/components/HtmlComponentScript.js +12 -0
  169. package/dist/components/HtmlComponentScript.js.map +1 -0
  170. package/dist/components/ImageComponent.d.ts +7 -0
  171. package/dist/components/ImageComponent.d.ts.map +1 -0
  172. package/dist/components/ImageComponent.js +20 -0
  173. package/dist/components/ImageComponent.js.map +1 -0
  174. package/dist/components/ImageKitClientVideo.d.ts +16 -0
  175. package/dist/components/ImageKitClientVideo.d.ts.map +1 -0
  176. package/dist/components/ImageKitClientVideo.js +211 -0
  177. package/dist/components/ImageKitClientVideo.js.map +1 -0
  178. package/dist/components/ImageKitHlsVideoClient.d.ts +21 -0
  179. package/dist/components/ImageKitHlsVideoClient.d.ts.map +1 -0
  180. package/dist/components/ImageKitHlsVideoClient.js +167 -0
  181. package/dist/components/ImageKitHlsVideoClient.js.map +1 -0
  182. package/dist/components/LazyAnimation.d.ts +16 -0
  183. package/dist/components/LazyAnimation.d.ts.map +1 -0
  184. package/dist/components/LazyAnimation.js +90 -0
  185. package/dist/components/LazyAnimation.js.map +1 -0
  186. package/dist/components/LazyVideo.d.ts +19 -0
  187. package/dist/components/LazyVideo.d.ts.map +1 -0
  188. package/dist/components/LazyVideo.js +134 -0
  189. package/dist/components/LazyVideo.js.map +1 -0
  190. package/dist/components/LocalVideo.d.ts +10 -0
  191. package/dist/components/LocalVideo.d.ts.map +1 -0
  192. package/dist/components/LocalVideo.js +66 -0
  193. package/dist/components/LocalVideo.js.map +1 -0
  194. package/dist/components/LocalVideoPlayChrome.d.ts +20 -0
  195. package/dist/components/LocalVideoPlayChrome.d.ts.map +1 -0
  196. package/dist/components/LocalVideoPlayChrome.js +22 -0
  197. package/dist/components/LocalVideoPlayChrome.js.map +1 -0
  198. package/dist/components/LocalVideoPlayOverlay.d.ts +19 -0
  199. package/dist/components/LocalVideoPlayOverlay.d.ts.map +1 -0
  200. package/dist/components/LocalVideoPlayOverlay.js +49 -0
  201. package/dist/components/LocalVideoPlayOverlay.js.map +1 -0
  202. package/dist/components/PictureComponent.d.ts +7 -0
  203. package/dist/components/PictureComponent.d.ts.map +1 -0
  204. package/dist/components/PictureComponent.js +29 -0
  205. package/dist/components/PictureComponent.js.map +1 -0
  206. package/dist/components/Preview.d.ts +2 -0
  207. package/dist/components/Preview.d.ts.map +1 -0
  208. package/dist/components/Preview.js +52 -0
  209. package/dist/components/Preview.js.map +1 -0
  210. package/dist/components/StructuredData.d.ts +20 -0
  211. package/dist/components/StructuredData.d.ts.map +1 -0
  212. package/dist/components/StructuredData.js +116 -0
  213. package/dist/components/StructuredData.js.map +1 -0
  214. package/dist/components/SvgComponent.d.ts +7 -0
  215. package/dist/components/SvgComponent.d.ts.map +1 -0
  216. package/dist/components/SvgComponent.js +10 -0
  217. package/dist/components/SvgComponent.js.map +1 -0
  218. package/dist/components/SvgIconComponent.d.ts +20 -0
  219. package/dist/components/SvgIconComponent.d.ts.map +1 -0
  220. package/dist/components/SvgIconComponent.js +23 -0
  221. package/dist/components/SvgIconComponent.js.map +1 -0
  222. package/dist/components/SvgImageComponent.d.ts +7 -0
  223. package/dist/components/SvgImageComponent.d.ts.map +1 -0
  224. package/dist/components/SvgImageComponent.js +10 -0
  225. package/dist/components/SvgImageComponent.js.map +1 -0
  226. package/dist/components/SvgSpriteSheet.d.ts +24 -0
  227. package/dist/components/SvgSpriteSheet.d.ts.map +1 -0
  228. package/dist/components/SvgSpriteSheet.js +37 -0
  229. package/dist/components/SvgSpriteSheet.js.map +1 -0
  230. package/dist/components/Video.d.ts +11 -0
  231. package/dist/components/Video.d.ts.map +1 -0
  232. package/dist/components/Video.js +2 -0
  233. package/dist/components/Video.js.map +1 -0
  234. package/dist/components/VideoComponent.d.ts +10 -0
  235. package/dist/components/VideoComponent.d.ts.map +1 -0
  236. package/dist/components/VideoComponent.js +22 -0
  237. package/dist/components/VideoComponent.js.map +1 -0
  238. package/dist/components/Visual.d.ts +43 -0
  239. package/dist/components/Visual.d.ts.map +1 -0
  240. package/dist/components/Visual.js +60 -0
  241. package/dist/components/Visual.js.map +1 -0
  242. package/dist/components/VisualComponent.d.ts +83 -0
  243. package/dist/components/VisualComponent.d.ts.map +1 -0
  244. package/dist/components/VisualComponent.js +136 -0
  245. package/dist/components/VisualComponent.js.map +1 -0
  246. package/dist/components/banner/BannerClient.d.ts +13 -0
  247. package/dist/components/banner/BannerClient.d.ts.map +1 -0
  248. package/dist/components/banner/BannerClient.js +38 -0
  249. package/dist/components/banner/BannerClient.js.map +1 -0
  250. package/dist/components/banner/BannerManager.d.ts +26 -0
  251. package/dist/components/banner/BannerManager.d.ts.map +1 -0
  252. package/dist/components/banner/BannerManager.js +35 -0
  253. package/dist/components/banner/BannerManager.js.map +1 -0
  254. package/dist/components/banner/BannerTargeting.d.ts +20 -0
  255. package/dist/components/banner/BannerTargeting.d.ts.map +1 -0
  256. package/dist/components/banner/BannerTargeting.js +204 -0
  257. package/dist/components/banner/BannerTargeting.js.map +1 -0
  258. package/dist/components/banner/bannerVisibility.d.ts +20 -0
  259. package/dist/components/banner/bannerVisibility.d.ts.map +1 -0
  260. package/dist/components/banner/bannerVisibility.js +73 -0
  261. package/dist/components/banner/bannerVisibility.js.map +1 -0
  262. package/dist/components/clientMonitorVideos.d.ts +6 -0
  263. package/dist/components/clientMonitorVideos.d.ts.map +1 -0
  264. package/dist/components/clientMonitorVideos.js +116 -0
  265. package/dist/components/clientMonitorVideos.js.map +1 -0
  266. package/dist/components/dotlottieWasm.d.ts +19 -0
  267. package/dist/components/dotlottieWasm.d.ts.map +1 -0
  268. package/dist/components/dotlottieWasm.js +62 -0
  269. package/dist/components/dotlottieWasm.js.map +1 -0
  270. package/dist/components/heroLoop.d.ts +22 -0
  271. package/dist/components/heroLoop.d.ts.map +1 -0
  272. package/dist/components/heroLoop.js +24 -0
  273. package/dist/components/heroLoop.js.map +1 -0
  274. package/dist/components/svg.d.ts +3 -0
  275. package/dist/components/svg.d.ts.map +1 -0
  276. package/dist/components/svg.js +64 -0
  277. package/dist/components/svg.js.map +1 -0
  278. package/dist/context/ExternalVideoPlayButtonContext.d.ts +7 -0
  279. package/dist/context/ExternalVideoPlayButtonContext.d.ts.map +1 -0
  280. package/dist/context/ExternalVideoPlayButtonContext.js +11 -0
  281. package/dist/context/ExternalVideoPlayButtonContext.js.map +1 -0
  282. package/dist/elements/RtfOrString.d.ts +26 -0
  283. package/dist/elements/RtfOrString.d.ts.map +1 -0
  284. package/dist/elements/RtfOrString.js +13 -0
  285. package/dist/elements/RtfOrString.js.map +1 -0
  286. package/dist/elements/TrackedLink.d.ts +25 -0
  287. package/dist/elements/TrackedLink.d.ts.map +1 -0
  288. package/dist/elements/TrackedLink.js +96 -0
  289. package/dist/elements/TrackedLink.js.map +1 -0
  290. package/dist/elements/UtmLink.d.ts +7 -0
  291. package/dist/elements/UtmLink.d.ts.map +1 -0
  292. package/dist/elements/UtmLink.js +24 -0
  293. package/dist/elements/UtmLink.js.map +1 -0
  294. package/dist/framework/BackgroundMedia.d.ts +12 -0
  295. package/dist/framework/BackgroundMedia.d.ts.map +1 -0
  296. package/dist/framework/BackgroundMedia.js +23 -0
  297. package/dist/framework/BackgroundMedia.js.map +1 -0
  298. package/dist/framework/ComponentErrorIndicator.d.ts +12 -0
  299. package/dist/framework/ComponentErrorIndicator.d.ts.map +1 -0
  300. package/dist/framework/ComponentErrorIndicator.js +29 -0
  301. package/dist/framework/ComponentErrorIndicator.js.map +1 -0
  302. package/dist/framework/ContainedVisual.d.ts +12 -0
  303. package/dist/framework/ContainedVisual.d.ts.map +1 -0
  304. package/dist/framework/ContainedVisual.js +14 -0
  305. package/dist/framework/ContainedVisual.js.map +1 -0
  306. package/dist/framework/ResponsiveVisual.d.ts +14 -0
  307. package/dist/framework/ResponsiveVisual.d.ts.map +1 -0
  308. package/dist/framework/ResponsiveVisual.js +14 -0
  309. package/dist/framework/ResponsiveVisual.js.map +1 -0
  310. package/dist/framework/componentErrors.d.ts +19 -0
  311. package/dist/framework/componentErrors.d.ts.map +1 -0
  312. package/dist/framework/componentErrors.js +31 -0
  313. package/dist/framework/componentErrors.js.map +1 -0
  314. package/dist/hooks/useClickTracking.d.ts +58 -0
  315. package/dist/hooks/useClickTracking.d.ts.map +1 -0
  316. package/dist/hooks/useClickTracking.js +48 -0
  317. package/dist/hooks/useClickTracking.js.map +1 -0
  318. package/dist/hooks/useDocumentVisible.d.ts +2 -0
  319. package/dist/hooks/useDocumentVisible.d.ts.map +1 -0
  320. package/dist/hooks/useDocumentVisible.js +17 -0
  321. package/dist/hooks/useDocumentVisible.js.map +1 -0
  322. package/dist/hooks/visibility.d.ts +14 -0
  323. package/dist/hooks/visibility.d.ts.map +1 -0
  324. package/dist/hooks/visibility.js +122 -0
  325. package/dist/hooks/visibility.js.map +1 -0
  326. package/dist/index.d.ts +134 -0
  327. package/dist/index.d.ts.map +1 -0
  328. package/dist/index.js +120 -0
  329. package/dist/index.js.map +1 -0
  330. package/dist/media-library/MediaLibraryAnimationPlayer.d.ts +9 -0
  331. package/dist/media-library/MediaLibraryAnimationPlayer.d.ts.map +1 -0
  332. package/dist/media-library/MediaLibraryAnimationPlayer.js +99 -0
  333. package/dist/media-library/MediaLibraryAnimationPlayer.js.map +1 -0
  334. package/dist/media-library/MediaLibraryGrid.d.ts +5 -0
  335. package/dist/media-library/MediaLibraryGrid.d.ts.map +1 -0
  336. package/dist/media-library/MediaLibraryGrid.js +88 -0
  337. package/dist/media-library/MediaLibraryGrid.js.map +1 -0
  338. package/dist/media-library/MediaLibraryPage.d.ts +17 -0
  339. package/dist/media-library/MediaLibraryPage.d.ts.map +1 -0
  340. package/dist/media-library/MediaLibraryPage.js +30 -0
  341. package/dist/media-library/MediaLibraryPage.js.map +1 -0
  342. package/dist/media-library/index.d.ts +4 -0
  343. package/dist/media-library/index.d.ts.map +1 -0
  344. package/dist/media-library/index.js +4 -0
  345. package/dist/media-library/index.js.map +1 -0
  346. package/dist/media-library/types.d.ts +8 -0
  347. package/dist/media-library/types.d.ts.map +1 -0
  348. package/dist/media-library/types.js +12 -0
  349. package/dist/media-library/types.js.map +1 -0
  350. package/dist/route-handlers/createCmsTxtHandler.d.ts +19 -0
  351. package/dist/route-handlers/createCmsTxtHandler.d.ts.map +1 -0
  352. package/dist/route-handlers/createCmsTxtHandler.js +154 -0
  353. package/dist/route-handlers/createCmsTxtHandler.js.map +1 -0
  354. package/dist/route-handlers/createDiscoveryHandler.d.ts +67 -0
  355. package/dist/route-handlers/createDiscoveryHandler.d.ts.map +1 -0
  356. package/dist/route-handlers/createDiscoveryHandler.js +190 -0
  357. package/dist/route-handlers/createDiscoveryHandler.js.map +1 -0
  358. package/dist/route-handlers/createGuidelinesHandler.d.ts +16 -0
  359. package/dist/route-handlers/createGuidelinesHandler.d.ts.map +1 -0
  360. package/dist/route-handlers/createGuidelinesHandler.js +100 -0
  361. package/dist/route-handlers/createGuidelinesHandler.js.map +1 -0
  362. package/dist/route-handlers/createMediaLibraryHandler.d.ts +19 -0
  363. package/dist/route-handlers/createMediaLibraryHandler.d.ts.map +1 -0
  364. package/dist/route-handlers/createMediaLibraryHandler.js +76 -0
  365. package/dist/route-handlers/createMediaLibraryHandler.js.map +1 -0
  366. package/dist/route-handlers/index.d.ts +9 -0
  367. package/dist/route-handlers/index.d.ts.map +1 -0
  368. package/dist/route-handlers/index.js +5 -0
  369. package/dist/route-handlers/index.js.map +1 -0
  370. package/dist/rtf/rtf.d.ts +66 -0
  371. package/dist/rtf/rtf.d.ts.map +1 -0
  372. package/dist/rtf/rtf.js +183 -0
  373. package/dist/rtf/rtf.js.map +1 -0
  374. package/dist/server/index.d.ts +20 -0
  375. package/dist/server/index.d.ts.map +1 -0
  376. package/dist/server/index.js +11 -0
  377. package/dist/server/index.js.map +1 -0
  378. package/dist/server/merge-prepared-page-context.d.ts +8 -0
  379. package/dist/server/merge-prepared-page-context.d.ts.map +1 -0
  380. package/dist/server/merge-prepared-page-context.js +11 -0
  381. package/dist/server/merge-prepared-page-context.js.map +1 -0
  382. package/dist/server/page-test-merge.d.ts +7 -0
  383. package/dist/server/page-test-merge.d.ts.map +1 -0
  384. package/dist/server/page-test-merge.js +12 -0
  385. package/dist/server/page-test-merge.js.map +1 -0
  386. package/dist/server/route-handlers-types.d.ts +124 -0
  387. package/dist/server/route-handlers-types.d.ts.map +1 -0
  388. package/dist/server/route-handlers-types.js +2 -0
  389. package/dist/server/route-handlers-types.js.map +1 -0
  390. package/dist/server/route-handlers.d.ts +99 -0
  391. package/dist/server/route-handlers.d.ts.map +1 -0
  392. package/dist/server/route-handlers.js +1268 -0
  393. package/dist/server/route-handlers.js.map +1 -0
  394. package/dist/server/route-types.d.ts +78 -0
  395. package/dist/server/route-types.d.ts.map +1 -0
  396. package/dist/server/route-types.js +4 -0
  397. package/dist/server/route-types.js.map +1 -0
  398. package/dist/server/tag-index-guards.d.ts +33 -0
  399. package/dist/server/tag-index-guards.d.ts.map +1 -0
  400. package/dist/server/tag-index-guards.js +33 -0
  401. package/dist/server/tag-index-guards.js.map +1 -0
  402. package/dist/server/template-route-handlers.d.ts +7 -0
  403. package/dist/server/template-route-handlers.d.ts.map +1 -0
  404. package/dist/server/template-route-handlers.js +35 -0
  405. package/dist/server/template-route-handlers.js.map +1 -0
  406. package/dist/showcase/components/AllViewPanel.d.ts +7 -0
  407. package/dist/showcase/components/AllViewPanel.d.ts.map +1 -0
  408. package/dist/showcase/components/AllViewPanel.js +55 -0
  409. package/dist/showcase/components/AllViewPanel.js.map +1 -0
  410. package/dist/showcase/components/Controls.d.ts +15 -0
  411. package/dist/showcase/components/Controls.d.ts.map +1 -0
  412. package/dist/showcase/components/Controls.js +71 -0
  413. package/dist/showcase/components/Controls.js.map +1 -0
  414. package/dist/showcase/components/ControlsWrapper.d.ts +15 -0
  415. package/dist/showcase/components/ControlsWrapper.d.ts.map +1 -0
  416. package/dist/showcase/components/ControlsWrapper.js +9 -0
  417. package/dist/showcase/components/ControlsWrapper.js.map +1 -0
  418. package/dist/showcase/components/IframeHeightReporter.d.ts +13 -0
  419. package/dist/showcase/components/IframeHeightReporter.d.ts.map +1 -0
  420. package/dist/showcase/components/IframeHeightReporter.js +51 -0
  421. package/dist/showcase/components/IframeHeightReporter.js.map +1 -0
  422. package/dist/showcase/components/PreviewPanel.d.ts +18 -0
  423. package/dist/showcase/components/PreviewPanel.d.ts.map +1 -0
  424. package/dist/showcase/components/PreviewPanel.js +52 -0
  425. package/dist/showcase/components/PreviewPanel.js.map +1 -0
  426. package/dist/showcase/components/ScaledIframe.d.ts +22 -0
  427. package/dist/showcase/components/ScaledIframe.d.ts.map +1 -0
  428. package/dist/showcase/components/ScaledIframe.js +41 -0
  429. package/dist/showcase/components/ScaledIframe.js.map +1 -0
  430. package/dist/showcase/components/ShowcaseAllRenderPage.d.ts +21 -0
  431. package/dist/showcase/components/ShowcaseAllRenderPage.d.ts.map +1 -0
  432. package/dist/showcase/components/ShowcaseAllRenderPage.js +36 -0
  433. package/dist/showcase/components/ShowcaseAllRenderPage.js.map +1 -0
  434. package/dist/showcase/components/ShowcaseAnimationRoot.d.ts +8 -0
  435. package/dist/showcase/components/ShowcaseAnimationRoot.d.ts.map +1 -0
  436. package/dist/showcase/components/ShowcaseAnimationRoot.js +10 -0
  437. package/dist/showcase/components/ShowcaseAnimationRoot.js.map +1 -0
  438. package/dist/showcase/components/ShowcasePage.d.ts +25 -0
  439. package/dist/showcase/components/ShowcasePage.d.ts.map +1 -0
  440. package/dist/showcase/components/ShowcasePage.js +31 -0
  441. package/dist/showcase/components/ShowcasePage.js.map +1 -0
  442. package/dist/showcase/components/ShowcaseRenderPage.d.ts +21 -0
  443. package/dist/showcase/components/ShowcaseRenderPage.d.ts.map +1 -0
  444. package/dist/showcase/components/ShowcaseRenderPage.js +45 -0
  445. package/dist/showcase/components/ShowcaseRenderPage.js.map +1 -0
  446. package/dist/showcase/components/ShowcaseViewportGuard.d.ts +14 -0
  447. package/dist/showcase/components/ShowcaseViewportGuard.d.ts.map +1 -0
  448. package/dist/showcase/components/ShowcaseViewportGuard.js +77 -0
  449. package/dist/showcase/components/ShowcaseViewportGuard.js.map +1 -0
  450. package/dist/showcase/components/TopBar.d.ts +11 -0
  451. package/dist/showcase/components/TopBar.d.ts.map +1 -0
  452. package/dist/showcase/components/TopBar.js +105 -0
  453. package/dist/showcase/components/TopBar.js.map +1 -0
  454. package/dist/showcase/controlFieldSupport.d.ts +12 -0
  455. package/dist/showcase/controlFieldSupport.d.ts.map +1 -0
  456. package/dist/showcase/controlFieldSupport.js +35 -0
  457. package/dist/showcase/controlFieldSupport.js.map +1 -0
  458. package/dist/showcase/index.d.ts +20 -0
  459. package/dist/showcase/index.d.ts.map +1 -0
  460. package/dist/showcase/index.js +20 -0
  461. package/dist/showcase/index.js.map +1 -0
  462. package/dist/showcase/isCmsShowcase.d.ts +10 -0
  463. package/dist/showcase/isCmsShowcase.d.ts.map +1 -0
  464. package/dist/showcase/isCmsShowcase.js +12 -0
  465. package/dist/showcase/isCmsShowcase.js.map +1 -0
  466. package/dist/showcase/mergeShowcaseMocks.d.ts +34 -0
  467. package/dist/showcase/mergeShowcaseMocks.d.ts.map +1 -0
  468. package/dist/showcase/mergeShowcaseMocks.js +31 -0
  469. package/dist/showcase/mergeShowcaseMocks.js.map +1 -0
  470. package/dist/showcase/mockFactory.d.ts +47 -0
  471. package/dist/showcase/mockFactory.d.ts.map +1 -0
  472. package/dist/showcase/mockFactory.js +726 -0
  473. package/dist/showcase/mockFactory.js.map +1 -0
  474. package/dist/showcase/showcaseLayout.d.ts +17 -0
  475. package/dist/showcase/showcaseLayout.d.ts.map +1 -0
  476. package/dist/showcase/showcaseLayout.js +11 -0
  477. package/dist/showcase/showcaseLayout.js.map +1 -0
  478. package/dist/showcase/showcaseRelatedContent.d.ts +30 -0
  479. package/dist/showcase/showcaseRelatedContent.d.ts.map +1 -0
  480. package/dist/showcase/showcaseRelatedContent.js +106 -0
  481. package/dist/showcase/showcaseRelatedContent.js.map +1 -0
  482. package/dist/showcase/types.d.ts +21 -0
  483. package/dist/showcase/types.d.ts.map +1 -0
  484. package/dist/showcase/types.js +19 -0
  485. package/dist/showcase/types.js.map +1 -0
  486. package/dist/utils/UnsupportedWarning.d.ts +30 -0
  487. package/dist/utils/UnsupportedWarning.d.ts.map +1 -0
  488. package/dist/utils/UnsupportedWarning.js +44 -0
  489. package/dist/utils/UnsupportedWarning.js.map +1 -0
  490. package/dist/utils/UnusedChecker.d.ts +51 -0
  491. package/dist/utils/UnusedChecker.d.ts.map +1 -0
  492. package/dist/utils/UnusedChecker.js +96 -0
  493. package/dist/utils/UnusedChecker.js.map +1 -0
  494. package/dist/utils/agent-ready.d.ts +103 -0
  495. package/dist/utils/agent-ready.d.ts.map +1 -0
  496. package/dist/utils/agent-ready.js +246 -0
  497. package/dist/utils/agent-ready.js.map +1 -0
  498. package/dist/utils/assertValidSiteBaseUrl.d.ts +8 -0
  499. package/dist/utils/assertValidSiteBaseUrl.d.ts.map +1 -0
  500. package/dist/utils/assertValidSiteBaseUrl.js +31 -0
  501. package/dist/utils/assertValidSiteBaseUrl.js.map +1 -0
  502. package/dist/utils/breadcrumbUtils.d.ts +64 -0
  503. package/dist/utils/breadcrumbUtils.d.ts.map +1 -0
  504. package/dist/utils/breadcrumbUtils.js +73 -0
  505. package/dist/utils/breadcrumbUtils.js.map +1 -0
  506. package/dist/utils/buildPageMetadata.d.ts +139 -0
  507. package/dist/utils/buildPageMetadata.d.ts.map +1 -0
  508. package/dist/utils/buildPageMetadata.js +218 -0
  509. package/dist/utils/buildPageMetadata.js.map +1 -0
  510. package/dist/utils/cn.d.ts +29 -0
  511. package/dist/utils/cn.d.ts.map +1 -0
  512. package/dist/utils/cn.js +32 -0
  513. package/dist/utils/cn.js.map +1 -0
  514. package/dist/utils/componentUtils.d.ts +82 -0
  515. package/dist/utils/componentUtils.d.ts.map +1 -0
  516. package/dist/utils/componentUtils.js +327 -0
  517. package/dist/utils/componentUtils.js.map +1 -0
  518. package/dist/utils/convertText.d.ts +2 -0
  519. package/dist/utils/convertText.d.ts.map +1 -0
  520. package/dist/utils/convertText.js +35 -0
  521. package/dist/utils/convertText.js.map +1 -0
  522. package/dist/utils/createDefaultRenderText.d.ts +17 -0
  523. package/dist/utils/createDefaultRenderText.d.ts.map +1 -0
  524. package/dist/utils/createDefaultRenderText.js +25 -0
  525. package/dist/utils/createDefaultRenderText.js.map +1 -0
  526. package/dist/utils/errorHandling.d.ts +37 -0
  527. package/dist/utils/errorHandling.d.ts.map +1 -0
  528. package/dist/utils/errorHandling.js +61 -0
  529. package/dist/utils/errorHandling.js.map +1 -0
  530. package/dist/utils/errorMonitoring.d.ts +17 -0
  531. package/dist/utils/errorMonitoring.d.ts.map +1 -0
  532. package/dist/utils/errorMonitoring.js +26 -0
  533. package/dist/utils/errorMonitoring.js.map +1 -0
  534. package/dist/utils/imageKitVideoHls.d.ts +3 -0
  535. package/dist/utils/imageKitVideoHls.d.ts.map +1 -0
  536. package/dist/utils/imageKitVideoHls.js +5 -0
  537. package/dist/utils/imageKitVideoHls.js.map +1 -0
  538. package/dist/utils/interpolateMetaText.d.ts +9 -0
  539. package/dist/utils/interpolateMetaText.d.ts.map +1 -0
  540. package/dist/utils/interpolateMetaText.js +21 -0
  541. package/dist/utils/interpolateMetaText.js.map +1 -0
  542. package/dist/utils/linkAccessibility.d.ts +13 -0
  543. package/dist/utils/linkAccessibility.d.ts.map +1 -0
  544. package/dist/utils/linkAccessibility.js +14 -0
  545. package/dist/utils/linkAccessibility.js.map +1 -0
  546. package/dist/utils/linkResolution.d.ts +15 -0
  547. package/dist/utils/linkResolution.d.ts.map +1 -0
  548. package/dist/utils/linkResolution.js +19 -0
  549. package/dist/utils/linkResolution.js.map +1 -0
  550. package/dist/utils/listing-page-heading.d.ts +16 -0
  551. package/dist/utils/listing-page-heading.d.ts.map +1 -0
  552. package/dist/utils/listing-page-heading.js +24 -0
  553. package/dist/utils/listing-page-heading.js.map +1 -0
  554. package/dist/utils/listingStructuredData.d.ts +28 -0
  555. package/dist/utils/listingStructuredData.d.ts.map +1 -0
  556. package/dist/utils/listingStructuredData.js +65 -0
  557. package/dist/utils/listingStructuredData.js.map +1 -0
  558. package/dist/utils/marketingSiteSitemap.d.ts +103 -0
  559. package/dist/utils/marketingSiteSitemap.d.ts.map +1 -0
  560. package/dist/utils/marketingSiteSitemap.js +352 -0
  561. package/dist/utils/marketingSiteSitemap.js.map +1 -0
  562. package/dist/utils/previewPageUtils.d.ts +61 -0
  563. package/dist/utils/previewPageUtils.d.ts.map +1 -0
  564. package/dist/utils/previewPageUtils.js +72 -0
  565. package/dist/utils/previewPageUtils.js.map +1 -0
  566. package/dist/utils/previewUtils.d.ts +59 -0
  567. package/dist/utils/previewUtils.d.ts.map +1 -0
  568. package/dist/utils/previewUtils.js +60 -0
  569. package/dist/utils/previewUtils.js.map +1 -0
  570. package/dist/utils/processCollectionLinks.d.ts +11 -0
  571. package/dist/utils/processCollectionLinks.d.ts.map +1 -0
  572. package/dist/utils/processCollectionLinks.js +38 -0
  573. package/dist/utils/processCollectionLinks.js.map +1 -0
  574. package/dist/utils/processTextContent.d.ts +18 -0
  575. package/dist/utils/processTextContent.d.ts.map +1 -0
  576. package/dist/utils/processTextContent.js +24 -0
  577. package/dist/utils/processTextContent.js.map +1 -0
  578. package/dist/utils/reactNodeText.d.ts +7 -0
  579. package/dist/utils/reactNodeText.d.ts.map +1 -0
  580. package/dist/utils/reactNodeText.js +43 -0
  581. package/dist/utils/reactNodeText.js.map +1 -0
  582. package/dist/utils/richTextNodeText.d.ts +13 -0
  583. package/dist/utils/richTextNodeText.d.ts.map +1 -0
  584. package/dist/utils/richTextNodeText.js +29 -0
  585. package/dist/utils/richTextNodeText.js.map +1 -0
  586. package/dist/utils/robots.d.ts +115 -0
  587. package/dist/utils/robots.d.ts.map +1 -0
  588. package/dist/utils/robots.js +174 -0
  589. package/dist/utils/robots.js.map +1 -0
  590. package/dist/utils/scopeCss.d.ts +15 -0
  591. package/dist/utils/scopeCss.d.ts.map +1 -0
  592. package/dist/utils/scopeCss.js +186 -0
  593. package/dist/utils/scopeCss.js.map +1 -0
  594. package/dist/utils/sitemap.d.ts +173 -0
  595. package/dist/utils/sitemap.d.ts.map +1 -0
  596. package/dist/utils/sitemap.js +257 -0
  597. package/dist/utils/sitemap.js.map +1 -0
  598. package/dist/utils/structuredDataUtils.d.ts +158 -0
  599. package/dist/utils/structuredDataUtils.d.ts.map +1 -0
  600. package/dist/utils/structuredDataUtils.js +225 -0
  601. package/dist/utils/structuredDataUtils.js.map +1 -0
  602. package/dist/utils/urlUtils.d.ts +30 -0
  603. package/dist/utils/urlUtils.d.ts.map +1 -0
  604. package/dist/utils/urlUtils.js +100 -0
  605. package/dist/utils/urlUtils.js.map +1 -0
  606. package/dist/utils/visualPositions.d.ts +3 -0
  607. package/dist/utils/visualPositions.d.ts.map +1 -0
  608. package/dist/utils/visualPositions.js +13 -0
  609. package/dist/utils/visualPositions.js.map +1 -0
  610. package/dist/utils/visualSizes.d.ts +5 -0
  611. package/dist/utils/visualSizes.d.ts.map +1 -0
  612. package/dist/utils/visualSizes.js +27 -0
  613. package/dist/utils/visualSizes.js.map +1 -0
  614. package/dist/utils/wcagRelativeLuminanceFromHex.d.ts +8 -0
  615. package/dist/utils/wcagRelativeLuminanceFromHex.d.ts.map +1 -0
  616. package/dist/utils/wcagRelativeLuminanceFromHex.js +30 -0
  617. package/dist/utils/wcagRelativeLuminanceFromHex.js.map +1 -0
  618. package/dist/utils/wrapHtmlComponentJs.d.ts +10 -0
  619. package/dist/utils/wrapHtmlComponentJs.d.ts.map +1 -0
  620. package/dist/utils/wrapHtmlComponentJs.js +12 -0
  621. package/dist/utils/wrapHtmlComponentJs.js.map +1 -0
  622. package/docs/PACKAGE_EXPORT_BOUNDARIES.md +98 -0
  623. package/docs/llms.md +358 -0
  624. package/package.json +108 -0
  625. package/src/showcase/README.md +269 -0
@@ -0,0 +1,1268 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** biome-ignore-all lint/suspicious/noExplicitAny: factory uses any for app-specific model types */
3
+ import { withFlatNavRequestCache, } from '@se-studio/contentful-rest-api';
4
+ import { notFound } from 'next/navigation';
5
+ import { CmsContent } from '../components/CmsContent';
6
+ import { buildPageMetadata, calculateTitleAndDescription, getLocalizedPath, } from '../utils/buildPageMetadata';
7
+ import { handleCmsError } from '../utils/errorHandling';
8
+ import { mergePreparedPageContext } from './merge-prepared-page-context';
9
+ import { overlayPageTestIdentity } from './page-test-merge';
10
+ import { toBreadcrumbOptions } from './route-types';
11
+ import { canRenderArticleTypeTagRoute, canRenderTagIndex } from './tag-index-guards';
12
+ import { buildTemplateLayoutShell, buildTemplateModel, templateContents, } from './template-route-handlers';
13
+ /**
14
+ * Creates all generate*Page and generate*Metadata functions for CMS route handlers.
15
+ * This factory centralises the logic from the per-app `appShared/` directory, accepting
16
+ * app-specific config (layout, fetch helpers, constants) via dependency injection.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // src/lib/route-handlers.ts
21
+ * import { createRouteHandlers } from '@se-studio/core-ui/server';
22
+ * export const { generatePage, generatePageMetadata, ... } = createRouteHandlers({ ... });
23
+ * ```
24
+ */
25
+ export function createRouteHandlers(config) {
26
+ const { rendererConfig, buildOptions, buildInformation, getBannersWithErrors, getPageWithErrors, getArticleWithErrors, getArticleTypeWithErrors, getTagWithErrors, getTagTypeWithErrors, getPersonWithErrors, getCustomTypeWithErrors, getTemplateWithErrors, LayoutComponent, templates: templatesConfig, constants, preparePage, prepareArticlePage, prepareArticleTypePage, prepareArticleTypeTagPage, prepareArticleTypesIndexPage, prepareTagPage, prepareTagsIndexPage, prepareTagTypePage, preparePersonPage, prepareTeamIndexPage, prepareCustomTypePage, } = config;
27
+ // ============================================================================
28
+ // Locale helpers
29
+ // ============================================================================
30
+ /** Build hreflang alternates for a path and locale. */
31
+ function buildLocaleAlternates(path, locale) {
32
+ const localeConfig = buildInformation.localeConfig;
33
+ if (!localeConfig) {
34
+ return undefined;
35
+ }
36
+ const prefix = `/${locale}`;
37
+ const basePath = locale !== localeConfig.defaultLocale && path.startsWith(prefix)
38
+ ? path.slice(prefix.length) || '/'
39
+ : path;
40
+ return Object.fromEntries(localeConfig.locales.map((loc) => [loc, getLocalizedPath(basePath, loc, localeConfig)]));
41
+ }
42
+ function devNotFound(reason, context, errors) {
43
+ if (process.env.NODE_ENV !== 'production') {
44
+ console.error(`[CMS 404] ${reason}`, {
45
+ ...context,
46
+ ...(errors?.length ? { cmsErrors: errors.map((e) => e.message) } : {}),
47
+ });
48
+ }
49
+ return notFound();
50
+ }
51
+ function buildProfileOptions(fetchProfile, locale) {
52
+ return buildOptions({
53
+ ...(locale ? { locale } : {}),
54
+ fetchProfile,
55
+ });
56
+ }
57
+ // ============================================================================
58
+ // Page
59
+ // ============================================================================
60
+ async function getPageData(slug, locale) {
61
+ const options = buildProfileOptions('page', locale);
62
+ const [pageResponse, bannersResponse] = await Promise.all([
63
+ getPageWithErrors(slug, options),
64
+ getBannersWithErrors(options),
65
+ ]);
66
+ return {
67
+ page: pageResponse.data,
68
+ pageErrors: pageResponse.errors,
69
+ banners: bannersResponse.data,
70
+ errors: [...pageResponse.errors, ...bannersResponse.errors],
71
+ };
72
+ }
73
+ async function generatePageMetadata(slug, path, routeConfig, parent, locale) {
74
+ const errorContext = { type: 'metadata', slug, path };
75
+ try {
76
+ const pageResponse = await getPageWithErrors(slug, buildProfileOptions('listing', locale));
77
+ const page = pageResponse.data;
78
+ const pageErrors = pageResponse.errors;
79
+ if (!page) {
80
+ if (routeConfig.throwOnNotFound)
81
+ return devNotFound('page not found', { slug, path }, pageErrors);
82
+ return undefined;
83
+ }
84
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
85
+ return buildPageMetadata(page, path, buildInformation, parent, true, localeAlternates);
86
+ }
87
+ catch (error) {
88
+ if (routeConfig.throwOnNotFound)
89
+ handleCmsError(error, errorContext, buildInformation);
90
+ return {};
91
+ }
92
+ }
93
+ // Like generatePageMetadata but for page-test (A/B test) variant routes.
94
+ // Fetches both pages in parallel: variant provides title/description/image,
95
+ // canonical provides `indexed` so robots directives always match the control page.
96
+ async function generatePageTestMetadata(variantSlug, canonicalSlug, canonicalPath, routeConfig, parent, locale) {
97
+ const errorContext = { type: 'metadata', slug: variantSlug, path: canonicalPath };
98
+ try {
99
+ const listingOpts = buildProfileOptions('listing', locale);
100
+ const [variantResponse, canonicalResponse] = await Promise.all([
101
+ getPageWithErrors(variantSlug, listingOpts),
102
+ getPageWithErrors(canonicalSlug, listingOpts),
103
+ ]);
104
+ const variantPage = variantResponse.data;
105
+ const variantPageErrors = variantResponse.errors;
106
+ const canonicalPage = canonicalResponse.data;
107
+ if (!variantPage) {
108
+ if (routeConfig.throwOnNotFound)
109
+ return devNotFound('page variant not found', { slug: variantSlug, path: canonicalPath }, variantPageErrors);
110
+ return undefined;
111
+ }
112
+ const mergedPage = {
113
+ ...overlayPageTestIdentity(variantPage, canonicalPage, canonicalPath),
114
+ indexed: canonicalPage?.indexed ?? variantPage.indexed,
115
+ };
116
+ const localeAlternates = locale ? buildLocaleAlternates(canonicalPath, locale) : undefined;
117
+ return buildPageMetadata(mergedPage, canonicalPath, buildInformation, parent, true, localeAlternates);
118
+ }
119
+ catch (error) {
120
+ if (routeConfig.throwOnNotFound)
121
+ handleCmsError(error, errorContext, buildInformation);
122
+ return {};
123
+ }
124
+ }
125
+ // Like generatePage but for page-test (A/B test) variant routes.
126
+ // Fetches both pages in parallel: variant provides contents, canonical provides
127
+ // public identity (href, breadcrumbTitle) for breadcrumbs and JSON-LD.
128
+ async function generatePageTest(variantSlug, canonicalSlug, canonicalPath, routeConfig, locale) {
129
+ const errorContext = { type: 'page', slug: variantSlug, path: canonicalPath };
130
+ try {
131
+ const listingOpts = buildProfileOptions('listing', locale);
132
+ const [{ page: variantPage, pageErrors, banners, errors }, canonicalResponse] = await Promise.all([
133
+ getPageData(variantSlug, locale),
134
+ getPageWithErrors(canonicalSlug, listingOpts),
135
+ ]);
136
+ const canonicalPage = canonicalResponse.data;
137
+ if (!variantPage) {
138
+ if (routeConfig.throwOnNotFound)
139
+ return devNotFound('page variant not found', { slug: variantSlug, path: canonicalPath }, pageErrors);
140
+ return undefined;
141
+ }
142
+ if (!variantPage.contents?.length) {
143
+ if (routeConfig.throwOnNotFound)
144
+ return devNotFound('page variant has no contents', { slug: variantSlug, path: canonicalPath }, pageErrors);
145
+ return undefined;
146
+ }
147
+ const layoutPage = overlayPageTestIdentity(variantPage, canonicalPage, canonicalPath);
148
+ const analyticsContext = {
149
+ slug: variantSlug,
150
+ title: variantPage.title || '',
151
+ type: variantPage.type,
152
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
153
+ };
154
+ const breadcrumbOptions = toBreadcrumbOptions(routeConfig);
155
+ const pageContext = mergePreparedPageContext(preparePage
156
+ ? await preparePage({
157
+ page: variantPage,
158
+ banners,
159
+ errors,
160
+ path: canonicalPath,
161
+ locale,
162
+ slug: variantSlug,
163
+ routeConfig,
164
+ })
165
+ : undefined, { page: layoutPage });
166
+ return (_jsx(LayoutComponent, { model: layoutPage, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: breadcrumbOptions, currentLocale: locale, currentPath: canonicalPath, children: _jsx(CmsContent, { contents: variantPage.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
167
+ }
168
+ catch (error) {
169
+ if (routeConfig.throwOnNotFound)
170
+ return handleCmsError(error, errorContext, buildInformation);
171
+ return undefined;
172
+ }
173
+ }
174
+ async function generatePage(slug, path, routeConfig, locale) {
175
+ const errorContext = { type: 'page', slug, path };
176
+ try {
177
+ const { page, pageErrors, banners, errors } = await getPageData(slug, locale);
178
+ if (!page) {
179
+ if (routeConfig.throwOnNotFound)
180
+ return devNotFound('page not found', { slug, path }, pageErrors);
181
+ return undefined;
182
+ }
183
+ if (!page.contents?.length) {
184
+ if (routeConfig.throwOnNotFound)
185
+ return devNotFound('page has no contents', { slug, path }, pageErrors);
186
+ return undefined;
187
+ }
188
+ const analyticsContext = {
189
+ slug,
190
+ title: page.title || '',
191
+ type: page.type,
192
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
193
+ };
194
+ const breadcrumbOptions = toBreadcrumbOptions(routeConfig);
195
+ const pageContext = mergePreparedPageContext(preparePage
196
+ ? await preparePage({
197
+ page: page,
198
+ banners,
199
+ errors,
200
+ path,
201
+ locale,
202
+ slug,
203
+ routeConfig,
204
+ })
205
+ : undefined, { page: page });
206
+ return (_jsx(LayoutComponent, { model: page, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: breadcrumbOptions, currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: page.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
207
+ }
208
+ catch (error) {
209
+ if (routeConfig.throwOnNotFound)
210
+ return handleCmsError(error, errorContext, buildInformation);
211
+ return undefined;
212
+ }
213
+ }
214
+ // ============================================================================
215
+ // Article
216
+ // ============================================================================
217
+ async function getArticleData(articleTypeSlug, slug, locale, fetchProfile = 'page') {
218
+ const options = buildProfileOptions(fetchProfile, locale);
219
+ const isPageRender = fetchProfile === 'page';
220
+ const [articleResponse, bannersResponse] = await Promise.all([
221
+ getArticleWithErrors(articleTypeSlug, slug, options),
222
+ isPageRender
223
+ ? getBannersWithErrors(options)
224
+ : Promise.resolve({ data: null, errors: [] }),
225
+ ]);
226
+ return {
227
+ article: articleResponse.data,
228
+ articleErrors: articleResponse.errors,
229
+ banners: bannersResponse.data,
230
+ errors: [...articleResponse.errors, ...bannersResponse.errors],
231
+ };
232
+ }
233
+ async function generateArticleMetadata(articleTypeSlug, articleSlug, path, routeConfig, parent, locale) {
234
+ const errorContext = { type: 'metadata', articleTypeSlug, articleSlug, path };
235
+ try {
236
+ const { article, articleErrors } = await getArticleData(articleTypeSlug, articleSlug, locale, 'listing');
237
+ if (!article) {
238
+ if (routeConfig.throwOnNotFound)
239
+ return devNotFound('article not found', { articleSlug, articleTypeSlug, path }, articleErrors);
240
+ return undefined;
241
+ }
242
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
243
+ return buildPageMetadata(article, path, buildInformation, parent, true, localeAlternates);
244
+ }
245
+ catch (error) {
246
+ if (routeConfig.throwOnNotFound)
247
+ handleCmsError(error, errorContext, buildInformation);
248
+ return {};
249
+ }
250
+ }
251
+ async function generateArticlePage(articleTypeSlug, articleSlug, path, routeConfig, locale) {
252
+ const errorContext = { type: 'article', articleTypeSlug, articleSlug, path };
253
+ try {
254
+ const { article, articleErrors, banners, errors } = await getArticleData(articleTypeSlug, articleSlug, locale);
255
+ if (!article) {
256
+ if (routeConfig.throwOnNotFound)
257
+ return devNotFound('article not found', { articleSlug, articleTypeSlug, path }, articleErrors);
258
+ return undefined;
259
+ }
260
+ if (routeConfig.requireArticleContent !== false) {
261
+ if (article.contentCount === 0) {
262
+ if (routeConfig.throwOnNotFound)
263
+ return devNotFound('article is empty (no article body, all content from template)', {
264
+ articleSlug,
265
+ articleTypeSlug,
266
+ path,
267
+ });
268
+ return undefined;
269
+ }
270
+ if (!article.contents?.length) {
271
+ if (routeConfig.throwOnNotFound)
272
+ return devNotFound('article has no renderable contents', { articleSlug, articleTypeSlug, path }, articleErrors);
273
+ return undefined;
274
+ }
275
+ }
276
+ const analyticsContext = {
277
+ slug: path,
278
+ title: article.title || '',
279
+ type: article.type,
280
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
281
+ };
282
+ const pageContext = mergePreparedPageContext(prepareArticlePage
283
+ ? await prepareArticlePage({
284
+ article,
285
+ banners,
286
+ errors,
287
+ path,
288
+ locale,
289
+ articleTypeSlug,
290
+ articleSlug,
291
+ routeConfig,
292
+ })
293
+ : undefined, { article });
294
+ return (_jsx(LayoutComponent, { model: article, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: article.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
295
+ }
296
+ catch (error) {
297
+ if (routeConfig.throwOnNotFound)
298
+ return handleCmsError(error, errorContext, buildInformation);
299
+ return undefined;
300
+ }
301
+ }
302
+ // ============================================================================
303
+ // Article Type
304
+ // ============================================================================
305
+ async function getArticleTypeData(articleTypeSlug, locale, fetchProfile = 'page') {
306
+ const options = buildProfileOptions(fetchProfile, locale);
307
+ const isPageRender = fetchProfile === 'page';
308
+ const [articleTypeResponse, customTypeResponse, bannersResponse] = await Promise.all([
309
+ getArticleTypeWithErrors(articleTypeSlug, {
310
+ ...options,
311
+ customType: constants.requireCustomTypeForArticleTypes && isPageRender
312
+ ? constants.ARTICLES_SLUG
313
+ : undefined,
314
+ }),
315
+ constants.requireCustomTypeForArticleTypes
316
+ ? getCustomTypeWithErrors(constants.ARTICLES_SLUG, {
317
+ ...options,
318
+ fetchProfile: isPageRender ? 'page' : 'listing',
319
+ })
320
+ : Promise.resolve({ data: undefined, errors: [] }),
321
+ isPageRender
322
+ ? getBannersWithErrors(options)
323
+ : Promise.resolve({ data: null, errors: [] }),
324
+ ]);
325
+ return {
326
+ articleType: articleTypeResponse.data,
327
+ articleTypeErrors: articleTypeResponse.errors,
328
+ customType: customTypeResponse.data,
329
+ banners: bannersResponse.data,
330
+ errors: [
331
+ ...articleTypeResponse.errors,
332
+ ...customTypeResponse.errors,
333
+ ...bannersResponse.errors,
334
+ ],
335
+ };
336
+ }
337
+ async function generateArticleTypeMetadata(articleTypeSlug, path, routeConfig, parent, locale) {
338
+ const errorContext = { type: 'metadata', articleTypeSlug, path };
339
+ try {
340
+ const { articleType, articleTypeErrors, customType } = await getArticleTypeData(articleTypeSlug, locale, 'listing');
341
+ if (!articleType) {
342
+ if (routeConfig.throwOnNotFound)
343
+ return devNotFound('article type not found', { articleTypeSlug, path }, articleTypeErrors);
344
+ return undefined;
345
+ }
346
+ if (constants.requireCustomTypeForArticleTypes && !customType) {
347
+ if (routeConfig.throwOnNotFound)
348
+ return devNotFound('article type custom type not found', {
349
+ articleTypeSlug,
350
+ path,
351
+ customTypeSlug: constants.ARTICLES_SLUG,
352
+ });
353
+ return undefined;
354
+ }
355
+ const { title, description } = calculateTitleAndDescription({
356
+ articleType: articleType,
357
+ customType: customType,
358
+ });
359
+ const model = {
360
+ indexed: articleType.indexed && (customType?.indexed ?? true),
361
+ featuredImage: articleType.featuredImage ?? customType?.featuredImage ?? undefined,
362
+ title,
363
+ description,
364
+ };
365
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
366
+ return buildPageMetadata(model, path, buildInformation, parent, true, localeAlternates);
367
+ }
368
+ catch (error) {
369
+ if (routeConfig.throwOnNotFound)
370
+ handleCmsError(error, errorContext, buildInformation);
371
+ return {};
372
+ }
373
+ }
374
+ async function generateArticleTypePage(articleTypeSlug, path, routeConfig, locale) {
375
+ const errorContext = { type: 'article-type', articleTypeSlug, path };
376
+ try {
377
+ const { articleType, articleTypeErrors, customType, banners, errors } = await getArticleTypeData(articleTypeSlug, locale);
378
+ if (!articleType) {
379
+ if (routeConfig.throwOnNotFound)
380
+ return devNotFound('article type not found', { articleTypeSlug, path }, articleTypeErrors);
381
+ return undefined;
382
+ }
383
+ if (constants.requireCustomTypeForArticleTypes && !customType) {
384
+ if (routeConfig.throwOnNotFound)
385
+ return devNotFound('article type custom type not found', {
386
+ articleTypeSlug,
387
+ path,
388
+ customTypeSlug: constants.ARTICLES_SLUG,
389
+ });
390
+ return undefined;
391
+ }
392
+ if (!articleType.contents?.length) {
393
+ if (routeConfig.throwOnNotFound)
394
+ return devNotFound('article type has no contents', { articleTypeSlug, path }, articleTypeErrors);
395
+ return undefined;
396
+ }
397
+ const analyticsContext = {
398
+ slug: path,
399
+ title: articleType.title,
400
+ type: 'article-type-index',
401
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
402
+ };
403
+ const pageContext = mergePreparedPageContext(prepareArticleTypePage
404
+ ? await prepareArticleTypePage({
405
+ articleType,
406
+ customType,
407
+ banners,
408
+ errors,
409
+ path,
410
+ locale,
411
+ articleTypeSlug,
412
+ routeConfig,
413
+ })
414
+ : undefined, { articleType, customType });
415
+ return (_jsx(LayoutComponent, { model: articleType, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: articleType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
416
+ }
417
+ catch (error) {
418
+ if (routeConfig.throwOnNotFound)
419
+ return handleCmsError(error, errorContext, buildInformation);
420
+ return undefined;
421
+ }
422
+ }
423
+ // ============================================================================
424
+ // Article Type Tag
425
+ // ============================================================================
426
+ async function getArticleTypeTagData(articleTypeSlug, tagSlug, locale, fetchProfile = 'page') {
427
+ const options = buildProfileOptions(fetchProfile, locale);
428
+ const isPageRender = fetchProfile === 'page';
429
+ const [articleTypeResponse, tagResponse, articleCustomTypeResponse, tagCustomTypeResponse, bannersResponse,] = await Promise.all([
430
+ getArticleTypeWithErrors(articleTypeSlug, {
431
+ ...options,
432
+ fetchProfile: isPageRender ? 'page' : 'listing',
433
+ customType: isPageRender ? constants.articlesCustomTypeSlug : undefined,
434
+ }),
435
+ getTagWithErrors(tagSlug, { ...options, fetchProfile: 'listing' }),
436
+ constants.articlesCustomTypeSlug
437
+ ? getCustomTypeWithErrors(constants.articlesCustomTypeSlug, {
438
+ ...options,
439
+ fetchProfile: 'listing',
440
+ })
441
+ : Promise.resolve({ data: undefined, errors: [] }),
442
+ getCustomTypeWithErrors(constants.TAGS_SLUG, { ...options, fetchProfile: 'listing' }),
443
+ isPageRender
444
+ ? getBannersWithErrors(options)
445
+ : Promise.resolve({ data: null, errors: [] }),
446
+ ]);
447
+ return {
448
+ articleType: articleTypeResponse.data,
449
+ tag: tagResponse.data,
450
+ articleCustomType: articleCustomTypeResponse.data,
451
+ tagCustomType: tagCustomTypeResponse.data,
452
+ banners: bannersResponse.data,
453
+ errors: [
454
+ ...articleTypeResponse.errors,
455
+ ...tagResponse.errors,
456
+ ...articleCustomTypeResponse.errors,
457
+ ...tagCustomTypeResponse.errors,
458
+ ...bannersResponse.errors,
459
+ ],
460
+ };
461
+ }
462
+ async function generateArticleTypeTagMetadata(articleTypeSlug, tagSlug, path, routeConfig, parent, locale) {
463
+ const errorContext = { type: 'metadata', articleTypeSlug, tagSlug, path };
464
+ try {
465
+ const { articleType, tag, articleCustomType, tagCustomType } = await getArticleTypeTagData(articleTypeSlug, tagSlug, locale, 'listing');
466
+ if (!canRenderArticleTypeTagRoute({
467
+ articleType: articleType ?? undefined,
468
+ tag,
469
+ articleCustomType,
470
+ tagCustomType,
471
+ articlesCustomTypeSlug: constants.articlesCustomTypeSlug,
472
+ tagIndexRequiresCustomType: constants.tagIndexRequiresCustomType,
473
+ requireRenderableContents: false,
474
+ })) {
475
+ if (routeConfig.throwOnNotFound)
476
+ return devNotFound('article type tag not found or not renderable', {
477
+ articleTypeSlug,
478
+ tagSlug,
479
+ path,
480
+ });
481
+ return undefined;
482
+ }
483
+ const { title, description } = calculateTitleAndDescription({
484
+ articleType: articleType,
485
+ tag: tag,
486
+ customType: (articleCustomType ?? tagCustomType ?? undefined),
487
+ });
488
+ const model = {
489
+ indexed: tag.indexed &&
490
+ articleType.indexed &&
491
+ (articleCustomType?.indexed ?? true) &&
492
+ (tagCustomType != null ? tagCustomType.indexed : true),
493
+ featuredImage: tag.featuredImage ??
494
+ articleType.featuredImage ??
495
+ tagCustomType?.featuredImage ??
496
+ articleCustomType?.featuredImage,
497
+ title,
498
+ description,
499
+ };
500
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
501
+ return buildPageMetadata(model, path, buildInformation, parent, undefined, localeAlternates);
502
+ }
503
+ catch (error) {
504
+ if (routeConfig.throwOnNotFound)
505
+ handleCmsError(error, errorContext, buildInformation);
506
+ return {};
507
+ }
508
+ }
509
+ async function generateArticleTypeTagPage(articleTypeSlug, tagSlug, path, routeConfig, locale) {
510
+ const errorContext = { type: 'article-type-tag', articleTypeSlug, tagSlug, path };
511
+ try {
512
+ const { articleType, tag, articleCustomType, tagCustomType, banners, errors } = await getArticleTypeTagData(articleTypeSlug, tagSlug, locale);
513
+ if (!canRenderArticleTypeTagRoute({
514
+ articleType: articleType ?? undefined,
515
+ tag,
516
+ articleCustomType,
517
+ tagCustomType,
518
+ articlesCustomTypeSlug: constants.articlesCustomTypeSlug,
519
+ tagIndexRequiresCustomType: constants.tagIndexRequiresCustomType,
520
+ })) {
521
+ if (routeConfig.throwOnNotFound)
522
+ return devNotFound('article type tag not found or not renderable', { articleTypeSlug, tagSlug, path }, errors);
523
+ return undefined;
524
+ }
525
+ const analyticsContext = {
526
+ slug: path,
527
+ title: `${tag.title} ${articleType.title}`,
528
+ type: 'article-type-tag-index',
529
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
530
+ };
531
+ const pageContext = mergePreparedPageContext(prepareArticleTypeTagPage
532
+ ? await prepareArticleTypeTagPage({
533
+ articleType,
534
+ tag,
535
+ articleCustomType,
536
+ tagCustomType,
537
+ banners,
538
+ errors,
539
+ path,
540
+ locale,
541
+ articleTypeSlug,
542
+ tagSlug,
543
+ routeConfig,
544
+ })
545
+ : undefined, {
546
+ articleType,
547
+ tag,
548
+ customType: articleCustomType ?? tagCustomType ?? undefined,
549
+ });
550
+ return (_jsx(LayoutComponent, { model: articleType, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: articleType.contents ??
551
+ tag.contents ??
552
+ articleCustomType?.contents ??
553
+ tagCustomType?.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
554
+ }
555
+ catch (error) {
556
+ if (routeConfig.throwOnNotFound)
557
+ return handleCmsError(error, errorContext, buildInformation);
558
+ return undefined;
559
+ }
560
+ }
561
+ // ============================================================================
562
+ // Article Types Index (uses ARTICLES_SLUG custom type)
563
+ // ============================================================================
564
+ async function getArticleTypesIndexData(locale, fetchProfile = 'page') {
565
+ const options = buildProfileOptions(fetchProfile, locale);
566
+ const response = await getCustomTypeWithErrors(constants.ARTICLES_SLUG, options);
567
+ return { customType: response.data, errors: response.errors };
568
+ }
569
+ async function generateArticleTypesIndexMetadata(path, routeConfig, parent, locale) {
570
+ const errorContext = { type: 'metadata', path };
571
+ try {
572
+ const { customType, errors: customTypeErrors } = await getArticleTypesIndexData(locale, 'listing');
573
+ if (!customType) {
574
+ if (routeConfig.throwOnNotFound)
575
+ return devNotFound('article types index custom type not found', { customTypeSlug: constants.ARTICLES_SLUG, path }, customTypeErrors);
576
+ return undefined;
577
+ }
578
+ const localeAlternates = locale ? buildLocaleAlternates(`${path}/`, locale) : undefined;
579
+ return buildPageMetadata(customType, `${path}/`, buildInformation, parent, undefined, localeAlternates);
580
+ }
581
+ catch (error) {
582
+ if (routeConfig.throwOnNotFound)
583
+ handleCmsError(error, errorContext, buildInformation);
584
+ return {};
585
+ }
586
+ }
587
+ async function generateArticleTypesIndexPage(path, routeConfig, locale) {
588
+ const errorContext = { type: 'customType', path };
589
+ try {
590
+ const { customType, errors } = await getArticleTypesIndexData(locale);
591
+ if (!customType) {
592
+ if (routeConfig.throwOnNotFound)
593
+ return devNotFound('article types index custom type not found', { customTypeSlug: constants.ARTICLES_SLUG, path }, errors);
594
+ return undefined;
595
+ }
596
+ if (!customType.contents?.length) {
597
+ if (routeConfig.throwOnNotFound)
598
+ return devNotFound('article types index has no contents', { customTypeSlug: constants.ARTICLES_SLUG, path }, errors);
599
+ return undefined;
600
+ }
601
+ const { title, description } = calculateTitleAndDescription({
602
+ customType: customType,
603
+ });
604
+ const analyticsContext = {
605
+ slug: constants.ARTICLES_SLUG,
606
+ title: customType.title,
607
+ type: 'article-types-index',
608
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
609
+ };
610
+ const model = { ...customType, title, description };
611
+ const pageContext = mergePreparedPageContext(prepareArticleTypesIndexPage
612
+ ? await prepareArticleTypesIndexPage({
613
+ customType,
614
+ errors,
615
+ path,
616
+ locale,
617
+ routeConfig,
618
+ })
619
+ : undefined, { customType });
620
+ return (_jsx(LayoutComponent, { model: model, analyticsContext: analyticsContext, errors: errors, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: customType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
621
+ }
622
+ catch (error) {
623
+ if (routeConfig.throwOnNotFound)
624
+ return handleCmsError(error, errorContext, buildInformation);
625
+ return undefined;
626
+ }
627
+ }
628
+ // ============================================================================
629
+ // Tag
630
+ // ============================================================================
631
+ async function getTagData(topic, locale, fetchProfile = 'page') {
632
+ const options = buildProfileOptions(fetchProfile, locale);
633
+ const isPageRender = fetchProfile === 'page';
634
+ const [tagResponse, customTypeResponse, bannersResponse] = await Promise.all([
635
+ getTagWithErrors(topic, {
636
+ ...options,
637
+ customType: isPageRender ? constants.TAGS_SLUG : undefined,
638
+ }),
639
+ getCustomTypeWithErrors(constants.TAGS_SLUG, {
640
+ ...options,
641
+ fetchProfile: isPageRender ? 'page' : 'listing',
642
+ }),
643
+ isPageRender
644
+ ? getBannersWithErrors(options)
645
+ : Promise.resolve({ data: null, errors: [] }),
646
+ ]);
647
+ return {
648
+ tag: tagResponse.data,
649
+ tagErrors: tagResponse.errors,
650
+ customType: customTypeResponse.data,
651
+ banners: bannersResponse.data,
652
+ errors: [...tagResponse.errors, ...customTypeResponse.errors, ...bannersResponse.errors],
653
+ };
654
+ }
655
+ async function generateTagMetadata(tagSlug, path, routeConfig, parent, locale) {
656
+ if (!constants.enableTag)
657
+ return {};
658
+ const errorContext = { type: 'metadata', tag: tagSlug, path };
659
+ try {
660
+ const { tag, tagErrors, customType } = await getTagData(tagSlug, locale, 'listing');
661
+ if (!canRenderTagIndex({
662
+ tag: tag ?? undefined,
663
+ customType,
664
+ tagIndexRequiresCustomType: constants.tagIndexRequiresCustomType,
665
+ requireRenderableContents: false,
666
+ })) {
667
+ if (routeConfig.throwOnNotFound)
668
+ return devNotFound('tag not found or not renderable', { tagSlug, path }, tagErrors);
669
+ return undefined;
670
+ }
671
+ const { title, description } = calculateTitleAndDescription({
672
+ tag: tag,
673
+ customType: customType ?? undefined,
674
+ });
675
+ const model = {
676
+ indexed: tag.indexed && (customType != null ? customType.indexed : true),
677
+ featuredImage: tag.featuredImage ?? customType?.featuredImage,
678
+ title,
679
+ description,
680
+ };
681
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
682
+ return buildPageMetadata(model, path, buildInformation, parent, undefined, localeAlternates);
683
+ }
684
+ catch (error) {
685
+ if (routeConfig.throwOnNotFound)
686
+ handleCmsError(error, errorContext, buildInformation);
687
+ return {};
688
+ }
689
+ }
690
+ async function generateTagPage(tagSlug, path, routeConfig, locale) {
691
+ if (!constants.enableTag)
692
+ return notFound();
693
+ const errorContext = { type: 'tag', tag: tagSlug, path };
694
+ try {
695
+ const { tag, tagErrors, customType, banners, errors } = await getTagData(tagSlug, locale);
696
+ if (!canRenderTagIndex({
697
+ tag: tag ?? undefined,
698
+ customType,
699
+ tagIndexRequiresCustomType: constants.tagIndexRequiresCustomType,
700
+ })) {
701
+ if (routeConfig.throwOnNotFound)
702
+ return devNotFound('tag not found or not renderable', { tagSlug, path }, tagErrors);
703
+ return undefined;
704
+ }
705
+ const analyticsContext = {
706
+ slug: path,
707
+ title: tag.title,
708
+ type: 'tag-index',
709
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
710
+ };
711
+ const pageContext = mergePreparedPageContext(prepareTagPage
712
+ ? await prepareTagPage({
713
+ tag: tag,
714
+ customType,
715
+ banners,
716
+ errors,
717
+ path,
718
+ locale,
719
+ tagSlug,
720
+ routeConfig,
721
+ })
722
+ : undefined, { tag: tag, customType: customType ?? undefined });
723
+ return (_jsx(LayoutComponent, { model: tag, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: tag.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
724
+ }
725
+ catch (error) {
726
+ if (routeConfig.throwOnNotFound)
727
+ return handleCmsError(error, errorContext, buildInformation);
728
+ return undefined;
729
+ }
730
+ }
731
+ // ============================================================================
732
+ // Tags Index (uses TAGS_SLUG custom type)
733
+ // ============================================================================
734
+ async function getTagsIndexData(locale, fetchProfile = 'page') {
735
+ const options = buildProfileOptions(fetchProfile, locale);
736
+ const response = await getCustomTypeWithErrors(constants.TAGS_SLUG, options);
737
+ return { customType: response.data, errors: response.errors };
738
+ }
739
+ async function generateTagsIndexMetadata(path, routeConfig, parent, locale) {
740
+ if (!constants.enableTagsIndex)
741
+ return {};
742
+ const errorContext = { type: 'metadata', path };
743
+ try {
744
+ const { customType, errors: customTypeErrors } = await getTagsIndexData(locale, 'listing');
745
+ if (!customType) {
746
+ if (routeConfig.throwOnNotFound)
747
+ return devNotFound('tags index custom type not found', { customTypeSlug: constants.TAGS_SLUG, path }, customTypeErrors);
748
+ return undefined;
749
+ }
750
+ const localeAlternates = locale ? buildLocaleAlternates(`${path}/`, locale) : undefined;
751
+ return buildPageMetadata(customType, `${path}/`, buildInformation, parent, undefined, localeAlternates);
752
+ }
753
+ catch (error) {
754
+ if (routeConfig.throwOnNotFound)
755
+ handleCmsError(error, errorContext, buildInformation);
756
+ return {};
757
+ }
758
+ }
759
+ async function generateTagsIndexPage(path, routeConfig, locale) {
760
+ if (!constants.enableTagsIndex)
761
+ return notFound();
762
+ const errorContext = { type: 'customType', path };
763
+ try {
764
+ const { customType, errors } = await getTagsIndexData(locale);
765
+ if (!customType) {
766
+ if (routeConfig.throwOnNotFound)
767
+ return devNotFound('tags index custom type not found', { customTypeSlug: constants.TAGS_SLUG, path }, errors);
768
+ return undefined;
769
+ }
770
+ if (!customType.contents?.length) {
771
+ if (routeConfig.throwOnNotFound)
772
+ return devNotFound('tags index has no contents', { customTypeSlug: constants.TAGS_SLUG, path }, errors);
773
+ return undefined;
774
+ }
775
+ const analyticsContext = {
776
+ slug: constants.TAGS_SLUG,
777
+ title: customType.title,
778
+ type: 'tags-index',
779
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
780
+ };
781
+ const model = { ...customType };
782
+ const pageContext = mergePreparedPageContext(prepareTagsIndexPage
783
+ ? await prepareTagsIndexPage({
784
+ customType,
785
+ errors,
786
+ path,
787
+ locale,
788
+ routeConfig,
789
+ })
790
+ : undefined, { customType });
791
+ return (_jsx(LayoutComponent, { model: model, analyticsContext: analyticsContext, errors: errors, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: customType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
792
+ }
793
+ catch (error) {
794
+ if (routeConfig.throwOnNotFound)
795
+ return handleCmsError(error, errorContext, buildInformation);
796
+ return undefined;
797
+ }
798
+ }
799
+ // ============================================================================
800
+ // Person
801
+ // ============================================================================
802
+ async function getPersonData(slug, locale, fetchProfile = 'page') {
803
+ const options = buildProfileOptions(fetchProfile, locale);
804
+ const isPageRender = fetchProfile === 'page';
805
+ const [personResponse, customTypeResponse, bannersResponse] = await Promise.all([
806
+ getPersonWithErrors(slug, {
807
+ ...options,
808
+ customType: isPageRender ? constants.PEOPLE_SLUG : undefined,
809
+ }),
810
+ getCustomTypeWithErrors(constants.PEOPLE_SLUG, {
811
+ ...options,
812
+ fetchProfile: isPageRender ? 'page' : 'listing',
813
+ }),
814
+ isPageRender
815
+ ? getBannersWithErrors(options)
816
+ : Promise.resolve({ data: null, errors: [] }),
817
+ ]);
818
+ return {
819
+ person: personResponse.data,
820
+ personErrors: personResponse.errors,
821
+ customType: customTypeResponse.data,
822
+ banners: bannersResponse.data,
823
+ errors: [...personResponse.errors, ...customTypeResponse.errors, ...bannersResponse.errors],
824
+ };
825
+ }
826
+ async function generatePersonMetadata(personSlug, path, routeConfig, parent, locale) {
827
+ const errorContext = { type: 'metadata', person: personSlug, path };
828
+ try {
829
+ const { person, personErrors, customType } = await getPersonData(personSlug, locale, 'listing');
830
+ if (!person) {
831
+ if (routeConfig.throwOnNotFound)
832
+ return devNotFound('person not found', { personSlug, path }, personErrors);
833
+ return undefined;
834
+ }
835
+ if (!customType) {
836
+ if (routeConfig.throwOnNotFound)
837
+ return devNotFound('person custom type not found', {
838
+ personSlug,
839
+ path,
840
+ customTypeSlug: constants.PEOPLE_SLUG,
841
+ });
842
+ return undefined;
843
+ }
844
+ const { title, description } = calculateTitleAndDescription({
845
+ person: person,
846
+ customType: customType,
847
+ });
848
+ const model = {
849
+ indexed: person.indexed && customType.indexed,
850
+ featuredImage: person.featuredImage ?? customType.featuredImage,
851
+ title,
852
+ description,
853
+ };
854
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
855
+ return buildPageMetadata(model, path, buildInformation, parent, constants.enablePerson, localeAlternates);
856
+ }
857
+ catch (error) {
858
+ if (routeConfig.throwOnNotFound)
859
+ handleCmsError(error, errorContext, buildInformation);
860
+ return {};
861
+ }
862
+ }
863
+ async function generatePersonPage(personSlug, path, routeConfig, locale) {
864
+ const errorContext = { type: 'person', person: personSlug, path };
865
+ try {
866
+ const { person, personErrors, customType, banners, errors } = await getPersonData(personSlug, locale);
867
+ if (!person) {
868
+ if (routeConfig.throwOnNotFound)
869
+ return devNotFound('person not found', { personSlug, path }, personErrors);
870
+ return undefined;
871
+ }
872
+ if (!customType) {
873
+ if (routeConfig.throwOnNotFound)
874
+ return devNotFound('person custom type not found', {
875
+ personSlug,
876
+ path,
877
+ customTypeSlug: constants.PEOPLE_SLUG,
878
+ });
879
+ return undefined;
880
+ }
881
+ const analyticsContext = {
882
+ slug: path,
883
+ title: person.title,
884
+ type: 'person',
885
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
886
+ };
887
+ const pageContext = mergePreparedPageContext(preparePersonPage
888
+ ? await preparePersonPage({
889
+ person,
890
+ customType,
891
+ banners,
892
+ errors,
893
+ path,
894
+ locale,
895
+ personSlug,
896
+ routeConfig,
897
+ })
898
+ : undefined, { person, customType });
899
+ return (_jsx(LayoutComponent, { model: person, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: person.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
900
+ }
901
+ catch (error) {
902
+ if (routeConfig.throwOnNotFound)
903
+ return handleCmsError(error, errorContext, buildInformation);
904
+ return undefined;
905
+ }
906
+ }
907
+ // ============================================================================
908
+ // Team Index (uses PEOPLE_SLUG custom type)
909
+ // ============================================================================
910
+ async function getTeamIndexData(locale, fetchProfile = 'page') {
911
+ const options = buildProfileOptions(fetchProfile, locale);
912
+ const response = await getCustomTypeWithErrors(constants.PEOPLE_SLUG, options);
913
+ return { customType: response.data, errors: response.errors };
914
+ }
915
+ async function generateTeamIndexMetadata(path, routeConfig, parent, locale) {
916
+ const errorContext = { type: 'metadata', path };
917
+ try {
918
+ const { customType, errors: customTypeErrors } = await getTeamIndexData(locale, 'listing');
919
+ if (!customType) {
920
+ if (routeConfig.throwOnNotFound)
921
+ return devNotFound('team index custom type not found', { customTypeSlug: constants.PEOPLE_SLUG, path }, customTypeErrors);
922
+ return undefined;
923
+ }
924
+ const localeAlternates = locale ? buildLocaleAlternates(`${path}/`, locale) : undefined;
925
+ return buildPageMetadata(customType, `${path}/`, buildInformation, parent, undefined, localeAlternates);
926
+ }
927
+ catch (error) {
928
+ if (routeConfig.throwOnNotFound)
929
+ handleCmsError(error, errorContext, buildInformation);
930
+ return {};
931
+ }
932
+ }
933
+ async function generateTeamIndexPage(path, routeConfig, locale) {
934
+ const errorContext = { type: 'customType', path };
935
+ try {
936
+ const { customType, errors } = await getTeamIndexData(locale);
937
+ if (!customType) {
938
+ if (routeConfig.throwOnNotFound)
939
+ return devNotFound('team index custom type not found', { customTypeSlug: constants.PEOPLE_SLUG, path }, errors);
940
+ return undefined;
941
+ }
942
+ if (!customType.contents?.length) {
943
+ if (routeConfig.throwOnNotFound)
944
+ return devNotFound('team index has no contents', { customTypeSlug: constants.PEOPLE_SLUG, path }, errors);
945
+ return undefined;
946
+ }
947
+ const analyticsContext = {
948
+ slug: constants.PEOPLE_SLUG,
949
+ title: customType.title,
950
+ type: 'team-index',
951
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
952
+ };
953
+ const model = { ...customType };
954
+ const pageContext = mergePreparedPageContext(prepareTeamIndexPage
955
+ ? await prepareTeamIndexPage({
956
+ customType,
957
+ errors,
958
+ path,
959
+ locale,
960
+ routeConfig,
961
+ })
962
+ : undefined, { customType });
963
+ return (_jsx(LayoutComponent, { model: model, analyticsContext: analyticsContext, errors: errors, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: customType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
964
+ }
965
+ catch (error) {
966
+ if (routeConfig.throwOnNotFound)
967
+ return handleCmsError(error, errorContext, buildInformation);
968
+ return undefined;
969
+ }
970
+ }
971
+ // ============================================================================
972
+ // Custom Type (generic page backed by a custom type slug)
973
+ // ============================================================================
974
+ async function getCustomTypePageData(customTypeSlug, locale, fetchProfile = 'page') {
975
+ const options = buildProfileOptions(fetchProfile, locale);
976
+ const isPageRender = fetchProfile === 'page';
977
+ const [customTypeResponse, bannersResponse] = await Promise.all([
978
+ getCustomTypeWithErrors(customTypeSlug, options),
979
+ isPageRender
980
+ ? getBannersWithErrors(options)
981
+ : Promise.resolve({ data: null, errors: [] }),
982
+ ]);
983
+ return {
984
+ customType: customTypeResponse.data,
985
+ customTypeErrors: customTypeResponse.errors,
986
+ banners: bannersResponse.data,
987
+ errors: [...customTypeResponse.errors, ...bannersResponse.errors],
988
+ };
989
+ }
990
+ async function generateCustomTypeMetadata(customTypeSlug, path, routeConfig, parent, locale) {
991
+ const errorContext = { type: 'metadata', customTypeSlug, path };
992
+ try {
993
+ const { customType, customTypeErrors } = await getCustomTypePageData(customTypeSlug, locale, 'listing');
994
+ if (!customType) {
995
+ if (routeConfig.throwOnNotFound)
996
+ return devNotFound('custom type not found', { customTypeSlug, path }, customTypeErrors);
997
+ return undefined;
998
+ }
999
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
1000
+ return buildPageMetadata(customType, path, buildInformation, parent, undefined, localeAlternates);
1001
+ }
1002
+ catch (error) {
1003
+ if (routeConfig.throwOnNotFound)
1004
+ handleCmsError(error, errorContext, buildInformation);
1005
+ return {};
1006
+ }
1007
+ }
1008
+ async function generateCustomTypePage(customTypeSlug, path, routeConfig, locale) {
1009
+ const errorContext = { type: 'customType', customTypeSlug, path };
1010
+ try {
1011
+ const { customType, customTypeErrors, banners, errors } = await getCustomTypePageData(customTypeSlug, locale);
1012
+ if (!customType) {
1013
+ if (routeConfig.throwOnNotFound)
1014
+ return devNotFound('custom type not found', { customTypeSlug, path }, customTypeErrors);
1015
+ return undefined;
1016
+ }
1017
+ const analyticsContext = {
1018
+ slug: path,
1019
+ title: customType.title,
1020
+ type: 'custom-type-index',
1021
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
1022
+ };
1023
+ const pageContext = mergePreparedPageContext(prepareCustomTypePage
1024
+ ? await prepareCustomTypePage({
1025
+ customType,
1026
+ banners,
1027
+ errors,
1028
+ path,
1029
+ locale,
1030
+ customTypeSlug,
1031
+ routeConfig,
1032
+ })
1033
+ : undefined, { customType });
1034
+ return (_jsx(LayoutComponent, { model: customType, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: customType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
1035
+ }
1036
+ catch (error) {
1037
+ if (routeConfig.throwOnNotFound)
1038
+ return handleCmsError(error, errorContext, buildInformation);
1039
+ return undefined;
1040
+ }
1041
+ }
1042
+ // ============================================================================
1043
+ // Tag Type
1044
+ // ============================================================================
1045
+ async function getTagTypeData(tagTypeSlug, locale, fetchProfile = 'page') {
1046
+ if (!getTagTypeWithErrors)
1047
+ return { tagType: null, tagTypeErrors: [], banners: null, errors: [] };
1048
+ const options = buildProfileOptions(fetchProfile, locale);
1049
+ const isPageRender = fetchProfile === 'page';
1050
+ const [tagTypeResponse, bannersResponse] = await Promise.all([
1051
+ getTagTypeWithErrors(tagTypeSlug, {
1052
+ ...options,
1053
+ customType: isPageRender ? constants.TAGS_SLUG : undefined,
1054
+ }),
1055
+ isPageRender
1056
+ ? getBannersWithErrors(options)
1057
+ : Promise.resolve({ data: null, errors: [] }),
1058
+ ]);
1059
+ return {
1060
+ tagType: tagTypeResponse.data,
1061
+ tagTypeErrors: tagTypeResponse.errors,
1062
+ banners: bannersResponse.data,
1063
+ errors: [...tagTypeResponse.errors, ...bannersResponse.errors],
1064
+ };
1065
+ }
1066
+ async function generateTagTypeMetadata(tagTypeSlug, path, routeConfig, parent, locale) {
1067
+ if (!getTagTypeWithErrors)
1068
+ return {};
1069
+ const errorContext = { type: 'metadata', tagTypeSlug, path };
1070
+ try {
1071
+ const { tagType, tagTypeErrors } = await getTagTypeData(tagTypeSlug, locale, 'listing');
1072
+ if (!tagType) {
1073
+ if (routeConfig.throwOnNotFound)
1074
+ return devNotFound('tag type not found', { tagTypeSlug, path }, tagTypeErrors);
1075
+ return undefined;
1076
+ }
1077
+ const model = {
1078
+ indexed: true,
1079
+ featuredImage: undefined,
1080
+ title: tagType.name,
1081
+ description: '',
1082
+ };
1083
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
1084
+ return buildPageMetadata(model, path, buildInformation, parent, true, localeAlternates);
1085
+ }
1086
+ catch (error) {
1087
+ if (routeConfig.throwOnNotFound)
1088
+ handleCmsError(error, errorContext, buildInformation);
1089
+ return {};
1090
+ }
1091
+ }
1092
+ async function generateTagTypePage(tagTypeSlug, path, routeConfig, locale) {
1093
+ if (!getTagTypeWithErrors)
1094
+ return undefined;
1095
+ const errorContext = { type: 'tagType', tagTypeSlug, path };
1096
+ try {
1097
+ const { tagType, tagTypeErrors, banners, errors } = await getTagTypeData(tagTypeSlug, locale);
1098
+ if (!tagType) {
1099
+ if (routeConfig.throwOnNotFound)
1100
+ return devNotFound('tag type not found', { tagTypeSlug, path }, tagTypeErrors);
1101
+ return undefined;
1102
+ }
1103
+ if (!tagType.contents?.length) {
1104
+ if (routeConfig.throwOnNotFound)
1105
+ return devNotFound('tag type has no contents', { tagTypeSlug, path }, tagTypeErrors);
1106
+ return undefined;
1107
+ }
1108
+ const analyticsContext = {
1109
+ slug: path,
1110
+ title: tagType.title ?? tagType.name,
1111
+ type: 'tag-type-index',
1112
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
1113
+ };
1114
+ const pageContext = mergePreparedPageContext(prepareTagTypePage
1115
+ ? await prepareTagTypePage({
1116
+ tagType,
1117
+ customType: null,
1118
+ banners,
1119
+ errors,
1120
+ path,
1121
+ locale,
1122
+ tagTypeSlug,
1123
+ routeConfig,
1124
+ })
1125
+ : undefined, { tagType });
1126
+ return (_jsx(LayoutComponent, { model: tagType, analyticsContext: analyticsContext, errors: errors, banners: banners, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: toBreadcrumbOptions(routeConfig), currentLocale: locale, currentPath: path, children: _jsx(CmsContent, { contents: tagType.contents, rendererConfig: rendererConfig, pageContext: pageContext, analyticsContext: analyticsContext }) }));
1127
+ }
1128
+ catch (error) {
1129
+ if (routeConfig.throwOnNotFound)
1130
+ return handleCmsError(error, errorContext, buildInformation);
1131
+ return undefined;
1132
+ }
1133
+ }
1134
+ // ============================================================================
1135
+ // Template
1136
+ // ============================================================================
1137
+ const notFoundCmsLabel = templatesConfig?.notFoundCmsLabel ?? '404';
1138
+ const notFoundTitle = templatesConfig?.notFoundTitle ?? 'Page Not Found';
1139
+ const notFoundDescription = templatesConfig?.notFoundDescription ?? 'The page you are looking for could not be found.';
1140
+ function renderTemplateFallback(heading, message) {
1141
+ return (_jsxs("div", { className: "flex min-h-screen flex-col items-center justify-center", children: [_jsx("h1", { className: "mb-4 text-4xl font-bold", children: heading }), _jsx("p", { className: "text-lg", children: message ?? heading })] }));
1142
+ }
1143
+ function generateNotFoundMetadata() {
1144
+ if (templatesConfig?.notFoundMetadata) {
1145
+ return templatesConfig.notFoundMetadata;
1146
+ }
1147
+ const siteTitle = buildInformation.applicationName ?? buildInformation.customerName;
1148
+ return {
1149
+ title: `${notFoundTitle} | ${siteTitle}`,
1150
+ description: notFoundDescription,
1151
+ robots: { index: false, follow: false },
1152
+ };
1153
+ }
1154
+ async function generateTemplateMetadata(cmsLabel, path, routeConfig, parent, options) {
1155
+ const errorContext = { type: 'metadata', cmsLabel, path };
1156
+ const locale = options?.locale;
1157
+ try {
1158
+ const response = await getTemplateWithErrors(cmsLabel, buildProfileOptions('page', locale));
1159
+ const template = response.data;
1160
+ if (!template) {
1161
+ if (routeConfig.throwOnNotFound)
1162
+ return devNotFound('template not found', { cmsLabel, path });
1163
+ return {};
1164
+ }
1165
+ const model = buildTemplateModel(template, cmsLabel, path, options);
1166
+ const localeAlternates = locale ? buildLocaleAlternates(path, locale) : undefined;
1167
+ return buildPageMetadata(model, path, buildInformation, parent, false, localeAlternates);
1168
+ }
1169
+ catch (error) {
1170
+ if (routeConfig.throwOnNotFound)
1171
+ handleCmsError(error, errorContext, buildInformation);
1172
+ return {};
1173
+ }
1174
+ }
1175
+ async function generateTemplatePage(cmsLabel, path, routeConfig, options) {
1176
+ const errorContext = { type: 'template', cmsLabel, path };
1177
+ const locale = options?.locale;
1178
+ try {
1179
+ const response = await getTemplateWithErrors(cmsLabel, buildProfileOptions('page', locale));
1180
+ const template = response.data;
1181
+ const templateErrors = response.errors;
1182
+ if (!template) {
1183
+ if (routeConfig.throwOnNotFound) {
1184
+ return devNotFound('template not found', { cmsLabel, path }, templateErrors);
1185
+ }
1186
+ return renderTemplateFallback(options?.fallbackHeading ?? options?.title ?? cmsLabel, options?.title);
1187
+ }
1188
+ const model = buildTemplateModel(template, cmsLabel, path, options);
1189
+ const analyticsContext = {
1190
+ slug: model.slug,
1191
+ title: model.title,
1192
+ type: model.type,
1193
+ ...(routeConfig.videoEmbedDnt && { dnt: true }),
1194
+ };
1195
+ const breadcrumbOptions = {
1196
+ show: options?.children ? false : routeConfig.showBreadcrumbs,
1197
+ truncate: routeConfig.truncateBreadcrumbs,
1198
+ };
1199
+ const contents = templateContents(template);
1200
+ const body = options?.children ?? (_jsx(CmsContent, { contents: contents, rendererConfig: rendererConfig, pageContext: {}, analyticsContext: analyticsContext }));
1201
+ return (_jsx(LayoutComponent, { model: model, analyticsContext: analyticsContext, errors: templateErrors, rendererConfig: rendererConfig, previewHelpers: rendererConfig.previewHelpers, breadcrumbOptions: breadcrumbOptions, currentLocale: locale, currentPath: path, children: body }));
1202
+ }
1203
+ catch (error) {
1204
+ return handleCmsError(error, errorContext, buildInformation);
1205
+ }
1206
+ }
1207
+ async function generateNotFoundPage(locale) {
1208
+ return generateTemplatePage(notFoundCmsLabel, '/404/', { throwOnNotFound: false, showBreadcrumbs: false, truncateBreadcrumbs: false }, {
1209
+ locale,
1210
+ title: notFoundTitle,
1211
+ description: notFoundDescription,
1212
+ slug: '404',
1213
+ href: '/404/',
1214
+ type: 'template',
1215
+ indexed: false,
1216
+ hidden: true,
1217
+ fallbackHeading: '404',
1218
+ });
1219
+ }
1220
+ async function getTemplateLayoutShell(cmsLabel, locale) {
1221
+ return withFlatNavRequestCache(async () => {
1222
+ const response = await getTemplateWithErrors(cmsLabel, buildProfileOptions('page', locale));
1223
+ if (!response.data) {
1224
+ return { data: null, errors: response.errors };
1225
+ }
1226
+ return { data: buildTemplateLayoutShell(response.data), errors: response.errors };
1227
+ });
1228
+ }
1229
+ // ============================================================================
1230
+ /**
1231
+ * Full page renders (layout + collections) share flat-nav registry/link-index fetches
1232
+ * within one request. Metadata handlers use listing profile and skip flat nav.
1233
+ */
1234
+ const bindCmsPageRender = (fn) => ((...args) => withFlatNavRequestCache(() => fn(...args)));
1235
+ return {
1236
+ buildLocaleAlternates,
1237
+ generatePage: bindCmsPageRender(generatePage),
1238
+ generatePageMetadata,
1239
+ generatePageTestMetadata,
1240
+ generatePageTest: bindCmsPageRender(generatePageTest),
1241
+ generateArticlePage: bindCmsPageRender(generateArticlePage),
1242
+ generateArticleMetadata,
1243
+ generateArticleTypePage: bindCmsPageRender(generateArticleTypePage),
1244
+ generateArticleTypeMetadata,
1245
+ generateArticleTypeTagPage: bindCmsPageRender(generateArticleTypeTagPage),
1246
+ generateArticleTypeTagMetadata,
1247
+ generateArticleTypesIndexPage: bindCmsPageRender(generateArticleTypesIndexPage),
1248
+ generateArticleTypesIndexMetadata,
1249
+ generateTagPage: bindCmsPageRender(generateTagPage),
1250
+ generateTagMetadata,
1251
+ generateTagsIndexPage: bindCmsPageRender(generateTagsIndexPage),
1252
+ generateTagsIndexMetadata,
1253
+ generatePersonPage: bindCmsPageRender(generatePersonPage),
1254
+ generatePersonMetadata,
1255
+ generateTeamIndexPage: bindCmsPageRender(generateTeamIndexPage),
1256
+ generateTeamIndexMetadata,
1257
+ generateCustomTypePage: bindCmsPageRender(generateCustomTypePage),
1258
+ generateCustomTypeMetadata,
1259
+ generateTagTypePage: bindCmsPageRender(generateTagTypePage),
1260
+ generateTagTypeMetadata,
1261
+ generateTemplatePage: bindCmsPageRender(generateTemplatePage),
1262
+ generateTemplateMetadata,
1263
+ generateNotFoundPage: bindCmsPageRender(generateNotFoundPage),
1264
+ generateNotFoundMetadata,
1265
+ getTemplateLayoutShell,
1266
+ };
1267
+ }
1268
+ //# sourceMappingURL=route-handlers.js.map