@ethlete/contentful 4.0.0-next.11 → 4.0.0-next.12

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.12
4
+
5
+ ### Major Changes
6
+
7
+ - Breaking: `provideContentfulConfig` no longer registers the asset and link components; spread `CONTENTFUL_DEFAULT_COMPONENTS` into it to keep them. `et update` migrates existing calls.
8
+
3
9
  ## 4.0.0-next.11
4
10
 
5
11
  ### Major Changes
package/README.md CHANGED
@@ -13,7 +13,12 @@ yarn add @ethlete/contentful
13
13
  ```ts
14
14
  @Component({
15
15
  imports: [ContentfulRichTextRendererComponent],
16
- providers: [provideContentfulConfig({ customComponents: { newsElement: NewsElementComponent } })],
16
+ providers: [
17
+ provideContentfulConfig({
18
+ ...CONTENTFUL_DEFAULT_COMPONENTS,
19
+ customComponents: { newsElement: NewsElementComponent },
20
+ }),
21
+ ],
17
22
  template: `<et-contentful-rich-text-renderer [content]="data()" richTextPath="items[0].fields.html" />`,
18
23
  })
19
24
  export class NewsArticleComponent {}
@@ -1,6 +1,6 @@
1
1
  import { NgClass, DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, computed, ViewEncapsulation, Component, inject, InjectionToken, numberAttribute, booleanAttribute, isDevMode, ViewContainerRef, ElementRef, effect, untracked, signal, reflectComponentType, inputBinding } from '@angular/core';
3
+ import { input, computed, ViewEncapsulation, Component, InjectionToken, inject, numberAttribute, booleanAttribute, isDevMode, ViewContainerRef, ElementRef, effect, untracked, signal, reflectComponentType, inputBinding } from '@angular/core';
4
4
  import { formatFileSize, normalizePictureSizes, PictureComponent } from '@ethlete/components';
5
5
  import { defineLabels, toProvideFn, toInjectFn, toToken, injectUrl, RuntimeError, isObject, injectRenderer, getObjectProperty } from '@ethlete/core';
6
6
  import { Router, RouterLink } from '@angular/router';
@@ -166,172 +166,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
166
166
  }]
167
167
  }], propDecorators: { asset: [{ type: i0.Input, args: [{ isSignal: true, alias: "asset", required: true }] }], fileClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileClass", required: false }] }] } });
168
168
 
169
- const parseWebUrl = (href) => {
170
- if (!/^(?:https?:)?\/\//i.test(href)) {
171
- return null;
172
- }
173
- try {
174
- return new URL(href.startsWith('//') ? 'https:' + href : href);
175
- }
176
- catch {
177
- return null;
178
- }
179
- };
180
- const normalizeHostname = (host) => {
181
- const value = host.trim().toLowerCase();
182
- try {
183
- return new URL(value.includes('://') ? value : 'https://' + value).hostname;
184
- }
185
- catch {
186
- return value.split(':')[0] ?? value;
187
- }
188
- };
189
- const matchesHostname = (hostname, configuredHost) => {
190
- const normalizedHost = normalizeHostname(configuredHost);
191
- return hostname === normalizedHost || hostname.endsWith('.' + normalizedHost);
192
- };
193
- const isInternalWebUrl = (url, { location, internalHosts }) => (url.hostname === location.hostname && url.port === location.port) ||
194
- internalHosts.some((host) => matchesHostname(url.hostname, host));
195
- const isExternalWebHref = (href, context) => {
196
- const url = parseWebUrl(href);
197
- return url !== null && !isInternalWebUrl(url, context);
198
- };
199
-
200
- class ContentfulLinkComponent {
201
- constructor() {
202
- this.document = inject(DOCUMENT);
203
- this.router = inject(Router);
204
- this.config = injectContentfulConfig();
205
- this.url = injectUrl();
206
- this.href = input.required(/* @ts-ignore */
207
- ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
208
- this.text = input.required(/* @ts-ignore */
209
- ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
210
- this.textClass = input('', /* @ts-ignore */
211
- ...(ngDevMode ? [{ debugName: "textClass" }] : /* istanbul ignore next */ []));
212
- this.anchorClass = input('', /* @ts-ignore */
213
- ...(ngDevMode ? [{ debugName: "anchorClass" }] : /* istanbul ignore next */ []));
214
- this.usesRouterLink = computed(() => {
215
- const href = this.href();
216
- const absoluteUrl = parseWebUrl(href);
217
- if (absoluteUrl) {
218
- return isInternalWebUrl(absoluteUrl, {
219
- location: this.document.location,
220
- internalHosts: this.config.internalHosts,
221
- });
222
- }
223
- return !href.startsWith('#') && !/^[a-z][a-z\d+.-]*:/i.test(href);
224
- }, /* @ts-ignore */
225
- ...(ngDevMode ? [{ debugName: "usesRouterLink" }] : /* istanbul ignore next */ []));
226
- this.openInNewTab = computed(() => Boolean(parseWebUrl(this.href())) && !this.usesRouterLink(), /* @ts-ignore */
227
- ...(ngDevMode ? [{ debugName: "openInNewTab" }] : /* istanbul ignore next */ []));
228
- this.internalPath = computed(() => {
229
- const href = this.href();
230
- const url = parseWebUrl(href);
231
- if (url) {
232
- return url.pathname + url.search + url.hash;
233
- }
234
- if (href.startsWith('/')) {
235
- return href;
236
- }
237
- const resolved = new URL(href, 'https://contentful.invalid' + this.url());
238
- return resolved.pathname + resolved.search + resolved.hash;
239
- }, /* @ts-ignore */
240
- ...(ngDevMode ? [{ debugName: "internalPath" }] : /* istanbul ignore next */ []));
241
- this.internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()), /* @ts-ignore */
242
- ...(ngDevMode ? [{ debugName: "internalUrlTree" }] : /* istanbul ignore next */ []));
243
- this.linkClass = computed(() => [this.anchorClass(), this.textClass()].filter(Boolean).join(' ') || null, /* @ts-ignore */
244
- ...(ngDevMode ? [{ debugName: "linkClass" }] : /* istanbul ignore next */ []));
245
- }
246
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
247
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ContentfulLinkComponent, isStandalone: true, selector: "et-contentful-link", inputs: { href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: true, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, textClass: { classPropertyName: "textClass", publicName: "textClass", isSignal: true, isRequired: false, transformFunction: null }, anchorClass: { classPropertyName: "anchorClass", publicName: "anchorClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-link" }, ngImport: i0, template: `
248
- @if (usesRouterLink()) {
249
- <a [class]="linkClass()" [routerLink]="internalUrlTree()">{{ text() }}</a>
250
- } @else {
251
- <a
252
- [class]="linkClass()"
253
- [href]="href()"
254
- [target]="openInNewTab() ? '_blank' : null"
255
- [rel]="openInNewTab() ? 'noopener noreferrer' : null"
256
- >{{ text() }}</a
257
- >
258
- }
259
- `, isInline: true, styles: ["@layer components{.et-contentful-link{display:contents}}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
260
- }
261
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulLinkComponent, decorators: [{
262
- type: Component,
263
- args: [{ selector: 'et-contentful-link', template: `
264
- @if (usesRouterLink()) {
265
- <a [class]="linkClass()" [routerLink]="internalUrlTree()">{{ text() }}</a>
266
- } @else {
267
- <a
268
- [class]="linkClass()"
269
- [href]="href()"
270
- [target]="openInNewTab() ? '_blank' : null"
271
- [rel]="openInNewTab() ? 'noopener noreferrer' : null"
272
- >{{ text() }}</a
273
- >
274
- }
275
- `, encapsulation: ViewEncapsulation.None, imports: [RouterLink], host: {
276
- class: 'et-contentful-link',
277
- }, styles: ["@layer components{.et-contentful-link{display:contents}}\n"] }]
278
- }], propDecorators: { href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], textClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "textClass", required: false }] }], anchorClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchorClass", required: false }] }] } });
279
-
280
- class ContentfulVideoComponent {
281
- constructor() {
282
- this.asset = input.required(/* @ts-ignore */
283
- ...(ngDevMode ? [{ debugName: "asset" }] : /* istanbul ignore next */ []));
284
- this.videoClass = input(null, /* @ts-ignore */
285
- ...(ngDevMode ? [{ debugName: "videoClass" }] : /* istanbul ignore next */ []));
286
- this.data = computed(() => {
287
- const asset = this.asset();
288
- if (!asset) {
289
- return null;
290
- }
291
- if (isContentfulGqlAsset(asset) && asset.url) {
292
- return {
293
- url: asset.url,
294
- contentType: asset.contentType,
295
- };
296
- }
297
- if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {
298
- return {
299
- url: asset.fields.file.url,
300
- contentType: asset.fields.file.contentType,
301
- };
302
- }
303
- return null;
304
- }, /* @ts-ignore */
305
- ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
306
- }
307
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
308
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ContentfulVideoComponent, isStandalone: true, selector: "et-contentful-video", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, videoClass: { classPropertyName: "videoClass", publicName: "videoClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-video" }, ngImport: i0, template: `
309
- @if (data(); as data) {
310
- <video [ngClass]="videoClass()" controls>
311
- <source [src]="data.url" [type]="data.contentType" />
312
- </video>
313
- }
314
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
315
- }
316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulVideoComponent, decorators: [{
317
- type: Component,
318
- args: [{
319
- selector: 'et-contentful-video',
320
- template: `
321
- @if (data(); as data) {
322
- <video [ngClass]="videoClass()" controls>
323
- <source [src]="data.url" [type]="data.contentType" />
324
- </video>
325
- }
326
- `,
327
- encapsulation: ViewEncapsulation.None,
328
- imports: [NgClass],
329
- host: {
330
- class: 'et-contentful-video',
331
- },
332
- }]
333
- }], propDecorators: { asset: [{ type: i0.Input, args: [{ isSignal: true, alias: "asset", required: true }] }], videoClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoClass", required: false }] }] } });
334
-
335
169
  const CONTENTFUL_CONFIG = new InjectionToken('ContentfulConfig');
336
170
 
337
171
  /**
@@ -349,28 +183,13 @@ const CONTENTFUL_FALLBACK_CONFIG = {
349
183
  backgroundColor: null,
350
184
  },
351
185
  };
352
- const createContentfulConfig = (config) => {
353
- const defaults = {
354
- internalHosts: [],
355
- components: {
356
- audio: ContentfulAudioComponent,
357
- file: ContentfulFileComponent,
358
- image: ContentfulImageComponent,
359
- video: ContentfulVideoComponent,
360
- link: ContentfulLinkComponent,
361
- },
362
- customComponents: {},
363
- imageOptions: {
364
- srcsetSizes: ['375w', '1280w', '1920w', '2560w'],
365
- sizes: ['100vw'],
366
- backgroundColor: null,
367
- },
368
- };
186
+ const createContentfulConfig = (options) => {
187
+ const config = options ?? {};
369
188
  return {
370
- ...defaults,
189
+ ...CONTENTFUL_FALLBACK_CONFIG,
371
190
  ...config,
372
- components: { ...defaults.components, ...config?.components },
373
- imageOptions: { ...defaults.imageOptions, ...config?.imageOptions },
191
+ components: config.components ?? CONTENTFUL_FALLBACK_CONFIG.components,
192
+ imageOptions: { ...CONTENTFUL_FALLBACK_CONFIG.imageOptions, ...config.imageOptions },
374
193
  };
375
194
  };
376
195
  /**
@@ -584,6 +403,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
584
403
  }]
585
404
  }], propDecorators: { asset: [{ type: i0.Input, args: [{ isSignal: true, alias: "asset", required: true }] }], backgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundColor", required: false }] }], srcsetSizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "srcsetSizes", required: false }] }], quality: [{ type: i0.Input, args: [{ isSignal: true, alias: "quality", required: false }] }], focusArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusArea", required: false }] }], resizeBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizeBehavior", required: false }] }], priority: [{ type: i0.Input, args: [{ isSignal: true, alias: "priority", required: false }] }], sizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "sizes", required: false }] }] } });
586
405
 
406
+ const parseWebUrl = (href) => {
407
+ if (!/^(?:https?:)?\/\//i.test(href)) {
408
+ return null;
409
+ }
410
+ try {
411
+ return new URL(href.startsWith('//') ? 'https:' + href : href);
412
+ }
413
+ catch {
414
+ return null;
415
+ }
416
+ };
417
+ const normalizeHostname = (host) => {
418
+ const value = host.trim().toLowerCase();
419
+ try {
420
+ return new URL(value.includes('://') ? value : 'https://' + value).hostname;
421
+ }
422
+ catch {
423
+ return value.split(':')[0] ?? value;
424
+ }
425
+ };
426
+ const matchesHostname = (hostname, configuredHost) => {
427
+ const normalizedHost = normalizeHostname(configuredHost);
428
+ return hostname === normalizedHost || hostname.endsWith('.' + normalizedHost);
429
+ };
430
+ const isInternalWebUrl = (url, { location, internalHosts }) => (url.hostname === location.hostname && url.port === location.port) ||
431
+ internalHosts.some((host) => matchesHostname(url.hostname, host));
432
+ const isExternalWebHref = (href, context) => {
433
+ const url = parseWebUrl(href);
434
+ return url !== null && !isInternalWebUrl(url, context);
435
+ };
436
+
437
+ class ContentfulLinkComponent {
438
+ constructor() {
439
+ this.document = inject(DOCUMENT);
440
+ this.router = inject(Router);
441
+ this.config = injectContentfulConfig();
442
+ this.url = injectUrl();
443
+ this.href = input.required(/* @ts-ignore */
444
+ ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
445
+ this.text = input.required(/* @ts-ignore */
446
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
447
+ this.textClass = input('', /* @ts-ignore */
448
+ ...(ngDevMode ? [{ debugName: "textClass" }] : /* istanbul ignore next */ []));
449
+ this.anchorClass = input('', /* @ts-ignore */
450
+ ...(ngDevMode ? [{ debugName: "anchorClass" }] : /* istanbul ignore next */ []));
451
+ this.usesRouterLink = computed(() => {
452
+ const href = this.href();
453
+ const absoluteUrl = parseWebUrl(href);
454
+ if (absoluteUrl) {
455
+ return isInternalWebUrl(absoluteUrl, {
456
+ location: this.document.location,
457
+ internalHosts: this.config.internalHosts,
458
+ });
459
+ }
460
+ return !href.startsWith('#') && !/^[a-z][a-z\d+.-]*:/i.test(href);
461
+ }, /* @ts-ignore */
462
+ ...(ngDevMode ? [{ debugName: "usesRouterLink" }] : /* istanbul ignore next */ []));
463
+ this.openInNewTab = computed(() => Boolean(parseWebUrl(this.href())) && !this.usesRouterLink(), /* @ts-ignore */
464
+ ...(ngDevMode ? [{ debugName: "openInNewTab" }] : /* istanbul ignore next */ []));
465
+ this.internalPath = computed(() => {
466
+ const href = this.href();
467
+ const url = parseWebUrl(href);
468
+ if (url) {
469
+ return url.pathname + url.search + url.hash;
470
+ }
471
+ if (href.startsWith('/')) {
472
+ return href;
473
+ }
474
+ const resolved = new URL(href, 'https://contentful.invalid' + this.url());
475
+ return resolved.pathname + resolved.search + resolved.hash;
476
+ }, /* @ts-ignore */
477
+ ...(ngDevMode ? [{ debugName: "internalPath" }] : /* istanbul ignore next */ []));
478
+ this.internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()), /* @ts-ignore */
479
+ ...(ngDevMode ? [{ debugName: "internalUrlTree" }] : /* istanbul ignore next */ []));
480
+ this.linkClass = computed(() => [this.anchorClass(), this.textClass()].filter(Boolean).join(' ') || null, /* @ts-ignore */
481
+ ...(ngDevMode ? [{ debugName: "linkClass" }] : /* istanbul ignore next */ []));
482
+ }
483
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
484
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ContentfulLinkComponent, isStandalone: true, selector: "et-contentful-link", inputs: { href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: true, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, textClass: { classPropertyName: "textClass", publicName: "textClass", isSignal: true, isRequired: false, transformFunction: null }, anchorClass: { classPropertyName: "anchorClass", publicName: "anchorClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-link" }, ngImport: i0, template: `
485
+ @if (usesRouterLink()) {
486
+ <a [class]="linkClass()" [routerLink]="internalUrlTree()">{{ text() }}</a>
487
+ } @else {
488
+ <a
489
+ [class]="linkClass()"
490
+ [href]="href()"
491
+ [target]="openInNewTab() ? '_blank' : null"
492
+ [rel]="openInNewTab() ? 'noopener noreferrer' : null"
493
+ >{{ text() }}</a
494
+ >
495
+ }
496
+ `, isInline: true, styles: ["@layer components{.et-contentful-link{display:contents}}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
497
+ }
498
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulLinkComponent, decorators: [{
499
+ type: Component,
500
+ args: [{ selector: 'et-contentful-link', template: `
501
+ @if (usesRouterLink()) {
502
+ <a [class]="linkClass()" [routerLink]="internalUrlTree()">{{ text() }}</a>
503
+ } @else {
504
+ <a
505
+ [class]="linkClass()"
506
+ [href]="href()"
507
+ [target]="openInNewTab() ? '_blank' : null"
508
+ [rel]="openInNewTab() ? 'noopener noreferrer' : null"
509
+ >{{ text() }}</a
510
+ >
511
+ }
512
+ `, encapsulation: ViewEncapsulation.None, imports: [RouterLink], host: {
513
+ class: 'et-contentful-link',
514
+ }, styles: ["@layer components{.et-contentful-link{display:contents}}\n"] }]
515
+ }], propDecorators: { href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], textClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "textClass", required: false }] }], anchorClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchorClass", required: false }] }] } });
516
+
587
517
  /**
588
518
  * The `BLOCKS` node type strings of `@contentful/rich-text-types`, as a plain literal map.
589
519
  * Keep the values in sync with the enum - they are part of the Contentful Delivery API.
@@ -1347,6 +1277,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
1347
1277
  }]
1348
1278
  }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], richTextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "richTextPath", required: true }] }] } });
1349
1279
 
1280
+ class ContentfulVideoComponent {
1281
+ constructor() {
1282
+ this.asset = input.required(/* @ts-ignore */
1283
+ ...(ngDevMode ? [{ debugName: "asset" }] : /* istanbul ignore next */ []));
1284
+ this.videoClass = input(null, /* @ts-ignore */
1285
+ ...(ngDevMode ? [{ debugName: "videoClass" }] : /* istanbul ignore next */ []));
1286
+ this.data = computed(() => {
1287
+ const asset = this.asset();
1288
+ if (!asset) {
1289
+ return null;
1290
+ }
1291
+ if (isContentfulGqlAsset(asset) && asset.url) {
1292
+ return {
1293
+ url: asset.url,
1294
+ contentType: asset.contentType,
1295
+ };
1296
+ }
1297
+ if (!isContentfulGqlAsset(asset) && asset.fields.file?.url) {
1298
+ return {
1299
+ url: asset.fields.file.url,
1300
+ contentType: asset.fields.file.contentType,
1301
+ };
1302
+ }
1303
+ return null;
1304
+ }, /* @ts-ignore */
1305
+ ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
1306
+ }
1307
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1308
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ContentfulVideoComponent, isStandalone: true, selector: "et-contentful-video", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, videoClass: { classPropertyName: "videoClass", publicName: "videoClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-video" }, ngImport: i0, template: `
1309
+ @if (data(); as data) {
1310
+ <video [ngClass]="videoClass()" controls>
1311
+ <source [src]="data.url" [type]="data.contentType" />
1312
+ </video>
1313
+ }
1314
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
1315
+ }
1316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContentfulVideoComponent, decorators: [{
1317
+ type: Component,
1318
+ args: [{
1319
+ selector: 'et-contentful-video',
1320
+ template: `
1321
+ @if (data(); as data) {
1322
+ <video [ngClass]="videoClass()" controls>
1323
+ <source [src]="data.url" [type]="data.contentType" />
1324
+ </video>
1325
+ }
1326
+ `,
1327
+ encapsulation: ViewEncapsulation.None,
1328
+ imports: [NgClass],
1329
+ host: {
1330
+ class: 'et-contentful-video',
1331
+ },
1332
+ }]
1333
+ }], propDecorators: { asset: [{ type: i0.Input, args: [{ isSignal: true, alias: "asset", required: true }] }], videoClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoClass", required: false }] }] } });
1334
+
1350
1335
  const ContentfulImports = [
1351
1336
  ContentfulAudioComponent,
1352
1337
  ContentfulFileComponent,
@@ -1355,6 +1340,24 @@ const ContentfulImports = [
1355
1340
  ContentfulRichTextRendererComponent,
1356
1341
  ];
1357
1342
 
1343
+ /**
1344
+ * The shipped audio, file, image, video and link components, to spread into `provideContentfulConfig`.
1345
+ * An app that brings its own components, or renders text only, leaves this out and bundles none of them.
1346
+ * To replace one, spread the map instead: `components: { ...CONTENTFUL_DEFAULT_COMPONENTS.components, image: MyImage }`.
1347
+ *
1348
+ * @example
1349
+ * provideContentfulConfig({ ...CONTENTFUL_DEFAULT_COMPONENTS });
1350
+ */
1351
+ const CONTENTFUL_DEFAULT_COMPONENTS = {
1352
+ components: {
1353
+ audio: ContentfulAudioComponent,
1354
+ file: ContentfulFileComponent,
1355
+ image: ContentfulImageComponent,
1356
+ video: ContentfulVideoComponent,
1357
+ link: ContentfulLinkComponent,
1358
+ },
1359
+ };
1360
+
1358
1361
  const provideContentfulConfig = (contentfulConfig) => {
1359
1362
  return { provide: CONTENTFUL_CONFIG, useValue: createContentfulConfig(contentfulConfig) };
1360
1363
  };
@@ -1364,5 +1367,5 @@ const isContentfulEntryType = (entry, type) => entry.sys.contentType.sys.id ===
1364
1367
  * Generated bundle index. Do not edit.
1365
1368
  */
1366
1369
 
1367
- export { CONTENTFUL_CONFIG, CONTENTFUL_FILE_LABELS, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulLinkComponent, ContentfulRichTextRendererComponent, ContentfulVideoComponent, DEFAULT_CONTENTFUL_FILE_LABELS, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID, GQL_FRAGMENT_CONTENTFUL_ASSET, createContentfulConfig, createContentfulIncludeMap, generateContentfulImageSources, generateDefaultContentfulImageSource, injectContentfulConfig, injectContentfulFileLabels, isContentfulEntryType, isContentfulGqlAsset, isRichTextRootNode, marksToClass, marksToTags, parseContentfulImageSize, provideContentfulConfig, provideContentfulFileLabels, translateContentfulNodeTypeToHtmlTag };
1370
+ export { CONTENTFUL_CONFIG, CONTENTFUL_DEFAULT_COMPONENTS, CONTENTFUL_FILE_LABELS, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulLinkComponent, ContentfulRichTextRendererComponent, ContentfulVideoComponent, DEFAULT_CONTENTFUL_FILE_LABELS, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID, GQL_FRAGMENT_CONTENTFUL_ASSET, createContentfulConfig, createContentfulIncludeMap, generateContentfulImageSources, generateDefaultContentfulImageSource, injectContentfulConfig, injectContentfulFileLabels, isContentfulEntryType, isContentfulGqlAsset, isRichTextRootNode, marksToClass, marksToTags, parseContentfulImageSize, provideContentfulConfig, provideContentfulFileLabels, translateContentfulNodeTypeToHtmlTag };
1368
1371
  //# sourceMappingURL=ethlete-contentful.mjs.map
@@ -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/components/link/contentful-link.util.ts","../../../../libs/contentful/src/lib/components/link/contentful-link.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.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/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.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.component.ts","../../../../libs/contentful/src/lib/contentful.imports.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 { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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 [ngClass]=\"figureClass()\">\n <figcaption [ngClass]=\"figcaptionClass()\">{{ data.title }}</figcaption>\n <audio [ngClass]=\"audioClass()\" [src]=\"data.url\" controls></audio>\n </figure>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n host: {\n class: 'et-contentful-audio',\n },\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n audioClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\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 { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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\" [ngClass]=\"fileClass()\" 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 imports: [NgClass],\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 fileClass = input<NgClassType>(null);\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","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","import { DOCUMENT } 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 { isInternalWebUrl, parseWebUrl } from './contentful-link.util';\n\n@Component({\n selector: 'et-contentful-link',\n template: `\n @if (usesRouterLink()) {\n <a [class]=\"linkClass()\" [routerLink]=\"internalUrlTree()\">{{ text() }}</a>\n } @else {\n <a\n [class]=\"linkClass()\"\n [href]=\"href()\"\n [target]=\"openInNewTab() ? '_blank' : null\"\n [rel]=\"openInNewTab() ? 'noopener noreferrer' : null\"\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 router = inject(Router);\n private config = injectContentfulConfig();\n private url = injectUrl();\n\n href = input.required<string>();\n text = input.required<string>();\n textClass = input('');\n anchorClass = input('');\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('#') && !/^[a-z][a-z\\d+.-]*:/i.test(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 const resolved = new URL(href, 'https://contentful.invalid' + this.url());\n\n return resolved.pathname + resolved.search + resolved.hash;\n });\n\n protected internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()));\n\n protected linkClass = computed(() => [this.anchorClass(), this.textClass()].filter(Boolean).join(' ') || null);\n}\n","import { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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 [ngClass]=\"videoClass()\" controls>\n <source [src]=\"data.url\" [type]=\"data.contentType\" />\n </video>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n host: {\n class: 'et-contentful-video',\n },\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n videoClass = input<NgClassType>(null);\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 { InjectionToken } from '@angular/core';\nimport { ContentfulConfig } from '../types';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('ContentfulConfig');\n","import { inject } from '@angular/core';\nimport { 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 { CONTENTFUL_CONFIG } from '../constants/contentful.constants';\nimport { ContentfulConfig } 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\nexport const createContentfulConfig = (config?: Partial<ContentfulConfig> | null): ContentfulConfig => {\n const defaults: ContentfulConfig = {\n internalHosts: [],\n components: {\n audio: ContentfulAudioComponent,\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n link: ContentfulLinkComponent,\n },\n customComponents: {},\n imageOptions: {\n srcsetSizes: ['375w', '1280w', '1920w', '2560w'],\n sizes: ['100vw'],\n backgroundColor: null,\n },\n };\n\n return {\n ...defaults,\n ...config,\n components: { ...defaults.components, ...config?.components },\n imageOptions: { ...defaults.imageOptions, ...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 if (isContentfulGqlAsset(data)) {\n if (!data.contentType || !data.url) {\n return {\n type: '',\n srcset: '',\n };\n }\n\n return {\n type: data.contentType,\n srcset: data.url,\n };\n }\n\n const file = data.fields.file;\n\n if (!file?.contentType || !file.url) {\n return {\n type: '',\n srcset: '',\n };\n }\n\n return {\n type: file.contentType,\n srcset: file.url,\n };\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}`);\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 }\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","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_undefined:\n 'The property value given at richTextPath is undefined. Use the richTextPath input to specify the path to the rich text object.',\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 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_undefined: 0,\n rich_text_wrong_type: 1,\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 message = `<et-contentful-rich-text-renderer>: ${RICH_TEXT_RENDERER_ERRORS[code]}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, data);\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 } 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, 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 } from '../link/contentful-link.util';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\nimport { richTextRendererError } from './rich-text-renderer.errors';\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('Entry not found! Will return null. Is the include query param too low?', { id, entryMap });\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\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\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.required<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.required<string>();\n\n private readonly executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n private contentIncludesMap = computed<ContentfulIncludeMap>(() => {\n const content = this.content();\n const assets = content?.includes?.Asset;\n const entries = content?.includes?.Entry;\n\n return createContentfulIncludeMap({ assets: assets ?? [], entries: entries ?? [] });\n });\n\n private richTextData = computed(() => {\n const content = this.content();\n const richTextPath = this.richTextPath();\n\n if (!content) {\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 return null;\n }\n\n if (!isObject(richText)) {\n throw richTextRendererError('rich_text_undefined', { content, richTextPath });\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 const isMissing = !contentType && !asset.fields.file?.url;\n\n if (isMissing) {\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 const linkText = linkTexts.map((child) => child.value).join('');\n const linkComponent = href ? this.config.components.link : null;\n\n if (href && !linkComponent) {\n const attributes: Record<string, string> = { class: DEFAULT_ANCHOR_CLASS, href };\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 const textClass = marksToClass(sharedMarks);\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, textClass, anchorClass: DEFAULT_ANCHOR_CLASS },\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.contentIncludesMap().getEntry(entryId, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID);\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?',\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 { 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 { Provider } from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfig, ContentfulEntry } from '../types';\nimport { createContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig?: Partial<ContentfulConfig> | 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.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 { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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 [ngClass]=\"figureClass()\">\n <figcaption [ngClass]=\"figcaptionClass()\">{{ data.title }}</figcaption>\n <audio [ngClass]=\"audioClass()\" [src]=\"data.url\" controls></audio>\n </figure>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n host: {\n class: 'et-contentful-audio',\n },\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n audioClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\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 { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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\" [ngClass]=\"fileClass()\" 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 imports: [NgClass],\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 fileClass = input<NgClassType>(null);\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\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 imageOptions: { ...CONTENTFUL_FALLBACK_CONFIG.imageOptions, ...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 if (isContentfulGqlAsset(data)) {\n if (!data.contentType || !data.url) {\n return {\n type: '',\n srcset: '',\n };\n }\n\n return {\n type: data.contentType,\n srcset: data.url,\n };\n }\n\n const file = data.fields.file;\n\n if (!file?.contentType || !file.url) {\n return {\n type: '',\n srcset: '',\n };\n }\n\n return {\n type: file.contentType,\n srcset: file.url,\n };\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}`);\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 }\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","import { DOCUMENT } 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 { isInternalWebUrl, parseWebUrl } from './contentful-link.util';\n\n@Component({\n selector: 'et-contentful-link',\n template: `\n @if (usesRouterLink()) {\n <a [class]=\"linkClass()\" [routerLink]=\"internalUrlTree()\">{{ text() }}</a>\n } @else {\n <a\n [class]=\"linkClass()\"\n [href]=\"href()\"\n [target]=\"openInNewTab() ? '_blank' : null\"\n [rel]=\"openInNewTab() ? 'noopener noreferrer' : null\"\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 router = inject(Router);\n private config = injectContentfulConfig();\n private url = injectUrl();\n\n href = input.required<string>();\n text = input.required<string>();\n textClass = input('');\n anchorClass = input('');\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('#') && !/^[a-z][a-z\\d+.-]*:/i.test(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 const resolved = new URL(href, 'https://contentful.invalid' + this.url());\n\n return resolved.pathname + resolved.search + resolved.hash;\n });\n\n protected internalUrlTree = computed(() => this.router.parseUrl(this.internalPath()));\n\n protected linkClass = computed(() => [this.anchorClass(), this.textClass()].filter(Boolean).join(' ') || null);\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_undefined:\n 'The property value given at richTextPath is undefined. Use the richTextPath input to specify the path to the rich text object.',\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 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_undefined: 0,\n rich_text_wrong_type: 1,\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 message = `<et-contentful-rich-text-renderer>: ${RICH_TEXT_RENDERER_ERRORS[code]}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, data);\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 } 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, 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 } from '../link/contentful-link.util';\nimport { CF_BLOCKS, CF_INLINES } from './rich-text-node-types';\nimport { richTextRendererError } from './rich-text-renderer.errors';\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('Entry not found! Will return null. Is the include query param too low?', { id, entryMap });\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\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\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.required<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.required<string>();\n\n private readonly executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n private contentIncludesMap = computed<ContentfulIncludeMap>(() => {\n const content = this.content();\n const assets = content?.includes?.Asset;\n const entries = content?.includes?.Entry;\n\n return createContentfulIncludeMap({ assets: assets ?? [], entries: entries ?? [] });\n });\n\n private richTextData = computed(() => {\n const content = this.content();\n const richTextPath = this.richTextPath();\n\n if (!content) {\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 return null;\n }\n\n if (!isObject(richText)) {\n throw richTextRendererError('rich_text_undefined', { content, richTextPath });\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 const isMissing = !contentType && !asset.fields.file?.url;\n\n if (isMissing) {\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 const linkText = linkTexts.map((child) => child.value).join('');\n const linkComponent = href ? this.config.components.link : null;\n\n if (href && !linkComponent) {\n const attributes: Record<string, string> = { class: DEFAULT_ANCHOR_CLASS, href };\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 const textClass = marksToClass(sharedMarks);\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, textClass, anchorClass: DEFAULT_ANCHOR_CLASS },\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.contentIncludesMap().getEntry(entryId, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID);\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?',\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 { NgClass } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/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 [ngClass]=\"videoClass()\" controls>\n <source [src]=\"data.url\" [type]=\"data.contentType\" />\n </video>\n }\n `,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n host: {\n class: 'et-contentful-video',\n },\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulRestAsset | ContentfulGqlAsset | null | undefined>();\n videoClass = input<NgClassType>(null);\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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"}
@@ -4,6 +4,11 @@
4
4
  "factory": "./migrate-to-contentful-v5/migration",
