@sitecore-content-sdk/angular 0.1.0-canary.20260609132302

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitecore-content-sdk-angular.mjs","sources":["../../src/lib/tokens.ts","../../src/lib/sitecore-page-resolver.ts","../../src/config/define-config.ts","../../src/loaders/loader-registry.token.ts","../../src/server/constants.ts","../../src/loaders/client-loader-data.service.ts","../../src/loaders/utils.ts","../../src/loaders/models.ts","../../src/i18n/locale-utils.ts","../../src/loaders/router-error-handling.ts","../../src/loaders/server-loader-runner.token.ts","../../src/loaders/loader-resolver.ts","../../src/loaders/pre-loader-data.service.ts","../../src/lib/providers.ts","../../src/server/cache/models.ts","../../src/server/cache/utils.ts","../../src/server/cache/cache-tags.ts","../../src/server/cache/cache-key.ts","../../src/server/server-loader-runner.ts","../../src/server/provide-server-loader-runner.ts","../../src/server/middleware/loader-data-service-middleware.ts","../../src/server/middleware/sitecore-edge-webhook-revalidation.ts","../../src/server/utils.ts","../../src/server/middleware/sitecore-revalidate-middleware.ts","../../src/server/cache/unstorage-loader-cache.ts","../../src/server/cache/loader-cache.ts","../../src/server/cache/demo/cache-admin-middleware.ts","../../src/server/index.ts","../../src/lib/sitecore-context.service.ts","../../src/i18n/sitecore-translate-loader.ts","../../src/i18n/locale-url-serializer.ts","../../src/components/types.ts","../../src/components/tokens.ts","../../src/components/placeholder/placeholder-utils.ts","../../src/components/sc-missing-component.component.ts","../../src/components/sc-hidden-rendering.component.ts","../../src/components/placeholder/sc-placeholder.component.ts","../../src/components/sc-form.component.ts","../../src/components/field-directives/sc-text.directive.ts","../../src/components/field-directives/utils.ts","../../src/components/field-directives/sc-image.directive.ts","../../src/components/field-directives/link-field-utils.ts","../../src/components/field-directives/sc-link.directive.ts","../../src/components/field-directives/sc-router-link.directive.ts","../../src/components/field-directives/sc-rich-text.directive.ts","../../src/public-api.ts","../../src/sitecore-content-sdk-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport type { SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport type { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Injection token for the Sitecore configuration.\r\n * Provided by `provideSitecoreAngular({ sitecoreConfig, sitecoreClient })`. Inject this to read config app-wide.\r\n * `AngularSitecoreConfig` extends `SitecoreConfig`, so consumers that previously typed the\r\n * value as `SitecoreConfig` remain structurally compatible.\r\n * @public\r\n */\r\nexport const SITECORE_CONFIG_TOKEN = new InjectionToken<AngularSitecoreConfig>(\r\n 'SITECORE_CONFIG_TOKEN'\r\n);\r\n\r\n/**\r\n * Injection token for the SitecoreClient instance.\r\n * Provided by `provideSitecoreAngular({ sitecoreConfig, sitecoreClient })` with the app-supplied client instance.\r\n * @public\r\n */\r\nexport const SITECORE_CLIENT_TOKEN = new InjectionToken<SitecoreClient>('SITECORE_CLIENT_TOKEN');\r\n\r\nexport const NOT_FOUND_ROUTE_TOKEN = new InjectionToken<string>('NOT_FOUND_ROUTE_TOKEN');\r\n\r\n/**\r\n * Injection token for the error route.\r\n * @public\r\n */\r\nexport const ERROR_ROUTE_TOKEN = new InjectionToken<string>('ERROR_ROUTE_TOKEN');\r\n","import type { Page, PageOptions, SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Resolves layout/page data for a route path using a {@link SitecoreClient} and Sitecore config.\r\n * Import your `sitecore.config` default and shared client (e.g. `getClient()`) from the app;\r\n * this stays usable from route loaders without Angular injection context.\r\n *\r\n * Future: add helpers for personalization and multisite alongside this call.\r\n * @param {string} path - Route path (e.g. `'/'` or `'/about'`).\r\n * @param {AngularSitecoreConfig} sitecoreConfig - Resolved Sitecore configuration (e.g. default export from `sitecore.config.ts`).\r\n * @param {SitecoreClient} client - Sitecore client instance (e.g. from a module singleton).\r\n * @param {{ locale?: string; site?: string }} [options] - Optional `locale` / `site` overrides.\r\n * @param {string} [options.locale] - Optional locale override.\r\n * @param {string} [options.site] - Optional site override.\r\n * @returns {Promise<Page | null>} Page layout data, or `null` if not found.\r\n * @public\r\n */\r\nexport async function resolveSitecorePage(\r\n path: string,\r\n sitecoreConfig: AngularSitecoreConfig,\r\n client: SitecoreClient,\r\n options?: { locale?: string; site?: string }\r\n): Promise<Page | null> {\r\n const pageOptions: PageOptions = {};\r\n if (options?.locale) {\r\n pageOptions.locale = options.locale || sitecoreConfig.defaultLanguage;\r\n }\r\n if (options?.site) {\r\n pageOptions.site = options.site || sitecoreConfig.defaultSite;\r\n }\r\n return client.getPage(path, pageOptions);\r\n}\r\n","import type { SitecoreConfig, SitecoreConfigInput } from '@sitecore-content-sdk/content/config';\r\nimport { defineConfig as baseDefineConfig } from '@sitecore-content-sdk/content/config';\r\n\r\n/**\r\n * Reads `process.env` when running under Node; otherwise returns an empty object.\r\n * @returns {Record<string, string | undefined>} Environment map for merging into config.\r\n */\r\nfunction getProcessEnv(): Record<string, string | undefined> {\r\n // Use globalThis so we do not need @types/node (lib tsconfig uses \"types\": []).\r\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\r\n ?.env;\r\n return env ? env : {};\r\n}\r\n\r\n/**\r\n * Sitecore configuration input for Angular apps. Extends the base\r\n * {@link SitecoreConfigInput} with an `angular` section. `redirects.locales` is intentionally\r\n * omitted from the input — it is derived from `angular.locales` so there is a single\r\n * source of truth for the locale list.\r\n * @public\r\n */\r\nexport interface AngularSitecoreConfigInput extends Omit<SitecoreConfigInput, 'redirects'> {\r\n /**\r\n * Settings for redirects functionality. `locales` is derived automatically from\r\n * `angular.locales`; only `enabled` is configurable at this layer.\r\n */\r\n redirects?: Omit<NonNullable<SitecoreConfigInput['redirects']>, 'locales'>;\r\n /** Angular-specific configuration. */\r\n angular?: {\r\n /**\r\n * Locales supported by the Angular app.\r\n * `defaultLanguage` is prepended automatically when absent.\r\n */\r\n locales?: string[];\r\n /**\r\n * Configuration for the ISR-like cache. Both fields default when omitted\r\n * (`enabled: true`, `revalidate: 300`).\r\n */\r\n loadersCache?: {\r\n /** Whether the cache is enabled. */\r\n enabled?: boolean;\r\n /** The global revalidate time in seconds. */\r\n revalidate?: number;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Resolved Sitecore configuration for Angular apps. Extends the fully-resolved\r\n * {@link SitecoreConfig}; structurally still a `SitecoreConfig`, so existing callers that\r\n * type the value as `SitecoreConfig` continue to work. `redirects.locales` is intentionally\r\n * omitted at the type level — read the canonical locale list from `angular.locales`.\r\n * @public\r\n */\r\nexport interface AngularSitecoreConfig extends Omit<SitecoreConfig, 'redirects'> {\r\n redirects: Omit<SitecoreConfig['redirects'], 'locales'>;\r\n angular: {\r\n /** Resolved locales for the Angular app. Always contains at least `defaultLanguage`. */\r\n locales: string[];\r\n /**\r\n * Resolved configuration for the ISR-like cache. Defaults are applied by\r\n * `defineConfig`: `enabled: true`, `revalidate: 300`.\r\n */\r\n loadersCache: {\r\n enabled: boolean;\r\n revalidate: number;\r\n };\r\n };\r\n}\r\n\r\n/** Defaults applied to `angular.loadersCache` when input omits fields. */\r\nconst DEFAULT_ISR_CACHE = { enabled: true, revalidate: 300 } as const;\r\n\r\n/**\r\n * Ensures `defaultLanguage` is present in the locales list (prepended when missing) and\r\n * returns an empty-input fallback of `[defaultLanguage]`.\r\n * @param {string[]} input - Locales from `sitecore.config` (may be empty).\r\n * @param {string} defaultLanguage - Resolved `defaultLanguage` from the base config.\r\n * @returns {string[]} Locales with `defaultLanguage` guaranteed.\r\n */\r\nfunction resolveLocales(input: string[], defaultLanguage: string): string[] {\r\n if (!input || input.length === 0) {\r\n return [defaultLanguage];\r\n }\r\n if (input.includes(defaultLanguage)) {\r\n return [...input];\r\n }\r\n return [defaultLanguage, ...input];\r\n}\r\n\r\n/**\r\n * Merges `clientEnv` (browser-safe `environment*.ts`) with `process.env` for server-only variables,\r\n * then delegates to the base content `defineConfig` and adds the Angular-specific config layer.\r\n *\r\n * - `angular.locales` is the single source of truth for the locale list; `defaultLanguage` is\r\n * added when missing.\r\n * - `redirects.locales` is overwritten from `angular.locales` so the redirects proxy stays in sync.\r\n *\r\n * On Node/SSR, load `.env` in the app entry before importing `sitecore.config` (see\r\n * `load-env.ts` in the sample).\r\n * @param {AngularSitecoreConfigInput} [config] - Base Sitecore configuration input.\r\n * @param {Record<string, string | undefined>} [clientEnv] - Browser-safe env from `environment*.ts`.\r\n * @returns {AngularSitecoreConfig} Fully merged Sitecore configuration for Angular.\r\n * @public\r\n */\r\nexport function defineConfig(\r\n config: AngularSitecoreConfigInput = {},\r\n clientEnv: Record<string, string | undefined> = {}\r\n): AngularSitecoreConfig {\r\n const { angular, ...baseInput } = config;\r\n const scConfig = baseDefineConfig(baseInput as SitecoreConfigInput, {\r\n ...clientEnv,\r\n ...getProcessEnv(),\r\n });\r\n\r\n const locales = resolveLocales(angular?.locales ?? [], scConfig.defaultLanguage);\r\n\r\n scConfig.redirects.locales = locales;\r\n\r\n const loadersCache = {\r\n enabled: angular?.loadersCache?.enabled ?? DEFAULT_ISR_CACHE.enabled,\r\n revalidate: angular?.loadersCache?.revalidate ?? DEFAULT_ISR_CACHE.revalidate,\r\n };\r\n\r\n return {\r\n ...scConfig,\r\n angular: { locales, loadersCache },\r\n } as AngularSitecoreConfig;\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport type { LoaderFn } from './models';\r\n\r\n/**\r\n * Optional endpoint path for loader data fetch (e.g. '/_data' or '/api/data').\r\n * When null or undefined, LOADER_DATA_ENDPOINT is used.\r\n * @public\r\n */\r\nexport const FETCH_DATA_ENDPOINT = new InjectionToken<string | null | undefined>(\r\n 'FETCH_DATA_ENDPOINT'\r\n);\r\n\r\n/**\r\n * Cross-boundary loader registry — maps loader IDs to loader functions.\r\n * The same registry is used for SSR, CSR (`/_data`), and route resolvers.\r\n * There is no separate server vs client loader set.\r\n * @public\r\n */\r\nexport type LoaderRegistry = Record<string, LoaderFn>;\r\n\r\nexport const LOADER_REGISTRY = new InjectionToken<LoaderRegistry>('LOADER_REGISTRY');\r\n\r\n/**\r\n * Registers the app's loader registry for DI. Pass the loaders your app uses\r\n * (e.g. page, '404', '500'). Use the **same object** with\r\n *createLoaderDataServiceMiddleware in `server.ts` so SSR and CSR\r\n * navigations resolve the same loader functions.\r\n * @param {LoaderRegistry} loaders - Map of loader id to loader function\r\n * @public\r\n */\r\nexport const provideLoaderRegistry = (loaders: LoaderRegistry): Provider[] => {\r\n return [\r\n {\r\n provide: LOADER_REGISTRY,\r\n useValue: { ...loaders },\r\n },\r\n ];\r\n};\r\n\r\n/**\r\n * Symbol used to tag resolver functions with their loader ID.\r\n * This allows the prefetch service to identify loader resolvers in the route tree.\r\n * @internal\r\n */\r\nexport const LOADER_ID = Symbol('loaderId');\r\n","/**\r\n * Default path for the data endpoint used by loaders.\r\n * This path will be requested by the client-side loader resolver to fetch data for the current route.\r\n * @public\r\n */\r\nexport const LOADER_DATA_ENDPOINT = '/_data';\r\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Params } from '@angular/router';\r\nimport { LoaderApiRequest, LoaderApiResponse, LoaderCacheConfig } from './models';\r\nimport { LOADER_DATA_ENDPOINT } from '../server/constants';\r\nimport { FETCH_DATA_ENDPOINT } from './loader-registry.token';\r\n\r\n/**\r\n * Staging key for prefetched loader responses (browser-only, consume-once).\r\n * @param {string} loaderId - Loader identifier\r\n * @param {string} url - Request URL\r\n * @returns Staging key string\r\n */\r\nfunction requestKey(loaderId: string, url: string): string {\r\n return `loader:${loaderId}:${url}`;\r\n}\r\n\r\n/**\r\n * Request parameters for fetching loader data\r\n * @public\r\n */\r\nexport interface LoaderDataRequest {\r\n url: string;\r\n loaderId: string;\r\n params?: Params;\r\n query?: Record<string, string | string[]>;\r\n /**\r\n * Per-route cache overrides from `loaderResolver(id, cacheOptions)`. Sent\r\n * to the server in the POST body so server-side cache policy matches the\r\n * route's intent on CSR navigations. Phase 5 of the refactor plan.\r\n */\r\n cacheOptions?: LoaderCacheConfig;\r\n}\r\n\r\n/**\r\n * Loader data client for browser loader data resolution. POSTs to the `/_data` endpoint and holds\r\n * short-lived prefetched responses for parallel navigation prefetching.\r\n * Not aware of the server-side {@link LoaderCache}.\r\n * @public\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ClientLoaderDataService {\r\n private readonly prefetchedResponses = new Map<string, LoaderApiResponse>();\r\n private readonly pending = new Map<string, Promise<LoaderApiResponse>>();\r\n private readonly http = inject(HttpClient);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly fetchDataEndpoint =\r\n inject(FETCH_DATA_ENDPOINT, { optional: true }) ?? LOADER_DATA_ENDPOINT;\r\n\r\n /**\r\n * Prefetch loader data for the given request without consuming staged responses.\r\n * If a response is already staged or a request is pending, does nothing.\r\n * Otherwise starts a fetch and stores the result for a later getData() call.\r\n * Used by PreLoaderDataService to warm responses for all loaders in a route in parallel.\r\n * @param {LoaderDataRequest} loaderRequest - The loader data request\r\n */\r\n prefetch(loaderRequest: LoaderDataRequest): void {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n const key = requestKey(loaderRequest.loaderId, loaderRequest.url);\r\n if (this.prefetchedResponses.has(key) || this.pending.has(key)) {\r\n return;\r\n }\r\n const promise = this.fetchData(loaderRequest);\r\n this.pending.set(key, promise);\r\n promise.then(() => {\r\n // Result is already stored in prefetchedResponses by fetchData\r\n });\r\n }\r\n\r\n /**\r\n * Get data for the given request, using staged prefetched responses or fetching if needed.\r\n * If a request is already pending for this URL/loader combination,\r\n * waits for it to complete instead of making a duplicate request.\r\n * Consumes (removes) staged responses after retrieval.\r\n * @param {LoaderDataRequest} request - The loader data request\r\n * @returns {Promise<LoaderApiResponse>} Promise resolving to the API response\r\n */\r\n async getData(request: LoaderDataRequest): Promise<LoaderApiResponse> {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return {\r\n kind: 'error',\r\n status: 500,\r\n message: 'ClientLoaderDataService only works in browser',\r\n };\r\n }\r\n\r\n const key = requestKey(request.loaderId, request.url);\r\n\r\n const staged = this.prefetchedResponses.get(key);\r\n if (staged !== undefined) {\r\n this.prefetchedResponses.delete(key);\r\n return staged;\r\n }\r\n\r\n // Wait for pending loader data request if one exists\r\n const pendingRequest = this.pending.get(key);\r\n if (pendingRequest) {\r\n return pendingRequest;\r\n }\r\n\r\n // Make new request; add to pending so concurrent callers reuse the same promise\r\n const pendingFetchData = this.fetchData(request);\r\n this.pending.set(key, pendingFetchData);\r\n return pendingFetchData;\r\n }\r\n\r\n /**\r\n * Fetch data from the configured data endpoint.\r\n * Callers (getData, prefetch) add the returned promise to pending; it is removed\r\n * in finally when the promise settles.\r\n * @param {LoaderDataRequest} request - The loader data request\r\n * @returns {Promise<LoaderApiResponse>} Promise resolving to the API response\r\n */\r\n private async fetchData(request: LoaderDataRequest): Promise<LoaderApiResponse> {\r\n const key = requestKey(request.loaderId, request.url);\r\n const endpoint = this.fetchDataEndpoint;\r\n const reqBody: LoaderApiRequest = {\r\n loaderId: request.loaderId,\r\n url: request.url,\r\n params: request.params ?? {},\r\n query: request.query ?? {},\r\n cacheOptions: request.cacheOptions,\r\n };\r\n\r\n try {\r\n const resp = await firstValueFrom(\r\n this.http.post<LoaderApiResponse>(endpoint, reqBody, { cache: 'no-store' })\r\n );\r\n if (!resp) {\r\n const message = `No response from ${endpoint}`;\r\n return { kind: 'error', status: 500, message } as LoaderApiResponse;\r\n }\r\n if (resp.kind === 'data') {\r\n this.prefetchedResponses.set(key, resp);\r\n } else if (resp.kind === 'redirect') {\r\n this.prefetchedResponses.set(key, resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Fetch failed';\r\n return { kind: 'error', status: 500, message } as LoaderApiResponse;\r\n } finally {\r\n this.pending.delete(key);\r\n }\r\n }\r\n}\r\n","import { RedirectCommand } from '@angular/router';\r\nimport type { Router } from '@angular/router';\r\nimport { RequestContext } from './models';\r\n\r\n/**\r\n * Apply a redirect: internal URLs → RedirectCommand; external URLs → full page navigation.\r\n * Use in resolvers and in the navigation error handler (fallback) so redirect behavior is consistent.\r\n * Redirects are not errors; this helper is the single place that defines how to perform them.\r\n * @param {Router} router - Angular Router (for internal redirects)\r\n * @param {string} location - Target URL (path or full URL)\r\n * @returns RedirectCommand for internal, void after window.location.assign for external\r\n * @public\r\n */\r\nexport function applyRedirect(router: Router, location: string): RedirectCommand | void {\r\n // TODO: implement server-side redirect with custom status code when implementing SXA redirects proxy\r\n const isExternal = /^https?:\\/\\//i.test(location);\r\n if (isExternal) {\r\n if (typeof window !== 'undefined') {\r\n window.location.assign(location);\r\n }\r\n return;\r\n }\r\n return new RedirectCommand(router.parseUrl(location), {});\r\n}\r\n\r\n/**\r\n * Express-like request object interface\r\n */\r\ninterface ExpressLikeRequest {\r\n headers?: Record<string, string | string[] | undefined>;\r\n cookies?: Record<string, string>;\r\n query?: Record<string, string | string[] | undefined>;\r\n}\r\n\r\n/**\r\n * Parse query parameters from URL\r\n * @param {string} url - The URL to parse\r\n * @returns {Record<string, string | string[] | undefined>} The query parameters\r\n */\r\nfunction parseQueryFromUrl(url: string): Record<string, string | string[] | undefined> {\r\n try {\r\n const urlObj = new URL(url);\r\n const query: Record<string, string | string[] | undefined> = {};\r\n urlObj.searchParams.forEach((value, key) => {\r\n const existing = query[key];\r\n if (existing) {\r\n if (Array.isArray(existing)) {\r\n existing.push(value);\r\n } else {\r\n query[key] = [existing, value];\r\n }\r\n } else {\r\n query[key] = value;\r\n }\r\n });\r\n return query;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Convert Headers object to plain object\r\n * @param {Headers} headers - The Headers object to convert\r\n * @returns {Record<string, string | string[] | undefined>} The headers\r\n */\r\nfunction headersToObject(headers: Headers): Record<string, string | string[] | undefined> {\r\n const result: Record<string, string | string[] | undefined> = {};\r\n headers.forEach((value, key) => {\r\n result[key.toLowerCase()] = value;\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * Parse cookies from a cookie header string\r\n * @param {string | null} cookieHeader - The cookie header string to parse\r\n * @returns {Record<string, string>} The cookies\r\n */\r\nfunction parseCookieHeader(cookieHeader: string | null): Record<string, string> {\r\n if (!cookieHeader) return {};\r\n const cookies: Record<string, string> = {};\r\n cookieHeader.split(';').forEach((cookie) => {\r\n const [name, ...rest] = cookie.trim().split('=');\r\n if (name) {\r\n cookies[name] = rest.join('=');\r\n }\r\n });\r\n return cookies;\r\n}\r\n\r\n/**\r\n * Extracts request context from a request object.\r\n * Supports both Fetch API Request objects (from Angular's REQUEST token) and Express-like request objects.\r\n * @param {Request | ExpressLikeRequest} req - The request object (Fetch API Request or Express-like object)\r\n * @returns {RequestContext} The request context\r\n * @example\r\n * ```typescript\r\n * import { extractRequestContext } from '@sitecore-content-sdk/angular/server';\r\n *\r\n * // From Express request\r\n * const requestContext = extractRequestContext(expressReq);\r\n *\r\n * // From Fetch API Request (Angular's REQUEST token)\r\n * const requestContext = extractRequestContext(request);\r\n * ```\r\n * @public\r\n */\r\nexport function extractRequestContext(req: Request | ExpressLikeRequest): RequestContext {\r\n // Check if it's a Fetch API Request object\r\n if (req instanceof Request) {\r\n const headers = headersToObject(req.headers);\r\n const cookies = parseCookieHeader(req.headers.get('cookie'));\r\n const query = parseQueryFromUrl(req.url);\r\n\r\n // Extract hostname from URL\r\n let hostname: string | undefined;\r\n try {\r\n hostname = new URL(req.url).hostname;\r\n } catch {\r\n // URL parsing failed, hostname will be resolved from headers\r\n }\r\n\r\n return {\r\n hostname,\r\n headers,\r\n cookies,\r\n query,\r\n };\r\n }\r\n\r\n const hostHeader = req.headers?.host;\r\n const hostname = pickHostnameFromHostHeader(\r\n Array.isArray(hostHeader) ? hostHeader[0] : hostHeader\r\n );\r\n return {\r\n hostname,\r\n headers: req.headers,\r\n cookies: req.cookies,\r\n query: req.query,\r\n };\r\n}\r\n\r\n/**\r\n * Pick the hostname from the host header\r\n * @param {string | undefined} host - The host header\r\n * @returns {string | undefined} The hostname\r\n */\r\nfunction pickHostnameFromHostHeader(host: string | undefined): string | undefined {\r\n if (!host) return undefined;\r\n const colon = host.indexOf(':');\r\n return colon === -1 ? host : host.slice(0, colon);\r\n}\r\n","import type { Params } from '@angular/router';\r\nexport const DEFAULT_NOT_FOUND_ROUTE = '/404';\r\nexport const DEFAULT_ERROR_ROUTE = '/500';\r\n\r\n/**\r\n * Request context containing information from the incoming HTTP request.\r\n * Used for request-dependent operations in loaders.\r\n * @public\r\n */\r\nexport interface RequestContext {\r\n /**\r\n * The hostname from the request (without port)\r\n */\r\n hostname?: string;\r\n /**\r\n * Cookies from the request\r\n */\r\n cookies?: Record<string, string>;\r\n /**\r\n * Query parameters from the request\r\n */\r\n query?: Record<string, string | string[] | undefined>;\r\n /**\r\n * Headers from the request\r\n */\r\n headers?: Record<string, string | string[] | undefined>;\r\n}\r\n\r\n/**\r\n * Context provided to loader functions.\r\n * Contains information about the current request including URL, params, query, and request context.\r\n * @public\r\n */\r\nexport type LoaderContext = {\r\n /**\r\n * The current URL path\r\n */\r\n url: string;\r\n /**\r\n * Route parameters from all matched segments.\r\n *\r\n * When locales are configured and the route tree uses `scLocaleMatcher`, the matched\r\n * locale is exposed as `params.locale`. The resolver also defaults `params.locale` to\r\n * `defaultLanguage` from `sitecore.config` when no locale segment was matched — loaders\r\n * can rely on a concrete `params.locale` regardless of URL shape.\r\n */\r\n params: Params;\r\n /**\r\n * Query string parameters\r\n */\r\n query: Record<string, string | string[]>;\r\n /**\r\n * Server-only: the incoming request\r\n */\r\n req?: Request;\r\n /**\r\n * Server-only: the response object\r\n */\r\n res?: Response;\r\n /**\r\n * Server-only: context from the incoming HTTP request.\r\n * Contains hostname, cookies, query params, and headers.\r\n * Use with createSiteResolver() to determine the current site.\r\n * @example\r\n * ```typescript\r\n * const resolveSite = createSiteResolver({ sites, defaultSite: config.defaultSite });\r\n *\r\n * export const pageLoader: LoaderFn = async (ctx) => {\r\n * if (ctx.requestContext) {\r\n * const { site } = resolveSite(ctx.requestContext);\r\n * return client.getPage(ctx.url, { site: site.name });\r\n * }\r\n * return client.getPage(ctx.url);\r\n * };\r\n * ```\r\n */\r\n requestContext?: RequestContext;\r\n};\r\n\r\nexport type LoaderApiRequest = {\r\n loaderId: string;\r\n url: string;\r\n params: Params;\r\n query: Record<string, any>;\r\n /**\r\n * Server-derived request context (hostname, headers, cookies, query).\r\n * Populated once at the request boundary (`/_data` middleware closure or the\r\n * SSR resolver). Downstream code reads this directly; nobody re-extracts.\r\n * Phase 2 of the refactor plan.\r\n */\r\n angularRequestContext?: RequestContext;\r\n /**\r\n * Per-route cache overrides supplied at the `loaderResolver(id, cacheOptions)`\r\n * call site. The browser includes them in the `/_data` POST body so the same\r\n * per-route policy applies on CSR navigations. Phase 5 of the refactor plan.\r\n */\r\n cacheOptions?: LoaderCacheConfig;\r\n};\r\n\r\nexport type LoaderRedirectResult = {\r\n loaderRedirectTarget: string;\r\n status?: number;\r\n};\r\n\r\n/**\r\n * Type guard for redirect results returned by loaders.\r\n * @param {unknown} v - Value to check\r\n * @internal\r\n */\r\nexport function isLoaderRedirectResult(v: unknown): v is LoaderRedirectResult {\r\n return (\r\n typeof v === 'object' &&\r\n v !== null &&\r\n 'loaderRedirectTarget' in v &&\r\n typeof (v as LoaderRedirectResult).loaderRedirectTarget === 'string'\r\n );\r\n}\r\n\r\nexport type LoaderApiResponse =\r\n | { kind: 'data'; data: any }\r\n | { kind: 'redirect'; redirect: LoaderRedirectResult }\r\n | { kind: 'error'; status: number; message: string }\r\n | { kind: 'notFound'; status: number };\r\n\r\n/**\r\n * Result returned by loader resolution on the server (SSR and `/_data` endpoint).\r\n * Uses the shared cross-boundary loader registry; not a separate server loader set.\r\n * @public\r\n */\r\nexport type LoaderDataResult =\r\n | { kind: 'data'; data: unknown }\r\n | { kind: 'redirect'; redirect: LoaderRedirectResult }\r\n | { kind: 'error'; status: number; message: string; cause?: unknown };\r\n\r\n/**\r\n * Loader function type.\r\n * A loader is an async function that receives context, can be applied in route resolvers and can return:\r\n * - data - any data that can be serialized and stored in the transfer state\r\n * - redirect - a redirect to be applied to the router\r\n * - throw error - an error that occurred during the retrieval of the data\r\n * @public\r\n */\r\nexport type LoaderFn<T = unknown> = (ctx: LoaderContext) => Promise<T> | T | LoaderRedirectResult;\r\n\r\nexport class NotFoundNavigationError extends Error {\r\n constructor(message = 'Not Found') {\r\n super(message);\r\n }\r\n}\r\n\r\nexport class LoaderHttpError extends Error {\r\n constructor(public status: number, message = 'Content SDK Loader Error') {\r\n super(message);\r\n }\r\n}\r\n\r\n/**\r\n * Base browser-safe config type for loader cache.\r\n *\r\n * `revalidate` is in seconds. A positive value caches the entry for that many\r\n * seconds; `0` or a negative value means \"never expire\" (rely on explicit\r\n * invalidation). There is no `'infinite'` sentinel.\r\n * @public\r\n */\r\nexport interface LoaderCacheConfig extends PerRouteLoaderCacheConfig {\r\n /** Default site name for tag helpers and admin tooling. Defaults to `'default'`. */\r\n defaultSiteName?: string;\r\n /**\r\n * Site names used by revalidation middleware to fan out dictionary loader tags\r\n * (`sc:loader:dictionary:<site>:<locale>`) on every webhook call.\r\n */\r\n sites?: string[];\r\n /** Fallback locale for tag helpers when a site entry has no `language`. Defaults to `'en'`. */\r\n defaultLocale?: string;\r\n}\r\n\r\n/**\r\n * Per-route cache configuration.\r\n * @public\r\n */\r\nexport interface PerRouteLoaderCacheConfig {\r\n /** TTL in seconds. Positive → expires after N seconds; `0` or negative → never expires. */\r\n revalidate?: number;\r\n /** Master switch — when false, every call falls through to the raw loader. */\r\n enabled?: boolean;\r\n /**\r\n * Custom tags applied to every entry this loader writes. Merged with built-in\r\n * OSR tags (self-key, `sc:site`, `sc:locale`, and `sc:item` for page loaders).\r\n */\r\n tags?: string[];\r\n}\r\n\r\n/**\r\n * Metadata returned by cache.entries() — sufficient for an admin UI without\r\n * shipping the cached values themselves (which can be large).\r\n * @public\r\n */\r\nexport interface LoaderCacheEntryInfo {\r\n key: string;\r\n tags: string[];\r\n storedAt: number;\r\n expiresAt: number | null;\r\n stale: boolean;\r\n}\r\n\r\n/**\r\n * Three-outcome read result for stale-while-revalidate (Phase 3).\r\n *\r\n * - `hit` — entry is fresh; serve cached value without running the loader.\r\n * - `stale` — entry expired or was invalidated; serve cached value and refresh in the background.\r\n * - `miss` — no entry; run the loader synchronously.\r\n * @public\r\n */\r\nexport type LoaderCacheReadResult =\r\n /** Fresh cache entry within TTL and not marked stale. */\r\n | { kind: 'hit'; value: unknown; cacheKey: string }\r\n /** Expired or invalidated entry; value is served while a background refresh runs. */\r\n | { kind: 'stale'; value: unknown; cacheKey: string }\r\n /** No entry stored for the requested cache key. */\r\n | { kind: 'miss'; cacheKey: string };\r\n\r\n/**\r\n * Persisted cache entry shape. Stored under the composite cache key built by\r\n * buildCacheKey(); see cache-key.ts.\r\n * @public\r\n */\r\nexport interface LoaderCacheEntry {\r\n value: unknown;\r\n tags: string[];\r\n storedAt: number;\r\n expiresAt: number | null; // null = never expire\r\n /** When true (or TTL expired), entry is served stale while refreshing. */\r\n stale: boolean;\r\n}\r\n\r\n/**\r\n * Tag-based invalidation input.\r\n * Marks matching entries stale via the tag index; does not delete them (SWR semantics).\r\n * @public\r\n */\r\nexport interface InvalidateInput {\r\n /** Non-empty list of OSR tags (for example `sc:item:…`, `sc:site:…`, or a cache key self-tag). */\r\n tags?: string[];\r\n}\r\n\r\n/**\r\n * Server-only cache instance. Constructed once in `server.ts` via\r\n * `createLoaderCache` (see `server/cache`) and passed by reference to middleware factories\r\n * (`createLoaderDataServiceMiddleware`, `createCacheAdminMiddleware`,\r\n * `createSitecoreRevalidateMiddleware`; see `server/middleware`) and to Angular SSR through\r\n * `angularApp.handle(req, { cache })`.\r\n *\r\n * Implementations maintain a sidecar tag index so `LoaderCache.invalidate`\r\n * can mark entries stale without scanning every key.\r\n * @public\r\n */\r\nexport interface LoaderCache {\r\n /** Global default TTL in seconds from {@link LoaderCacheConfig.revalidate}. */\r\n get ttl(): number;\r\n /** Resolved configuration (useful for admin UI and diagnostics). */\r\n get config(): Readonly<LoaderCacheConfig>;\r\n /**\r\n * Reads a cache entry and classifies it as hit, stale, or miss.\r\n * @param key - OSR-aligned cache key (for example `sc:loader:page:demo:en:default:about`).\r\n */\r\n get(key: string): Promise<LoaderCacheReadResult>;\r\n /**\r\n * Stores an entry and links it to the supplied tag set.\r\n * @param key - Cache key to write.\r\n * @param value - Loader payload to persist.\r\n * @param ttlSeconds - TTL in seconds; `0` or negative means never expire.\r\n * @param tags - Tag index pointers written alongside the entry (self-key, site, locale, item, etc.).\r\n */\r\n set(key: string, value: unknown, ttlSeconds: number, tags: string[]): Promise<void>;\r\n /**\r\n * Marks every entry linked to any of the supplied tags as stale.\r\n * @param filter - Tag list to resolve through the tag index.\r\n * @returns Number of entries marked stale (includes entries already stale).\r\n */\r\n invalidate(filter: InvalidateInput): Promise<number>;\r\n /** Removes a single entry and unlinks it from the tag index. */\r\n delete(key: string): Promise<boolean>;\r\n /** Removes every entry and clears the tag index. */\r\n flush(): Promise<void>;\r\n /** Returns lightweight metadata for admin tooling (values are omitted). */\r\n entries(): Promise<LoaderCacheEntryInfo[]>;\r\n /** Whether caching is enabled globally. Per-route overrides may still opt in. */\r\n enabled(): boolean;\r\n}\r\n","import type { UrlMatcher, UrlMatchResult, UrlSegment } from '@angular/router';\r\n\r\n/**\r\n * Result of locale extraction from a URL path.\r\n * @public\r\n */\r\nexport interface LocaleExtractionResult {\r\n /** Configured locale found at the start of the path, or `null` when absent. */\r\n locale: string | null;\r\n /** Remainder of the path after the locale segment (always starts with `/`). */\r\n nonLocalePath: string;\r\n /** Query or fragment string found at the end of the path, or `null` when absent. */\r\n queryFragment?: string;\r\n}\r\n\r\n/**\r\n * Parses a normalized pathname into its first segment, remainder path, and query/fragment suffix.\r\n * Groups: (1) first segment, (2) rest of path including leading slash, (3) ?query and/or #fragment.\r\n */\r\nconst PATH_PARTS_REGEX = /^\\/([^/?#]*)(\\/[^?#]*)?([?#].*)?$/;\r\n\r\n/**\r\n * Extracts a configured locale from the first segment of a URL pathname.\r\n * Returns `{ locale: null, nonLocalePath: pathname, queryFragment: query or fragment string }` when the first segment is not a configured locale.\r\n * @param {string} pathname - URL pathname, with or without leading `/`.\r\n * @param {string[]} locales - Configured locales.\r\n * @returns {LocaleExtractionResult} Detected locale and the rest of the path.\r\n * @public\r\n */\r\nexport function splitLocaleFromPath(pathname: string, locales: string[]): LocaleExtractionResult {\r\n if (!pathname) {\r\n return { locale: null, nonLocalePath: '/' };\r\n }\r\n const normalized = pathname.startsWith('/') ? pathname : `/${pathname}`;\r\n const [, firstSegment = '', restPath = '', queryFragment = undefined] =\r\n normalized.match(PATH_PARTS_REGEX) ?? [];\r\n\r\n if (firstSegment && locales.includes(firstSegment)) {\r\n return { locale: firstSegment, nonLocalePath: restPath || '/', queryFragment };\r\n }\r\n return { locale: null, nonLocalePath: `/${firstSegment}${restPath}`, queryFragment };\r\n}\r\n\r\n/**\r\n * Creates an Angular {@link UrlMatcher} that consumes a configured-locale segment from\r\n * the start of a route. When the first URL segment matches one of scConfig's `locales`, it is consumed\r\n * and exposed as the `locale` route param. Otherwise zero segments are consumed and the\r\n * route still matches (so error routes and the catchall handle both prefixed and unprefixed\r\n * URLs from the same route tree).\r\n * @param {string[]} locales - Configured locales.\r\n * @returns {UrlMatcher} Angular URL matcher for locale-prefixed route trees.\r\n * @public\r\n */\r\nexport function scLocaleMatcher(locales: string[]): UrlMatcher {\r\n return (segments: UrlSegment[]): UrlMatchResult => {\r\n if (segments.length > 0 && locales.includes(segments[0].path)) {\r\n return { consumed: [segments[0]], posParams: { locale: segments[0] } };\r\n }\r\n return { consumed: [] };\r\n };\r\n}\r\n\r\n/**\r\n * Resolves the initial URL pathname from the current execution environment.\r\n * Returns `'/'` when neither REQUEST nor `window.location` is available.\r\n * @param {Request | null} req - SSR REQUEST token value, when present.\r\n * @param {boolean} isBrowser - Whether the current platform is the browser.\r\n * @returns {string} URL pathname suitable for locale extraction.\r\n */\r\nexport function resolveCurrentPath(req: Request | null, isBrowser: boolean): string {\r\n if (req) {\r\n try {\r\n return new URL(req.url).pathname;\r\n } catch {\r\n // fall through to browser/default\r\n }\r\n }\r\n if (isBrowser && typeof window !== 'undefined' && window.location) {\r\n return window.location.pathname;\r\n }\r\n return '/';\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { RedirectCommand, Router } from '@angular/router';\r\nimport type { NavigationError } from '@angular/router';\r\nimport { DEFAULT_ERROR_ROUTE, DEFAULT_NOT_FOUND_ROUTE, NotFoundNavigationError } from './models';\r\nimport { ERROR_ROUTE_TOKEN, NOT_FOUND_ROUTE_TOKEN, SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { splitLocaleFromPath } from '../i18n/locale-utils';\r\n\r\n/**\r\n * Normalizes a URL path (strip leading slash and query) for comparison.\r\n * @param {string} url - URL or path string\r\n * @returns Normalized path segment\r\n */\r\nfunction normalizePath(url: string): string {\r\n return url.replace(/^\\//, '').split('?')[0];\r\n}\r\n\r\n/**\r\n * Resolves a navigation error to a RedirectCommand or void.\r\n * Handles loader exceptions (NotFoundNavigationError and other errors) and prevents redirect loops\r\n * when the failed navigation was already to the not-found route or the error route.\r\n * Must be called from an injection context (uses NOT_FOUND_ROUTE_TOKEN, ERROR_ROUTE_TOKEN, Router).\r\n *\r\n * **HTTP status codes (SSR):** RedirectCommand only triggers navigation to the not-found or error\r\n * route; it does not set the HTTP response status. To return 404 or 500 when those pages are\r\n * rendered on the server, configure your app so the server sends the correct status. For example,\r\n * in `app.routes.server.ts` add ServerRoute entries for your not-found and error paths with\r\n * `status: 404` and `status: 500` (see Angular \"Setting headers and status codes\" in the SSR guide).\r\n * Alternatively, inject `RESPONSE_INIT` in your NotFoundComponent and ErrorComponent and set the\r\n * status when running on the server.\r\n * @param {Error} err - The error from the navigation (e.g. NotFoundNavigationError or LoaderHttpError)\r\n * @param {string} failedUrl - URL that failed to load\r\n * @param {string} notFoundRoute - Path for the not-found page (e.g. '/404')\r\n * @param {string} errorRoute - Path for the error page (e.g. '/500')\r\n * @param {Router} router - Angular Router instance\r\n * @returns RedirectCommand to redirect, or void to cancel and avoid a loop\r\n * @public\r\n */\r\nexport function redirectOnNavigationError(\r\n err: Error,\r\n failedUrl: string,\r\n notFoundRoute: string,\r\n errorRoute: string,\r\n router: Router\r\n): RedirectCommand | void {\r\n console.log('Navigation error occurred on url: ' + failedUrl, err.message);\r\n\r\n const kind: 'error' | 'notFound' = err instanceof NotFoundNavigationError ? 'notFound' : 'error';\r\n\r\n const failedPath = normalizePath(failedUrl);\r\n const notFoundPath = normalizePath(notFoundRoute);\r\n const errorPath = normalizePath(errorRoute);\r\n\r\n if (kind === 'notFound') {\r\n if (failedPath === notFoundPath) {\r\n console.log('RouteErrorHandler: Not found route was not found. Avoiding redirect loop.');\r\n return;\r\n }\r\n const urlTree = router.parseUrl(notFoundRoute);\r\n return new RedirectCommand(urlTree);\r\n }\r\n\r\n // kind === 'error'\r\n if (failedPath === errorPath) {\r\n console.log('RouteErrorHandler: Error route threw its own error. Avoiding redirect loop.');\r\n return;\r\n }\r\n const urlTree = router.parseUrl(errorRoute);\r\n return new RedirectCommand(urlTree);\r\n}\r\n\r\n/**\r\n * Returns a navigation error handler for use with withNavigationErrorHandler.\r\n * Delegates to {@link redirectOnNavigationError}.\r\n * @returns A handler compatible with `provideRouter(routes, withNavigationErrorHandler(...))`\r\n * @public\r\n */\r\nexport function handleNavigationError(): (error: NavigationError) => RedirectCommand | void {\r\n return (e: NavigationError): RedirectCommand | void => {\r\n const err = e?.error ?? e;\r\n const failedUrl = e.url ?? '';\r\n const notFoundRoute =\r\n inject(NOT_FOUND_ROUTE_TOKEN, { optional: true }) || DEFAULT_NOT_FOUND_ROUTE;\r\n const errorRoute = inject(ERROR_ROUTE_TOKEN, { optional: true }) || DEFAULT_ERROR_ROUTE;\r\n const locales = inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n const router = inject(Router);\r\n const { locale } = splitLocaleFromPath(failedUrl, locales);\r\n const targetNotFound = locale ? `/${locale}${notFoundRoute}` : notFoundRoute;\r\n const targetError = locale ? `/${locale}${errorRoute}` : errorRoute;\r\n return redirectOnNavigationError(err, failedUrl, targetNotFound, targetError, router);\r\n };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { LoaderApiRequest, LoaderDataResult } from './models';\r\n\r\n/**\r\n * SSR injection port for cache-aware loader resolution.\r\n * Implemented by `ServerLoaderRunner` and wired via\r\n * `provideServerLoaderRunner` (see the `server/express` module).\r\n * @public\r\n */\r\nexport interface ServerLoaderRunnerPort {\r\n /**\r\n * Resolve loader data on the server (cache-aware) using the shared {@link LOADER_REGISTRY}.\r\n * @param {LoaderApiRequest} request - Loader request payload\r\n * @returns {Promise<LoaderDataResult>} Resolved loader result\r\n */\r\n resolve(request: LoaderApiRequest): Promise<LoaderDataResult>;\r\n}\r\n\r\n/**\r\n * Injection token for SSR loader data resolution.\r\n * Must be provided via `provideServerLoaderRunner` in server application config.\r\n * @public\r\n */\r\nexport const SERVER_LOADER_RUNNER = new InjectionToken<ServerLoaderRunnerPort>(\r\n 'SERVER_LOADER_RUNNER'\r\n);\r\n","import { inject, TransferState, PLATFORM_ID, REQUEST, makeStateKey } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n RouterStateSnapshot,\r\n Params,\r\n ResolveFn,\r\n Router,\r\n RedirectCommand,\r\n} from '@angular/router';\r\nimport { LOADER_ID } from './loader-registry.token';\r\nimport { ClientLoaderDataService } from './client-loader-data.service';\r\nimport { extractRequestContext, applyRedirect } from './utils';\r\nimport {\r\n DEFAULT_ERROR_ROUTE,\r\n DEFAULT_NOT_FOUND_ROUTE,\r\n LoaderHttpError,\r\n NotFoundNavigationError,\r\n PerRouteLoaderCacheConfig,\r\n} from './models';\r\nimport { redirectOnNavigationError } from './router-error-handling';\r\nimport { ERROR_ROUTE_TOKEN, NOT_FOUND_ROUTE_TOKEN } from '../lib/tokens';\r\nimport { SERVER_LOADER_RUNNER } from './server-loader-runner.token';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\n/**\r\n * Create a state key for the loader\r\n * @param {string} loaderId - The loader ID\r\n * @param {string} url - The URL\r\n * @returns {StateKey} The state key\r\n */\r\nfunction stateKey(loaderId: string, url: string) {\r\n return makeStateKey<unknown>(`loader:${loaderId}:${url}`);\r\n}\r\n\r\n/**\r\n * Extension point for custom loader IDs. Augment this interface so that\r\n * loaderResolver() accepts your loader ids when you add them via provideLoaderRegistry().\r\n * @example\r\n * // In your app (e.g. app.d.ts or a types file):\r\n * declare module '@sitecore-content-sdk/angular' {\r\n * interface LoaderIdMap {\r\n * myCustomLoader: void;\r\n * }\r\n * }\r\n * // Then provideLoaderRegistry({ myCustomLoader: myLoader }) and loaderResolver('myCustomLoader') are typed.\r\n */\r\nexport interface LoaderIdMap {}\r\n\r\n/** Loader ID type. Use string keys that match the keys you pass to provideLoaderRegistry. */\r\nexport type LoaderId = keyof LoaderIdMap extends never ? string : keyof LoaderIdMap;\r\n\r\n/**\r\n * Merges params from all ancestor route segments and defaults `locale` from the resolved\r\n * Sitecore config when missing. Loaders always see a concrete `params.locale` whether or\r\n * not the locale matcher captured one from the URL.\r\n * @param {ActivatedRouteSnapshot} route - The current route snapshot.\r\n * @param {string} [defaultLanguage] - Default language to fall back to.\r\n * @returns {Params} Merged params with a guaranteed `locale` when `defaultLanguage` is set.\r\n */\r\nfunction buildLoaderParams(route: ActivatedRouteSnapshot, defaultLanguage?: string): Params {\r\n const merged = route.pathFromRoot.reduce((acc, r) => ({ ...acc, ...r.params }), {} as Params);\r\n if (!merged.locale && defaultLanguage) {\r\n merged.locale = defaultLanguage;\r\n }\r\n return merged;\r\n}\r\n\r\n/**\r\n * Browser-only: load data from transfer state or ClientLoaderDataService.\r\n * Injects TransferState, ClientLoaderDataService. Called by the resolver when isPlatformBrowser.\r\n * @param {object} options - The options for the resolveOnBrowser function\r\n * @param {ActivatedRouteSnapshot} options.route - The current route snapshot\r\n * @param {RouterStateSnapshot} options.state - The router state snapshot\r\n * @param {string} options.loaderId - loader ID to resolve, used for transfer state key and ClientLoaderDataService call\r\n * @param {Router} options.router - The Angular router instance\r\n * @param {string} [options.defaultLanguage] - Default language for locale fallback in params\r\n * @param {LoaderCacheConfig} [options.cacheOptions] - Cache options for the loader\r\n * @returns {Promise<unknown | RedirectCommand>} The resolved data or redirect command\r\n */\r\nasync function resolveOnBrowser({\r\n route,\r\n state,\r\n loaderId,\r\n router,\r\n defaultLanguage,\r\n cacheOptions,\r\n}: {\r\n route: ActivatedRouteSnapshot;\r\n state: RouterStateSnapshot;\r\n loaderId: string;\r\n router: Router;\r\n defaultLanguage?: string;\r\n cacheOptions?: PerRouteLoaderCacheConfig;\r\n}): Promise<unknown | RedirectCommand> {\r\n const transferState = inject(TransferState);\r\n const browserLoaderData = inject(ClientLoaderDataService);\r\n\r\n const url = state.url;\r\n const key = stateKey(loaderId, url);\r\n\r\n if (transferState.hasKey(key)) {\r\n const data = transferState.get(key, null);\r\n transferState.remove(key);\r\n return data;\r\n }\r\n\r\n const allParams = buildLoaderParams(route, defaultLanguage);\r\n\r\n const resp = await browserLoaderData.getData({\r\n url,\r\n loaderId,\r\n params: allParams,\r\n query: route.queryParams as Record<string, string | string[]>,\r\n cacheOptions,\r\n });\r\n\r\n if (resp.kind === 'error') {\r\n throw new LoaderHttpError(resp.status, resp.message);\r\n }\r\n if (resp.kind === 'notFound') {\r\n throw new NotFoundNavigationError();\r\n }\r\n if (resp.kind === 'redirect') {\r\n return applyRedirect(router, resp.redirect.loaderRedirectTarget);\r\n }\r\n return resp.data;\r\n}\r\n\r\n/**\r\n * Create a loader resolver function that resolver loader data with optional cache options on server or browser.\r\n * @param {LoaderId} loaderId - The loader ID\r\n * @param {PerRouteLoaderCacheConfig} [cacheOptions] - The cache options\r\n * @returns {ResolveFn<unknown>} loader resolver function\r\n */\r\nexport const loaderResolver = (\r\n loaderId: LoaderId,\r\n cacheOptions?: PerRouteLoaderCacheConfig\r\n): ResolveFn<unknown> => {\r\n const resolver = async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n const transferState = inject(TransferState);\r\n const platformId = inject(PLATFORM_ID);\r\n const request = inject(REQUEST, { optional: true });\r\n const notFoundRoute =\r\n inject(NOT_FOUND_ROUTE_TOKEN, { optional: true }) || DEFAULT_NOT_FOUND_ROUTE;\r\n const errorRoute = inject(ERROR_ROUTE_TOKEN, { optional: true }) || DEFAULT_ERROR_ROUTE;\r\n const router = inject(Router);\r\n const defaultLanguage = inject(SITECORE_CONFIG_TOKEN, { optional: true })?.defaultLanguage;\r\n\r\n const url = state.url;\r\n const key = stateKey(loaderId, url);\r\n\r\n if (isPlatformBrowser(platformId)) {\r\n try {\r\n return await resolveOnBrowser({\r\n route,\r\n state,\r\n loaderId,\r\n router,\r\n defaultLanguage,\r\n cacheOptions,\r\n });\r\n } catch (e) {\r\n // special handling for browser, as navigation error for handleNavigationError is only generated on server\r\n return redirectOnNavigationError(e as Error, url, notFoundRoute, errorRoute, router);\r\n }\r\n }\r\n\r\n const serverLoaderRunner = inject(SERVER_LOADER_RUNNER, { optional: true });\r\n if (!serverLoaderRunner) {\r\n throw new Error(\r\n 'SSR loader resolution requires provideServerLoaderRunner() in server application providers'\r\n );\r\n }\r\n\r\n const angularRequestContext = request ? extractRequestContext(request) : undefined;\r\n\r\n const result = await serverLoaderRunner.resolve({\r\n loaderId,\r\n url,\r\n params: buildLoaderParams(route, defaultLanguage),\r\n query: route.queryParams as Record<string, string | string[]>,\r\n angularRequestContext,\r\n cacheOptions,\r\n });\r\n\r\n if (result.kind === 'redirect') {\r\n return applyRedirect(router, result.redirect.loaderRedirectTarget);\r\n }\r\n\r\n if (result.kind === 'error') {\r\n const cause = result.cause;\r\n if (cause instanceof NotFoundNavigationError) throw cause;\r\n if (cause instanceof LoaderHttpError) throw cause;\r\n throw new LoaderHttpError(result.status, result.message);\r\n }\r\n\r\n transferState.set(key, result.data);\r\n return result.data;\r\n };\r\n\r\n resolver[LOADER_ID] = loaderId;\r\n\r\n return resolver;\r\n};\r\n","import { DestroyRef, inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { filter } from 'rxjs';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n ActivationStart,\r\n Params,\r\n Router,\r\n RouterStateSnapshot,\r\n} from '@angular/router';\r\nimport { ClientLoaderDataService } from './client-loader-data.service';\r\nimport { LoaderDataRequest } from './client-loader-data.service';\r\nimport { LOADER_ID } from './loader-registry.token';\r\n\r\n/**\r\n * Resolver function shape used in route config (minimal for LOADER_ID detection).\r\n * @internal\r\n */\r\ninterface ResolverWithLoaderId {\r\n [key: symbol]: string;\r\n}\r\n\r\n/**\r\n * ClientPreLoaderDataService kicks off loader data fetches for all loaders in the current route\r\n * and its parent routes in parallel, so that when Angular runs resolvers sequentially,\r\n * resolvers get staged prefetched responses or join already-pending requests instead of waiting.\r\n *\r\n * Subscribes to the router's ActivationStart event and prefetches for the\r\n * ActivatedRouteSnapshot when it is the leaf route (browser only). Discovers all loader\r\n * resolvers on that snapshot and its parents (via LOADER_ID on pathFromRoot), then\r\n * calls ClientLoaderDataService.prefetch() for each (loaderId, url, params, query). Fetches\r\n * run in parallel; results are stored in ClientLoaderDataService prefetchedResponses for getData() to consume.\r\n * @public\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ClientPreLoaderDataService {\r\n private readonly loaderData = inject(ClientLoaderDataService);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly router = inject(Router);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n this.router.events\r\n .pipe(\r\n filter((e): e is ActivationStart => e instanceof ActivationStart),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe((event) => {\r\n const snapshot = event.snapshot;\r\n if (!snapshot.children?.length) {\r\n this.prefetchForRoute(snapshot, this.router.routerState.snapshot);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Prefetch loader data for all loaders in the route tree.\r\n * Call this at the start of browser resolver execution so all loaders for the route\r\n * are kicked off in parallel before resolvers run sequentially.\r\n * No-op on server.\r\n * @param {ActivatedRouteSnapshot} route - Current route (pathFromRoot gives current and parent routes)\r\n * @param {RouterStateSnapshot} state - Current router state (use state.url for the navigation URL)\r\n */\r\n async prefetchForRoute(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n const loaders = this.collectLoaders(route, state);\r\n for (const loaderData of loaders) {\r\n this.loaderData.prefetch(loaderData);\r\n }\r\n }\r\n\r\n /**\r\n * Collect LoaderDataRequest for each resolver that has LOADER_ID on the current route\r\n * and its parent routes (pathFromRoot). Deduplicates by (loaderId, url).\r\n * @param {ActivatedRouteSnapshot} route - The current route\r\n * @param {RouterStateSnapshot} state - The router state snapshot, used for url and params\r\n */\r\n private collectLoaders(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): LoaderDataRequest[] {\r\n const loaderDataRequests: LoaderDataRequest[] = [];\r\n const breadcrump = route.pathFromRoot ?? [];\r\n\r\n for (const route of breadcrump) {\r\n if (!route) continue;\r\n const resolveDefinition = route.routeConfig?.resolve;\r\n if (resolveDefinition) {\r\n for (const resolver of Object.values(resolveDefinition)) {\r\n if (\r\n typeof resolver === 'function' &&\r\n LOADER_ID in resolver &&\r\n typeof (resolver as ResolverWithLoaderId)[LOADER_ID] === 'string'\r\n ) {\r\n const loaderId = (resolver as ResolverWithLoaderId)[LOADER_ID];\r\n const url = state.url;\r\n const params: Params = (route.pathFromRoot ?? []).reduce(\r\n (acc, r) => ({ ...acc, ...(r?.params ?? {}) }),\r\n {}\r\n );\r\n loaderDataRequests.push({\r\n loaderId,\r\n url,\r\n params,\r\n query: (route.queryParams ?? {}) as Record<string, string | string[]>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return loaderDataRequests;\r\n }\r\n}\r\n","import type { SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport { EnvironmentProviders, makeEnvironmentProviders, Provider } from '@angular/core';\r\nimport {\r\n SITECORE_CONFIG_TOKEN,\r\n SITECORE_CLIENT_TOKEN,\r\n ERROR_ROUTE_TOKEN,\r\n NOT_FOUND_ROUTE_TOKEN,\r\n} from './tokens';\r\nimport type { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Configuration for the Sitecore Angular SDK.\r\n * @public\r\n */\r\nexport interface AngularCSDKAppInit {\r\n /**\r\n * Sitecore configuration (e.g. from sitecore.config.ts).\r\n * When provided, {@link sitecoreClient} must also be set; both are registered for DI.\r\n */\r\n sitecoreConfig?: AngularSitecoreConfig;\r\n /**\r\n * Application-owned {@link SitecoreClient} instance (e.g. from a module singleton).\r\n * Required when {@link sitecoreConfig} is set; registered as {@link SITECORE_CLIENT_TOKEN}.\r\n */\r\n sitecoreClient?: SitecoreClient;\r\n notFoundRoute?: string;\r\n errorRoute?: string;\r\n}\r\n\r\n/**\r\n * Provides Sitecore Angular SDK services to the application.\r\n * Call this in your `app.config.ts` `providers` array.\r\n * @param {AngularCSDKAppInit} init SDK configuration\r\n * @param {AngularCSDKAppInit} init.sitecoreConfig - Sitecore configuration\r\n * @param {AngularCSDKAppInit} init.sitecoreClient - Sitecore client\r\n * @param {AngularCSDKAppInit} init.notFoundRoute - Not found route\r\n * @param {AngularCSDKAppInit} init.errorRoute - Error route\r\n * @returns {EnvironmentProviders} Angular environment providers\r\n * @example\r\n * // app.config.ts\r\n * import scConfig from '../sitecore.config';\r\n * import { getClient } from '../content-sdk/client/sitecore-client';\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideSitecoreAngular({ sitecoreConfig: scConfig, sitecoreClient: getClient() }),\r\n * ],\r\n * };\r\n * @public\r\n */\r\nexport function provideSitecoreAngular(init: AngularCSDKAppInit): EnvironmentProviders {\r\n const providers: Array<Provider | EnvironmentProviders> = [];\r\n\r\n if (init.sitecoreConfig !== undefined || init.sitecoreClient !== undefined) {\r\n if (init.sitecoreConfig === undefined || init.sitecoreClient === undefined) {\r\n throw new Error(\r\n 'provideSitecoreAngular: `sitecoreConfig` and `sitecoreClient` must both be provided together.'\r\n );\r\n }\r\n providers.push({ provide: SITECORE_CONFIG_TOKEN, useValue: init.sitecoreConfig });\r\n providers.push({ provide: SITECORE_CLIENT_TOKEN, useValue: init.sitecoreClient });\r\n }\r\n if (init.notFoundRoute) {\r\n providers.push({ provide: NOT_FOUND_ROUTE_TOKEN, useValue: init.notFoundRoute });\r\n }\r\n if (init.errorRoute) {\r\n providers.push({ provide: ERROR_ROUTE_TOKEN, useValue: init.errorRoute });\r\n }\r\n\r\n return makeEnvironmentProviders(providers as Parameters<typeof makeEnvironmentProviders>[0]);\r\n}\r\n","import { Driver } from 'unstorage';\r\nimport { LoaderCacheConfig } from '../../loaders/models';\r\n\r\n/** Default global revalidate TTL (seconds) when {@link LoaderCacheConfig.revalidate} is omitted. @internal */\r\nexport const DEFAULT_CACHE_TTL = 300;\r\n\r\n/**\r\n * Identity dimensions of a cache key. Derived from {@link LoaderContext} by {@link buildCacheKey}.\r\n * @internal\r\n */\r\nexport interface CacheKeyDimensions {\r\n /** Site name from route params (defaults to `'default'`). */\r\n site: string;\r\n /** Locale from route params (defaults to `'en'`). */\r\n locale: string;\r\n /** Personalization variant segment (currently always `'default'` until Phase 4). */\r\n variantId: string;\r\n /** Loader id (`page`, `dictionary`, etc.). */\r\n loaderId: string;\r\n /** Sanitized path segment from the loader URL; home route uses `'_'`. */\r\n pathKey: string;\r\n}\r\n\r\n/**\r\n * Global config for the loader cache. Consumed by `createLoaderCache()` in\r\n * the app's `server.ts`.\r\n *\r\n * Moved to separate file to avoid accidental `unstorage` imports in browser-safe code.\r\n *\r\n * Drivers are imported and instantiated in the app (e.g.\r\n * `fsDriver({ base: './.cache/loaders' })`) — the package does not own driver\r\n * selection. When `driver` is omitted, the cache falls back to its built-in\r\n * in-memory implementation.\r\n * @public\r\n */\r\nexport interface GlobalLoaderCacheConfig extends LoaderCacheConfig {\r\n /**\r\n * Unstorage `Driver` instance. Pass an imported driver — the cache wraps it\r\n * with `createStorage({ driver })` internally. Omit for the in-memory default.\r\n */\r\n driver?: Driver;\r\n}\r\n","import {\r\n LoaderCacheConfig,\r\n LoaderCacheReadResult,\r\n LoaderCacheEntry,\r\n LoaderContext,\r\n} from '../../loaders/models';\r\nimport { GlobalLoaderCacheConfig, CacheKeyDimensions, DEFAULT_CACHE_TTL } from './models';\r\n\r\n/**\r\n * Approximate serialized byte size of a cache value (demo/admin helper).\r\n * Only used for demo purposes. Remove before release.\r\n * TODO: Remove before release.\r\n * @param {unknown} value - Value to measure.\r\n * @returns {number} JSON string length, or `0` when serialization fails.\r\n */\r\nexport function approxByteSize(value: unknown): number {\r\n try {\r\n return JSON.stringify(value).length;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Removes the query string from a URL path.\r\n * @param {string} url - URL or path that may include `?query`.\r\n * @returns {string} Pathname without query string.\r\n * @internal\r\n */\r\nfunction stripQuery(url: string): string {\r\n const i = url.indexOf('?');\r\n return i === -1 ? url : url.slice(0, i);\r\n}\r\n\r\n/**\r\n * Converts a loader URL to the `pathKey` segment used in OSR-aligned cache keys.\r\n * Strips query strings, trims slashes, sanitizes segments, and removes a leading\r\n * locale prefix when it matches `params.locale`. Home resolves to `'_'`.\r\n * @param {string} url - Loader URL (may include query string).\r\n * @param {string} [locale] - Optional locale used to strip a leading `/locale` prefix.\r\n * @returns {string} Sanitized path key (`'_'` for home).\r\n * @example\r\n * ```ts\r\n * urlToPathKey('/'); // '_'\r\n * urlToPathKey('/About Us'); // 'about_us'\r\n * urlToPathKey('/en/about', 'en'); // 'about'\r\n * ```\r\n * @internal\r\n */\r\nexport function urlToPathKey(url: string, locale?: string): string {\r\n const pathname = stripQuery(url || '/').replace(/^\\/+|\\/+$/g, '');\r\n let segments = pathname ? pathname.split('/').filter(Boolean) : [];\r\n if (locale && segments[0]?.toLowerCase() === locale.toLowerCase()) {\r\n segments = segments.slice(1);\r\n }\r\n if (segments.length === 0) {\r\n return '_';\r\n }\r\n return segments.map((segment) => sanitizeSitecoreCacheSegment(segment)).join('/');\r\n}\r\n\r\n/**\r\n * Derives {@link CacheKeyDimensions} from a loader context.\r\n * Used by {@link buildCacheKey} and admin tooling.\r\n * @param {string} loaderId - Loader id being resolved.\r\n * @param {LoaderContext} ctx - Loader context (URL + route params).\r\n * @returns {CacheKeyDimensions} Parsed cache key dimensions.\r\n * @internal\r\n */\r\nexport function dimensionsFromContext(loaderId: string, ctx: LoaderContext): CacheKeyDimensions {\r\n const params = (ctx.params ?? {}) as Record<string, unknown>;\r\n const site = (params?.site as string) || 'default';\r\n const locale = (params?.locale as string) || 'en';\r\n const pathKey = urlToPathKey(ctx.url || '/', locale);\r\n\r\n return {\r\n site,\r\n locale,\r\n variantId: 'default',\r\n loaderId,\r\n pathKey,\r\n };\r\n}\r\n\r\n/**\r\n * Strips `driver` from {@link GlobalLoaderCacheConfig} before passing config to backends.\r\n * @param {GlobalLoaderCacheConfig} config - Global cache config from {@link createLoaderCache}.\r\n * @returns {LoaderCacheConfig} Backend-safe config without the unstorage driver instance.\r\n * @internal\r\n */\r\nexport function resolveConfig(config: GlobalLoaderCacheConfig): LoaderCacheConfig {\r\n const clonedConfig = { ...config };\r\n delete clonedConfig.driver;\r\n return clonedConfig;\r\n}\r\n\r\n/**\r\n * Applies defaults for every {@link LoaderCacheConfig} field.\r\n * @param {LoaderCacheConfig} [config] - Partial config from `createLoaderCache()` or a backend constructor.\r\n * @returns {Required<LoaderCacheConfig>} Fully populated config used by cache backends.\r\n * @internal\r\n */\r\nexport function applyLoaderCacheConfigDefaults(\r\n config: LoaderCacheConfig = {}\r\n): Required<LoaderCacheConfig> {\r\n return {\r\n revalidate: config.revalidate ?? DEFAULT_CACHE_TTL,\r\n enabled: config.enabled ?? true,\r\n defaultSiteName: config.defaultSiteName ?? 'default',\r\n tags: config.tags ?? [],\r\n sites: config.sites ?? [],\r\n defaultLocale: config.defaultLocale ?? 'en',\r\n };\r\n}\r\n\r\n/**\r\n * Maps a stored entry to the three-outcome read result used by {@link ServerLoaderRunner} (Phase 3 SWR).\r\n * @param {string} cacheKey - Key being read.\r\n * @param {LoaderCacheEntry | null | undefined} entry - Stored entry, if any.\r\n * @param {number} [now] - Current timestamp for TTL comparison (defaults to `Date.now()`).\r\n * @returns {LoaderCacheReadResult} Hit, stale, or miss classification.\r\n * @internal\r\n */\r\nexport function evaluateCacheRead(\r\n cacheKey: string,\r\n entry: LoaderCacheEntry | null | undefined,\r\n now = Date.now()\r\n): LoaderCacheReadResult {\r\n if (!entry) {\r\n return { kind: 'miss', cacheKey };\r\n }\r\n if (entry.stale || (entry.expiresAt !== null && entry.expiresAt <= now)) {\r\n return { kind: 'stale', value: entry.value, cacheKey };\r\n }\r\n return { kind: 'hit', value: entry.value, cacheKey };\r\n}\r\n\r\n/**\r\n * Sanitizes a segment for Sitecore cache keys and tags (lowercase, separators → `_`).\r\n * @param {string} value - Raw segment from site, locale, path, or loader id.\r\n * @returns {string} Sanitized segment safe for keys and tags.\r\n * @internal\r\n */\r\nexport function sanitizeSitecoreCacheSegment(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[/:\\s]+/g, '_');\r\n}\r\n\r\n/**\r\n * Normalizes a Sitecore item GUID for cache keys/tags (lowercase, no braces).\r\n * @param {string} itemId - Raw Sitecore item id or GUID.\r\n * @returns {string} Normalized id segment.\r\n * @internal\r\n */\r\nexport function normalizeSitecoreItemIdForCacheKey(itemId: string): string {\r\n return itemId.trim().toLowerCase().replace(/[{}]/g, '');\r\n}\r\n\r\n/**\r\n * Deduplicates strings while preserving first-seen order.\r\n * @param {string[]} values - Tag or key candidates.\r\n * @returns {string[]} Deduplicated list.\r\n * @internal\r\n */\r\nexport function dedupeCacheStrings(values: string[]): string[] {\r\n const dedupedSet = new Set<string>(values);\r\n return Array.from(dedupedSet);\r\n}\r\n","import type { RouteData } from '@sitecore-content-sdk/content/layout';\r\nimport type { Page } from '@sitecore-content-sdk/content/client';\r\nimport {\r\n normalizeSitecoreItemIdForCacheKey,\r\n sanitizeSitecoreCacheSegment,\r\n dedupeCacheStrings,\r\n} from './utils';\r\nimport type { CacheKeyDimensions } from './models';\r\n\r\n/**\r\n * Sitecore OSR namespace prefix shared with Next.js (`sc:`).\r\n * All loader cache keys and invalidation tags use this prefix.\r\n * @internal\r\n */\r\nexport const SITECORE_CONTENT_CACHE_TAG_PREFIX = 'sc';\r\n\r\n/**\r\n * Parameters for {@link buildSitecoreItemCacheTag}.\r\n * @internal\r\n */\r\nexport type BuildSitecoreItemCacheTagParams = {\r\n /** Sitecore item GUID or content id. */\r\n itemId: string;\r\n /** Locale/culture for the item tag. */\r\n locale: string;\r\n /** Optional published version; omitted values produce a `latest` suffix. */\r\n version?: number;\r\n};\r\n\r\n/**\r\n * Builds an item-scoped revalidation tag: `sc:item:<id>:<locale>:<version>`.\r\n * @param {BuildSitecoreItemCacheTagParams} params - Item id, locale, and optional version.\r\n * @returns {string} Sitecore item cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreItemCacheTag(params: BuildSitecoreItemCacheTagParams): string {\r\n const id = normalizeSitecoreItemIdForCacheKey(params.itemId);\r\n const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n const ver =\r\n params.version !== undefined && Number.isFinite(params.version)\r\n ? `v${Math.trunc(params.version)}`\r\n : 'latest';\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:item:${id}:${locale}:${ver}`;\r\n}\r\n\r\n/**\r\n * Parameters for {@link buildSitecoreDictionaryCacheTag} and related dictionary tag helpers.\r\n * @internal\r\n */\r\nexport type SitecoreDictionaryCacheTagParams = {\r\n /** Site name segment. */\r\n site: string;\r\n /** Locale segment. */\r\n locale: string;\r\n};\r\n\r\n/**\r\n * Site entry used when fanning out dictionary loader tags from webhook middleware.\r\n * @internal\r\n */\r\nexport type LoaderDictionaryCacheSiteInfo = {\r\n /** Site name. */\r\n name: string;\r\n /** Optional site language; falls back to `baseLocale` when blank. */\r\n language?: string;\r\n};\r\n\r\n/**\r\n * Parameters for {@link buildLoaderDictionaryCacheTagsFromSites}.\r\n * @internal\r\n */\r\nexport type BuildLoaderDictionaryCacheTagsFromSitesParams = {\r\n /** Sites to emit dictionary loader tags for. */\r\n sites: readonly LoaderDictionaryCacheSiteInfo[];\r\n /** Locale used when a site entry has no `language`. */\r\n baseLocale: string;\r\n};\r\n\r\n/**\r\n * Builds a Next.js-compatible dictionary tag: `sc:dict:<site>:<locale>`.\r\n * Used for dictionary loader entries and cross-stack webhook fan-out.\r\n * @param {SitecoreDictionaryCacheTagParams} params - Site and locale segments.\r\n * @returns {string} Dictionary cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreDictionaryCacheTag(params: SitecoreDictionaryCacheTagParams): string {\r\n const site = sanitizeSitecoreCacheSegment(params.site);\r\n const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:dict:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Builds an item tag from layout route data when `itemId` is present.\r\n * Returns `null` when the route has no item id (non-content routes).\r\n * @param {RouteData | null | undefined} route - Layout route metadata.\r\n * @param {string} fallbackLocale - Locale used when `route.itemLanguage` is absent.\r\n * @returns {string | null} Item cache tag, or `null` when no item id is available.\r\n * @internal\r\n */\r\nexport function buildSitecoreItemCacheTagFromRouteData(\r\n route: RouteData | null | undefined,\r\n fallbackLocale: string\r\n): string | null {\r\n if (!route?.itemId) {\r\n return null;\r\n }\r\n const locale = route.itemLanguage\r\n ? sanitizeSitecoreCacheSegment(route.itemLanguage)\r\n : sanitizeSitecoreCacheSegment(fallbackLocale);\r\n const id = normalizeSitecoreItemIdForCacheKey(route.itemId);\r\n const ver =\r\n route.itemVersion !== undefined && Number.isFinite(route.itemVersion)\r\n ? `v${Math.trunc(route.itemVersion)}`\r\n : 'latest';\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:item:${id}:${locale}:${ver}`;\r\n}\r\n\r\n/**\r\n * Builds loader-cache dictionary self-tags for webhook fan-out across sites.\r\n * Produces `sc:loader:dictionary:<site>:<locale>` tags, deduped in first-seen order.\r\n * When a site has no `language`, `baseLocale` is used.\r\n * @param {BuildLoaderDictionaryCacheTagsFromSitesParams} params - Sites and fallback locale.\r\n * @returns {string[]} Deduplicated loader dictionary cache tags.\r\n * @internal\r\n */\r\nexport function buildLoaderDictionaryCacheTagsFromSites(\r\n params: BuildLoaderDictionaryCacheTagsFromSitesParams\r\n): string[] {\r\n const seen = new Set<string>();\r\n const out: string[] = [];\r\n for (const site of params.sites) {\r\n const locale = site.language?.trim() ? site.language : params.baseLocale;\r\n const tag = buildLoaderDictionaryCacheTag({ site: site.name, locale });\r\n if (!seen.has(tag)) {\r\n seen.add(tag);\r\n out.push(tag);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Loader-cache self-tag for the dictionary loader: `sc:loader:dictionary:<site>:<locale>`.\r\n * @param {SitecoreDictionaryCacheTagParams} params - Site and locale segments.\r\n * @returns {string} Loader dictionary self-tag (same shape as the cache key).\r\n * @internal\r\n */\r\nexport function buildLoaderDictionaryCacheTag(params: SitecoreDictionaryCacheTagParams): string {\r\n const site = sanitizeSitecoreCacheSegment(params.site);\r\n const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:loader:dictionary:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Site-wide fan-out tag: `sc:site:<site>`.\r\n * Invalidating this tag marks every cached entry for the site stale.\r\n * @param {string} site - Site name segment.\r\n * @returns {string} Site fan-out cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreSiteCacheTag(site: string): string {\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:site:${sanitizeSitecoreCacheSegment(site)}`;\r\n}\r\n\r\n/**\r\n * Locale-wide fan-out tag: `sc:locale:<locale>`.\r\n * @param {string} locale - Locale segment.\r\n * @returns {string} Locale fan-out cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreLocaleCacheTag(locale: string): string {\r\n return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:locale:${sanitizeSitecoreCacheSegment(locale)}`;\r\n}\r\n\r\n/**\r\n * Builds the full tag set written alongside a loader cache entry (Phase 3 OSR alignment).\r\n * Always includes self-tag, `sc:site:<site>`, and `sc:locale:<locale>`. Conditionally adds\r\n * `sc:item:…` for page loaders and `sc:dict:…` for dictionary loaders. Custom tags are deduped.\r\n * @param {string} loaderId - Loader that produced the value.\r\n * @param {CacheKeyDimensions} dimensions - Key dimensions from {@link buildCacheKey}.\r\n * @param {string} cacheKey - Stored cache key (also used as a self-tag).\r\n * @param {unknown} [loaderValue] - Loader payload (page layout is inspected for item tags).\r\n * @param {string[]} [customTags] - Optional per-route tags from `loaderResolver(id, { tags })`.\r\n * @returns {string[]} Tag set to persist with the cache entry.\r\n * @internal\r\n */\r\nexport function buildLoaderCacheTags(\r\n loaderId: string,\r\n dimensions: CacheKeyDimensions,\r\n cacheKey: string,\r\n loaderValue?: unknown,\r\n customTags: string[] = []\r\n): string[] {\r\n const tags: string[] = [\r\n cacheKey,\r\n buildSitecoreSiteCacheTag(dimensions.site),\r\n buildSitecoreLocaleCacheTag(dimensions.locale),\r\n ...customTags,\r\n ];\r\n\r\n if (loaderId === 'page') {\r\n const itemTag = buildPageItemTag(loaderValue, dimensions.locale);\r\n if (itemTag) {\r\n tags.push(itemTag);\r\n }\r\n }\r\n\r\n if (loaderId === 'dictionary') {\r\n tags.push(\r\n buildSitecoreDictionaryCacheTag({ site: dimensions.site, locale: dimensions.locale })\r\n );\r\n }\r\n\r\n return dedupeCacheStrings(tags);\r\n}\r\n\r\n/**\r\n * Extracts a page item tag from a loader payload when layout route data is present.\r\n * @param {unknown} value - Loader result (expected to be a page shape).\r\n * @param {string} fallbackLocale - Locale used when route language is absent.\r\n * @returns {string | null} Item cache tag, or `null` when no item id is available.\r\n * @internal\r\n */\r\nfunction buildPageItemTag(value: unknown, fallbackLocale: string): string | null {\r\n if (!value || typeof value !== 'object') {\r\n return null;\r\n }\r\n const page = value as Page;\r\n return buildSitecoreItemCacheTagFromRouteData(page.layout?.sitecore?.route, fallbackLocale);\r\n}\r\n","import type { LoaderContext } from '../../loaders/models';\r\nimport { CacheKeyDimensions } from './models';\r\nimport { dimensionsFromContext } from './utils';\r\nimport { sanitizeSitecoreCacheSegment } from './utils';\r\nimport { SITECORE_CONTENT_CACHE_TAG_PREFIX } from './cache-tags';\r\n\r\n/** Prefix for OSR-aligned loader cache keys (`sc:loader:…`). @internal */\r\nexport const CACHE_KEY_PREFIX = `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:loader`;\r\n\r\n/**\r\n * Compose the canonical cache key and dimension tuple for a loader invocation.\r\n * @param {string} loaderId - Registered loader id (`page`, `dictionary`, etc.).\r\n * @param {LoaderContext} ctx - Loader context (URL, route params, query).\r\n * @returns {{ key: string, dimensions: CacheKeyDimensions }} Cache key and parsed dimensions.\r\n * @example\r\n * ```ts\r\n * buildCacheKey('page', { url: '/about', params: { site: 'demo', locale: 'en' }, query: {} });\r\n * // → { key: 'sc:loader:page:demo:en:default:about', dimensions: { … } }\r\n * ```\r\n * @internal\r\n */\r\nexport function buildCacheKey(\r\n loaderId: string,\r\n ctx: LoaderContext\r\n): { key: string; dimensions: CacheKeyDimensions } {\r\n const dimensions = dimensionsFromContext(loaderId, ctx);\r\n const key = serializeLoaderCacheKey(dimensions);\r\n return { key, dimensions };\r\n}\r\n\r\n/**\r\n * Serializes cache key dimensions into the public `sc:loader:…` format.\r\n * Dispatches to {@link buildPageCacheKey}, {@link buildDictionaryCacheKey}, or\r\n * {@link buildGenericLoaderCacheKey} based on `dimensions.loaderId`.\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} OSR-aligned cache key.\r\n * @internal\r\n */\r\nexport function serializeLoaderCacheKey(dimensions: CacheKeyDimensions): string {\r\n if (dimensions.loaderId === 'page') {\r\n return buildPageCacheKey(dimensions);\r\n }\r\n if (dimensions.loaderId === 'dictionary') {\r\n return buildDictionaryCacheKey(dimensions);\r\n }\r\n return buildGenericLoaderCacheKey(dimensions);\r\n}\r\n\r\n/**\r\n * Page loader key: `sc:loader:page:<site>:<locale>:<variantId>:<pathKey>`.\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Page loader cache key.\r\n * @internal\r\n */\r\nexport function buildPageCacheKey(dimensions: CacheKeyDimensions): string {\r\n const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n const variantId = sanitizeSitecoreCacheSegment(dimensions.variantId);\r\n return `${CACHE_KEY_PREFIX}:page:${site}:${locale}:${variantId}:${dimensions.pathKey}`;\r\n}\r\n\r\n/**\r\n * Dictionary loader key: `sc:loader:dictionary:<site>:<locale>` (one entry per site/locale).\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Dictionary loader cache key.\r\n * @internal\r\n */\r\nexport function buildDictionaryCacheKey(dimensions: CacheKeyDimensions): string {\r\n const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n return `${CACHE_KEY_PREFIX}:dictionary:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Generic loader key: `sc:loader:<loaderId>:<site>:<locale>:<variantId>:<pathKey>`.\r\n * Used for loaders other than `page` and `dictionary` (for example `404`, `500`).\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Generic loader cache key.\r\n * @internal\r\n */\r\nexport function buildGenericLoaderCacheKey(dimensions: CacheKeyDimensions): string {\r\n const loaderId = sanitizeSitecoreCacheSegment(dimensions.loaderId);\r\n const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n const variantId = sanitizeSitecoreCacheSegment(dimensions.variantId);\r\n return `${CACHE_KEY_PREFIX}:${loaderId}:${site}:${locale}:${variantId}:${dimensions.pathKey}`;\r\n}\r\n","import {\r\n LoaderApiRequest,\r\n LoaderContext,\r\n isLoaderRedirectResult,\r\n LoaderCache,\r\n LoaderDataResult,\r\n} from '../loaders/models';\r\nimport { LoaderRegistry } from '../loaders/loader-registry.token';\r\nimport { buildCacheKey } from './cache/cache-key';\r\nimport { buildLoaderCacheTags } from './cache/cache-tags';\r\n\r\n/**\r\n * Server-side cache aware loader data resolver.\r\n * LoaderResolver is exposed to both server and browser. This layer ensures browser safety and acts as connecting layer to cache.\r\n *\r\n * Resolution order when a {@link LoaderCache} is attached:\r\n * 1. **hit** — return cached value immediately.\r\n * 2. **stale** — return cached value immediately and schedule a background refresh\r\n * (coalesced per cache key via `pendingCacheOps`).\r\n * 3. **miss** — run the loader, persist the result with OSR tags, return data.\r\n *\r\n * Redirect responses are never cached. Per-route LoaderCacheConfig overrides\r\n * from `loaderResolver(id, cacheOptions)` control TTL, tags, and opt-in caching when\r\n * the global cache is disabled.\r\n * @public\r\n */\r\nexport class ServerLoaderRunner {\r\n /** Process-wide coalescing for stale-while-revalidate background refreshes. */\r\n private static readonly pendingCacheOps = new Set<string>();\r\n\r\n /**\r\n * @param {LoaderRegistry} registry - Same loader map as `provideLoaderRegistry` / `/_data` middleware.\r\n * @param {LoaderCache | undefined} cache - Optional cache instance from createLoaderCache.\r\n */\r\n constructor(private readonly registry: LoaderRegistry, private readonly cache?: LoaderCache) {}\r\n\r\n /**\r\n * Resolve loader data with optional cache read-through and SWR refresh.\r\n * @param {LoaderApiRequest} request - Loader id, URL, params, optional request context and cache overrides.\r\n * @returns {Promise<LoaderDataResult>} Data, redirect, or error result for the middleware / SSR resolver.\r\n */\r\n async resolve(request: LoaderApiRequest): Promise<LoaderDataResult> {\r\n const { loaderId, url, params, query, angularRequestContext, cacheOptions } = request;\r\n const loader = this.registry[loaderId];\r\n if (!loader) {\r\n return { kind: 'error', status: 500, message: `No loader registered for id \"${loaderId}\"` };\r\n }\r\n\r\n const ctx: LoaderContext = { url, params, query, requestContext: angularRequestContext };\r\n\r\n const cacheable = this.cache && (cacheOptions?.enabled ?? this.cache.enabled());\r\n\r\n if (cacheable) {\r\n const { key } = buildCacheKey(loaderId, ctx);\r\n const read = await this.cache.get(key);\r\n\r\n if (read.kind === 'hit') {\r\n return { kind: 'data', data: read.value };\r\n }\r\n\r\n if (read.kind === 'stale') {\r\n this.scheduleBackgroundRefresh(request, ctx, key, cacheOptions);\r\n return { kind: 'data', data: read.value };\r\n }\r\n }\r\n\r\n return this.runLoader({ request, ctx, cacheable: !!cacheable, cacheOptions });\r\n }\r\n\r\n /**\r\n * Fire-and-forget SWR refresh; skipped when a refresh is already in flight for the key.\r\n * @param {LoaderApiRequest} request - The loader request\r\n * @param {LoaderContext} ctx - The loader context\r\n * @param {string} cacheKey - The cache key\r\n * @param {LoaderApiRequest['cacheOptions']} cacheOptions - The cache options\r\n */\r\n private scheduleBackgroundRefresh(\r\n request: LoaderApiRequest,\r\n ctx: LoaderContext,\r\n cacheKey: string,\r\n cacheOptions: LoaderApiRequest['cacheOptions']\r\n ): void {\r\n if (ServerLoaderRunner.pendingCacheOps.has(cacheKey)) {\r\n return;\r\n }\r\n ServerLoaderRunner.pendingCacheOps.add(cacheKey);\r\n void this.runLoader({\r\n request,\r\n ctx,\r\n cacheable: true,\r\n cacheOptions,\r\n knownCacheKey: cacheKey,\r\n }).then(\r\n () => {\r\n ServerLoaderRunner.pendingCacheOps.delete(cacheKey);\r\n },\r\n () => {\r\n ServerLoaderRunner.pendingCacheOps.delete(cacheKey);\r\n }\r\n );\r\n }\r\n\r\n private async runLoader({\r\n request,\r\n ctx,\r\n cacheable,\r\n cacheOptions,\r\n knownCacheKey,\r\n }: {\r\n request: LoaderApiRequest;\r\n ctx: LoaderContext;\r\n cacheable: boolean;\r\n cacheOptions?: LoaderApiRequest['cacheOptions'];\r\n knownCacheKey?: string;\r\n }): Promise<LoaderDataResult> {\r\n const { loaderId } = request;\r\n const loader = this.registry[loaderId]!;\r\n\r\n let value: unknown;\r\n try {\r\n value = await loader(ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Loader failed';\r\n return {\r\n kind: 'error',\r\n status: 500,\r\n message,\r\n ...(err instanceof Error ? { cause: err } : {}),\r\n };\r\n }\r\n\r\n if (isLoaderRedirectResult(value)) {\r\n return { kind: 'redirect', redirect: value };\r\n }\r\n\r\n if (cacheable && this.cache) {\r\n const { key, dimensions } = buildCacheKey(loaderId, ctx);\r\n const cacheKey = knownCacheKey ?? key;\r\n const tags = buildLoaderCacheTags(\r\n loaderId,\r\n dimensions,\r\n cacheKey,\r\n value,\r\n cacheOptions?.tags ?? []\r\n );\r\n const ttl = cacheOptions?.revalidate ?? this.cache.ttl;\r\n try {\r\n await this.cache.set(cacheKey, value, ttl, tags);\r\n } catch (err) {\r\n console.warn(\r\n '[sitecore-loader-cache] background refresh failed to write cache entry:',\r\n err instanceof Error ? err.message : err\r\n );\r\n }\r\n }\r\n\r\n return { kind: 'data', data: value };\r\n }\r\n}\r\n","import {\r\n EnvironmentProviders,\r\n inject,\r\n makeEnvironmentProviders,\r\n REQUEST_CONTEXT,\r\n} from '@angular/core';\r\nimport { LOADER_REGISTRY } from '../loaders/loader-registry.token';\r\nimport { SERVER_LOADER_RUNNER } from '../loaders/server-loader-runner.token';\r\nimport { LoaderCache, LoaderApiRequest } from '../loaders/models';\r\nimport { ServerLoaderRunner } from './server-loader-runner';\r\n\r\n/**\r\n * Wires SSR {@link SERVER_LOADER_RUNNER} to ServerLoaderRunner\r\n * using the shared {@link LOADER_REGISTRY}. Include in server application providers\r\n * alongside provideLoaderRegistry.\r\n * @returns Environment providers for SSR loader data resolution\r\n * @public\r\n */\r\nexport function provideServerLoaderRunner(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: SERVER_LOADER_RUNNER,\r\n useFactory: () => {\r\n const registry = inject(LOADER_REGISTRY);\r\n return {\r\n resolve(request: LoaderApiRequest) {\r\n const ssrContext = inject(REQUEST_CONTEXT, { optional: true }) as\r\n | { cache?: LoaderCache }\r\n | undefined;\r\n const cache = ssrContext?.cache;\r\n return new ServerLoaderRunner(registry, cache).resolve(request);\r\n },\r\n };\r\n },\r\n },\r\n ]);\r\n}\r\n","import {\r\n LoaderApiRequest,\r\n LoaderApiResponse,\r\n NotFoundNavigationError,\r\n LoaderHttpError,\r\n LoaderDataResult,\r\n} from '../../loaders/models';\r\nimport { extractRequestContext } from '../../loaders/utils';\r\nimport {\r\n ExpressDataHandlerOptions,\r\n ExpressMiddleware,\r\n ExpressNextFunction,\r\n ExpressRequest,\r\n ExpressResponse,\r\n} from '../models';\r\nimport { LOADER_DATA_ENDPOINT } from '../constants';\r\nimport { ServerLoaderRunner } from '../server-loader-runner';\r\n\r\n/**\r\n * Map loader resolution result to wire-level API response.\r\n * @param {LoaderDataResult} result - Loader result from the shared registry\r\n * @returns {LoaderApiResponse} Wire envelope for the client\r\n */\r\nfunction toApiResponse(result: LoaderDataResult): LoaderApiResponse {\r\n if (result.kind === 'redirect') {\r\n return {\r\n kind: 'redirect',\r\n redirect: {\r\n loaderRedirectTarget: result.redirect.loaderRedirectTarget,\r\n status: result.redirect.status,\r\n },\r\n };\r\n }\r\n\r\n if (result.kind === 'error') {\r\n const cause = result.cause;\r\n if (cause instanceof NotFoundNavigationError) {\r\n return { kind: 'notFound', status: 404 };\r\n }\r\n if (cause instanceof LoaderHttpError) {\r\n return { kind: 'error', status: cause.status, message: cause.message };\r\n }\r\n return { kind: 'error', status: result.status, message: result.message };\r\n }\r\n\r\n return { kind: 'data', data: result.data };\r\n}\r\n\r\n/**\r\n * Send the loader response to Express\r\n * @param {ExpressResponse} res - Express response\r\n * @param {LoaderApiResponse} result - Loader API payload to JSON-encode\r\n */\r\nfunction sendResponse(res: ExpressResponse, result: LoaderApiResponse): void {\r\n res.json(result);\r\n}\r\n\r\n/**\r\n * Parse POST body or GET query into LoaderApiRequest, or return a validation error.\r\n * @param {ExpressRequest} req - Incoming Express request\r\n */\r\nfunction parseLoaderRequest(\r\n req: ExpressRequest\r\n): LoaderApiRequest | { status: number; message: string } {\r\n if (req.method === 'POST') {\r\n const body = req.body as LoaderApiRequest;\r\n if (!body?.loaderId) return { status: 400, message: 'Missing loaderId' };\r\n return body;\r\n }\r\n if (req.method === 'GET') {\r\n const loaderId = String(req.query?.loaderId ?? '');\r\n if (!loaderId) return { status: 400, message: 'Missing loaderId' };\r\n const query: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(req.query ?? {})) {\r\n if (key !== 'loaderId' && key !== 'url' && typeof value === 'string') query[key] = value;\r\n }\r\n return {\r\n loaderId,\r\n url: String(req.query?.url ?? ''),\r\n params: {},\r\n query,\r\n };\r\n }\r\n return { status: 405, message: 'Method not allowed' };\r\n}\r\n\r\n/**\r\n * Create an Express middleware for the data endpoint.\r\n * This middleware handles both GET and POST requests at the configured endpoint path.\r\n *\r\n * The endpoint path must match the client: provide the same value to the Angular app via\r\n * FETCH_DATA_ENDPOINT (e.g. in app.config.ts). There is no Angular DI in Node/Express,\r\n * so you pass the endpoint here when calling this function (e.g. from server.ts).\r\n * @param {ExpressDataHandlerOptions} options - Handler options: loaders and optional endpoint (defaults to {@link LOADER_DATA_ENDPOINT})\r\n * @returns Express middleware that handles the data endpoint\r\n * @example\r\n * ```typescript\r\n * import { createExpressDataMiddleware, LOADER_DATA_ENDPOINT } from '@sitecore-content-sdk/angular';\r\n *\r\n * // Pass the same LOADERS object used with provideLoaderRegistry(LOADERS)\r\n * app.use(createExpressDataMiddleware({ loaders: LOADERS }));\r\n *\r\n * // Or pass the same endpoint you provide to the Angular app (FETCH_DATA_ENDPOINT)\r\n * const dataEndpoint = process.env.DATA_ENDPOINT ?? LOADER_DATA_ENDPOINT;\r\n * app.use(createExpressDataMiddleware({ loaders: LOADERS, endpoint: dataEndpoint }));\r\n * ```\r\n * @public\r\n */\r\nexport function createLoaderDataServiceMiddleware(\r\n options: ExpressDataHandlerOptions\r\n): ExpressMiddleware {\r\n const { loaders, cache, endpoint = LOADER_DATA_ENDPOINT } = options;\r\n const serverLoaderData = new ServerLoaderRunner(loaders, cache);\r\n\r\n return async (\r\n req: ExpressRequest,\r\n res: ExpressResponse,\r\n next: ExpressNextFunction\r\n ): Promise<void> => {\r\n if (req.path !== endpoint) {\r\n next();\r\n return;\r\n }\r\n try {\r\n const parsed = parseLoaderRequest(req);\r\n if ('loaderId' in parsed) {\r\n // Per refactor plan A2: extract once at the boundary; ride on the payload.\r\n // POST body's `angularRequestContext` is ignored — server-derived data\r\n // (hostname, headers) must come from the actual request, not from a\r\n // payload the browser could spoof.\r\n parsed.angularRequestContext = extractRequestContext(req);\r\n const result = toApiResponse(await serverLoaderData.resolve(parsed));\r\n sendResponse(res, result);\r\n } else {\r\n res\r\n .status(parsed.status)\r\n .json({ kind: 'error', status: parsed.status, message: parsed.message });\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Internal server error';\r\n res.status(500).json({ kind: 'error', status: 500, message });\r\n }\r\n };\r\n}\r\n\r\n/** @public */\r\nexport const createExpressDataMiddleware = createLoaderDataServiceMiddleware;\r\n","import { buildSitecoreItemCacheTag, SITECORE_CONTENT_CACHE_TAG_PREFIX } from '../cache/cache-tags';\r\nimport { dedupeCacheStrings } from '../cache/utils';\r\n\r\n/**\r\n * One content change entry as commonly seen in Experience Edge / Content Operations payloads.\r\n * @public\r\n */\r\nexport type SitecoreEdgeRevalidateUpdate = {\r\n identifier?: string;\r\n entity_definition?: string;\r\n operation?: string;\r\n entity_culture?: string;\r\n};\r\n\r\n/**\r\n * Request body shape for webhook-driven revalidation.\r\n * @public\r\n */\r\nexport type SitecoreEdgeRevalidateRequestBody = {\r\n invocation_id?: string;\r\n updates?: SitecoreEdgeRevalidateUpdate[];\r\n continues?: boolean;\r\n tags?: string[];\r\n};\r\n\r\n/**\r\n * Strips Experience Edge style suffixes from an `identifier`.\r\n * @param {string} identifier - Raw identifier from a webhook update row.\r\n * @public\r\n */\r\nexport function extractSitecoreEdgeContentId(identifier: string): string {\r\n if (!identifier || typeof identifier !== 'string') {\r\n return '';\r\n }\r\n const trimmed = identifier.trim();\r\n return trimmed.replace(/-(?:media|layout)$/i, '');\r\n}\r\n\r\nconst FULL_TAG_PREFIX = `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:`;\r\n\r\n/**\r\n * Options for {@link collectSitecoreTagsFromEdgeRevalidateRequestBody}.\r\n * @public\r\n */\r\nexport type CollectSitecoreTagsFromEdgeBodyOptions = {\r\n defaultLocale: string;\r\n};\r\n\r\n/**\r\n * Maps an Experience Edge webhook JSON body to Sitecore cache tag strings.\r\n *\r\n * Accepts fully qualified `sc:…` tags in `body.tags`, raw content identifiers\r\n * (with optional `-media`/`-layout` suffixes), and `updates[]` rows with\r\n * `identifier` + `entity_culture`.\r\n * @param {SitecoreEdgeRevalidateRequestBody | null | undefined} body - Parsed webhook JSON body.\r\n * @param {CollectSitecoreTagsFromEdgeBodyOptions} options - Locale fallback when an update omits `entity_culture`.\r\n * @returns {string[]} Deduplicated Sitecore cache tags ready for `LoaderCache.invalidate`.\r\n * @public\r\n */\r\nexport function collectSitecoreTagsFromEdgeRevalidateRequestBody(\r\n body: SitecoreEdgeRevalidateRequestBody | null | undefined,\r\n options: CollectSitecoreTagsFromEdgeBodyOptions\r\n): string[] {\r\n const { defaultLocale } = options;\r\n const out: string[] = [];\r\n\r\n for (const tag of body?.tags ?? []) {\r\n if (typeof tag !== 'string') {\r\n continue;\r\n }\r\n if (!tag) {\r\n continue;\r\n }\r\n if (tag.startsWith(FULL_TAG_PREFIX)) {\r\n out.push(tag);\r\n } else {\r\n const id = extractSitecoreEdgeContentId(tag);\r\n if (id) {\r\n out.push(buildSitecoreItemCacheTag({ itemId: id, locale: defaultLocale }));\r\n }\r\n }\r\n }\r\n\r\n for (const u of body?.updates ?? []) {\r\n const id = extractSitecoreEdgeContentId(u?.identifier ?? '');\r\n if (!id) {\r\n continue;\r\n }\r\n const locale = u?.entity_culture?.trim() || defaultLocale;\r\n out.push(buildSitecoreItemCacheTag({ itemId: id, locale }));\r\n }\r\n\r\n return dedupeCacheStrings(out).filter(Boolean);\r\n}\r\n","/**\r\n * Reads `process.env` when running under Node; otherwise returns an empty object.\r\n * process.env is only available on the server in Angular\r\n * @param {string} name - The name of the environment variable to read.\r\n * @returns {Record<string, string | undefined>} Environment map for merging into config.\r\n * @internal\r\n */\r\nexport function readProcessEnv(name: string) {\r\n // Use globalThis so we do not need @types/node (lib tsconfig uses \"types\": []).\r\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\r\n ?.env;\r\n if (env) {\r\n return env[name];\r\n }\r\n return undefined;\r\n}\r\n","import type { SiteInfo } from '@sitecore-content-sdk/content/site';\r\nimport { ExpressMiddleware, ExpressNextFunction, ExpressRequest, ExpressResponse } from '../models';\r\nimport { LoaderCache } from '../../loaders/models';\r\nimport { buildLoaderDictionaryCacheTagsFromSites } from '../cache/cache-tags';\r\nimport { dedupeCacheStrings } from '../cache/utils';\r\nimport {\r\n collectSitecoreTagsFromEdgeRevalidateRequestBody,\r\n type SitecoreEdgeRevalidateRequestBody,\r\n} from './sitecore-edge-webhook-revalidation';\r\nimport { readProcessEnv } from '../utils';\r\nconst DEFAULT_SECRET_ENV_VAR = 'SITECORE_REVALIDATE_SECRET';\r\nconst DEFAULT_SECRET_HEADER = 'x-revalidate-secret';\r\nconst DEFAULT_ENDPOINT = '/api/revalidate';\r\n\r\n/**\r\n * Returns a non-empty trimmed secret, or `undefined` when unset or whitespace-only.\r\n * @param {string | undefined} secretOption - Explicit secret from handler options.\r\n * @param {string | undefined} envValue - Secret from `process.env` (e.g. `SITECORE_REVALIDATE_SECRET`).\r\n * @returns {string | undefined} The resolved secret\r\n * @internal\r\n */\r\nexport function resolveConfiguredRevalidateSecret(\r\n secretOption: string | undefined,\r\n envValue: string | undefined\r\n): string | undefined {\r\n const raw = secretOption !== undefined ? secretOption : envValue;\r\n const trimmed = raw?.trim();\r\n return trimmed || undefined;\r\n}\r\n\r\n/**\r\n * Options for {@link createSitecoreRevalidateMiddleware}.\r\n * @public\r\n */\r\nexport interface SitecoreRevalidateMiddlewareOptions {\r\n /** Shared cache instance from createLoaderCache call */\r\n cache: LoaderCache;\r\n /** Default: `process.env.SITECORE_REVALIDATE_SECRET` */\r\n secret?: string;\r\n /** Locale fallback when an update has no `entity_culture`; default `'en'`. */\r\n defaultLocale?: string;\r\n /**\r\n * When set, every webhook also marks stale one\r\n * `sc:loader:dictionary:<site>:<locale>` entry per site (dictionary fan-out).\r\n */\r\n sites?: SiteInfo[];\r\n /** Endpoint path; default `/api/revalidate`. */\r\n endpoint?: string;\r\n}\r\n\r\n/**\r\n * Express middleware aligned with Next.js `createSitecoreRevalidateRouteHandler`.\r\n *\r\n * Handles `POST /api/revalidate` (configurable via `endpoint`):\r\n * - Authenticates with `SITECORE_REVALIDATE_SECRET` / `x-revalidate-secret` when configured.\r\n * - Parses Experience Edge webhook bodies via {@link collectSitecoreTagsFromEdgeRevalidateRequestBody}.\r\n * - Optionally appends dictionary loader tags for each configured site.\r\n * - Calls `LoaderCache.invalidate` (marks entries stale; does not delete).\r\n *\r\n * Response shape: `{ revalidated, tagsCount, marked, invocation_id, continues, durationMs }`.\r\n * @param {SitecoreRevalidateMiddlewareOptions} options - The options for the middleware\r\n * @returns {ExpressMiddleware} The middleware function\r\n * @public\r\n */\r\nexport function createSitecoreRevalidateMiddleware(\r\n options: SitecoreRevalidateMiddlewareOptions\r\n): ExpressMiddleware {\r\n const { cache, secret, defaultLocale = 'en', sites, endpoint = DEFAULT_ENDPOINT } = options;\r\n\r\n const dictionaryTags =\r\n sites !== undefined\r\n ? buildLoaderDictionaryCacheTagsFromSites({ sites, baseLocale: defaultLocale })\r\n : [];\r\n\r\n return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n if (req.method !== 'POST' || req.path !== endpoint) {\r\n next();\r\n return;\r\n }\r\n\r\n const startTimestamp = Date.now();\r\n\r\n try {\r\n const configuredSecret = resolveConfiguredRevalidateSecret(\r\n secret,\r\n readProcessEnv(DEFAULT_SECRET_ENV_VAR)\r\n );\r\n\r\n const headers = req.headers as Record<string, string | string[] | undefined>;\r\n const providedSecret = headers[DEFAULT_SECRET_HEADER];\r\n const headerValue = Array.isArray(providedSecret) ? providedSecret[0] : providedSecret;\r\n if (headerValue !== configuredSecret) {\r\n res.status(401).json({ error: 'Unauthorized.' });\r\n return;\r\n }\r\n\r\n const body = req.body;\r\n if (typeof body !== 'object' || body === null || Array.isArray(body)) {\r\n res.status(400).json({ error: 'Request body must be a JSON object.' });\r\n return;\r\n }\r\n\r\n const webhookBody = body as SitecoreEdgeRevalidateRequestBody;\r\n\r\n const tags = dedupeCacheStrings([\r\n ...collectSitecoreTagsFromEdgeRevalidateRequestBody(webhookBody, { defaultLocale }),\r\n ...dictionaryTags,\r\n ]);\r\n\r\n if (tags.length === 0) {\r\n res.status(400).json({\r\n error:\r\n 'Provide non-empty `updates` (with identifiers) and/or `tags` that resolve to at least one cache tag.',\r\n });\r\n return;\r\n }\r\n\r\n const marked = await cache.invalidate({ tags });\r\n\r\n res.status(200).json({\r\n revalidated: true,\r\n tagsCount: tags.length,\r\n marked,\r\n invocation_id: webhookBody.invocation_id ?? null,\r\n continues: webhookBody.continues ?? false,\r\n durationMs: Date.now() - startTimestamp,\r\n });\r\n } catch (error) {\r\n console.error('Sitecore revalidate middleware failed:', error);\r\n res.status(500).json({ error: 'Internal Server Error.' });\r\n }\r\n };\r\n}\r\n","import { Storage, createStorage, Driver } from 'unstorage';\r\nimport {\r\n InvalidateInput,\r\n LoaderCache,\r\n LoaderCacheConfig,\r\n LoaderCacheEntry,\r\n LoaderCacheEntryInfo,\r\n LoaderCacheReadResult,\r\n} from '../../loaders/models';\r\nimport { evaluateCacheRead, applyLoaderCacheConfigDefaults } from './utils';\r\nimport { CACHE_KEY_PREFIX } from './cache-key';\r\nimport { GlobalLoaderCacheConfig } from './models';\r\n\r\n/** Prefix for tag-index keys in unstorage (entries use `sc:loader:…` keys directly). */\r\nconst TAG_INDEX_PREFIX = 'tag:';\r\n\r\n/**\r\n * Unstorage-backed {@link LoaderCache} for persistent or shared storage.\r\n * Two key spaces share one driver: `{cacheKey}` entries and `tag:{tag}` index arrays.\r\n * Semantics match {@link InMemoryLoaderCache}: `invalidate` marks stale; `get` uses\r\n * {@link evaluateCacheRead} for hit/stale/miss.\r\n * @internal\r\n */\r\nexport class UnstorageLoaderCache implements LoaderCache {\r\n private readonly storage: Storage;\r\n private readonly _config: Required<LoaderCacheConfig>;\r\n\r\n /**\r\n * @param {Driver} driver - Unstorage driver instance from the app (`server.ts`).\r\n * @param {LoaderCacheConfig} [config] - Resolved cache configuration.\r\n */\r\n constructor(driver: Driver, config: GlobalLoaderCacheConfig = {}) {\r\n this.storage = createStorage({ driver });\r\n this._config = applyLoaderCacheConfigDefaults(config);\r\n }\r\n\r\n /** @inheritdoc */\r\n get ttl(): number {\r\n return this._config.revalidate;\r\n }\r\n\r\n /** @inheritdoc */\r\n get config(): Readonly<LoaderCacheConfig> {\r\n return this._config;\r\n }\r\n\r\n /** @inheritdoc */\r\n async get(cacheKey: string): Promise<LoaderCacheReadResult> {\r\n const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n return evaluateCacheRead(cacheKey, entry ?? null);\r\n }\r\n\r\n /** @inheritdoc */\r\n async set(cacheKey: string, value: unknown, ttlSeconds: number, tags: string[]): Promise<void> {\r\n const existing = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n if (existing) {\r\n await this.unlinkTags(cacheKey, existing.tags);\r\n }\r\n\r\n const expiresAt = ttlSeconds > 0 ? Date.now() + ttlSeconds * 1000 : null;\r\n const entry: LoaderCacheEntry = {\r\n value,\r\n tags: [...tags],\r\n storedAt: Date.now(),\r\n expiresAt,\r\n stale: false,\r\n };\r\n await this.storage.setItem(this.cacheStorageKey(cacheKey), entry);\r\n await this.linkTags(cacheKey, tags);\r\n }\r\n\r\n /** @inheritdoc */\r\n async invalidate(filter: InvalidateInput): Promise<number> {\r\n const tags = filter.tags ?? [];\r\n if (tags.length === 0) {\r\n return 0;\r\n }\r\n const keys = await this.resolveCacheKeysFromTags(tags);\r\n let marked = 0;\r\n for (const cacheKey of keys) {\r\n const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n if (!entry) {\r\n continue;\r\n }\r\n if (!entry.stale) {\r\n await this.storage.setItem(this.cacheStorageKey(cacheKey), { ...entry, stale: true });\r\n }\r\n marked++;\r\n }\r\n return marked;\r\n }\r\n\r\n /** @inheritdoc */\r\n async delete(cacheKey: string): Promise<boolean> {\r\n const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n if (!entry) {\r\n return false;\r\n }\r\n await this.unlinkTags(cacheKey, entry.tags);\r\n await this.storage.removeItem(this.cacheStorageKey(cacheKey));\r\n return true;\r\n }\r\n\r\n /** @inheritdoc */\r\n async flush(): Promise<void> {\r\n await this.storage.clear();\r\n }\r\n\r\n /** @inheritdoc */\r\n async entries(): Promise<LoaderCacheEntryInfo[]> {\r\n const keys = await this.storage.getKeys(CACHE_KEY_PREFIX);\r\n const out: LoaderCacheEntryInfo[] = [];\r\n for (const cacheKey of keys) {\r\n const entry = await this.storage.getItem<LoaderCacheEntry>(cacheKey);\r\n if (!entry) {\r\n continue;\r\n }\r\n out.push({\r\n key: cacheKey,\r\n tags: [...entry.tags],\r\n storedAt: entry.storedAt,\r\n expiresAt: entry.expiresAt,\r\n stale: entry.stale,\r\n });\r\n }\r\n return out;\r\n }\r\n\r\n /** @inheritdoc */\r\n enabled(): boolean {\r\n return this._config.enabled;\r\n }\r\n\r\n /**\r\n * Cache entry storage key (OSR-aligned `sc:loader:…`).\r\n * @param {string} cacheKey - Public loader cache key.\r\n * @returns {string} Unstorage key for the entry payload.\r\n */\r\n private cacheStorageKey(cacheKey: string): string {\r\n return cacheKey;\r\n }\r\n\r\n /**\r\n * Tag index storage key (`tag:{tag}`).\r\n * @param {string} tag - OSR cache tag.\r\n * @returns {string} Unstorage key for the tag index bucket.\r\n */\r\n private tagStorageKey(tag: string): string {\r\n return `${TAG_INDEX_PREFIX}${tag}`;\r\n }\r\n\r\n /**\r\n * Links a cache key into each tag bucket.\r\n * @param {string} cacheKey - Cache entry key.\r\n * @param {string[]} tags - Tags to link.\r\n */\r\n private async linkTags(cacheKey: string, tags: string[]): Promise<void> {\r\n for (const tag of tags) {\r\n const storageKey = this.tagStorageKey(tag);\r\n const current = (await this.storage.getItem<string[]>(storageKey)) ?? [];\r\n if (!current.includes(cacheKey)) {\r\n await this.storage.setItem(storageKey, [...current, cacheKey]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Unlinks a cache key from each tag bucket.\r\n * @param {string} cacheKey - Cache entry key.\r\n * @param {string[]} tags - Tags to unlink.\r\n */\r\n private async unlinkTags(cacheKey: string, tags: string[]): Promise<void> {\r\n for (const tag of tags) {\r\n const storageKey = this.tagStorageKey(tag);\r\n const current = (await this.storage.getItem<string[]>(storageKey)) ?? [];\r\n const next = current.filter((k) => k !== cacheKey);\r\n if (next.length === 0) {\r\n await this.storage.removeItem(storageKey);\r\n } else {\r\n await this.storage.setItem(storageKey, next);\r\n }\r\n }\r\n }\r\n\r\n /** @param {string[]} tags - Tags to resolve. @returns {Promise<Set<string>>} Matching cache keys. */\r\n private async resolveCacheKeysFromTags(tags: string[]): Promise<Set<string>> {\r\n const out = new Set<string>();\r\n for (const tag of tags) {\r\n const keys = (await this.storage.getItem<string[]>(this.tagStorageKey(tag))) ?? [];\r\n for (const key of keys) {\r\n out.add(key);\r\n }\r\n }\r\n return out;\r\n }\r\n}\r\n","import { LoaderCache } from '../../loaders/models';\r\nimport { GlobalLoaderCacheConfig } from './models';\r\nimport { UnstorageLoaderCache } from './unstorage-loader-cache';\r\nimport { resolveConfig } from './utils';\r\nimport memoryDriver from 'unstorage/drivers/memory';\r\n\r\n/**\r\n * Public factory for the loader cache with unstorage backing.\r\n * Uses the memory driver by default.\r\n *\r\n * Drivers are best imported and constructed in the app's `server.ts` and passed here as an instance.\r\n * Callers depend on the {@link LoaderCache} interface; concrete classes are not exported.\r\n * @param {GlobalLoaderCacheConfig} [config] - Global cache config and optional unstorage driver.\r\n * @returns {LoaderCache} Cache implementation with Phase 3 SWR + tag semantics.\r\n * @example\r\n * ```ts\r\n * const cache = createLoaderCache({\r\n * revalidate: config.angular.loadersCache.revalidate,\r\n * enabled: config.angular.loadersCache.enabled,\r\n * defaultSiteName: config.defaultSite,\r\n * driver: fsDriver({ base: './.cache/loaders' }),\r\n * });\r\n * ```\r\n * @public\r\n */\r\nexport function createLoaderCache(config: GlobalLoaderCacheConfig = {}): LoaderCache {\r\n const resolved = resolveConfig(config);\r\n const driver = config.driver ?? memoryDriver();\r\n return new UnstorageLoaderCache(driver, resolved);\r\n}\r\n","/* eslint-disable */\r\n/**\r\n * This middleware is only used for testing and should be removed before release.\r\n * TODO: Remove this middleware before release.\r\n */\r\nimport {\r\n ExpressMiddleware,\r\n ExpressNextFunction,\r\n ExpressRequest,\r\n ExpressResponse,\r\n} from '../../models';\r\nimport { InvalidateInput, LoaderCache } from '../../../loaders/models';\r\n\r\n/**\r\n * Options for the admin middleware.\r\n * @public\r\n */\r\nexport interface CacheAdminMiddlewareOptions {\r\n /** The cache instance to expose. Capture once in `server.ts`. */\r\n cache: LoaderCache;\r\n /** Base path. Defaults to `/api/_cache`. */\r\n endpoint?: string;\r\n /**\r\n * Optional auth gate. Return true to allow. Defaults to allowing everything,\r\n * which is fine for local demos — *do not* leave that default in a deploy.\r\n */\r\n auth?: (req: ExpressRequest) => boolean;\r\n}\r\n\r\nconst DEFAULT_ENDPOINT = '/api/_cache';\r\n\r\n/**\r\n * Lightweight admin surface for the loader cache:\r\n * GET <endpoint>/entries → list entries (metadata only, no values)\r\n * POST <endpoint>/invalidate → mark stale by tags (JSON body)\r\n * POST <endpoint>/flush → flush every entry\r\n * GET <endpoint>/config → resolved config (for the demo UI)\r\n * @public\r\n */\r\nexport function createCacheAdminMiddleware(\r\n options: CacheAdminMiddlewareOptions\r\n): ExpressMiddleware {\r\n const { cache } = options;\r\n const endpoint = options.endpoint ?? DEFAULT_ENDPOINT;\r\n const auth = options.auth ?? (() => true);\r\n\r\n return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n if (!req.path.startsWith(endpoint + '/')) {\r\n next();\r\n return;\r\n }\r\n if (!auth(req)) {\r\n res.status(403).json({ error: 'forbidden' });\r\n return;\r\n }\r\n\r\n const action = req.path.slice(endpoint.length + 1);\r\n\r\n try {\r\n if (action === 'entries' && req.method === 'GET') {\r\n const entries = await cache.entries();\r\n res.status(200).json({ entries, now: Date.now() });\r\n return;\r\n }\r\n\r\n if (action === 'config' && req.method === 'GET') {\r\n res.status(200).json({ ...cache.config });\r\n return;\r\n }\r\n\r\n if (action === 'invalidate' && req.method === 'POST') {\r\n const body = (req.body ?? {}) as Partial<InvalidateInput>;\r\n const hasTags = Array.isArray(body.tags) && body.tags.length > 0;\r\n if (!hasTags) {\r\n res.status(400).json({ error: 'non-empty `tags` array is required' });\r\n return;\r\n }\r\n const marked = await cache.invalidate(body as InvalidateInput);\r\n res.status(200).json({ marked });\r\n return;\r\n }\r\n\r\n if (action === 'flush' && req.method === 'POST') {\r\n await cache.flush();\r\n res.status(200).json({ ok: true });\r\n return;\r\n }\r\n\r\n res.status(404).json({ error: `unknown cache admin action: ${action}` });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'cache admin error';\r\n res.status(500).json({ error: message });\r\n }\r\n };\r\n}\r\n","// Configuration\r\nexport { LOADER_DATA_ENDPOINT } from './constants';\r\n\r\n// Express handlers\r\nexport {\r\n ExpressDataHandlerOptions,\r\n ExpressRequest,\r\n ExpressResponse,\r\n ExpressNextFunction,\r\n ExpressMiddleware,\r\n DataHandlerConfig,\r\n} from './models';\r\n\r\nexport { ServerLoaderRunner } from './server-loader-runner';\r\nexport { provideServerLoaderRunner } from './provide-server-loader-runner';\r\n\r\nexport * from './middleware';\r\n\r\n// Loader cache (server-only). Browser code must not reach createLoaderCache —\r\n// see plan §1 (Browser safety). The exports here are types + server factories;\r\n// they tree-shake out of the browser bundle when not referenced.\r\nexport * from './cache';\r\n","import { Injectable, inject, computed, PLATFORM_ID, REQUEST, type Signal } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router, NavigationEnd, type ActivatedRouteSnapshot } from '@angular/router';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { filter, map, startWith } from 'rxjs';\r\nimport type { Page } from '@sitecore-content-sdk/content/client';\r\nimport { DictionaryPhrases } from '@sitecore-content-sdk/content/i18n';\r\nimport { SITECORE_CONFIG_TOKEN } from './tokens';\r\nimport { splitLocaleFromPath, resolveCurrentPath } from '../i18n/locale-utils';\r\n/** Merged keys from route resolve data (same keys apps use today). */\r\ninterface SitecoreRouteData {\r\n page?: Page | null;\r\n dictionary?: DictionaryPhrases | null;\r\n}\r\n/**\r\n * Walk the activated route tree and merge `data` from every snapshot node.\r\n * @param {Router} router - Angular Router instance\r\n * @returns {SitecoreRouteData} Merged route data\r\n */\r\nfunction getMergedRouteData(router: Router): SitecoreRouteData {\r\n const merged: SitecoreRouteData = {};\r\n const stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root];\r\n while (stack.length > 0) {\r\n const route = stack.pop()!;\r\n Object.assign(merged, route.data);\r\n stack.push(...route.children);\r\n }\r\n return merged;\r\n}\r\n/**\r\n * Request-scoped Sitecore context derived reactively from the Angular Router.\r\n *\r\n * - `page` / `dictionary` — from route resolve data (`loaderResolver('page'|'dictionary')`)\r\n * - `urlLocale` — from current pathname (SSR REQUEST / window.location, then NavigationEnd)\r\n * - `isEditing` / `effectiveLocale` — computed from page + urlLocale + config\r\n *\r\n * No manual `setPage` / `setDictionary` / `setLocale` wiring required in app components.\r\n * @public\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SitecoreContextService {\r\n /** Current Sitecore page data (layout + mode). */\r\n readonly page: Signal<Page | null> = computed(() => this.routeData()?.page ?? null);\r\n /** Current Sitecore dictionary data. */\r\n readonly dictionary: Signal<DictionaryPhrases | null> = computed(\r\n () => this.routeData()?.dictionary ?? null\r\n );\r\n /** Whether the current page is in editing mode. */\r\n readonly isEditing: Signal<boolean> = computed(() => this.page()?.mode?.isEditing ?? false);\r\n /**\r\n * Locale extracted from the current URL; `null` when no configured-locale prefix\r\n * or when locales are not configured.\r\n */\r\n readonly urlLocale: Signal<string | null> = computed(() => {\r\n if (this.locales.length === 0) {\r\n return null;\r\n }\r\n return splitLocaleFromPath(this.pathname(), this.locales).locale;\r\n });\r\n /**\r\n * Effective locale for data fetching: `page.locale ?? urlLocale ?? defaultLanguage`.\r\n */\r\n readonly effectiveLocale: Signal<string> = computed(\r\n () => this.page()?.locale ?? this.urlLocale() ?? this.defaultLanguage\r\n );\r\n private readonly router = inject(Router);\r\n private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly req = inject(REQUEST, { optional: true });\r\n private readonly isBrowser = isPlatformBrowser(this.platformId);\r\n private readonly locales = this.config?.angular?.locales ?? [];\r\n private readonly defaultLanguage = this.config?.defaultLanguage ?? 'en';\r\n /** Merged resolve data; updates on every completed navigation. */\r\n private readonly routeData = toSignal(\r\n this.router.events.pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n map(() => getMergedRouteData(this.router)),\r\n startWith(getMergedRouteData(this.router))\r\n ),\r\n { initialValue: getMergedRouteData(this.router) }\r\n );\r\n /**\r\n * Current pathname without query string.\r\n * SSR/bootstrap: REQUEST or window.location; client: NavigationEnd.urlAfterRedirects.\r\n */\r\n private readonly pathname = toSignal(\r\n this.router.events.pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n map((e) => e.urlAfterRedirects.split('?')[0]),\r\n startWith(resolveCurrentPath(this.req ?? null, this.isBrowser))\r\n ),\r\n { initialValue: resolveCurrentPath(this.req ?? null, this.isBrowser) }\r\n );\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslateLoader } from '@ngx-translate/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { SitecoreContextService } from '../lib/sitecore-context.service';\r\n\r\n/**\r\n * `ngx-translate` loader using Sitecore dictionary from {@link SitecoreContextService}.\r\n * Requires a `dictionaryLoader` resolver on the active route — without it, `dictionary()`\r\n * is `null` and translations resolve to `{}`.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class SitecoreTranslateLoader implements TranslateLoader {\r\n private readonly context = inject(SitecoreContextService);\r\n\r\n /**\r\n * Returns the translation based on the dictionary in the context from {@link SitecoreContextService}.\r\n * @returns {Observable<Record<string, string>>} Observable of translation dictionary.\r\n */\r\n getTranslation(): Observable<Record<string, string>> {\r\n const dictionary = this.context.dictionary();\r\n return of(dictionary ?? {});\r\n }\r\n}\r\n","import { Injectable, PLATFORM_ID, REQUEST, inject } from '@angular/core';\r\nimport { DefaultUrlSerializer, type UrlTree } from '@angular/router';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { resolveCurrentPath, splitLocaleFromPath } from './locale-utils';\r\nimport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n/**\r\n * Locale-aware {@link UrlSerializer} replacement. Extends {@link DefaultUrlSerializer} and\r\n * prepends the current URL locale (from the request pathname) to every serialized\r\n * URL. Angular's built-in `[routerLink]` computes hrefs via `router.serializeUrl()`, which\r\n * delegates to the DI-injected `UrlSerializer.serialize()` — so replacing the binding makes\r\n * every routerLink href locale-aware with no directive changes.\r\n *\r\n * Behavior:\r\n * - When `currentLocale` is `null` (URL has no configured locale prefix), serialization is\r\n * unchanged.\r\n * - When the serialized URL already starts with a configured locale segment, serialization\r\n * is unchanged (mirrors ScLinkDirective idempotency under repeated cycles).\r\n * - Otherwise the locale segment is prepended to the serialized URL.\r\n *\r\n * Parsing is inherited from the default — this serializer does **not** strip locale on\r\n * parse. The locale matcher (`scLocaleMatcher`) consumes the locale segment from the\r\n * route tree instead.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class LocaleUrlSerializer extends DefaultUrlSerializer {\r\n private readonly locales =\r\n inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n private readonly req = inject(REQUEST, { optional: true });\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n override serialize(tree: UrlTree): string {\r\n const base = super.serialize(tree);\r\n if (this.locales.length > 0 && splitLocaleFromPath(base, this.locales).locale) {\r\n return base;\r\n }\r\n const isBrowser = isPlatformBrowser(this.platformId);\r\n const currentLocale = splitLocaleFromPath(\r\n resolveCurrentPath(this.req, isBrowser),\r\n this.locales\r\n ).locale;\r\n\r\n if (!currentLocale) {\r\n return base;\r\n }\r\n return getLocaleRewrite(base, currentLocale);\r\n }\r\n}\r\n","import { Type } from '@angular/core';\r\n\r\n/**\r\n * SXA uses a special export name to identify the \"default\" variant.\r\n * @public\r\n */\r\nexport const DEFAULT_EXPORT_NAME = 'Default';\r\n\r\nexport type AngularModule = {\r\n /** Named variant exports */\r\n [key: string]: Type<unknown> | undefined;\r\n /** Default component for this rendering */\r\n default?: Type<unknown>;\r\n /** SXA convention: uppercase Default */\r\n Default?: Type<unknown>;\r\n};\r\n\r\n/**\r\n * An entry in the Angular component map. Maps Sitecore rendering names to Angular component types.\r\n * Supports SXA rendering variants via named exports alongside a default.\r\n * @public\r\n */\r\nexport type AngularContentSdkComponent = Type<unknown> | AngularModule;\r\n\r\n/**\r\n * The Angular component map type: maps Sitecore rendering names to standalone component types or SXA variant groups.\r\n * @public\r\n */\r\nexport type ComponentMap = Map<string, AngularContentSdkComponent>;\r\n","import { InjectionToken } from '@angular/core';\r\nimport type { ComponentMap } from './types';\r\n\r\n/**\r\n * Injection token for the Sitecore component map.\r\n * Provide this at the application level via `provideSitecoreAngular` or\r\n * directly as `{ provide: SITECORE_COMPONENT_MAP, useValue: yourMap }`.\r\n * @public\r\n */\r\nexport const SITECORE_COMPONENT_MAP = new InjectionToken<ComponentMap>('SITECORE_COMPONENT_MAP');\r\n","import { Type } from '@angular/core';\r\nimport {\r\n ComponentRendering,\r\n RouteData,\r\n isDynamicPlaceholder,\r\n getDynamicPlaceholderPattern,\r\n} from '@sitecore-content-sdk/content/layout';\r\nimport { HIDDEN_RENDERING_NAME } from '@sitecore-content-sdk/content';\r\nimport { AngularContentSdkComponent, ComponentMap, DEFAULT_EXPORT_NAME } from '../types';\r\n\r\n/**\r\n * Result of resolving a component for a rendering definition.\r\n */\r\nexport interface ComponentForRendering {\r\n component: Type<unknown> | null;\r\n isEmpty: boolean;\r\n}\r\n\r\n/**\r\n * Merged props passed to each child component rendered by a placeholder.\r\n * Matches React `getChildComponentProps`: merged `fields` / `params` props plus raw `rendering`.\r\n */\r\nexport interface ChildComponentProps {\r\n fields: { [key: string]: unknown };\r\n params: { [key: string]: string };\r\n rendering: ComponentRendering;\r\n}\r\n\r\n/**\r\n * Get the renderings for the specified placeholder from the rendering layout data.\r\n * Includes dynamic placeholder handling aligned with React's implementation.\r\n * @param {ComponentRendering | RouteData} rendering - rendering data\r\n * @param {string} name - placeholder name\r\n * @param {boolean} isEditing - whether editing mode is active\r\n * @returns {ComponentRendering[]} Child renderings for the placeholder.\r\n */\r\nexport const getPlaceholderRenderings = (\r\n rendering: ComponentRendering | RouteData,\r\n name: string,\r\n isEditing: boolean\r\n): ComponentRendering[] => {\r\n let phName = name.slice();\r\n let placeholdersForRead: Record<string, ComponentRendering[]> | undefined;\r\n\r\n if (rendering?.placeholders) {\r\n if (isEditing) {\r\n Object.keys(rendering.placeholders).forEach((key) => {\r\n const patternPlaceholder = isDynamicPlaceholder(key)\r\n ? getDynamicPlaceholderPattern(key)\r\n : null;\r\n\r\n if (patternPlaceholder && patternPlaceholder.test(phName)) {\r\n phName = key;\r\n }\r\n });\r\n placeholdersForRead = rendering.placeholders;\r\n } else {\r\n placeholdersForRead = { ...rendering.placeholders };\r\n Object.entries(rendering.placeholders).forEach(([key, value]) => {\r\n const patternPlaceholder = isDynamicPlaceholder(key)\r\n ? getDynamicPlaceholderPattern(key)\r\n : null;\r\n\r\n if (patternPlaceholder && patternPlaceholder.test(phName)) {\r\n placeholdersForRead![phName] = value;\r\n delete placeholdersForRead![key];\r\n }\r\n });\r\n }\r\n }\r\n\r\n let result: ComponentRendering[] | null = null;\r\n if (rendering && placeholdersForRead && Object.keys(placeholdersForRead).length > 0) {\r\n result = placeholdersForRead[phName] ?? null;\r\n }\r\n\r\n if (!result) {\r\n console.warn(\r\n `Placeholder '${phName}' was not found in the current rendering data`,\r\n JSON.stringify(rendering, null, 2)\r\n );\r\n return [];\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Extra inputs to set on each dynamically rendered component (in addition to `fields`, `params`, and `rendering`).\r\n * Keys are Angular `input()` names on the host component.\r\n * @public\r\n */\r\nexport type PassThroughProps = Readonly<Record<string, unknown>>;\r\n\r\n/**\r\n * Get SXA specific params from Sitecore rendering params.\r\n * @param {ComponentRendering} rendering - Rendering object.\r\n * @returns {{ Styles: string } | undefined} Converted SXA params, or `undefined` when none apply.\r\n */\r\nexport const getSXAParams = (rendering: ComponentRendering) => {\r\n if (!rendering.params) return { Styles: '' };\r\n\r\n const { GridParameters, Styles } = rendering.params;\r\n\r\n if (GridParameters || Styles) {\r\n return { Styles: `${GridParameters || ''} ${Styles || ''}` };\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Merge placeholder-level fields/params with per-component fields/params.\r\n * @param {{ [key: string]: unknown } | undefined} placeholderFields - Placeholder-level fields.\r\n * @param {{ [key: string]: string } | undefined} placeholderParams - Placeholder-level params.\r\n * @param {ComponentRendering} componentRendering - The component rendering data.\r\n * @returns {ChildComponentProps} Merged child component props.\r\n */\r\nexport function getChildComponentProps(\r\n placeholderFields: { [key: string]: unknown } | undefined,\r\n placeholderParams: { [key: string]: string } | undefined,\r\n componentRendering: ComponentRendering\r\n): ChildComponentProps {\r\n const fields = { ...(placeholderFields || {}), ...(componentRendering.fields || {}) };\r\n const params = { ...(placeholderParams || {}), ...(componentRendering.params || {}) };\r\n const sxa = getSXAParams(componentRendering);\r\n return {\r\n fields,\r\n params: {\r\n ...params,\r\n ...(sxa || {}),\r\n },\r\n rendering: componentRendering,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve a component type for a rendering definition.\r\n * Handles hidden renderings, missing components, variant selection, and map lookup.\r\n * FEaaS/BYOC are intentionally not handled; they fall through to missingComponent.\r\n * @param {ComponentRendering} renderingDefinition - The rendering to resolve.\r\n * @param {string} placeholderName - Current placeholder name (for logging).\r\n * @param {ComponentMap | undefined} componentMap - The app component map.\r\n * @param {Type<unknown> | undefined} hiddenRenderingComponent - Optional override for hidden renderings.\r\n * @param {Type<unknown> | undefined} missingComponentComponent - Optional override for missing/unknown components.\r\n * @returns {ComponentForRendering} Resolved component info.\r\n */\r\nexport const resolveComponentForRendering = (\r\n renderingDefinition: ComponentRendering,\r\n placeholderName: string,\r\n componentMap: ComponentMap,\r\n hiddenRenderingComponent?: Type<unknown>,\r\n missingComponentComponent?: Type<unknown>\r\n): ComponentForRendering => {\r\n if (renderingDefinition.componentName === HIDDEN_RENDERING_NAME) {\r\n return {\r\n component: hiddenRenderingComponent ?? null,\r\n isEmpty: true,\r\n };\r\n }\r\n\r\n if (!renderingDefinition.componentName) {\r\n return {\r\n component: null,\r\n isEmpty: true,\r\n };\r\n }\r\n\r\n let entry: Type<unknown> | AngularContentSdkComponent | undefined;\r\n const hasComponentMap = !!(componentMap && componentMap.size > 0);\r\n if (!hasComponentMap) {\r\n console.warn(\r\n `No components were available in component map to service request for component ${renderingDefinition.componentName}`\r\n );\r\n } else {\r\n entry = componentMap.get(renderingDefinition.componentName);\r\n }\r\n\r\n if (!entry) {\r\n console.error(\r\n `Placeholder ${placeholderName} contains unknown component ${renderingDefinition.componentName}. Ensure that an Angular component exists for it, and that it is registered in your component map.`\r\n );\r\n return {\r\n component: missingComponentComponent ?? null,\r\n isEmpty: true,\r\n };\r\n }\r\n\r\n // If entry is a direct component class (function / class constructor), return it\r\n if (typeof entry === 'function') {\r\n return { component: entry, isEmpty: false };\r\n }\r\n\r\n // AngularCsdkComponent (SXA variants): pick export by FieldNames\r\n const exportName = renderingDefinition.params?.FieldNames;\r\n const resolved =\r\n exportName && exportName !== DEFAULT_EXPORT_NAME\r\n ? (entry[exportName] as Type<unknown> | undefined)\r\n : entry.default || entry.Default;\r\n\r\n if (!resolved || typeof resolved !== 'function') {\r\n const variantLabel = exportName && exportName !== DEFAULT_EXPORT_NAME ? ` (${exportName})` : '';\r\n console.error(\r\n `Placeholder ${placeholderName} contains unknown component ${renderingDefinition.componentName}${variantLabel}. Ensure that an Angular component exists for it, and that it is registered in your component map.`\r\n );\r\n return {\r\n component: missingComponentComponent ?? null,\r\n isEmpty: true,\r\n };\r\n }\r\n\r\n return { component: resolved, isEmpty: false };\r\n};\r\n","import { Component, input } from '@angular/core';\r\nimport { ComponentRendering } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Default component rendered when a Sitecore rendering has no matching entry in the component map.\r\n * @public\r\n */\r\n@Component({\r\n selector: 'sc-missing-component',\r\n template: `\r\n <div style=\"background: darkorange; outline: 5px solid orange; padding: 10px; color: white; max-width: 500px;\">\r\n <h2>{{ componentName() }}</h2>\r\n <p>Content SDK component is missing an Angular implementation. See the developer console for more information.</p>\r\n </div>\r\n `,\r\n})\r\nexport class ScMissingComponentComponent {\r\n readonly rendering = input<ComponentRendering>();\r\n readonly fields = input<{ [key: string]: unknown }>();\r\n readonly params = input<{ [key: string]: string }>();\r\n\r\n readonly componentName = () => {\r\n const r = this.rendering();\r\n return r?.componentName || 'Unnamed Component';\r\n };\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { ComponentRendering } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Default component rendered for hidden Sitecore renderings.\r\n * @public\r\n */\r\n@Component({\r\n selector: 'sc-hidden-rendering',\r\n template: `<div [style]=\"styles\">The component is hidden</div>`,\r\n})\r\nexport class ScHiddenRenderingComponent {\r\n readonly rendering = input<ComponentRendering>();\r\n readonly fields = input<{ [key: string]: unknown }>();\r\n readonly params = input<{ [key: string]: string }>();\r\n\r\n readonly styles = {\r\n background: 'repeating-linear-gradient(135deg, #fff, #fff 10px, #f0f0f0 10px, #f0f0f0 20px)',\r\n minHeight: '30px',\r\n border: '1px dashed #ccc',\r\n padding: '10px',\r\n opacity: 0.7,\r\n };\r\n}\r\n","import {\r\n Component,\r\n inject,\r\n input,\r\n computed,\r\n Type,\r\n Injector,\r\n ViewContainerRef,\r\n effect,\r\n viewChild,\r\n isDevMode,\r\n ComponentRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ComponentRendering, RouteData } from '@sitecore-content-sdk/content/layout';\r\nimport { SitecoreContextService } from '../../lib/sitecore-context.service';\r\nimport { SITECORE_COMPONENT_MAP } from '../tokens';\r\nimport type { AngularContentSdkComponent, ComponentMap } from '../types';\r\nimport {\r\n getPlaceholderRenderings,\r\n getChildComponentProps,\r\n resolveComponentForRendering,\r\n type PassThroughProps,\r\n} from './placeholder-utils';\r\nimport { ScMissingComponentComponent } from '../sc-missing-component.component';\r\nimport { ScHiddenRenderingComponent } from '../sc-hidden-rendering.component';\r\n\r\n/**\r\n * Angular placeholder component. Renders components from layout data for a given placeholder name.\r\n *\r\n * Usage:\r\n * ```html\r\n * <sc-placeholder name=\"headless-main\" [rendering]=\"route\"></sc-placeholder>\r\n * ```\r\n *\r\n * Optional `[passThroughProps]` sets extra `input()` values on each child (merged after `fields`, `params`, and `rendering`).\r\n * @public\r\n */\r\n@Component({\r\n selector: 'sc-placeholder',\r\n imports: [CommonModule],\r\n template: `<ng-container #container></ng-container>`,\r\n})\r\nexport class ScPlaceholderComponent {\r\n /** Name of the placeholder to render. */\r\n readonly name = input.required<string>();\r\n\r\n /** Rendering or route data containing placeholders. */\r\n readonly rendering = input.required<ComponentRendering | RouteData>();\r\n\r\n /** Optional placeholder-level fields merged into each child. */\r\n readonly fields = input<{ [key: string]: unknown }>();\r\n\r\n /** Optional placeholder-level params merged into each child's `params` input. */\r\n readonly params = input<{ [key: string]: string }>();\r\n\r\n /**\r\n * Extra inputs to set on each dynamically created component, after the standard `fields`, `params`, and `rendering` inputs.\r\n * Keys must match `input()` names on the target components.\r\n */\r\n readonly passThroughProps = input<PassThroughProps>({});\r\n\r\n /** Override component map (defaults to injected SITECORE_COMPONENT_MAP). */\r\n readonly componentMap = input<ComponentMap>();\r\n\r\n /** Override for missing component rendering. */\r\n readonly missingComponent = input<Type<unknown>>();\r\n\r\n /** Override for hidden rendering component. */\r\n readonly hiddenRenderingComponent = input<Type<unknown>>();\r\n\r\n private readonly context = inject(SitecoreContextService);\r\n private readonly contextComponentMap = inject(SITECORE_COMPONENT_MAP, { optional: true });\r\n private readonly injector = inject(Injector);\r\n\r\n private readonly containerRef = viewChild('container', { read: ViewContainerRef });\r\n\r\n private readonly isEditing = computed(() => this.context.isEditing());\r\n\r\n constructor() {\r\n effect(() => {\r\n const container = this.containerRef();\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const rendering = this.rendering();\r\n const name = this.name();\r\n const componentMap =\r\n this.componentMap() ??\r\n this.contextComponentMap ??\r\n new Map<string, AngularContentSdkComponent>();\r\n const isEditing = this.isEditing();\r\n\r\n const renderings = getPlaceholderRenderings(rendering, name, isEditing);\r\n\r\n container.clear();\r\n\r\n if (renderings.length === 0) {\r\n return;\r\n }\r\n\r\n for (const componentRendering of renderings) {\r\n const { component } = resolveComponentForRendering(\r\n componentRendering,\r\n name,\r\n componentMap,\r\n this.hiddenRenderingComponent() ?? ScHiddenRenderingComponent,\r\n this.missingComponent() ?? ScMissingComponentComponent\r\n );\r\n\r\n if (!component) {\r\n continue;\r\n }\r\n\r\n const childProps = getChildComponentProps(this.fields(), this.params(), componentRendering);\r\n\r\n const ref = container.createComponent(component, { injector: this.injector });\r\n\r\n this.trySetInput(ref, 'fields', childProps.fields);\r\n this.trySetInput(ref, 'params', childProps.params);\r\n this.trySetInput(ref, 'rendering', childProps.rendering);\r\n\r\n const passThrough = this.passThroughProps();\r\n if (passThrough && typeof passThrough === 'object') {\r\n for (const [inputName, value] of Object.entries(passThrough)) {\r\n this.trySetInput(ref, inputName, value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n private trySetInput(ref: ComponentRef<unknown>, inputName: string, value: unknown): void {\r\n try {\r\n ref.setInput(inputName, value);\r\n } catch (e) {\r\n if (isDevMode()) {\r\n console.debug(\r\n `[sc-placeholder] Skipped input \"${inputName}\" — not declared on component`,\r\n e\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n inject,\r\n input,\r\n ElementRef,\r\n ViewChild,\r\n afterNextRender,\r\n PLATFORM_ID,\r\n DestroyRef,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { ComponentRendering } from '@sitecore-content-sdk/content/layout';\r\nimport { form } from '@sitecore-content-sdk/content';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { SitecoreContextService } from '../lib/sitecore-context.service';\r\n\r\nconst { executeScriptElements, loadForm, subscribeToFormSubmitEvent } = form;\r\n\r\n/* eslint-disable @typescript-eslint/member-ordering -- ViewChild + signal inputs + constructor ordering conflicts with default groups */\r\n/**\r\n * Angular wrapper for Sitecore Forms.\r\n * Loads form HTML from Edge, executes embedded scripts, and subscribes to form events.\r\n *\r\n * Usage: register in the component map with the rendering name \"Form\".\r\n * @public\r\n */\r\n@Component({\r\n selector: 'sc-form',\r\n template: ` <div #formContainer [class]=\"styles()\" [id]=\"renderingId()\"></div> `,\r\n})\r\nexport class ScFormComponent {\r\n @ViewChild('formContainer', { static: true })\r\n private formContainerRef!: ElementRef<HTMLDivElement>;\r\n\r\n readonly rendering = input<ComponentRendering>();\r\n readonly params = input<{ [key: string]: string }>({});\r\n\r\n private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n private readonly context = inject(SitecoreContextService);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Merges `rendering.params` with the `params` input: the component `params()` values override layout for the same key.\r\n */\r\n private mergedFormParams(): { [key: string]: string } {\r\n return { ...(this.rendering()?.params ?? {}), ...this.params() };\r\n }\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n const p = this.mergedFormParams();\r\n const formId = p.FormId;\r\n if (!formId) return;\r\n\r\n const cfg = this.config;\r\n const edgeId = cfg?.api?.edge?.clientContextId;\r\n const edgeUrl = cfg?.api?.edge?.edgeUrl;\r\n\r\n if (!edgeId) {\r\n console.warn(\r\n 'Warning: clientContextId is missing – form cannot be loaded properly on the client'\r\n );\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n this.destroyRef.onDestroy(() => {\r\n cancelled = true;\r\n });\r\n\r\n loadForm(edgeId, formId, edgeUrl)\r\n .then((html: string) => {\r\n if (cancelled) return;\r\n const el = this.formContainerRef?.nativeElement;\r\n if (!el) return;\r\n\r\n el.innerHTML = html;\r\n\r\n const isEditing = this.context.isEditing();\r\n if (!isEditing) {\r\n subscribeToFormSubmitEvent(el, this.rendering()?.uid);\r\n }\r\n\r\n executeScriptElements(el);\r\n })\r\n .catch(() => {\r\n console.error(\r\n `Failed to load form with id ${formId}. Check debug logs for content-sdk:form for more details.`\r\n );\r\n });\r\n });\r\n }\r\n\r\n readonly styles = () => {\r\n const p = this.mergedFormParams();\r\n const s = p.styles;\r\n return s ? s.replace(/\\s+$/, '') : '';\r\n };\r\n readonly renderingId = () => {\r\n const p = this.mergedFormParams();\r\n return p.RenderingIdentifier || undefined;\r\n };\r\n}\r\n/* eslint-enable @typescript-eslint/member-ordering */\r\n","import { Directive, ElementRef, inject, input, effect, Renderer2 } from '@angular/core';\r\nimport { isFieldValueEmpty, TextField } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Renders a Sitecore text field value into the host element's text content.\r\n * For simple string/number fields in published mode.\r\n *\r\n * Usage:\r\n * ```html\r\n * <h1 [scText]=\"fields.Title\"></h1>\r\n * <span [scText]=\"fields.Subtitle\" scTextEncode=\"false\"></span>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n selector: '[scText]',\r\n})\r\nexport class ScTextDirective {\r\n /** The Sitecore text field. */\r\n readonly scText = input.required<TextField>();\r\n\r\n /** Whether to HTML-encode the value (default: true). When false, uses innerHTML. */\r\n readonly scTextEncode = input<boolean>(true);\r\n\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n constructor() {\r\n effect(() => {\r\n const field = this.scText();\r\n const encode = this.scTextEncode();\r\n const element = this.el.nativeElement;\r\n\r\n if (!field || isFieldValueEmpty(field)) {\r\n this.renderer.setProperty(element, 'textContent', '');\r\n return;\r\n }\r\n\r\n const value = String(field.value);\r\n\r\n if (encode) {\r\n this.renderer.setProperty(element, 'textContent', value);\r\n } else {\r\n this.renderer.setProperty(element, 'innerHTML', value);\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * \"className\" property will be transformed into or appended to \"class\" instead.\r\n * @param {string} fieldAttrs all other props included on the image component\r\n * @returns {void}\r\n */\r\nexport const getClassFromField = (fieldAttrs: { [key: string]: unknown }): string | undefined => {\r\n if (fieldAttrs.className) {\r\n if (fieldAttrs.class) {\r\n let mergedClass: string = fieldAttrs.className as string;\r\n mergedClass += ` ${fieldAttrs.class}`;\r\n return mergedClass;\r\n } else {\r\n return fieldAttrs.className as string | undefined;\r\n }\r\n }\r\n return fieldAttrs.class as string | undefined;\r\n};\r\n","import { Directive, ElementRef, inject, input, effect, Renderer2 } from '@angular/core';\r\nimport { isFieldValueEmpty } from '@sitecore-content-sdk/content/layout';\r\nimport { mediaApi } from '@sitecore-content-sdk/content/media';\r\nimport { getClassFromField } from './utils';\r\n\r\n/**\r\n * Image field value shape.\r\n */\r\nexport interface ImageFieldValue {\r\n [attributeName: string]: unknown;\r\n src?: string;\r\n alt?: string;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\n/**\r\n * Image field shape (with optional value wrapper).\r\n */\r\nexport interface ImageField {\r\n value?: ImageFieldValue;\r\n metadata?: { [key: string]: unknown };\r\n}\r\n\r\n/**\r\n * Renders a Sitecore image field onto a host `<img>` element.\r\n * Sets `src`, `alt`, and other attributes from the field data.\r\n *\r\n * Usage:\r\n * ```html\r\n * <img [scImage]=\"fields.Image\" />\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n selector: 'img[scImage]',\r\n})\r\nexport class ScImageDirective {\r\n /** The Sitecore image field. */\r\n readonly scImage = input.required<ImageField | ImageFieldValue | undefined>();\r\n\r\n /** Optional image params for media URL transformation. */\r\n readonly imageParams = input<{ [paramName: string]: string | number }>();\r\n\r\n /** Optional media URL prefix regexp. */\r\n readonly mediaUrlPrefix = input<RegExp>();\r\n\r\n private readonly el = inject(ElementRef<HTMLImageElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n constructor() {\r\n effect(() => {\r\n const field = this.scImage();\r\n const element = this.el.nativeElement;\r\n\r\n if (!field || isFieldValueEmpty(field)) {\r\n this.renderer.removeAttribute(element, 'src');\r\n return;\r\n }\r\n\r\n const img = (field as ImageFieldValue).src\r\n ? (field as ImageFieldValue)\r\n : (field as ImageField).value;\r\n\r\n if (!img?.src) {\r\n this.renderer.removeAttribute(element, 'src');\r\n return;\r\n }\r\n\r\n const params = this.imageParams();\r\n const prefix = this.mediaUrlPrefix();\r\n const resolvedSrc = mediaApi.updateImageUrl(img.src, params, prefix);\r\n this.renderer.setAttribute(element, 'src', resolvedSrc);\r\n const classValue = getClassFromField(img);\r\n if (classValue) {\r\n this.renderer.addClass(element, classValue);\r\n }\r\n\r\n if (img.alt !== undefined) {\r\n this.renderer.setAttribute(element, 'alt', img.alt);\r\n } else {\r\n this.renderer.removeAttribute(element, 'alt');\r\n }\r\n if (img.width !== undefined) {\r\n this.renderer.setAttribute(element, 'width', String(img.width));\r\n } else {\r\n this.renderer.removeAttribute(element, 'width');\r\n }\r\n if (img.height !== undefined) {\r\n this.renderer.setAttribute(element, 'height', String(img.height));\r\n } else {\r\n this.renderer.removeAttribute(element, 'height');\r\n }\r\n });\r\n }\r\n}\r\n","import { Renderer2 } from '@angular/core';\r\nimport { isFieldValueEmpty, LinkField, LinkFieldValue } from '@sitecore-content-sdk/content/layout';\r\nimport { getClassFromField } from './utils';\r\n\r\n/**\r\n * Splits a CSS class string and applies each token via {@link Renderer2.addClass}.\r\n * @param {Renderer2} renderer - Angular renderer.\r\n * @param {HTMLElement} element - Target element.\r\n * @param {string} classString - Space-separated class names.\r\n * @returns {void}\r\n */\r\nfunction addClassTokens(renderer: Renderer2, element: HTMLElement, classString: string): void {\r\n for (const token of classString.trim().split(/\\s+/).filter(Boolean)) {\r\n renderer.addClass(element, token);\r\n }\r\n}\r\n\r\n/**\r\n * Normalizes a Sitecore link field input to a {@link LinkFieldValue}, or `undefined` when empty.\r\n * @param {LinkField | LinkFieldValue | undefined | null} field - Raw field or value from layout.\r\n * @returns {LinkFieldValue | undefined} Resolved link value, or `undefined` when empty.\r\n */\r\nexport function resolveLinkFromField(\r\n field: LinkField | LinkFieldValue | undefined | null\r\n): LinkFieldValue | undefined {\r\n if (!field || isFieldValueEmpty(field)) {\r\n return undefined;\r\n }\r\n return (field as LinkFieldValue).href ? (field as LinkFieldValue) : (field as LinkField).value;\r\n}\r\n\r\n/**\r\n * Builds the `href` string (path + query + hash fragment) from a link value.\r\n * @param {LinkFieldValue} link - Sitecore link field value.\r\n * @returns {string} Full `href` string for an anchor.\r\n */\r\nexport function buildHrefFromLinkField(link: LinkFieldValue): string {\r\n const anchor = link.linktype !== 'anchor' && link.anchor ? `#${link.anchor}` : '';\r\n const querystring = link.querystring ? `?${link.querystring}` : '';\r\n return `${link.href || ''}${querystring}${anchor}`;\r\n}\r\n\r\nexport interface ApplyLinkFieldToAnchorOptions {\r\n preferTextFromField: boolean;\r\n originalClass?: string;\r\n originalTitle?: string;\r\n originalTarget?: string;\r\n /** Host `rel` captured before the directive applied field data (e.g. template `rel=\"nofollow\"`). */\r\n originalRel?: string | null;\r\n}\r\n\r\n/**\r\n * Applies Sitecore link attributes and optional text to a host anchor (shared by ScLink / ScRouterLink),\r\n * or preserves original attributes and text when the field link is empty.\r\n * @param {Renderer2} renderer - Angular renderer.\r\n * @param {HTMLAnchorElement} element - Host anchor element.\r\n * @param {LinkFieldValue | undefined} link - Resolved link value, or `undefined` when empty.\r\n * @param {ApplyLinkFieldToAnchorOptions} options - Text/class/title/target behavior flags.\r\n * @returns {void}\r\n */\r\nexport function applyLinkFieldToAnchor(\r\n renderer: Renderer2,\r\n element: HTMLAnchorElement,\r\n link: LinkFieldValue | undefined,\r\n options: ApplyLinkFieldToAnchorOptions\r\n): void {\r\n if (!link) {\r\n renderer.removeAttribute(element, 'href');\r\n } else {\r\n renderer.setAttribute(element, 'href', buildHrefFromLinkField(link));\r\n }\r\n const classValue = link ? getClassFromField(link) : undefined;\r\n if (classValue) {\r\n addClassTokens(renderer, element, classValue);\r\n } else {\r\n renderer.removeAttribute(element, 'class');\r\n if (options.originalClass) {\r\n addClassTokens(renderer, element, options.originalClass);\r\n }\r\n\r\n if (link?.title) {\r\n renderer.setAttribute(element, 'title', link.title);\r\n } else {\r\n renderer.removeAttribute(element, 'title');\r\n if (options.originalTitle) {\r\n renderer.setAttribute(element, 'title', options.originalTitle);\r\n }\r\n }\r\n if (link?.target) {\r\n renderer.setAttribute(element, 'target', link.target);\r\n if (link?.target === '_blank' && !options.originalRel) {\r\n renderer.setAttribute(element, 'rel', 'noopener noreferrer');\r\n } else {\r\n options.originalRel\r\n ? renderer.setAttribute(element, 'rel', options.originalRel)\r\n : renderer.removeAttribute(element, 'rel');\r\n }\r\n } else {\r\n renderer.removeAttribute(element, 'target');\r\n if (options.originalTarget) {\r\n renderer.setAttribute(element, 'target', options.originalTarget);\r\n }\r\n }\r\n\r\n const hasChildren = element.childNodes.length > 0 && element.textContent?.trim();\r\n if (!hasChildren) {\r\n const text = link?.text || link?.href || '';\r\n renderer.setProperty(element, 'textContent', text);\r\n } else if (options.preferTextFromField && link?.text) {\r\n renderer.setProperty(element, 'textContent', link?.text || '');\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, inject, input, effect, Renderer2 } from '@angular/core';\r\nimport { LinkFieldValue, LinkField } from '@sitecore-content-sdk/content/layout';\r\nimport { applyLinkFieldToAnchor, resolveLinkFromField } from './link-field-utils';\r\nimport { SitecoreContextService } from '../../lib/sitecore-context.service';\r\nimport { SITECORE_CONFIG_TOKEN } from '../../lib/tokens';\r\nimport { splitLocaleFromPath } from '../../i18n/locale-utils';\r\nimport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\n\r\nconst EXTERNAL_HREF_PREFIXES = [\r\n 'http://',\r\n 'https://',\r\n 'mailto:',\r\n 'tel:',\r\n 'sms:',\r\n 'javascript:',\r\n 'data:',\r\n 'ftp:',\r\n '//',\r\n];\r\n\r\n/**\r\n * Returns true when the href should be written to the DOM unchanged\r\n * (external scheme, protocol-relative, fragment-only, or empty/whitespace).\r\n * @param {string} href - Raw href string from the Sitecore link field.\r\n * @returns {boolean} Whether the href is non-internal and must be left alone.\r\n */\r\nfunction isNonInternalHref(href: string): boolean {\r\n if (!href) return true;\r\n const trimmed = href.trim();\r\n if (!trimmed) return true;\r\n if (trimmed.startsWith('#')) return true;\r\n const lower = trimmed.toLowerCase();\r\n return EXTERNAL_HREF_PREFIXES.some((p) => lower.startsWith(p));\r\n}\r\n\r\n/**\r\n * Renders a Sitecore link field onto a host `<a>` element.\r\n * Sets `href`, `title`, `target`, `class`, and text content from the field data.\r\n *\r\n * Locale-awareness: when a configured locale list is provided via `sitecore.config`,\r\n * internal hrefs are prefixed with the current URL locale (read from\r\n * {@link SitecoreContextService}). Hrefs that already contain a configured-locale segment\r\n * are written as-is, which respects author-intent cross-locale links and keeps the\r\n * directive idempotent under repeated change detection.\r\n *\r\n * Usage:\r\n * ```html\r\n * <a [scLink]=\"fields.Link\">Optional child content</a>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n selector: 'a[scLink]',\r\n})\r\nexport class ScLinkDirective {\r\n /** The Sitecore link field. */\r\n readonly scLink = input.required<LinkField | LinkFieldValue>();\r\n\r\n /** Whether to show link text alongside existing child content. */\r\n readonly preferTextFromField = input<boolean>(false);\r\n\r\n protected readonly el = inject(ElementRef<HTMLAnchorElement>);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly context = inject(SitecoreContextService);\r\n private readonly locales =\r\n inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n private readonly originalClass: string | undefined;\r\n private readonly originalTitle: string | undefined;\r\n private readonly originalTarget: string | undefined;\r\n private readonly originalRel: string | null;\r\n\r\n constructor() {\r\n this.originalClass = (this.el.nativeElement as HTMLAnchorElement).className;\r\n this.originalTitle = (this.el.nativeElement as HTMLAnchorElement).title;\r\n this.originalTarget = (this.el.nativeElement as HTMLAnchorElement).target;\r\n this.originalRel = (this.el.nativeElement as HTMLAnchorElement).rel;\r\n effect(() => {\r\n const field = this.scLink();\r\n const element = this.el.nativeElement;\r\n\r\n const link = resolveLinkFromField(field);\r\n const localizedLink = link ? this.localizeLink(link) : link;\r\n\r\n applyLinkFieldToAnchor(this.renderer, element, localizedLink, {\r\n preferTextFromField: this.preferTextFromField(),\r\n originalClass: this.originalClass,\r\n originalTitle: this.originalTitle,\r\n originalTarget: this.originalTarget,\r\n originalRel: this.originalRel,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Returns a copy of the link with `href` prefixed by the current URL locale when applicable.\r\n * Internal hrefs are prefixed only when:\r\n * 1. There is a current URL locale (page itself has a locale prefix), and\r\n * 2. The href does not already start with a configured locale segment.\r\n * External, fragment-only, and locale-prefixed hrefs are returned unchanged.\r\n * @param {LinkFieldValue} link - Resolved link value from layout data.\r\n * @returns {LinkFieldValue} Link value with locale-aware href.\r\n */\r\n private localizeLink(link: LinkFieldValue): LinkFieldValue {\r\n const href = link.href ?? '';\r\n if (isNonInternalHref(href)) {\r\n return link;\r\n }\r\n if (this.locales.length > 0) {\r\n const { locale } = splitLocaleFromPath(href, this.locales);\r\n if (locale) {\r\n return link;\r\n }\r\n }\r\n const currentLocale = this.context.urlLocale();\r\n if (!currentLocale) {\r\n return link;\r\n }\r\n return { ...link, href: getLocaleRewrite(href, currentLocale) };\r\n }\r\n}\r\n","import { Directive, HostListener, inject, input } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport type { LinkField, LinkFieldValue } from '@sitecore-content-sdk/content/layout';\r\nimport { ScLinkDirective } from './sc-link.directive';\r\n\r\n/**\r\n * Renders a Sitecore link field onto a host `<a>` and calls `Router.navigateByUrl` on click\r\n * for in-app paths only. Clicks are left to the browser when `href` is missing/empty, when\r\n * `target=\"_blank\"`, or when `href` uses http(s), mailto, tel, sms, javascript, data, ftp,\r\n * or protocol-relative (`//`) URLs.\r\n *\r\n * Usage:\r\n * ```html\r\n * <a [scRouterLink]=\"fields.Link\">Optional child content</a>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n selector: 'a[scRouterLink]',\r\n})\r\nexport class ScRouterLinkDirective extends ScLinkDirective {\r\n /**\r\n * Sitecore link field; host attribute `[scRouterLink]` maps to the base {@link ScLinkDirective.scLink} input.\r\n */\r\n override readonly scLink = input.required<LinkField | LinkFieldValue>({ alias: 'scRouterLink' });\r\n\r\n private readonly router = inject(Router);\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: MouseEvent): void {\r\n const el = this.el.nativeElement;\r\n const hrefAttr = el.getAttribute('href')?.trim() ?? '';\r\n const targetAttr = el.getAttribute('target');\r\n if (this.shouldDeferNavigation(hrefAttr, targetAttr)) {\r\n return;\r\n }\r\n\r\n // Early return in editing mode\r\n // if (this.sitecoreContext.isEditing()) {\r\n // return;\r\n // }\r\n\r\n void this.router.navigateByUrl(hrefAttr);\r\n if (!hrefAttr.includes('#')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Returns true when the browser should handle navigation (no in-app Router navigation).\r\n * @param {string | null} hrefAttr - Raw `href` attribute from the anchor.\r\n * @param {string | null} targetAttr - Raw `target` attribute from the anchor.\r\n * @returns {boolean} Whether to skip `Router.navigateByUrl`.\r\n */\r\n private shouldDeferNavigation(hrefAttr: string | null, targetAttr: string | null): boolean {\r\n if (!hrefAttr || hrefAttr === '') {\r\n return true;\r\n }\r\n if (targetAttr === '_blank') {\r\n return true;\r\n }\r\n const lower = hrefAttr.toLowerCase();\r\n return (\r\n lower.startsWith('http://') ||\r\n lower.startsWith('https://') ||\r\n lower.startsWith('mailto:') ||\r\n lower.startsWith('tel:') ||\r\n lower.startsWith('sms:') ||\r\n lower.startsWith('javascript:') ||\r\n lower.startsWith('data:') ||\r\n lower.startsWith('ftp:') ||\r\n lower.startsWith('//')\r\n );\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n effect,\r\n Renderer2,\r\n SecurityContext,\r\n} from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { isFieldValueEmpty, TextField } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Renders a Sitecore rich text field value as innerHTML of the host element.\r\n * Content is marked trusted for Angular sanitization (typical for CMS-authored HTML).\r\n *\r\n * Usage:\r\n * ```html\r\n * <div [scRichText]=\"fields.Content\"></div>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n selector: '[scRichText]',\r\n})\r\nexport class ScRichTextDirective {\r\n /** The Sitecore rich text field. */\r\n readonly scRichText = input.required<TextField>();\r\n\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n constructor() {\r\n effect(() => {\r\n const field = this.scRichText();\r\n const element = this.el.nativeElement;\r\n\r\n if (!field || isFieldValueEmpty(field)) {\r\n this.renderer.setProperty(element, 'innerHTML', '');\r\n return;\r\n }\r\n\r\n const raw = (field.value as string) ?? '';\r\n const trusted = this.sanitizer.bypassSecurityTrustHtml(raw);\r\n const html = this.sanitizer.sanitize(SecurityContext.HTML, trusted) ?? '';\r\n this.renderer.setProperty(element, 'innerHTML', html);\r\n });\r\n }\r\n}\r\n","// ─── Angular SDK providers and tokens ──────────────────────────\r\nexport { type AngularCSDKAppInit } from './lib/providers';\r\nexport { SITECORE_CONFIG_TOKEN, SITECORE_CLIENT_TOKEN } from './lib/tokens';\r\nexport { resolveSitecorePage } from './lib/sitecore-page-resolver';\r\n\r\nexport {\r\n defineConfig,\r\n type AngularSitecoreConfigInput,\r\n type AngularSitecoreConfig,\r\n} from './config/define-config';\r\nexport {\r\n getContentStylesheetLink,\r\n getDesignLibraryStylesheetLinks,\r\n LayoutServiceData,\r\n LayoutServicePageState,\r\n LayoutServiceContext,\r\n LayoutServiceContextData,\r\n LayoutService,\r\n RouteData,\r\n Field,\r\n Item,\r\n getChildPlaceholder,\r\n getFieldValue,\r\n ComponentRendering,\r\n ComponentFields,\r\n ComponentParams,\r\n EditMode,\r\n} from '@sitecore-content-sdk/content/layout';\r\nexport type {\r\n ImageField,\r\n ImageFieldValue,\r\n ImageSizeParameters,\r\n LinkField,\r\n LinkFieldValue,\r\n RichTextField,\r\n TextField,\r\n} from '@sitecore-content-sdk/content/layout';\r\nexport { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/content/editing';\r\nexport {\r\n GraphQLClientError,\r\n RetryStrategy,\r\n DefaultRetryStrategy,\r\n GraphQLRequestClientFactoryConfig,\r\n GraphQLRequestClient,\r\n PageMode,\r\n ErrorPage,\r\n Page,\r\n SitecoreClient,\r\n} from '@sitecore-content-sdk/content/client';\r\nexport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\nexport { mediaApi } from '@sitecore-content-sdk/content/media';\r\nexport { SitePathService, SitePathServiceConfig } from '@sitecore-content-sdk/content/site';\r\nexport {\r\n constants,\r\n enableDebug,\r\n ClientError,\r\n CacheClient,\r\n CacheOptions,\r\n MemoryCacheClient,\r\n NativeDataFetcher,\r\n NativeDataFetcherResponse,\r\n NativeDataFetcherConfig,\r\n} from '@sitecore-content-sdk/core';\r\n/**\r\n * Public API Surface of @sitecore-content-sdk/angular\r\n */\r\n\r\nimport { VERSION as CORE_VERSION } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n// Angular-specific exports\r\nexport * from './loaders/loader-resolver';\r\nexport * from './loaders/loader-registry.token';\r\nexport * from './loaders/client-loader-data.service';\r\nexport * from './loaders/pre-loader-data.service';\r\nexport {\r\n SERVER_LOADER_RUNNER,\r\n type ServerLoaderRunnerPort,\r\n} from './loaders/server-loader-runner.token';\r\nexport { type LoaderRegistry } from './loaders/loader-registry.token';\r\nexport {\r\n NotFoundNavigationError,\r\n LoaderHttpError,\r\n type LoaderFn,\r\n type LoaderContext,\r\n type LoaderDataResult,\r\n type PerRouteLoaderCacheConfig,\r\n type LoaderCacheConfig,\r\n} from './loaders/models';\r\nexport { handleNavigationError } from './loaders/router-error-handling';\r\nexport { applyRedirect } from './loaders/utils';\r\nexport { provideSitecoreAngular } from './lib/providers';\r\nexport * from './server';\r\n\r\n// ─── Sitecore Context ──────────────────────────────────────────\r\nexport { SitecoreContextService } from './lib/sitecore-context.service';\r\n\r\nexport { SitecoreTranslateLoader } from './i18n/sitecore-translate-loader';\r\n\r\n// ─── Localized routing ────────────────────────────────────────\r\nexport {\r\n splitLocaleFromPath,\r\n scLocaleMatcher,\r\n type LocaleExtractionResult,\r\n} from './i18n/locale-utils';\r\nexport { LocaleUrlSerializer } from './i18n/locale-url-serializer';\r\n\r\n// ─── Placeholders, components and field directives ───────────────────────────────────────────────\r\nexport {\r\n DEFAULT_EXPORT_NAME,\r\n type AngularContentSdkComponent,\r\n type ComponentMap,\r\n} from './components/types';\r\nexport { SITECORE_COMPONENT_MAP } from './components/tokens';\r\nexport {\r\n type ChildComponentProps,\r\n type ComponentForRendering,\r\n type PassThroughProps,\r\n getPlaceholderRenderings,\r\n getSXAParams,\r\n getChildComponentProps,\r\n resolveComponentForRendering,\r\n} from './components/placeholder/placeholder-utils';\r\nexport { ScPlaceholderComponent } from './components/placeholder/sc-placeholder.component';\r\nexport {\r\n ScTextDirective,\r\n ScImageDirective,\r\n ScLinkDirective,\r\n ScRouterLinkDirective,\r\n ScRichTextDirective,\r\n ScHiddenRenderingComponent,\r\n ScMissingComponentComponent,\r\n} from './components';\r\nexport {} from './components';\r\nexport { ScFormComponent } from './components/sc-form.component';\r\n\r\nexport const _coreVersionMarker = CORE_VERSION;\r\nexport const _routerTokenMarker = Router;\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["baseDefineConfig","DEFAULT_ENDPOINT","CORE_VERSION"],"mappings":"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"}