@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.
- package/ANALYTICS.md +160 -0
- package/CHANGELOG.md +2565 -0
- package/CMS_INFRASTRUCTURE.md +370 -0
- package/CONSENT.md +121 -0
- package/README.md +638 -0
- package/dist/CmsRendererConfig.d.ts +259 -0
- package/dist/CmsRendererConfig.d.ts.map +1 -0
- package/dist/CmsRendererConfig.js +2 -0
- package/dist/CmsRendererConfig.js.map +1 -0
- package/dist/__mocks__/server-only.d.ts +2 -0
- package/dist/__mocks__/server-only.d.ts.map +1 -0
- package/dist/__mocks__/server-only.js +2 -0
- package/dist/__mocks__/server-only.js.map +1 -0
- package/dist/analytics/AnalyticsPageTracker.d.ts +11 -0
- package/dist/analytics/AnalyticsPageTracker.d.ts.map +1 -0
- package/dist/analytics/AnalyticsPageTracker.js +26 -0
- package/dist/analytics/AnalyticsPageTracker.js.map +1 -0
- package/dist/analytics/AnalyticsProvider.d.ts +18 -0
- package/dist/analytics/AnalyticsProvider.d.ts.map +1 -0
- package/dist/analytics/AnalyticsProvider.js +48 -0
- package/dist/analytics/AnalyticsProvider.js.map +1 -0
- package/dist/analytics/adapters/CompositeAnalyticsAdapter.d.ts +13 -0
- package/dist/analytics/adapters/CompositeAnalyticsAdapter.d.ts.map +1 -0
- package/dist/analytics/adapters/CompositeAnalyticsAdapter.js +35 -0
- package/dist/analytics/adapters/CompositeAnalyticsAdapter.js.map +1 -0
- package/dist/analytics/adapters/ConsentAwareAdapter.d.ts +20 -0
- package/dist/analytics/adapters/ConsentAwareAdapter.d.ts.map +1 -0
- package/dist/analytics/adapters/ConsentAwareAdapter.js +35 -0
- package/dist/analytics/adapters/ConsentAwareAdapter.js.map +1 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts +12 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts.map +1 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js +22 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js.map +1 -0
- package/dist/analytics/adapters/GoogleTagManagerAdapter.d.ts +53 -0
- package/dist/analytics/adapters/GoogleTagManagerAdapter.d.ts.map +1 -0
- package/dist/analytics/adapters/GoogleTagManagerAdapter.js +134 -0
- package/dist/analytics/adapters/GoogleTagManagerAdapter.js.map +1 -0
- package/dist/analytics/adapters/index.d.ts +5 -0
- package/dist/analytics/adapters/index.d.ts.map +1 -0
- package/dist/analytics/adapters/index.js +5 -0
- package/dist/analytics/adapters/index.js.map +1 -0
- package/dist/analytics/types.d.ts +42 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +2 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/useAnalytics.d.ts +44 -0
- package/dist/analytics/useAnalytics.d.ts.map +1 -0
- package/dist/analytics/useAnalytics.js +69 -0
- package/dist/analytics/useAnalytics.js.map +1 -0
- package/dist/analytics/video/classifySeek.d.ts +15 -0
- package/dist/analytics/video/classifySeek.d.ts.map +1 -0
- package/dist/analytics/video/classifySeek.js +32 -0
- package/dist/analytics/video/classifySeek.js.map +1 -0
- package/dist/analytics/video/createVideoEngagementSession.d.ts +51 -0
- package/dist/analytics/video/createVideoEngagementSession.d.ts.map +1 -0
- package/dist/analytics/video/createVideoEngagementSession.js +225 -0
- package/dist/analytics/video/createVideoEngagementSession.js.map +1 -0
- package/dist/analytics/video/index.d.ts +6 -0
- package/dist/analytics/video/index.d.ts.map +1 -0
- package/dist/analytics/video/index.js +6 -0
- package/dist/analytics/video/index.js.map +1 -0
- package/dist/analytics/video/loadYouTubeIframeApi.d.ts +50 -0
- package/dist/analytics/video/loadYouTubeIframeApi.d.ts.map +1 -0
- package/dist/analytics/video/loadYouTubeIframeApi.js +52 -0
- package/dist/analytics/video/loadYouTubeIframeApi.js.map +1 -0
- package/dist/analytics/video/useHtml5VideoEngagement.d.ts +8 -0
- package/dist/analytics/video/useHtml5VideoEngagement.d.ts.map +1 -0
- package/dist/analytics/video/useHtml5VideoEngagement.js +67 -0
- package/dist/analytics/video/useHtml5VideoEngagement.js.map +1 -0
- package/dist/analytics/video/useVideoEngagement.d.ts +19 -0
- package/dist/analytics/video/useVideoEngagement.d.ts.map +1 -0
- package/dist/analytics/video/useVideoEngagement.js +80 -0
- package/dist/analytics/video/useVideoEngagement.js.map +1 -0
- package/dist/analytics/video/videoEngagementTypes.d.ts +52 -0
- package/dist/analytics/video/videoEngagementTypes.d.ts.map +1 -0
- package/dist/analytics/video/videoEngagementTypes.js +45 -0
- package/dist/analytics/video/videoEngagementTypes.js.map +1 -0
- package/dist/app-helpers.d.ts +196 -0
- package/dist/app-helpers.d.ts.map +1 -0
- package/dist/app-helpers.js +322 -0
- package/dist/app-helpers.js.map +1 -0
- package/dist/cmsRegistration.d.ts +302 -0
- package/dist/cmsRegistration.d.ts.map +1 -0
- package/dist/cmsRegistration.js +242 -0
- package/dist/cmsRegistration.js.map +1 -0
- package/dist/components/Animation.d.ts +3 -0
- package/dist/components/Animation.d.ts.map +1 -0
- package/dist/components/Animation.js +2 -0
- package/dist/components/Animation.js.map +1 -0
- package/dist/components/AnimationComponent.d.ts +9 -0
- package/dist/components/AnimationComponent.d.ts.map +1 -0
- package/dist/components/AnimationComponent.js +18 -0
- package/dist/components/AnimationComponent.js.map +1 -0
- package/dist/components/ClientMonitor.d.ts +7 -0
- package/dist/components/ClientMonitor.d.ts.map +1 -0
- package/dist/components/ClientMonitor.js +368 -0
- package/dist/components/ClientMonitor.js.map +1 -0
- package/dist/components/CmsCollection.d.ts +68 -0
- package/dist/components/CmsCollection.d.ts.map +1 -0
- package/dist/components/CmsCollection.js +68 -0
- package/dist/components/CmsCollection.js.map +1 -0
- package/dist/components/CmsComponent.d.ts +68 -0
- package/dist/components/CmsComponent.d.ts.map +1 -0
- package/dist/components/CmsComponent.js +68 -0
- package/dist/components/CmsComponent.js.map +1 -0
- package/dist/components/CmsContent.d.ts +105 -0
- package/dist/components/CmsContent.d.ts.map +1 -0
- package/dist/components/CmsContent.js +200 -0
- package/dist/components/CmsContent.js.map +1 -0
- package/dist/components/CmsConversionErrors.d.ts +8 -0
- package/dist/components/CmsConversionErrors.d.ts.map +1 -0
- package/dist/components/CmsConversionErrors.js +51 -0
- package/dist/components/CmsConversionErrors.js.map +1 -0
- package/dist/components/CmsDataError.d.ts +14 -0
- package/dist/components/CmsDataError.d.ts.map +1 -0
- package/dist/components/CmsDataError.js +7 -0
- package/dist/components/CmsDataError.js.map +1 -0
- package/dist/components/CmsDevLayout.d.ts +23 -0
- package/dist/components/CmsDevLayout.d.ts.map +1 -0
- package/dist/components/CmsDevLayout.js +26 -0
- package/dist/components/CmsDevLayout.js.map +1 -0
- package/dist/components/CmsEmbeddedContent.d.ts +10 -0
- package/dist/components/CmsEmbeddedContent.d.ts.map +1 -0
- package/dist/components/CmsEmbeddedContent.js +51 -0
- package/dist/components/CmsEmbeddedContent.js.map +1 -0
- package/dist/components/CmsExternalComponent.d.ts +63 -0
- package/dist/components/CmsExternalComponent.d.ts.map +1 -0
- package/dist/components/CmsExternalComponent.js +68 -0
- package/dist/components/CmsExternalComponent.js.map +1 -0
- package/dist/components/CmsRoutesLayout.d.ts +16 -0
- package/dist/components/CmsRoutesLayout.d.ts.map +1 -0
- package/dist/components/CmsRoutesLayout.js +17 -0
- package/dist/components/CmsRoutesLayout.js.map +1 -0
- package/dist/components/DefaultExternalVideoPlayButton.d.ts +3 -0
- package/dist/components/DefaultExternalVideoPlayButton.d.ts.map +1 -0
- package/dist/components/DefaultExternalVideoPlayButton.js +6 -0
- package/dist/components/DefaultExternalVideoPlayButton.js.map +1 -0
- package/dist/components/DotLottieAnimationComponent.d.ts +16 -0
- package/dist/components/DotLottieAnimationComponent.d.ts.map +1 -0
- package/dist/components/DotLottieAnimationComponent.js +88 -0
- package/dist/components/DotLottieAnimationComponent.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +19 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +32 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ExternalVideoComponent.d.ts +9 -0
- package/dist/components/ExternalVideoComponent.d.ts.map +1 -0
- package/dist/components/ExternalVideoComponent.js +39 -0
- package/dist/components/ExternalVideoComponent.js.map +1 -0
- package/dist/components/ExternalVimeoEmbed.d.ts +12 -0
- package/dist/components/ExternalVimeoEmbed.d.ts.map +1 -0
- package/dist/components/ExternalVimeoEmbed.js +211 -0
- package/dist/components/ExternalVimeoEmbed.js.map +1 -0
- package/dist/components/ExternalYouTubeEmbed.d.ts +9 -0
- package/dist/components/ExternalYouTubeEmbed.d.ts.map +1 -0
- package/dist/components/ExternalYouTubeEmbed.js +220 -0
- package/dist/components/ExternalYouTubeEmbed.js.map +1 -0
- package/dist/components/HeroLoopVideo.d.ts +13 -0
- package/dist/components/HeroLoopVideo.d.ts.map +1 -0
- package/dist/components/HeroLoopVideo.js +146 -0
- package/dist/components/HeroLoopVideo.js.map +1 -0
- package/dist/components/HtmlComponent.d.ts +21 -0
- package/dist/components/HtmlComponent.d.ts.map +1 -0
- package/dist/components/HtmlComponent.js +34 -0
- package/dist/components/HtmlComponent.js.map +1 -0
- package/dist/components/HtmlComponentScript.d.ts +12 -0
- package/dist/components/HtmlComponentScript.d.ts.map +1 -0
- package/dist/components/HtmlComponentScript.js +12 -0
- package/dist/components/HtmlComponentScript.js.map +1 -0
- package/dist/components/ImageComponent.d.ts +7 -0
- package/dist/components/ImageComponent.d.ts.map +1 -0
- package/dist/components/ImageComponent.js +20 -0
- package/dist/components/ImageComponent.js.map +1 -0
- package/dist/components/ImageKitClientVideo.d.ts +16 -0
- package/dist/components/ImageKitClientVideo.d.ts.map +1 -0
- package/dist/components/ImageKitClientVideo.js +211 -0
- package/dist/components/ImageKitClientVideo.js.map +1 -0
- package/dist/components/ImageKitHlsVideoClient.d.ts +21 -0
- package/dist/components/ImageKitHlsVideoClient.d.ts.map +1 -0
- package/dist/components/ImageKitHlsVideoClient.js +167 -0
- package/dist/components/ImageKitHlsVideoClient.js.map +1 -0
- package/dist/components/LazyAnimation.d.ts +16 -0
- package/dist/components/LazyAnimation.d.ts.map +1 -0
- package/dist/components/LazyAnimation.js +90 -0
- package/dist/components/LazyAnimation.js.map +1 -0
- package/dist/components/LazyVideo.d.ts +19 -0
- package/dist/components/LazyVideo.d.ts.map +1 -0
- package/dist/components/LazyVideo.js +134 -0
- package/dist/components/LazyVideo.js.map +1 -0
- package/dist/components/LocalVideo.d.ts +10 -0
- package/dist/components/LocalVideo.d.ts.map +1 -0
- package/dist/components/LocalVideo.js +66 -0
- package/dist/components/LocalVideo.js.map +1 -0
- package/dist/components/LocalVideoPlayChrome.d.ts +20 -0
- package/dist/components/LocalVideoPlayChrome.d.ts.map +1 -0
- package/dist/components/LocalVideoPlayChrome.js +22 -0
- package/dist/components/LocalVideoPlayChrome.js.map +1 -0
- package/dist/components/LocalVideoPlayOverlay.d.ts +19 -0
- package/dist/components/LocalVideoPlayOverlay.d.ts.map +1 -0
- package/dist/components/LocalVideoPlayOverlay.js +49 -0
- package/dist/components/LocalVideoPlayOverlay.js.map +1 -0
- package/dist/components/PictureComponent.d.ts +7 -0
- package/dist/components/PictureComponent.d.ts.map +1 -0
- package/dist/components/PictureComponent.js +29 -0
- package/dist/components/PictureComponent.js.map +1 -0
- package/dist/components/Preview.d.ts +2 -0
- package/dist/components/Preview.d.ts.map +1 -0
- package/dist/components/Preview.js +52 -0
- package/dist/components/Preview.js.map +1 -0
- package/dist/components/StructuredData.d.ts +20 -0
- package/dist/components/StructuredData.d.ts.map +1 -0
- package/dist/components/StructuredData.js +116 -0
- package/dist/components/StructuredData.js.map +1 -0
- package/dist/components/SvgComponent.d.ts +7 -0
- package/dist/components/SvgComponent.d.ts.map +1 -0
- package/dist/components/SvgComponent.js +10 -0
- package/dist/components/SvgComponent.js.map +1 -0
- package/dist/components/SvgIconComponent.d.ts +20 -0
- package/dist/components/SvgIconComponent.d.ts.map +1 -0
- package/dist/components/SvgIconComponent.js +23 -0
- package/dist/components/SvgIconComponent.js.map +1 -0
- package/dist/components/SvgImageComponent.d.ts +7 -0
- package/dist/components/SvgImageComponent.d.ts.map +1 -0
- package/dist/components/SvgImageComponent.js +10 -0
- package/dist/components/SvgImageComponent.js.map +1 -0
- package/dist/components/SvgSpriteSheet.d.ts +24 -0
- package/dist/components/SvgSpriteSheet.d.ts.map +1 -0
- package/dist/components/SvgSpriteSheet.js +37 -0
- package/dist/components/SvgSpriteSheet.js.map +1 -0
- package/dist/components/Video.d.ts +11 -0
- package/dist/components/Video.d.ts.map +1 -0
- package/dist/components/Video.js +2 -0
- package/dist/components/Video.js.map +1 -0
- package/dist/components/VideoComponent.d.ts +10 -0
- package/dist/components/VideoComponent.d.ts.map +1 -0
- package/dist/components/VideoComponent.js +22 -0
- package/dist/components/VideoComponent.js.map +1 -0
- package/dist/components/Visual.d.ts +43 -0
- package/dist/components/Visual.d.ts.map +1 -0
- package/dist/components/Visual.js +60 -0
- package/dist/components/Visual.js.map +1 -0
- package/dist/components/VisualComponent.d.ts +83 -0
- package/dist/components/VisualComponent.d.ts.map +1 -0
- package/dist/components/VisualComponent.js +136 -0
- package/dist/components/VisualComponent.js.map +1 -0
- package/dist/components/banner/BannerClient.d.ts +13 -0
- package/dist/components/banner/BannerClient.d.ts.map +1 -0
- package/dist/components/banner/BannerClient.js +38 -0
- package/dist/components/banner/BannerClient.js.map +1 -0
- package/dist/components/banner/BannerManager.d.ts +26 -0
- package/dist/components/banner/BannerManager.d.ts.map +1 -0
- package/dist/components/banner/BannerManager.js +35 -0
- package/dist/components/banner/BannerManager.js.map +1 -0
- package/dist/components/banner/BannerTargeting.d.ts +20 -0
- package/dist/components/banner/BannerTargeting.d.ts.map +1 -0
- package/dist/components/banner/BannerTargeting.js +204 -0
- package/dist/components/banner/BannerTargeting.js.map +1 -0
- package/dist/components/banner/bannerVisibility.d.ts +20 -0
- package/dist/components/banner/bannerVisibility.d.ts.map +1 -0
- package/dist/components/banner/bannerVisibility.js +73 -0
- package/dist/components/banner/bannerVisibility.js.map +1 -0
- package/dist/components/clientMonitorVideos.d.ts +6 -0
- package/dist/components/clientMonitorVideos.d.ts.map +1 -0
- package/dist/components/clientMonitorVideos.js +116 -0
- package/dist/components/clientMonitorVideos.js.map +1 -0
- package/dist/components/dotlottieWasm.d.ts +19 -0
- package/dist/components/dotlottieWasm.d.ts.map +1 -0
- package/dist/components/dotlottieWasm.js +62 -0
- package/dist/components/dotlottieWasm.js.map +1 -0
- package/dist/components/heroLoop.d.ts +22 -0
- package/dist/components/heroLoop.d.ts.map +1 -0
- package/dist/components/heroLoop.js +24 -0
- package/dist/components/heroLoop.js.map +1 -0
- package/dist/components/svg.d.ts +3 -0
- package/dist/components/svg.d.ts.map +1 -0
- package/dist/components/svg.js +64 -0
- package/dist/components/svg.js.map +1 -0
- package/dist/context/ExternalVideoPlayButtonContext.d.ts +7 -0
- package/dist/context/ExternalVideoPlayButtonContext.d.ts.map +1 -0
- package/dist/context/ExternalVideoPlayButtonContext.js +11 -0
- package/dist/context/ExternalVideoPlayButtonContext.js.map +1 -0
- package/dist/elements/RtfOrString.d.ts +26 -0
- package/dist/elements/RtfOrString.d.ts.map +1 -0
- package/dist/elements/RtfOrString.js +13 -0
- package/dist/elements/RtfOrString.js.map +1 -0
- package/dist/elements/TrackedLink.d.ts +25 -0
- package/dist/elements/TrackedLink.d.ts.map +1 -0
- package/dist/elements/TrackedLink.js +96 -0
- package/dist/elements/TrackedLink.js.map +1 -0
- package/dist/elements/UtmLink.d.ts +7 -0
- package/dist/elements/UtmLink.d.ts.map +1 -0
- package/dist/elements/UtmLink.js +24 -0
- package/dist/elements/UtmLink.js.map +1 -0
- package/dist/framework/BackgroundMedia.d.ts +12 -0
- package/dist/framework/BackgroundMedia.d.ts.map +1 -0
- package/dist/framework/BackgroundMedia.js +23 -0
- package/dist/framework/BackgroundMedia.js.map +1 -0
- package/dist/framework/ComponentErrorIndicator.d.ts +12 -0
- package/dist/framework/ComponentErrorIndicator.d.ts.map +1 -0
- package/dist/framework/ComponentErrorIndicator.js +29 -0
- package/dist/framework/ComponentErrorIndicator.js.map +1 -0
- package/dist/framework/ContainedVisual.d.ts +12 -0
- package/dist/framework/ContainedVisual.d.ts.map +1 -0
- package/dist/framework/ContainedVisual.js +14 -0
- package/dist/framework/ContainedVisual.js.map +1 -0
- package/dist/framework/ResponsiveVisual.d.ts +14 -0
- package/dist/framework/ResponsiveVisual.d.ts.map +1 -0
- package/dist/framework/ResponsiveVisual.js +14 -0
- package/dist/framework/ResponsiveVisual.js.map +1 -0
- package/dist/framework/componentErrors.d.ts +19 -0
- package/dist/framework/componentErrors.d.ts.map +1 -0
- package/dist/framework/componentErrors.js +31 -0
- package/dist/framework/componentErrors.js.map +1 -0
- package/dist/hooks/useClickTracking.d.ts +58 -0
- package/dist/hooks/useClickTracking.d.ts.map +1 -0
- package/dist/hooks/useClickTracking.js +48 -0
- package/dist/hooks/useClickTracking.js.map +1 -0
- package/dist/hooks/useDocumentVisible.d.ts +2 -0
- package/dist/hooks/useDocumentVisible.d.ts.map +1 -0
- package/dist/hooks/useDocumentVisible.js +17 -0
- package/dist/hooks/useDocumentVisible.js.map +1 -0
- package/dist/hooks/visibility.d.ts +14 -0
- package/dist/hooks/visibility.d.ts.map +1 -0
- package/dist/hooks/visibility.js +122 -0
- package/dist/hooks/visibility.js.map +1 -0
- package/dist/index.d.ts +134 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/media-library/MediaLibraryAnimationPlayer.d.ts +9 -0
- package/dist/media-library/MediaLibraryAnimationPlayer.d.ts.map +1 -0
- package/dist/media-library/MediaLibraryAnimationPlayer.js +99 -0
- package/dist/media-library/MediaLibraryAnimationPlayer.js.map +1 -0
- package/dist/media-library/MediaLibraryGrid.d.ts +5 -0
- package/dist/media-library/MediaLibraryGrid.d.ts.map +1 -0
- package/dist/media-library/MediaLibraryGrid.js +88 -0
- package/dist/media-library/MediaLibraryGrid.js.map +1 -0
- package/dist/media-library/MediaLibraryPage.d.ts +17 -0
- package/dist/media-library/MediaLibraryPage.d.ts.map +1 -0
- package/dist/media-library/MediaLibraryPage.js +30 -0
- package/dist/media-library/MediaLibraryPage.js.map +1 -0
- package/dist/media-library/index.d.ts +4 -0
- package/dist/media-library/index.d.ts.map +1 -0
- package/dist/media-library/index.js +4 -0
- package/dist/media-library/index.js.map +1 -0
- package/dist/media-library/types.d.ts +8 -0
- package/dist/media-library/types.d.ts.map +1 -0
- package/dist/media-library/types.js +12 -0
- package/dist/media-library/types.js.map +1 -0
- package/dist/route-handlers/createCmsTxtHandler.d.ts +19 -0
- package/dist/route-handlers/createCmsTxtHandler.d.ts.map +1 -0
- package/dist/route-handlers/createCmsTxtHandler.js +154 -0
- package/dist/route-handlers/createCmsTxtHandler.js.map +1 -0
- package/dist/route-handlers/createDiscoveryHandler.d.ts +67 -0
- package/dist/route-handlers/createDiscoveryHandler.d.ts.map +1 -0
- package/dist/route-handlers/createDiscoveryHandler.js +190 -0
- package/dist/route-handlers/createDiscoveryHandler.js.map +1 -0
- package/dist/route-handlers/createGuidelinesHandler.d.ts +16 -0
- package/dist/route-handlers/createGuidelinesHandler.d.ts.map +1 -0
- package/dist/route-handlers/createGuidelinesHandler.js +100 -0
- package/dist/route-handlers/createGuidelinesHandler.js.map +1 -0
- package/dist/route-handlers/createMediaLibraryHandler.d.ts +19 -0
- package/dist/route-handlers/createMediaLibraryHandler.d.ts.map +1 -0
- package/dist/route-handlers/createMediaLibraryHandler.js +76 -0
- package/dist/route-handlers/createMediaLibraryHandler.js.map +1 -0
- package/dist/route-handlers/index.d.ts +9 -0
- package/dist/route-handlers/index.d.ts.map +1 -0
- package/dist/route-handlers/index.js +5 -0
- package/dist/route-handlers/index.js.map +1 -0
- package/dist/rtf/rtf.d.ts +66 -0
- package/dist/rtf/rtf.d.ts.map +1 -0
- package/dist/rtf/rtf.js +183 -0
- package/dist/rtf/rtf.js.map +1 -0
- package/dist/server/index.d.ts +20 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +11 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/merge-prepared-page-context.d.ts +8 -0
- package/dist/server/merge-prepared-page-context.d.ts.map +1 -0
- package/dist/server/merge-prepared-page-context.js +11 -0
- package/dist/server/merge-prepared-page-context.js.map +1 -0
- package/dist/server/page-test-merge.d.ts +7 -0
- package/dist/server/page-test-merge.d.ts.map +1 -0
- package/dist/server/page-test-merge.js +12 -0
- package/dist/server/page-test-merge.js.map +1 -0
- package/dist/server/route-handlers-types.d.ts +124 -0
- package/dist/server/route-handlers-types.d.ts.map +1 -0
- package/dist/server/route-handlers-types.js +2 -0
- package/dist/server/route-handlers-types.js.map +1 -0
- package/dist/server/route-handlers.d.ts +99 -0
- package/dist/server/route-handlers.d.ts.map +1 -0
- package/dist/server/route-handlers.js +1268 -0
- package/dist/server/route-handlers.js.map +1 -0
- package/dist/server/route-types.d.ts +78 -0
- package/dist/server/route-types.d.ts.map +1 -0
- package/dist/server/route-types.js +4 -0
- package/dist/server/route-types.js.map +1 -0
- package/dist/server/tag-index-guards.d.ts +33 -0
- package/dist/server/tag-index-guards.d.ts.map +1 -0
- package/dist/server/tag-index-guards.js +33 -0
- package/dist/server/tag-index-guards.js.map +1 -0
- package/dist/server/template-route-handlers.d.ts +7 -0
- package/dist/server/template-route-handlers.d.ts.map +1 -0
- package/dist/server/template-route-handlers.js +35 -0
- package/dist/server/template-route-handlers.js.map +1 -0
- package/dist/showcase/components/AllViewPanel.d.ts +7 -0
- package/dist/showcase/components/AllViewPanel.d.ts.map +1 -0
- package/dist/showcase/components/AllViewPanel.js +55 -0
- package/dist/showcase/components/AllViewPanel.js.map +1 -0
- package/dist/showcase/components/Controls.d.ts +15 -0
- package/dist/showcase/components/Controls.d.ts.map +1 -0
- package/dist/showcase/components/Controls.js +71 -0
- package/dist/showcase/components/Controls.js.map +1 -0
- package/dist/showcase/components/ControlsWrapper.d.ts +15 -0
- package/dist/showcase/components/ControlsWrapper.d.ts.map +1 -0
- package/dist/showcase/components/ControlsWrapper.js +9 -0
- package/dist/showcase/components/ControlsWrapper.js.map +1 -0
- package/dist/showcase/components/IframeHeightReporter.d.ts +13 -0
- package/dist/showcase/components/IframeHeightReporter.d.ts.map +1 -0
- package/dist/showcase/components/IframeHeightReporter.js +51 -0
- package/dist/showcase/components/IframeHeightReporter.js.map +1 -0
- package/dist/showcase/components/PreviewPanel.d.ts +18 -0
- package/dist/showcase/components/PreviewPanel.d.ts.map +1 -0
- package/dist/showcase/components/PreviewPanel.js +52 -0
- package/dist/showcase/components/PreviewPanel.js.map +1 -0
- package/dist/showcase/components/ScaledIframe.d.ts +22 -0
- package/dist/showcase/components/ScaledIframe.d.ts.map +1 -0
- package/dist/showcase/components/ScaledIframe.js +41 -0
- package/dist/showcase/components/ScaledIframe.js.map +1 -0
- package/dist/showcase/components/ShowcaseAllRenderPage.d.ts +21 -0
- package/dist/showcase/components/ShowcaseAllRenderPage.d.ts.map +1 -0
- package/dist/showcase/components/ShowcaseAllRenderPage.js +36 -0
- package/dist/showcase/components/ShowcaseAllRenderPage.js.map +1 -0
- package/dist/showcase/components/ShowcaseAnimationRoot.d.ts +8 -0
- package/dist/showcase/components/ShowcaseAnimationRoot.d.ts.map +1 -0
- package/dist/showcase/components/ShowcaseAnimationRoot.js +10 -0
- package/dist/showcase/components/ShowcaseAnimationRoot.js.map +1 -0
- package/dist/showcase/components/ShowcasePage.d.ts +25 -0
- package/dist/showcase/components/ShowcasePage.d.ts.map +1 -0
- package/dist/showcase/components/ShowcasePage.js +31 -0
- package/dist/showcase/components/ShowcasePage.js.map +1 -0
- package/dist/showcase/components/ShowcaseRenderPage.d.ts +21 -0
- package/dist/showcase/components/ShowcaseRenderPage.d.ts.map +1 -0
- package/dist/showcase/components/ShowcaseRenderPage.js +45 -0
- package/dist/showcase/components/ShowcaseRenderPage.js.map +1 -0
- package/dist/showcase/components/ShowcaseViewportGuard.d.ts +14 -0
- package/dist/showcase/components/ShowcaseViewportGuard.d.ts.map +1 -0
- package/dist/showcase/components/ShowcaseViewportGuard.js +77 -0
- package/dist/showcase/components/ShowcaseViewportGuard.js.map +1 -0
- package/dist/showcase/components/TopBar.d.ts +11 -0
- package/dist/showcase/components/TopBar.d.ts.map +1 -0
- package/dist/showcase/components/TopBar.js +105 -0
- package/dist/showcase/components/TopBar.js.map +1 -0
- package/dist/showcase/controlFieldSupport.d.ts +12 -0
- package/dist/showcase/controlFieldSupport.d.ts.map +1 -0
- package/dist/showcase/controlFieldSupport.js +35 -0
- package/dist/showcase/controlFieldSupport.js.map +1 -0
- package/dist/showcase/index.d.ts +20 -0
- package/dist/showcase/index.d.ts.map +1 -0
- package/dist/showcase/index.js +20 -0
- package/dist/showcase/index.js.map +1 -0
- package/dist/showcase/isCmsShowcase.d.ts +10 -0
- package/dist/showcase/isCmsShowcase.d.ts.map +1 -0
- package/dist/showcase/isCmsShowcase.js +12 -0
- package/dist/showcase/isCmsShowcase.js.map +1 -0
- package/dist/showcase/mergeShowcaseMocks.d.ts +34 -0
- package/dist/showcase/mergeShowcaseMocks.d.ts.map +1 -0
- package/dist/showcase/mergeShowcaseMocks.js +31 -0
- package/dist/showcase/mergeShowcaseMocks.js.map +1 -0
- package/dist/showcase/mockFactory.d.ts +47 -0
- package/dist/showcase/mockFactory.d.ts.map +1 -0
- package/dist/showcase/mockFactory.js +726 -0
- package/dist/showcase/mockFactory.js.map +1 -0
- package/dist/showcase/showcaseLayout.d.ts +17 -0
- package/dist/showcase/showcaseLayout.d.ts.map +1 -0
- package/dist/showcase/showcaseLayout.js +11 -0
- package/dist/showcase/showcaseLayout.js.map +1 -0
- package/dist/showcase/showcaseRelatedContent.d.ts +30 -0
- package/dist/showcase/showcaseRelatedContent.d.ts.map +1 -0
- package/dist/showcase/showcaseRelatedContent.js +106 -0
- package/dist/showcase/showcaseRelatedContent.js.map +1 -0
- package/dist/showcase/types.d.ts +21 -0
- package/dist/showcase/types.d.ts.map +1 -0
- package/dist/showcase/types.js +19 -0
- package/dist/showcase/types.js.map +1 -0
- package/dist/utils/UnsupportedWarning.d.ts +30 -0
- package/dist/utils/UnsupportedWarning.d.ts.map +1 -0
- package/dist/utils/UnsupportedWarning.js +44 -0
- package/dist/utils/UnsupportedWarning.js.map +1 -0
- package/dist/utils/UnusedChecker.d.ts +51 -0
- package/dist/utils/UnusedChecker.d.ts.map +1 -0
- package/dist/utils/UnusedChecker.js +96 -0
- package/dist/utils/UnusedChecker.js.map +1 -0
- package/dist/utils/agent-ready.d.ts +103 -0
- package/dist/utils/agent-ready.d.ts.map +1 -0
- package/dist/utils/agent-ready.js +246 -0
- package/dist/utils/agent-ready.js.map +1 -0
- package/dist/utils/assertValidSiteBaseUrl.d.ts +8 -0
- package/dist/utils/assertValidSiteBaseUrl.d.ts.map +1 -0
- package/dist/utils/assertValidSiteBaseUrl.js +31 -0
- package/dist/utils/assertValidSiteBaseUrl.js.map +1 -0
- package/dist/utils/breadcrumbUtils.d.ts +64 -0
- package/dist/utils/breadcrumbUtils.d.ts.map +1 -0
- package/dist/utils/breadcrumbUtils.js +73 -0
- package/dist/utils/breadcrumbUtils.js.map +1 -0
- package/dist/utils/buildPageMetadata.d.ts +139 -0
- package/dist/utils/buildPageMetadata.d.ts.map +1 -0
- package/dist/utils/buildPageMetadata.js +218 -0
- package/dist/utils/buildPageMetadata.js.map +1 -0
- package/dist/utils/cn.d.ts +29 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +32 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/componentUtils.d.ts +82 -0
- package/dist/utils/componentUtils.d.ts.map +1 -0
- package/dist/utils/componentUtils.js +327 -0
- package/dist/utils/componentUtils.js.map +1 -0
- package/dist/utils/convertText.d.ts +2 -0
- package/dist/utils/convertText.d.ts.map +1 -0
- package/dist/utils/convertText.js +35 -0
- package/dist/utils/convertText.js.map +1 -0
- package/dist/utils/createDefaultRenderText.d.ts +17 -0
- package/dist/utils/createDefaultRenderText.d.ts.map +1 -0
- package/dist/utils/createDefaultRenderText.js +25 -0
- package/dist/utils/createDefaultRenderText.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +37 -0
- package/dist/utils/errorHandling.d.ts.map +1 -0
- package/dist/utils/errorHandling.js +61 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/errorMonitoring.d.ts +17 -0
- package/dist/utils/errorMonitoring.d.ts.map +1 -0
- package/dist/utils/errorMonitoring.js +26 -0
- package/dist/utils/errorMonitoring.js.map +1 -0
- package/dist/utils/imageKitVideoHls.d.ts +3 -0
- package/dist/utils/imageKitVideoHls.d.ts.map +1 -0
- package/dist/utils/imageKitVideoHls.js +5 -0
- package/dist/utils/imageKitVideoHls.js.map +1 -0
- package/dist/utils/interpolateMetaText.d.ts +9 -0
- package/dist/utils/interpolateMetaText.d.ts.map +1 -0
- package/dist/utils/interpolateMetaText.js +21 -0
- package/dist/utils/interpolateMetaText.js.map +1 -0
- package/dist/utils/linkAccessibility.d.ts +13 -0
- package/dist/utils/linkAccessibility.d.ts.map +1 -0
- package/dist/utils/linkAccessibility.js +14 -0
- package/dist/utils/linkAccessibility.js.map +1 -0
- package/dist/utils/linkResolution.d.ts +15 -0
- package/dist/utils/linkResolution.d.ts.map +1 -0
- package/dist/utils/linkResolution.js +19 -0
- package/dist/utils/linkResolution.js.map +1 -0
- package/dist/utils/listing-page-heading.d.ts +16 -0
- package/dist/utils/listing-page-heading.d.ts.map +1 -0
- package/dist/utils/listing-page-heading.js +24 -0
- package/dist/utils/listing-page-heading.js.map +1 -0
- package/dist/utils/listingStructuredData.d.ts +28 -0
- package/dist/utils/listingStructuredData.d.ts.map +1 -0
- package/dist/utils/listingStructuredData.js +65 -0
- package/dist/utils/listingStructuredData.js.map +1 -0
- package/dist/utils/marketingSiteSitemap.d.ts +103 -0
- package/dist/utils/marketingSiteSitemap.d.ts.map +1 -0
- package/dist/utils/marketingSiteSitemap.js +352 -0
- package/dist/utils/marketingSiteSitemap.js.map +1 -0
- package/dist/utils/previewPageUtils.d.ts +61 -0
- package/dist/utils/previewPageUtils.d.ts.map +1 -0
- package/dist/utils/previewPageUtils.js +72 -0
- package/dist/utils/previewPageUtils.js.map +1 -0
- package/dist/utils/previewUtils.d.ts +59 -0
- package/dist/utils/previewUtils.d.ts.map +1 -0
- package/dist/utils/previewUtils.js +60 -0
- package/dist/utils/previewUtils.js.map +1 -0
- package/dist/utils/processCollectionLinks.d.ts +11 -0
- package/dist/utils/processCollectionLinks.d.ts.map +1 -0
- package/dist/utils/processCollectionLinks.js +38 -0
- package/dist/utils/processCollectionLinks.js.map +1 -0
- package/dist/utils/processTextContent.d.ts +18 -0
- package/dist/utils/processTextContent.d.ts.map +1 -0
- package/dist/utils/processTextContent.js +24 -0
- package/dist/utils/processTextContent.js.map +1 -0
- package/dist/utils/reactNodeText.d.ts +7 -0
- package/dist/utils/reactNodeText.d.ts.map +1 -0
- package/dist/utils/reactNodeText.js +43 -0
- package/dist/utils/reactNodeText.js.map +1 -0
- package/dist/utils/richTextNodeText.d.ts +13 -0
- package/dist/utils/richTextNodeText.d.ts.map +1 -0
- package/dist/utils/richTextNodeText.js +29 -0
- package/dist/utils/richTextNodeText.js.map +1 -0
- package/dist/utils/robots.d.ts +115 -0
- package/dist/utils/robots.d.ts.map +1 -0
- package/dist/utils/robots.js +174 -0
- package/dist/utils/robots.js.map +1 -0
- package/dist/utils/scopeCss.d.ts +15 -0
- package/dist/utils/scopeCss.d.ts.map +1 -0
- package/dist/utils/scopeCss.js +186 -0
- package/dist/utils/scopeCss.js.map +1 -0
- package/dist/utils/sitemap.d.ts +173 -0
- package/dist/utils/sitemap.d.ts.map +1 -0
- package/dist/utils/sitemap.js +257 -0
- package/dist/utils/sitemap.js.map +1 -0
- package/dist/utils/structuredDataUtils.d.ts +158 -0
- package/dist/utils/structuredDataUtils.d.ts.map +1 -0
- package/dist/utils/structuredDataUtils.js +225 -0
- package/dist/utils/structuredDataUtils.js.map +1 -0
- package/dist/utils/urlUtils.d.ts +30 -0
- package/dist/utils/urlUtils.d.ts.map +1 -0
- package/dist/utils/urlUtils.js +100 -0
- package/dist/utils/urlUtils.js.map +1 -0
- package/dist/utils/visualPositions.d.ts +3 -0
- package/dist/utils/visualPositions.d.ts.map +1 -0
- package/dist/utils/visualPositions.js +13 -0
- package/dist/utils/visualPositions.js.map +1 -0
- package/dist/utils/visualSizes.d.ts +5 -0
- package/dist/utils/visualSizes.d.ts.map +1 -0
- package/dist/utils/visualSizes.js +27 -0
- package/dist/utils/visualSizes.js.map +1 -0
- package/dist/utils/wcagRelativeLuminanceFromHex.d.ts +8 -0
- package/dist/utils/wcagRelativeLuminanceFromHex.d.ts.map +1 -0
- package/dist/utils/wcagRelativeLuminanceFromHex.js +30 -0
- package/dist/utils/wcagRelativeLuminanceFromHex.js.map +1 -0
- package/dist/utils/wrapHtmlComponentJs.d.ts +10 -0
- package/dist/utils/wrapHtmlComponentJs.d.ts.map +1 -0
- package/dist/utils/wrapHtmlComponentJs.js +12 -0
- package/dist/utils/wrapHtmlComponentJs.js.map +1 -0
- package/docs/PACKAGE_EXPORT_BOUNDARIES.md +98 -0
- package/docs/llms.md +358 -0
- package/package.json +108 -0
- 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
|