5
5
  "schema": "./migrate-to-contentful-v5/schema.json",
6
6
  "description": "Migrate to @ethlete/contentful v5 (components picture, renamed image inputs, removed renderer internals)"
7
+ },
8
+ "migrate-contentful-default-components": {
9
+ "factory": "./migrate-contentful-default-components/migration",
10
+ "schema": "./migrate-contentful-default-components/schema.json",
11
+ "description": "Add withContentfulDefaultComponents() to provideContentfulConfig and report the calls that need it by hand"
7
12
  }
8
13
  }
9
14
  }
@@ -0,0 +1,59 @@
1
+ const CONSTANT = 'CONTENTFUL_DEFAULT_COMPONENTS';
2
+ const SPREAD = `...${CONSTANT}`;
3
+ const CONTENTFUL_IMPORT = /import\s*\{([^}]*)\}\s*from\s*['"]@ethlete\/contentful['"]/g;
4
+ const lineOf = (content, index) => content.slice(0, index).split('\n').length;
5
+ const taskId = (filePath, line) => `contentful-default-components--${filePath.replace(/[^a-zA-Z0-9]+/g, '-')}-${line}`;
6
+ const namesOwnComponents = (content, braceIndex) => {
7
+ let depth = 0;
8
+ let topLevel = '';
9
+ for (let i = braceIndex; i < content.length; i++) {
10
+ const char = content[i] ?? '';
11
+ if ('{[('.includes(char))
12
+ depth++;
13
+ else if ('}])'.includes(char))
14
+ depth--;
15
+ else if (depth === 1)
16
+ topLevel += char;
17
+ if (depth === 0)
18
+ break;
19
+ }
20
+ return /(^|[,\s])components\s*:/.test(topLevel);
21
+ };
22
+ export const scanContentfulDefaultComponentsInFile = (filePath, content) => {
23
+ const tasks = [];
24
+ const importStatement = [...content.matchAll(CONTENTFUL_IMPORT)].find((match) => /\bprovideContentfulConfig\b/.test(match[1] ?? ''));
25
+ if (!importStatement || content.includes(CONSTANT))
26
+ return { next: null, tasks };
27
+ const report = (index, message) => {
28
+ const line = lineOf(content, index);
29
+ tasks.push({ id: taskId(filePath, line), file: filePath, line, message });
30
+ };
31
+ let rewrote = false;
32
+ const next = content.replace(/provideContentfulConfig\(\s*(\{\s*\}|\{\s*|\)|[^\s{)])/g, (call, opening, index) => {
33
+ if (opening === ')') {
34
+ rewrote = true;
35
+ return `provideContentfulConfig({ ${SPREAD} })`;
36
+ }
37
+ if (opening.startsWith('{')) {
38
+ rewrote = true;
39
+ if (namesOwnComponents(content, index + call.length - opening.length)) {
40
+ report(index, `\`provideContentfulConfig\` names its own \`components\`, which replaces the spread. Write \`components: { ...${CONSTANT}.components, ... }\` to keep the defaults.`);
41
+ }
42
+ return opening.endsWith('}')
43
+ ? `provideContentfulConfig({ ${SPREAD} }`
44
+ : `provideContentfulConfig({ ${SPREAD}, `;
45
+ }
46
+ const argument = content.slice(index + call.length - 1).match(/^[^)\n]*/)?.[0] ?? '';
47
+ report(index, `\`provideContentfulConfig(${argument})\` is not a literal the migration can edit. Spread \`${CONSTANT}\` into it unless it names every asset and link component itself.`);
48
+ return call;
49
+ });
50
+ if (!rewrote)
51
+ return { next: null, tasks };
52
+ const rewrittenImport = importStatement[0].replace('{', `{ ${CONSTANT},`);
53
+ const importIndex = next.indexOf(importStatement[0]);
54
+ return {
55
+ next: next.slice(0, importIndex) + rewrittenImport + next.slice(importIndex + importStatement[0].length),
56
+ tasks,
57
+ };
58
+ };
59
+ //# sourceMappingURL=contentful-default-components.js.map
@@ -0,0 +1,57 @@
1
+ import { formatFiles } from '@nx/devkit';
2
+ import { createMigrationScope } from '../migrate-to-contentful-v5/migration-scope.js';
3
+ import { scanContentfulDefaultComponentsInFile, } from './contentful-default-components.js';
4
+ export const CONTENTFUL_DEFAULT_COMPONENTS_REPORT_PATH = 'contentful-default-components-migration-tasks.md';
5
+ const renderReport = (tasks) => [
6
+ '# Contentful default components migration tasks',
7
+ '',
8
+ 'The shipped asset and link components are opt-in. Without them embedded assets are skipped and',
9
+ 'hyperlinks render as plain anchors. The migration spread `CONTENTFUL_DEFAULT_COMPONENTS` into every',
10
+ 'literal `provideContentfulConfig` call; the calls below need it by hand:',
11
+ '',
12
+ '```ts',
13
+ "import { CONTENTFUL_DEFAULT_COMPONENTS, provideContentfulConfig } from '@ethlete/contentful';",
14
+ '',
15
+ 'provideContentfulConfig({ ...CONTENTFUL_DEFAULT_COMPONENTS });',
16
+ '```',
17
+ '',
18
+ 'A config that names every asset and link component itself needs nothing. Delete this file when done.',
19
+ '',
20
+ ...tasks.map((task) => [`## \`${task.id}\``, '', `- ${task.file}:${task.line}`, `- ${task.message}`, ''].join('\n')),
21
+ ].join('\n');
22
+ export default async function migrateContentfulDefaultComponents(tree, schema) {
23
+ console.log('\n🔎 Spreading CONTENTFUL_DEFAULT_COMPONENTS into provideContentfulConfig...');
24
+ const scope = createMigrationScope(tree, schema);
25
+ console.log(` Scope: ${scope.describe()}`);
26
+ const changed = [];
27
+ const tasks = [];
28
+ scope.visit(tree, (filePath) => {
29
+ if (!filePath.endsWith('.ts') || filePath.endsWith('.d.ts'))
30
+ return;
31
+ const content = tree.read(filePath, 'utf-8');
32
+ if (!content)
33
+ return;
34
+ const result = scanContentfulDefaultComponentsInFile(filePath, content);
35
+ tasks.push(...result.tasks);
36
+ if (result.next !== null) {
37
+ tree.write(filePath, result.next);
38
+ changed.push(filePath);
39
+ }
40
+ });
41
+ if (tasks.length > 0) {
42
+ tree.write(CONTENTFUL_DEFAULT_COMPONENTS_REPORT_PATH, renderReport(tasks));
43
+ }
44
+ if (!schema.skipFormat) {
45
+ await formatFiles(tree);
46
+ }
47
+ if (changed.length > 0) {
48
+ console.log(`\n✅ Spread CONTENTFUL_DEFAULT_COMPONENTS in ${changed.length} file(s).`);
49
+ }
50
+ if (tasks.length > 0) {
51
+ console.log(`\n⚠️ ${tasks.length} call(s) need the default components by hand — see ${CONTENTFUL_DEFAULT_COMPONENTS_REPORT_PATH}.`);
52
+ }
53
+ else if (changed.length === 0) {
54
+ console.log('\n✅ Nothing to do.');
55
+ }
56
+ }
57
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "migrate-contentful-default-components",
4
+ "title": "Add withContentfulDefaultComponents() to provideContentfulConfig",
5
+ "type": "object",
6
+ "properties": {
7
+ "projects": {
8
+ "type": "array",
9
+ "items": { "type": "string" },
10
+ "description": "Nx projects to migrate. Defaults to every project in the workspace. Every site is rewritten independently, so any scope is safe — use this to keep the diff reviewable.",
11
+ "alias": "project"
12
+ },
13
+ "include": {
14
+ "type": "array",
15
+ "items": { "type": "string" },
16
+ "description": "Path prefixes to migrate, relative to the workspace root (e.g. 'libs/ui'). Unioned with `projects`. Defaults to the whole workspace.",
17
+ "alias": "includePath"
18
+ },
19
+ "skipFormat": {
20
+ "type": "boolean",
21
+ "description": "Skip formatting files after migration",
22
+ "default": false
23
+ }
24
+ },
25
+ "required": []
26
+ }
package/migrations.json CHANGED
@@ -7,6 +7,14 @@
7
7
  "description": "Move to the components picture, the renamed image inputs and the removed renderer internals.",
