@ethlete/contentful 4.0.0-next.13 → 4.0.0-next.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ethlete/contentful
2
2
 
3
+ ## 4.0.0-next.14
4
+
5
+ ### Major Changes
6
+
7
+ - **Breaking:** an `internalHosts` entry now matches its host exactly; list a subdomain or write `*.example.com`. Also adds `entryHref`, embedded entry rich text, and fixes several embed and SSR hydration bugs.
8
+
3
9
  ## 4.0.0-next.13
4
10
 
5
11
  ### Major Changes
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, computed, ViewEncapsulation, Component, InjectionToken, inject, numberAttribute, booleanAttribute, isDevMode, ViewContainerRef, ElementRef, effect, untracked, signal, reflectComponentType, inputBinding } from '@angular/core';
2
+ import { input, computed, ViewEncapsulation, Component, InjectionToken, inject, numberAttribute, booleanAttribute, isDevMode, ViewContainerRef, ElementRef, Injector, effect, untracked, signal, reflectComponentType, inputBinding } from '@angular/core';
3
3
  import { formatFileSize, normalizePictureSizes, PictureComponent } from '@ethlete/components';
4
4
  import { defineLabels, toProvideFn, toInjectFn, toToken, injectUrl, RuntimeError, isObject, getObjectProperty, injectRenderer } from '@ethlete/core';
5
5
  import { DOCUMENT, Location } from '@angular/common';
@@ -169,6 +169,7 @@ const CONTENTFUL_CONFIG = new InjectionToken('ContentfulConfig');
169
169
  */
