@se-studio/contentful-rest-api 1.0.18 → 1.0.19
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/dist/index.d.ts +95 -58
- package/dist/index.js +792 -738
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/revalidation/tags.ts","../src/revalidation/utils.ts","../src/utils/errors.ts","../src/client.ts","../src/converters/helpers.ts","../src/converters/asset.ts","../src/utils/arrayUtils.ts","../src/utils/dateUtils.ts","../src/utils/retry.ts","../src/converters/resolver.ts","../src/converters/collection.ts","../src/converters/component.ts","../src/converters/link.ts","../src/converters/navigationItem.ts","../src/converters/template.ts","../src/converters/page.ts","../src/converters/person.ts","../src/converters/article.ts","../src/converters/tag.ts","../src/api.ts","../src/revalidation/handlers.ts","../src/revalidation/route.ts","../src/revalidation/nextjs-route.ts","../src/revalidation/index.ts"],"names":["delay","getCacheTagsForProduction","success","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cache tag constants and utilities for Contentful revalidation\n */\n\n// Collection-level cache tags (used for sitemaps and lists)\nexport const PageTag = 'page';\nexport const ArticleTag = 'article';\nexport const ArticleTypeTag = 'articleType';\nexport const ArticleTypeIndexTag = 'articleTypeIndex';\nexport const CustomTypeTag = 'customType';\nexport const TagTag = 'tag';\nexport const PersonTag = 'person';\nexport const AssetTag = 'asset';\nexport const TemplateTag = 'template';\nexport const NavigationTag = 'navigation';\nexport const BannerTag = 'banner';\nexport const LocationTag = 'location';\n\n// Draft mode tag - used when DRAFT_ONLY=true\nexport const GlobalTag = 'global';\n\n/**\n * Individual page cache tag generator\n * @param slug - Page slug\n * @returns Cache tag for the page\n */\nexport function pageTag(slug: string): string {\n return `${PageTag}#${slug}`;\n}\n\n/**\n * Individual article cache tag generator\n * @param slug - Article slug\n * @returns Cache tag for the article\n */\nexport function articleTag(slug: string): string {\n return `${ArticleTag}#${slug}`;\n}\n\n/**\n * Individual article type cache tag generator\n * @param slug - Article type slug\n * @returns Cache tag for the article type\n */\nexport function articleTypeTag(slug: string): string {\n return `${ArticleTypeTag}#${slug}`;\n}\n\n/**\n * Individual article type index page cache tag generator\n * @param slug - Article type index page slug\n * @returns Cache tag for the article type index page\n */\nexport function articleTypeIndexTag(slug: string): string {\n return `${ArticleTypeTag}#index#${slug}`;\n}\n\n/**\n * Individual custom type cache tag generator\n * @param slug - Custom type slug\n * @returns Cache tag for the custom type\n */\nexport function customTypeTag(slug: string): string {\n return `${CustomTypeTag}#${slug}`;\n}\n\n/**\n * Individual tag cache tag generator\n * @param slug - Tag slug\n * @returns Cache tag for the tag\n */\nexport function tagTag(slug: string): string {\n return `${TagTag}#${slug}`;\n}\n\n/**\n * Individual person cache tag generator\n * @param slug - Person slug\n * @returns Cache tag for the person\n */\nexport function personTag(slug: string): string {\n return `${PersonTag}#${slug}`;\n}\n\n/**\n * Individual asset cache tag generator\n * @param assetId - Asset ID\n * @returns Cache tag for the asset\n */\nexport function assetTag(assetId: string): string {\n return `${AssetTag}#${assetId}`;\n}\n\n/**\n * Individual location cache tag generator\n * @param slug - Location slug\n * @returns Cache tag for the location\n */\nexport function locationTag(slug: string): string {\n return `${LocationTag}#${slug}`;\n}\n\n/**\n * All collection-level cache tags for global revalidation\n */\nexport const AllTags = [\n PageTag,\n ArticleTag,\n ArticleTypeTag,\n ArticleTypeIndexTag,\n CustomTypeTag,\n TagTag,\n PersonTag,\n AssetTag,\n TemplateTag,\n NavigationTag,\n BannerTag,\n LocationTag,\n 'hubspot-forms', // Additional tag from the old implementation\n];\n","import { revalidateTag } from 'next/cache';\nimport {\n ArticleTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeTag,\n assetTag,\n CustomTypeTag,\n customTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n tagTag,\n} from './tags';\n\n/**\n * Get cache tags for preview mode\n * @returns Array containing only the global tag\n */\nexport function getCacheTagsForPreview(): string[] {\n return [GlobalTag];\n}\n\n/**\n * Get cache tags for production mode based on content type and slug\n * @param contentType - The content type ('page', 'article', 'articleType', etc.)\n * @param slug - The slug/identifier for the content\n * @returns Array of cache tags including individual and collection tags\n */\nexport function getCacheTagsForProduction(contentType: string, slug?: string): string[] {\n switch (contentType) {\n case 'page':\n return slug ? [pageTag(slug), PageTag] : [PageTag];\n case 'article':\n return slug ? [articleTag(slug), ArticleTag] : [ArticleTag];\n case 'articleType':\n return slug ? [articleTypeTag(slug), ArticleTypeTag] : [ArticleTypeTag];\n case 'customType':\n return slug ? [customTypeTag(slug), CustomTypeTag] : [CustomTypeTag];\n case 'tag':\n return slug ? [tagTag(slug), TagTag] : [TagTag];\n case 'person':\n return slug ? [personTag(slug), PersonTag] : [PersonTag];\n case 'asset':\n return slug ? [assetTag(slug), AssetTag] : [AssetTag];\n case 'location':\n return slug ? [locationTag(slug), LocationTag] : [LocationTag];\n default:\n // For content types without individual tags, just return the collection tag\n return [contentType];\n }\n}\n\n/**\n * Get cache tags based on preview mode\n * @param contentType - The content type\n * @param slug - The slug/identifier for the content\n * @param preview - Whether to use preview mode\n * @returns Array of cache tags appropriate for the mode\n */\nexport function getCacheTags(\n contentType: string,\n slug?: string,\n preview: boolean = false,\n): string[] {\n if (preview) {\n return getCacheTagsForPreview();\n }\n return getCacheTagsForProduction(contentType, slug);\n}\n\n/**\n * Revalidates multiple Next.js cache tags.\n *\n * Adds a delay between revalidations to prevent overwhelming the cache system.\n * Use this when content changes affect multiple pages or entries.\n *\n * @param tags - Array of cache tags to revalidate\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateTags, pageTag, PageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page and all pages\n * await revalidateTags([pageTag('home'), PageTag], 'Page updated via webhook');\n * ```\n */\nexport async function revalidateTags(tags: string[], reason: string): Promise<void> {\n // Add a delay to prevent overwhelming the cache system\n await delay(500);\n\n for (const tag of tags) {\n console.log(`Revalidating tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n }\n}\n\n/**\n * Revalidates a single Next.js cache tag.\n *\n * Adds a delay before revalidation to prevent overwhelming the cache system.\n * Use this for targeted revalidation of specific content.\n *\n * @param tag - Cache tag to revalidate (e.g., 'page#home', 'article#my-post')\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateSingleTag, pageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page\n * await revalidateSingleTag(pageTag('home'), 'Home page updated');\n * ```\n */\nexport async function revalidateSingleTag(tag: string, reason: string): Promise<void> {\n await delay(500);\n console.log(`Revalidating single tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n}\n\n/**\n * Utility delay function\n * @param ms - Milliseconds to delay\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Custom error classes for Contentful API errors\n */\n\n/**\n * Base error class for all Contentful-related errors\n */\nexport class ContentfulError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ContentfulError';\n Object.setPrototypeOf(this, ContentfulError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitError extends ContentfulError {\n constructor(\n message: string,\n public readonly retryAfter?: number,\n details?: unknown,\n ) {\n super(message, 429, details);\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when entry is not found\n */\nexport class EntryNotFoundError extends ContentfulError {\n constructor(\n public readonly entryId: string,\n public readonly contentType?: string,\n ) {\n super(`Entry not found: ${entryId}${contentType ? ` (${contentType})` : ''}`, 404);\n this.name = 'EntryNotFoundError';\n Object.setPrototypeOf(this, EntryNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthenticationError extends ContentfulError {\n constructor(message = 'Authentication failed') {\n super(message, 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends ContentfulError {\n constructor(\n message: string,\n public readonly validationErrors?: unknown,\n ) {\n super(message, 400, validationErrors);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Checks if an error is a Contentful error\n */\nexport function isContentfulError(error: unknown): error is ContentfulError {\n return error instanceof ContentfulError;\n}\n\n/**\n * Checks if an error is a rate limit error\n */\nexport function isRateLimitError(error: unknown): error is RateLimitError {\n return error instanceof RateLimitError;\n}\n\n/**\n * Checks if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (isRateLimitError(error)) {\n return true;\n }\n\n if (isContentfulError(error)) {\n // Retry on 5xx errors and rate limits\n return error.statusCode !== undefined && (error.statusCode >= 500 || error.statusCode === 429);\n }\n\n return false;\n}\n\n/**\n * Extracts retry-after header value from error\n */\nexport function getRetryAfter(error: unknown): number | undefined {\n if (isRateLimitError(error)) {\n return error.retryAfter;\n }\n return undefined;\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: Any ok for now! */\nimport type { ContentfulConfig, FetchOptions } from './types';\nimport {\n AuthenticationError,\n ContentfulError,\n EntryNotFoundError,\n RateLimitError,\n ValidationError,\n} from './utils/errors';\n\n/**\n * Contentful REST API response structure\n * The items array contains Entry objects when T is an EntrySkeletonType\n */\nexport interface ContentfulResponse<T = any> {\n sys: {\n type: 'Array';\n };\n total: number;\n skip: number;\n limit: number;\n items: T extends import('contentful').EntrySkeletonType\n ? Array<import('contentful').Entry<T, 'WITHOUT_LINK_RESOLUTION', string>>\n : T[];\n includes?: {\n Entry?: any[];\n Asset?: any[];\n };\n}\n\n/**\n * Query parameters for Contentful API\n */\nexport interface ContentfulQuery {\n content_type?: string;\n locale?: string;\n include?: number;\n limit?: number;\n skip?: number;\n [key: string]: any;\n}\n\n/**\n * Builds query string from query parameters\n */\nfunction buildQueryString(query: ContentfulQuery): string {\n const params = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, String(value));\n }\n });\n\n return params.toString();\n}\n\n/**\n * Parses error response from Contentful API\n */\nasync function parseErrorResponse(response: Response): Promise<ContentfulError> {\n const statusCode = response.status;\n let errorData: any;\n\n try {\n errorData = await response.json();\n } catch {\n errorData = { message: response.statusText };\n }\n\n const message = errorData?.message || `Contentful API error: ${statusCode}`;\n\n switch (statusCode) {\n case 401:\n return new AuthenticationError(message);\n\n case 404:\n return new EntryNotFoundError(\n errorData?.sys?.id || 'unknown',\n errorData?.sys?.contentType?.sys?.id,\n );\n\n case 429: {\n // Parse retry-after header (in seconds)\n const retryAfterHeader =\n response.headers.get('X-Contentful-RateLimit-Reset') || response.headers.get('Retry-After');\n const retryAfter = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : undefined;\n return new RateLimitError(message, retryAfter, errorData);\n }\n\n case 400:\n return new ValidationError(message, errorData);\n\n default:\n return new ContentfulError(message, statusCode, errorData);\n }\n}\n\ntype NextRequestInit = RequestInit & {\n next?: {\n revalidate?: number | false;\n tags?: string[];\n };\n};\n\n/**\n * Fetch-based Contentful client that participates in Next.js caching\n */\nexport class ContentfulFetchClient {\n private readonly baseUrl: string;\n private readonly accessToken: string;\n\n constructor(config: ContentfulConfig, preview = false) {\n const host = config.host || (preview ? 'preview.contentful.com' : 'cdn.contentful.com');\n const environment = config.environment || 'master';\n\n this.baseUrl = `https://${host}/spaces/${config.spaceId}/environments/${environment}`;\n this.accessToken = config.accessToken;\n }\n\n /**\n * Fetches entries from Contentful\n */\n async getEntries<T = any>(\n query: ContentfulQuery,\n options?: FetchOptions,\n ): Promise<ContentfulResponse<T>> {\n const queryString = buildQueryString(query);\n const url = `${this.baseUrl}/entries?${queryString}`;\n\n const fetchOptions: NextRequestInit = {\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n };\n\n // Add Next.js cache configuration if provided\n if (options?.next) {\n fetchOptions.next = options.next;\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return response.json() as Promise<ContentfulResponse<T>>;\n }\n}\n\n/**\n * Creates a Contentful Content Delivery API (CDA) client\n *\n * @param config - Configuration object for the Contentful client\n * @returns Contentful CDA client instance\n *\n * @example\n * ```ts\n * const client = createContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, false);\n}\n\n/**\n * Creates a Contentful Content Preview API (CPA) client\n *\n * @param config - Configuration object for the Contentful preview client\n * @returns Contentful CPA client instance\n *\n * @example\n * ```ts\n * const previewClient = createContentfulPreviewClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulPreviewClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, true);\n}\n\n/**\n * Gets the appropriate Contentful client based on preview mode\n *\n * @param config - Configuration for the Contentful client\n * @param preview - Whether to use the preview API\n * @returns Contentful client instance (CDA or CPA)\n *\n * @example\n * ```ts\n * const client = getContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: preview\n * ? process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!\n * : process.env.CONTENTFUL_ACCESS_TOKEN!,\n * }, preview);\n * ```\n */\nexport function getContentfulClient(\n config: ContentfulConfig,\n preview = false,\n): ContentfulFetchClient {\n return preview ? createContentfulPreviewClient(config) : createContentfulClient(config);\n}\n","import type { IInternalLink, InternalType, IVisual } from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier, PossibleResolvedEntry } from '../api';\nimport type { BaseContent, BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport type { baseArticleConverter, baseArticleTypeConverter } from './article';\nimport type { baseCollectionConverter } from './collection';\nimport type { baseComponentConverter } from './component';\nimport type { baseNavigationItemConverter } from './navigationItem';\nimport type { basePageConverter } from './page';\n\nexport function resolveBuildYear(value: string) {\n const buildYear = new Date().getFullYear();\n return value.replaceAll('#buildYear#', buildYear.toString());\n}\nexport function makeContentfulTitle(\n title: string | undefined | null,\n id: string,\n prefix = 'Title for ',\n) {\n return title ?? `${prefix}${id}`;\n}\n\nexport function stringOrUndefined(value: string | null | undefined) {\n if (value && value.length > 0) {\n return value;\n }\n return undefined;\n}\nexport function makeContentfulDescription(description: string | undefined | null, id: string) {\n return description ?? `Description for ${id}`;\n}\n\nexport function lookupAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined) {\n if (!asset) return undefined;\n return context.assets.get(asset.sys.id);\n}\n\n/**\n * Default positioning fields for content items before they are processed\n */\nexport const DEFAULT_POSITION_FIELDS = {\n index: 0,\n isFirst: false,\n isLast: false,\n indexOfType: 0,\n} as const;\n\n/**\n * Creates an internal link object with common fields\n * Used by multiple converters (tag, page, article, person) to reduce duplication\n */\nexport function createInternalLink(\n id: string,\n fields: {\n cmsLabel?: string | null;\n title?: string | null;\n featuredImage?: UnresolvedLink<'Asset'>;\n backgroundColour?: string | null;\n textColour?: string | null;\n indexed?: boolean | null;\n hidden?: boolean | null;\n slug: string;\n },\n context: ConverterContext,\n href: string,\n internalType: InternalType,\n // biome-ignore lint/suspicious/noExplicitAny: Used for expanding\n additionalProps?: any,\n): IInternalLink {\n const { cmsLabel, title, featuredImage, backgroundColour, textColour, indexed, hidden, slug } =\n fields;\n\n return {\n type: 'Internal link',\n internalType,\n id,\n name: cmsLabel ?? '',\n useName: true,\n text: makeContentfulTitle(title, id),\n visual: lookupAsset(context, featuredImage),\n backgroundColour,\n textColour,\n indexed,\n hidden,\n slug,\n href,\n ...additionalProps,\n };\n}\n\nexport type ContentResolverFunction = (\n context: ConverterContext,\n entry: Entry<BaseContent, DefaultChainModifier, string>,\n) => unknown; // PageContent\nexport type ContentResolverMap = Map<string, ContentResolverFunction>;\nexport type LinkResolverFunction = (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n) => IInternalLink;\nexport type LinkResolverMap = Map<string, LinkResolverFunction>;\n\nexport type BaseConverterContext = {\n videoPrefix: string;\n linkResolver: LinkResolverMap;\n contentResolver: Map<\n string,\n (context: ConverterContext, entry: Entry<BaseContent, DefaultChainModifier, string>) => unknown\n >;\n navigationItemResolver: typeof baseNavigationItemConverter;\n pageResolver: typeof basePageConverter;\n articleResolver: typeof baseArticleConverter;\n articleTypeResolver: typeof baseArticleTypeConverter;\n componentResolver: typeof baseComponentConverter;\n collectionResolver: typeof baseCollectionConverter;\n};\n\nexport type ConverterContext = BaseConverterContext & {\n includes: Map<string, PossibleResolvedEntry>;\n assets: Map<string, IVisual>;\n errors: CmsError[];\n};\n\n/**\n * Adds position metadata to an array of content items\n * Each item gets: index, isFirst, isLast, indexOfType\n *\n * @param items - Array of content items to add metadata to\n * @returns New array with position metadata added to each item\n */\nexport function addPositionMetadata<\n T extends {\n type: string;\n index?: number;\n isFirst?: boolean;\n isLast?: boolean;\n indexOfType?: number;\n },\n>(items: T[]): T[] {\n if (items.length === 0) return items;\n\n // Count items by type for indexOfType calculation\n const typeCount = new Map<string, number>();\n\n return items.map((item, index) => {\n const currentTypeIndex = typeCount.get(item.type) ?? 0;\n typeCount.set(item.type, currentTypeIndex + 1);\n\n return {\n ...item,\n index,\n isFirst: index === 0,\n isLast: index === items.length - 1,\n indexOfType: currentTypeIndex,\n };\n });\n}\n","import type {\n IAnimation,\n IImage,\n IPicture,\n IResponsiveVisual,\n ISvgImage,\n IVideo,\n IVideoDetails,\n IVisual,\n} from '@se-studio/core-data-types';\nimport type { Asset, AssetFields, AssetFile, AssetSys, Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseConverterContext, ConverterContext } from './helpers';\nimport {\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n stringOrUndefined,\n} from './helpers';\n\nexport function convertAssetToVisual(\n context: BaseConverterContext,\n asset?: Asset<DefaultChainModifier, string>,\n options?: Partial<IImage> | Partial<IVideo> | Partial<IAnimation>,\n): IVisual | undefined {\n if (!asset) return undefined;\n const { fields, sys } = asset;\n if (!fields) return undefined;\n const { id } = sys;\n const { file } = fields as AssetFields;\n if (!file) return undefined;\n const { contentType } = file;\n\n if (contentType?.startsWith('image/')) {\n const image = convertAssetToImage(file, fields as AssetFields, sys, options as Partial<IImage>);\n return {\n id,\n type: 'Visual',\n image,\n };\n }\n\n if (contentType?.startsWith('video/')) {\n const video = convertAssetToVideo(\n file,\n fields as AssetFields,\n sys,\n context,\n options as Partial<IVideo>,\n );\n return {\n id,\n type: 'Visual',\n video,\n };\n }\n\n if (contentType === 'application/json') {\n const animation = convertAssetToAnimation(\n file,\n fields as AssetFields,\n sys,\n options as Partial<IAnimation>,\n );\n return {\n id,\n type: 'Visual',\n animation,\n };\n }\n return undefined;\n}\n\nfunction convertAssetToAnimation(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IAnimation, 'id' | 'type'>>,\n): IAnimation {\n const { id } = sys;\n const { title, description } = fields;\n const { url } = file;\n\n return {\n ...options,\n id,\n type: 'Animation',\n animationSrc: `https:${url}`,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IImage {\n const { contentType } = file;\n if (contentType === 'image/svg+xml') {\n return convertAssetToSvgImage(file, fields, sys, options);\n } else {\n return convertAssetToPicture(file, fields, sys, options);\n }\n}\n\nfunction convertAssetToPicture(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IPicture {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Picture',\n src: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nfunction convertAssetToSvgImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): ISvgImage {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Svg image',\n svgSrc: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToVideoDetails(file: AssetFile, sys: AssetSys): IVideoDetails {\n const { id } = sys;\n const { details, url, contentType, fileName } = file;\n const { size } = details;\n return {\n id,\n videoUrl: `https:${url}`,\n size,\n mimeType: contentType,\n fileName,\n };\n}\n\nfunction convertAssetToVideo(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n context: BaseConverterContext,\n options: Partial<Omit<IVideo, 'id' | 'type'>>,\n): IVideo {\n const { id } = sys;\n const { title, description } = fields;\n const { details } = file;\n const { image } = details;\n const { width, height } = image || {};\n\n const videoDetails = convertAssetToVideoDetails(file, sys);\n\n return {\n ...options,\n id,\n type: 'Local video',\n preview: videoDetails,\n videoPrefix: context.videoPrefix,\n\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nexport function createResponsiveVisual(\n visual: IVisual | undefined,\n mobileVisual: IVisual | undefined,\n customSize?: number | null,\n): IResponsiveVisual | undefined {\n if (!visual) return undefined;\n return {\n visual,\n mobileVisual,\n visualCustomSize: customSize,\n };\n}\n\n/**\n * Converts a baseMedia entry to IVisual by looking up the asset and merging metadata\n */\nexport function convertMediaEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields) return undefined;\n\n // Lookup the asset from context\n const baseVisual = lookupAsset(context, fields.asset);\n if (!baseVisual) return undefined;\n\n const { name, ...otherFields } = fields;\n\n // Extract metadata from the media entry\n const metadata = {\n name: makeContentfulTitle(name, sys.id),\n ...otherFields,\n };\n\n // Merge metadata into the image or video\n const visual: IVisual = {\n ...baseVisual,\n id: sys.id,\n };\n\n if (baseVisual.image) {\n visual.image = {\n ...baseVisual.image,\n ...metadata,\n };\n } else if (baseVisual.video) {\n visual.video = {\n ...baseVisual.video,\n ...metadata,\n };\n } else if (baseVisual.animation) {\n visual.animation = {\n ...baseVisual.animation,\n ...metadata,\n };\n }\n\n return visual;\n}\n\n/**\n * Converts a baseExternalVideo entry to IVisual with external video\n */\nexport function convertExternalVideoEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields || !fields.url) return undefined;\n\n // Lookup optional preview and poster assets\n const previewVisual = lookupAsset(context, fields.preview);\n const posterVisual = lookupAsset(context, fields.posterImage);\n\n // Extract preview IVideoDetails if available\n const preview =\n previewVisual?.video?.type === 'Local video' ? previewVisual.video.preview : undefined;\n\n // Extract poster URL if available\n const poster = posterVisual?.image?.type === 'Picture' ? posterVisual.image.src : undefined;\n\n // Map Contentful's \"Center\" to our \"Middle\" type\n const mapHorizontal = (\n value: 'Left' | 'Center' | 'Right' | undefined,\n ): 'Left' | 'Middle' | 'Right' | null => {\n if (!value) return null;\n return value === 'Center' ? 'Middle' : value;\n };\n\n const video: IVideo = {\n id: sys.id,\n type: 'External video',\n name: makeContentfulTitle(fields.name, sys.id),\n nameAsCaption: fields.nameAsCaption ?? null,\n external: fields.url,\n preview,\n poster,\n autoPlay: fields.autoPlay ?? null,\n loop: fields.loop ?? null,\n hideControls: fields.hideControls ?? null,\n dontCrop: fields.dontCrop ?? null,\n verticalCropPosition: fields.verticalCropPosition ?? null,\n horizontalCropPosition: mapHorizontal(fields.horizontalCropPosition),\n horizontalPosition: fields.horizontalPosition ?? null,\n widthPercent: fields.width ?? null,\n };\n\n return {\n id: sys.id,\n type: 'Visual',\n video,\n };\n}\n\n/**\n * Looks up and converts a media or external video entry from an unresolved link\n */\nexport function lookupMediaEntry(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'> | undefined,\n): IVisual | undefined {\n if (!link) return undefined;\n\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n return undefined;\n }\n\n const { type, entry } = possibleEntry;\n\n if (type === 'media') {\n return convertMediaEntryToVisual(\n context,\n entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n }\n\n if (type === 'externalVideo') {\n return convertExternalVideoEntryToVisual(\n context,\n entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n }\n\n return undefined;\n}\n","export function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {\n if (value === null || value === undefined) return false;\n return true;\n}\n\nexport function arrayOrUndefined<T>(array?: ReadonlyArray<T>) {\n if (array && array.length > 0) {\n return array;\n }\n return undefined;\n}\n","/**\n * Validates if a value can be converted to a valid Date object\n */\nexport function isValidDate(date: unknown): boolean {\n if (date instanceof Date) {\n return !Number.isNaN(date.getTime());\n }\n\n if (typeof date === 'string' || typeof date === 'number') {\n const parsed = new Date(date);\n return !Number.isNaN(parsed.getTime()) && parsed.getTime() > 0;\n }\n\n return false;\n}\n\n/**\n * Safely creates a Date object, returning null if invalid\n */\nexport function safeDate(date: unknown): Date | null {\n if (!isValidDate(date)) {\n return null;\n }\n\n if (date instanceof Date) {\n return date;\n }\n\n return new Date(date as string | number);\n}\n","import type { RetryConfig } from '../types';\nimport { getRetryAfter, isRetryableError } from './errors';\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 30000, // 30 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Sleep utility for async delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Calculates the delay for the next retry attempt using exponential backoff\n *\n * @param attempt - Current retry attempt (0-based)\n * @param config - Retry configuration\n * @param retryAfter - Optional retry-after value from rate limit response\n * @returns Delay in milliseconds\n */\nexport function calculateBackoffDelay(\n attempt: number,\n config: Required<RetryConfig>,\n retryAfter?: number,\n): number {\n // If server specified retry-after, use that\n if (retryAfter !== undefined) {\n return Math.min(retryAfter * 1000, config.maxDelay);\n }\n\n // Calculate exponential backoff\n const exponentialDelay = config.initialDelay * config.backoffMultiplier ** attempt;\n\n // Add jitter (random value between 0 and delay) to prevent thundering herd\n const jitter = Math.random() * exponentialDelay;\n\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n}\n\n/**\n * Executes a function with retry logic\n *\n * @param fn - Async function to execute\n * @param config - Retry configuration\n * @returns Promise resolving to the function result\n *\n * @example\n * ```ts\n * const result = await withRetry(\n * async () => await client.getEntry('id'),\n * { maxRetries: 3, initialDelay: 1000 }\n * );\n * ```\n */\nexport async function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T> {\n const retryConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if it's the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Only retry if the error is retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n const retryAfter = getRetryAfter(error);\n const delay = calculateBackoffDelay(attempt, retryConfig, retryAfter);\n\n // Only log in development mode\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production') {\n console.warn(\n `Retry attempt ${attempt + 1}/${retryConfig.maxRetries} after ${delay}ms`,\n error,\n );\n }\n\n await sleep(delay);\n }\n }\n\n // If we get here, all retries failed\n throw lastError;\n}\n\n/**\n * Rate limiter using token bucket algorithm\n * Useful for controlling request rate to Contentful API\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number;\n\n constructor(\n private readonly maxTokens: number,\n private readonly refillRate: number, // tokens per second\n ) {\n this.tokens = maxTokens;\n this.lastRefill = Date.now();\n }\n\n /**\n * Refills tokens based on time elapsed\n */\n private refill(): void {\n const now = Date.now();\n const timePassed = (now - this.lastRefill) / 1000; // in seconds\n const tokensToAdd = timePassed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n this.lastRefill = now;\n }\n\n /**\n * Attempts to consume a token\n * @returns true if token was consumed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Waits until a token is available and consumes it\n */\n async consume(): Promise<void> {\n while (!this.tryConsume()) {\n // Wait for the time needed to get one token\n const waitTime = (1 / this.refillRate) * 1000;\n await sleep(waitTime);\n }\n }\n\n /**\n * Gets current number of available tokens\n */\n getAvailableTokens(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n}\n","import type { Block, Document, Inline, Text } from '@contentful/rich-text-types';\nimport type {\n CollectionContent,\n IInternalLink,\n INavigationItem,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, EntrySkeletonType, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport type { BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport { arrayOrUndefined } from '../utils';\nimport { convertExternalVideoEntryToVisual, convertMediaEntryToVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset } from './helpers';\n\nexport function resolveHelper<TEntrySkeletonType extends EntrySkeletonType, TResult>(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n getResolver: (\n type: string,\n ) =>\n | ((\n context: ConverterContext,\n entry: Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n ) => TResult)\n | undefined,\n): TResult {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n if (!possibleEntry) {\n throw new Error(`Cannot find included entry for link from ${fromId} with id ${id}`);\n }\n if (!possibleEntry.resolved) {\n const resolver = getResolver(possibleEntry.type);\n if (!resolver) {\n throw new Error(\n `No resolver found for link type ${possibleEntry.type} (${JSON.stringify(possibleEntry)}) [${JSON.stringify(entry)}]`,\n );\n }\n if (typeof resolver !== 'function') {\n console.log('Resolver type', possibleEntry.type, typeof resolver, resolver);\n }\n\n const resolved = resolver(\n context,\n possibleEntry.entry as Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n );\n possibleEntry.resolved = resolved;\n return resolved;\n }\n return possibleEntry.resolved as TResult;\n}\n\nexport function resolveLink(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): IInternalLink {\n return resolveHelper<BaseLink, IInternalLink>(context, fromId, entry, (type) =>\n context.linkResolver.get(type),\n );\n}\n\nexport function resolveLinks(\n context: ConverterContext,\n fromId: string,\n entries: UnresolvedLink<'Entry'>[] | undefined,\n): readonly IInternalLink[] | undefined {\n return arrayOrUndefined(entries?.map((entry) => resolveLink(context, fromId, entry)));\n}\n\nexport function resolveContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped {\n return resolveHelper<BaseLink, ITyped>(context, fromId, entry, (type) => {\n const resolver = context.contentResolver.get(type);\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n ) => ITyped;\n });\n}\n\nexport function resolveNavigationItem(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): INavigationItem {\n const result = resolveHelper<BaseNavigationItemSkeleton, INavigationItem>(\n context,\n fromId,\n entry,\n () => context.navigationItemResolver,\n );\n return result;\n}\n\ntype BaseCollectionContent = BaseComponentSkeleton | BaseCollectionSkeleton | BaseLink;\nexport function resolveCollectionContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): CollectionContent {\n return resolveHelper<BaseCollectionContent, CollectionContent>(context, fromId, entry, (type) => {\n const resolver = context.contentResolver.get(type);\n if (resolver) {\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContent, DefaultChainModifier, string>,\n ) => CollectionContent;\n }\n const linkResolver = context.linkResolver.get(type);\n if (linkResolver) {\n return linkResolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContent, DefaultChainModifier, string>,\n ) => CollectionContent;\n }\n return undefined;\n });\n}\n\n/**\n * Resolves a PageContent entry from an unresolved link\n * PageContent can be: Component, Collection, ExternalComponent, Visual (media/externalVideo), or PersonLink\n */\nexport function resolvePageContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped | null {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n const errorMessage = `Cannot find included entry for content from ${fromId} with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: 'unknown',\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n\n const { type } = possibleEntry;\n\n // Handle Media - convert to IVisual\n if (type === 'media') {\n try {\n const visual = convertMediaEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert media entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting media entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // Handle ExternalVideo - convert to IVisual\n if (type === 'externalVideo') {\n try {\n const visual = convertExternalVideoEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert externalVideo entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting externalVideo entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // // Handle ExternalComponent\n // if (type === 'externalComponent') {\n // return resolveHelper<\n // TConfig,\n // BaseExternalComponentSkeleton<TConfig>,\n // TConfig['ExternalComponent']\n // >(context, entry, () => baseExternalComponentConverter);\n // }\n\n try {\n if (context.contentResolver.has(type)) {\n return resolveContent(context, fromId, entry);\n }\n\n if (context.linkResolver.has(type)) {\n return resolveLink(context, fromId, entry);\n }\n\n const errorMessage = `Unknown content type \"${type}\" for entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n } catch (error) {\n const errorMessage = `Error resolving content entry with id ${id} of type ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n}\n\n/**\n * Resolves all embedded entries and assets within a rich text document\n * Recursively traverses the document tree and resolves link references\n *\n * @param context - The converter context with includes and assets maps\n * @param richText - The unresolved rich text document from Contentful\n * @returns The rich text document with all embedded content resolved\n */\nexport function resolveRichTextDocument(\n context: ConverterContext,\n fromId: string,\n richText: Document | undefined,\n) {\n if (!richText) {\n return undefined;\n }\n\n // Track resolved entries to prevent infinite recursion\n const resolvingEntries = new Set<string>();\n const resolvedEntries = new Set<string>();\n\n const resolveNode = (node: Block | Text | Inline): Block | Text | Inline => {\n // Handle embedded-entry-block nodes\n if (!('content' in node)) {\n return node;\n }\n const block = node as Block;\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Entry'\n ) {\n const entryId = block.data.target.sys.id;\n\n // Check for circular references\n if (resolvingEntries.has(entryId)) {\n console.warn(\n `Circular reference detected in rich text resolution for entry ${entryId}. Skipping to prevent infinite recursion.`,\n );\n // Return the node as-is to break the cycle\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n // Check if already resolved\n if (resolvedEntries.has(entryId)) {\n // Entry already resolved, skip to avoid duplicate work\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n try {\n resolvingEntries.add(entryId);\n const resolvedEntry = resolvePageContent(\n context,\n fromId,\n block.data.target as UnresolvedLink<'Entry'>,\n );\n resolvingEntries.delete(entryId);\n resolvedEntries.add(entryId);\n\n // If resolvePageContent returned null due to error, return node as-is\n if (resolvedEntry === null) {\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedEntry,\n },\n content: block.content?.map(resolveNode),\n };\n } catch (error) {\n resolvingEntries.delete(entryId); // Clean up on error\n console.error(`Failed to resolve entry with id ${entryId}:`, error);\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Asset'\n ) {\n try {\n const resolvedAsset = lookupAsset(context, block.data.target as UnresolvedLink<'Asset'>);\n if (resolvedAsset) {\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedAsset,\n },\n content: block.content?.map(resolveNode),\n };\n }\n } catch (error) {\n console.error(\n `Failed to resolve embedded-asset-block with id ${block.data.target.sys.id}:`,\n error,\n );\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n // For all other node types, recursively process content if present\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n };\n\n // Cast the EntryFieldTypes.RichText to our working type\n // Resolve the entire document tree\n const resolved = resolveNode(richText);\n\n // Cast back to the config's RichText type\n return { json: resolved as Document };\n}\n","import type { IBaseCollection } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport { type ConverterContext, DEFAULT_POSITION_FIELDS, lookupAsset } from './helpers';\nimport { resolveCollectionContent, resolveLink, resolveRichTextDocument } from './resolver';\n\n/**\n * Base converter for Contentful Collection entries to ICollection type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns ICollection object\n *\n * @example\n * ```ts\n * const collection = baseCollectionConverter(context, contentfulEntry);\n * ```\n */\nexport function baseCollectionConverter(\n context: ConverterContext,\n entry: Entry<BaseCollectionSkeleton, DefaultChainModifier, string>,\n): IBaseCollection {\n const { sys, fields } = entry;\n const { id } = sys;\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n contents: contentsField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n // Field name change\n collectionType,\n showHeading,\n heading,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const collection: IBaseCollection = {\n type: 'Collection',\n id,\n name: cmsLabel,\n cmsLabel,\n collectionType,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupAsset(context, iconField),\n backgroundVisual,\n visual,\n links: linksField?.map((link) => resolveLink(context, id, link)),\n contents: contentsField?.map((content) => resolveCollectionContent(context, id, content)),\n };\n return collection;\n}\n","import type { IBaseComponent } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport { arrayOrUndefined, notEmpty } from '../utils';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport { type ConverterContext, DEFAULT_POSITION_FIELDS, lookupAsset } from './helpers';\nimport { resolveLinks, resolveRichTextDocument } from './resolver';\n\n/**\n * Base converter for Contentful Component entries to IComponent type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns IComponent object\n *\n * @example\n * ```ts\n * const component = baseComponentConverter(context, contentfulEntry);\n * ```\n */\nexport function baseComponentConverter(\n context: ConverterContext,\n entry: Entry<BaseComponentSkeleton, DefaultChainModifier, string>,\n): IBaseComponent {\n const { sys, fields } = entry;\n const { id } = sys;\n\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n // Field name change\n componentType,\n showHeading,\n heading,\n otherMedia: otherMediaField,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const otherMedia = otherMediaField?.map((media) => lookupAsset(context, media));\n\n const component: IBaseComponent = {\n type: 'Component',\n id,\n name: cmsLabel,\n cmsLabel,\n componentType,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupAsset(context, iconField),\n backgroundVisual,\n visual,\n links: resolveLinks(context, id, linksField),\n otherMedia: arrayOrUndefined(otherMedia?.filter(notEmpty)),\n };\n return component;\n}\n","import type {\n IBlankLink,\n IDownloadLink,\n IExternalLink,\n IInternalLink,\n} from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseLinkSkeleton } from '../baseTypes/baseLink';\nimport { createResponsiveVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset, makeContentfulTitle, resolveBuildYear } from './helpers';\nimport { resolveLink } from './resolver';\n\n/**\n * Converts a Contentful link entry to an ILinkProps object\n * Handles all link types: internal, external, download, and blank\n */\nexport function baseLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseLinkSkeleton, DefaultChainModifier, string>,\n): IInternalLink | IExternalLink | IDownloadLink | IBlankLink {\n const { sys, fields } = entry;\n\n if (sys.contentType.sys.id !== 'link') {\n throw new Error(`Invalid content type: expected \"link\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const id = sys.id;\n const name = fields.name;\n const useName = fields.useName;\n const text = resolveBuildYear(\n useName\n ? name\n : (fields.linkText ?? makeContentfulTitle(fields.linkText, id, 'Link text for ')),\n );\n const icon = createResponsiveVisual(\n lookupAsset(context, fields.icon),\n lookupAsset(context, fields.mobileIcon),\n );\n const backgroundColour = fields.backgroundColour ?? null;\n const textColour = fields.textColour ?? null;\n const variant = fields.variant;\n const size = fields.size;\n\n // Common base properties\n const baseProps = {\n id,\n useName,\n name,\n text,\n icon,\n backgroundColour,\n textColour,\n variant,\n size,\n };\n\n // Determine link type based on field priority: internal > external > download > blank\n if (fields.internal) {\n // Internal link: resolve the target entry to get its href\n const internalTarget = resolveLink(context, id, fields.internal);\n return {\n ...baseProps,\n type: 'Internal link',\n internalType: internalTarget.internalType,\n href: internalTarget.href,\n slug: internalTarget.slug,\n indexed: internalTarget.indexed,\n hidden: internalTarget.hidden,\n tags: internalTarget.tags,\n };\n }\n\n if (fields.external) {\n // External link: use the external URL\n return {\n ...baseProps,\n type: 'External link',\n href: fields.external,\n };\n }\n\n if (fields.downloadAsset) {\n // Download link: use the asset URL\n const asset = lookupAsset(context, fields.downloadAsset);\n let href: string | null = null;\n if (asset?.image?.type === 'Picture') {\n href = asset.image.src;\n } else if (asset?.image?.type === 'Svg image') {\n href = asset.image.svgSrc;\n } else if (asset?.video) {\n if (asset.video.type === 'Local video') {\n href = asset.video.preview.videoUrl;\n } else if (asset.video.type === 'Full video') {\n href = asset.video.full.videoUrl;\n } else if (asset.video.type === 'External video') {\n href = asset.video.external;\n }\n }\n return {\n ...baseProps,\n type: 'Download link',\n href,\n visual: asset,\n };\n }\n\n // Blank link: no href\n return {\n ...baseProps,\n type: 'Blank link',\n href: null,\n };\n}\n","import type {\n IBlankLink,\n ILinkProps,\n INavigation,\n INavigationItem,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseNavigationSkeleton } from '../baseTypes/baseNavigation';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport { createResponsiveVisual } from './asset';\nimport {\n type ConverterContext,\n lookupAsset,\n makeContentfulTitle,\n resolveBuildYear,\n} from './helpers';\nimport { resolveLink, resolveNavigationItem } from './resolver';\n\nfunction createLink(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): ILinkProps | undefined {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n title,\n link,\n text,\n internal,\n icon: navIcon,\n mobileIcon: mobileNavIcon,\n useTitle,\n ...otherFields\n } = fields;\n const icon = createResponsiveVisual(\n lookupAsset(context, navIcon),\n lookupAsset(context, mobileNavIcon),\n );\n\n const realText = useTitle ? resolveBuildYear(title) : text ? resolveBuildYear(text) : undefined;\n\n if (link) {\n return {\n type: 'External link',\n id,\n href: link,\n icon,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n text: realText,\n };\n }\n if (internal) {\n const resolved = resolveLink(context, id, internal);\n return { ...resolved, icon, id, text: realText };\n }\n const blank = {\n type: 'Blank link',\n nick: true,\n id,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n icon,\n text: realText,\n };\n return blank as IBlankLink;\n}\n\nexport function baseNavigationItemConverter(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): INavigationItem {\n const {\n sys: { id },\n fields,\n } = entry;\n\n const { navigationItems } = fields;\n\n const link = createLink(context, entry);\n\n const resolvedNavigationItems = navigationItems\n ?.map((item) => resolveNavigationItem(context, id, item))\n .filter((item): item is INavigationItem => item !== undefined);\n\n const result = {\n id,\n link,\n entries: resolvedNavigationItems,\n };\n return result;\n}\n\n/**\n * Resolves a navigation entry from an unresolved link\n */\nexport function resolveNavigation(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): INavigation | undefined {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'navigation') {\n return undefined;\n }\n\n const entry = possibleEntry.entry as Entry<BaseNavigationSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return undefined;\n }\n\n // Resolve navigation item entries\n const entries = fields.entries?.map((item) => resolveNavigationItem(context, id, item)) ?? [];\n\n const { name, textColour, backgroundColour } = fields;\n return {\n id,\n name,\n entries,\n textColour,\n backgroundColour,\n };\n}\n","import type { INavigation, ITyped } from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseTemplateSkeleton } from '../baseTypes/baseTemplate';\nimport type { ConverterContext } from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent } from './resolver';\n\n/**\n * Resolved template data structure\n * Templates don't exist as a top-level type in core-data-types,\n * so this is an internal converter type only\n */\nexport interface ResolvedTemplate {\n preContent: ReadonlyArray<ITyped>;\n postContent: ReadonlyArray<ITyped>;\n menu?: INavigation;\n footer?: INavigation;\n backgroundColour?: string;\n textColour?: string;\n stickyNav: boolean;\n}\n\n/**\n * Resolves a template entry from an unresolved link\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param link - Unresolved link to template entry\n * @returns Resolved template data with content arrays and navigation\n */\nexport function resolveTemplate(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): ResolvedTemplate | null {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'template') {\n return null;\n }\n\n const entry = possibleEntry.entry as Entry<BaseTemplateSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return null;\n }\n\n // Resolve content arrays\n const preContent =\n fields.preContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n const postContent =\n fields.postContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n // Resolve navigation entries\n const menu = fields.menu ? resolveNavigation(context, fields.menu) : undefined;\n\n const footer = fields.footer ? resolveNavigation(context, fields.footer) : undefined;\n\n // Check for sticky nav flag\n const stickyNav = fields.flags?.includes('Sticky nav') ?? false;\n\n const { backgroundColour, textColour } = fields;\n return {\n preContent,\n postContent,\n menu,\n footer,\n backgroundColour,\n textColour,\n stickyNav,\n };\n}\n","import type { IBasePage, IInternalLink, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BasePageVariantSkeleton } from '../baseTypes/basePageVariant';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent } from './resolver';\nimport { resolveTemplate } from './template';\n\n/**\n * Base converter for Contentful Page entries to IPage type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IPage object\n *\n * @example\n * ```ts\n * const page = basePageConverter(contentfulEntry);\n * ```\n */\n\nexport function basePageConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IBasePage {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n menu: pageMenu,\n footer: pageFooter,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n ...simpleFields\n } = fields;\n\n const pageMenuNav = pageMenu ? resolveNavigation(context, pageMenu) : undefined;\n const pageFooterNav = pageFooter ? resolveNavigation(context, pageFooter) : undefined;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const pageContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...pageContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n const page: IBasePage = {\n type: 'Page',\n id,\n isHomePage: slug === 'index',\n slug,\n title: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n featuredImage: lookupAsset(context, featuredImage),\n tags: tags?.map((tag) => resolveLink(context, id, tag)),\n contents,\n ...simpleFields,\n menu: pageMenuNav ?? template?.menu,\n footer: pageFooterNav ?? template?.footer,\n };\n return page;\n}\n\nexport function calculatePageHref(slug: string) {\n if (slug === 'index') {\n return '/';\n }\n return `/${slug}/`;\n}\n\nexport function basePageLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'page') {\n throw new Error(`Invalid content type: expected \"page\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculatePageHref(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n\n/**\n * Calculates the href for a page variant page\n * @param slug - Page variant slug\n * @returns Page variant href path with trailing slash\n */\nexport function calculatePageVariantHref(slug: string) {\n return `/${slug}/`;\n}\n\n/**\n * Base converter for PageVariant entries to IInternalLink type\n * Used when a page variant is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful page variant entry to convert\n * @returns IInternalLink object representing the page variant link\n *\n * @example\n * ```ts\n * const pageVariantLink = basePageVariantLinkConverter(context, pageVariantEntry);\n * ```\n */\nexport function basePageVariantLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageVariantSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'pageVariant') {\n throw new Error(`Invalid content type: expected \"pageVariant\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculatePageVariantHref(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n","import type { IInternalLink, IPerson } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport {\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveRichTextDocument } from './resolver';\n\n/**\n * Calculates the href for a person page\n * @param slug - Person slug\n * @returns Person href path with trailing slash\n */\nexport function calculatePersonHref(slug: string) {\n return `/people/${slug}/`;\n}\n\n/**\n * Base converter for Person entries to IInternalLink type\n * Used when a person is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @returns IInternalLink object representing the person link\n *\n * @example\n * ```ts\n * const personLink = basePersonLinkConverter(context, personEntry);\n * ```\n */\nexport function basePersonLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${sys.contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.name, // Person has no cmsLabel, use name field\n title: fields.name,\n featuredImage: fields.media, // Person uses 'media' not 'featuredImage'\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculatePersonHref(fields.slug),\n 'Person',\n );\n}\n\n/**\n * Base converter for Person entries to IPerson type\n * Used when a complete person object with bio and content is needed\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @returns IPerson object representing the complete person\n *\n * @example\n * ```ts\n * const person = basePersonConverter(context, personEntry);\n * ```\n */\nexport function basePersonConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n): IPerson {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${contentType.sys.id}\"`);\n }\n const {\n slug,\n hidden,\n indexed,\n backgroundColour,\n textColour,\n name,\n description,\n media,\n jobTitle,\n phoneNumber,\n emailAddress,\n location,\n linkedIn,\n bio: bioField,\n } = fields;\n\n return {\n type: 'Person',\n id,\n slug,\n title: makeContentfulTitle(name, id),\n description: description ?? `Description for ${id}`,\n featuredImage: lookupAsset(context, media), // Person uses 'media' not 'featuredImage'\n backgroundColour,\n textColour,\n indexed,\n hidden,\n href: calculatePersonHref(slug),\n jobTitle: jobTitle ?? null,\n phoneNumber: phoneNumber ?? null,\n emailAddress: emailAddress ?? null,\n location: location ?? null,\n linkedIn: linkedIn ?? null,\n bio: resolveRichTextDocument(context, id, bioField) ?? null,\n };\n}\n","import type {\n IArticleLink,\n IBaseArticle,\n IBaseArticleType,\n IInternalLink,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent } from './resolver';\nimport { type ResolvedTemplate, resolveTemplate } from './template';\n\n/**\n * Resolves the article template using a hierarchy:\n * 1. Article's explicit template field (if set)\n * 2. ArticleType's articleTemplate field (if set)\n *\n * @param context - Converter context containing includes\n * @param articleTypeLink - Link to the article's ArticleType\n * @param directTemplateLink - Optional direct template link from the article\n * @returns Resolved template or null if no template found in hierarchy\n */\nfunction resolveArticleTemplateHierarchy(\n context: ConverterContext,\n articleTypeLink: UnresolvedLink<'Entry'>,\n directTemplateLink: UnresolvedLink<'Entry'> | undefined,\n): ResolvedTemplate | null {\n // Direct template on article takes precedence\n if (directTemplateLink) {\n return resolveTemplate(context, directTemplateLink);\n }\n\n // Fall back to articleType's articleTemplate\n const articleTypeEntry = context.includes.get(articleTypeLink.sys.id);\n if (!articleTypeEntry) {\n console.warn(`ArticleType entry not found for id: ${articleTypeLink.sys.id}`);\n return null;\n }\n\n const articleTypeFields = (\n articleTypeEntry.entry as Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>\n ).fields;\n\n if (articleTypeFields?.articleTemplate) {\n return resolveTemplate(context, articleTypeFields.articleTemplate);\n }\n\n return null;\n}\n\n/**\n * Base converter for Contentful Article entries to IArticle type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IArticle object\n *\n * @example\n * ```ts\n * const article = baseArticleConverter(contentfulEntry);\n * ```\n */\n\nexport function baseArticleConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IBaseArticle {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n articleType,\n ...simpleFields\n } = fields;\n const articleTypeLink = resolveLink(context, id, articleType);\n\n // Resolve template with hierarchy (article template → articleType template)\n const template = resolveArticleTemplateHierarchy(context, articleType, templateLink);\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const articleContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...articleContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n const article: IBaseArticle = {\n type: 'Article',\n id,\n slug,\n title: makeContentfulTitle(title, sys.id),\n description: makeContentfulDescription(description, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n articleType: articleTypeLink,\n tags: tags?.map((tag) => resolveLink(context, id, tag)),\n contents,\n ...simpleFields,\n // Note: summary field exists in Contentful but is not part of IArticle interface\n // Keeping it in simpleFields for potential future use\n menu: template?.menu,\n footer: template?.footer,\n };\n return article;\n}\n\nexport function calculateArticleTypeHref(slug: string) {\n return `/${slug}/`;\n}\n\nexport function calculateArticleHref(articleTypeSlug: string, slug: string) {\n return `${calculateArticleTypeHref(articleTypeSlug)}${slug}/`;\n}\n\nexport function baseArticleLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IArticleLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'article') {\n throw new Error(`Invalid content type: expected \"article\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const articleTypeLink = resolveLink(context, sys.id, fields.articleType);\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculateArticleHref(articleTypeLink.slug, fields.slug),\n 'Article',\n {\n tags: fields.tags?.map((tag) => resolveLink(context, sys.id, tag)),\n articleType: articleTypeLink,\n },\n ) as IArticleLink;\n}\n\nexport function baseArticleTypeLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'articleType') {\n throw new Error(\n `Invalid content type: expected \"articleType\", got \"${sys.contentType.sys.id}\"`,\n );\n }\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.name,\n title: fields.name,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculateArticleTypeHref(fields.slug),\n 'ArticleType',\n );\n}\n\n/**\n * Base converter for Contentful Article Type entries to IArticleType type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IBaseArticleType object\n *\n * @example\n * ```ts\n * const articleType = baseArticleTypeConverter(contentfulEntry);\n * ```\n */\nexport function baseArticleTypeConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n): IBaseArticleType {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n slug,\n indexPageName,\n indexPageDescription,\n featuredImage,\n menu: menuLink,\n footer: footerLink,\n indexPageTemplate: templateLink,\n indexPageTopContent: topContentLinks,\n ...simpleFields\n } = fields;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve navigation\n const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;\n const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const indexPageContent = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n const articleType: IBaseArticleType = {\n type: 'Article type',\n id,\n slug,\n title: makeContentfulTitle(indexPageName, sys.id),\n description: makeContentfulDescription(indexPageDescription, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n indexPageContent,\n ...simpleFields,\n menu,\n footer,\n };\n\n return articleType;\n}\n","import type { IInternalLink } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport { type ConverterContext, createInternalLink } from './helpers';\n\nexport function calculateTagHref(slug: string) {\n return `/tag/${slug}/`;\n}\n\nexport function baseTagLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseTagSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'tag') {\n throw new Error(`Invalid content type: expected \"tag\", got \"${sys.contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.name,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculateTagHref(fields.slug),\n 'Tag',\n );\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: Any ok for now! */\nimport type { Document } from '@contentful/rich-text-types';\nimport type {\n IBaseArticle,\n IBaseArticleType,\n IBasePage,\n IInternalLink,\n INavigation,\n INavigationItem,\n IPerson,\n IVisual,\n} from '@se-studio/core-data-types';\nimport type { Entry, EntrySkeletonType } from 'contentful';\nimport type { BaseArticleSkeleton } from './baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from './baseTypes/baseArticleType';\nimport type { BasePageSkeleton } from './baseTypes/basePage';\nimport type { BasePersonSkeleton } from './baseTypes/basePerson';\nimport type { BaseTagSkeleton } from './baseTypes/baseTag';\nimport { type ContentfulResponse, getContentfulClient } from './client';\nimport { basePageConverter } from './converters';\nimport {\n baseArticleConverter,\n baseArticleLinkConverter,\n baseArticleTypeConverter,\n baseArticleTypeLinkConverter,\n} from './converters/article';\nimport { convertAssetToVisual } from './converters/asset';\nimport { baseCollectionConverter } from './converters/collection';\nimport { baseComponentConverter } from './converters/component';\nimport type {\n BaseConverterContext,\n ContentResolverFunction,\n ContentResolverMap,\n ConverterContext,\n LinkResolverFunction,\n LinkResolverMap,\n} from './converters/helpers';\nimport { baseLinkConverter } from './converters/link';\nimport { baseNavigationItemConverter } from './converters/navigationItem';\nimport { basePageLinkConverter, basePageVariantLinkConverter } from './converters/page';\nimport { basePersonLinkConverter } from './converters/person';\nimport { resolveLink } from './converters/resolver';\nimport { baseTagLinkConverter } from './converters/tag';\nimport { getCacheTags } from './revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from './types';\nimport { withRetry } from './utils';\n\nexport type DefaultChainModifier = 'WITHOUT_LINK_RESOLUTION';\n\n/**\n * Field selection constants for link-only fetching.\n * These reduce payload size by excluding content arrays, navigation, templates, etc.\n */\nconst PAGE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags';\n\nconst ARTICLE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags,fields.articleType';\n\nconst ARTICLE_RELATED_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags,fields.articleType,fields.date,fields.author';\n\nconst ARTICLE_TYPE_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nconst TAG_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nconst PERSON_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.media,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nfunction convertAllAssets(\n response: ContentfulResponse<any>,\n context: BaseConverterContext,\n): Map<string, IVisual> {\n const visuals = new Map<string, IVisual>();\n const assets = response.includes?.Asset;\n if (assets && assets.length > 0) {\n for (const asset of assets) {\n const visual = convertAssetToVisual(context, asset);\n if (visual) {\n visuals.set(visual.id, visual);\n }\n }\n }\n return visuals;\n}\n\nexport type ResolvedEntry =\n | IBasePage\n | IBaseArticle\n | IBaseArticleType\n | INavigation\n | INavigationItem\n | IInternalLink\n | unknown // PageContent - will be narrowed at project level\n | IPerson;\n\nexport type PossibleResolvedEntry = {\n id: string;\n type: string;\n entry: Entry<EntrySkeletonType, DefaultChainModifier, string>;\n resolved?: ResolvedEntry;\n};\n\nfunction convertAllIncludes(response: ContentfulResponse<any>): Map<string, PossibleResolvedEntry> {\n const includes = new Map<string, PossibleResolvedEntry>();\n const entries = [...response.items, ...(response.includes?.Entry || [])];\n\n if (entries && entries.length > 0) {\n for (const entry of entries) {\n if (entry?.sys && entry.fields) {\n includes.set(entry.sys.id, {\n id: entry.sys.id,\n type: entry.sys.contentType.sys.id,\n entry,\n });\n }\n }\n }\n return includes;\n}\n\nexport type Converter<TEntry extends EntrySkeletonType, TResult> = (\n entry: Entry<TEntry, DefaultChainModifier, string>,\n includes: Map<string, PossibleResolvedEntry>,\n assets: Map<string, IVisual>,\n) => TResult;\n\n/**\n * Fetches a page from Contentful by slug\n *\n * @param config - Contentful configuration\n * @param slug - Page slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @param converter - Optional custom converter function\n * @returns Promise resolving to IPage or null if not found\n *\n * @example\n * ```ts\n * const page = await contentfulPageRest(\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'home',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['home-page'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulPageRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBasePage | null>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request\n const cacheTags = getCacheTags('page', slug, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n const fetchFn = async () => {\n const response = await client.getEntries<BasePageSkeleton>(\n {\n content_type: 'page',\n 'fields.slug': slug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const pageEntry = response.items[0];\n if (!pageEntry || !pageEntry.fields) {\n return { data: null, errors: [] };\n }\n\n try {\n const assets = convertAllAssets(response, context);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n const converted = fullContext.pageResolver(fullContext, pageEntry);\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error('CMS conversion errors for page:', {\n pageId: pageEntry.sys.id,\n slug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = pageEntry.sys.id;\n const entryType = pageEntry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\nexport interface IContentfulRichText {\n json: Document;\n customStyles?: ReadonlyArray<string> | null;\n}\n\n/**\n * Creates a base converter context with default resolvers for all content types.\n *\n * Sets up default converters for:\n * - Pages, Articles, Article Types\n * - Components, Collections, External Components\n * - Links (pages, articles, tags, people, etc.)\n * - Navigation items\n *\n * Projects can extend this context with custom resolvers for specific content types.\n *\n * @returns Base converter context with all default resolvers configured\n *\n * @example\n * ```ts\n * const context = createBaseConverterContext();\n *\n * // Use with API functions\n * const page = await contentfulPageRest(context, config, 'home');\n * ```\n */\nexport function createBaseConverterContext(): BaseConverterContext {\n const linkResolver: LinkResolverMap = new Map();\n linkResolver.set('page', basePageLinkConverter as LinkResolverFunction);\n linkResolver.set('article', baseArticleLinkConverter as LinkResolverFunction);\n linkResolver.set('articleType', baseArticleTypeLinkConverter as LinkResolverFunction);\n linkResolver.set('tag', baseTagLinkConverter as LinkResolverFunction);\n linkResolver.set('person', basePersonLinkConverter as LinkResolverFunction);\n linkResolver.set('pageVariant', basePageVariantLinkConverter as LinkResolverFunction);\n linkResolver.set('link', baseLinkConverter as LinkResolverFunction);\n\n const contentResolver: ContentResolverMap = new Map();\n contentResolver.set('collection', baseCollectionConverter as ContentResolverFunction);\n contentResolver.set('component', baseComponentConverter as ContentResolverFunction);\n contentResolver.set(\n 'externalComponent',\n baseComponentConverter as unknown as ContentResolverFunction,\n );\n\n return {\n pageResolver: basePageConverter,\n navigationItemResolver: baseNavigationItemConverter,\n articleResolver: baseArticleConverter,\n articleTypeResolver: baseArticleTypeConverter,\n componentResolver: baseComponentConverter,\n collectionResolver: baseCollectionConverter,\n linkResolver,\n contentResolver,\n videoPrefix: '',\n };\n}\n\n/**\n * Fetches an article from Contentful by slug and article type slug.\n *\n * @param context - Base converter context for content transformation\n * @param config - Contentful configuration (spaceId, accessToken, environment)\n * @param slug - Article slug to fetch\n * @param articleTypeSlug - Article type slug (e.g., 'blog', 'news')\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns Promise resolving to article data or null if not found, with any conversion errors\n *\n * @example\n * ```ts\n * const article = await contentfulArticleRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'my-article',\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: { tags: ['article#my-article'], revalidate: 3600 }\n * }\n * );\n * ```\n */\nexport async function contentfulArticleRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n articleTypeSlug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseArticle | null>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use article slug for caching\n const cacheTags = getCacheTags('article', slug, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = async () => {\n const response = await client.getEntries<BaseArticleSkeleton>(\n {\n content_type: 'article',\n 'fields.slug': slug,\n 'fields.articleType.sys.contentType.sys.id': 'articleType',\n 'fields.articleType.fields.slug': articleTypeSlug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const articleEntry = response.items[0];\n if (!articleEntry || !articleEntry.fields) {\n return { data: null, errors: [] };\n }\n\n const assets = convertAllAssets(response, context);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n\n try {\n const converted = fullContext.articleResolver(fullContext, articleEntry);\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error('CMS conversion errors for article:', {\n articleId: articleEntry.sys.id,\n slug,\n articleTypeSlug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = articleEntry.sys.id;\n const entryType = articleEntry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches an article type from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Article type slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseArticleType or null if not found\n *\n * @example\n * ```ts\n * const articleType = await contentfulArticleTypeRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['blog-article-type'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulArticleTypeRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseArticleType | null>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request\n const cacheTags = getCacheTags('articleType', slug, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = async () => {\n const response = await client.getEntries<BaseArticleTypeSkeleton>(\n {\n content_type: 'articleType',\n 'fields.slug': slug,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const articleTypeEntry = response.items[0];\n if (!articleTypeEntry || !articleTypeEntry.fields) {\n return { data: null, errors: [] };\n }\n\n const assets = convertAllAssets(response, context);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n\n try {\n const converted = fullContext.articleTypeResolver(fullContext, articleTypeEntry);\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error('CMS conversion errors for article type:', {\n articleTypeId: articleTypeEntry.sys.id,\n slug,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = articleTypeEntry.sys.id;\n const entryType = articleTypeEntry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Extended article link interface that includes metadata needed for filtering related articles\n */\nexport interface IArticleLinkWithMetadata extends IInternalLink {\n date?: Date;\n author?: IInternalLink;\n articleType?: IInternalLink;\n}\n\n// ============================================================================\n// Sitemap Types\n// ============================================================================\n\n/**\n * Change frequency hints for sitemap entries.\n * These are hints to search engine crawlers about how often content changes.\n */\nexport type SitemapChangeFrequency =\n | 'always'\n | 'hourly'\n | 'daily'\n | 'weekly'\n | 'monthly'\n | 'yearly'\n | 'never';\n\n/**\n * A single sitemap entry representing a URL to be indexed.\n * Compatible with Next.js MetadataRoute.Sitemap format.\n */\nexport interface ISitemapEntry {\n /** Full URL path (from href) */\n url: string;\n /** Last modified date from Contentful sys.updatedAt */\n lastModified?: Date;\n /** Change frequency hint for crawlers */\n changeFrequency?: SitemapChangeFrequency;\n /** Priority hint (0.0-1.0) */\n priority?: number;\n}\n\n/**\n * Configuration for sitemap entries of a specific content type.\n * Allows setting default priority and change frequency for all entries of that type.\n */\nexport interface SitemapContentTypeConfig {\n /** Default priority for this content type (0.0-1.0) */\n priority?: number;\n /** Default change frequency for this content type */\n changeFrequency?: SitemapChangeFrequency;\n}\n\n/**\n * Provider function type for fetching sitemap entries.\n * Projects can implement custom providers for additional content types.\n */\nexport type SitemapEntryProvider = (\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n) => Promise<CmsResponse<ISitemapEntry[]>>;\n\n/**\n * Configuration for collecting sitemap entries from multiple sources.\n */\nexport interface SitemapConfig {\n /** Array of provider functions that fetch sitemap entries */\n providers: SitemapEntryProvider[];\n}\n\n/**\n * Options for filtering related articles\n */\nexport interface RelatedArticlesOptions {\n /** Filter by article type id */\n articleTypeId?: string;\n /** Filter by tag IDs - articles with at least one matching tag will be included and ranked higher */\n tagIds?: string[];\n /** Filter by author ID */\n authorId?: string;\n /** Exclude specific article IDs */\n excludeIds?: string[];\n /** Only include articles published before this date */\n before?: Date;\n /** Only include articles published after this date */\n after?: Date;\n /** Maximum number of results to return */\n count?: number;\n}\n\n/**\n * Fetches all articles from Contentful with shallow depth for use in related article filtering.\n * This function handles pagination automatically and caches results using Next.js fetch cache.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to array of article links with metadata\n *\n * @example\n * ```ts\n * const articles = await getAllArticlesForRelated(\n * context,\n * config,\n * {\n * cache: {\n * tags: ['all-articles-related'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\n/**\n * Specialized converter for article links with metadata needed for related article filtering\n */\nfunction baseArticleLinkConverterWithMetadata(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton>,\n): IArticleLinkWithMetadata {\n const baseLink = baseArticleLinkConverter(context, entry as any);\n\n return {\n ...baseLink,\n date: entry.fields.date ? new Date(entry.fields.date as string) : undefined,\n author: entry.fields.author\n ? resolveLink(context, baseLink.id, entry.fields.author as any)\n : undefined,\n articleType: entry.fields.articleType\n ? resolveLink(context, baseLink.id, entry.fields.articleType as any)\n : undefined,\n };\n}\n\nexport async function getAllArticlesForRelated(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IArticleLinkWithMetadata[]>> {\n const client = getContentfulClient(config, options?.preview);\n const allArticles: IArticleLinkWithMetadata[] = [];\n const errors: CmsError[] = [];\n const pageSize = 100;\n let skip = 0;\n let hasMore = true;\n\n // Set cache tags for this request - use article collection tag\n const cacheTags = getCacheTags('article', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = async () => {\n while (hasMore) {\n const response = await client.getEntries<BaseArticleSkeleton>(\n {\n content_type: 'article',\n 'fields.indexed': true,\n 'fields.hidden[ne]': true,\n order: '-fields.date',\n include: 2, // Shallow include - just enough for tags, articleType, author\n locale: options?.locale,\n limit: pageSize,\n skip,\n select: ARTICLE_RELATED_FIELDS,\n },\n requestOptions,\n );\n\n if (response.items.length === 0) {\n hasMore = false;\n break;\n }\n\n // Convert entries to article links with metadata\n const assets = convertAllAssets(response, context);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n\n for (const entry of response.items) {\n if (!entry.fields) continue;\n try {\n const converted = baseArticleLinkConverterWithMetadata(fullContext, entry);\n allArticles.push(converted);\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n errors.push({\n entryId,\n entryType,\n message: errorMessage,\n error,\n });\n }\n }\n\n skip += pageSize;\n\n // Check if we've fetched all items\n if (skip >= response.total) {\n hasMore = false;\n }\n }\n\n return { data: allArticles, errors };\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Shared helper function for paginated Contentful link fetching.\n * Returns links with lastModified metadata from sys.updatedAt.\n */\nasync function fetchAllLinks<\n TEntry extends EntrySkeletonType =\n | BasePageSkeleton\n | BaseArticleSkeleton\n | BaseArticleTypeSkeleton\n | BaseTagSkeleton\n | BasePersonSkeleton,\n>(\n contentType: string,\n client: ReturnType<typeof getContentfulClient>,\n requestOptions: any,\n converter: (\n context: ConverterContext,\n entry: Entry<TEntry, DefaultChainModifier, string>,\n ) => IInternalLink,\n context: BaseConverterContext,\n pageSize: number = 100,\n select?: string,\n): Promise<CmsResponse<IInternalLink[]>> {\n const allLinks: IInternalLink[] = [];\n const errors: CmsError[] = [];\n let skip = 0;\n let hasMore = true;\n\n const fetchFn = async () => {\n while (hasMore) {\n try {\n const response = await client.getEntries<TEntry>(\n {\n content_type: contentType,\n include: 2, // Minimal include for link-only fetching\n locale: requestOptions?.locale,\n limit: pageSize,\n skip,\n ...(select && { select }),\n },\n requestOptions,\n );\n\n if (response.items.length === 0) {\n hasMore = false;\n break;\n }\n\n // Convert entries to links\n const includes = convertAllIncludes(response);\n const assets = convertAllAssets(response, context);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n\n for (const entry of response.items) {\n if (!entry.fields) continue;\n try {\n const converted = converter(\n fullContext,\n entry as Entry<TEntry, DefaultChainModifier, string>,\n );\n // Add lastModified from sys.updatedAt\n converted.lastModified = entry.sys.updatedAt\n ? new Date(entry.sys.updatedAt)\n : undefined;\n allLinks.push(converted);\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown conversion error';\n\n errors.push({\n entryId,\n entryType,\n message: errorMessage,\n error,\n });\n }\n }\n\n skip += pageSize;\n\n // Check if we've fetched all items\n if (skip >= response.total) {\n hasMore = false;\n }\n } catch (error) {\n console.error('Error fetching links', typeof error, error, JSON.stringify(error, null, 2));\n throw error;\n }\n }\n\n return { data: allLinks, errors };\n };\n\n return await fetchFn();\n}\n\n/**\n * Fetches all page links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of page links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPageLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful page links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPageLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use page collection tag\n const cacheTags = getCacheTags('page', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'page',\n client,\n requestOptions,\n basePageLinkConverter,\n context,\n 100,\n PAGE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use article collection tag\n const cacheTags = getCacheTags('article', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'article',\n client,\n requestOptions,\n baseArticleLinkConverter,\n context,\n 100,\n ARTICLE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all tag links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of tag links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllTagLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful tag links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllTagLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use tag collection tag\n const cacheTags = getCacheTags('tag', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'tag',\n client,\n requestOptions,\n baseTagLinkConverter,\n context,\n 100,\n TAG_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all person links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of person links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPersonLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful person links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPersonLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use person collection tag\n const cacheTags = getCacheTags('person', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'person',\n client,\n requestOptions,\n basePersonLinkConverter,\n context,\n 100,\n PERSON_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article type links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article type links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleTypeLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article type links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleTypeLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use articleType collection tag\n const cacheTags = getCacheTags('articleType', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'articleType',\n client,\n requestOptions,\n baseArticleTypeLinkConverter,\n context,\n 100,\n ARTICLE_TYPE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Filters and ranks articles based on related article criteria.\n * Articles with more matching tags are ranked higher.\n *\n * @param articles - Array of article links with metadata\n * @param options - Filtering options\n * @returns Filtered and ranked array of article links\n *\n * @example\n * ```ts\n * const relatedArticles = filterRelatedArticles(allArticles, {\n * articleType: 'blog',\n * tags: ['tag-id-1', 'tag-id-2'],\n * exclude: ['current-article-id'],\n * count: 3,\n * });\n * ```\n */\nexport function filterRelatedArticles(\n articles: IArticleLinkWithMetadata[],\n options: RelatedArticlesOptions,\n): IInternalLink[] {\n const { articleTypeId, tagIds, authorId, excludeIds, before, after, count } = options;\n\n // Score and filter articles\n const scoredArticles = articles\n .map((article) => {\n let score = 0;\n\n // Filter: Exclude specific articles\n if (excludeIds?.includes(article.id)) {\n return null;\n }\n\n // Filter: Article type\n if (articleTypeId && article.articleType?.id !== articleTypeId) {\n return null;\n }\n\n // Filter: Author\n if (authorId && article.author?.id !== authorId) {\n return null;\n }\n\n // Filter: Date range\n if (article.date) {\n if (before && article.date > before) {\n return null;\n }\n if (after && article.date < after) {\n return null;\n }\n }\n\n // Score: Tag matching (more matches = higher score)\n if (tagIds && tagIds.length > 0 && article.tags) {\n const articleTagIds = article.tags.map((tag) => tag.id);\n const matchingTags = tagIds.filter((tagId) => articleTagIds.includes(tagId));\n score += matchingTags.length * 10; // Each matching tag adds 10 points\n }\n\n // Score: Author matching\n if (authorId && article.author?.id === authorId) {\n score += 5; // Matching author adds 5 points\n }\n\n return { article, score };\n })\n .filter((item): item is { article: IArticleLinkWithMetadata; score: number } => item !== null);\n\n // Sort by score (descending), then by date (descending)\n scoredArticles.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n // If scores are equal, sort by date (newest first)\n if (a.article.date && b.article.date) {\n return b.article.date.getTime() - a.article.date.getTime();\n }\n return 0;\n });\n\n // Take top N articles and return as IInternalLink (without metadata)\n const topArticles = count ? scoredArticles.slice(0, count) : scoredArticles;\n\n return topArticles.map(({ article }) => {\n // Return clean IInternalLink without the extra metadata\n const { date: _date, author: _author, articleType: _articleType, ...cleanLink } = article;\n return cleanLink as IInternalLink;\n });\n}\n\n// ============================================================================\n// Sitemap Entry Fetchers\n// ============================================================================\n\n/**\n * Helper function to convert internal links to sitemap entries.\n * Filters to only include indexed and non-hidden entries.\n *\n * @param links - Array of internal links with metadata\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns Array of sitemap entries\n */\nfunction linksToSitemapEntries(\n links: IInternalLink[],\n sitemapConfig?: SitemapContentTypeConfig,\n): ISitemapEntry[] {\n return links\n .filter((link) => link.indexed !== false && link.hidden !== true && link.href)\n .map((link) => ({\n url: link.href as string,\n lastModified: link.lastModified,\n changeFrequency: sitemapConfig?.changeFrequency,\n priority: sitemapConfig?.priority,\n }));\n}\n\n/**\n * Fetches all page sitemap entries from Contentful.\n * Only includes pages that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulPageSitemapEntries(\n * context,\n * config,\n * { priority: 0.8, changeFrequency: 'weekly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulPageSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPageLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article sitemap entries from Contentful.\n * Only includes articles that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulArticleSitemapEntries(\n * context,\n * config,\n * { priority: 0.6, changeFrequency: 'monthly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulArticleSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article type sitemap entries from Contentful.\n * Only includes article types that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulArticleTypeSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleTypeLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all tag sitemap entries from Contentful.\n * Only includes tags that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulTagSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllTagLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all person sitemap entries from Contentful.\n * Only includes people that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulPersonSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPersonLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n// ============================================================================\n// Sitemap Registry Functions\n// ============================================================================\n\n/**\n * Collects sitemap entries from multiple providers.\n * This allows projects to register custom content types for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Configuration with array of provider functions\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with all sitemap entries combined\n *\n * @example\n * ```ts\n * const { data: entries, errors } = await getAllSitemapEntries(\n * context,\n * config,\n * {\n * providers: [\n * (ctx, cfg, opts) => contentfulPageSitemapEntries(ctx, cfg, { priority: 0.8 }, opts),\n * (ctx, cfg, opts) => contentfulArticleSitemapEntries(ctx, cfg, { priority: 0.6 }, opts),\n * // Custom content type provider\n * async (ctx, cfg, opts) => {\n * const links = await fetchCustomContentLinks(ctx, cfg, opts);\n * return { data: links.map(l => ({ url: l.href, lastModified: l.lastModified })), errors: [] };\n * },\n * ],\n * },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function getAllSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const allEntries: ISitemapEntry[] = [];\n const allErrors: CmsError[] = [];\n\n // Fetch from all providers in parallel for better performance\n const results = await Promise.all(\n sitemapConfig.providers.map((provider) => provider(context, config, options)),\n );\n\n // Combine all results\n for (const result of results) {\n allEntries.push(...result.data);\n allErrors.push(...result.errors);\n }\n\n return { data: allEntries, errors: allErrors };\n}\n\n/**\n * Creates a sitemap entry provider with pre-configured options.\n * Useful for creating providers with specific priority and changeFrequency settings.\n *\n * @param fetcher - The sitemap entry fetcher function to wrap\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns A sitemap entry provider function\n *\n * @example\n * ```ts\n * const pageProvider = createSitemapProvider(\n * contentfulPageSitemapEntries,\n * { priority: 0.8, changeFrequency: 'weekly' }\n * );\n *\n * const { data: entries } = await getAllSitemapEntries(context, config, {\n * providers: [pageProvider, articleProvider],\n * });\n * ```\n */\nexport function createSitemapProvider(\n fetcher: (\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n ) => Promise<CmsResponse<ISitemapEntry[]>>,\n sitemapConfig?: SitemapContentTypeConfig,\n): SitemapEntryProvider {\n return (context, config, options) => fetcher(context, config, sitemapConfig, options);\n}\n","import type { Metadata } from 'contentful';\nimport {\n ArticleTag,\n ArticleTypeIndexTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeIndexTag,\n articleTypeTag,\n assetTag,\n BannerTag,\n CustomTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n NavigationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n tagTag,\n} from './tags';\nimport { revalidateSingleTag, revalidateTags } from './utils';\n\n// Contentful webhook payload types\ninterface BaseData {\n metadata: Metadata;\n sys: {\n id: string;\n type: 'Entry' | 'DeletedEntry' | 'Asset' | 'DeletedAsset';\n space: { sys: { id: string } };\n environment: { sys: { id: string } };\n contentType: { sys: { id: string } };\n };\n}\n\ninterface SlugData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n };\n}\n\ninterface PageVariantData extends SlugData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n originalPage?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n articleType?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleTypeData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n indexPageSlug?: {\n 'en-US': string;\n };\n };\n}\n\ninterface AssetData extends BaseData {\n fields?: {\n file?: {\n [key: string]: {\n url: string;\n fileName: string;\n contentType: string;\n };\n };\n };\n}\n\n// Content type handler interface\nexport interface IContentTypeHandler<TData extends BaseData, TExtracted> {\n extract(data: TData): TExtracted | Promise<TExtracted>;\n makeTags(extracted: TExtracted): (string | undefined)[] | undefined;\n getGlobalTags(): string[];\n rebuildSearch?: boolean;\n}\n\n// Default locale for Contentful\nconst defaultLocale = 'en-US';\n\n// Content type handlers\n\nconst articleTypeHandler: IContentTypeHandler<\n ArticleTypeData,\n { slug: string | undefined | null; indexPageSlug: string | undefined | null }\n> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n indexPageSlug: data.fields?.indexPageSlug?.[defaultLocale],\n }),\n makeTags: (extracted) => [\n extracted.slug ? articleTypeTag(extracted.slug) : undefined,\n extracted.indexPageSlug ? articleTypeIndexTag(extracted.indexPageSlug) : undefined,\n ],\n getGlobalTags: () => [ArticleTypeTag, ArticleTypeIndexTag],\n};\n\nconst articleHandler: IContentTypeHandler<ArticleData, { slug: string | undefined | null }> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n }),\n makeTags: (extracted) => [extracted?.slug ? articleTag(extracted.slug) : undefined],\n getGlobalTags: () => [ArticleTag],\n rebuildSearch: true,\n};\n\nconst pageVariantHandler: IContentTypeHandler<PageVariantData, string | undefined> = {\n extract: (data) => {\n const pageVariantSlug = data.fields?.slug?.[defaultLocale];\n return pageVariantSlug;\n },\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n};\n\n// Content type handlers registry\nexport const contentTypeHandlers: Record<\n string,\n IContentTypeHandler<SlugData, string | null | undefined>\n> = {\n page: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n },\n pageVariant: pageVariantHandler as IContentTypeHandler<SlugData, string | null | undefined>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n article: articleHandler as IContentTypeHandler<SlugData, any>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n articleType: articleTypeHandler as IContentTypeHandler<SlugData, any>,\n person: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? personTag(extracted) : undefined],\n getGlobalTags: () => [PersonTag],\n },\n tag: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? tagTag(extracted) : undefined],\n getGlobalTags: () => [TagTag],\n },\n template: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => ['template'],\n },\n customType: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [CustomTypeTag],\n },\n navigation: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [NavigationTag],\n },\n banner: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [BannerTag],\n },\n location: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? locationTag(extracted) : undefined],\n getGlobalTags: () => [LocationTag],\n },\n};\n\n// Asset revalidation handler\nexport async function revalidateAsset(\n content: AssetData,\n message: string,\n preview: boolean = false,\n): Promise<boolean> {\n const id = content.sys.id;\n const fileName = content.fields?.file?.[defaultLocale]?.fileName;\n const tags = [assetTag(id), fileName ? assetTag(fileName) : undefined, AssetTag].filter(\n (tag): tag is string => tag !== undefined,\n );\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, message);\n } else {\n await revalidateTags(tags, message);\n }\n\n return true;\n}\n\n// Entry revalidation handler\nexport async function revalidateEntry(\n handler: IContentTypeHandler<SlugData, string | null | undefined>,\n content: BaseData,\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const extracted = await Promise.resolve(handler.extract(content));\n const tags = handler.makeTags(extracted);\n const validTags = tags?.filter((tag): tag is string => tag !== undefined) ?? [];\n const globalTags = handler.getGlobalTags();\n const tagsToRevalidate = [...validTags, ...globalTags];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `publish ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tagsToRevalidate, `publish ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted entry by content type (collection tags only)\nexport async function revalidateDeletedEntry(\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const { getCacheTagsForProduction } = await import('./utils');\n const tags = getCacheTagsForProduction(contentType);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted asset by ID\nexport async function revalidateDeletedAsset(\n assetId: string,\n preview: boolean = false,\n): Promise<boolean> {\n const tags = [assetTag(assetId), AssetTag];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete asset ${assetId} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete asset ${assetId}`);\n }\n\n return true;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NextResponse } from 'next/server';\nimport {\n contentTypeHandlers,\n revalidateAsset,\n revalidateDeletedAsset,\n revalidateDeletedEntry,\n revalidateEntry,\n} from './handlers';\nimport { AllTags, GlobalTag } from './tags';\nimport { revalidateSingleTag } from './utils';\n\n// Contentful webhook payload types\ninterface BaseData {\n metadata: any;\n sys: {\n id: string;\n type: 'Entry' | 'DeletedEntry' | 'Asset' | 'DeletedAsset';\n space: { sys: { id: string } };\n environment: { sys: { id: string } };\n contentType: { sys: { id: string } };\n };\n}\n\ninterface AssetData extends BaseData {\n fields?: {\n file?: {\n [key: string]: {\n url: string;\n fileName: string;\n contentType: string;\n };\n };\n };\n}\n\n// Handle asset publishing\nasync function publishAsset(content: AssetData, preview: boolean): Promise<boolean> {\n return await revalidateAsset(content, 'publish asset', preview);\n}\n\n// Handle asset deletion\nasync function deleteAsset(content: BaseData, preview: boolean): Promise<boolean> {\n return await revalidateDeletedAsset(content.sys.id, preview);\n}\n\n// Handle entry publishing\nasync function publishEntry(content: BaseData, preview: boolean): Promise<boolean> {\n const contentType = content.sys.contentType.sys.id;\n const handler = contentTypeHandlers[contentType];\n if (!handler) {\n console.warn(`Unknown content type: ${contentType}`);\n return false;\n }\n return await revalidateEntry(handler, content, contentType, preview);\n}\n\n// Handle entry deletion\nasync function deleteEntry(content: BaseData, preview: boolean): Promise<boolean> {\n console.log(`Delete entry: ${content.sys.id}`);\n const contentType = content.sys.contentType.sys.id;\n const success = await revalidateDeletedEntry(contentType, preview);\n // Note: Search rebuild logic would go here if needed\n return success;\n}\n\n// Revalidate all tags (for global revalidation)\nasync function revalidateAll(preview: boolean): Promise<boolean> {\n console.log('Revalidating all tags');\n await delay(500);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, 'global revalidation');\n } else {\n for (const tag of AllTags) {\n await revalidateSingleTag(tag, 'global revalidation');\n }\n }\n\n // Note: Search rebuild logic would go here if needed\n return true;\n}\n\n// Utility delay function\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Main revalidation handler function\nexport async function handleRevalidation(\n request: Request,\n preview: boolean = false,\n): Promise<NextResponse> {\n try {\n // Check for global revalidation header\n const all = request.headers.get('REVALIDATE_ALL');\n const single = request.headers.get('REVALIDATION_TAG');\n\n if (all) {\n const success = await revalidateAll(preview);\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n if (single) {\n const success = await revalidateSingleTag(single, 'single tag revalidation');\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n // Parse webhook payload\n const content = (await request.json()) as BaseData;\n\n let success = false;\n switch (content.sys.type) {\n case 'DeletedAsset':\n success = await deleteAsset(content, preview);\n break;\n case 'DeletedEntry':\n success = await deleteEntry(content, preview);\n break;\n case 'Asset':\n success = await publishAsset(content as AssetData, preview);\n break;\n case 'Entry':\n success = await publishEntry(content, preview);\n break;\n default:\n console.warn(`Unknown message type: ${content.sys.type}`);\n return NextResponse.json({ message: 'Unknown message type' }, { status: 400 });\n }\n\n if (!success) {\n return NextResponse.json({ message: 'Unknown content type' }, { status: 400 });\n }\n\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n } catch (error) {\n console.error('Error in revalidation:', error);\n // Send a 200 back as Contentful retries a few times!\n return NextResponse.json({ message: 'Error in revalidation' }, { status: 500 });\n }\n}\n","import { type NextRequest, NextResponse } from 'next/server';\nimport { handleRevalidation } from './route';\n\n/**\n * Configuration for the revalidation route\n */\nexport interface RevalidationConfig {\n /** Secret for validating webhook requests */\n secret?: string;\n /** Whether to validate the secret */\n validateSecret?: boolean;\n /** Whether to run in preview mode */\n preview?: boolean;\n}\n\n/**\n * Create a Next.js API route handler for Contentful revalidation\n *\n * @param config - Configuration options\n * @returns Next.js POST handler function\n *\n * @example\n * ```ts\n * // In your app/api/revalidate/route.ts\n * import { createRevalidationHandler } from '@se-studio/contentful-rest-api';\n *\n * export const POST = createRevalidationHandler({\n * secret: process.env.REVALIDATION_SECRET,\n * validateSecret: true,\n * });\n * ```\n */\nexport function createRevalidationHandler(\n config: RevalidationConfig = {},\n): (request: NextRequest) => Promise<NextResponse> {\n return async function POST(request: NextRequest) {\n const { secret, validateSecret = true, preview = false } = config;\n\n // Validate secret if required\n if (validateSecret && secret) {\n const requestSecret = request.headers.get('REVALIDATION_SECRET');\n if (requestSecret !== secret) {\n return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });\n }\n }\n\n // Handle the revalidation\n return await handleRevalidation(request, preview);\n };\n}\n","// Revalidation utilities exports\n\nexport * from './handlers';\nexport * from './nextjs-route';\nexport * from './route';\nexport * from './tags';\nexport * from './utils';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/revalidation/tags.ts","../src/revalidation/utils.ts","../src/utils/errors.ts","../src/client.ts","../src/converters/helpers.ts","../src/converters/asset.ts","../src/api/helpers.ts","../src/utils/arrayUtils.ts","../src/utils/dateUtils.ts","../src/utils/retry.ts","../src/api/article.ts","../src/api/article-type.ts","../src/converters/resolver.ts","../src/converters/navigationItem.ts","../src/converters/template.ts","../src/converters/article.ts","../src/converters/collection.ts","../src/converters/component.ts","../src/converters/customType.ts","../src/converters/link.ts","../src/converters/page.ts","../src/converters/person.ts","../src/converters/tag.ts","../src/api/context.ts","../src/api/custom-type.ts","../src/api/links.ts","../src/api/page.ts","../src/api/related-articles.ts","../src/api/sitemap.ts","../src/api/tag.ts","../src/api/template.ts","../src/revalidation/handlers.ts","../src/revalidation/route.ts","../src/revalidation/nextjs-route.ts","../src/revalidation/index.ts"],"names":["result","delay","getCacheTagsForProduction","success","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cache tag constants and utilities for Contentful revalidation\n */\n\n// Collection-level cache tags (used for sitemaps and lists)\nexport const PageTag = 'page';\nexport const ArticleTag = 'article';\nexport const ArticleTypeTag = 'articleType';\nexport const ArticleTypeIndexTag = 'articleTypeIndex';\nexport const CustomTypeTag = 'customType';\nexport const TagTag = 'tag';\nexport const PersonTag = 'person';\nexport const AssetTag = 'asset';\nexport const TemplateTag = 'template';\nexport const NavigationTag = 'navigation';\nexport const BannerTag = 'banner';\nexport const LocationTag = 'location';\n\n// Draft mode tag - used when DRAFT_ONLY=true\nexport const GlobalTag = 'global';\n\n/**\n * Individual page cache tag generator\n * @param slug - Page slug\n * @returns Cache tag for the page\n */\nexport function pageTag(slug: string): string {\n return `${PageTag}#${slug}`;\n}\n\n/**\n * Individual article cache tag generator\n * @param slug - Article slug\n * @returns Cache tag for the article\n */\nexport function articleTag(slug: string): string {\n return `${ArticleTag}#${slug}`;\n}\n\n/**\n * Individual article type cache tag generator\n * @param slug - Article type slug\n * @returns Cache tag for the article type\n */\nexport function articleTypeTag(slug: string): string {\n return `${ArticleTypeTag}#${slug}`;\n}\n\n/**\n * Individual article type index page cache tag generator\n * @param slug - Article type index page slug\n * @returns Cache tag for the article type index page\n */\nexport function articleTypeIndexTag(slug: string): string {\n return `${ArticleTypeTag}#index#${slug}`;\n}\n\n/**\n * Individual custom type cache tag generator\n * @param slug - Custom type slug\n * @returns Cache tag for the custom type\n */\nexport function customTypeTag(slug: string): string {\n return `${CustomTypeTag}#${slug}`;\n}\n\n/**\n * Individual tag cache tag generator\n * @param slug - Tag slug\n * @returns Cache tag for the tag\n */\nexport function tagTag(slug: string): string {\n return `${TagTag}#${slug}`;\n}\n\n/**\n * Individual person cache tag generator\n * @param slug - Person slug\n * @returns Cache tag for the person\n */\nexport function personTag(slug: string): string {\n return `${PersonTag}#${slug}`;\n}\n\n/**\n * Individual asset cache tag generator\n * @param assetId - Asset ID\n * @returns Cache tag for the asset\n */\nexport function assetTag(assetId: string): string {\n return `${AssetTag}#${assetId}`;\n}\n\n/**\n * Individual template cache tag generator\n * @param label - Template cmsLabel\n * @returns Cache tag for the template\n */\nexport function templateTag(label: string): string {\n return `${TemplateTag}#${label}`;\n}\n\n/**\n * Individual location cache tag generator\n * @param slug - Location slug\n * @returns Cache tag for the location\n */\nexport function locationTag(slug: string): string {\n return `${LocationTag}#${slug}`;\n}\n\n/**\n * All collection-level cache tags for global revalidation\n */\nexport const AllTags = [\n PageTag,\n ArticleTag,\n ArticleTypeTag,\n ArticleTypeIndexTag,\n CustomTypeTag,\n TagTag,\n PersonTag,\n AssetTag,\n TemplateTag,\n NavigationTag,\n BannerTag,\n LocationTag,\n 'hubspot-forms', // Additional tag from the old implementation\n];\n","import { revalidateTag } from 'next/cache';\nimport {\n ArticleTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeTag,\n assetTag,\n CustomTypeTag,\n customTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n tagTag,\n} from './tags';\n\n/**\n * Get cache tags for preview mode\n * @returns Array containing only the global tag\n */\nexport function getCacheTagsForPreview(): string[] {\n return [GlobalTag];\n}\n\n/**\n * Get cache tags for production mode based on content type and slug\n * @param contentType - The content type ('page', 'article', 'articleType', etc.)\n * @param slug - The slug/identifier for the content\n * @returns Array of cache tags including individual and collection tags\n */\nexport function getCacheTagsForProduction(contentType: string, slug?: string): string[] {\n switch (contentType) {\n case 'page':\n return slug ? [pageTag(slug), PageTag] : [PageTag];\n case 'article':\n return slug ? [articleTag(slug), ArticleTag] : [ArticleTag];\n case 'articleType':\n return slug ? [articleTypeTag(slug), ArticleTypeTag] : [ArticleTypeTag];\n case 'customType':\n return slug ? [customTypeTag(slug), CustomTypeTag] : [CustomTypeTag];\n case 'tag':\n return slug ? [tagTag(slug), TagTag] : [TagTag];\n case 'person':\n return slug ? [personTag(slug), PersonTag] : [PersonTag];\n case 'asset':\n return slug ? [assetTag(slug), AssetTag] : [AssetTag];\n case 'location':\n return slug ? [locationTag(slug), LocationTag] : [LocationTag];\n default:\n // For content types without individual tags, just return the collection tag\n return [contentType];\n }\n}\n\n/**\n * Get cache tags based on preview mode\n * @param contentType - The content type\n * @param slug - The slug/identifier for the content\n * @param preview - Whether to use preview mode\n * @returns Array of cache tags appropriate for the mode\n */\nexport function getCacheTags(\n contentType: string,\n slug?: string,\n preview: boolean = false,\n): string[] {\n if (preview) {\n return getCacheTagsForPreview();\n }\n return getCacheTagsForProduction(contentType, slug);\n}\n\n/**\n * Revalidates multiple Next.js cache tags.\n *\n * Adds a delay between revalidations to prevent overwhelming the cache system.\n * Use this when content changes affect multiple pages or entries.\n *\n * @param tags - Array of cache tags to revalidate\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateTags, pageTag, PageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page and all pages\n * await revalidateTags([pageTag('home'), PageTag], 'Page updated via webhook');\n * ```\n */\nexport async function revalidateTags(tags: string[], reason: string): Promise<void> {\n // Add a delay to prevent overwhelming the cache system\n await delay(500);\n\n for (const tag of tags) {\n console.log(`Revalidating tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n }\n}\n\n/**\n * Revalidates a single Next.js cache tag.\n *\n * Adds a delay before revalidation to prevent overwhelming the cache system.\n * Use this for targeted revalidation of specific content.\n *\n * @param tag - Cache tag to revalidate (e.g., 'page#home', 'article#my-post')\n * @param reason - Reason for revalidation (for logging/debugging)\n *\n * @example\n * ```ts\n * import { revalidateSingleTag, pageTag } from '@se-studio/contentful-rest-api';\n *\n * // Revalidate a specific page\n * await revalidateSingleTag(pageTag('home'), 'Home page updated');\n * ```\n */\nexport async function revalidateSingleTag(tag: string, reason: string): Promise<void> {\n await delay(500);\n console.log(`Revalidating single tag: ${tag} - ${reason}`);\n revalidateTag(tag);\n}\n\n/**\n * Utility delay function\n * @param ms - Milliseconds to delay\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Custom error classes for Contentful API errors\n */\n\n/**\n * Base error class for all Contentful-related errors\n */\nexport class ContentfulError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ContentfulError';\n Object.setPrototypeOf(this, ContentfulError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitError extends ContentfulError {\n constructor(\n message: string,\n public readonly retryAfter?: number,\n details?: unknown,\n ) {\n super(message, 429, details);\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when entry is not found\n */\nexport class EntryNotFoundError extends ContentfulError {\n constructor(\n public readonly entryId: string,\n public readonly contentType?: string,\n ) {\n super(`Entry not found: ${entryId}${contentType ? ` (${contentType})` : ''}`, 404);\n this.name = 'EntryNotFoundError';\n Object.setPrototypeOf(this, EntryNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthenticationError extends ContentfulError {\n constructor(message = 'Authentication failed') {\n super(message, 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends ContentfulError {\n constructor(\n message: string,\n public readonly validationErrors?: unknown,\n ) {\n super(message, 400, validationErrors);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Checks if an error is a Contentful error\n */\nexport function isContentfulError(error: unknown): error is ContentfulError {\n return error instanceof ContentfulError;\n}\n\n/**\n * Checks if an error is a rate limit error\n */\nexport function isRateLimitError(error: unknown): error is RateLimitError {\n return error instanceof RateLimitError;\n}\n\n/**\n * Checks if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (isRateLimitError(error)) {\n return true;\n }\n\n if (isContentfulError(error)) {\n // Retry on 5xx errors and rate limits\n return error.statusCode !== undefined && (error.statusCode >= 500 || error.statusCode === 429);\n }\n\n return false;\n}\n\n/**\n * Extracts retry-after header value from error\n */\nexport function getRetryAfter(error: unknown): number | undefined {\n if (isRateLimitError(error)) {\n return error.retryAfter;\n }\n return undefined;\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: Any ok for now! */\nimport type { ContentfulConfig, FetchOptions } from './types';\nimport {\n AuthenticationError,\n ContentfulError,\n EntryNotFoundError,\n RateLimitError,\n ValidationError,\n} from './utils/errors';\n\n/**\n * Contentful REST API response structure\n * The items array contains Entry objects when T is an EntrySkeletonType\n */\nexport interface ContentfulResponse<T = any> {\n sys: {\n type: 'Array';\n };\n total: number;\n skip: number;\n limit: number;\n items: T extends import('contentful').EntrySkeletonType\n ? Array<import('contentful').Entry<T, 'WITHOUT_LINK_RESOLUTION', string>>\n : T[];\n includes?: {\n Entry?: any[];\n Asset?: any[];\n };\n}\n\n/**\n * Query parameters for Contentful API\n */\nexport interface ContentfulQuery {\n content_type?: string;\n locale?: string;\n include?: number;\n limit?: number;\n skip?: number;\n [key: string]: any;\n}\n\n/**\n * Builds query string from query parameters\n */\nfunction buildQueryString(query: ContentfulQuery): string {\n const params = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, String(value));\n }\n });\n\n return params.toString();\n}\n\n/**\n * Parses error response from Contentful API\n */\nasync function parseErrorResponse(response: Response): Promise<ContentfulError> {\n const statusCode = response.status;\n let errorData: any;\n\n try {\n errorData = await response.json();\n } catch {\n errorData = { message: response.statusText };\n }\n\n const message = errorData?.message || `Contentful API error: ${statusCode}`;\n\n switch (statusCode) {\n case 401:\n return new AuthenticationError(message);\n\n case 404:\n return new EntryNotFoundError(\n errorData?.sys?.id || 'unknown',\n errorData?.sys?.contentType?.sys?.id,\n );\n\n case 429: {\n // Parse retry-after header (in seconds)\n const retryAfterHeader =\n response.headers.get('X-Contentful-RateLimit-Reset') || response.headers.get('Retry-After');\n const retryAfter = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : undefined;\n return new RateLimitError(message, retryAfter, errorData);\n }\n\n case 400:\n return new ValidationError(message, errorData);\n\n default:\n return new ContentfulError(message, statusCode, errorData);\n }\n}\n\ntype NextRequestInit = RequestInit & {\n next?: {\n revalidate?: number | false;\n tags?: string[];\n };\n};\n\n/**\n * Fetch-based Contentful client that participates in Next.js caching\n */\nexport class ContentfulFetchClient {\n private readonly baseUrl: string;\n private readonly accessToken: string;\n\n constructor(config: ContentfulConfig, preview = false) {\n const host = config.host || (preview ? 'preview.contentful.com' : 'cdn.contentful.com');\n const environment = config.environment || 'master';\n\n this.baseUrl = `https://${host}/spaces/${config.spaceId}/environments/${environment}`;\n this.accessToken = config.accessToken;\n }\n\n /**\n * Fetches entries from Contentful\n */\n async getEntries<T = any>(\n query: ContentfulQuery,\n options?: FetchOptions,\n ): Promise<ContentfulResponse<T>> {\n const queryString = buildQueryString(query);\n const url = `${this.baseUrl}/entries?${queryString}`;\n\n const fetchOptions: NextRequestInit = {\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n };\n\n // Add Next.js cache configuration if provided\n if (options?.next) {\n fetchOptions.next = options.next;\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return response.json() as Promise<ContentfulResponse<T>>;\n }\n}\n\n/**\n * Creates a Contentful Content Delivery API (CDA) client\n *\n * @param config - Configuration object for the Contentful client\n * @returns Contentful CDA client instance\n *\n * @example\n * ```ts\n * const client = createContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, false);\n}\n\n/**\n * Creates a Contentful Content Preview API (CPA) client\n *\n * @param config - Configuration object for the Contentful preview client\n * @returns Contentful CPA client instance\n *\n * @example\n * ```ts\n * const previewClient = createContentfulPreviewClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!,\n * environment: 'master'\n * });\n * ```\n */\nexport function createContentfulPreviewClient(config: ContentfulConfig): ContentfulFetchClient {\n return new ContentfulFetchClient(config, true);\n}\n\n/**\n * Gets the appropriate Contentful client based on preview mode\n *\n * @param config - Configuration for the Contentful client\n * @param preview - Whether to use the preview API\n * @returns Contentful client instance (CDA or CPA)\n *\n * @example\n * ```ts\n * const client = getContentfulClient({\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: preview\n * ? process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN!\n * : process.env.CONTENTFUL_ACCESS_TOKEN!,\n * }, preview);\n * ```\n */\nexport function getContentfulClient(\n config: ContentfulConfig,\n preview = false,\n): ContentfulFetchClient {\n return preview ? createContentfulPreviewClient(config) : createContentfulClient(config);\n}\n","import type { IInternalLink, InternalType, IVisual } from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier, PossibleResolvedEntry } from '../api';\nimport type { BaseContent, BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport type { baseArticleConverter, baseArticleTypeConverter } from './article';\nimport type { baseCollectionConverter } from './collection';\nimport type { baseComponentConverter } from './component';\nimport type { baseCustomTypeConverter } from './customType';\nimport type { baseNavigationItemConverter } from './navigationItem';\nimport type { basePageConverter } from './page';\nimport type { baseTagConverter } from './tag';\n\nexport function resolveBuildYear(value: string) {\n const buildYear = new Date().getFullYear();\n return value.replaceAll('#buildYear#', buildYear.toString());\n}\nexport function makeContentfulTitle(\n title: string | undefined | null,\n id: string,\n prefix = 'Title for ',\n) {\n return title ?? `${prefix}${id}`;\n}\n\nexport function stringOrUndefined(value: string | null | undefined) {\n if (value && value.length > 0) {\n return value;\n }\n return undefined;\n}\nexport function makeContentfulDescription(description: string | undefined | null, id: string) {\n return description ?? `Description for ${id}`;\n}\n\nexport function lookupAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined) {\n if (!asset) return undefined;\n return context.assets.get(asset.sys.id);\n}\n\n/**\n * Default positioning fields for content items before they are processed\n */\nexport const DEFAULT_POSITION_FIELDS = {\n index: 0,\n isFirst: false,\n isLast: false,\n indexOfType: 0,\n} as const;\n\n/**\n * Creates an internal link object with common fields\n * Used by multiple converters (tag, page, article, person) to reduce duplication\n */\nexport function createInternalLink(\n id: string,\n fields: {\n cmsLabel?: string | null;\n title?: string | null;\n featuredImage?: UnresolvedLink<'Asset'>;\n backgroundColour?: string | null;\n textColour?: string | null;\n indexed?: boolean | null;\n hidden?: boolean | null;\n slug: string;\n description?: string | null;\n },\n context: ConverterContext,\n href: string,\n internalType: InternalType,\n // biome-ignore lint/suspicious/noExplicitAny: Used for expanding\n additionalProps?: any,\n): IInternalLink {\n const {\n cmsLabel,\n title,\n featuredImage,\n backgroundColour,\n textColour,\n indexed,\n hidden,\n slug,\n description,\n } = fields;\n\n const text = makeContentfulTitle(title, id);\n return {\n type: 'Internal link',\n internalType,\n id,\n name: cmsLabel ?? '',\n useName: true,\n text,\n visual: lookupAsset(context, featuredImage),\n backgroundColour,\n textColour,\n indexed,\n hidden,\n slug,\n href,\n title,\n description,\n ...additionalProps,\n };\n}\n\nexport type ContentResolverFunction = (\n context: ConverterContext,\n entry: Entry<BaseContent, DefaultChainModifier, string>,\n) => unknown; // PageContent\nexport type ContentResolverMap = Map<string, ContentResolverFunction>;\nexport type LinkResolverFunction<TResult extends IInternalLink = IInternalLink> = (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n) => TResult;\nexport type LinkResolverMap = Map<string, LinkResolverFunction>;\n\nexport type BaseConverterContext = {\n videoPrefix: string;\n linkResolver: LinkResolverMap;\n contentResolver: Map<\n string,\n (context: ConverterContext, entry: Entry<BaseContent, DefaultChainModifier, string>) => unknown\n >;\n navigationItemResolver: typeof baseNavigationItemConverter;\n pageResolver: typeof basePageConverter;\n articleResolver: typeof baseArticleConverter;\n articleTypeResolver: typeof baseArticleTypeConverter;\n tagResolver: typeof baseTagConverter;\n customTypeResolver: typeof baseCustomTypeConverter;\n componentResolver: typeof baseComponentConverter;\n collectionResolver: typeof baseCollectionConverter;\n};\n\nexport type ConverterContext = BaseConverterContext & {\n includes: Map<string, PossibleResolvedEntry>;\n assets: Map<string, IVisual>;\n errors: CmsError[];\n};\n\n/**\n * Adds position metadata to an array of content items\n * Each item gets: index, isFirst, isLast, indexOfType\n *\n * @param items - Array of content items to add metadata to\n * @returns New array with position metadata added to each item\n */\nexport function addPositionMetadata<\n T extends {\n type: string;\n index?: number;\n isFirst?: boolean;\n isLast?: boolean;\n indexOfType?: number;\n },\n>(items: T[]): T[] {\n if (items.length === 0) return items;\n\n // Count items by type for indexOfType calculation\n const typeCount = new Map<string, number>();\n\n return items.map((item, index) => {\n const currentTypeIndex = typeCount.get(item.type) ?? 0;\n typeCount.set(item.type, currentTypeIndex + 1);\n\n return {\n ...item,\n index,\n isFirst: index === 0,\n isLast: index === items.length - 1,\n indexOfType: currentTypeIndex,\n };\n });\n}\n","import type {\n IAnimation,\n IImage,\n IPicture,\n IResponsiveVisual,\n ISvgImage,\n IVideo,\n IVideoDetails,\n IVisual,\n} from '@se-studio/core-data-types';\nimport type { Asset, AssetFields, AssetFile, AssetSys, Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseConverterContext, ConverterContext } from './helpers';\nimport {\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n stringOrUndefined,\n} from './helpers';\n\nexport function convertAssetToVisual(\n context: BaseConverterContext,\n asset?: Asset<DefaultChainModifier, string>,\n options?: Partial<IImage> | Partial<IVideo> | Partial<IAnimation>,\n): IVisual | undefined {\n if (!asset) return undefined;\n const { fields, sys } = asset;\n if (!fields) return undefined;\n const { id } = sys;\n const { file } = fields as AssetFields;\n if (!file) return undefined;\n const { contentType } = file;\n\n if (contentType?.startsWith('image/')) {\n const image = convertAssetToImage(file, fields as AssetFields, sys, options as Partial<IImage>);\n return {\n id,\n type: 'Visual',\n image,\n };\n }\n\n if (contentType?.startsWith('video/')) {\n const video = convertAssetToVideo(\n file,\n fields as AssetFields,\n sys,\n context,\n options as Partial<IVideo>,\n );\n return {\n id,\n type: 'Visual',\n video,\n };\n }\n\n if (contentType === 'application/json') {\n const animation = convertAssetToAnimation(\n file,\n fields as AssetFields,\n sys,\n options as Partial<IAnimation>,\n );\n return {\n id,\n type: 'Visual',\n animation,\n };\n }\n return undefined;\n}\n\nfunction convertAssetToAnimation(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IAnimation, 'id' | 'type'>>,\n): IAnimation {\n const { id } = sys;\n const { title, description } = fields;\n const { url } = file;\n\n return {\n ...options,\n id,\n type: 'Animation',\n animationSrc: `https:${url}`,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IImage {\n const { contentType } = file;\n if (contentType === 'image/svg+xml') {\n return convertAssetToSvgImage(file, fields, sys, options);\n } else {\n return convertAssetToPicture(file, fields, sys, options);\n }\n}\n\nfunction convertAssetToPicture(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): IPicture {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Picture',\n src: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nfunction convertAssetToSvgImage(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n options: Partial<Omit<IImage, 'id' | 'type'>>,\n): ISvgImage {\n const { id } = sys;\n const { title, description } = fields;\n const { contentType, details, url } = file;\n const { size, image } = details;\n const { width, height } = image || {};\n\n return {\n ...options,\n id,\n type: 'Svg image',\n svgSrc: `https:${url}`,\n mimeType: contentType,\n size,\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: stringOrUndefined(description),\n };\n}\n\nfunction convertAssetToVideoDetails(file: AssetFile, sys: AssetSys): IVideoDetails {\n const { id } = sys;\n const { details, url, contentType, fileName } = file;\n const { size } = details;\n return {\n id,\n videoUrl: `https:${url}`,\n size,\n mimeType: contentType,\n fileName,\n };\n}\n\nfunction convertAssetToVideo(\n file: AssetFile,\n fields: AssetFields,\n sys: AssetSys,\n context: BaseConverterContext,\n options: Partial<Omit<IVideo, 'id' | 'type'>>,\n): IVideo {\n const { id } = sys;\n const { title, description } = fields;\n const { details } = file;\n const { image } = details;\n const { width, height } = image || {};\n\n const videoDetails = convertAssetToVideoDetails(file, sys);\n\n return {\n ...options,\n id,\n type: 'Local video',\n preview: videoDetails,\n videoPrefix: context.videoPrefix,\n\n width: width || 0,\n height: height || 0,\n name: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n };\n}\n\nexport function createResponsiveVisual(\n visual: IVisual | undefined,\n mobileVisual: IVisual | undefined,\n customSize?: number | null,\n): IResponsiveVisual | undefined {\n if (!visual) return undefined;\n return {\n visual,\n mobileVisual,\n visualCustomSize: customSize,\n };\n}\n\n/**\n * Converts a baseMedia entry to IVisual by looking up the asset and merging metadata\n */\nexport function convertMediaEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields) return undefined;\n\n // Lookup the asset from context\n const baseVisual = lookupAsset(context, fields.asset);\n if (!baseVisual) return undefined;\n\n const { name, ...otherFields } = fields;\n\n // Extract metadata from the media entry\n const metadata = {\n name: makeContentfulTitle(name, sys.id),\n ...otherFields,\n };\n\n // Merge metadata into the image or video\n const visual: IVisual = {\n ...baseVisual,\n id: sys.id,\n };\n\n if (baseVisual.image) {\n visual.image = {\n ...baseVisual.image,\n ...metadata,\n };\n } else if (baseVisual.video) {\n visual.video = {\n ...baseVisual.video,\n ...metadata,\n };\n } else if (baseVisual.animation) {\n visual.animation = {\n ...baseVisual.animation,\n ...metadata,\n };\n }\n\n return visual;\n}\n\n/**\n * Converts a baseExternalVideo entry to IVisual with external video\n */\nexport function convertExternalVideoEntryToVisual(\n context: ConverterContext,\n entry: Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n): IVisual | undefined {\n const { fields, sys } = entry;\n if (!fields || !fields.url) return undefined;\n\n // Lookup optional preview and poster assets\n const previewVisual = lookupAsset(context, fields.preview);\n const posterVisual = lookupAsset(context, fields.posterImage);\n\n // Extract preview IVideoDetails if available\n const preview =\n previewVisual?.video?.type === 'Local video' ? previewVisual.video.preview : undefined;\n\n // Extract poster URL if available\n const poster = posterVisual?.image?.type === 'Picture' ? posterVisual.image.src : undefined;\n\n // Map Contentful's \"Center\" to our \"Middle\" type\n const mapHorizontal = (\n value: 'Left' | 'Center' | 'Right' | undefined,\n ): 'Left' | 'Middle' | 'Right' | null => {\n if (!value) return null;\n return value === 'Center' ? 'Middle' : value;\n };\n\n const video: IVideo = {\n id: sys.id,\n type: 'External video',\n name: makeContentfulTitle(fields.name, sys.id),\n nameAsCaption: fields.nameAsCaption ?? null,\n external: fields.url,\n preview,\n poster,\n autoPlay: fields.autoPlay ?? null,\n loop: fields.loop ?? null,\n hideControls: fields.hideControls ?? null,\n dontCrop: fields.dontCrop ?? null,\n verticalCropPosition: fields.verticalCropPosition ?? null,\n horizontalCropPosition: mapHorizontal(fields.horizontalCropPosition),\n horizontalPosition: fields.horizontalPosition ?? null,\n widthPercent: fields.width ?? null,\n };\n\n return {\n id: sys.id,\n type: 'Visual',\n video,\n };\n}\n\n/**\n * Looks up and converts a media or external video entry from an unresolved link\n */\nexport function lookupMediaEntry(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'> | undefined,\n): IVisual | undefined {\n if (!link) return undefined;\n\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n return undefined;\n }\n\n const { type, entry } = possibleEntry;\n\n if (type === 'media') {\n return convertMediaEntryToVisual(\n context,\n entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n }\n\n if (type === 'externalVideo') {\n return convertExternalVideoEntryToVisual(\n context,\n entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n }\n\n return undefined;\n}\n","import type { IArticleLink, IInternalLink, IVisual } from '@se-studio/core-data-types';\nimport type { Entry, EntrySkeletonType } from 'contentful';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport { type ContentfulResponse, getContentfulClient } from '../client';\nimport { convertAssetToVisual } from '../converters/asset';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport type { DefaultChainModifier, PossibleResolvedEntry, SingleEntityFetchConfig } from './types';\n\n// ============================================================================\n// Field Selection Constants\n// ============================================================================\n\n/**\n * Field selection constants for link-only fetching.\n * These reduce payload size by excluding content arrays, navigation, templates, etc.\n */\nexport const PAGE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags';\n\nexport const ARTICLE_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.title,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden,fields.tags,fields.articleType,fields.date,fields.author';\n\nexport const ARTICLE_TYPE_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nexport const TAG_LINK_FIELDS =\n 'sys,fields.cmsLabel,fields.name,fields.slug,fields.featuredImage,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\nexport const PERSON_LINK_FIELDS =\n 'sys,fields.name,fields.slug,fields.media,fields.backgroundColour,fields.textColour,fields.indexed,fields.hidden';\n\n// ============================================================================\n// Asset and Include Conversion\n// ============================================================================\n\nexport function convertAllAssets(\n response: ContentfulResponse<unknown>,\n context: BaseConverterContext,\n): Map<string, IVisual> {\n const visuals = new Map<string, IVisual>();\n const assets = response.includes?.Asset;\n if (assets && assets.length > 0) {\n for (const asset of assets) {\n const visual = convertAssetToVisual(context, asset);\n if (visual) {\n visuals.set(visual.id, visual);\n }\n }\n }\n return visuals;\n}\n\nexport function convertAllIncludes(\n response: ContentfulResponse<unknown>,\n): Map<string, PossibleResolvedEntry> {\n const includes = new Map<string, PossibleResolvedEntry>();\n const entries = [...response.items, ...(response.includes?.Entry || [])];\n\n if (entries && entries.length > 0) {\n for (const entry of entries) {\n if (entry?.sys && entry.fields) {\n includes.set(entry.sys.id, {\n id: entry.sys.id,\n type: entry.sys.contentType.sys.id,\n entry,\n });\n }\n }\n }\n return includes;\n}\n\n// ============================================================================\n// Generic Single Entity Fetcher\n// ============================================================================\n\n/**\n * Generic helper for fetching a single entity from Contentful.\n * Handles caching, error handling, retry logic, and conversion consistently.\n *\n * @param context - Base converter context for content transformation\n * @param config - Contentful configuration (spaceId, accessToken, environment)\n * @param fetchConfig - Configuration for this specific fetch\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns Promise resolving to the entity or null if not found, with any conversion errors\n */\nexport async function fetchSingleEntity<TEntry extends EntrySkeletonType, TResult>(\n context: BaseConverterContext,\n config: ContentfulConfig,\n fetchConfig: SingleEntityFetchConfig<TEntry, TResult>,\n options?: FetchOptions,\n): Promise<CmsResponse<TResult | null>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request\n const cacheTags = getCacheTags(\n fetchConfig.cacheTagType,\n fetchConfig.cacheTagIdentifier,\n options?.preview,\n );\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = async () => {\n const response = await client.getEntries<TEntry>(\n {\n content_type: fetchConfig.contentType,\n ...fetchConfig.query,\n include: 10,\n locale: options?.locale,\n limit: 1,\n },\n requestOptions,\n );\n\n const entry = response.items[0] as Entry<TEntry, DefaultChainModifier, string> | undefined;\n if (!entry || !entry.fields) {\n return { data: null, errors: [] };\n }\n\n try {\n const assets = convertAllAssets(response, context);\n const includes = convertAllIncludes(response);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n const converted = fetchConfig.resolver(fullContext, entry);\n\n // Log errors in production\n if (\n fullContext.errors.length > 0 &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n console.error(`CMS conversion errors for ${fetchConfig.contentType}:`, {\n entryId: entry.sys.id,\n ...fetchConfig.errorLogContext,\n errors: fullContext.errors,\n });\n }\n\n return { data: converted, errors: fullContext.errors };\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage = error instanceof Error ? error.message : 'Unknown conversion error';\n\n const cmsError: CmsError = {\n entryId,\n entryType,\n message: errorMessage,\n error,\n };\n\n return { data: null, errors: [cmsError] };\n }\n };\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n// ============================================================================\n// Generic All Links Fetcher\n// ============================================================================\n\n/**\n * Shared helper function for paginated Contentful link fetching.\n * Returns links with lastModified metadata from sys.updatedAt.\n */\nexport async function fetchAllLinks<\n TEntry extends EntrySkeletonType =\n | BasePageSkeleton\n | BaseArticleSkeleton\n | BaseArticleTypeSkeleton\n | BaseTagSkeleton\n | BasePersonSkeleton,\n TResult extends IInternalLink | IArticleLink = IInternalLink,\n>(\n contentType: string,\n client: ReturnType<typeof getContentfulClient>,\n requestOptions: FetchOptions | undefined,\n converter: (\n context: ConverterContext,\n entry: Entry<TEntry, DefaultChainModifier, string>,\n ) => TResult,\n context: BaseConverterContext,\n pageSize: number = 100,\n select?: string,\n): Promise<CmsResponse<TResult[]>> {\n const allLinks: TResult[] = [];\n const errors: CmsError[] = [];\n let skip = 0;\n let hasMore = true;\n\n const fetchFn = async () => {\n while (hasMore) {\n try {\n const response = await client.getEntries<TEntry>(\n {\n content_type: contentType,\n include: 2, // Minimal include for link-only fetching\n locale: requestOptions?.locale,\n limit: pageSize,\n skip,\n ...(select && { select }),\n },\n requestOptions,\n );\n\n if (response.items.length === 0) {\n hasMore = false;\n break;\n }\n\n // Convert entries to links\n const includes = convertAllIncludes(response);\n const assets = convertAllAssets(response, context);\n const fullContext: ConverterContext = {\n ...context,\n includes,\n assets,\n errors: [],\n };\n\n for (const entry of response.items) {\n if (!entry.fields) continue;\n try {\n const converted = converter(\n fullContext,\n entry as Entry<TEntry, DefaultChainModifier, string>,\n );\n // Add lastModified from sys.updatedAt\n converted.lastModified = entry.sys.updatedAt\n ? new Date(entry.sys.updatedAt)\n : undefined;\n allLinks.push(converted);\n } catch (error) {\n const entryId = entry.sys.id;\n const entryType = entry.sys.contentType?.sys?.id;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown conversion error';\n\n errors.push({\n entryId,\n entryType,\n message: errorMessage,\n error,\n });\n }\n }\n\n skip += pageSize;\n\n // Check if we've fetched all items\n if (skip >= response.total) {\n hasMore = false;\n }\n } catch (error) {\n console.error('Error fetching links', typeof error, error, JSON.stringify(error, null, 2));\n throw error;\n }\n }\n\n return { data: allLinks, errors };\n };\n\n return await fetchFn();\n}\n","export function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {\n if (value === null || value === undefined) return false;\n return true;\n}\n\nexport function arrayOrUndefined<T>(array?: ReadonlyArray<T>) {\n if (array && array.length > 0) {\n return array;\n }\n return undefined;\n}\n","/**\n * Validates if a value can be converted to a valid Date object\n */\nexport function isValidDate(date: unknown): boolean {\n if (date instanceof Date) {\n return !Number.isNaN(date.getTime());\n }\n\n if (typeof date === 'string' || typeof date === 'number') {\n const parsed = new Date(date);\n return !Number.isNaN(parsed.getTime()) && parsed.getTime() > 0;\n }\n\n return false;\n}\n\n/**\n * Safely creates a Date object, returning null if invalid\n */\nexport function safeDate(date: unknown): Date | null {\n if (!isValidDate(date)) {\n return null;\n }\n\n if (date instanceof Date) {\n return date;\n }\n\n return new Date(date as string | number);\n}\n","import type { RetryConfig } from '../types';\nimport { getRetryAfter, isRetryableError } from './errors';\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 30000, // 30 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Sleep utility for async delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Calculates the delay for the next retry attempt using exponential backoff\n *\n * @param attempt - Current retry attempt (0-based)\n * @param config - Retry configuration\n * @param retryAfter - Optional retry-after value from rate limit response\n * @returns Delay in milliseconds\n */\nexport function calculateBackoffDelay(\n attempt: number,\n config: Required<RetryConfig>,\n retryAfter?: number,\n): number {\n // If server specified retry-after, use that\n if (retryAfter !== undefined) {\n const result = Math.min(retryAfter * 1000, config.maxDelay);\n console.log(\n `Calculated backoff delay: ${result}ms (attempt ${attempt + 1}), retryAfter: ${retryAfter}`,\n );\n return result;\n }\n\n // Calculate exponential backoff\n const exponentialDelay = config.initialDelay * config.backoffMultiplier ** attempt;\n\n // Add jitter (random value between 0 and delay) to prevent thundering herd\n const jitter = Math.random() * exponentialDelay;\n\n const result = Math.min(exponentialDelay + jitter, config.maxDelay);\n console.log(\n `Calculated backoff delay: ${result}ms (attempt ${attempt + 1}), exponentialDelay: ${exponentialDelay}, jitter: ${jitter}`,\n );\n return result;\n}\n\n/**\n * Executes a function with retry logic\n *\n * @param fn - Async function to execute\n * @param config - Retry configuration\n * @returns Promise resolving to the function result\n *\n * @example\n * ```ts\n * const result = await withRetry(\n * async () => await client.getEntry('id'),\n * { maxRetries: 3, initialDelay: 1000 }\n * );\n * ```\n */\nexport async function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T> {\n const retryConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if it's the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Only retry if the error is retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n const retryAfter = getRetryAfter(error);\n const delay = calculateBackoffDelay(attempt, retryConfig, retryAfter);\n\n // Only log in development mode\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production') {\n console.warn(\n `Retry attempt ${attempt + 1}/${retryConfig.maxRetries} after ${delay}ms`,\n error,\n );\n }\n\n await sleep(delay);\n }\n }\n\n // If we get here, all retries failed\n throw lastError;\n}\n\n/**\n * Rate limiter using token bucket algorithm\n * Useful for controlling request rate to Contentful API\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number;\n\n constructor(\n private readonly maxTokens: number,\n private readonly refillRate: number, // tokens per second\n ) {\n this.tokens = maxTokens;\n this.lastRefill = Date.now();\n }\n\n /**\n * Refills tokens based on time elapsed\n */\n private refill(): void {\n const now = Date.now();\n const timePassed = (now - this.lastRefill) / 1000; // in seconds\n const tokensToAdd = timePassed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n this.lastRefill = now;\n }\n\n /**\n * Attempts to consume a token\n * @returns true if token was consumed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Waits until a token is available and consumes it\n */\n async consume(): Promise<void> {\n while (!this.tryConsume()) {\n // Wait for the time needed to get one token\n const waitTime = (1 / this.refillRate) * 1000;\n await sleep(waitTime);\n }\n }\n\n /**\n * Gets current number of available tokens\n */\n getAvailableTokens(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n}\n","import type { IBaseArticle } from '@se-studio/core-data-types';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches an article from Contentful by slug and article type slug.\n *\n * @param context - Base converter context for content transformation\n * @param config - Contentful configuration (spaceId, accessToken, environment)\n * @param slug - Article slug to fetch\n * @param articleTypeSlug - Article type slug (e.g., 'blog', 'news')\n * @param options - Optional fetch options (locale, preview, caching, retry)\n * @returns Promise resolving to article data or null if not found, with any conversion errors\n *\n * @example\n * ```ts\n * const article = await contentfulArticleRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'my-article',\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: { tags: ['article#my-article'], revalidate: 3600 }\n * }\n * );\n * ```\n */\nexport async function contentfulArticleRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n articleTypeSlug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseArticle | null>> {\n return fetchSingleEntity<BaseArticleSkeleton, IBaseArticle>(\n context,\n config,\n {\n contentType: 'article',\n cacheTagType: 'article',\n cacheTagIdentifier: slug,\n query: {\n 'fields.slug': slug,\n 'fields.articleType.sys.contentType.sys.id': 'articleType',\n 'fields.articleType.fields.slug': articleTypeSlug,\n },\n resolver: (ctx, entry) => ctx.articleResolver(ctx, entry),\n errorLogContext: { slug, articleTypeSlug },\n },\n options,\n );\n}\n","import type { IBaseArticleType } from '@se-studio/core-data-types';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches an article type from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param indexPageSlug - Article type slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseArticleType or null if not found\n *\n * @example\n * ```ts\n * const articleType = await contentfulArticleTypeRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'blog',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['blog-article-type'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulArticleTypeRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n indexPageSlug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseArticleType | null>> {\n return fetchSingleEntity<BaseArticleTypeSkeleton, IBaseArticleType>(\n context,\n config,\n {\n contentType: 'articleType',\n cacheTagType: 'articleType',\n cacheTagIdentifier: indexPageSlug,\n query: { 'fields.indexPageSlug': indexPageSlug },\n resolver: (ctx, entry) => ctx.articleTypeResolver(ctx, entry),\n errorLogContext: { indexPageSlug },\n },\n options,\n );\n}\n","import type { Block, Document, Inline, Text } from '@contentful/rich-text-types';\nimport type {\n BaseCollectionContent,\n IInternalLink,\n INavigationItem,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, EntrySkeletonType, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport type { BaseExternalVideoSkeleton } from '../baseTypes/baseExternalVideo';\nimport type { BaseMediaSkeleton } from '../baseTypes/baseMedia';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport type { BaseLink } from '../baseTypes/baseShared';\nimport type { CmsError } from '../types';\nimport { arrayOrUndefined } from '../utils';\nimport { convertExternalVideoEntryToVisual, convertMediaEntryToVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset } from './helpers';\n\nexport function resolveHelper<TEntrySkeletonType extends EntrySkeletonType, TResult>(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n getResolver: (\n type: string,\n ) =>\n | ((\n context: ConverterContext,\n entry: Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n ) => TResult)\n | undefined,\n): TResult {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n if (!possibleEntry) {\n throw new Error(`Cannot find included entry for link from ${fromId} with id ${id}`);\n }\n if (!possibleEntry.resolved) {\n const resolver = getResolver(possibleEntry.type);\n if (!resolver) {\n throw new Error(\n `No resolver found for link type ${possibleEntry.type} (${JSON.stringify(possibleEntry)}) [${JSON.stringify(entry)}]`,\n );\n }\n if (typeof resolver !== 'function') {\n console.log('Resolver type', possibleEntry.type, typeof resolver, resolver);\n }\n\n const resolved = resolver(\n context,\n possibleEntry.entry as Entry<TEntrySkeletonType, DefaultChainModifier, string>,\n );\n possibleEntry.resolved = resolved;\n return resolved;\n }\n return possibleEntry.resolved as TResult;\n}\n\nexport function resolveLink(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): IInternalLink {\n return resolveHelper<BaseLink, IInternalLink>(context, fromId, entry, (type) =>\n context.linkResolver.get(type),\n );\n}\n\nexport function resolveLinks(\n context: ConverterContext,\n fromId: string,\n entries: UnresolvedLink<'Entry'>[] | undefined,\n): readonly IInternalLink[] | undefined {\n return arrayOrUndefined(entries?.map((entry) => resolveLink(context, fromId, entry)));\n}\n\nexport function resolveContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped {\n return resolveHelper<BaseLink, ITyped>(context, fromId, entry, (type) => {\n const resolver = context.contentResolver.get(type);\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseLink, DefaultChainModifier, string>,\n ) => ITyped;\n });\n}\n\nexport function resolveNavigationItem(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): INavigationItem {\n const result = resolveHelper<BaseNavigationItemSkeleton, INavigationItem>(\n context,\n fromId,\n entry,\n () => context.navigationItemResolver,\n );\n return result;\n}\n\ntype BaseCollectionContentSkeleton = BaseComponentSkeleton | BaseCollectionSkeleton | BaseLink;\nexport function resolveCollectionContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): BaseCollectionContent {\n return resolveHelper<BaseCollectionContentSkeleton, BaseCollectionContent>(\n context,\n fromId,\n entry,\n (type) => {\n const resolver = context.contentResolver.get(type);\n if (resolver) {\n return resolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContentSkeleton, DefaultChainModifier, string>,\n ) => BaseCollectionContent;\n }\n const linkResolver = context.linkResolver.get(type);\n if (linkResolver) {\n return linkResolver as (\n context: ConverterContext,\n entry: Entry<BaseCollectionContentSkeleton, DefaultChainModifier, string>,\n ) => BaseCollectionContent;\n }\n return undefined;\n },\n );\n}\n\n/**\n * Resolves a PageContent entry from an unresolved link\n * PageContent can be: Component, Collection, ExternalComponent, Visual (media/externalVideo), or PersonLink\n */\nexport function resolvePageContent(\n context: ConverterContext,\n fromId: string,\n entry: UnresolvedLink<'Entry'>,\n): ITyped | null {\n const id = entry.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry) {\n const errorMessage = `Cannot find included entry for content from ${fromId} with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: 'unknown',\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n\n const { type } = possibleEntry;\n\n // Handle Media - convert to IVisual\n if (type === 'media') {\n try {\n const visual = convertMediaEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseMediaSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert media entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting media entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // Handle ExternalVideo - convert to IVisual\n if (type === 'externalVideo') {\n try {\n const visual = convertExternalVideoEntryToVisual(\n context,\n possibleEntry.entry as Entry<BaseExternalVideoSkeleton, DefaultChainModifier, string>,\n );\n if (!visual) {\n const errorMessage = `Failed to convert externalVideo entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n return visual;\n } catch (error) {\n const errorMessage = `Error converting externalVideo entry with id ${id}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n }\n\n // // Handle ExternalComponent\n // if (type === 'externalComponent') {\n // return resolveHelper<\n // TConfig,\n // BaseExternalComponentSkeleton<TConfig>,\n // TConfig['ExternalComponent']\n // >(context, entry, () => baseExternalComponentConverter);\n // }\n\n try {\n if (context.contentResolver.has(type)) {\n return resolveContent(context, fromId, entry);\n }\n\n if (context.linkResolver.has(type)) {\n return resolveLink(context, fromId, entry);\n }\n\n const errorMessage = `Unknown content type \"${type}\" for entry with id ${id}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error: new Error(errorMessage),\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n } catch (error) {\n const errorMessage = `Error resolving content entry with id ${id} of type ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n const cmsError: CmsError = {\n entryId: id,\n entryType: type,\n message: errorMessage,\n error,\n };\n context.errors.push(cmsError);\n console.error(errorMessage);\n return null;\n }\n}\n\n/**\n * Resolves all embedded entries and assets within a rich text document\n * Recursively traverses the document tree and resolves link references\n *\n * @param context - The converter context with includes and assets maps\n * @param richText - The unresolved rich text document from Contentful\n * @returns The rich text document with all embedded content resolved\n */\nexport function resolveRichTextDocument(\n context: ConverterContext,\n fromId: string,\n richText: Document | undefined,\n) {\n if (!richText) {\n return undefined;\n }\n\n // Track resolved entries to prevent infinite recursion\n const resolvingEntries = new Set<string>();\n const resolvedEntries = new Set<string>();\n\n const resolveNode = (node: Block | Text | Inline): Block | Text | Inline => {\n // Handle embedded-entry-block nodes\n if (!('content' in node)) {\n return node;\n }\n const block = node as Block;\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Entry'\n ) {\n const entryId = block.data.target.sys.id;\n\n // Check for circular references\n if (resolvingEntries.has(entryId)) {\n console.warn(\n `Circular reference detected in rich text resolution for entry ${entryId}. Skipping to prevent infinite recursion.`,\n );\n // Return the node as-is to break the cycle\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n // Check if already resolved\n if (resolvedEntries.has(entryId)) {\n // Entry already resolved, skip to avoid duplicate work\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n try {\n resolvingEntries.add(entryId);\n const resolvedEntry = resolvePageContent(\n context,\n fromId,\n block.data.target as UnresolvedLink<'Entry'>,\n );\n resolvingEntries.delete(entryId);\n resolvedEntries.add(entryId);\n\n // If resolvePageContent returned null due to error, return node as-is\n if (resolvedEntry === null) {\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedEntry,\n },\n content: block.content?.map(resolveNode),\n };\n } catch (error) {\n resolvingEntries.delete(entryId); // Clean up on error\n console.error(`Failed to resolve entry with id ${entryId}:`, error);\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n if (\n block.data.target &&\n 'sys' in block.data.target &&\n block.data.target.sys.linkType === 'Asset'\n ) {\n try {\n const resolvedAsset = lookupAsset(context, block.data.target as UnresolvedLink<'Asset'>);\n if (resolvedAsset) {\n return {\n ...block,\n data: {\n ...block.data,\n target: resolvedAsset,\n },\n content: block.content?.map(resolveNode),\n };\n }\n } catch (error) {\n console.error(\n `Failed to resolve embedded-asset-block with id ${block.data.target.sys.id}:`,\n error,\n );\n // Return the node as-is if resolution fails\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n }\n }\n\n // For all other node types, recursively process content if present\n return {\n ...block,\n content: block.content?.map(resolveNode),\n };\n };\n\n // Cast the EntryFieldTypes.RichText to our working type\n // Resolve the entire document tree\n const resolved = resolveNode(richText);\n\n // Cast back to the config's RichText type\n return { json: resolved as Document };\n}\n","import type {\n IBlankLink,\n ILinkProps,\n INavigation,\n INavigationItem,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseNavigationSkeleton } from '../baseTypes/baseNavigation';\nimport type { BaseNavigationItemSkeleton } from '../baseTypes/baseNavigationItem';\nimport { createResponsiveVisual } from './asset';\nimport {\n type ConverterContext,\n lookupAsset,\n makeContentfulTitle,\n resolveBuildYear,\n} from './helpers';\nimport { resolveLink, resolveNavigationItem } from './resolver';\n\nfunction createLink(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): ILinkProps | undefined {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n title,\n link,\n text,\n internal,\n icon: navIcon,\n mobileIcon: mobileNavIcon,\n useTitle,\n ...otherFields\n } = fields;\n const icon = createResponsiveVisual(\n lookupAsset(context, navIcon),\n lookupAsset(context, mobileNavIcon),\n );\n\n const realText = useTitle ? resolveBuildYear(title) : text ? resolveBuildYear(text) : undefined;\n\n if (link) {\n return {\n type: 'External link',\n id,\n href: link,\n icon,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n text: realText,\n };\n }\n if (internal) {\n const resolved = resolveLink(context, id, internal);\n return { ...resolved, icon, id, text: realText };\n }\n const blank = {\n type: 'Blank link',\n nick: true,\n id,\n name: makeContentfulTitle(title, id),\n ...otherFields,\n icon,\n text: realText,\n };\n return blank as IBlankLink;\n}\n\nexport function baseNavigationItemConverter(\n context: ConverterContext,\n entry: Entry<BaseNavigationItemSkeleton, DefaultChainModifier, string>,\n): INavigationItem {\n const {\n sys: { id },\n fields,\n } = entry;\n\n const { navigationItems } = fields;\n\n const link = createLink(context, entry);\n\n const resolvedNavigationItems = navigationItems\n ?.map((item) => resolveNavigationItem(context, id, item))\n .filter((item): item is INavigationItem => item !== undefined);\n\n const result = {\n id,\n link,\n entries: resolvedNavigationItems,\n };\n return result;\n}\n\n/**\n * Resolves a navigation entry from an unresolved link\n */\nexport function resolveNavigation(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): INavigation | undefined {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'navigation') {\n return undefined;\n }\n\n const entry = possibleEntry.entry as Entry<BaseNavigationSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return undefined;\n }\n\n // Resolve navigation item entries\n const { name, entries: fieldEntries, ...rest } = fields;\n const entries = fieldEntries?.map((item) => resolveNavigationItem(context, id, item)) ?? [];\n\n return {\n id,\n name,\n entries,\n ...rest,\n };\n}\n","import type { INavigation, ITyped } from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseTemplateSkeleton } from '../baseTypes/baseTemplate';\nimport type { ConverterContext } from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent } from './resolver';\n\n/**\n * Resolved template data structure\n * Templates don't exist as a top-level type in core-data-types,\n * so this is an internal converter type only\n */\nexport interface ResolvedTemplate {\n preContent: ReadonlyArray<ITyped>;\n postContent: ReadonlyArray<ITyped>;\n menu?: INavigation;\n footer?: INavigation;\n backgroundColour?: string;\n textColour?: string;\n stickyNav: boolean;\n}\n\n/**\n * Resolves a template entry from an unresolved link\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param link - Unresolved link to template entry\n * @returns Resolved template data with content arrays and navigation\n */\nexport function resolveTemplate(\n context: ConverterContext,\n link: UnresolvedLink<'Entry'>,\n): ResolvedTemplate | null {\n const id = link.sys.id;\n const possibleEntry = context.includes.get(id);\n\n if (!possibleEntry || possibleEntry.type !== 'template') {\n return null;\n }\n\n const entry = possibleEntry.entry as Entry<BaseTemplateSkeleton, DefaultChainModifier, string>;\n const { fields } = entry;\n\n if (!fields) {\n return null;\n }\n\n // Resolve content arrays\n const preContent =\n fields.preContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n const postContent =\n fields.postContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n // Resolve navigation entries\n const menu = fields.menu ? resolveNavigation(context, fields.menu) : undefined;\n\n const footer = fields.footer ? resolveNavigation(context, fields.footer) : undefined;\n\n // Check for sticky nav flag\n const stickyNav = fields.flags?.includes('Sticky nav') ?? false;\n\n const { backgroundColour, textColour } = fields;\n return {\n preContent,\n postContent,\n menu,\n footer,\n backgroundColour,\n textColour,\n stickyNav,\n };\n}\n","import type {\n IArticleLink,\n IArticleTypeLink,\n IBaseArticle,\n IBaseArticleType,\n ITyped,\n} from '@se-studio/core-data-types';\nimport type { Entry, UnresolvedLink } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseArticleSkeleton } from '../baseTypes/baseArticle';\nimport type { BaseArticleTypeSkeleton } from '../baseTypes/baseArticleType';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent } from './resolver';\nimport { type ResolvedTemplate, resolveTemplate } from './template';\n\n/**\n * Resolves the article template using a hierarchy:\n * 1. Article's explicit template field (if set)\n * 2. ArticleType's articleTemplate field (if set)\n *\n * @param context - Converter context containing includes\n * @param articleTypeLink - Link to the article's ArticleType\n * @param directTemplateLink - Optional direct template link from the article\n * @returns Resolved template or null if no template found in hierarchy\n */\nfunction resolveArticleTemplateHierarchy(\n context: ConverterContext,\n articleTypeLink: UnresolvedLink<'Entry'>,\n directTemplateLink: UnresolvedLink<'Entry'> | undefined,\n): ResolvedTemplate | null {\n // Direct template on article takes precedence\n if (directTemplateLink) {\n return resolveTemplate(context, directTemplateLink);\n }\n\n // Fall back to articleType's articleTemplate\n const articleTypeEntry = context.includes.get(articleTypeLink.sys.id);\n if (!articleTypeEntry) {\n console.warn(`ArticleType entry not found for id: ${articleTypeLink.sys.id}`);\n return null;\n }\n\n const articleTypeFields = (\n articleTypeEntry.entry as Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>\n ).fields;\n\n if (articleTypeFields?.articleTemplate) {\n return resolveTemplate(context, articleTypeFields.articleTemplate);\n }\n\n return null;\n}\n\n/**\n * Base converter for Contentful Article entries to IArticle type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IArticle object\n *\n * @example\n * ```ts\n * const article = baseArticleConverter(contentfulEntry);\n * ```\n */\n\nexport function baseArticleConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IBaseArticle {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n articleType,\n ...simpleFields\n } = fields;\n const articleTypeLink = resolveLink(context, id, articleType);\n\n // Resolve template with hierarchy (article template → articleType template)\n const template = resolveArticleTemplateHierarchy(context, articleType, templateLink);\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const articleContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...articleContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n const article: IBaseArticle = {\n type: 'Article',\n id,\n slug,\n title: makeContentfulTitle(title, sys.id),\n description: makeContentfulDescription(description, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n articleType: articleTypeLink,\n tags: tags?.map((tag) => resolveLink(context, id, tag)),\n contents,\n ...simpleFields,\n // Note: summary field exists in Contentful but is not part of IArticle interface\n // Keeping it in simpleFields for potential future use\n menu: template?.menu,\n footer: template?.footer,\n };\n return article;\n}\n\nexport function calculateArticleTypeHref(slug: string) {\n return `/${slug}/`;\n}\n\nexport function calculateArticleHref(articleTypeSlug: string, slug: string) {\n return `${calculateArticleTypeHref(articleTypeSlug)}${slug}/`;\n}\n\nexport function baseArticleLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleSkeleton, DefaultChainModifier, string>,\n): IArticleLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'article') {\n throw new Error(`Invalid content type: expected \"article\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const articleTypeLink = resolveLink(context, sys.id, fields.articleType);\n const tags = fields.tags?.map((tag) => resolveLink(context, sys.id, tag));\n const primaryTag = tags?.[0] ?? undefined;\n const author = fields.author ? resolveLink(context, sys.id, fields.author) : undefined;\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculateArticleHref(articleTypeLink.slug, fields.slug),\n 'Article',\n {\n tags,\n primaryTag,\n articleType: articleTypeLink,\n date: fields.date,\n author,\n },\n ) as IArticleLink;\n}\n\nexport function baseArticleTypeLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n): IArticleTypeLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'articleType') {\n throw new Error(\n `Invalid content type: expected \"articleType\", got \"${sys.contentType.sys.id}\"`,\n );\n }\n\n return createInternalLink(\n sys.id,\n {\n cmsLabel: fields.name,\n title: fields.name,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculateArticleTypeHref(fields.slug),\n 'ArticleType',\n { indexPageSlug: fields.indexPageSlug },\n ) as IArticleTypeLink;\n}\n\n/**\n * Base converter for Contentful Article Type entries to IArticleType type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IBaseArticleType object\n *\n * @example\n * ```ts\n * const articleType = baseArticleTypeConverter(contentfulEntry);\n * ```\n */\nexport function baseArticleTypeConverter(\n context: ConverterContext,\n entry: Entry<BaseArticleTypeSkeleton, DefaultChainModifier, string>,\n): IBaseArticleType {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n indexPageSlug,\n indexPageName,\n indexPageDescription,\n featuredImage,\n menu: menuLink,\n footer: footerLink,\n indexPageTemplate: templateLink,\n indexPageTopContent: topContentLinks,\n structuredData,\n slug: _slug,\n ...other\n } = fields;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve navigation\n const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;\n const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n const articleType: IBaseArticleType = {\n type: 'Article type',\n id,\n slug: indexPageSlug,\n title: makeContentfulTitle(indexPageName, sys.id),\n description: makeContentfulDescription(indexPageDescription, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n contents,\n structuredData,\n menu,\n footer,\n ...other,\n };\n\n return articleType;\n}\n","import type { BaseCollectionContent, IBaseCollection } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BaseCollectionSkeleton } from '../baseTypes/baseCollection';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport { type ConverterContext, DEFAULT_POSITION_FIELDS, lookupAsset } from './helpers';\nimport { resolveCollectionContent, resolveLink, resolveRichTextDocument } from './resolver';\n\nexport type IContentfulCollection<TContents = BaseCollectionContent> =\n IBaseCollection<TContents> & {\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n };\n\n/**\n * Base converter for Contentful Collection entries to ICollection type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns ICollection object\n *\n * @example\n * ```ts\n * const collection = baseCollectionConverter(context, contentfulEntry);\n * ```\n */\nexport function baseCollectionConverter(\n context: ConverterContext,\n entry: Entry<BaseCollectionSkeleton, DefaultChainModifier, string>,\n): IContentfulCollection {\n const { sys, fields } = entry;\n const { id } = sys;\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n contents: contentsField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n showHeading,\n heading,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const collection: IContentfulCollection = {\n type: 'Collection',\n id,\n name: cmsLabel,\n cmsLabel,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupAsset(context, iconField),\n backgroundVisual,\n visual,\n links: linksField?.map((link) => resolveLink(context, id, link)),\n contents: contentsField?.map((content) => resolveCollectionContent(context, id, content)),\n };\n return collection;\n}\n","import type { IBaseComponent } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BaseComponentSkeleton } from '../baseTypes/baseComponent';\nimport { arrayOrUndefined, notEmpty } from '../utils';\nimport { createResponsiveVisual, lookupMediaEntry } from './asset';\nimport { type ConverterContext, DEFAULT_POSITION_FIELDS, lookupAsset } from './helpers';\nimport { resolveLinks, resolveRichTextDocument } from './resolver';\n\nexport type IContentfulComponent = IBaseComponent & {\n body?: IContentfulRichText | null;\n additionalCopy?: IContentfulRichText | null;\n};\n/**\n * Base converter for Contentful Component entries to IComponent type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful entry to convert\n * @returns IComponent object\n *\n * @example\n * ```ts\n * const component = baseComponentConverter(context, contentfulEntry);\n * ```\n */\nexport function baseComponentConverter(\n context: ConverterContext,\n entry: Entry<BaseComponentSkeleton, DefaultChainModifier, string>,\n): IContentfulComponent {\n const { sys, fields } = entry;\n const { id } = sys;\n\n // Destructure to exclude fields that need special handling\n const {\n // Fields requiring transformation\n backgroundVisual: bgVisual,\n mobileBackgroundVisual: mobileBgVisual,\n visual: visualField,\n mobileVisual: mobileVisualField,\n visualCustomSize,\n icon: iconField,\n links: linksField,\n body: bodyField,\n additionalCopy: additionalCopyField,\n // Field name change\n showHeading,\n heading,\n otherMedia: otherMediaField,\n // Already handled elsewhere\n cmsLabel,\n ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity\n } = fields;\n\n // Convert background visuals to responsive visual\n const backgroundVisual = createResponsiveVisual(\n lookupAsset(context, bgVisual),\n lookupAsset(context, mobileBgVisual),\n );\n\n const visual = createResponsiveVisual(\n lookupMediaEntry(context, visualField),\n lookupMediaEntry(context, mobileVisualField),\n visualCustomSize,\n );\n\n const otherMedia = otherMediaField?.map((media) => lookupAsset(context, media));\n\n const component: IContentfulComponent = {\n type: 'Component',\n id,\n name: cmsLabel,\n cmsLabel,\n ...DEFAULT_POSITION_FIELDS,\n ...simpleFields,\n heading: showHeading ? heading : undefined,\n body: resolveRichTextDocument(context, id, bodyField),\n additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),\n icon: lookupAsset(context, iconField),\n backgroundVisual,\n visual,\n links: resolveLinks(context, id, linksField),\n otherMedia: arrayOrUndefined(otherMedia?.filter(notEmpty)),\n };\n return component;\n}\n","import type { IBaseCustomType, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport {\n addPositionMetadata,\n type ConverterContext,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent } from './resolver';\nimport { resolveTemplate } from './template';\n\n/**\n * Base converter for Contentful Custom Type entries to IBaseCustomType\n *\n * Custom types represent index pages for categories like Topics or Resources.\n * They provide configuration for both the main index page and potentially\n * individual entry pages.\n *\n * @param context - Converter context containing includes and assets\n * @param entry - Contentful entry to convert\n * @returns IBaseCustomType object\n *\n * @example\n * ```ts\n * const customType = baseCustomTypeConverter(context, contentfulEntry);\n * ```\n */\nexport function baseCustomTypeConverter(\n context: ConverterContext,\n entry: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>,\n): IBaseCustomType {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n slug,\n indexPageSlug,\n indexPageName,\n indexPageDescription,\n featuredImage,\n menu: menuLink,\n footer: footerLink,\n indexPageTemplate: templateLink,\n indexPageTopContent: topContentLinks,\n structuredData,\n ...other\n } = fields;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve navigation\n const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;\n const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n const customType: IBaseCustomType = {\n type: 'Custom type',\n id,\n slug,\n indexPageSlug,\n indexPageName: makeContentfulTitle(indexPageName, sys.id),\n indexPageDescription: makeContentfulDescription(indexPageDescription, sys.id),\n title: makeContentfulTitle(indexPageName, sys.id),\n description: makeContentfulDescription(indexPageDescription, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n contents,\n structuredData,\n menu,\n footer,\n ...other,\n };\n\n return customType;\n}\n","import type {\n IBlankLink,\n IDownloadLink,\n IExternalLink,\n IInternalLink,\n} from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseLinkSkeleton } from '../baseTypes/baseLink';\nimport { createResponsiveVisual } from './asset';\nimport type { ConverterContext } from './helpers';\nimport { lookupAsset, makeContentfulTitle, resolveBuildYear } from './helpers';\nimport { resolveLink } from './resolver';\n\n/**\n * Converts a Contentful link entry to an ILinkProps object\n * Handles all link types: internal, external, download, and blank\n */\nexport function baseLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseLinkSkeleton, DefaultChainModifier, string>,\n): IInternalLink | IExternalLink | IDownloadLink | IBlankLink {\n const { sys, fields } = entry;\n\n if (sys.contentType.sys.id !== 'link') {\n throw new Error(`Invalid content type: expected \"link\", got \"${sys.contentType.sys.id}\"`);\n }\n\n const id = sys.id;\n const name = fields.name;\n const useName = fields.useName;\n const text = resolveBuildYear(\n useName\n ? name\n : (fields.linkText ?? makeContentfulTitle(fields.linkText, id, 'Link text for ')),\n );\n const icon = createResponsiveVisual(\n lookupAsset(context, fields.icon),\n lookupAsset(context, fields.mobileIcon),\n );\n const backgroundColour = fields.backgroundColour ?? null;\n const textColour = fields.textColour ?? null;\n const variant = fields.variant;\n const size = fields.size;\n\n // Common base properties\n const baseProps = {\n id,\n useName,\n name,\n text,\n icon,\n backgroundColour,\n textColour,\n variant,\n size,\n };\n\n // Determine link type based on field priority: internal > external > download > blank\n if (fields.internal) {\n // Internal link: resolve the target entry to get its href\n const internalTarget = resolveLink(context, id, fields.internal);\n return {\n ...baseProps,\n type: 'Internal link',\n internalType: internalTarget.internalType,\n href: internalTarget.href,\n slug: internalTarget.slug,\n indexed: internalTarget.indexed,\n hidden: internalTarget.hidden,\n tags: internalTarget.tags,\n title: internalTarget.title,\n description: internalTarget.description,\n };\n }\n\n if (fields.external) {\n // External link: use the external URL\n return {\n ...baseProps,\n type: 'External link',\n href: fields.external,\n };\n }\n\n if (fields.downloadAsset) {\n // Download link: use the asset URL\n const asset = lookupAsset(context, fields.downloadAsset);\n let href: string | null = null;\n if (asset?.image?.type === 'Picture') {\n href = asset.image.src;\n } else if (asset?.image?.type === 'Svg image') {\n href = asset.image.svgSrc;\n } else if (asset?.video) {\n if (asset.video.type === 'Local video') {\n href = asset.video.preview.videoUrl;\n } else if (asset.video.type === 'Full video') {\n href = asset.video.full.videoUrl;\n } else if (asset.video.type === 'External video') {\n href = asset.video.external;\n }\n }\n return {\n ...baseProps,\n type: 'Download link',\n href,\n visual: asset,\n };\n }\n\n // Blank link: no href\n return {\n ...baseProps,\n type: 'Blank link',\n href: null,\n };\n}\n","import type { IBasePage, IInternalLink, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BasePageVariantSkeleton } from '../baseTypes/basePageVariant';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolveLink, resolvePageContent } from './resolver';\nimport { resolveTemplate } from './template';\n\n/**\n * Base converter for Contentful Page entries to IPage type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param entry - Contentful entry to convert\n * @returns IPage object\n *\n * @example\n * ```ts\n * const page = basePageConverter(contentfulEntry);\n * ```\n */\n\nexport function basePageConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IBasePage {\n const {\n sys: { id },\n fields,\n } = entry;\n const {\n slug,\n title,\n description,\n featuredImage,\n tags,\n content,\n menu: pageMenu,\n footer: pageFooter,\n template: templateLink,\n topContent: topContentLinks,\n bottomContent: bottomContentLinks,\n ...simpleFields\n } = fields;\n\n const pageMenuNav = pageMenu ? resolveNavigation(context, pageMenu) : undefined;\n const pageFooterNav = pageFooter ? resolveNavigation(context, pageFooter) : undefined;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const pageContent =\n content\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const bottomContent =\n bottomContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([\n ...topContent,\n ...preContent,\n ...pageContent,\n ...postContent,\n ...bottomContent,\n ]);\n\n const page: IBasePage = {\n type: 'Page',\n id,\n isHomePage: slug === 'index',\n slug,\n title: makeContentfulTitle(title, id),\n description: makeContentfulDescription(description, id),\n featuredImage: lookupAsset(context, featuredImage),\n tags: tags?.map((tag) => resolveLink(context, id, tag)),\n contents,\n ...simpleFields,\n menu: pageMenuNav ?? template?.menu,\n footer: pageFooterNav ?? template?.footer,\n };\n return page;\n}\n\nexport function calculatePageHref(slug: string) {\n if (slug === 'index') {\n return '/';\n }\n return `/${slug}/`;\n}\n\nexport function basePageLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'page') {\n throw new Error(`Invalid content type: expected \"page\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculatePageHref(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n\n/**\n * Calculates the href for a page variant page\n * @param slug - Page variant slug\n * @returns Page variant href path with trailing slash\n */\nexport function calculatePageVariantHref(slug: string) {\n return `/${slug}/`;\n}\n\n/**\n * Base converter for PageVariant entries to IInternalLink type\n * Used when a page variant is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful page variant entry to convert\n * @returns IInternalLink object representing the page variant link\n *\n * @example\n * ```ts\n * const pageVariantLink = basePageVariantLinkConverter(context, pageVariantEntry);\n * ```\n */\nexport function basePageVariantLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePageVariantSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'pageVariant') {\n throw new Error(`Invalid content type: expected \"pageVariant\", got \"${contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n id,\n {\n cmsLabel: fields.cmsLabel,\n title: fields.title,\n featuredImage: fields.featuredImage,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n indexed: fields.indexed,\n hidden: fields.hidden,\n slug: fields.slug,\n },\n context,\n calculatePageVariantHref(fields.slug),\n 'Page',\n { tags: fields.tags?.map((tag) => resolveLink(context, id, tag)) },\n );\n}\n","import type { IBasePerson, IInternalLink } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier, IContentfulRichText } from '../api';\nimport type { BasePersonSkeleton } from '../baseTypes/basePerson';\nimport {\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveRichTextDocument } from './resolver';\n\nexport type IContentfulPerson = IBasePerson & {\n bio?: IContentfulRichText | null;\n};\n\n/**\n * Calculates the href for a person page\n * @param slug - Person slug\n * @returns Person href path with trailing slash\n */\nexport function calculatePersonHref(slug: string) {\n return `/people/${slug}/`;\n}\n\n/**\n * Base converter for Person entries to IInternalLink type\n * Used when a person is referenced as a link in content\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @returns IInternalLink object representing the person link\n *\n * @example\n * ```ts\n * const personLink = basePersonLinkConverter(context, personEntry);\n * ```\n */\nexport function basePersonLinkConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${sys.contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n sys.id,\n {\n ...fields,\n },\n context,\n calculatePersonHref(fields.slug),\n 'Person',\n );\n}\n\n/**\n * Base converter for Person entries to IPerson type\n * Used when a complete person object with bio and content is needed\n *\n * @param context - Converter context containing assets, includes, and resolvers\n * @param entry - Contentful person entry to convert\n * @returns IPerson object representing the complete person\n *\n * @example\n * ```ts\n * const person = basePersonConverter(context, personEntry);\n * ```\n */\nexport function basePersonConverter(\n context: ConverterContext,\n entry: Entry<BasePersonSkeleton, DefaultChainModifier, string>,\n): IContentfulPerson {\n const {\n sys: { id, contentType },\n fields,\n } = entry;\n if (contentType.sys.id !== 'person') {\n throw new Error(`Invalid content type: expected \"person\", got \"${contentType.sys.id}\"`);\n }\n const { slug, name, description, media, bio: bioField, ...rest } = fields;\n\n return {\n type: 'Person',\n id,\n slug,\n title: makeContentfulTitle(name, id),\n description: description ?? `Description for ${id}`,\n featuredImage: lookupAsset(context, media), // Person uses 'media' not 'featuredImage'\n href: calculatePersonHref(slug),\n bio: resolveRichTextDocument(context, id, bioField) ?? null,\n ...rest,\n };\n}\n","import type { IBaseTag, IInternalLink, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { DefaultChainModifier } from '../api';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport {\n addPositionMetadata,\n type ConverterContext,\n createInternalLink,\n lookupAsset,\n makeContentfulDescription,\n makeContentfulTitle,\n} from './helpers';\nimport { resolveNavigation } from './navigationItem';\nimport { resolvePageContent } from './resolver';\nimport { resolveTemplate } from './template';\n\nexport function calculateTagHref(slug: string) {\n return `/tag/${slug}/`;\n}\n\nexport function baseTagLinkConverter(\n context: ConverterContext,\n entry: Entry<BaseTagSkeleton, DefaultChainModifier, string>,\n): IInternalLink {\n const { sys, fields } = entry;\n if (sys.contentType.sys.id !== 'tag') {\n throw new Error(`Invalid content type: expected \"tag\", got \"${sys.contentType.sys.id}\"`);\n }\n\n return createInternalLink(\n sys.id,\n {\n ...fields,\n },\n context,\n calculateTagHref(fields.slug),\n 'Tag',\n );\n}\n\n/**\n * Base converter for Contentful Tag entries to IBaseTag type\n *\n * This is a minimal implementation that can be extended using\n * the functional composition pattern.\n *\n * @param context - Converter context containing includes and assets\n * @param entry - Contentful entry to convert\n * @returns IBaseTag object\n *\n * @example\n * ```ts\n * const tag = baseTagConverter(context, contentfulEntry);\n * ```\n */\nexport function baseTagConverter(\n context: ConverterContext,\n entry: Entry<BaseTagSkeleton, DefaultChainModifier, string>,\n): IBaseTag {\n const { sys, fields } = entry;\n const { id } = sys;\n const {\n name,\n slug,\n description,\n featuredImage,\n tagType,\n menu: menuLink,\n footer: footerLink,\n template: templateLink,\n topContent: topContentLinks,\n ...rest\n } = fields;\n\n // Resolve template (if exists)\n const template = templateLink ? resolveTemplate(context, templateLink) : null;\n\n // Resolve navigation\n const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;\n const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;\n\n // Resolve all content sections\n const topContent =\n topContentLinks\n ?.map((c) => resolvePageContent(context, id, c))\n .filter((item): item is ITyped => item !== null) ?? [];\n const preContent = template?.preContent ?? [];\n const postContent = template?.postContent ?? [];\n\n // Merge in correct order and add position metadata\n const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);\n\n // Resolve tag type name if available\n const tagTypeEntry = tagType ? context.includes.get(tagType.sys.id) : null;\n const tagTypeName = tagTypeEntry?.entry?.fields?.name as string | undefined;\n\n const tag: IBaseTag = {\n type: 'Tag',\n id,\n slug,\n title: makeContentfulTitle(name, sys.id),\n description: makeContentfulDescription(description, sys.id),\n featuredImage: lookupAsset(context, featuredImage),\n tagType: tagTypeName ?? null,\n contents,\n ...rest,\n menu,\n footer,\n };\n\n return tag;\n}\n","import type { IArticleLink, IArticleTypeLink } from '@se-studio/core-data-types';\nimport {\n baseArticleConverter,\n baseArticleLinkConverter,\n baseArticleTypeConverter,\n baseArticleTypeLinkConverter,\n} from '../converters/article';\nimport { baseCollectionConverter } from '../converters/collection';\nimport { baseComponentConverter } from '../converters/component';\nimport { baseCustomTypeConverter } from '../converters/customType';\nimport type {\n BaseConverterContext,\n ContentResolverFunction,\n ContentResolverMap,\n LinkResolverFunction,\n LinkResolverMap,\n} from '../converters/helpers';\nimport { baseLinkConverter } from '../converters/link';\nimport { baseNavigationItemConverter } from '../converters/navigationItem';\nimport {\n basePageConverter,\n basePageLinkConverter,\n basePageVariantLinkConverter,\n} from '../converters/page';\nimport { basePersonLinkConverter } from '../converters/person';\nimport { baseTagConverter, baseTagLinkConverter } from '../converters/tag';\n\n/**\n * Creates a base converter context with default resolvers for all content types.\n *\n * Sets up default converters for:\n * - Pages, Articles, Article Types\n * - Components, Collections, External Components\n * - Links (pages, articles, tags, people, etc.)\n * - Navigation items\n *\n * Projects can extend this context with custom resolvers for specific content types.\n *\n * @returns Base converter context with all default resolvers configured\n *\n * @example\n * ```ts\n * const context = createBaseConverterContext();\n *\n * // Use with API functions\n * const page = await contentfulPageRest(context, config, 'home');\n * ```\n */\nexport function createBaseConverterContext(): BaseConverterContext {\n const linkResolver: LinkResolverMap = new Map();\n linkResolver.set('page', basePageLinkConverter as LinkResolverFunction);\n linkResolver.set('article', baseArticleLinkConverter as LinkResolverFunction<IArticleLink>);\n linkResolver.set(\n 'articleType',\n baseArticleTypeLinkConverter as LinkResolverFunction<IArticleTypeLink>,\n );\n linkResolver.set('tag', baseTagLinkConverter as LinkResolverFunction);\n linkResolver.set('person', basePersonLinkConverter as LinkResolverFunction);\n linkResolver.set('pageVariant', basePageVariantLinkConverter as LinkResolverFunction);\n linkResolver.set('link', baseLinkConverter as LinkResolverFunction);\n\n const contentResolver: ContentResolverMap = new Map();\n contentResolver.set('collection', baseCollectionConverter as ContentResolverFunction);\n contentResolver.set('component', baseComponentConverter as ContentResolverFunction);\n contentResolver.set(\n 'externalComponent',\n baseComponentConverter as unknown as ContentResolverFunction,\n );\n\n return {\n pageResolver: basePageConverter,\n navigationItemResolver: baseNavigationItemConverter,\n articleResolver: baseArticleConverter,\n articleTypeResolver: baseArticleTypeConverter,\n tagResolver: baseTagConverter,\n customTypeResolver: baseCustomTypeConverter,\n componentResolver: baseComponentConverter,\n collectionResolver: baseCollectionConverter,\n linkResolver,\n contentResolver,\n videoPrefix: '',\n };\n}\n","import type { IBaseCustomType } from '@se-studio/core-data-types';\nimport type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches a custom type from Contentful by indexPageSlug\n *\n * Custom types represent index pages for categories like Topics or Resources.\n * They provide configuration for both the main index page and potentially\n * individual entry pages.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param indexPageSlug - Custom type's indexPageSlug to fetch (e.g., 'topics', 'resources')\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseCustomType or null if not found\n *\n * @example\n * ```ts\n * const customType = await contentfulCustomTypeRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'topics',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['topics-custom-type'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulCustomTypeRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n indexPageSlug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseCustomType | null>> {\n return fetchSingleEntity<BaseCustomTypeSkeleton, IBaseCustomType>(\n context,\n config,\n {\n contentType: 'customType',\n cacheTagType: 'customType',\n cacheTagIdentifier: indexPageSlug,\n query: { 'fields.indexPageSlug': indexPageSlug },\n resolver: (ctx, entry) => ctx.customTypeResolver(ctx, entry),\n errorLogContext: { indexPageSlug },\n },\n options,\n );\n}\n","import type { IArticleLink, IArticleTypeLink, IInternalLink } from '@se-studio/core-data-types';\nimport { getContentfulClient } from '../client';\nimport { baseArticleLinkConverter, baseArticleTypeLinkConverter } from '../converters/article';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport { basePageLinkConverter } from '../converters/page';\nimport { basePersonLinkConverter } from '../converters/person';\nimport { baseTagLinkConverter } from '../converters/tag';\nimport { getCacheTags } from '../revalidation/utils';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { withRetry } from '../utils';\nimport {\n ARTICLE_LINK_FIELDS,\n ARTICLE_TYPE_LINK_FIELDS,\n fetchAllLinks,\n PAGE_LINK_FIELDS,\n PERSON_LINK_FIELDS,\n TAG_LINK_FIELDS,\n} from './helpers';\n\n/**\n * Fetches all page links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of page links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPageLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful page links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPageLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use page collection tag\n const cacheTags = getCacheTags('page', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'page',\n client,\n requestOptions,\n basePageLinkConverter,\n context,\n 100,\n PAGE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IArticleLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use article collection tag\n const cacheTags = getCacheTags('article', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'article',\n client,\n requestOptions,\n baseArticleLinkConverter,\n context,\n 100,\n ARTICLE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all tag links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of tag links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllTagLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful tag links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllTagLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use tag collection tag\n const cacheTags = getCacheTags('tag', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'tag',\n client,\n requestOptions,\n baseTagLinkConverter,\n context,\n 100,\n TAG_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all person links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of person links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllPersonLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful person links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllPersonLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IInternalLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use person collection tag\n const cacheTags = getCacheTags('person', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'person',\n client,\n requestOptions,\n basePersonLinkConverter,\n context,\n 100,\n PERSON_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n\n/**\n * Fetches all article type links from Contentful for static params generation.\n * Includes lastModified metadata from sys.updatedAt for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of article type links (with metadata) and any errors\n *\n * @example\n * ```ts\n * const response = await contentfulAllArticleTypeLinks(\n * context,\n * config,\n * { preview: false }\n * );\n * console.log(response.data); // successful article type links with lastModified\n * console.log(response.errors); // any conversion errors\n * ```\n */\nexport async function contentfulAllArticleTypeLinks(\n context: BaseConverterContext,\n config: ContentfulConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<IArticleTypeLink[]>> {\n const client = getContentfulClient(config, options?.preview);\n\n // Set cache tags for this request - use articleType collection tag\n const cacheTags = getCacheTags('articleType', undefined, options?.preview);\n const requestOptions = {\n ...options,\n next: {\n ...options?.next,\n tags: cacheTags,\n },\n };\n\n const fetchFn = () =>\n fetchAllLinks(\n 'articleType',\n client,\n requestOptions,\n baseArticleTypeLinkConverter,\n context,\n 100,\n ARTICLE_TYPE_LINK_FIELDS,\n );\n\n // Apply retry logic if configured\n if (options?.retry) {\n return await withRetry(fetchFn, options.retry);\n }\n\n return await fetchFn();\n}\n","import type { IBasePage } from '@se-studio/core-data-types';\nimport type { BasePageSkeleton } from '../baseTypes/basePage';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches a page from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Page slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBasePage or null if not found\n *\n * @example\n * ```ts\n * const page = await contentfulPageRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'home',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['home-page'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulPageRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBasePage | null>> {\n return fetchSingleEntity<BasePageSkeleton, IBasePage>(\n context,\n config,\n {\n contentType: 'page',\n cacheTagType: 'page',\n cacheTagIdentifier: slug,\n query: { 'fields.slug': slug },\n resolver: (ctx, entry) => ctx.pageResolver(ctx, entry),\n errorLogContext: { slug },\n },\n options,\n );\n}\n","import type { IArticleLink } from '@se-studio/core-data-types';\nimport type { RelatedArticlesOptions } from './types';\n\n/**\n * Filters and ranks articles based on related article criteria.\n * Articles with more matching tags are ranked higher.\n *\n * @param articles - Array of article links with metadata\n * @param options - Filtering options\n * @returns Filtered and ranked array of article links\n *\n * @example\n * ```ts\n * const relatedArticles = filterRelatedArticles(allArticles, {\n * articleTypeIds: ['blog-type-id'],\n * tagIds: ['tag-1', 'tag-2'],\n * excludeArticleIds: [currentArticle.id],\n * count: 3,\n * });\n * ```\n */\nexport function filterRelatedArticles(\n articles: IArticleLink[],\n options: RelatedArticlesOptions,\n): IArticleLink[] {\n const {\n excludeArticleIds,\n articleTypeIds: rawArticleTypeIds,\n tagIds: rawTagIds,\n authorIds: rawAuthorIds,\n before,\n after,\n count,\n } = options;\n\n // Extract and deduplicate IDs from link objects\n const excludeIds = excludeArticleIds ? [...new Set(excludeArticleIds)] : [];\n const articleTypeIds = rawArticleTypeIds ? [...new Set(rawArticleTypeIds)] : [];\n const tagIds = rawTagIds ? [...new Set(rawTagIds)] : [];\n const authorIds = rawAuthorIds ? [...new Set(rawAuthorIds)] : [];\n\n // Score and filter articles\n const scoredArticles = articles\n .map((article) => {\n let score = 0;\n\n // Filter: Exclude specific articles\n if (excludeIds.length > 0 && excludeIds.includes(article.id)) {\n return null;\n }\n\n // Filter: Article type (match any of the provided types)\n if (articleTypeIds.length > 0) {\n if (!article.articleType?.id || !articleTypeIds.includes(article.articleType.id)) {\n return null;\n }\n }\n\n // Filter: Date range\n if (article.date) {\n const articleDate = new Date(article.date);\n if (before && articleDate > before) {\n return null;\n }\n if (after && articleDate < after) {\n return null;\n }\n }\n\n // Score: Tag matching (more matches = higher score)\n if (tagIds.length > 0 && article.tags) {\n const articleTagIds = article.tags.map((tag) => tag.id);\n const matchingTags = tagIds.filter((tagId) => articleTagIds.includes(tagId));\n score += matchingTags.length * 10; // Each matching tag adds 10 points\n }\n\n // Score: Author matching (match any of the provided authors)\n if (authorIds.length > 0 && article.author?.id) {\n if (authorIds.includes(article.author.id)) {\n score += 5; // Matching author adds 5 points\n }\n }\n\n return { article, score };\n })\n .filter((item): item is { article: IArticleLink; score: number } => item !== null);\n\n // Sort by score (descending), then by date (descending)\n scoredArticles.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n // If scores are equal, sort by date (newest first)\n if (a.article.date && b.article.date) {\n const articleDateA = new Date(a.article.date);\n const articleDateB = new Date(b.article.date);\n return articleDateB.getTime() - articleDateA.getTime();\n }\n return 0;\n });\n\n // Take top N articles (or all if count is undefined)\n const topArticles = count !== undefined ? scoredArticles.slice(0, count) : scoredArticles;\n\n return topArticles.map(({ article }) => article);\n}\n","import type { IInternalLink } from '@se-studio/core-data-types';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsError, CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport {\n contentfulAllArticleLinks,\n contentfulAllArticleTypeLinks,\n contentfulAllPageLinks,\n contentfulAllPersonLinks,\n contentfulAllTagLinks,\n} from './links';\nimport type {\n ISitemapEntry,\n SitemapConfig,\n SitemapContentTypeConfig,\n SitemapEntryProvider,\n} from './types';\n\n// ============================================================================\n// Sitemap Entry Helpers\n// ============================================================================\n\n/**\n * Helper function to convert internal links to sitemap entries.\n * Filters to only include indexed and non-hidden entries.\n *\n * @param links - Array of internal links with metadata\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns Array of sitemap entries\n */\nfunction linksToSitemapEntries(\n links: IInternalLink[],\n sitemapConfig?: SitemapContentTypeConfig,\n): ISitemapEntry[] {\n return links\n .filter((link) => link.indexed !== false && link.hidden !== true && link.href)\n .map((link) => ({\n url: link.href as string,\n lastModified: link.lastModified,\n changeFrequency: sitemapConfig?.changeFrequency,\n priority: sitemapConfig?.priority,\n }));\n}\n\n// ============================================================================\n// Sitemap Entry Fetchers\n// ============================================================================\n\n/**\n * Fetches all page sitemap entries from Contentful.\n * Only includes pages that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulPageSitemapEntries(\n * context,\n * config,\n * { priority: 0.8, changeFrequency: 'weekly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulPageSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPageLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article sitemap entries from Contentful.\n * Only includes articles that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n *\n * @example\n * ```ts\n * const { data: entries } = await contentfulArticleSitemapEntries(\n * context,\n * config,\n * { priority: 0.6, changeFrequency: 'monthly' },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function contentfulArticleSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all article type sitemap entries from Contentful.\n * Only includes article types that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulArticleTypeSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllArticleTypeLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all tag sitemap entries from Contentful.\n * Only includes tags that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulTagSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllTagLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n/**\n * Fetches all person sitemap entries from Contentful.\n * Only includes people that are indexed and not hidden.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Optional sitemap configuration (priority, changeFrequency)\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with array of sitemap entries\n */\nexport async function contentfulPersonSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const response = await contentfulAllPersonLinks(context, config, options);\n return {\n data: linksToSitemapEntries(response.data, sitemapConfig),\n errors: response.errors,\n };\n}\n\n// ============================================================================\n// Sitemap Registry Functions\n// ============================================================================\n\n/**\n * Collects sitemap entries from multiple providers.\n * This allows projects to register custom content types for sitemap generation.\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param sitemapConfig - Configuration with array of provider functions\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to CmsResponse with all sitemap entries combined\n *\n * @example\n * ```ts\n * const { data: entries, errors } = await getAllSitemapEntries(\n * context,\n * config,\n * {\n * providers: [\n * (ctx, cfg, opts) => contentfulPageSitemapEntries(ctx, cfg, { priority: 0.8 }, opts),\n * (ctx, cfg, opts) => contentfulArticleSitemapEntries(ctx, cfg, { priority: 0.6 }, opts),\n * // Custom content type provider\n * async (ctx, cfg, opts) => {\n * const links = await fetchCustomContentLinks(ctx, cfg, opts);\n * return { data: links.map(l => ({ url: l.href, lastModified: l.lastModified })), errors: [] };\n * },\n * ],\n * },\n * { next: { revalidate: 3600 } }\n * );\n * ```\n */\nexport async function getAllSitemapEntries(\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig: SitemapConfig,\n options?: FetchOptions,\n): Promise<CmsResponse<ISitemapEntry[]>> {\n const allEntries: ISitemapEntry[] = [];\n const allErrors: CmsError[] = [];\n\n // Fetch from all providers in parallel for better performance\n const results = await Promise.all(\n sitemapConfig.providers.map((provider) => provider(context, config, options)),\n );\n\n // Combine all results\n for (const result of results) {\n allEntries.push(...result.data);\n allErrors.push(...result.errors);\n }\n\n return { data: allEntries, errors: allErrors };\n}\n\n/**\n * Creates a sitemap entry provider with pre-configured options.\n * Useful for creating providers with specific priority and changeFrequency settings.\n *\n * @param fetcher - The sitemap entry fetcher function to wrap\n * @param sitemapConfig - Configuration for priority and change frequency\n * @returns A sitemap entry provider function\n *\n * @example\n * ```ts\n * const pageProvider = createSitemapProvider(\n * contentfulPageSitemapEntries,\n * { priority: 0.8, changeFrequency: 'weekly' }\n * );\n *\n * const { data: entries } = await getAllSitemapEntries(context, config, {\n * providers: [pageProvider, articleProvider],\n * });\n * ```\n */\nexport function createSitemapProvider(\n fetcher: (\n context: BaseConverterContext,\n config: ContentfulConfig,\n sitemapConfig?: SitemapContentTypeConfig,\n options?: FetchOptions,\n ) => Promise<CmsResponse<ISitemapEntry[]>>,\n sitemapConfig?: SitemapContentTypeConfig,\n): SitemapEntryProvider {\n return (context, config, options) => fetcher(context, config, sitemapConfig, options);\n}\n","import type { IBaseTag } from '@se-studio/core-data-types';\nimport type { BaseTagSkeleton } from '../baseTypes/baseTag';\nimport type { BaseConverterContext } from '../converters/helpers';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\n\n/**\n * Fetches a tag from Contentful by slug\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param slug - Tag slug to fetch\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IBaseTag or null if not found\n *\n * @example\n * ```ts\n * const tag = await contentfulTagRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * 'my-tag',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['my-tag'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulTagRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n slug: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IBaseTag | null>> {\n return fetchSingleEntity<BaseTagSkeleton, IBaseTag>(\n context,\n config,\n {\n contentType: 'tag',\n cacheTagType: 'tag',\n cacheTagIdentifier: slug,\n query: { 'fields.slug': slug },\n resolver: (ctx, entry) => ctx.tagResolver(ctx, entry),\n errorLogContext: { slug },\n },\n options,\n );\n}\n","import type { INavigation, ITyped } from '@se-studio/core-data-types';\nimport type { Entry } from 'contentful';\nimport type { BaseTemplateSkeleton } from '../baseTypes/baseTemplate';\nimport type { BaseConverterContext, ConverterContext } from '../converters/helpers';\nimport { resolveNavigation } from '../converters/navigationItem';\nimport { resolvePageContent } from '../converters/resolver';\nimport type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';\nimport { fetchSingleEntity } from './helpers';\nimport type { DefaultChainModifier } from './types';\n\n/**\n * Fetched template data structure\n * Extends the resolved template with id and label for direct fetching\n */\nexport interface IFetchedTemplate {\n id: string;\n cmsLabel: string;\n preContent: ReadonlyArray<ITyped>;\n postContent: ReadonlyArray<ITyped>;\n menu?: INavigation;\n footer?: INavigation;\n backgroundColour?: string;\n textColour?: string;\n stickyNav: boolean;\n}\n\n/**\n * Converts a template entry to IFetchedTemplate\n */\nfunction templateConverter(\n context: ConverterContext,\n entry: Entry<BaseTemplateSkeleton, DefaultChainModifier, string>,\n): IFetchedTemplate {\n const { fields, sys } = entry;\n const id = sys.id;\n\n // Resolve content arrays\n const preContent =\n fields.preContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n const postContent =\n fields.postContent\n ?.map((content) => resolvePageContent(context, id, content))\n .filter((item): item is ITyped => item !== null) ?? [];\n\n // Resolve navigation entries\n const menu = fields.menu ? resolveNavigation(context, fields.menu) : undefined;\n const footer = fields.footer ? resolveNavigation(context, fields.footer) : undefined;\n\n // Check for sticky nav flag\n const stickyNav = fields.flags?.includes('Sticky nav') ?? false;\n\n return {\n id,\n cmsLabel: fields.cmsLabel,\n preContent,\n postContent,\n menu,\n footer,\n backgroundColour: fields.backgroundColour,\n textColour: fields.textColour,\n stickyNav,\n };\n}\n\n/**\n * Fetches a template from Contentful by cmsLabel\n *\n * @param context - Converter context\n * @param config - Contentful configuration\n * @param cmsLabel - Template cmsLabel to fetch (e.g., '404')\n * @param options - Fetch options (locale, preview, caching, etc.)\n * @returns Promise resolving to IFetchedTemplate or null if not found\n *\n * @example\n * ```ts\n * const template = await contentfulTemplateRest(\n * context,\n * {\n * spaceId: process.env.CONTENTFUL_SPACE_ID!,\n * accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,\n * },\n * '404',\n * {\n * locale: 'en-US',\n * cache: {\n * tags: ['template#404'],\n * revalidate: 3600\n * }\n * }\n * );\n * ```\n */\nexport async function contentfulTemplateRest(\n context: BaseConverterContext,\n config: ContentfulConfig,\n cmsLabel: string,\n options?: FetchOptions,\n): Promise<CmsResponse<IFetchedTemplate | null>> {\n return fetchSingleEntity<BaseTemplateSkeleton, IFetchedTemplate>(\n context,\n config,\n {\n contentType: 'template',\n cacheTagType: 'template',\n cacheTagIdentifier: cmsLabel,\n query: { 'fields.cmsLabel': cmsLabel },\n resolver: (ctx, entry) => templateConverter(ctx, entry),\n errorLogContext: { cmsLabel },\n },\n options,\n );\n}\n","import {\n ArticleTag,\n ArticleTypeIndexTag,\n ArticleTypeTag,\n AssetTag,\n articleTag,\n articleTypeIndexTag,\n articleTypeTag,\n assetTag,\n BannerTag,\n CustomTypeTag,\n GlobalTag,\n LocationTag,\n locationTag,\n NavigationTag,\n PageTag,\n PersonTag,\n pageTag,\n personTag,\n TagTag,\n TemplateTag,\n tagTag,\n templateTag,\n} from './tags';\nimport { revalidateSingleTag, revalidateTags } from './utils';\n\n// Contentful webhook payload types\nexport interface BaseData {\n // metadata: Metadata;\n sys: {\n id: string;\n type: 'Entry' | 'DeletedEntry' | 'Asset' | 'DeletedAsset';\n space: { sys: { id: string } };\n environment: { sys: { id: string } };\n contentType: { sys: { id: string } };\n };\n}\n\ninterface SlugData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n };\n}\n\ninterface PageVariantData extends SlugData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n originalPage?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n articleType?: {\n 'en-US': {\n sys: {\n id: string;\n };\n };\n };\n };\n}\n\ninterface ArticleTypeData extends BaseData {\n fields?: {\n slug?: {\n 'en-US': string;\n };\n indexPageSlug?: {\n 'en-US': string;\n };\n };\n}\n\nexport interface AssetData extends BaseData {\n fields?: {\n file?: {\n [key: string]: {\n url: string;\n fileName: string;\n contentType: string;\n };\n };\n };\n}\n\ninterface TemplateData extends BaseData {\n fields?: {\n cmsLabel?: {\n 'en-US': string;\n };\n };\n}\n\n// Content type handler interface\nexport interface IContentTypeHandler<TData extends BaseData, TExtracted> {\n extract(data: TData): TExtracted | Promise<TExtracted>;\n makeTags(extracted: TExtracted): (string | undefined)[] | undefined;\n getGlobalTags(): string[];\n rebuildSearch?: boolean;\n}\n\n// Default locale for Contentful\nconst defaultLocale = 'en-US';\n\n// Content type handlers\n\nconst articleTypeHandler: IContentTypeHandler<\n ArticleTypeData,\n { slug: string | undefined | null; indexPageSlug: string | undefined | null }\n> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n indexPageSlug: data.fields?.indexPageSlug?.[defaultLocale],\n }),\n makeTags: (extracted) => [\n extracted.slug ? articleTypeTag(extracted.slug) : undefined,\n extracted.indexPageSlug ? articleTypeIndexTag(extracted.indexPageSlug) : undefined,\n ],\n getGlobalTags: () => [ArticleTypeTag, ArticleTypeIndexTag],\n};\n\nconst articleHandler: IContentTypeHandler<ArticleData, { slug: string | undefined | null }> = {\n extract: (data) => ({\n slug: data.fields?.slug?.[defaultLocale],\n }),\n makeTags: (extracted) => [extracted?.slug ? articleTag(extracted.slug) : undefined],\n getGlobalTags: () => [ArticleTag],\n rebuildSearch: true,\n};\n\nconst pageVariantHandler: IContentTypeHandler<PageVariantData, string | undefined> = {\n extract: (data) => {\n const pageVariantSlug = data.fields?.slug?.[defaultLocale];\n return pageVariantSlug;\n },\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n};\n\nconst templateHandler: IContentTypeHandler<TemplateData, string | undefined> = {\n extract: (data) => data.fields?.cmsLabel?.[defaultLocale],\n makeTags: (extracted) => [extracted ? templateTag(extracted) : undefined],\n getGlobalTags: () => [TemplateTag],\n};\n\n// Content type handlers registry\nexport const contentTypeHandlers: Record<\n string,\n IContentTypeHandler<SlugData, string | null | undefined>\n> = {\n page: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],\n getGlobalTags: () => [PageTag],\n },\n pageVariant: pageVariantHandler as IContentTypeHandler<SlugData, string | null | undefined>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n article: articleHandler as IContentTypeHandler<SlugData, any>,\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n articleType: articleTypeHandler as IContentTypeHandler<SlugData, any>,\n person: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? personTag(extracted) : undefined],\n getGlobalTags: () => [PersonTag],\n },\n tag: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? tagTag(extracted) : undefined],\n getGlobalTags: () => [TagTag],\n },\n // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types\n template: templateHandler as IContentTypeHandler<SlugData, any>,\n customType: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [CustomTypeTag],\n },\n navigation: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [NavigationTag],\n },\n banner: {\n extract: () => undefined,\n makeTags: () => undefined,\n getGlobalTags: () => [BannerTag],\n },\n location: {\n extract: (data) => data.fields?.slug?.[defaultLocale],\n makeTags: (extracted) => [extracted ? locationTag(extracted) : undefined],\n getGlobalTags: () => [LocationTag],\n },\n};\n\n// Asset revalidation handler\nexport async function revalidateAsset(\n content: AssetData,\n message: string,\n preview: boolean = false,\n): Promise<boolean> {\n const id = content.sys.id;\n const fileName = content.fields?.file?.[defaultLocale]?.fileName;\n const tags = [assetTag(id), fileName ? assetTag(fileName) : undefined, AssetTag].filter(\n (tag): tag is string => tag !== undefined,\n );\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, message);\n } else {\n await revalidateTags(tags, message);\n }\n\n return true;\n}\n\n// Entry revalidation handler\nexport async function revalidateEntry(\n handler: IContentTypeHandler<SlugData, string | null | undefined>,\n content: BaseData,\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const extracted = await Promise.resolve(handler.extract(content));\n const tags = handler.makeTags(extracted);\n const validTags = tags?.filter((tag): tag is string => tag !== undefined) ?? [];\n const globalTags = handler.getGlobalTags();\n const tagsToRevalidate = [...validTags, ...globalTags];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `publish ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tagsToRevalidate, `publish ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted entry by content type (collection tags only)\nexport async function revalidateDeletedEntry(\n contentType: string,\n preview: boolean = false,\n): Promise<boolean> {\n const { getCacheTagsForProduction } = await import('./utils');\n const tags = getCacheTagsForProduction(contentType);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete ${contentType} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete ${contentType}`);\n }\n\n return true;\n}\n\n// Revalidate deleted asset by ID\nexport async function revalidateDeletedAsset(\n assetId: string,\n preview: boolean = false,\n): Promise<boolean> {\n const tags = [assetTag(assetId), AssetTag];\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, `delete asset ${assetId} (preview mode)`);\n } else {\n await revalidateTags(tags, `delete asset ${assetId}`);\n }\n\n return true;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NextResponse } from 'next/server';\nimport {\n type AssetData,\n type BaseData,\n contentTypeHandlers,\n revalidateAsset,\n revalidateDeletedAsset,\n revalidateDeletedEntry,\n revalidateEntry,\n} from './handlers';\nimport { AllTags, GlobalTag } from './tags';\nimport { revalidateSingleTag } from './utils';\n\n// Handle asset publishing\nasync function publishAsset(content: AssetData, preview: boolean): Promise<boolean> {\n return await revalidateAsset(content, 'publish asset', preview);\n}\n\n// Handle asset deletion\nasync function deleteAsset(content: BaseData, preview: boolean): Promise<boolean> {\n return await revalidateDeletedAsset(content.sys.id, preview);\n}\n\n// Handle entry publishing\nasync function publishEntry(content: BaseData, preview: boolean): Promise<boolean> {\n const contentType = content.sys.contentType.sys.id;\n const handler = contentTypeHandlers[contentType];\n if (!handler) {\n console.warn(`Unknown content type: ${contentType}`);\n return false;\n }\n return await revalidateEntry(handler, content, contentType, preview);\n}\n\n// Handle entry deletion\nasync function deleteEntry(content: BaseData, preview: boolean): Promise<boolean> {\n console.log(`Delete entry: ${content.sys.id}`);\n const contentType = content.sys.contentType.sys.id;\n const success = await revalidateDeletedEntry(contentType, preview);\n // Note: Search rebuild logic would go here if needed\n return success;\n}\n\n// Revalidate all tags (for global revalidation)\nasync function revalidateAll(preview: boolean): Promise<boolean> {\n console.log('Revalidating all tags');\n await delay(500);\n\n if (preview) {\n await revalidateSingleTag(GlobalTag, 'global revalidation');\n } else {\n for (const tag of AllTags) {\n await revalidateSingleTag(tag, 'global revalidation');\n }\n }\n\n // Note: Search rebuild logic would go here if needed\n return true;\n}\n\n// Utility delay function\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Main revalidation handler function\nexport async function handleRevalidation(\n request: Request,\n preview: boolean = false,\n): Promise<NextResponse> {\n try {\n // Check for global revalidation header\n const all = request.headers.get('REVALIDATE_ALL');\n const single = request.headers.get('REVALIDATION_TAG');\n\n if (all) {\n const success = await revalidateAll(preview);\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n if (single) {\n const success = await revalidateSingleTag(single, 'single tag revalidation');\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n }\n\n // Parse webhook payload\n const content = (await request.json()) as BaseData;\n\n let success = false;\n switch (content.sys.type) {\n case 'DeletedAsset':\n success = await deleteAsset(content, preview);\n break;\n case 'DeletedEntry':\n success = await deleteEntry(content, preview);\n break;\n case 'Asset':\n success = await publishAsset(content as AssetData, preview);\n break;\n case 'Entry':\n success = await publishEntry(content, preview);\n break;\n default:\n console.warn(`Unknown message type: ${content.sys.type}`);\n return NextResponse.json({ message: 'Unknown message type' }, { status: 400 });\n }\n\n if (!success) {\n return NextResponse.json({ message: 'Unknown content type' }, { status: 400 });\n }\n\n return NextResponse.json({ revalidated: success, now: Date.now() }, { status: 200 });\n } catch (error) {\n console.error('Error in revalidation:', error);\n // Send a 200 back as Contentful retries a few times!\n return NextResponse.json({ message: 'Error in revalidation' }, { status: 500 });\n }\n}\n","import { type NextRequest, NextResponse } from 'next/server';\nimport { handleRevalidation } from './route';\n\n/**\n * Configuration for the revalidation route\n */\nexport interface RevalidationConfig {\n /** Secret for validating webhook requests */\n secret?: string;\n /** Whether to validate the secret */\n validateSecret?: boolean;\n /** Whether to run in preview mode */\n preview?: boolean;\n}\n\n/**\n * Create a Next.js API route handler for Contentful revalidation\n *\n * @param config - Configuration options\n * @returns Next.js POST handler function\n *\n * @example\n * ```ts\n * // In your app/api/revalidate/route.ts\n * import { createRevalidationHandler } from '@se-studio/contentful-rest-api';\n *\n * export const POST = createRevalidationHandler({\n * secret: process.env.REVALIDATION_SECRET,\n * validateSecret: true,\n * });\n * ```\n */\nexport function createRevalidationHandler(\n config: RevalidationConfig = {},\n): (request: NextRequest) => Promise<NextResponse> {\n return async function POST(request: NextRequest) {\n const { secret, validateSecret = true, preview = false } = config;\n\n // Validate secret if required\n if (validateSecret && secret) {\n const requestSecret = request.headers.get('REVALIDATION_SECRET');\n if (requestSecret !== secret) {\n return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });\n }\n }\n\n // Handle the revalidation\n return await handleRevalidation(request, preview);\n };\n}\n","// Revalidation utilities exports\n\nexport * from './handlers';\nexport * from './nextjs-route';\nexport * from './route';\nexport * from './tags';\nexport * from './utils';\n"]}
|