8
8
  "generator": "@ethlete/contentful:migrate-to-contentful-v5",
9
9
  "docs": "/contentful/"
10
+ },
11
+ {
12
+ "name": "contentful-default-components",
13
+ "version": "4.0.0-next.12",
14
+ "kind": "auto",
15
+ "description": "Add withContentfulDefaultComponents() to provideContentfulConfig, and report the calls that need it by hand.",
16
+ "generator": "@ethlete/contentful:migrate-contentful-default-components",
17
+ "docs": "/contentful/"
10
18
  }
11
19
  ]
12
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/contentful",
3
- "version": "4.0.0-next.11",
3
+ "version": "4.0.0-next.12",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
@@ -212,7 +212,8 @@ type ContentfulAssetComponents = {
212
212
  };
213
213
  type ContentfulConfig = {
214
214
  /**
215
- * Default components for rendering contentful assets
215
+ * Components for rendering contentful assets and hyperlinks. Empty unless
216
+ * `CONTENTFUL_DEFAULT_COMPONENTS` is spread into the config or a component is named here.
216
217
  */
217
218
  components: ContentfulAssetComponents;
218
219
  /**
@@ -254,6 +255,7 @@ type ContentfulConfig = {
254
255
  backgroundColor: string | null;
255
256
  };
256
257
  };
258
+ type ContentfulConfigOptions = Partial<ContentfulConfig>;
257
259
  type ContentfulLinkType = 'Space' | 'ContentType' | 'Environment' | 'Entry' | 'Asset' | 'Tag';
258
260
  type ContentfulLink<T extends ContentfulLinkType> = {
259
261
  type: 'Link';
@@ -472,15 +474,33 @@ declare const CONTENTFUL_CONFIG: InjectionToken<ContentfulConfig>;
472
474
 
473
475
  declare const ContentfulImports: readonly [typeof ContentfulAudioComponent, typeof ContentfulFileComponent, typeof ContentfulImageComponent, typeof ContentfulVideoComponent, typeof ContentfulRichTextRendererComponent];
474
476
 
475
- declare const createContentfulConfig: (config?: Partial<ContentfulConfig> | null) => ContentfulConfig;
477
+ declare const createContentfulConfig: (options?: ContentfulConfigOptions | null) => ContentfulConfig;
476
478
  /**
477
479
  * Reads the contentful config from the current injector. Falls back to a config without
478
480
  * any `components` when none was provided via `provideContentfulConfig()`.
479
481
  */
480
482
  declare const injectContentfulConfig: () => ContentfulConfig;
481
483
 
482
- declare const provideContentfulConfig: (contentfulConfig?: Partial<ContentfulConfig> | null) => Provider;
484
+ /**
485
+ * The shipped audio, file, image, video and link components, to spread into `provideContentfulConfig`.
486
+ * An app that brings its own components, or renders text only, leaves this out and bundles none of them.
487
+ * To replace one, spread the map instead: `components: { ...CONTENTFUL_DEFAULT_COMPONENTS.components, image: MyImage }`.
488
+ *
489
+ * @example
490
+ * provideContentfulConfig({ ...CONTENTFUL_DEFAULT_COMPONENTS });
491
+ */
492
+ declare const CONTENTFUL_DEFAULT_COMPONENTS: {
493
+ components: {
494
+ audio: typeof ContentfulAudioComponent;
495
+ file: typeof ContentfulFileComponent;
496
+ image: typeof ContentfulImageComponent;
497
+ video: typeof ContentfulVideoComponent;
498
+ link: typeof ContentfulLinkComponent;
499
+ };
500
+ };
501
+
502
+ declare const provideContentfulConfig: (contentfulConfig?: ContentfulConfigOptions | null) => Provider;
483
503
  declare const isContentfulEntryType: <T extends ContentfulEntry>(entry: ContentfulEntry, type: string) => entry is T;
484
504
 
485
- export { CONTENTFUL_CONFIG, CONTENTFUL_FILE_LABELS, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulLinkComponent, ContentfulRichTextRendererComponent, ContentfulVideoComponent, DEFAULT_CONTENTFUL_FILE_LABELS, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID, GQL_FRAGMENT_CONTENTFUL_ASSET, createContentfulConfig, createContentfulIncludeMap, generateContentfulImageSources, generateDefaultContentfulImageSource, injectContentfulConfig, injectContentfulFileLabels, isContentfulEntryType, isContentfulGqlAsset, isRichTextRootNode, marksToClass, marksToTags, parseContentfulImageSize, provideContentfulConfig, provideContentfulFileLabels, translateContentfulNodeTypeToHtmlTag };
486
- export type { ComponentLikeWithAsset, ComponentLikeWithContentfulRendererInputs, ComponentLikeWithLink, ContentfulAssetComponents, ContentfulAssetFileData, ContentfulAssetImageData, ContentfulAssetLink, ContentfulAssetLinkItem, ContentfulCollection, ContentfulConfig, ContentfulContentTypeLink, ContentfulEntry, ContentfulEntryLink, ContentfulEntryLinkItem, ContentfulEntrySys, ContentfulEnvironmentLink, ContentfulFileLabels, ContentfulGqlAsset, ContentfulGqlCollectionFilterVariables, ContentfulGqlOrder, ContentfulGqlWhereFilter, ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulImageSourcesOptions, ContentfulIncludeMap, ContentfulLink, ContentfulLinkType, ContentfulMetadata, ContentfulRestAsset, ContentfulSpaceLink, ContentfulSys, ContentfulTagLink, ContentfulTagLinkItem, CreateContentfulIncludeMapConfig, RichTextResponse };
505
+ export { CONTENTFUL_CONFIG, CONTENTFUL_DEFAULT_COMPONENTS, CONTENTFUL_FILE_LABELS, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulLinkComponent, ContentfulRichTextRendererComponent, ContentfulVideoComponent, DEFAULT_CONTENTFUL_FILE_LABELS, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID, GQL_FRAGMENT_CONTENTFUL_ASSET, createContentfulConfig, createContentfulIncludeMap, generateContentfulImageSources, generateDefaultContentfulImageSource, injectContentfulConfig, injectContentfulFileLabels, isContentfulEntryType, isContentfulGqlAsset, isRichTextRootNode, marksToClass, marksToTags, parseContentfulImageSize, provideContentfulConfig, provideContentfulFileLabels, translateContentfulNodeTypeToHtmlTag };
506
+ export type { ComponentLikeWithAsset, ComponentLikeWithContentfulRendererInputs, ComponentLikeWithLink, ContentfulAssetComponents, ContentfulAssetFileData, ContentfulAssetImageData, ContentfulAssetLink, ContentfulAssetLinkItem, ContentfulCollection, ContentfulConfig, ContentfulConfigOptions, ContentfulContentTypeLink, ContentfulEntry, ContentfulEntryLink, ContentfulEntryLinkItem, ContentfulEntrySys, ContentfulEnvironmentLink, ContentfulFileLabels, ContentfulGqlAsset, ContentfulGqlCollectionFilterVariables, ContentfulGqlOrder, ContentfulGqlWhereFilter, ContentfulImageFocusArea, ContentfulImageResizeBehavior, ContentfulImageSourcesOptions, ContentfulIncludeMap, ContentfulLink, ContentfulLinkType, ContentfulMetadata, ContentfulRestAsset, ContentfulSpaceLink, ContentfulSys, ContentfulTagLink, ContentfulTagLinkItem, CreateContentfulIncludeMapConfig, RichTextResponse };