170
170
  const CONTENTFUL_FALLBACK_CONFIG = {
171
171
  internalHosts: [],
172
+ entryHref: null,
172
173
  components: {},
173
174
  customComponents: {},
174
175
  imageOptions: {
@@ -395,25 +396,34 @@ const parseWebUrl = (href) => {
395
396
  return null;
396
397
  }
397
398
  };
398
- const normalizeHostname = (host) => {
399
+ const parseConfiguredHost = (host) => {
399
400
  const value = host.trim().toLowerCase();
401
+ const wildcard = value.startsWith('*.');
402
+ const bare = wildcard ? value.slice(2) : value;
400
403
  try {
401
- return new URL(value.includes('://') ? value : 'https://' + value).hostname;
404
+ const url = new URL(bare.includes('://') ? bare : 'https://' + bare);
405
+ return { hostname: url.hostname, port: url.port, wildcard };
402
406
  }
403
407
  catch {
404
- return value.split(':')[0] ?? value;
408
+ return { hostname: bare.split(':')[0] ?? bare, port: '', wildcard };
405
409
  }
406
410
  };
407
- const matchesHostname = (hostname, configuredHost) => {
408
- const normalizedHost = normalizeHostname(configuredHost);
409
- return hostname === normalizedHost || hostname.endsWith('.' + normalizedHost);
411
+ const matchesConfiguredHost = (url, configuredHost) => {
412
+ const { hostname, port, wildcard } = parseConfiguredHost(configuredHost);
413
+ if (!hostname || (port && url.port !== port))
414
+ return false;
415
+ return wildcard ? url.hostname.endsWith('.' + hostname) : url.hostname === hostname;
410
416
  };
411
417
  const isInternalWebUrl = (url, { location, internalHosts }) => (url.hostname === location.hostname && url.port === location.port) ||
412
- internalHosts.some((host) => matchesHostname(url.hostname, host));
418
+ internalHosts.some((host) => matchesConfiguredHost(url, host));
413
419
  const isExternalWebHref = (href, context) => {
414
420
  const url = parseWebUrl(href);
415
421
  return url !== null && !isInternalWebUrl(url, context);
416
422
  };
423
+ const internalWebHrefPath = (href, context) => {
424
+ const url = parseWebUrl(href);
425
+ return url && isInternalWebUrl(url, context) ? url.pathname + url.search + url.hash : null;
426
+ };
417
427
  const hasUrlScheme = (href) => /^[a-z][a-z\d+.-]*:/i.test(href);
418
428
  const isRouteRelativeHref = (href) => !hasUrlScheme(href) && !href.startsWith('/');
419
429
  const resolveHrefAgainstRoute = (href, routerUrl) => {
@@ -558,7 +568,7 @@ const CF_INLINES = {
558
568
  const RICH_TEXT_RENDERER_ERRORS = {
559
569
  rich_text_not_object: (data) => `The value at richTextPath is a ${data.type}, not a rich-text document object. Point richTextPath at the rich-text field itself (e.g. items[0].fields.body).`,
560
570
  rich_text_wrong_type: 'The rich text object does not satisfy the RichTextResponse interface. It should contain a property named "nodeType" with the value "document".',
561
- rich_text_conflicting_inputs: 'gqlRichText cannot be combined with content or richTextPath. Pass either a GraphQL rich-text field through gqlRichText, or a REST response through content and richTextPath.',
571
+ rich_text_conflicting_inputs: 'Set exactly one rich-text source: a GraphQL rich-text field through gqlRichText, a REST response through content and richTextPath, or a bare document through richText (with includes).',
562
572
  asset_id_not_found: 'The asset ID was not found. This node is not supported.',
563
573
  entry_id_not_found: 'The entry ID was not found. This node is not supported.',
564
574
  text_parent_not_found: 'The parent node is not found. This structure is not supported.',
@@ -582,6 +592,11 @@ const richTextRendererError = (code, data) => {
582
592
  };
583
593
 
584
594
  const lowerCaseFirst = (value) => value.charAt(0).toLowerCase() + value.slice(1);
595
+ const toGqlTypeName = (contentTypeId) => {
596
+ const pascal = contentTypeId.replace(/[^a-z0-9]+(.)?/gi, (_, next) => next?.toUpperCase() ?? '');
597
+ return pascal.charAt(0).toUpperCase() + pascal.slice(1);
598
+ };
599
+ const toContentTypeId = (typename, contentTypeIds) => contentTypeIds.find((id) => toGqlTypeName(id) === typename) ?? lowerCaseFirst(typename);
585
600
  const toRestAsset = (asset) => ({
586
601
  sys: { type: 'Asset', id: asset.sys.id, createdAt: '', updatedAt: '', locale: '' },
587
602
  fields: {
@@ -601,7 +616,7 @@ const toRestAsset = (asset) => ({
601
616
  },
602
617
  metadata: { tags: [] },
603
618
  });
604
- const toRestEntry = (entry) => {
619
+ const toRestEntry = (entry, contentTypeIds) => {
605
620
  const { __typename, sys, ...fields } = entry;
606
621
  if (!__typename) {
607
622
  return null;
@@ -613,7 +628,7 @@ const toRestEntry = (entry) => {
613
628
  createdAt: '',
614
629
  updatedAt: '',
615
630
  locale: '',
616
- contentType: { sys: { type: 'Link', linkType: 'ContentType', id: lowerCaseFirst(__typename) } },
631
+ contentType: { sys: { type: 'Link', linkType: 'ContentType', id: toContentTypeId(__typename, contentTypeIds) } },
617
632
  },
618
633
  fields,
619
634
  metadata: { tags: [] },
@@ -622,11 +637,11 @@ const toRestEntry = (entry) => {
622
637
  const present = (items) => (items ?? []).filter((item) => item !== null && item !== undefined);
623
638
  /**
624
639
  * Maps the `links` of a GraphQL rich-text field to the entries and assets the renderer resolves
625
- * embeds against. An entry's content type id is its `__typename` with the first letter lower-cased,
626
- * which is how Contentful derives a GraphQL type name from a content type id. Entries without a
627
- * `__typename` are dropped.
640
+ * embeds against. An entry's content type id is the id in `contentTypeIds` whose GraphQL type name
641
+ * (PascalCase, separators dropped: `product-teaser` → `ProductTeaser`) equals its `__typename`, else the
642
+ * `__typename` with the first letter lower-cased. Entries without a `__typename` are dropped.
628
643
  */
629
- const mapContentfulGqlLinks = (links) => {
644
+ const mapContentfulGqlLinks = (links, contentTypeIds = []) => {
630
645
  const assets = new Map();
631
646
  const entries = new Map();
632
647
  for (const asset of [...present(links?.assets?.block), ...present(links?.assets?.hyperlink)]) {
@@ -637,7 +652,7 @@ const mapContentfulGqlLinks = (links) => {
637
652
  ...present(links?.entries?.inline),
638
653
  ...present(links?.entries?.hyperlink),
639
654
  ]) {
640
- const entry = toRestEntry(gqlEntry);
655
+ const entry = toRestEntry(gqlEntry, contentTypeIds);
641
656
  if (entry) {
642
657
  entries.set(entry.sys.id, entry);
643
658
  }
@@ -734,6 +749,12 @@ const isExecutedComponentCommandCacheItem = (cache) => {
734
749
  return cache.command.kind === 'component';
735
750
  };
736
751
  const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';
752
+ const includeMapLookups = /* @__PURE__ */ new WeakMap();
753
+ const lookupOf = (includes) => includeMapLookups.get(includes) ?? {
754
+ entry: (id) => includes.getEntry(id, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID),
755
+ asset: (id) => includes.getAsset(id),
756
+ };
757
+ const ANCESTOR_ENTRY_IDS = /* @__PURE__ */ new InjectionToken('ContentfulRichTextAncestorEntryIds');
737
758
  /**
738
759
  * Create a contentful include map using the provided entries and assets.
739
760
  */
@@ -778,12 +799,12 @@ const createContentfulIncludeMap = (config) => {
778
799
  const getAssets = (ids) => {
779
800
  return ids.map((id) => getAsset(id)).filter((asset) => asset !== null);
780
801
  };
781
- return {
782
- getEntry,
783
- getEntries,
784
- getAsset,
785
- getAssets,
786
- };
802
+ const includeMap = { getEntry, getEntries, getAsset, getAssets };
803
+ includeMapLookups.set(includeMap, {
804
+ entry: (id) => entryMap.get(id) ?? null,
805
+ asset: (id) => assetMap.get(id) ?? null,
806
+ });
807
+ return includeMap;
787
808
  };
788
809
  const warnedRichTextPaths = /* @__PURE__ */ new Set();
789
810
  const warnOnUnresolvedParentPath = (content, richTextPath) => {
@@ -811,6 +832,7 @@ class ContentfulRichTextRendererComponent {
811
832
  this.document = inject(DOCUMENT);
812
833
  this.location = inject(Location);
813
834
  this.url = injectUrl();
835
+ this.injector = inject(Injector);
814
836
  /**
815
837
  * The contentful response gotten via their REST api.
816
838
  * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection
@@ -830,26 +852,50 @@ class ContentfulRichTextRendererComponent {
830
852
  */
831
853
  this.gqlRichText = input(/* @ts-ignore */
832
854
  ...(ngDevMode ? [undefined, { debugName: "gqlRichText" }] : /* istanbul ignore next */ []));
855
+ /**
856
+ * A bare rich-text document, e.g. a rich-text field of an embedded entry. Pair it with `includes` so its
857
+ * embeds resolve. An alternative to `content` / `richTextPath` and `gqlRichText`.
858
+ * @example <et-contentful-rich-text-renderer [richText]="fields().body" [includes]="includes()" />
859
+ */
860
+ this.richText = input(/* @ts-ignore */
861
+ ...(ngDevMode ? [undefined, { debugName: "richText" }] : /* istanbul ignore next */ []));
862
+ /** The linked entries and assets `richText` resolves its embeds against, e.g. a custom component's `includes`. */
863
+ this.includes = input(/* @ts-ignore */
864
+ ...(ngDevMode ? [undefined, { debugName: "includes" }] : /* istanbul ignore next */ []));
865
+ this.ancestorEntryIds = inject(ANCESTOR_ENTRY_IDS, { optional: true }) ?? new Set();
833
866
  this.executedCommandsCache = new Map();
834
- this.includes = computed(() => {
867
+ this.contentIncludesMap = computed(() => {
868
+ const includes = this.includes();
869
+ if (includes) {
870
+ return includes;
871
+ }
835
872
  const gqlRichText = this.gqlRichText();
836
873
  if (gqlRichText) {
837
- return mapContentfulGqlLinks(gqlRichText.links);
874
+ return createContentfulIncludeMap(mapContentfulGqlLinks(gqlRichText.links, Object.keys(this.config.customComponents)));
875
+ }
876
+ const content = this.content();
877
+ const entries = new Map();
878
+ for (const entry of [...(content?.items ?? []), ...(content?.includes?.Entry ?? [])]) {
879
+ entries.set(entry.sys.id, entry);
838
880
  }
839
- const includes = this.content()?.includes;
840
- return { assets: includes?.Asset ?? [], entries: includes?.Entry ?? [] };
881
+ return createContentfulIncludeMap({ assets: content?.includes?.Asset ?? [], entries: [...entries.values()] });
841
882
  }, /* @ts-ignore */
842
- ...(ngDevMode ? [{ debugName: "includes" }] : /* istanbul ignore next */ []));
843
- this.contentIncludesMap = computed(() => createContentfulIncludeMap(this.includes()), /* @ts-ignore */
844
883
  ...(ngDevMode ? [{ debugName: "contentIncludesMap" }] : /* istanbul ignore next */ []));
845
- this.includedEntries = computed(() => new Map(this.includes().entries.map((entry) => [entry.sys.id, entry])), /* @ts-ignore */
846
- ...(ngDevMode ? [{ debugName: "includedEntries" }] : /* istanbul ignore next */ []));
884
+ this.linkLookup = computed(() => lookupOf(this.contentIncludesMap()), /* @ts-ignore */
885
+ ...(ngDevMode ? [{ debugName: "linkLookup" }] : /* istanbul ignore next */ []));
847
886
  this.richTextData = computed(() => {
848
887
  const gqlRichText = this.gqlRichText();
849
888
  const content = this.content();
850
889
  const richTextPath = this.richTextPath();
851
- if (ngDevMode && gqlRichText && (content || richTextPath)) {
852
- throw richTextRendererError('rich_text_conflicting_inputs', { gqlRichText, content, richTextPath });
890
+ const richText = this.richText();
891
+ if (ngDevMode && [gqlRichText, content || richTextPath, richText].filter(Boolean).length > 1) {
892
+ throw richTextRendererError('rich_text_conflicting_inputs', { gqlRichText, content, richTextPath, richText });
893
+ }
894
+ if (richText) {
895
+ if (!isRichTextRootNode(richText)) {
896
+ throw richTextRendererError('rich_text_wrong_type', { richText });
897
+ }
898
+ return richText;
853
899
  }
854
900
  if (gqlRichText) {
855
901
  if (!isRichTextRootNode(gqlRichText.json)) {
@@ -866,20 +912,20 @@ class ContentfulRichTextRendererComponent {
866
912
  }
867
913
  return null;
868
914
  }
869
- const richText = getObjectProperty(content, richTextPath);
870
- if (richText === null || richText === undefined) {
871
- if (ngDevMode && richText === undefined) {
915
+ const pathValue = getObjectProperty(content, richTextPath);
916
+ if (pathValue === null || pathValue === undefined) {
917
+ if (ngDevMode && pathValue === undefined) {
872
918
  warnOnUnresolvedParentPath(content, richTextPath);
873
919
  }
874
920
  return null;
875
921
  }
876
- if (!isObject(richText)) {
877
- throw richTextRendererError('rich_text_not_object', { content, richTextPath, type: typeof richText });
922
+ if (!isObject(pathValue)) {
923
+ throw richTextRendererError('rich_text_not_object', { content, richTextPath, type: typeof pathValue });
878
924
  }
879
- if (!isRichTextRootNode(richText)) {
925
+ if (!isRichTextRootNode(pathValue)) {
880
926
  throw richTextRendererError('rich_text_wrong_type', { content, richTextPath });
881
927
  }
882
- return richText;
928
+ return pathValue;
883
929
  }, /* @ts-ignore */
884
930
  ...(ngDevMode ? [{ debugName: "richTextData" }] : /* istanbul ignore next */ []));
885
931
  this.renderCommands = computed(() => {
@@ -999,7 +1045,7 @@ class ContentfulRichTextRendererComponent {
999
1045
  if (!assetId) {
1000
1046
  throw richTextRendererError('asset_id_not_found', { node });
1001
1047
  }
1002
- const asset = this.contentIncludesMap().getAsset(assetId);
1048
+ const asset = this.linkLookup().asset(assetId);
1003
1049
  if (!asset) {
1004
1050
  if (isDevMode()) {
1005
1051
  console.warn('Embedded asset is missing from the includes! The asset will be skipped. Is it unpublished or deleted?', { assetId, node });
@@ -1055,10 +1101,16 @@ class ContentfulRichTextRendererComponent {
1055
1101
  }
1056
1102
  else if (node.nodeType === CF_INLINES.ASSET_HYPERLINK) {
1057
1103
  const assetId = node.data['target']?.sys?.id;
1058
- const asset = assetId ? this.contentIncludesMap().getAsset(assetId) : null;
1104
+ const asset = assetId ? this.linkLookup().asset(assetId) : null;
1059
1105
  const url = asset?.fields.file?.url;
1060
1106
  href = url ? normalizeHref(url) : null;
1061
1107
  }
1108
+ else if (this.config.entryHref) {
1109
+ const entryId = node.data['target']?.sys?.id;
1110
+ const entry = entryId ? this.linkLookup().entry(entryId) : null;
1111
+ const entryHref = entry ? this.config.entryHref(entry) : null;
1112
+ href = entryHref ? normalizeHref(entryHref) : null;
1113
+ }
1062
1114
  const linkTexts = node.content.filter((child) => child.nodeType === 'text' && Boolean(child.value));
1063
1115
  if (!linkTexts.length) {
1064
1116
  break;
@@ -1066,11 +1118,15 @@ class ContentfulRichTextRendererComponent {
1066
1118
  const linkText = linkTexts.map((child) => child.value).join('');
1067
1119
  const linkComponent = href ? this.config.components.link : null;
1068
1120
  if (href && !linkComponent) {
1069
- const anchorHref = isRouteRelativeHref(href)
1070
- ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url()))
1071
- : href;
1121
+ const webUrlContext = { location: this.document.location, internalHosts: this.config.internalHosts };
1122
+ const internalPath = internalWebHrefPath(href, webUrlContext);
1123
+ const anchorHref = internalPath !== null
1124
+ ? this.location.prepareExternalUrl(internalPath)
1125
+ : isRouteRelativeHref(href)
1126
+ ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url()))
1127
+ : href;
1072
1128
  const attributes = { class: DEFAULT_ANCHOR_CLASS, href: anchorHref };
1073
- if (isExternalWebHref(href, { location: this.document.location, internalHosts: this.config.internalHosts })) {
1129
+ if (isExternalWebHref(href, webUrlContext)) {
1074
1130
  attributes['target'] = '_blank';
1075
1131
  attributes['rel'] = 'noopener noreferrer';
1076
1132
  }
@@ -1135,7 +1191,13 @@ class ContentfulRichTextRendererComponent {
1135
1191
  if (!entryId) {
1136
1192
  throw richTextRendererError('entry_id_not_found', { node });
1137
1193
  }
1138
- const entry = this.includedEntries().get(entryId);
1194
+ if (this.ancestorEntryIds.has(entryId)) {
1195
+ if (isDevMode()) {
1196
+ console.warn('Embedded entry embeds itself through its own rich text! The nested occurrence is skipped to stop the cycle.', { entryId, node });
1197
+ }
1198
+ break;
1199
+ }
1200
+ const entry = this.linkLookup().entry(entryId);
1139
1201
  if (!entry) {
1140
1202
  if (isDevMode()) {
1141
1203
  console.warn('Embedded entry is missing from the includes! The entry will be skipped. Is it unpublished or deleted, or is the include query param too low?', { entryId, node });
@@ -1166,11 +1228,22 @@ class ContentfulRichTextRendererComponent {
1166
1228
  sys: entry.sys,
1167
1229
  includes: this.contentIncludesMap(),
1168
1230
  },
1231
+ entryId,
1169
1232
  id,
1170
1233
  });
1171
1234
  domPosition++;
1172
1235
  break;
1173
1236
  }
1237
+ case CF_BLOCKS.EMBEDDED_RESOURCE:
1238
+ case CF_INLINES.EMBEDDED_RESOURCE: {
1239
+ if (isDevMode()) {
1240
+ console.warn(`Rich text node type "${node.nodeType}" is not supported and is skipped.`, {
1241
+ urn: node.data['target']?.sys?.urn,
1242
+ node,
1243
+ });
1244
+ }
1245
+ break;
1246
+ }
1174
1247
  default: {
1175
1248
  const tag = translateContentfulNodeTypeToHtmlTag(node.nodeType);
1176
1249
  const attributes = {
@@ -1257,7 +1330,15 @@ class ContentfulRichTextRendererComponent {
1257
1330
  const bindings = declaredInputs
1258
1331
  .filter((declared) => declared.propName in command.inputs)
1259
1332
  .map((declared) => inputBinding(declared.templateName, () => inputs()[declared.propName]));
1260
- const componentRef = this.viewContainerRef.createComponent(command.component, { bindings });
1333
+ const injector = command.entryId
1334
+ ? Injector.create({
1335
+ providers: [
1336
+ { provide: ANCESTOR_ENTRY_IDS, useValue: new Set([...this.ancestorEntryIds, command.entryId]) },
1337
+ ],
1338
+ parent: this.injector,
1339
+ })
1340
+ : undefined;
1341
+ const componentRef = this.viewContainerRef.createComponent(command.component, { bindings, injector });
1261
1342
  const rootNode = this.getComponentRootNode(componentRef);
1262
1343
  this.renderInsertAfter(rootNode, { parentElement, previousSibling });
1263
1344
  this.executedCommandsCache.set(command.id, {
@@ -1383,7 +1464,7 @@ class ContentfulRichTextRendererComponent {
1383
1464
  this.renderer.insertBefore(parentElement, node, previousSibling ? previousSibling.nextSibling : parentElement.firstChild);
1384
1465
  }
1385
1466
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulRichTextRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1386
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: ContentfulRichTextRendererComponent, isStandalone: true, selector: "et-contentful-rich-text-renderer", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, richTextPath: { classPropertyName: "richTextPath", publicName: "richTextPath", isSignal: true, isRequired: false, transformFunction: null }, gqlRichText: { classPropertyName: "gqlRichText", publicName: "gqlRichText", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-rich-text-renderer" }, ngImport: i0, template: ``, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
1467
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: ContentfulRichTextRendererComponent, isStandalone: true, selector: "et-contentful-rich-text-renderer", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, richTextPath: { classPropertyName: "richTextPath", publicName: "richTextPath", isSignal: true, isRequired: false, transformFunction: null }, gqlRichText: { classPropertyName: "gqlRichText", publicName: "gqlRichText", isSignal: true, isRequired: false, transformFunction: null }, richText: { classPropertyName: "richText", publicName: "richText", isSignal: true, isRequired: false, transformFunction: null }, includes: { classPropertyName: "includes", publicName: "includes", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "ngSkipHydration": "true" }, classAttribute: "et-contentful-rich-text-renderer" }, ngImport: i0, template: ``, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
1387
1468
  }
1388
1469
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulRichTextRendererComponent, decorators: [{
1389
1470
  type: Component,
@@ -1393,9 +1474,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
1393
1474
  encapsulation: ViewEncapsulation.None,
1394
1475
  host: {
1395
1476
  class: 'et-contentful-rich-text-renderer',
1477
+ ngSkipHydration: 'true',
1396
1478
  },
1397
1479
  }]
1398
- }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], richTextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "richTextPath", required: false }] }], gqlRichText: [{ type: i0.Input, args: [{ isSignal: true, alias: "gqlRichText", required: false }] }] } });
1480
+ }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], richTextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "richTextPath", required: false }] }], gqlRichText: [{ type: i0.Input, args: [{ isSignal: true, alias: "gqlRichText", required: false }] }], richText: [{ type: i0.Input, args: [{ isSignal: true, alias: "richText", required: false }] }], includes: [{ type: i0.Input, args: [{ isSignal: true, alias: "includes", required: false }] }] } });
1399
1481
 
1400
1482
  class ContentfulVideoComponent {
1401
1483
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"ethlete-contentful.mjs","sources":["../../../../libs/contentful/src/lib/gql/asset.fragments.ts","../../../../libs/contentful/src/lib/components/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/components/file/contentful-file-labels.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.utils.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/components/link/contentful-link.util.ts","../../../../libs/contentful/src/lib/components/link/contentful-link.component.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-node-types.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.errors.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.gql.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.ts","../../../../libs/contentful/src/lib/contentful.imports.ts","../../../../libs/contentful/src/lib/utils/contentful-default-components.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { GQL } from '@ethlete/query';\n\nexport const GQL_FRAGMENT_CONTENTFUL_ASSET = `\n fragment ContentfulAssetData on Asset {\n sys {\n id\n }\n url\n title\n fileName\n width\n height\n description\n contentType\n size\n }\n` as GQL;\n\nexport type ContentfulGqlAsset = {\n sys: {\n id: string;\n };\n title: string | null;\n fileName?: string | null;\n contentType: string | null;\n url: string | null;\n description: string | null;\n width: number | null;\n height: number | null;\n size: number | null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isContentfulGqlAsset = (asset: any): asset is ContentfulGqlAsset => {\n return Boolean(asset && typeof asset === 'object' && asset.sys?.id && !('fields' in asset));\n};\n\nexport type ContentfulGqlWhereFilter<TLinkedFrom extends Record<string, unknown> = Record<string, unknown>> = {\n /**\n * Filer by ids.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters/sys-filters\n */\n sys?: {\n id?: string;\n id_not?: string;\n id_in?: string[];\n id_not_in?: string[];\n id_contains?: string;\n id_not_contains?: string;\n };\n /**\n * Filer by tags.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters/contentfulmetadata-filters\n */\n contentfulMetadata?: {\n tags_exists?: boolean;\n tags?: {\n id_contains_some?: string[];\n id_contains_none?: string[];\n id_contains_all?: string[];\n };\n };\n /**\n * Retrieve a collection of entries linked to the specified entry or asset.\n * @see https://www.contentful.com/developers/docs/references/graphql/#links-to-a-specific-item\n */\n linkedFrom?: TLinkedFrom;\n};\n\nexport type ContentfulGqlOrder = `${string}_${'ASC' | 'DESC'}`;\n\nexport type ContentfulGqlCollectionFilterVariables<\n TCustomWhere extends Record<string, unknown> = Record<string, unknown>,\n TLinkedFrom extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /**\n * Zero-indexed offset in the collection from which items are fetched\n * @default 0\n */\n skip?: number;\n\n /**\n * Maximum number of items to fetch. Maximum is 1000.\n * @default 100\n */\n limit?: number;\n\n /**\n * Filter specifications to apply on the collection query.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters\n */\n where?: TCustomWhere & ContentfulGqlWhereFilter<TLinkedFrom>;\n\n /**\n * Order specifications to apply on the collection query.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-order\n */\n order?: ContentfulGqlOrder[];\n\n /**\n * When set to `true` the field will be resolved with non published content.\n * @default false\n */\n preview?: boolean;\n\n /**\n * Locale for the collection items. If not set the default locale is used.\n */\n locale?: string;\n};\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n @if (data(); as data) {\n <figure class=\"et-contentful-audio-figure\">\n @if (data.title) {\n <figcaption class=\"et-contentful-audio-figcaption\">{{ data.title }}</figcaption>\n }\n <audio [src]=\"data.url\" class=\"et-contentful-audio-audio\" controls></audio>\n </figure>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-audio',\n },\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n title: asset.title || asset.fileName || null,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n title: asset.fields.title || asset.fields.file.fileName || null,\n };\n }\n\n return null;\n });\n}\n","import { formatFileSize } from '@ethlete/components';\nimport { defineLabels, toInjectFn, toProvideFn, toToken } from '@ethlete/core';\n\n/** Every string `et-contentful-file` renders itself. Override them app-wide with {@link provideContentfulFileLabels}. */\nexport type ContentfulFileLabels = {\n /** The size shown after the file title, e.g. `'(1.5 MB)'`. */\n fileSize: (bytes: number) => string;\n};\n\n/** The built-in English labels. */\nexport const DEFAULT_CONTENTFUL_FILE_LABELS: ContentfulFileLabels = {\n fileSize: (bytes) => `(${formatFileSize(bytes)})`,\n};\n\nconst CONTENTFUL_FILE_LABELS_DEF = /* @__PURE__ */ defineLabels<ContentfulFileLabels>(\n 'CONTENTFUL_FILE_LABELS',\n DEFAULT_CONTENTFUL_FILE_LABELS,\n);\n\n/**\n * Localize `et-contentful-file` for everything below this injector, and read the set in effect here as a signal.\n * Partial - whatever you leave out keeps its {@link DEFAULT_CONTENTFUL_FILE_LABELS} value.\n *\n * @example\n * provideContentfulFileLabels({ fileSize: (bytes) => `(${new Intl.NumberFormat('de').format(bytes)} Byte)` });\n */\nexport const provideContentfulFileLabels = /* @__PURE__ */ toProvideFn(CONTENTFUL_FILE_LABELS_DEF);\nexport const injectContentfulFileLabels = /* @__PURE__ */ toInjectFn(CONTENTFUL_FILE_LABELS_DEF);\nexport const CONTENTFUL_FILE_LABELS = /* @__PURE__ */ toToken(CONTENTFUL_FILE_LABELS_DEF);\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\nimport { injectContentfulFileLabels } from './contentful-file-labels';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n @if (data(); as data) {\n <a [href]=\"data.url\" class=\"et-contentful-file-anchor\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ data.title }}\n @if (data.size !== null) {\n {{ labels().fileSize(data.size) }}\n }\n </a>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-file',\n },\n})\nexport class ContentfulFileComponent {\n protected labels = injectContentfulFileLabels();\n\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n size: asset.size,\n title: asset.title || asset.fileName || null,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n size: asset.fields.file.details.size,\n title: asset.fields.title || asset.fields.file.fileName || null,\n };\n }\n\n return null;\n });\n}\n","import { InjectionToken } from '@angular/core';\nimport { ContentfulConfig } from '../types';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('ContentfulConfig');\n","import { inject } from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../constants/contentful.constants';\nimport { ContentfulConfig, ContentfulConfigOptions } from '../types';\n\n/**\n * The config used when no `provideContentfulConfig()` is in scope. It declares no\n * `components`, so embedded assets are skipped and hyperlinks render as plain anchors\n * until a config is provided.\n */\nconst CONTENTFUL_FALLBACK_CONFIG: ContentfulConfig = {\n internalHosts: [],\n components: {},\n customComponents: {},\n imageOptions: {\n srcsetSizes: ['375w', '1280w', '1920w', '2560w'],\n sizes: ['100vw'],\n backgroundColor: null,\n },\n};\n\nconst withoutUndefined = <T extends object>(value: T | null | undefined) =>\n Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined)) as Partial<T>;\n\nexport const createContentfulConfig = (options?: ContentfulConfigOptions | null): ContentfulConfig => {\n const config = options ?? {};\n\n return {\n ...CONTENTFUL_FALLBACK_CONFIG,\n ...config,\n components: config.components ?? CONTENTFUL_FALLBACK_CONFIG.components,\n customComponents: config.customComponents ?? CONTENTFUL_FALLBACK_CONFIG.customComponents,\n internalHosts: config.internalHosts ?? CONTENTFUL_FALLBACK_CONFIG.internalHosts,\n imageOptions: { ...CONTENTFUL_FALLBACK_CONFIG.imageOptions, ...withoutUndefined(config.imageOptions) },\n };\n};\n\n/**\n * Reads the contentful config from the current injector. Falls back to a config without\n * any `components` when none was provided via `provideContentfulConfig()`.\n */\nexport const injectContentfulConfig = (): ContentfulConfig =>\n inject(CONTENTFUL_CONFIG, { optional: true }) ?? CONTENTFUL_FALLBACK_CONFIG;\n","import { PictureSource } from '@ethlete/components';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulRestAsset } from '../../types';\n\nexport const generateDefaultContentfulImageSource = (data: ContentfulRestAsset | ContentfulGqlAsset): PictureSource => {\n const { url, contentType } = isContentfulGqlAsset(data) ? data : (data.fields.file ?? {});\n\n return url ? { type: contentType ?? '', srcset: url } : { type: '', srcset: '' };\n};\n\n/**\n * Parses source set sizes into an object containing with and height. Eg.\n * - `\"400\"` - 400px width\n * - `\"400x300\"` - 400px width and 300px height\n * - `\"400w\"` - 400px width\n * - `\"400h\"` - 400px height\n * - `\"400wx300h\"` - 400px width and 300px height\n **/\nexport const parseContentfulImageSize = (size: string): { width: number | null; height: number | null } => {\n const widthAndHeight = /^(\\d+)w?x(\\d+)h?$/.exec(size);\n\n if (widthAndHeight) {\n return {\n width: Number(widthAndHeight[1]),\n height: Number(widthAndHeight[2]),\n };\n }\n\n const height = /^(\\d+)h$/.exec(size);\n\n if (height) {\n return { width: null, height: Number(height[1]) };\n }\n\n const width = /^(\\d+)w?$/.exec(size);\n\n return width ? { width: Number(width[1]), height: null } : { width: null, height: null };\n};\n\nconst SOURCE_TYPES = ['image/avif', 'image/webp'];\n\nexport type ContentfulImageSourcesOptions = {\n srcsetSizes?: string[];\n backgroundColor?: string | null;\n quality?: number | null;\n focusArea?: ContentfulImageFocusArea | null;\n resizeBehavior?: ContentfulImageResizeBehavior | null;\n};\n\n/**\n * Builds AVIF and WebP `<source>` entries for a Contentful asset through the Contentful Images API.\n *\n * @example\n * generateContentfulImageSources(asset, { srcsetSizes: ['400w', '800w'], quality: 80 });\n */\nexport const generateContentfulImageSources = (\n data: ContentfulRestAsset | ContentfulGqlAsset,\n options: ContentfulImageSourcesOptions = {},\n): PictureSource[] => {\n const { srcsetSizes = [], backgroundColor = null, quality = null, focusArea = null, resizeBehavior = null } = options;\n\n const isGqlAsset = isContentfulGqlAsset(data);\n const baseUrl = isGqlAsset ? data.url : data.fields.file?.url;\n\n if (!baseUrl) {\n return [];\n }\n\n const imageDimensions = isGqlAsset ? data : data.fields.file?.details.image;\n const sources: PictureSource[] = [];\n\n for (const type of SOURCE_TYPES) {\n const sourceSets: string[] = [];\n const queryParams: string[] = [];\n\n queryParams.push(`fm=${type.split('/')[1]}`);\n\n if (backgroundColor) {\n queryParams.push(`bg=rgb:${backgroundColor.replace(/^#/, '')}`);\n }\n\n if (quality !== null && Number.isFinite(quality)) {\n queryParams.push(`q=${quality}`);\n }\n\n if (focusArea) {\n queryParams.push(`f=${focusArea}`);\n }\n\n if (resizeBehavior) {\n queryParams.push(`fit=${resizeBehavior}`);\n }\n\n if (srcsetSizes.length) {\n const urlWithParams = `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}${queryParams.join('&')}`;\n\n for (const size of srcsetSizes) {\n const { width, height } = parseContentfulImageSize(size);\n\n if (width && height) {\n sourceSets.push(`${urlWithParams}&w=${width}&h=${height} ${width}w`);\n } else if (width) {\n sourceSets.push(`${urlWithParams}&w=${width} ${width}w`);\n } else if (height && imageDimensions?.width && imageDimensions.height) {\n const derivedWidth = Math.round((height * imageDimensions.width) / imageDimensions.height);\n sourceSets.push(`${urlWithParams}&w=${derivedWidth}&h=${height} ${derivedWidth}w`);\n } else if (ngDevMode && type === SOURCE_TYPES[0]) {\n console.warn(\n height\n ? `Contentful image: srcsetSizes entry \"${size}\" is dropped. A height-only size needs the asset's width and height to derive a width descriptor.`\n : `Contentful image: srcsetSizes entry \"${size}\" is not a valid size and is dropped. Use \"400\", \"400w\", \"400h\" or \"400x300\"; viewport sizes like \"50vw\" belong in sizes.`,\n );\n }\n }\n }\n\n sources.push({\n type,\n srcset: sourceSets.length\n ? sourceSets.join(', ')\n : `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}${queryParams.join('&')}`,\n });\n }\n\n return sources;\n};\n","import { Component, ViewEncapsulation, booleanAttribute, computed, input, numberAttribute } from '@angular/core';\nimport { PictureComponent, normalizePictureSizes } from '@ethlete/components';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulRestAsset } from '../../types';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport {\n generateContentfulImageSources,\n generateDefaultContentfulImageSource,\n} from './contentful-image.component.utils';\n\nconst optionalNumberAttribute = (value: unknown) => {\n const transformed = numberAttribute(value);\n\n return Number.isFinite(transformed) ? transformed : null;\n};\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <et-picture\n [priority]=\"priority()\"\n [defaultSrc]=\"defaultSrcValue()\"\n [alt]=\"normalizedAsset().alt ?? ''\"\n [figcaption]=\"normalizedAsset().figcaption ?? null\"\n [width]=\"normalizedAsset().width ?? null\"\n [height]=\"normalizedAsset().height ?? null\"\n [sizes]=\"sizes()\"\n [sources]=\"sourcesValue()\"\n />\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [PictureComponent],\n host: {\n class: 'et-contentful-image',\n },\n})\nexport class ContentfulImageComponent {\n private contentfulConfig = injectContentfulConfig();\n\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n backgroundColor = input<string | null>(this.contentfulConfig.imageOptions.backgroundColor);\n srcsetSizes = input<string[]>(this.contentfulConfig.imageOptions.srcsetSizes);\n\n quality = input(null, { transform: optionalNumberAttribute });\n focusArea = input<ContentfulImageFocusArea | null>(null);\n resizeBehavior = input<ContentfulImageResizeBehavior | null>(null);\n priority = input(false, { transform: booleanAttribute });\n sizes = input<string | null, string[] | string | null>(\n normalizePictureSizes(this.contentfulConfig.imageOptions.sizes),\n {\n transform: (v) => normalizePictureSizes(v),\n },\n );\n\n protected normalizedAsset = computed(() => {\n const asset = this.asset();\n\n if (isContentfulGqlAsset(asset)) {\n return {\n alt: asset.title || null,\n figcaption: asset.description || null,\n width: asset.width,\n height: asset.height,\n };\n } else {\n return {\n alt: asset?.fields?.title || null,\n figcaption: asset?.fields?.description || null,\n width: asset?.fields?.file?.details?.image?.width ?? null,\n height: asset?.fields?.file?.details?.image?.height ?? null,\n };\n }\n });\n\n protected sourcesValue = computed(() => {\n const asset = this.asset();\n const options = {\n srcsetSizes: this.srcsetSizes(),\n backgroundColor: this.backgroundColor(),\n quality: this.quality(),\n focusArea: this.focusArea(),\n resizeBehavior: this.resizeBehavior(),\n };\n\n if (!asset) {\n return [];\n }\n\n return generateContentfulImageSources(asset, options);\n });\n\n protected defaultSrcValue = computed(() => {\n const asset = this.asset();\n\n return asset ? generateDefaultContentfulImageSource(asset) : null;\n });\n}\n","export const parseWebUrl = (href: string): URL | null => {\n if (!/^(?:https?:)?\\/\\//i.test(href)) {\n return null;\n }\n\n try {\n return new URL(href.startsWith('//') ? 'https:' + href : href);\n } catch {\n return null;\n }\n};\n\nconst normalizeHostname = (host: string) => {\n const value = host.trim().toLowerCase();\n\n try {\n return new URL(value.includes('://') ? value : 'https://' + value).hostname;\n } catch {\n return value.split(':')[0] ?? value;\n }\n};\n\nconst matchesHostname = (hostname: string, configuredHost: string) => {\n const normalizedHost = normalizeHostname(configuredHost);\n\n return hostname === normalizedHost || hostname.endsWith('.' + normalizedHost);\n};\n\nexport type WebUrlContext = { location: Location; internalHosts: string[] };\n\nexport const isInternalWebUrl = (url: URL, { location, internalHosts }: WebUrlContext) =>\n (url.hostname === location.hostname && url.port === location.port) ||\n internalHosts.some((host) => matchesHostname(url.hostname, host));\n\nexport const isExternalWebHref = (href: string, context: WebUrlContext) => {\n const url = parseWebUrl(href);\n\n return url !== null && !isInternalWebUrl(url, context);\n};\n\nexport const hasUrlScheme = (href: string) => /^[a-z][a-z\\d+.-]*:/i.test(href);\n\nexport const isRouteRelativeHref = (href: string) => !hasUrlScheme(href) && !href.startsWith('/');\n\nexport const resolveHrefAgainstRoute = (href: string, routerUrl: string) => {\n const resolved = new URL(href, 'https://contentful.invalid' + routerUrl);\n\n return resolved.pathname + resolved.search + resolved.hash;\n};\n","import { DOCUMENT, Location } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { injectUrl } from '@ethlete/core';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport { hasUrlScheme, isInternalWebUrl, parseWebUrl, resolveHrefAgainstRoute } from './contentful-link.util';\n\nconst RICH_TEXT_ANCHOR_CLASSES = ['et-contentful-rich-text-default-element', 'et-contentful-rich-text-default-a'];\n\n@Component({\n selector: 'et-contentful-link',\n template: `\n @if (usesRouterLink()) {\n <a [class]=\"modifierClasses()\" [routerLink]=\"internalUrlTree()\" class=\"et-contentful-link-anchor\">{{ text() }}</a>\n } @else {\n <a\n [class]=\"modifierClasses()\"\n [href]=\"anchorHref()\"\n [attr.target]=\"openInNewTab() ? '_blank' : null\"\n [attr.rel]=\"openInNewTab() ? 'noopener noreferrer' : null\"\n class=\"et-contentful-link-anchor\"\n >{{ text() }}</a\n >\n }\n `,\n styleUrl: './contentful-link.component.css',\n encapsulation: ViewEncapsulation.None,\n imports: [RouterLink],\n host: {\n class: 'et-contentful-link',\n },\n})\nexport class ContentfulLinkComponent {\n private document = inject(DOCUMENT);\n private location = inject(Location);\n private router = inject(Router);\n private config = injectContentfulConfig();\n private url = injectUrl();\n\n href = input.required<string>();\n text = input.required<string>();\n marks = input<readonly string[]>([]);\n richText = input(false);\n\n protected usesRouterLink = computed(() => {\n const href = this.href();\n const absoluteUrl = parseWebUrl(href);\n\n if (absoluteUrl) {\n return isInternalWebUrl(absoluteUrl, {\n location: this.document.location,\n internalHosts: this.config.internalHosts,\n });\n }\n\n return !href.startsWith('#') && !hasUrlScheme(href);\n });\n\n protected anchorHref = computed(() => {\n const href = this.href();\n\n return href.startsWith('#') ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url())) : href;\n });\n\n protected openInNewTab = computed(() => Boolean(parseWebUrl(this.href())) && !this.usesRouterLink());\n\n protected internalPath = computed(() => {\n const href = this.href();\n const url = parseWebUrl(href);\n\n if (url) {\n return url.pathname + url.search + url.hash;\n }\n\n if (href.startsWith('/')) {\n return href;\n }\n\n return resolveHrefAgainstRoute(href, this.url());\n });\n\n protected internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()));\n\n protected modifierClasses = computed(() => [\n ...(this.richText() ? RICH_TEXT_ANCHOR_CLASSES : []),\n ...this.marks().map((mark) => `et-contentful-rich-text-mark-${mark}`),\n ]);\n}\n","import { BLOCKS, INLINES } from '@contentful/rich-text-types';\n\n/**\n * The `BLOCKS` node type strings of `@contentful/rich-text-types`, as a plain literal map.\n * Keep the values in sync with the enum - they are part of the Contentful Delivery API.\n *\n * These maps exist because `BLOCKS` and `INLINES` are TS enums: reading one in a *value* position\n * anywhere in this lib emits a runtime import and costs every consumer ~2.4 kB gz. Use the enums for\n * types only - the `contentful-deps` size golden fails if that slips.\n */\nexport const CF_BLOCKS = {\n DOCUMENT: 'document',\n PARAGRAPH: 'paragraph',\n HEADING_1: 'heading-1',\n HEADING_2: 'heading-2',\n HEADING_3: 'heading-3',\n HEADING_4: 'heading-4',\n HEADING_5: 'heading-5',\n HEADING_6: 'heading-6',\n OL_LIST: 'ordered-list',\n UL_LIST: 'unordered-list',\n LIST_ITEM: 'list-item',\n HR: 'hr',\n QUOTE: 'blockquote',\n EMBEDDED_ENTRY: 'embedded-entry-block',\n EMBEDDED_ASSET: 'embedded-asset-block',\n EMBEDDED_RESOURCE: 'embedded-resource-block',\n TABLE: 'table',\n TABLE_ROW: 'table-row',\n TABLE_CELL: 'table-cell',\n TABLE_HEADER_CELL: 'table-header-cell',\n} as unknown as typeof BLOCKS;\n\n/**\n * The `INLINES` node type strings of `@contentful/rich-text-types`, as a plain literal map.\n * Keep the values in sync with the enum - they are part of the Contentful Delivery API.\n */\nexport const CF_INLINES = {\n ASSET_HYPERLINK: 'asset-hyperlink',\n EMBEDDED_ENTRY: 'embedded-entry-inline',\n EMBEDDED_RESOURCE: 'embedded-resource-inline',\n ENTRY_HYPERLINK: 'entry-hyperlink',\n HYPERLINK: 'hyperlink',\n RESOURCE_HYPERLINK: 'resource-hyperlink',\n} as unknown as typeof INLINES;\n","import { RuntimeError } from '@ethlete/core';\n\nexport const RICH_TEXT_RENDERER_ERRORS = {\n rich_text_not_object: (data: { type: string }) =>\n `The value at richTextPath is a ${data.type}, not a rich-text document object. Point richTextPath at the rich-text field itself (e.g. items[0].fields.body).`,\n rich_text_wrong_type:\n 'The rich text object does not satisfy the RichTextResponse interface. It should contain a property named \"nodeType\" with the value \"document\".',\n\n rich_text_conflicting_inputs:\n 'gqlRichText cannot be combined with content or richTextPath. Pass either a GraphQL rich-text field through gqlRichText, or a REST response through content and richTextPath.',\n\n asset_id_not_found: 'The asset ID was not found. This node is not supported.',\n entry_id_not_found: 'The entry ID was not found. This node is not supported.',\n\n text_parent_not_found: 'The parent node is not found. This structure is not supported.',\n\n cached_command_not_found: 'No rendered node was found for a render command. The renderer state is out of sync.',\n cached_command_not_component:\n 'The rendered node for a component command is not a component. The renderer state is out of sync.',\n} as const;\n\nconst RICH_TEXT_RENDERER_ERROR_CODES: Record<keyof typeof RICH_TEXT_RENDERER_ERRORS, number> = {\n rich_text_not_object: 0,\n rich_text_wrong_type: 1,\n rich_text_conflicting_inputs: 11,\n asset_id_not_found: 2,\n entry_id_not_found: 3,\n text_parent_not_found: 7,\n cached_command_not_found: 9,\n cached_command_not_component: 10,\n};\n\nexport const richTextRendererError = (code: keyof typeof RICH_TEXT_RENDERER_ERRORS, data?: unknown) => {\n const entry: string | ((data: never) => string) = RICH_TEXT_RENDERER_ERRORS[code];\n const message = `<et-contentful-rich-text-renderer>: ${typeof entry === 'function' ? entry(data as never) : entry}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, data);\n};\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { ContentfulGqlAsset } from '../../gql';\nimport { ContentfulEntry, ContentfulRestAsset, RichTextResponse } from '../../types';\n\nexport type ContentfulGqlRichTextEntry = {\n __typename?: string | null;\n sys: { id: string };\n [field: string]: unknown;\n};\n\ntype ContentfulGqlLinkList<T> = (T | null | undefined)[] | null;\n\n/**\n * A rich-text field as returned by the Contentful GraphQL API. Select `json` and the `links` the\n * document references, and pass the field to `[gqlRichText]` as-is.\n */\nexport type ContentfulGqlRichText = {\n json: RichTextResponse;\n links?: {\n assets?: {\n block?: ContentfulGqlLinkList<ContentfulGqlAsset>;\n hyperlink?: ContentfulGqlLinkList<ContentfulGqlAsset>;\n } | null;\n entries?: {\n block?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n inline?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n hyperlink?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n } | null;\n } | null;\n};\n\nconst lowerCaseFirst = (value: string) => value.charAt(0).toLowerCase() + value.slice(1);\n\nconst toRestAsset = (asset: ContentfulGqlAsset): ContentfulRestAsset => ({\n sys: { type: 'Asset', id: asset.sys.id, createdAt: '', updatedAt: '', locale: '' },\n fields: {\n title: asset.title ?? '',\n description: asset.description ?? '',\n file: {\n url: asset.url,\n details: {\n size: asset.size,\n ...(asset.width !== null && asset.height !== null\n ? { image: { width: asset.width, height: asset.height } }\n : {}),\n },\n fileName: asset.fileName ?? null,\n contentType: asset.contentType,\n },\n },\n metadata: { tags: [] },\n});\n\nconst toRestEntry = (entry: ContentfulGqlRichTextEntry): ContentfulEntry | null => {\n const { __typename, sys, ...fields } = entry;\n\n if (!__typename) {\n return null;\n }\n\n return {\n sys: {\n type: 'Entry',\n id: sys.id,\n createdAt: '',\n updatedAt: '',\n locale: '',\n contentType: { sys: { type: 'Link', linkType: 'ContentType', id: lowerCaseFirst(__typename) } },\n },\n fields,\n metadata: { tags: [] },\n };\n};\n\nconst present = <T>(items: ContentfulGqlLinkList<T> | undefined) =>\n (items ?? []).filter((item): item is T => item !== null && item !== undefined);\n\n/**\n * Maps the `links` of a GraphQL rich-text field to the entries and assets the renderer resolves\n * embeds against. An entry's content type id is its `__typename` with the first letter lower-cased,\n * which is how Contentful derives a GraphQL type name from a content type id. Entries without a\n * `__typename` are dropped.\n */\nexport const mapContentfulGqlLinks = (links: ContentfulGqlRichText['links']) => {\n const assets = new Map<string, ContentfulRestAsset>();\n const entries = new Map<string, ContentfulEntry>();\n\n for (const asset of [...present(links?.assets?.block), ...present(links?.assets?.hyperlink)]) {\n assets.set(asset.sys.id, toRestAsset(asset));\n }\n\n for (const gqlEntry of [\n ...present(links?.entries?.block),\n ...present(links?.entries?.inline),\n ...present(links?.entries?.hyperlink),\n ]) {\n const entry = toRestEntry(gqlEntry);\n\n if (entry) {\n entries.set(entry.sys.id, entry);\n }\n }\n\n return { assets: [...assets.values()], entries: [...entries.values()] };\n};\n","import { isDevMode } from '@angular/core';\nimport { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { isObject } from '@ethlete/core';\nimport { RichTextResponse } from '../../types';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\n\nexport const isRichTextRootNode = (node: unknown): node is RichTextResponse => {\n return isObject(node) && 'nodeType' in node && node['nodeType'] === 'document';\n};\n\nconst NODE_TYPE_TAGS: Record<string, keyof HTMLElementTagNameMap> = /* @__PURE__ */ (() => ({\n [CF_BLOCKS.HEADING_1]: 'h1',\n [CF_BLOCKS.HEADING_2]: 'h2',\n [CF_BLOCKS.HEADING_3]: 'h3',\n [CF_BLOCKS.HEADING_4]: 'h4',\n [CF_BLOCKS.HEADING_5]: 'h5',\n [CF_BLOCKS.HEADING_6]: 'h6',\n [CF_BLOCKS.PARAGRAPH]: 'p',\n [CF_BLOCKS.UL_LIST]: 'ul',\n [CF_BLOCKS.OL_LIST]: 'ol',\n [CF_BLOCKS.LIST_ITEM]: 'li',\n [CF_BLOCKS.HR]: 'hr',\n [CF_BLOCKS.QUOTE]: 'blockquote',\n [CF_BLOCKS.TABLE]: 'table',\n [CF_BLOCKS.TABLE_ROW]: 'tr',\n [CF_BLOCKS.TABLE_CELL]: 'td',\n [CF_BLOCKS.TABLE_HEADER_CELL]: 'th',\n}))();\n\nconst INLINE_NODE_TYPES = /* @__PURE__ */ (() => new Set<string>(Object.values(CF_INLINES)))();\n\n/**\n * The html element a structural rich text node renders as. A node type without an element\n * (an unsupported inline or block) falls back to `span` for inlines and `div` otherwise,\n * with a dev-mode warning.\n */\nexport const translateContentfulNodeTypeToHtmlTag = (\n nodeType: 'text' | BLOCKS | INLINES,\n): keyof HTMLElementTagNameMap => {\n const tag = NODE_TYPE_TAGS[nodeType];\n\n if (tag) {\n return tag;\n }\n\n const fallback = INLINE_NODE_TYPES.has(nodeType) ? 'span' : 'div';\n\n if (isDevMode()) {\n console.warn(`Unsupported rich text node type \"${nodeType}\"! Its content is rendered inside a <${fallback}>.`);\n }\n\n return fallback;\n};\n","import { DOCUMENT, Location } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n Type,\n ViewContainerRef,\n ViewEncapsulation,\n WritableSignal,\n computed,\n effect,\n inject,\n input,\n inputBinding,\n isDevMode,\n reflectComponentType,\n signal,\n untracked,\n} from '@angular/core';\nimport { Block, Inline, Mark, Text } from '@contentful/rich-text-types';\nimport { getObjectProperty, injectRenderer, injectUrl, isObject } from '@ethlete/core';\nimport {\n ContentfulCollection,\n ContentfulEntry,\n ContentfulEntryLinkItem,\n ContentfulRestAsset,\n RichTextResponse,\n} from '../../types';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport { isExternalWebHref, isRouteRelativeHref, resolveHrefAgainstRoute } from '../link/contentful-link.util';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\nimport { richTextRendererError } from './rich-text-renderer.errors';\nimport { ContentfulGqlRichText, mapContentfulGqlLinks } from './rich-text-renderer.gql';\nimport { isRichTextRootNode, translateContentfulNodeTypeToHtmlTag } from './rich-text-renderer.util';\n\ntype HtmlOpenRenderCommand = {\n kind: 'htmlOpen';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n attributes: Record<string, string>;\n tagName: keyof HTMLElementTagNameMap;\n id: string;\n};\n\ntype HtmlCloseRenderCommand = {\n kind: 'htmlClose';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n tagName: keyof HTMLElementTagNameMap;\n id: string;\n};\n\ntype TextRenderCommand = {\n kind: 'text';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n attributes: Record<string, string>;\n markTags: MarkTagName[];\n text: string;\n id: string;\n};\n\ntype ComponentRenderCommand = {\n kind: 'component';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n component: Type<unknown>;\n inputs: Record<string, unknown>;\n id: string;\n};\n\ntype RenderCommand = HtmlOpenRenderCommand | HtmlCloseRenderCommand | TextRenderCommand | ComponentRenderCommand;\n\ntype RenderInstruction = {\n type: 'create' | 'update' | 'move' | 'delete';\n command: RenderCommand;\n};\n\ntype MarkTagName = 'strong' | 'em' | 'u' | 'code' | 's' | 'sub' | 'sup';\n\nconst DEFAULT_ANCHOR_CLASS = 'et-contentful-rich-text-default-element et-contentful-rich-text-default-a';\n\nconst MARK_TAG_MAP: Record<string, MarkTagName> = {\n bold: 'strong',\n italic: 'em',\n underline: 'u',\n code: 'code',\n strikethrough: 's',\n subscript: 'sub',\n superscript: 'sup',\n};\n\n/**\n * Translates contentful text marks into the semantic html elements the marked text is\n * wrapped in, outermost first. Unknown marks are skipped (with a dev-mode warning).\n */\nexport const marksToTags = (marks: Mark[]) => {\n const tags: MarkTagName[] = [];\n\n for (const mark of marks) {\n const tag = MARK_TAG_MAP[mark.type];\n\n if (!tag) {\n if (isDevMode()) {\n console.warn(`No element found for mark type \"${mark.type}\"! The mark is ignored.`, mark);\n }\n\n continue;\n }\n\n tags.push(tag);\n }\n\n return tags;\n};\n\n/**\n * The classes marked text inside a hyperlink is rendered with, since the link component\n * receives its text as a plain string.\n */\nexport const marksToClass = (marks: Mark[]) =>\n marks.map((mark) => `et-contentful-rich-text-mark-${mark.type}`).join(' ');\n\nconst LINK_COMPONENT_TYPE = '$$$_et-link';\n\nconst normalizeHref = (href: string): string | null => {\n if (!href.trim()) {\n return null;\n }\n\n try {\n const url = new URL(href, 'https://contentful.invalid');\n\n return ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'].includes(url.protocol) ? href : null;\n } catch {\n return null;\n }\n};\n\ntype ExecutedCommandCacheItemBase = {\n element: HTMLElement;\n};\n\ntype ExecutedComponentCommandCacheItem = {\n command: ComponentRenderCommand;\n componentRef: ComponentRef<unknown>;\n inputs: WritableSignal<Record<string, unknown>>;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedHtmlCommandCacheItem = {\n command: HtmlOpenRenderCommand | HtmlCloseRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedTextCommandCacheItem = {\n command: TextRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedCommandCacheItem =\n ExecutedComponentCommandCacheItem | ExecutedHtmlCommandCacheItem | ExecutedTextCommandCacheItem;\n\nconst isExecutedComponentCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedComponentCommandCacheItem => {\n return cache.command.kind === 'component';\n};\n\nexport const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';\n\nexport type ContentfulIncludeMap = {\n /**\n * Select an entry by its ID and content type ID.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntry: <T extends { [key: string]: any }>(id: string, contentTypeId: string) => ContentfulEntry<T> | null;\n\n /**\n * Select multiple entries by their IDs and content type ID.\n * If an entry is not found, it will be omitted from the result.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries: <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => ContentfulEntry<T>[];\n\n /**\n * Select an asset by its ID.\n */\n getAsset: (id: string) => ContentfulRestAsset | null;\n\n /**\n * Select multiple assets by their IDs. If an asset is not found, it will be omitted from the result.\n */\n getAssets: (ids: string[]) => ContentfulRestAsset[];\n};\n\nexport type CreateContentfulIncludeMapConfig = {\n /** The entries that should be present inside the map */\n entries: ContentfulEntry[];\n\n /** The assets that should be present inside the map */\n assets: ContentfulRestAsset[];\n};\n\n/**\n * Create a contentful include map using the provided entries and assets.\n */\nexport const createContentfulIncludeMap = (config: CreateContentfulIncludeMapConfig): ContentfulIncludeMap => {\n const { entries, assets } = config;\n\n const assetMap = new Map(assets.map((asset) => [asset.sys.id, asset]));\n const entryMap = new Map(entries.map((entry) => [entry.sys.id, entry]));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntry = <T extends { [key: string]: any }>(id: string, contentTypeId: string) => {\n const entry = entryMap.get(id);\n\n if (!entry) {\n if (isDevMode()) {\n console.warn(\n 'Entry not found! Will return null. Is it unpublished or deleted, or is the include query param too low?',\n { id },\n );\n }\n\n return null;\n }\n\n if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {\n return entry as ContentfulEntry<T>;\n }\n\n if (entry.sys.contentType.sys.id !== contentTypeId) {\n if (isDevMode()) {\n console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {\n entry,\n sysId: contentTypeId,\n });\n }\n\n return null;\n }\n\n return entry as ContentfulEntry<T>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntries = <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => {\n const entries = ids\n .map((id) => (typeof id === 'string' ? id : id.sys.id))\n .map((id) => getEntry<T>(id, contentTypeId))\n .filter((entry): entry is ContentfulEntry<T> => entry !== null);\n\n return entries;\n };\n\n const getAsset = (id: string) => {\n return assetMap.get(id) ?? null;\n };\n\n const getAssets = (ids: string[]) => {\n return ids.map((id) => getAsset(id)).filter((asset): asset is ContentfulRestAsset => asset !== null);\n };\n\n return {\n getEntry,\n getEntries,\n getAsset,\n getAssets,\n };\n};\n\nconst warnedRichTextPaths = /* @__PURE__ */ new Set<string>();\n\nconst warnOnUnresolvedParentPath = (content: ContentfulCollection, richTextPath: string) => {\n const segments = richTextPath.split('.');\n const root = content as unknown as Record<string, unknown>;\n\n if (segments.length < 2 || isObject(getObjectProperty(root, segments.slice(0, -1).join('.')))) return;\n if (warnedRichTextPaths.has(richTextPath)) return;\n\n warnedRichTextPaths.add(richTextPath);\n\n let resolvedSegments = 0;\n\n while (\n resolvedSegments < segments.length - 1 &&\n isObject(getObjectProperty(root, segments.slice(0, resolvedSegments + 1).join('.')))\n ) {\n resolvedSegments++;\n }\n\n const resolvedPath = segments.slice(0, resolvedSegments).join('.') || '(the content itself)';\n\n console.warn(\n `<et-contentful-rich-text-renderer>: richTextPath \"${richTextPath}\" does not resolve, so nothing is rendered. The deepest part that resolves is ${resolvedPath}; check the next segment for a typo or a missing item.`,\n { content, richTextPath },\n );\n};\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-rich-text-renderer',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n private viewContainerRef = inject(ViewContainerRef);\n private renderer = injectRenderer();\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private config = injectContentfulConfig();\n private document = inject(DOCUMENT);\n private location = inject(Location);\n private url = injectUrl();\n\n /**\n * The contentful response gotten via their REST api.\n * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection\n */\n content = input<ContentfulCollection | null | undefined>();\n\n /**\n * The path to where the rich text field is inside the contentful response. Dot and array notation is allowed.\n * @example \"items[0].fields.html\"\n */\n richTextPath = input<string>();\n\n /**\n * A rich-text field from the Contentful GraphQL API, passed as-is. An alternative to `content` and\n * `richTextPath`; setting both is an error in dev mode.\n * @example { json, links: { assets: { block, hyperlink }, entries: { block, inline, hyperlink } } }\n */\n gqlRichText = input<ContentfulGqlRichText | null | undefined>();\n\n private readonly executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n private includes = computed(() => {\n const gqlRichText = this.gqlRichText();\n\n if (gqlRichText) {\n return mapContentfulGqlLinks(gqlRichText.links);\n }\n\n const includes = this.content()?.includes;\n\n return { assets: includes?.Asset ?? [], entries: includes?.Entry ?? [] };\n });\n\n private contentIncludesMap = computed<ContentfulIncludeMap>(() => createContentfulIncludeMap(this.includes()));\n\n private includedEntries = computed(() => new Map(this.includes().entries.map((entry) => [entry.sys.id, entry])));\n\n private richTextData = computed(() => {\n const gqlRichText = this.gqlRichText();\n const content = this.content();\n const richTextPath = this.richTextPath();\n\n if (ngDevMode && gqlRichText && (content || richTextPath)) {\n throw richTextRendererError('rich_text_conflicting_inputs', { gqlRichText, content, richTextPath });\n }\n\n if (gqlRichText) {\n if (!isRichTextRootNode(gqlRichText.json)) {\n throw richTextRendererError('rich_text_wrong_type', { gqlRichText });\n }\n\n return gqlRichText.json;\n }\n\n if (!content) {\n return null;\n }\n\n if (!richTextPath) {\n if (ngDevMode) {\n console.warn(\n '<et-contentful-rich-text-renderer>: content is set without richTextPath, so nothing is rendered. Set richTextPath, or pass a GraphQL field through gqlRichText.',\n );\n }\n\n return null;\n }\n\n const richText = getObjectProperty(content as unknown as Record<string, unknown>, richTextPath);\n\n if (richText === null || richText === undefined) {\n if (ngDevMode && richText === undefined) {\n warnOnUnresolvedParentPath(content, richTextPath);\n }\n\n return null;\n }\n\n if (!isObject(richText)) {\n throw richTextRendererError('rich_text_not_object', { content, richTextPath, type: typeof richText });\n }\n\n if (!isRichTextRootNode(richText)) {\n throw richTextRendererError('rich_text_wrong_type', { content, richTextPath });\n }\n\n return richText as RichTextResponse;\n });\n\n private renderCommands = computed(() => {\n const richTextData = this.richTextData();\n\n if (!richTextData) {\n return [];\n }\n\n return this.createRenderCommands(richTextData);\n });\n\n private renderInstructions = computed(() => {\n const commands = this.renderCommands();\n const previousRenderCommandMap = new Map(\n [...this.executedCommandsCache.entries()].map(([id, item]) => [id, item.command]),\n );\n\n const instructions: RenderInstruction[] = [];\n\n const preserved = new Set<string>();\n const needsReattach = new Set<string>();\n\n const markTagsEqual = (a: MarkTagName[], b: MarkTagName[]) =>\n a.length === b.length && a.every((tag, index) => tag === b[index]);\n\n const attributesEqual = (a: Record<string, string>, b: Record<string, string>) => {\n const aKeys = Object.keys(a);\n\n return aKeys.length === Object.keys(b).length && aKeys.every((key) => a[key] === b[key]);\n };\n\n for (const command of commands) {\n if (command.kind === 'htmlClose') {\n continue;\n }\n\n const previous = previousRenderCommandMap.get(command.id);\n\n if (!previous || previous.kind !== command.kind) {\n continue;\n }\n\n if (previous.kind === 'component' && command.kind === 'component' && previous.component !== command.component) {\n continue;\n }\n\n const parentPreserved =\n previous.parentId === command.parentId && (command.parentId === null || preserved.has(command.parentId));\n\n if (command.kind === 'component') {\n preserved.add(command.id);\n\n const samePlace =\n parentPreserved &&\n previous.nestingLevel === command.nestingLevel &&\n previous.domPosition === command.domPosition;\n\n if (!samePlace) {\n needsReattach.add(command.id);\n }\n\n continue;\n }\n\n const sameOutput =\n previous.kind === command.kind &&\n (previous.kind !== 'htmlOpen' || previous.tagName === (command as HtmlOpenRenderCommand).tagName) &&\n (previous.kind !== 'text' ||\n (previous.text === (command as TextRenderCommand).text &&\n markTagsEqual(previous.markTags, (command as TextRenderCommand).markTags)));\n\n if (\n parentPreserved &&\n sameOutput &&\n previous.nestingLevel === command.nestingLevel &&\n previous.domPosition === command.domPosition &&\n attributesEqual(previous.attributes, command.attributes)\n ) {\n preserved.add(command.id);\n }\n }\n\n for (const [id, command] of previousRenderCommandMap) {\n if (command.kind !== 'htmlClose' && !preserved.has(id)) {\n instructions.push({ type: 'delete', command });\n }\n }\n\n for (const command of commands) {\n if (command.kind === 'htmlClose') {\n continue;\n }\n\n if (!preserved.has(command.id)) {\n instructions.push({ type: 'create', command });\n } else if (command.kind === 'component' && needsReattach.has(command.id)) {\n instructions.push({ type: 'move', command });\n } else {\n instructions.push({ type: 'update', command });\n }\n }\n\n return instructions;\n });\n\n constructor() {\n effect(() => {\n const instructions = this.renderInstructions();\n\n untracked(() => this.execInstructions(instructions));\n });\n }\n\n private createRenderCommands(richTextData: RichTextResponse) {\n const rootCommands: RenderCommand[] = [];\n let elementOpenId = 0;\n let elementCloseId = 0;\n const componentIdMap = new Map<string, number>();\n let nestingLevel = 0;\n let domPosition = 0;\n\n let textId = 0;\n\n const openElementIds: string[] = [];\n\n const traverse = (node: Block | Inline | Text) => {\n switch (node.nodeType) {\n case 'text': {\n const text = node.value;\n\n if (!text) break;\n\n const attributes: Record<string, string> = {\n class: 'et-contentful-rich-text-default-element et-contentful-rich-text-default-span',\n };\n\n rootCommands.push({\n kind: 'text',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n markTags: node.marks.length ? marksToTags(node.marks) : [],\n text,\n id: 't' + textId++,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_BLOCKS.EMBEDDED_ASSET: {\n const assetId = node.data['target']?.sys?.id;\n\n if (!assetId) {\n throw richTextRendererError('asset_id_not_found', { node });\n }\n\n const asset = this.contentIncludesMap().getAsset(assetId);\n\n if (!asset) {\n if (isDevMode()) {\n console.warn(\n 'Embedded asset is missing from the includes! The asset will be skipped. Is it unpublished or deleted?',\n { assetId, node },\n );\n }\n\n break;\n }\n\n const contentType = asset.fields.file?.contentType;\n const assetComponents = this.config.components;\n\n if (!asset.fields.file?.url) {\n if (isDevMode()) {\n console.warn(\n 'Asset is missing file data! Asset will be skipped. Did you forget to upload a file for the current translation in Contentful?',\n { asset },\n );\n }\n\n break;\n }\n\n const isImage = contentType?.startsWith('image/');\n const isVideo = contentType?.startsWith('video/');\n const isAudio = contentType?.startsWith('audio/');\n\n const component = isImage\n ? assetComponents.image\n : isVideo\n ? assetComponents.video\n : isAudio\n ? assetComponents.audio\n : assetComponents.file;\n\n if (!component) {\n if (isDevMode()) {\n console.warn(\n 'No component registered for this embedded asset! The asset will be skipped. Provide one via provideContentfulConfig({ components: … }).',\n { asset },\n );\n }\n\n break;\n }\n\n const occurrenceKey = 'asset:' + assetId;\n const occurrence = (componentIdMap.get(occurrenceKey) ?? -1) + 1;\n componentIdMap.set(occurrenceKey, occurrence);\n const id = occurrence === 0 ? occurrenceKey : `${occurrenceKey}:${occurrence}`;\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component,\n inputs: { asset },\n id,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_INLINES.HYPERLINK:\n case CF_INLINES.ASSET_HYPERLINK:\n case CF_INLINES.ENTRY_HYPERLINK: {\n let href: string | null = null;\n\n if (node.nodeType === CF_INLINES.HYPERLINK) {\n href = normalizeHref((node.data['uri'] as string) ?? '');\n } else if (node.nodeType === CF_INLINES.ASSET_HYPERLINK) {\n const assetId = node.data['target']?.sys?.id;\n const asset = assetId ? this.contentIncludesMap().getAsset(assetId) : null;\n const url = asset?.fields.file?.url;\n href = url ? normalizeHref(url) : null;\n }\n\n const linkTexts = node.content.filter(\n (child): child is Text => child.nodeType === 'text' && Boolean(child.value),\n );\n if (!linkTexts.length) {\n break;\n }\n\n const linkText = linkTexts.map((child) => child.value).join('');\n const linkComponent = href ? this.config.components.link : null;\n\n if (href && !linkComponent) {\n const anchorHref = isRouteRelativeHref(href)\n ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url()))\n : href;\n const attributes: Record<string, string> = { class: DEFAULT_ANCHOR_CLASS, href: anchorHref };\n\n if (\n isExternalWebHref(href, { location: this.document.location, internalHosts: this.config.internalHosts })\n ) {\n attributes['target'] = '_blank';\n attributes['rel'] = 'noopener noreferrer';\n }\n\n rootCommands.push({\n kind: 'htmlOpen',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n tagName: 'a',\n id: 'e-o' + elementOpenId++,\n });\n\n const anchorDomPosition = domPosition;\n\n openElementIds.push('e-o' + (elementOpenId - 1));\n nestingLevel++;\n domPosition = 0;\n\n for (const child of linkTexts) {\n traverse(child);\n }\n\n openElementIds.pop();\n nestingLevel--;\n domPosition = anchorDomPosition;\n\n rootCommands.push({\n kind: 'htmlClose',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n tagName: 'a',\n id: 'e-c' + elementCloseId++,\n });\n\n domPosition++;\n\n break;\n }\n\n if (!href) {\n for (const child of linkTexts) {\n traverse(child);\n }\n\n break;\n }\n\n if (!linkComponent) {\n break;\n }\n\n const sharedMarks =\n linkTexts[0]?.marks.filter((mark) =>\n linkTexts.every((child) => child.marks.some((other) => other.type === mark.type)),\n ) ?? [];\n\n let linkComponentId = componentIdMap.get(LINK_COMPONENT_TYPE) ?? -1;\n const linkId = LINK_COMPONENT_TYPE + ++linkComponentId;\n componentIdMap.set(LINK_COMPONENT_TYPE, linkComponentId);\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component: linkComponent,\n inputs: { href, text: linkText, marks: sharedMarks.map((mark) => mark.type), richText: true },\n id: linkId,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_BLOCKS.EMBEDDED_ENTRY:\n case CF_INLINES.EMBEDDED_ENTRY: {\n const entryId = node.data['target']?.sys?.id;\n\n if (!entryId) {\n throw richTextRendererError('entry_id_not_found', { node });\n }\n\n const entry = this.includedEntries().get(entryId);\n\n if (!entry) {\n if (isDevMode()) {\n console.warn(\n 'Embedded entry is missing from the includes! The entry will be skipped. Is it unpublished or deleted, or is the include query param too low?',\n { entryId, node },\n );\n }\n\n break;\n }\n\n const componentType = entry.sys.contentType.sys.id;\n\n const component = this.config.customComponents[componentType];\n\n if (!component) {\n if (isDevMode()) {\n console.warn(\n 'No custom component registered for this embedded entry type! The entry will be skipped. Provide one via provideContentfulConfig({ customComponents: … }).',\n { componentType, customComponents: this.config.customComponents, entry },\n );\n }\n\n break;\n }\n\n const occurrenceKey = 'entry:' + entryId;\n const occurrence = (componentIdMap.get(occurrenceKey) ?? -1) + 1;\n componentIdMap.set(occurrenceKey, occurrence);\n const id = occurrence === 0 ? occurrenceKey : `${occurrenceKey}:${occurrence}`;\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component,\n inputs: {\n fields: entry.fields,\n metadata: entry.metadata,\n sys: entry.sys,\n includes: this.contentIncludesMap(),\n },\n id,\n });\n\n domPosition++;\n\n break;\n }\n\n default: {\n const tag = translateContentfulNodeTypeToHtmlTag(node.nodeType);\n const attributes: Record<string, string> = {\n class: `et-contentful-rich-text-default-element et-contentful-rich-text-default-${tag}`,\n };\n\n rootCommands.push({\n kind: 'htmlOpen',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n tagName: tag,\n id: 'e-o' + elementOpenId++,\n });\n\n const domPositionAtThisLevel = domPosition;\n openElementIds.push('e-o' + (elementOpenId - 1));\n nestingLevel++;\n domPosition = 0;\n\n for (const child of node.content) {\n traverse(child);\n }\n\n openElementIds.pop();\n nestingLevel--;\n domPosition = domPositionAtThisLevel;\n\n const lastCommand = rootCommands[rootCommands.length - 1];\n\n if (\n lastCommand?.kind === 'htmlOpen' &&\n lastCommand.tagName !== 'td' &&\n lastCommand.tagName !== 'th' &&\n lastCommand.tagName !== 'hr'\n ) {\n rootCommands.pop();\n elementOpenId--;\n } else {\n rootCommands.push({\n kind: 'htmlClose',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n tagName: tag,\n id: 'e-c' + elementCloseId++,\n });\n\n domPosition++;\n }\n\n break;\n }\n }\n };\n\n for (const node of richTextData.content) {\n traverse(node);\n }\n\n return rootCommands;\n }\n\n private execInstructions(instructions: RenderInstruction[]) {\n const lastPlacedChild = new Map<string | null, HTMLElement>();\n\n for (const { type, command } of instructions) {\n if (type === 'delete') {\n this.runDeleteInstruction(command);\n\n continue;\n }\n\n const previousSibling = lastPlacedChild.get(command.parentId) ?? null;\n\n switch (type) {\n case 'create':\n this.runCreateInstruction(command, previousSibling);\n break;\n case 'update':\n this.runUpdateInstruction(command);\n break;\n case 'move':\n this.runMoveInstruction(command, previousSibling);\n break;\n }\n\n const element = this.executedCommandsCache.get(command.id)?.element;\n\n if (element) {\n lastPlacedChild.set(command.parentId, element);\n }\n }\n }\n\n private runCreateInstruction(command: RenderCommand, previousSibling: HTMLElement | null) {\n const parentElement = this.findParent(command);\n\n if (command.kind === 'component') {\n const inputs = signal(command.inputs);\n\n const declaredInputs = reflectComponentType(command.component)?.inputs ?? [];\n const bindings = declaredInputs\n .filter((declared) => declared.propName in command.inputs)\n .map((declared) => inputBinding(declared.templateName, () => inputs()[declared.propName]));\n\n const componentRef = this.viewContainerRef.createComponent(command.component, { bindings });\n\n const rootNode = this.getComponentRootNode(componentRef);\n\n this.renderInsertAfter(rootNode, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n componentRef,\n inputs,\n element: rootNode,\n });\n } else if (command.kind === 'text') {\n const span = this.renderer.createElement('span');\n const textSplitInLineBreaks = command.text.split('\\n');\n\n for (const [key, value] of Object.entries(command.attributes)) {\n this.renderer.setAttribute(span, key, value);\n }\n\n let textContainer = span;\n\n for (const tag of command.markTags) {\n const markElement = this.renderer.createElement(tag);\n\n this.renderer.appendChild(textContainer, markElement);\n textContainer = markElement;\n }\n\n for (const [textPartIndex, textPart] of textSplitInLineBreaks.entries()) {\n if (textPartIndex > 0) {\n const brNode = this.renderer.createElement('br');\n this.renderer.appendChild(textContainer, brNode);\n }\n\n if (textPart) {\n const textNode = this.renderer.createText(textPart);\n\n this.renderer.appendChild(textContainer, textNode);\n }\n }\n\n this.renderInsertAfter(span, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n element: span,\n });\n } else if (command.kind === 'htmlOpen') {\n const element = this.renderer.createElement(command.tagName);\n\n for (const [key, value] of Object.entries(command.attributes)) {\n this.renderer.setAttribute(element, key, value);\n }\n\n this.renderInsertAfter(element, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n element,\n });\n }\n }\n\n private runUpdateInstruction(command: RenderCommand) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n cached.inputs.set(command.inputs);\n }\n\n this.executedCommandsCache.set(command.id, {\n ...cached,\n command,\n } as ExecutedCommandCacheItem);\n }\n\n private runMoveInstruction(command: RenderCommand, previousSibling: HTMLElement | null) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n const rootNode = cached.element;\n const oldParentElement = cached.element.parentElement;\n\n if (oldParentElement) {\n this.renderer.removeChild(oldParentElement, rootNode);\n }\n\n this.renderInsertAfter(rootNode, { parentElement: this.findParent(command), previousSibling });\n\n cached.inputs.set(command.inputs);\n\n this.executedCommandsCache.set(command.id, {\n ...cached,\n command,\n } as ExecutedCommandCacheItem);\n }\n }\n\n private runDeleteInstruction(command: RenderCommand) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n if (command.kind === 'htmlClose') {\n return;\n }\n\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n cached.componentRef.destroy();\n } else if (command.kind === 'text' || command.kind === 'htmlOpen') {\n if (cached.element.parentElement) {\n this.renderer.removeChild(cached.element.parentElement, cached.element);\n }\n }\n\n this.executedCommandsCache.delete(command.id);\n }\n\n private getComponentRootNode(componentRef: ComponentRef<unknown>): HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\n }\n\n private findParent(command: RenderCommand) {\n if (command.parentId === null) {\n return this.elementRef.nativeElement;\n }\n\n const parentElement = this.executedCommandsCache.get(command.parentId)?.element;\n\n if (!parentElement) {\n throw richTextRendererError('text_parent_not_found', { command });\n }\n\n return parentElement;\n }\n\n private renderInsertAfter(\n node: HTMLElement,\n { parentElement, previousSibling }: { parentElement: HTMLElement; previousSibling: HTMLElement | null },\n ) {\n this.renderer.insertBefore(\n parentElement,\n node,\n previousSibling ? previousSibling.nextSibling : parentElement.firstChild,\n );\n }\n}\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n @if (data(); as data) {\n <video class=\"et-contentful-video-video\" controls>\n <source [src]=\"data.url\" [attr.type]=\"data.contentType || null\" class=\"et-contentful-video-source\" />\n </video>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-video',\n },\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n contentType: asset.contentType,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n contentType: asset.fields.file.contentType,\n };\n }\n\n return null;\n });\n}\n","import { ContentfulAudioComponent } from './components/audio';\nimport { ContentfulFileComponent } from './components/file';\nimport { ContentfulImageComponent } from './components/image';\nimport { ContentfulRichTextRendererComponent } from './components/rich-text-renderer';\nimport { ContentfulVideoComponent } from './components/video';\n\nexport const ContentfulImports = [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n] as const;\n","import { ContentfulAudioComponent } from '../components/audio';\nimport { ContentfulFileComponent } from '../components/file';\nimport { ContentfulImageComponent } from '../components/image';\nimport { ContentfulLinkComponent } from '../components/link';\nimport { ContentfulVideoComponent } from '../components/video';\nimport { ContentfulConfig } from '../types';\n\n/**\n * The shipped audio, file, image, video and link components, to spread into `provideContentfulConfig`.\n * An app that brings its own components, or renders text only, leaves this out and bundles none of them.\n * To replace one, spread the map instead: `components: { ...CONTENTFUL_DEFAULT_COMPONENTS.components, image: MyImage }`.\n *\n * @example\n * provideContentfulConfig({ ...CONTENTFUL_DEFAULT_COMPONENTS });\n */\nexport const CONTENTFUL_DEFAULT_COMPONENTS = {\n components: {\n audio: ContentfulAudioComponent,\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n link: ContentfulLinkComponent,\n },\n} satisfies Partial<ContentfulConfig>;\n","import { Provider } from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfigOptions, ContentfulEntry } from '../types';\nimport { createContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig?: ContentfulConfigOptions | null): Provider => {\n return { provide: CONTENTFUL_CONFIG, useValue: createContentfulConfig(contentfulConfig) };\n};\n\nexport const isContentfulEntryType = <T extends ContentfulEntry>(entry: ContentfulEntry, type: string): entry is T =>\n entry.sys.contentType.sys.id === type;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ethlete-contentful.mjs","sources":["../../../../libs/contentful/src/lib/gql/asset.fragments.ts","../../../../libs/contentful/src/lib/components/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/components/file/contentful-file-labels.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.utils.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/components/link/contentful-link.util.ts","../../../../libs/contentful/src/lib/components/link/contentful-link.component.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-node-types.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.errors.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.gql.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.ts","../../../../libs/contentful/src/lib/contentful.imports.ts","../../../../libs/contentful/src/lib/utils/contentful-default-components.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { GQL } from '@ethlete/query';\n\nexport const GQL_FRAGMENT_CONTENTFUL_ASSET = `\n fragment ContentfulAssetData on Asset {\n sys {\n id\n }\n url\n title\n fileName\n width\n height\n description\n contentType\n size\n }\n` as GQL;\n\nexport type ContentfulGqlAsset = {\n sys: {\n id: string;\n };\n title: string | null;\n fileName?: string | null;\n contentType: string | null;\n url: string | null;\n description: string | null;\n width: number | null;\n height: number | null;\n size: number | null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isContentfulGqlAsset = (asset: any): asset is ContentfulGqlAsset => {\n return Boolean(asset && typeof asset === 'object' && asset.sys?.id && !('fields' in asset));\n};\n\nexport type ContentfulGqlWhereFilter<TLinkedFrom extends Record<string, unknown> = Record<string, unknown>> = {\n /**\n * Filer by ids.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters/sys-filters\n */\n sys?: {\n id?: string;\n id_not?: string;\n id_in?: string[];\n id_not_in?: string[];\n id_contains?: string;\n id_not_contains?: string;\n };\n /**\n * Filer by tags.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters/contentfulmetadata-filters\n */\n contentfulMetadata?: {\n tags_exists?: boolean;\n tags?: {\n id_contains_some?: string[];\n id_contains_none?: string[];\n id_contains_all?: string[];\n };\n };\n /**\n * Retrieve a collection of entries linked to the specified entry or asset.\n * @see https://www.contentful.com/developers/docs/references/graphql/#links-to-a-specific-item\n */\n linkedFrom?: TLinkedFrom;\n};\n\nexport type ContentfulGqlOrder = `${string}_${'ASC' | 'DESC'}`;\n\nexport type ContentfulGqlCollectionFilterVariables<\n TCustomWhere extends Record<string, unknown> = Record<string, unknown>,\n TLinkedFrom extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /**\n * Zero-indexed offset in the collection from which items are fetched\n * @default 0\n */\n skip?: number;\n\n /**\n * Maximum number of items to fetch. Maximum is 1000.\n * @default 100\n */\n limit?: number;\n\n /**\n * Filter specifications to apply on the collection query.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-filters\n */\n where?: TCustomWhere & ContentfulGqlWhereFilter<TLinkedFrom>;\n\n /**\n * Order specifications to apply on the collection query.\n * @see https://www.contentful.com/developers/docs/references/graphql/#/reference/collection-order\n */\n order?: ContentfulGqlOrder[];\n\n /**\n * When set to `true` the field will be resolved with non published content.\n * @default false\n */\n preview?: boolean;\n\n /**\n * Locale for the collection items. If not set the default locale is used.\n */\n locale?: string;\n};\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n @if (data(); as data) {\n <figure class=\"et-contentful-audio-figure\">\n @if (data.title) {\n <figcaption class=\"et-contentful-audio-figcaption\">{{ data.title }}</figcaption>\n }\n <audio [src]=\"data.url\" class=\"et-contentful-audio-audio\" controls></audio>\n </figure>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-audio',\n },\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n title: asset.title || asset.fileName || null,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n title: asset.fields.title || asset.fields.file.fileName || null,\n };\n }\n\n return null;\n });\n}\n","import { formatFileSize } from '@ethlete/components';\nimport { defineLabels, toInjectFn, toProvideFn, toToken } from '@ethlete/core';\n\n/** Every string `et-contentful-file` renders itself. Override them app-wide with {@link provideContentfulFileLabels}. */\nexport type ContentfulFileLabels = {\n /** The size shown after the file title, e.g. `'(1.5 MB)'`. */\n fileSize: (bytes: number) => string;\n};\n\n/** The built-in English labels. */\nexport const DEFAULT_CONTENTFUL_FILE_LABELS: ContentfulFileLabels = {\n fileSize: (bytes) => `(${formatFileSize(bytes)})`,\n};\n\nconst CONTENTFUL_FILE_LABELS_DEF = /* @__PURE__ */ defineLabels<ContentfulFileLabels>(\n 'CONTENTFUL_FILE_LABELS',\n DEFAULT_CONTENTFUL_FILE_LABELS,\n);\n\n/**\n * Localize `et-contentful-file` for everything below this injector, and read the set in effect here as a signal.\n * Partial - whatever you leave out keeps its {@link DEFAULT_CONTENTFUL_FILE_LABELS} value.\n *\n * @example\n * provideContentfulFileLabels({ fileSize: (bytes) => `(${new Intl.NumberFormat('de').format(bytes)} Byte)` });\n */\nexport const provideContentfulFileLabels = /* @__PURE__ */ toProvideFn(CONTENTFUL_FILE_LABELS_DEF);\nexport const injectContentfulFileLabels = /* @__PURE__ */ toInjectFn(CONTENTFUL_FILE_LABELS_DEF);\nexport const CONTENTFUL_FILE_LABELS = /* @__PURE__ */ toToken(CONTENTFUL_FILE_LABELS_DEF);\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\nimport { injectContentfulFileLabels } from './contentful-file-labels';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n @if (data(); as data) {\n <a [href]=\"data.url\" class=\"et-contentful-file-anchor\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ data.title }}\n @if (data.size !== null) {\n {{ labels().fileSize(data.size) }}\n }\n </a>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-file',\n },\n})\nexport class ContentfulFileComponent {\n protected labels = injectContentfulFileLabels();\n\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n size: asset.size,\n title: asset.title || asset.fileName || null,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n size: asset.fields.file.details.size,\n title: asset.fields.title || asset.fields.file.fileName || null,\n };\n }\n\n return null;\n });\n}\n","import { InjectionToken } from '@angular/core';\nimport { ContentfulConfig } from '../types';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('ContentfulConfig');\n","import { inject } from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../constants/contentful.constants';\nimport { ContentfulConfig, ContentfulConfigOptions } from '../types';\n\n/**\n * The config used when no `provideContentfulConfig()` is in scope. It declares no\n * `components`, so embedded assets are skipped and hyperlinks render as plain anchors\n * until a config is provided.\n */\nconst CONTENTFUL_FALLBACK_CONFIG: ContentfulConfig = {\n internalHosts: [],\n entryHref: null,\n components: {},\n customComponents: {},\n imageOptions: {\n srcsetSizes: ['375w', '1280w', '1920w', '2560w'],\n sizes: ['100vw'],\n backgroundColor: null,\n },\n};\n\nconst withoutUndefined = <T extends object>(value: T | null | undefined) =>\n Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined)) as Partial<T>;\n\nexport const createContentfulConfig = (options?: ContentfulConfigOptions | null): ContentfulConfig => {\n const config = options ?? {};\n\n return {\n ...CONTENTFUL_FALLBACK_CONFIG,\n ...config,\n components: config.components ?? CONTENTFUL_FALLBACK_CONFIG.components,\n customComponents: config.customComponents ?? CONTENTFUL_FALLBACK_CONFIG.customComponents,\n internalHosts: config.internalHosts ?? CONTENTFUL_FALLBACK_CONFIG.internalHosts,\n imageOptions: { ...CONTENTFUL_FALLBACK_CONFIG.imageOptions, ...withoutUndefined(config.imageOptions) },\n };\n};\n\n/**\n * Reads the contentful config from the current injector. Falls back to a config without\n * any `components` when none was provided via `provideContentfulConfig()`.\n */\nexport const injectContentfulConfig = (): ContentfulConfig =>\n inject(CONTENTFUL_CONFIG, { optional: true }) ?? CONTENTFUL_FALLBACK_CONFIG;\n","import { PictureSource } from '@ethlete/components';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulRestAsset } from '../../types';\n\nexport const generateDefaultContentfulImageSource = (data: ContentfulRestAsset | ContentfulGqlAsset): PictureSource => {\n const { url, contentType } = isContentfulGqlAsset(data) ? data : (data.fields.file ?? {});\n\n return url ? { type: contentType ?? '', srcset: url } : { type: '', srcset: '' };\n};\n\n/**\n * Parses source set sizes into an object containing with and height. Eg.\n * - `\"400\"` - 400px width\n * - `\"400x300\"` - 400px width and 300px height\n * - `\"400w\"` - 400px width\n * - `\"400h\"` - 400px height\n * - `\"400wx300h\"` - 400px width and 300px height\n **/\nexport const parseContentfulImageSize = (size: string): { width: number | null; height: number | null } => {\n const widthAndHeight = /^(\\d+)w?x(\\d+)h?$/.exec(size);\n\n if (widthAndHeight) {\n return {\n width: Number(widthAndHeight[1]),\n height: Number(widthAndHeight[2]),\n };\n }\n\n const height = /^(\\d+)h$/.exec(size);\n\n if (height) {\n return { width: null, height: Number(height[1]) };\n }\n\n const width = /^(\\d+)w?$/.exec(size);\n\n return width ? { width: Number(width[1]), height: null } : { width: null, height: null };\n};\n\nconst SOURCE_TYPES = ['image/avif', 'image/webp'];\n\nexport type ContentfulImageSourcesOptions = {\n srcsetSizes?: string[];\n backgroundColor?: string | null;\n quality?: number | null;\n focusArea?: ContentfulImageFocusArea | null;\n resizeBehavior?: ContentfulImageResizeBehavior | null;\n};\n\n/**\n * Builds AVIF and WebP `<source>` entries for a Contentful asset through the Contentful Images API.\n *\n * @example\n * generateContentfulImageSources(asset, { srcsetSizes: ['400w', '800w'], quality: 80 });\n */\nexport const generateContentfulImageSources = (\n data: ContentfulRestAsset | ContentfulGqlAsset,\n options: ContentfulImageSourcesOptions = {},\n): PictureSource[] => {\n const { srcsetSizes = [], backgroundColor = null, quality = null, focusArea = null, resizeBehavior = null } = options;\n\n const isGqlAsset = isContentfulGqlAsset(data);\n const baseUrl = isGqlAsset ? data.url : data.fields.file?.url;\n\n if (!baseUrl) {\n return [];\n }\n\n const imageDimensions = isGqlAsset ? data : data.fields.file?.details.image;\n const sources: PictureSource[] = [];\n\n for (const type of SOURCE_TYPES) {\n const sourceSets: string[] = [];\n const queryParams: string[] = [];\n\n queryParams.push(`fm=${type.split('/')[1]}`);\n\n if (backgroundColor) {\n queryParams.push(`bg=rgb:${backgroundColor.replace(/^#/, '')}`);\n }\n\n if (quality !== null && Number.isFinite(quality)) {\n queryParams.push(`q=${quality}`);\n }\n\n if (focusArea) {\n queryParams.push(`f=${focusArea}`);\n }\n\n if (resizeBehavior) {\n queryParams.push(`fit=${resizeBehavior}`);\n }\n\n if (srcsetSizes.length) {\n const urlWithParams = `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}${queryParams.join('&')}`;\n\n for (const size of srcsetSizes) {\n const { width, height } = parseContentfulImageSize(size);\n\n if (width && height) {\n sourceSets.push(`${urlWithParams}&w=${width}&h=${height} ${width}w`);\n } else if (width) {\n sourceSets.push(`${urlWithParams}&w=${width} ${width}w`);\n } else if (height && imageDimensions?.width && imageDimensions.height) {\n const derivedWidth = Math.round((height * imageDimensions.width) / imageDimensions.height);\n sourceSets.push(`${urlWithParams}&w=${derivedWidth}&h=${height} ${derivedWidth}w`);\n } else if (ngDevMode && type === SOURCE_TYPES[0]) {\n console.warn(\n height\n ? `Contentful image: srcsetSizes entry \"${size}\" is dropped. A height-only size needs the asset's width and height to derive a width descriptor.`\n : `Contentful image: srcsetSizes entry \"${size}\" is not a valid size and is dropped. Use \"400\", \"400w\", \"400h\" or \"400x300\"; viewport sizes like \"50vw\" belong in sizes.`,\n );\n }\n }\n }\n\n sources.push({\n type,\n srcset: sourceSets.length\n ? sourceSets.join(', ')\n : `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}${queryParams.join('&')}`,\n });\n }\n\n return sources;\n};\n","import { Component, ViewEncapsulation, booleanAttribute, computed, input, numberAttribute } from '@angular/core';\nimport { PictureComponent, normalizePictureSizes } from '@ethlete/components';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulRestAsset } from '../../types';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport {\n generateContentfulImageSources,\n generateDefaultContentfulImageSource,\n} from './contentful-image.component.utils';\n\nconst optionalNumberAttribute = (value: unknown) => {\n const transformed = numberAttribute(value);\n\n return Number.isFinite(transformed) ? transformed : null;\n};\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <et-picture\n [priority]=\"priority()\"\n [defaultSrc]=\"defaultSrcValue()\"\n [alt]=\"normalizedAsset().alt ?? ''\"\n [figcaption]=\"normalizedAsset().figcaption ?? null\"\n [width]=\"normalizedAsset().width ?? null\"\n [height]=\"normalizedAsset().height ?? null\"\n [sizes]=\"sizes()\"\n [sources]=\"sourcesValue()\"\n />\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [PictureComponent],\n host: {\n class: 'et-contentful-image',\n },\n})\nexport class ContentfulImageComponent {\n private contentfulConfig = injectContentfulConfig();\n\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n backgroundColor = input<string | null>(this.contentfulConfig.imageOptions.backgroundColor);\n srcsetSizes = input<string[]>(this.contentfulConfig.imageOptions.srcsetSizes);\n\n quality = input(null, { transform: optionalNumberAttribute });\n focusArea = input<ContentfulImageFocusArea | null>(null);\n resizeBehavior = input<ContentfulImageResizeBehavior | null>(null);\n priority = input(false, { transform: booleanAttribute });\n sizes = input<string | null, string[] | string | null>(\n normalizePictureSizes(this.contentfulConfig.imageOptions.sizes),\n {\n transform: (v) => normalizePictureSizes(v),\n },\n );\n\n protected normalizedAsset = computed(() => {\n const asset = this.asset();\n\n if (isContentfulGqlAsset(asset)) {\n return {\n alt: asset.title || null,\n figcaption: asset.description || null,\n width: asset.width,\n height: asset.height,\n };\n } else {\n return {\n alt: asset?.fields?.title || null,\n figcaption: asset?.fields?.description || null,\n width: asset?.fields?.file?.details?.image?.width ?? null,\n height: asset?.fields?.file?.details?.image?.height ?? null,\n };\n }\n });\n\n protected sourcesValue = computed(() => {\n const asset = this.asset();\n const options = {\n srcsetSizes: this.srcsetSizes(),\n backgroundColor: this.backgroundColor(),\n quality: this.quality(),\n focusArea: this.focusArea(),\n resizeBehavior: this.resizeBehavior(),\n };\n\n if (!asset) {\n return [];\n }\n\n return generateContentfulImageSources(asset, options);\n });\n\n protected defaultSrcValue = computed(() => {\n const asset = this.asset();\n\n return asset ? generateDefaultContentfulImageSource(asset) : null;\n });\n}\n","export const parseWebUrl = (href: string): URL | null => {\n if (!/^(?:https?:)?\\/\\//i.test(href)) {\n return null;\n }\n\n try {\n return new URL(href.startsWith('//') ? 'https:' + href : href);\n } catch {\n return null;\n }\n};\n\nconst parseConfiguredHost = (host: string) => {\n const value = host.trim().toLowerCase();\n const wildcard = value.startsWith('*.');\n const bare = wildcard ? value.slice(2) : value;\n\n try {\n const url = new URL(bare.includes('://') ? bare : 'https://' + bare);\n\n return { hostname: url.hostname, port: url.port, wildcard };\n } catch {\n return { hostname: bare.split(':')[0] ?? bare, port: '', wildcard };\n }\n};\n\nconst matchesConfiguredHost = (url: URL, configuredHost: string) => {\n const { hostname, port, wildcard } = parseConfiguredHost(configuredHost);\n\n if (!hostname || (port && url.port !== port)) return false;\n\n return wildcard ? url.hostname.endsWith('.' + hostname) : url.hostname === hostname;\n};\n\nexport type WebUrlContext = { location: Location; internalHosts: string[] };\n\nexport const isInternalWebUrl = (url: URL, { location, internalHosts }: WebUrlContext) =>\n (url.hostname === location.hostname && url.port === location.port) ||\n internalHosts.some((host) => matchesConfiguredHost(url, host));\n\nexport const isExternalWebHref = (href: string, context: WebUrlContext) => {\n const url = parseWebUrl(href);\n\n return url !== null && !isInternalWebUrl(url, context);\n};\n\nexport const internalWebHrefPath = (href: string, context: WebUrlContext) => {\n const url = parseWebUrl(href);\n\n return url && isInternalWebUrl(url, context) ? url.pathname + url.search + url.hash : null;\n};\n\nexport const hasUrlScheme = (href: string) => /^[a-z][a-z\\d+.-]*:/i.test(href);\n\nexport const isRouteRelativeHref = (href: string) => !hasUrlScheme(href) && !href.startsWith('/');\n\nexport const resolveHrefAgainstRoute = (href: string, routerUrl: string) => {\n const resolved = new URL(href, 'https://contentful.invalid' + routerUrl);\n\n return resolved.pathname + resolved.search + resolved.hash;\n};\n","import { DOCUMENT, Location } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { injectUrl } from '@ethlete/core';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport { hasUrlScheme, isInternalWebUrl, parseWebUrl, resolveHrefAgainstRoute } from './contentful-link.util';\n\nconst RICH_TEXT_ANCHOR_CLASSES = ['et-contentful-rich-text-default-element', 'et-contentful-rich-text-default-a'];\n\n@Component({\n selector: 'et-contentful-link',\n template: `\n @if (usesRouterLink()) {\n <a [class]=\"modifierClasses()\" [routerLink]=\"internalUrlTree()\" class=\"et-contentful-link-anchor\">{{ text() }}</a>\n } @else {\n <a\n [class]=\"modifierClasses()\"\n [href]=\"anchorHref()\"\n [attr.target]=\"openInNewTab() ? '_blank' : null\"\n [attr.rel]=\"openInNewTab() ? 'noopener noreferrer' : null\"\n class=\"et-contentful-link-anchor\"\n >{{ text() }}</a\n >\n }\n `,\n styleUrl: './contentful-link.component.css',\n encapsulation: ViewEncapsulation.None,\n imports: [RouterLink],\n host: {\n class: 'et-contentful-link',\n },\n})\nexport class ContentfulLinkComponent {\n private document = inject(DOCUMENT);\n private location = inject(Location);\n private router = inject(Router);\n private config = injectContentfulConfig();\n private url = injectUrl();\n\n href = input.required<string>();\n text = input.required<string>();\n marks = input<readonly string[]>([]);\n richText = input(false);\n\n protected usesRouterLink = computed(() => {\n const href = this.href();\n const absoluteUrl = parseWebUrl(href);\n\n if (absoluteUrl) {\n return isInternalWebUrl(absoluteUrl, {\n location: this.document.location,\n internalHosts: this.config.internalHosts,\n });\n }\n\n return !href.startsWith('#') && !hasUrlScheme(href);\n });\n\n protected anchorHref = computed(() => {\n const href = this.href();\n\n return href.startsWith('#') ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url())) : href;\n });\n\n protected openInNewTab = computed(() => Boolean(parseWebUrl(this.href())) && !this.usesRouterLink());\n\n protected internalPath = computed(() => {\n const href = this.href();\n const url = parseWebUrl(href);\n\n if (url) {\n return url.pathname + url.search + url.hash;\n }\n\n if (href.startsWith('/')) {\n return href;\n }\n\n return resolveHrefAgainstRoute(href, this.url());\n });\n\n protected internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()));\n\n protected modifierClasses = computed(() => [\n ...(this.richText() ? RICH_TEXT_ANCHOR_CLASSES : []),\n ...this.marks().map((mark) => `et-contentful-rich-text-mark-${mark}`),\n ]);\n}\n","import { BLOCKS, INLINES } from '@contentful/rich-text-types';\n\n/**\n * The `BLOCKS` node type strings of `@contentful/rich-text-types`, as a plain literal map.\n * Keep the values in sync with the enum - they are part of the Contentful Delivery API.\n *\n * These maps exist because `BLOCKS` and `INLINES` are TS enums: reading one in a *value* position\n * anywhere in this lib emits a runtime import and costs every consumer ~2.4 kB gz. Use the enums for\n * types only - the `contentful-deps` size golden fails if that slips.\n */\nexport const CF_BLOCKS = {\n DOCUMENT: 'document',\n PARAGRAPH: 'paragraph',\n HEADING_1: 'heading-1',\n HEADING_2: 'heading-2',\n HEADING_3: 'heading-3',\n HEADING_4: 'heading-4',\n HEADING_5: 'heading-5',\n HEADING_6: 'heading-6',\n OL_LIST: 'ordered-list',\n UL_LIST: 'unordered-list',\n LIST_ITEM: 'list-item',\n HR: 'hr',\n QUOTE: 'blockquote',\n EMBEDDED_ENTRY: 'embedded-entry-block',\n EMBEDDED_ASSET: 'embedded-asset-block',\n EMBEDDED_RESOURCE: 'embedded-resource-block',\n TABLE: 'table',\n TABLE_ROW: 'table-row',\n TABLE_CELL: 'table-cell',\n TABLE_HEADER_CELL: 'table-header-cell',\n} as unknown as typeof BLOCKS;\n\n/**\n * The `INLINES` node type strings of `@contentful/rich-text-types`, as a plain literal map.\n * Keep the values in sync with the enum - they are part of the Contentful Delivery API.\n */\nexport const CF_INLINES = {\n ASSET_HYPERLINK: 'asset-hyperlink',\n EMBEDDED_ENTRY: 'embedded-entry-inline',\n EMBEDDED_RESOURCE: 'embedded-resource-inline',\n ENTRY_HYPERLINK: 'entry-hyperlink',\n HYPERLINK: 'hyperlink',\n RESOURCE_HYPERLINK: 'resource-hyperlink',\n} as unknown as typeof INLINES;\n","import { RuntimeError } from '@ethlete/core';\n\nexport const RICH_TEXT_RENDERER_ERRORS = {\n rich_text_not_object: (data: { type: string }) =>\n `The value at richTextPath is a ${data.type}, not a rich-text document object. Point richTextPath at the rich-text field itself (e.g. items[0].fields.body).`,\n rich_text_wrong_type:\n 'The rich text object does not satisfy the RichTextResponse interface. It should contain a property named \"nodeType\" with the value \"document\".',\n\n rich_text_conflicting_inputs:\n 'Set exactly one rich-text source: a GraphQL rich-text field through gqlRichText, a REST response through content and richTextPath, or a bare document through richText (with includes).',\n\n asset_id_not_found: 'The asset ID was not found. This node is not supported.',\n entry_id_not_found: 'The entry ID was not found. This node is not supported.',\n\n text_parent_not_found: 'The parent node is not found. This structure is not supported.',\n\n cached_command_not_found: 'No rendered node was found for a render command. The renderer state is out of sync.',\n cached_command_not_component:\n 'The rendered node for a component command is not a component. The renderer state is out of sync.',\n} as const;\n\nconst RICH_TEXT_RENDERER_ERROR_CODES: Record<keyof typeof RICH_TEXT_RENDERER_ERRORS, number> = {\n rich_text_not_object: 0,\n rich_text_wrong_type: 1,\n rich_text_conflicting_inputs: 11,\n asset_id_not_found: 2,\n entry_id_not_found: 3,\n text_parent_not_found: 7,\n cached_command_not_found: 9,\n cached_command_not_component: 10,\n};\n\nexport const richTextRendererError = (code: keyof typeof RICH_TEXT_RENDERER_ERRORS, data?: unknown) => {\n const entry: string | ((data: never) => string) = RICH_TEXT_RENDERER_ERRORS[code];\n const message = `<et-contentful-rich-text-renderer>: ${typeof entry === 'function' ? entry(data as never) : entry}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, data);\n};\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { ContentfulGqlAsset } from '../../gql';\nimport { ContentfulEntry, ContentfulRestAsset, RichTextResponse } from '../../types';\n\nexport type ContentfulGqlRichTextEntry = {\n __typename?: string | null;\n sys: { id: string };\n [field: string]: unknown;\n};\n\ntype ContentfulGqlLinkList<T> = (T | null | undefined)[] | null;\n\n/**\n * A rich-text field as returned by the Contentful GraphQL API. Select `json` and the `links` the\n * document references, and pass the field to `[gqlRichText]` as-is.\n */\nexport type ContentfulGqlRichText = {\n json: RichTextResponse;\n links?: {\n assets?: {\n block?: ContentfulGqlLinkList<ContentfulGqlAsset>;\n hyperlink?: ContentfulGqlLinkList<ContentfulGqlAsset>;\n } | null;\n entries?: {\n block?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n inline?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n hyperlink?: ContentfulGqlLinkList<ContentfulGqlRichTextEntry>;\n } | null;\n } | null;\n};\n\nconst lowerCaseFirst = (value: string) => value.charAt(0).toLowerCase() + value.slice(1);\n\nconst toGqlTypeName = (contentTypeId: string) => {\n const pascal = contentTypeId.replace(/[^a-z0-9]+(.)?/gi, (_, next: string | undefined) => next?.toUpperCase() ?? '');\n\n return pascal.charAt(0).toUpperCase() + pascal.slice(1);\n};\n\nconst toContentTypeId = (typename: string, contentTypeIds: readonly string[]) =>\n contentTypeIds.find((id) => toGqlTypeName(id) === typename) ?? lowerCaseFirst(typename);\n\nconst toRestAsset = (asset: ContentfulGqlAsset): ContentfulRestAsset => ({\n sys: { type: 'Asset', id: asset.sys.id, createdAt: '', updatedAt: '', locale: '' },\n fields: {\n title: asset.title ?? '',\n description: asset.description ?? '',\n file: {\n url: asset.url,\n details: {\n size: asset.size,\n ...(asset.width !== null && asset.height !== null\n ? { image: { width: asset.width, height: asset.height } }\n : {}),\n },\n fileName: asset.fileName ?? null,\n contentType: asset.contentType,\n },\n },\n metadata: { tags: [] },\n});\n\nconst toRestEntry = (entry: ContentfulGqlRichTextEntry, contentTypeIds: readonly string[]): ContentfulEntry | null => {\n const { __typename, sys, ...fields } = entry;\n\n if (!__typename) {\n return null;\n }\n\n return {\n sys: {\n type: 'Entry',\n id: sys.id,\n createdAt: '',\n updatedAt: '',\n locale: '',\n contentType: { sys: { type: 'Link', linkType: 'ContentType', id: toContentTypeId(__typename, contentTypeIds) } },\n },\n fields,\n metadata: { tags: [] },\n };\n};\n\nconst present = <T>(items: ContentfulGqlLinkList<T> | undefined) =>\n (items ?? []).filter((item): item is T => item !== null && item !== undefined);\n\n/**\n * Maps the `links` of a GraphQL rich-text field to the entries and assets the renderer resolves\n * embeds against. An entry's content type id is the id in `contentTypeIds` whose GraphQL type name\n * (PascalCase, separators dropped: `product-teaser` → `ProductTeaser`) equals its `__typename`, else the\n * `__typename` with the first letter lower-cased. Entries without a `__typename` are dropped.\n */\nexport const mapContentfulGqlLinks = (\n links: ContentfulGqlRichText['links'],\n contentTypeIds: readonly string[] = [],\n) => {\n const assets = new Map<string, ContentfulRestAsset>();\n const entries = new Map<string, ContentfulEntry>();\n\n for (const asset of [...present(links?.assets?.block), ...present(links?.assets?.hyperlink)]) {\n assets.set(asset.sys.id, toRestAsset(asset));\n }\n\n for (const gqlEntry of [\n ...present(links?.entries?.block),\n ...present(links?.entries?.inline),\n ...present(links?.entries?.hyperlink),\n ]) {\n const entry = toRestEntry(gqlEntry, contentTypeIds);\n\n if (entry) {\n entries.set(entry.sys.id, entry);\n }\n }\n\n return { assets: [...assets.values()], entries: [...entries.values()] };\n};\n","import { isDevMode } from '@angular/core';\nimport { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { isObject } from '@ethlete/core';\nimport { RichTextResponse } from '../../types';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\n\nexport const isRichTextRootNode = (node: unknown): node is RichTextResponse => {\n return isObject(node) && 'nodeType' in node && node['nodeType'] === 'document';\n};\n\nconst NODE_TYPE_TAGS: Record<string, keyof HTMLElementTagNameMap> = /* @__PURE__ */ (() => ({\n [CF_BLOCKS.HEADING_1]: 'h1',\n [CF_BLOCKS.HEADING_2]: 'h2',\n [CF_BLOCKS.HEADING_3]: 'h3',\n [CF_BLOCKS.HEADING_4]: 'h4',\n [CF_BLOCKS.HEADING_5]: 'h5',\n [CF_BLOCKS.HEADING_6]: 'h6',\n [CF_BLOCKS.PARAGRAPH]: 'p',\n [CF_BLOCKS.UL_LIST]: 'ul',\n [CF_BLOCKS.OL_LIST]: 'ol',\n [CF_BLOCKS.LIST_ITEM]: 'li',\n [CF_BLOCKS.HR]: 'hr',\n [CF_BLOCKS.QUOTE]: 'blockquote',\n [CF_BLOCKS.TABLE]: 'table',\n [CF_BLOCKS.TABLE_ROW]: 'tr',\n [CF_BLOCKS.TABLE_CELL]: 'td',\n [CF_BLOCKS.TABLE_HEADER_CELL]: 'th',\n}))();\n\nconst INLINE_NODE_TYPES = /* @__PURE__ */ (() => new Set<string>(Object.values(CF_INLINES)))();\n\n/**\n * The html element a structural rich text node renders as. A node type without an element\n * (an unsupported inline or block) falls back to `span` for inlines and `div` otherwise,\n * with a dev-mode warning.\n */\nexport const translateContentfulNodeTypeToHtmlTag = (\n nodeType: 'text' | BLOCKS | INLINES,\n): keyof HTMLElementTagNameMap => {\n const tag = NODE_TYPE_TAGS[nodeType];\n\n if (tag) {\n return tag;\n }\n\n const fallback = INLINE_NODE_TYPES.has(nodeType) ? 'span' : 'div';\n\n if (isDevMode()) {\n console.warn(`Unsupported rich text node type \"${nodeType}\"! Its content is rendered inside a <${fallback}>.`);\n }\n\n return fallback;\n};\n","import { DOCUMENT, Location } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n InjectionToken,\n Injector,\n Type,\n ViewContainerRef,\n ViewEncapsulation,\n WritableSignal,\n computed,\n effect,\n inject,\n input,\n inputBinding,\n isDevMode,\n reflectComponentType,\n signal,\n untracked,\n} from '@angular/core';\nimport { Block, Inline, Mark, Text } from '@contentful/rich-text-types';\nimport { getObjectProperty, injectRenderer, injectUrl, isObject } from '@ethlete/core';\nimport {\n ContentfulCollection,\n ContentfulEntry,\n ContentfulEntryLinkItem,\n ContentfulRestAsset,\n RichTextResponse,\n} from '../../types';\nimport { injectContentfulConfig } from '../../utils/contentful-config';\nimport {\n internalWebHrefPath,\n isExternalWebHref,\n isRouteRelativeHref,\n resolveHrefAgainstRoute,\n} from '../link/contentful-link.util';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\nimport { richTextRendererError } from './rich-text-renderer.errors';\nimport { ContentfulGqlRichText, mapContentfulGqlLinks } from './rich-text-renderer.gql';\nimport { isRichTextRootNode, translateContentfulNodeTypeToHtmlTag } from './rich-text-renderer.util';\n\ntype HtmlOpenRenderCommand = {\n kind: 'htmlOpen';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n attributes: Record<string, string>;\n tagName: keyof HTMLElementTagNameMap;\n id: string;\n};\n\ntype HtmlCloseRenderCommand = {\n kind: 'htmlClose';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n tagName: keyof HTMLElementTagNameMap;\n id: string;\n};\n\ntype TextRenderCommand = {\n kind: 'text';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n attributes: Record<string, string>;\n markTags: MarkTagName[];\n text: string;\n id: string;\n};\n\ntype ComponentRenderCommand = {\n kind: 'component';\n nestingLevel: number;\n domPosition: number;\n parentId: string | null;\n component: Type<unknown>;\n inputs: Record<string, unknown>;\n entryId?: string;\n id: string;\n};\n\ntype RenderCommand = HtmlOpenRenderCommand | HtmlCloseRenderCommand | TextRenderCommand | ComponentRenderCommand;\n\ntype RenderInstruction = {\n type: 'create' | 'update' | 'move' | 'delete';\n command: RenderCommand;\n};\n\ntype MarkTagName = 'strong' | 'em' | 'u' | 'code' | 's' | 'sub' | 'sup';\n\nconst DEFAULT_ANCHOR_CLASS = 'et-contentful-rich-text-default-element et-contentful-rich-text-default-a';\n\nconst MARK_TAG_MAP: Record<string, MarkTagName> = {\n bold: 'strong',\n italic: 'em',\n underline: 'u',\n code: 'code',\n strikethrough: 's',\n subscript: 'sub',\n superscript: 'sup',\n};\n\n/**\n * Translates contentful text marks into the semantic html elements the marked text is\n * wrapped in, outermost first. Unknown marks are skipped (with a dev-mode warning).\n */\nexport const marksToTags = (marks: Mark[]) => {\n const tags: MarkTagName[] = [];\n\n for (const mark of marks) {\n const tag = MARK_TAG_MAP[mark.type];\n\n if (!tag) {\n if (isDevMode()) {\n console.warn(`No element found for mark type \"${mark.type}\"! The mark is ignored.`, mark);\n }\n\n continue;\n }\n\n tags.push(tag);\n }\n\n return tags;\n};\n\n/**\n * The classes marked text inside a hyperlink is rendered with, since the link component\n * receives its text as a plain string.\n */\nexport const marksToClass = (marks: Mark[]) =>\n marks.map((mark) => `et-contentful-rich-text-mark-${mark.type}`).join(' ');\n\nconst LINK_COMPONENT_TYPE = '$$$_et-link';\n\nconst normalizeHref = (href: string): string | null => {\n if (!href.trim()) {\n return null;\n }\n\n try {\n const url = new URL(href, 'https://contentful.invalid');\n\n return ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'].includes(url.protocol) ? href : null;\n } catch {\n return null;\n }\n};\n\ntype ExecutedCommandCacheItemBase = {\n element: HTMLElement;\n};\n\ntype ExecutedComponentCommandCacheItem = {\n command: ComponentRenderCommand;\n componentRef: ComponentRef<unknown>;\n inputs: WritableSignal<Record<string, unknown>>;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedHtmlCommandCacheItem = {\n command: HtmlOpenRenderCommand | HtmlCloseRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedTextCommandCacheItem = {\n command: TextRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedCommandCacheItem =\n ExecutedComponentCommandCacheItem | ExecutedHtmlCommandCacheItem | ExecutedTextCommandCacheItem;\n\nconst isExecutedComponentCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedComponentCommandCacheItem => {\n return cache.command.kind === 'component';\n};\n\nexport const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';\n\nexport type ContentfulIncludeMap = {\n /**\n * Select an entry by its ID and content type ID.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntry: <T extends { [key: string]: any }>(id: string, contentTypeId: string) => ContentfulEntry<T> | null;\n\n /**\n * Select multiple entries by their IDs and content type ID.\n * If an entry is not found, it will be omitted from the result.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries: <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => ContentfulEntry<T>[];\n\n /**\n * Select an asset by its ID.\n */\n getAsset: (id: string) => ContentfulRestAsset | null;\n\n /**\n * Select multiple assets by their IDs. If an asset is not found, it will be omitted from the result.\n */\n getAssets: (ids: string[]) => ContentfulRestAsset[];\n};\n\ntype IncludeMapLookup = {\n entry: (id: string) => ContentfulEntry | null;\n asset: (id: string) => ContentfulRestAsset | null;\n};\n\nconst includeMapLookups = /* @__PURE__ */ new WeakMap<ContentfulIncludeMap, IncludeMapLookup>();\n\nconst lookupOf = (includes: ContentfulIncludeMap): IncludeMapLookup =>\n includeMapLookups.get(includes) ?? {\n entry: (id) => includes.getEntry(id, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID),\n asset: (id) => includes.getAsset(id),\n };\n\nconst ANCESTOR_ENTRY_IDS = /* @__PURE__ */ new InjectionToken<ReadonlySet<string>>(\n 'ContentfulRichTextAncestorEntryIds',\n);\n\nexport type CreateContentfulIncludeMapConfig = {\n /** The entries that should be present inside the map */\n entries: ContentfulEntry[];\n\n /** The assets that should be present inside the map */\n assets: ContentfulRestAsset[];\n};\n\n/**\n * Create a contentful include map using the provided entries and assets.\n */\nexport const createContentfulIncludeMap = (config: CreateContentfulIncludeMapConfig): ContentfulIncludeMap => {\n const { entries, assets } = config;\n\n const assetMap = new Map(assets.map((asset) => [asset.sys.id, asset]));\n const entryMap = new Map(entries.map((entry) => [entry.sys.id, entry]));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntry = <T extends { [key: string]: any }>(id: string, contentTypeId: string) => {\n const entry = entryMap.get(id);\n\n if (!entry) {\n if (isDevMode()) {\n console.warn(\n 'Entry not found! Will return null. Is it unpublished or deleted, or is the include query param too low?',\n { id },\n );\n }\n\n return null;\n }\n\n if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {\n return entry as ContentfulEntry<T>;\n }\n\n if (entry.sys.contentType.sys.id !== contentTypeId) {\n if (isDevMode()) {\n console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {\n entry,\n sysId: contentTypeId,\n });\n }\n\n return null;\n }\n\n return entry as ContentfulEntry<T>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntries = <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => {\n const entries = ids\n .map((id) => (typeof id === 'string' ? id : id.sys.id))\n .map((id) => getEntry<T>(id, contentTypeId))\n .filter((entry): entry is ContentfulEntry<T> => entry !== null);\n\n return entries;\n };\n\n const getAsset = (id: string) => {\n return assetMap.get(id) ?? null;\n };\n\n const getAssets = (ids: string[]) => {\n return ids.map((id) => getAsset(id)).filter((asset): asset is ContentfulRestAsset => asset !== null);\n };\n\n const includeMap: ContentfulIncludeMap = { getEntry, getEntries, getAsset, getAssets };\n\n includeMapLookups.set(includeMap, {\n entry: (id) => entryMap.get(id) ?? null,\n asset: (id) => assetMap.get(id) ?? null,\n });\n\n return includeMap;\n};\n\nconst warnedRichTextPaths = /* @__PURE__ */ new Set<string>();\n\nconst warnOnUnresolvedParentPath = (content: ContentfulCollection, richTextPath: string) => {\n const segments = richTextPath.split('.');\n const root = content as unknown as Record<string, unknown>;\n\n if (segments.length < 2 || isObject(getObjectProperty(root, segments.slice(0, -1).join('.')))) return;\n if (warnedRichTextPaths.has(richTextPath)) return;\n\n warnedRichTextPaths.add(richTextPath);\n\n let resolvedSegments = 0;\n\n while (\n resolvedSegments < segments.length - 1 &&\n isObject(getObjectProperty(root, segments.slice(0, resolvedSegments + 1).join('.')))\n ) {\n resolvedSegments++;\n }\n\n const resolvedPath = segments.slice(0, resolvedSegments).join('.') || '(the content itself)';\n\n console.warn(\n `<et-contentful-rich-text-renderer>: richTextPath \"${richTextPath}\" does not resolve, so nothing is rendered. The deepest part that resolves is ${resolvedPath}; check the next segment for a typo or a missing item.`,\n { content, richTextPath },\n );\n};\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-rich-text-renderer',\n ngSkipHydration: 'true',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n private viewContainerRef = inject(ViewContainerRef);\n private renderer = injectRenderer();\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private config = injectContentfulConfig();\n private document = inject(DOCUMENT);\n private location = inject(Location);\n private url = injectUrl();\n private injector = inject(Injector);\n\n /**\n * The contentful response gotten via their REST api.\n * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection\n */\n content = input<ContentfulCollection | null | undefined>();\n\n /**\n * The path to where the rich text field is inside the contentful response. Dot and array notation is allowed.\n * @example \"items[0].fields.html\"\n */\n richTextPath = input<string>();\n\n /**\n * A rich-text field from the Contentful GraphQL API, passed as-is. An alternative to `content` and\n * `richTextPath`; setting both is an error in dev mode.\n * @example { json, links: { assets: { block, hyperlink }, entries: { block, inline, hyperlink } } }\n */\n gqlRichText = input<ContentfulGqlRichText | null | undefined>();\n\n /**\n * A bare rich-text document, e.g. a rich-text field of an embedded entry. Pair it with `includes` so its\n * embeds resolve. An alternative to `content` / `richTextPath` and `gqlRichText`.\n * @example <et-contentful-rich-text-renderer [richText]=\"fields().body\" [includes]=\"includes()\" />\n */\n richText = input<RichTextResponse | null | undefined>();\n\n /** The linked entries and assets `richText` resolves its embeds against, e.g. a custom component's `includes`. */\n includes = input<ContentfulIncludeMap | null | undefined>();\n\n private ancestorEntryIds = inject(ANCESTOR_ENTRY_IDS, { optional: true }) ?? new Set<string>();\n\n private readonly executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n private contentIncludesMap = computed<ContentfulIncludeMap>(() => {\n const includes = this.includes();\n\n if (includes) {\n return includes;\n }\n\n const gqlRichText = this.gqlRichText();\n\n if (gqlRichText) {\n return createContentfulIncludeMap(\n mapContentfulGqlLinks(gqlRichText.links, Object.keys(this.config.customComponents)),\n );\n }\n\n const content = this.content();\n const entries = new Map<string, ContentfulEntry>();\n\n for (const entry of [...(content?.items ?? []), ...(content?.includes?.Entry ?? [])]) {\n entries.set(entry.sys.id, entry);\n }\n\n return createContentfulIncludeMap({ assets: content?.includes?.Asset ?? [], entries: [...entries.values()] });\n });\n\n private linkLookup = computed(() => lookupOf(this.contentIncludesMap()));\n\n private richTextData = computed(() => {\n const gqlRichText = this.gqlRichText();\n const content = this.content();\n const richTextPath = this.richTextPath();\n const richText = this.richText();\n\n if (ngDevMode && [gqlRichText, content || richTextPath, richText].filter(Boolean).length > 1) {\n throw richTextRendererError('rich_text_conflicting_inputs', { gqlRichText, content, richTextPath, richText });\n }\n\n if (richText) {\n if (!isRichTextRootNode(richText)) {\n throw richTextRendererError('rich_text_wrong_type', { richText });\n }\n\n return richText;\n }\n\n if (gqlRichText) {\n if (!isRichTextRootNode(gqlRichText.json)) {\n throw richTextRendererError('rich_text_wrong_type', { gqlRichText });\n }\n\n return gqlRichText.json;\n }\n\n if (!content) {\n return null;\n }\n\n if (!richTextPath) {\n if (ngDevMode) {\n console.warn(\n '<et-contentful-rich-text-renderer>: content is set without richTextPath, so nothing is rendered. Set richTextPath, or pass a GraphQL field through gqlRichText.',\n );\n }\n\n return null;\n }\n\n const pathValue = getObjectProperty(content as unknown as Record<string, unknown>, richTextPath);\n\n if (pathValue === null || pathValue === undefined) {\n if (ngDevMode && pathValue === undefined) {\n warnOnUnresolvedParentPath(content, richTextPath);\n }\n\n return null;\n }\n\n if (!isObject(pathValue)) {\n throw richTextRendererError('rich_text_not_object', { content, richTextPath, type: typeof pathValue });\n }\n\n if (!isRichTextRootNode(pathValue)) {\n throw richTextRendererError('rich_text_wrong_type', { content, richTextPath });\n }\n\n return pathValue as RichTextResponse;\n });\n\n private renderCommands = computed(() => {\n const richTextData = this.richTextData();\n\n if (!richTextData) {\n return [];\n }\n\n return this.createRenderCommands(richTextData);\n });\n\n private renderInstructions = computed(() => {\n const commands = this.renderCommands();\n const previousRenderCommandMap = new Map(\n [...this.executedCommandsCache.entries()].map(([id, item]) => [id, item.command]),\n );\n\n const instructions: RenderInstruction[] = [];\n\n const preserved = new Set<string>();\n const needsReattach = new Set<string>();\n\n const markTagsEqual = (a: MarkTagName[], b: MarkTagName[]) =>\n a.length === b.length && a.every((tag, index) => tag === b[index]);\n\n const attributesEqual = (a: Record<string, string>, b: Record<string, string>) => {\n const aKeys = Object.keys(a);\n\n return aKeys.length === Object.keys(b).length && aKeys.every((key) => a[key] === b[key]);\n };\n\n for (const command of commands) {\n if (command.kind === 'htmlClose') {\n continue;\n }\n\n const previous = previousRenderCommandMap.get(command.id);\n\n if (!previous || previous.kind !== command.kind) {\n continue;\n }\n\n if (previous.kind === 'component' && command.kind === 'component' && previous.component !== command.component) {\n continue;\n }\n\n const parentPreserved =\n previous.parentId === command.parentId && (command.parentId === null || preserved.has(command.parentId));\n\n if (command.kind === 'component') {\n preserved.add(command.id);\n\n const samePlace =\n parentPreserved &&\n previous.nestingLevel === command.nestingLevel &&\n previous.domPosition === command.domPosition;\n\n if (!samePlace) {\n needsReattach.add(command.id);\n }\n\n continue;\n }\n\n const sameOutput =\n previous.kind === command.kind &&\n (previous.kind !== 'htmlOpen' || previous.tagName === (command as HtmlOpenRenderCommand).tagName) &&\n (previous.kind !== 'text' ||\n (previous.text === (command as TextRenderCommand).text &&\n markTagsEqual(previous.markTags, (command as TextRenderCommand).markTags)));\n\n if (\n parentPreserved &&\n sameOutput &&\n previous.nestingLevel === command.nestingLevel &&\n previous.domPosition === command.domPosition &&\n attributesEqual(previous.attributes, command.attributes)\n ) {\n preserved.add(command.id);\n }\n }\n\n for (const [id, command] of previousRenderCommandMap) {\n if (command.kind !== 'htmlClose' && !preserved.has(id)) {\n instructions.push({ type: 'delete', command });\n }\n }\n\n for (const command of commands) {\n if (command.kind === 'htmlClose') {\n continue;\n }\n\n if (!preserved.has(command.id)) {\n instructions.push({ type: 'create', command });\n } else if (command.kind === 'component' && needsReattach.has(command.id)) {\n instructions.push({ type: 'move', command });\n } else {\n instructions.push({ type: 'update', command });\n }\n }\n\n return instructions;\n });\n\n constructor() {\n effect(() => {\n const instructions = this.renderInstructions();\n\n untracked(() => this.execInstructions(instructions));\n });\n }\n\n private createRenderCommands(richTextData: RichTextResponse) {\n const rootCommands: RenderCommand[] = [];\n let elementOpenId = 0;\n let elementCloseId = 0;\n const componentIdMap = new Map<string, number>();\n let nestingLevel = 0;\n let domPosition = 0;\n\n let textId = 0;\n\n const openElementIds: string[] = [];\n\n const traverse = (node: Block | Inline | Text) => {\n switch (node.nodeType) {\n case 'text': {\n const text = node.value;\n\n if (!text) break;\n\n const attributes: Record<string, string> = {\n class: 'et-contentful-rich-text-default-element et-contentful-rich-text-default-span',\n };\n\n rootCommands.push({\n kind: 'text',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n markTags: node.marks.length ? marksToTags(node.marks) : [],\n text,\n id: 't' + textId++,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_BLOCKS.EMBEDDED_ASSET: {\n const assetId = node.data['target']?.sys?.id;\n\n if (!assetId) {\n throw richTextRendererError('asset_id_not_found', { node });\n }\n\n const asset = this.linkLookup().asset(assetId);\n\n if (!asset) {\n if (isDevMode()) {\n console.warn(\n 'Embedded asset is missing from the includes! The asset will be skipped. Is it unpublished or deleted?',\n { assetId, node },\n );\n }\n\n break;\n }\n\n const contentType = asset.fields.file?.contentType;\n const assetComponents = this.config.components;\n\n if (!asset.fields.file?.url) {\n if (isDevMode()) {\n console.warn(\n 'Asset is missing file data! Asset will be skipped. Did you forget to upload a file for the current translation in Contentful?',\n { asset },\n );\n }\n\n break;\n }\n\n const isImage = contentType?.startsWith('image/');\n const isVideo = contentType?.startsWith('video/');\n const isAudio = contentType?.startsWith('audio/');\n\n const component = isImage\n ? assetComponents.image\n : isVideo\n ? assetComponents.video\n : isAudio\n ? assetComponents.audio\n : assetComponents.file;\n\n if (!component) {\n if (isDevMode()) {\n console.warn(\n 'No component registered for this embedded asset! The asset will be skipped. Provide one via provideContentfulConfig({ components: … }).',\n { asset },\n );\n }\n\n break;\n }\n\n const occurrenceKey = 'asset:' + assetId;\n const occurrence = (componentIdMap.get(occurrenceKey) ?? -1) + 1;\n componentIdMap.set(occurrenceKey, occurrence);\n const id = occurrence === 0 ? occurrenceKey : `${occurrenceKey}:${occurrence}`;\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component,\n inputs: { asset },\n id,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_INLINES.HYPERLINK:\n case CF_INLINES.ASSET_HYPERLINK:\n case CF_INLINES.ENTRY_HYPERLINK: {\n let href: string | null = null;\n\n if (node.nodeType === CF_INLINES.HYPERLINK) {\n href = normalizeHref((node.data['uri'] as string) ?? '');\n } else if (node.nodeType === CF_INLINES.ASSET_HYPERLINK) {\n const assetId = node.data['target']?.sys?.id;\n const asset = assetId ? this.linkLookup().asset(assetId) : null;\n const url = asset?.fields.file?.url;\n href = url ? normalizeHref(url) : null;\n } else if (this.config.entryHref) {\n const entryId = node.data['target']?.sys?.id;\n const entry = entryId ? this.linkLookup().entry(entryId) : null;\n const entryHref = entry ? this.config.entryHref(entry) : null;\n href = entryHref ? normalizeHref(entryHref) : null;\n }\n\n const linkTexts = node.content.filter(\n (child): child is Text => child.nodeType === 'text' && Boolean(child.value),\n );\n if (!linkTexts.length) {\n break;\n }\n\n const linkText = linkTexts.map((child) => child.value).join('');\n const linkComponent = href ? this.config.components.link : null;\n\n if (href && !linkComponent) {\n const webUrlContext = { location: this.document.location, internalHosts: this.config.internalHosts };\n const internalPath = internalWebHrefPath(href, webUrlContext);\n const anchorHref =\n internalPath !== null\n ? this.location.prepareExternalUrl(internalPath)\n : isRouteRelativeHref(href)\n ? this.location.prepareExternalUrl(resolveHrefAgainstRoute(href, this.url()))\n : href;\n const attributes: Record<string, string> = { class: DEFAULT_ANCHOR_CLASS, href: anchorHref };\n\n if (isExternalWebHref(href, webUrlContext)) {\n attributes['target'] = '_blank';\n attributes['rel'] = 'noopener noreferrer';\n }\n\n rootCommands.push({\n kind: 'htmlOpen',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n tagName: 'a',\n id: 'e-o' + elementOpenId++,\n });\n\n const anchorDomPosition = domPosition;\n\n openElementIds.push('e-o' + (elementOpenId - 1));\n nestingLevel++;\n domPosition = 0;\n\n for (const child of linkTexts) {\n traverse(child);\n }\n\n openElementIds.pop();\n nestingLevel--;\n domPosition = anchorDomPosition;\n\n rootCommands.push({\n kind: 'htmlClose',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n tagName: 'a',\n id: 'e-c' + elementCloseId++,\n });\n\n domPosition++;\n\n break;\n }\n\n if (!href) {\n for (const child of linkTexts) {\n traverse(child);\n }\n\n break;\n }\n\n if (!linkComponent) {\n break;\n }\n\n const sharedMarks =\n linkTexts[0]?.marks.filter((mark) =>\n linkTexts.every((child) => child.marks.some((other) => other.type === mark.type)),\n ) ?? [];\n\n let linkComponentId = componentIdMap.get(LINK_COMPONENT_TYPE) ?? -1;\n const linkId = LINK_COMPONENT_TYPE + ++linkComponentId;\n componentIdMap.set(LINK_COMPONENT_TYPE, linkComponentId);\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component: linkComponent,\n inputs: { href, text: linkText, marks: sharedMarks.map((mark) => mark.type), richText: true },\n id: linkId,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_BLOCKS.EMBEDDED_ENTRY:\n case CF_INLINES.EMBEDDED_ENTRY: {\n const entryId = node.data['target']?.sys?.id;\n\n if (!entryId) {\n throw richTextRendererError('entry_id_not_found', { node });\n }\n\n if (this.ancestorEntryIds.has(entryId)) {\n if (isDevMode()) {\n console.warn(\n 'Embedded entry embeds itself through its own rich text! The nested occurrence is skipped to stop the cycle.',\n { entryId, node },\n );\n }\n\n break;\n }\n\n const entry = this.linkLookup().entry(entryId);\n\n if (!entry) {\n if (isDevMode()) {\n console.warn(\n 'Embedded entry is missing from the includes! The entry will be skipped. Is it unpublished or deleted, or is the include query param too low?',\n { entryId, node },\n );\n }\n\n break;\n }\n\n const componentType = entry.sys.contentType.sys.id;\n\n const component = this.config.customComponents[componentType];\n\n if (!component) {\n if (isDevMode()) {\n console.warn(\n 'No custom component registered for this embedded entry type! The entry will be skipped. Provide one via provideContentfulConfig({ customComponents: … }).',\n { componentType, customComponents: this.config.customComponents, entry },\n );\n }\n\n break;\n }\n\n const occurrenceKey = 'entry:' + entryId;\n const occurrence = (componentIdMap.get(occurrenceKey) ?? -1) + 1;\n componentIdMap.set(occurrenceKey, occurrence);\n const id = occurrence === 0 ? occurrenceKey : `${occurrenceKey}:${occurrence}`;\n\n rootCommands.push({\n kind: 'component',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n component,\n inputs: {\n fields: entry.fields,\n metadata: entry.metadata,\n sys: entry.sys,\n includes: this.contentIncludesMap(),\n },\n entryId,\n id,\n });\n\n domPosition++;\n\n break;\n }\n\n case CF_BLOCKS.EMBEDDED_RESOURCE:\n case CF_INLINES.EMBEDDED_RESOURCE: {\n if (isDevMode()) {\n console.warn(`Rich text node type \"${node.nodeType}\" is not supported and is skipped.`, {\n urn: node.data['target']?.sys?.urn,\n node,\n });\n }\n\n break;\n }\n\n default: {\n const tag = translateContentfulNodeTypeToHtmlTag(node.nodeType);\n const attributes: Record<string, string> = {\n class: `et-contentful-rich-text-default-element et-contentful-rich-text-default-${tag}`,\n };\n\n rootCommands.push({\n kind: 'htmlOpen',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n attributes,\n tagName: tag,\n id: 'e-o' + elementOpenId++,\n });\n\n const domPositionAtThisLevel = domPosition;\n openElementIds.push('e-o' + (elementOpenId - 1));\n nestingLevel++;\n domPosition = 0;\n\n for (const child of node.content) {\n traverse(child);\n }\n\n openElementIds.pop();\n nestingLevel--;\n domPosition = domPositionAtThisLevel;\n\n const lastCommand = rootCommands[rootCommands.length - 1];\n\n if (\n lastCommand?.kind === 'htmlOpen' &&\n lastCommand.tagName !== 'td' &&\n lastCommand.tagName !== 'th' &&\n lastCommand.tagName !== 'hr'\n ) {\n rootCommands.pop();\n elementOpenId--;\n } else {\n rootCommands.push({\n kind: 'htmlClose',\n nestingLevel,\n domPosition,\n parentId: openElementIds.at(-1) ?? null,\n tagName: tag,\n id: 'e-c' + elementCloseId++,\n });\n\n domPosition++;\n }\n\n break;\n }\n }\n };\n\n for (const node of richTextData.content) {\n traverse(node);\n }\n\n return rootCommands;\n }\n\n private execInstructions(instructions: RenderInstruction[]) {\n const lastPlacedChild = new Map<string | null, HTMLElement>();\n\n for (const { type, command } of instructions) {\n if (type === 'delete') {\n this.runDeleteInstruction(command);\n\n continue;\n }\n\n const previousSibling = lastPlacedChild.get(command.parentId) ?? null;\n\n switch (type) {\n case 'create':\n this.runCreateInstruction(command, previousSibling);\n break;\n case 'update':\n this.runUpdateInstruction(command);\n break;\n case 'move':\n this.runMoveInstruction(command, previousSibling);\n break;\n }\n\n const element = this.executedCommandsCache.get(command.id)?.element;\n\n if (element) {\n lastPlacedChild.set(command.parentId, element);\n }\n }\n }\n\n private runCreateInstruction(command: RenderCommand, previousSibling: HTMLElement | null) {\n const parentElement = this.findParent(command);\n\n if (command.kind === 'component') {\n const inputs = signal(command.inputs);\n\n const declaredInputs = reflectComponentType(command.component)?.inputs ?? [];\n const bindings = declaredInputs\n .filter((declared) => declared.propName in command.inputs)\n .map((declared) => inputBinding(declared.templateName, () => inputs()[declared.propName]));\n\n const injector = command.entryId\n ? Injector.create({\n providers: [\n { provide: ANCESTOR_ENTRY_IDS, useValue: new Set([...this.ancestorEntryIds, command.entryId]) },\n ],\n parent: this.injector,\n })\n : undefined;\n\n const componentRef = this.viewContainerRef.createComponent(command.component, { bindings, injector });\n\n const rootNode = this.getComponentRootNode(componentRef);\n\n this.renderInsertAfter(rootNode, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n componentRef,\n inputs,\n element: rootNode,\n });\n } else if (command.kind === 'text') {\n const span = this.renderer.createElement('span');\n const textSplitInLineBreaks = command.text.split('\\n');\n\n for (const [key, value] of Object.entries(command.attributes)) {\n this.renderer.setAttribute(span, key, value);\n }\n\n let textContainer = span;\n\n for (const tag of command.markTags) {\n const markElement = this.renderer.createElement(tag);\n\n this.renderer.appendChild(textContainer, markElement);\n textContainer = markElement;\n }\n\n for (const [textPartIndex, textPart] of textSplitInLineBreaks.entries()) {\n if (textPartIndex > 0) {\n const brNode = this.renderer.createElement('br');\n this.renderer.appendChild(textContainer, brNode);\n }\n\n if (textPart) {\n const textNode = this.renderer.createText(textPart);\n\n this.renderer.appendChild(textContainer, textNode);\n }\n }\n\n this.renderInsertAfter(span, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n element: span,\n });\n } else if (command.kind === 'htmlOpen') {\n const element = this.renderer.createElement(command.tagName);\n\n for (const [key, value] of Object.entries(command.attributes)) {\n this.renderer.setAttribute(element, key, value);\n }\n\n this.renderInsertAfter(element, { parentElement, previousSibling });\n\n this.executedCommandsCache.set(command.id, {\n command,\n element,\n });\n }\n }\n\n private runUpdateInstruction(command: RenderCommand) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n cached.inputs.set(command.inputs);\n }\n\n this.executedCommandsCache.set(command.id, {\n ...cached,\n command,\n } as ExecutedCommandCacheItem);\n }\n\n private runMoveInstruction(command: RenderCommand, previousSibling: HTMLElement | null) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n const rootNode = cached.element;\n const oldParentElement = cached.element.parentElement;\n\n if (oldParentElement) {\n this.renderer.removeChild(oldParentElement, rootNode);\n }\n\n this.renderInsertAfter(rootNode, { parentElement: this.findParent(command), previousSibling });\n\n cached.inputs.set(command.inputs);\n\n this.executedCommandsCache.set(command.id, {\n ...cached,\n command,\n } as ExecutedCommandCacheItem);\n }\n }\n\n private runDeleteInstruction(command: RenderCommand) {\n const cached = this.executedCommandsCache.get(command.id);\n\n if (!cached) {\n if (command.kind === 'htmlClose') {\n return;\n }\n\n throw richTextRendererError('cached_command_not_found', { command });\n }\n\n if (command.kind === 'component') {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw richTextRendererError('cached_command_not_component', { command });\n }\n\n cached.componentRef.destroy();\n } else if (command.kind === 'text' || command.kind === 'htmlOpen') {\n if (cached.element.parentElement) {\n this.renderer.removeChild(cached.element.parentElement, cached.element);\n }\n }\n\n this.executedCommandsCache.delete(command.id);\n }\n\n private getComponentRootNode(componentRef: ComponentRef<unknown>): HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\n }\n\n private findParent(command: RenderCommand) {\n if (command.parentId === null) {\n return this.elementRef.nativeElement;\n }\n\n const parentElement = this.executedCommandsCache.get(command.parentId)?.element;\n\n if (!parentElement) {\n throw richTextRendererError('text_parent_not_found', { command });\n }\n\n return parentElement;\n }\n\n private renderInsertAfter(\n node: HTMLElement,\n { parentElement, previousSibling }: { parentElement: HTMLElement; previousSibling: HTMLElement | null },\n ) {\n this.renderer.insertBefore(\n parentElement,\n node,\n previousSibling ? previousSibling.nextSibling : parentElement.firstChild,\n );\n }\n}\n","import { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { ContentfulGqlAsset, isContentfulGqlAsset } from '../../gql';\nimport { ContentfulRestAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n @if (data(); as data) {\n <video class=\"et-contentful-video-video\" controls>\n <source [src]=\"data.url\" [attr.type]=\"data.contentType || null\" class=\"et-contentful-video-source\" />\n </video>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'et-contentful-video',\n },\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n\n protected data = computed(() => {\n const asset = this.asset();\n\n if (!asset) {\n return null;\n }\n\n if (isContentfulGqlAsset(asset) && asset.url) {\n return {\n url: asset.url,\n contentType: asset.contentType,\n };\n }\n\n if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {\n return {\n url: asset.fields.file.url,\n contentType: asset.fields.file.contentType,\n };\n }\n\n return null;\n });\n}\n","import { ContentfulAudioComponent } from './components/audio';\nimport { ContentfulFileComponent } from './components/file';\nimport { ContentfulImageComponent } from './components/image';\nimport { ContentfulRichTextRendererComponent } from './components/rich-text-renderer';\nimport { ContentfulVideoComponent } from './components/video';\n\nexport const ContentfulImports = [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n] as const;\n","import { ContentfulAudioComponent } from '../components/audio';\nimport { ContentfulFileComponent } from '../components/file';\nimport { ContentfulImageComponent } from '../components/image';\nimport { ContentfulLinkComponent } from '../components/link';\nimport { ContentfulVideoComponent } from '../components/video';\nimport { ContentfulConfig } from '../types';\n\n/**\n * The shipped audio, file, image, video and link components, to spread into `provideContentfulConfig`.\n * An app that brings its own components, or renders text only, leaves this out and bundles none of them.\n * To replace one, spread the map instead: `components: { ...CONTENTFUL_DEFAULT_COMPONENTS.components, image: MyImage }`.\n *\n * @example\n * provideContentfulConfig({ ...CONTENTFUL_DEFAULT_COMPONENTS });\n */\nexport const CONTENTFUL_DEFAULT_COMPONENTS = {\n components: {\n audio: ContentfulAudioComponent,\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n link: ContentfulLinkComponent,\n },\n} satisfies Partial<ContentfulConfig>;\n","import { Provider } from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfigOptions, ContentfulEntry } from '../types';\nimport { createContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig?: ContentfulConfigOptions | null): Provider => {\n return { provide: CONTENTFUL_CONFIG, useValue: createContentfulConfig(contentfulConfig) };\n};\n\nexport const isContentfulEntryType = <T extends ContentfulEntry>(entry: ContentfulEntry, type: string): entry is T =>\n entry.sys.contentType.sys.id === type;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/contentful",
3
- "version": "4.0.0-next.13",
3
+ "version": "4.0.0-next.14",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
@@ -115,11 +115,11 @@ type ContentfulGqlRichText = {
115
115
  };
116
116
  /**
117
117
  * Maps the `links` of a GraphQL rich-text field to the entries and assets the renderer resolves
118
- * embeds against. An entry's content type id is its `__typename` with the first letter lower-cased,
119
- * which is how Contentful derives a GraphQL type name from a content type id. Entries without a
120
- * `__typename` are dropped.
118
+ * embeds against. An entry's content type id is the id in `contentTypeIds` whose GraphQL type name
119
+ * (PascalCase, separators dropped: `product-teaser` → `ProductTeaser`) equals its `__typename`, else the
120
+ * `__typename` with the first letter lower-cased. Entries without a `__typename` are dropped.
121
121
  */
122
- declare const mapContentfulGqlLinks: (links: ContentfulGqlRichText["links"]) => {
122
+ declare const mapContentfulGqlLinks: (links: ContentfulGqlRichText["links"], contentTypeIds?: readonly string[]) => {
123
123
  assets: ContentfulRestAsset[];
124
124
  entries: ContentfulEntry[];
125
125
  };
@@ -187,6 +187,7 @@ declare class ContentfulRichTextRendererComponent {
187
187
  private document;
188
188
  private location;
189
189
  private url;
190
+ private injector;
190
191
  /**
191
192
  * The contentful response gotten via their REST api.
192
193
  * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection
@@ -203,10 +204,18 @@ declare class ContentfulRichTextRendererComponent {
203
204
  * @example { json, links: { assets: { block, hyperlink }, entries: { block, inline, hyperlink } } }
204
205
  */
205
206
  gqlRichText: _angular_core.InputSignal<ContentfulGqlRichText | null | undefined>;
207
+ /**
208
+ * A bare rich-text document, e.g. a rich-text field of an embedded entry. Pair it with `includes` so its
209
+ * embeds resolve. An alternative to `content` / `richTextPath` and `gqlRichText`.
210
+ * @example <et-contentful-rich-text-renderer [richText]="fields().body" [includes]="includes()" />
211
+ */
212
+ richText: _angular_core.InputSignal<RichTextResponse | null | undefined>;
213
+ /** The linked entries and assets `richText` resolves its embeds against, e.g. a custom component's `includes`. */
214
+ includes: _angular_core.InputSignal<ContentfulIncludeMap | null | undefined>;
215
+ private ancestorEntryIds;
206
216
  private readonly executedCommandsCache;
207
- private includes;
208
217
  private contentIncludesMap;
209
- private includedEntries;
218
+ private linkLookup;
210
219
  private richTextData;
211
220
  private renderCommands;
212
221
  private renderInstructions;
@@ -221,7 +230,7 @@ declare class ContentfulRichTextRendererComponent {
221
230
  private findParent;
222
231
  private renderInsertAfter;
223
232
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentfulRichTextRendererComponent, never>;
224
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentfulRichTextRendererComponent, "et-contentful-rich-text-renderer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "richTextPath": { "alias": "richTextPath"; "required": false; "isSignal": true; }; "gqlRichText": { "alias": "gqlRichText"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
233
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentfulRichTextRendererComponent, "et-contentful-rich-text-renderer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "richTextPath": { "alias": "richTextPath"; "required": false; "isSignal": true; }; "gqlRichText": { "alias": "gqlRichText"; "required": false; "isSignal": true; }; "richText": { "alias": "richText"; "required": false; "isSignal": true; }; "includes": { "alias": "includes"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
225
234
  }
226
235
 
227
236
  declare const isRichTextRootNode: (node: unknown) => node is RichTextResponse;
@@ -267,14 +276,21 @@ type ContentfulConfig = {
267
276
  */
268
277
  customComponents: Record<string, ComponentLikeWithContentfulRendererInputs>;
269
278
  /**
270
- * Additional hostnames that should be treated as internal links (in addition to the current page's host).
279
+ * Additional hosts that should be treated as internal links (in addition to the current page's host).
271
280
  * Useful when the app runs on localhost during development but Contentful content references the production domain.
272
- * A configured hostname also covers its subdomains, so adding "example.com" treats
273
- * "foo.example.com" as internal without matching unrelated public-suffix siblings.
281
+ * A host matches exactly, so a subdomain needs its own entry; `'*.example.com'` matches every subdomain of
282
+ * `example.com` (but not `example.com` itself).
274
283
  *
275
- * @example ['example.com']
284
+ * @example ['example.com', '*.example.com']
276
285
  */
277
286
  internalHosts: string[];
287
+ /**
288
+ * Turns the entry an `entry-hyperlink` points at into an href. Return `null` to render the link text without a link.
289
+ * Without it, entry hyperlinks render as text.
290
+ *
291
+ * @example (entry) => (entry.sys.contentType.sys.id === 'page' ? `/${entry.fields.slug}` : null)
292
+ */
293
+ entryHref: ((entry: ContentfulEntry) => string | null) | null;
278
294
  /**
279
295
  * Default options for the contentful image api
280
296
  */